Skip to Content.
Sympa Menu

notify-dpml - r1946 - in trunk/main/metro: appliance/etc/data appliance/etc/xsds appliance/src/main/dpml/station/info appliance/src/main/net/dpml/station sample/etc station/etc/prefs/plans test/etc/data

notify-dpml AT lists.ibiblio.org

Subject: DPML Notify

List archive

Chronological Thread  
  • From: mcconnell at BerliOS <mcconnell AT mail.berlios.de>
  • To: notify-dpml AT lists.ibiblio.org
  • Subject: r1946 - in trunk/main/metro: appliance/etc/data appliance/etc/xsds appliance/src/main/dpml/station/info appliance/src/main/net/dpml/station sample/etc station/etc/prefs/plans test/etc/data
  • Date: Fri, 6 Apr 2007 18:20:44 +0200

Author: mcconnell
Date: 2007-04-06 18:20:42 +0200 (Fri, 06 Apr 2007)
New Revision: 1946

Added:

trunk/main/metro/appliance/src/main/dpml/station/info/IncludeDescriptor.java
trunk/main/metro/test/etc/data/application.xml~
Removed:
trunk/main/metro/test/etc/data/application.xml
Modified:
trunk/main/metro/appliance/etc/data/plan.xml
trunk/main/metro/appliance/etc/xsds/appliance.xsd
trunk/main/metro/appliance/etc/xsds/plan.xsd

trunk/main/metro/appliance/src/main/dpml/station/info/ApplianceDescriptor.java
trunk/main/metro/appliance/src/main/dpml/station/info/EntryDescriptor.java
trunk/main/metro/appliance/src/main/dpml/station/info/PlanDescriptor.java

trunk/main/metro/appliance/src/main/net/dpml/station/ApplianceContentHandler.java

trunk/main/metro/appliance/src/main/net/dpml/station/CompositeAppliance.java
trunk/main/metro/sample/etc/plan.xml
trunk/main/metro/station/etc/prefs/plans/default.plan
Log:
add support for nested appliance definitions within a deployment plan

Modified: trunk/main/metro/appliance/etc/data/plan.xml
===================================================================
--- trunk/main/metro/appliance/etc/data/plan.xml 2007-04-03 15:29:57
UTC (rev 1945)
+++ trunk/main/metro/appliance/etc/data/plan.xml 2007-04-06 16:20:42
UTC (rev 1946)
@@ -1,9 +1,24 @@
<?xml version="1.0"?>

-<plan xmlns="dpml:plan" name="demo" title="Plan Demo">
+<plan xmlns="dpml:plan" xmlns:appliance="dpml:appliance" name="demo"
title="Plan Demo">

- <entry key="foo" uri="link:appliance:dpml/metro/demo-foo"/>
- <entry key="bar" uri="link:appliance:dpml/metro/demo-bar"/>
- <entry key="toto"
uri="link:part:dpml/metro/dpml-metro-sample?message=Hello%20World&amp;port=1024"/>
+ <include key="foo" uri="link:appliance:dpml/metro/demo-foo"/>

+ <!--<include key="bar" uri="link:appliance:dpml/metro/demo-bar"/>-->
+
+ <appliance:appliance xmlns="dpml:appliance" key="bar">
+ <info name="bar"/>
+ <process startup="0" shutdown="0">
+ <environment>
+ <variable name="FOO" value="BAR"/>
+ </environment>
+ <properties>
+ <property name="foo" value="bar"/>
+ </properties>
+ </process>
+ <codebase uri="link:part:dpml/metro/dpml-metro-sample?message=Bar"/>
+ </appliance:appliance>
+
+ <include key="toto"
uri="link:part:dpml/metro/dpml-metro-sample?message=Hello%20World&amp;port=1024"/>
+
</plan>

Modified: trunk/main/metro/appliance/etc/xsds/appliance.xsd
===================================================================
--- trunk/main/metro/appliance/etc/xsds/appliance.xsd 2007-04-03 15:29:57
UTC (rev 1945)
+++ trunk/main/metro/appliance/etc/xsds/appliance.xsd 2007-04-06 16:20:42
UTC (rev 1946)
@@ -23,14 +23,17 @@
xmlns:xsd="http://www.w3.org/2001/XMLSchema";
xmlns:part="dpml:part"
xmlns:this="dpml:appliance"
+ xmlns:plan="dpml:plan"
targetNamespace="dpml:appliance"
elementFormDefault="qualified">

<import namespace="dpml:part"
schemaLocation="link:xsd:dpml/lang/dpml-lang-part"/>
-
- <element name="appliance" type="this:ApplianceType"/>
+ <import namespace="dpml:plan"
schemaLocation="link:xsd:dpml/lang/dpml-lang-plan"/>
+
+ <element name="appliance" type="this:ApplianceType"
substitutionGroup="plan:solution"/>
<element name="codebase" type="this:CodebaseType"/>

+ <!--
<complexType name="ApplianceType">
<sequence>
<element name="info" type="this:InfoType" minOccurs="0"
maxOccurs="1"/>
@@ -38,7 +41,20 @@
<element name="codebase" type="this:CodebaseType" minOccurs="1"
maxOccurs="1"/>
</sequence>
</complexType>
-
+ -->
+
+ <complexType name="ApplianceType">
+ <complexContent>
+ <extension base="plan:AbstractEntry">
+ <sequence>
+ <element name="info" type="this:InfoType" minOccurs="0"
maxOccurs="1"/>
+ <element name="process" type="this:ProcessType" minOccurs="0"
maxOccurs="1"/>
+ <element name="codebase" type="this:CodebaseType" minOccurs="1"
maxOccurs="1"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
<complexType name="ProcessType">
<sequence>
<element name="environment" type="this:EnvironmentType"
minOccurs="0" maxOccurs="1"/>

Modified: trunk/main/metro/appliance/etc/xsds/plan.xsd
===================================================================
--- trunk/main/metro/appliance/etc/xsds/plan.xsd 2007-04-03 15:29:57
UTC (rev 1945)
+++ trunk/main/metro/appliance/etc/xsds/plan.xsd 2007-04-06 16:20:42
UTC (rev 1946)
@@ -20,23 +20,32 @@
elementFormDefault="qualified">

<element name="plan" type="this:PlanType"/>
+ <element name="solution" type="this:AbstractEntry"/>
+ <element name="include" type="this:IncludeType"
substitutionGroup="this:solution"/>

<complexType name="PlanType">
<sequence>
- <element name="entry" type="this:EntryType" minOccurs="0"
maxOccurs="unbounded"/>
+ <element ref="this:solution" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="string" default="root"/>
<attribute name="title" type="string"/>
</complexType>

- <complexType name="EntryType">
- <sequence>
- <element name="param" type="this:ParamType" minOccurs="0"
maxOccurs="unbounded"/>
- </sequence>
- <attribute name="uri" type="anyURI" use="required"/>
- <attribute name="key" type="string" use="required"/>
+ <complexType name="AbstractEntry">
+ <attribute name="key" type="string"/>
</complexType>
-
+
+ <complexType name="IncludeType">
+ <complexContent>
+ <extension base="this:AbstractEntry">
+ <sequence>
+ <element name="param" type="this:ParamType" minOccurs="0"
maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="uri" type="anyURI" use="required"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
<complexType name="ParamType">
<attribute name="key" type="string" use="required"/>
<attribute name="value" type="string" use="required"/>

Modified:
trunk/main/metro/appliance/src/main/dpml/station/info/ApplianceDescriptor.java
===================================================================
---
trunk/main/metro/appliance/src/main/dpml/station/info/ApplianceDescriptor.java
2007-04-03 15:29:57 UTC (rev 1945)
+++
trunk/main/metro/appliance/src/main/dpml/station/info/ApplianceDescriptor.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -36,9 +36,8 @@
* @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
* @version @PROJECT-VERSION@
*/
-public final class ApplianceDescriptor
+public final class ApplianceDescriptor extends EntryDescriptor
{
- private final Element m_element;
private final InfoDescriptor m_info;
private final ProcessDescriptor m_profile;
private final URI m_codebase;
@@ -46,8 +45,25 @@

public ApplianceDescriptor( Element element, Resolver resolver, URI uri
) throws DecodingException
{
+ this( element, resolver, uri, false );
+ }
+
+ public ApplianceDescriptor( Element element, Resolver resolver, URI uri,
boolean nested ) throws DecodingException
+ {
+ super( element, resolver );
+
+ if( nested )
+ {
+ String key = getKey();
+ if( null == key )
+ {
+ final String error =
+ "Mising key attribute.";
+ throw new DecodingException( error, element );
+ }
+ }
+
m_uri = uri;
- m_element = element;

Element codebase = ElementHelper.getChild( element, "codebase" );
m_codebase = getCodebase( codebase, resolver );
@@ -60,15 +76,6 @@
}

/**
- * Return the element defining the scenario descriptor.
- * @return the defining element
- */
- public Element getElement()
- {
- return m_element;
- }
-
- /**
* Get the application name.
*
* @return the name

Modified:
trunk/main/metro/appliance/src/main/dpml/station/info/EntryDescriptor.java
===================================================================
---
trunk/main/metro/appliance/src/main/dpml/station/info/EntryDescriptor.java
2007-04-03 15:29:57 UTC (rev 1945)
+++
trunk/main/metro/appliance/src/main/dpml/station/info/EntryDescriptor.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -33,46 +33,15 @@
* @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
* @version @PROJECT-VERSION@
*/
-public final class EntryDescriptor
+public abstract class EntryDescriptor
{
- private final Element m_element;
private final String m_key;
- private final URI m_uri;
+ private final Element m_element;

- public EntryDescriptor( Element element, Resolver resolver ) throws
DecodingException
+ public EntryDescriptor( Element element, Resolver resolver )
{
m_element = element;
m_key = ElementHelper.getAttribute( element, "key", null, resolver );
- if( null == m_key )
- {
- final String error =
- "Missing 'key' attribute in entry descriptor.";
- throw new DecodingException( error, element );
- }
- String spec = ElementHelper.getAttribute( element, "uri", null,
resolver );
- if( null == spec )
- {
- final String error =
- "Missing 'uri' attribute in entry descriptor.";
- throw new DecodingException( error, element );
- }
-
- Element[] params = ElementHelper.getChildren( element, "param" );
- for( int i=0; i<params.length; i++ )
- {
- Element e = params[i];
- String key = ElementHelper.getAttribute( e, "key", null,
resolver );
- String value = ElementHelper.getAttribute( e, "value", null,
resolver );
- if( i==0 )
- {
- spec = spec + "?" + key + "=" + value;
- }
- else
- {
- spec = spec + "&" + key + "=" + value;
- }
- }
- m_uri = URI.create( spec );
}

/**
@@ -85,67 +54,11 @@
}

/**
- * Get the uri.
- *
- * @return the uri
- */
- public URI getURI()
- {
- return m_uri;
- }
-
- /**
- * Get the entry key.
- *
+ * Return the key for thiks entry.
* @return the key
*/
public String getKey()
{
return m_key;
}
-
- /**
- * Compare this object with another for equality.
- * @param other the object to compare this object with
- * @return TRUE if the supplied object is equivalent
- */
- public boolean equals( Object other )
- {
- if( null == other )
- {
- return false;
- }
- else if( getClass() != other.getClass() )
- {
- return false;
- }
- else
- {
- EntryDescriptor entry = (EntryDescriptor) other;
- if( !m_key.equals( entry.m_key ) )
- {
- return false;
- }
- else if( !m_uri.equals( entry.m_uri ) )
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- }
-
- /**
- * Return the hashcode for the object.
- * @return the hashcode value
- */
- public int hashCode()
- {
- int hash = getClass().hashCode();
- hash ^= m_uri.hashCode();
- hash ^= m_key.hashCode();
- return hash;
- }
}

Added:
trunk/main/metro/appliance/src/main/dpml/station/info/IncludeDescriptor.java
===================================================================
---
trunk/main/metro/appliance/src/main/dpml/station/info/IncludeDescriptor.java
2007-04-03 15:29:57 UTC (rev 1945)
+++
trunk/main/metro/appliance/src/main/dpml/station/info/IncludeDescriptor.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2007 Stephen J. McConnell.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dpml.station.info;
+
+import dpml.util.ElementHelper;
+
+import java.net.URI;
+
+import net.dpml.lang.DecodingException;
+import net.dpml.util.Resolver;
+
+import org.w3c.dom.Element;
+
+/**
+ * Immutable datastructure used to describe an deployment scenario.
+ *
+ * @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
+ * @version @PROJECT-VERSION@
+ */
+public final class IncludeDescriptor extends EntryDescriptor
+{
+ private final URI m_uri;
+
+ public IncludeDescriptor( Element element, Resolver resolver ) throws
DecodingException
+ {
+ super( element, resolver );
+
+ if( null == getKey() )
+ {
+ final String error =
+ "Missing 'key' attribute in entry descriptor.";
+ throw new DecodingException( error, element );
+ }
+
+ String spec = ElementHelper.getAttribute( element, "uri", null,
resolver );
+ if( null == spec )
+ {
+ final String error =
+ "Missing 'uri' attribute in entry descriptor.";
+ throw new DecodingException( error, element );
+ }
+
+ Element[] params = ElementHelper.getChildren( element, "param" );
+ for( int i=0; i<params.length; i++ )
+ {
+ Element e = params[i];
+ String key = ElementHelper.getAttribute( e, "key", null,
resolver );
+ String value = ElementHelper.getAttribute( e, "value", null,
resolver );
+ if( i==0 )
+ {
+ spec = spec + "?" + key + "=" + value;
+ }
+ else
+ {
+ spec = spec + "&" + key + "=" + value;
+ }
+ }
+ m_uri = URI.create( spec );
+ }
+
+ /**
+ * Get the uri.
+ *
+ * @return the uri
+ */
+ public URI getURI()
+ {
+ return m_uri;
+ }
+
+ /**
+ * Compare this object with another for equality.
+ * @param other the object to compare this object with
+ * @return TRUE if the supplied object is equivalent
+ */
+ public boolean equals( Object other )
+ {
+ if( null == other )
+ {
+ return false;
+ }
+ else if( getClass() != other.getClass() )
+ {
+ return false;
+ }
+ else
+ {
+ IncludeDescriptor entry = (IncludeDescriptor) other;
+ if( !getKey().equals( entry.getKey() ) )
+ {
+ return false;
+ }
+ else if( !m_uri.equals( entry.m_uri ) )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+
+ /**
+ * Return the hashcode for the object.
+ * @return the hashcode value
+ */
+ public int hashCode()
+ {
+ int hash = getClass().hashCode();
+ hash ^= m_uri.hashCode();
+ if( null != getKey() )
+ {
+ hash ^= getKey().hashCode();
+ }
+ return hash;
+ }
+}

Modified:
trunk/main/metro/appliance/src/main/dpml/station/info/PlanDescriptor.java
===================================================================
--- trunk/main/metro/appliance/src/main/dpml/station/info/PlanDescriptor.java
2007-04-03 15:29:57 UTC (rev 1945)
+++ trunk/main/metro/appliance/src/main/dpml/station/info/PlanDescriptor.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -47,12 +47,24 @@
m_codebase = codebase;
m_name = ElementHelper.getAttribute( element, "name", null, resolver
);
m_title = ElementHelper.getAttribute( element, "title", null,
resolver );
- Element[] elements = ElementHelper.getChildren( element, "entry" );
+ Element[] elements = ElementHelper.getChildren( element );
m_entries = new EntryDescriptor[ elements.length ];
for( int i=0; i<elements.length; i++ )
{
Element elem = elements[i];
- m_entries[i] = new EntryDescriptor( elem, resolver );
+ String name = elem.getLocalName();
+ if( name.equals( "include" ) )
+ {
+ m_entries[i] = new IncludeDescriptor( elem, resolver );
+ }
+ else if( name.equals( "appliance" ) )
+ {
+ m_entries[i] = new ApplianceDescriptor( elem, resolver,
codebase, true );
+ }
+ else
+ {
+ throw new UnsupportedOperationException( "Element name not
recognized: " + name );
+ }
}
}


Modified:
trunk/main/metro/appliance/src/main/net/dpml/station/ApplianceContentHandler.java
===================================================================
---
trunk/main/metro/appliance/src/main/net/dpml/station/ApplianceContentHandler.java
2007-04-03 15:29:57 UTC (rev 1945)
+++
trunk/main/metro/appliance/src/main/net/dpml/station/ApplianceContentHandler.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -230,7 +230,7 @@
}
}

- private static final Appliance newAppliance( String key,
ApplianceDescriptor descriptor ) throws IOException
+ static final Appliance newAppliance( String key, ApplianceDescriptor
descriptor ) throws IOException
{
if( null == key )
{

Modified:
trunk/main/metro/appliance/src/main/net/dpml/station/CompositeAppliance.java
===================================================================
---
trunk/main/metro/appliance/src/main/net/dpml/station/CompositeAppliance.java
2007-04-03 15:29:57 UTC (rev 1945)
+++
trunk/main/metro/appliance/src/main/net/dpml/station/CompositeAppliance.java
2007-04-06 16:20:42 UTC (rev 1946)
@@ -1,4 +1,5 @@
/*
+/*
* Copyright 2006 Stephen J. McConnell.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +23,8 @@

import dpml.station.info.PlanDescriptor;
import dpml.station.info.EntryDescriptor;
+import dpml.station.info.IncludeDescriptor;
+import dpml.station.info.ApplianceDescriptor;

import dpml.appliance.ApplianceHelper;
import dpml.appliance.AbstractAppliance;
@@ -48,6 +51,8 @@
import net.dpml.transit.Artifact;
import net.dpml.util.Logger;

+import org.w3c.dom.Element;
+
/**
* Appliance implementation that aggregates a collection of ordered
appliance instances.
*
@@ -72,23 +77,54 @@

for( EntryDescriptor entry : m_descriptor.getEntryDescriptors() )
{
- URI codebase = descriptor.getCodebaseURI();
- String name = getQualifiedName( partition, entry.getKey() );
- logger.info( "loading " + name );
- Appliance appliance = getApplianceForType( partition, entry );
- if( null == appliance )
+ if( entry instanceof IncludeDescriptor )
{
- final String error =
- "Failed to resolve an appliance for the uri [ "
- + codebase
- + "].";
- throw new ApplianceException( error );
+ IncludeDescriptor include = (IncludeDescriptor) entry;
+ URI codebase = descriptor.getCodebaseURI();
+ String name = getQualifiedName( partition, include.getKey()
);
+ logger.info( "loading " + name );
+ Appliance appliance = getApplianceForType( partition,
include );
+ if( null == appliance )
+ {
+ Element element = include.getElement();
+ final String error =
+ "Failed to resolve an appliance for the uri [ "
+ + codebase
+ + "].";
+ throw new ApplianceException( error, null, element );
+ }
+ else
+ {
+ m_list.add( appliance );
+ ApplianceContentHandler.register( name, appliance );
+ }
}
- else
+ else if( entry instanceof ApplianceDescriptor )
{
+ ApplianceDescriptor d = (ApplianceDescriptor) entry;
+ String key = d.getKey();
+ if( null == key )
+ {
+ Element element = d.getElement();
+ final String error =
+ "Missing key attribute in nested appliance
definition.";
+ throw new ApplianceException( error, null, element );
+ }
+ String name = getQualifiedName( partition, key );
+ Appliance appliance = ApplianceContentHandler.newAppliance(
name, d );
m_list.add( appliance );
ApplianceContentHandler.register( name, appliance );
}
+ else
+ {
+ // should not happen
+ Element element = entry.getElement();
+ final String error =
+ "Appliance entry descriptor class is not recognized ["
+ + entry.getClass().getName()
+ + "].";
+ throw new ApplianceException( error, null, element );
+ }
}

ApplianceEvent ae = new ApplianceEvent( this, Status.CREATION );
@@ -153,7 +189,7 @@
}
}

- private Appliance getApplianceForType( String partition, EntryDescriptor
entry ) throws IOException
+ private Appliance getApplianceForType( String partition,
IncludeDescriptor entry ) throws IOException
{
String key = entry.getKey();
String address = getQualifiedName( partition, key );

Modified: trunk/main/metro/sample/etc/plan.xml
===================================================================
--- trunk/main/metro/sample/etc/plan.xml 2007-04-03 15:29:57 UTC (rev
1945)
+++ trunk/main/metro/sample/etc/plan.xml 2007-04-06 16:20:42 UTC (rev
1946)
@@ -2,7 +2,7 @@

<plan xmlns="dpml:plan" name="station" title="DPML Station Deployment Plan">

- <entry key="sample" uri="link:appliance:dpml/metro/dpml-metro-sample"/>
- <entry key="demo" uri="link:appliance:dpml/metro/dpml-metro-demo"/>
+ <include key="sample" uri="link:appliance:dpml/metro/dpml-metro-sample"/>
+ <include key="demo" uri="link:appliance:dpml/metro/dpml-metro-demo"/>

</plan>

Modified: trunk/main/metro/station/etc/prefs/plans/default.plan
===================================================================
--- trunk/main/metro/station/etc/prefs/plans/default.plan 2007-04-03
15:29:57 UTC (rev 1945)
+++ trunk/main/metro/station/etc/prefs/plans/default.plan 2007-04-06
16:20:42 UTC (rev 1946)
@@ -15,15 +15,15 @@
Example:

<plan xmlns="dpml:plan" name="demo" title="Station Deployment Plan Demo">
- <entry key="foo" uri="link:appliance:dpml/metro/demo"/>
- <entry key="bar" uri="link:part:dpml/lang/dpml-lang-sample"/>
- <entry key="toto"
uri="link:part:dpml/metro/dpml-metro-sample?message=My%20Scenario&amp;port=999"/>
+ <include key="foo" uri="link:appliance:dpml/metro/demo"/>
+ <include key="bar" uri="link:part:dpml/lang/dpml-lang-sample"/>
+ <include key="toto"
uri="link:part:dpml/metro/dpml-metro-sample?message=My%20Scenario&amp;port=999"/>
</plan>

-->

<plan xmlns="dpml:plan" name="station" title="DPML Station Deployment Plan">

- <!-- add entry here -->
+ <!-- add entries here -->

</plan>

Deleted: trunk/main/metro/test/etc/data/application.xml
===================================================================
--- trunk/main/metro/test/etc/data/application.xml 2007-04-03 15:29:57
UTC (rev 1945)
+++ trunk/main/metro/test/etc/data/application.xml 2007-04-06 16:20:42
UTC (rev 1946)
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-
-<application xmlns="dpml:application">
-
- <info name="hello"/>
-
- <process startup="0" shutdown="0" path="target/test">
- <environment>
- <variable name="FOO" value="BAR"/>
- </environment>
- <properties>
- <property name="foo" value="bar"/>
- </properties>
- </process>
-
- <codebase
uri="link:part:dpml/metro/dpml-metro-sample?message=Hello%20World&port=1024"/>
-
-</application>

Copied: trunk/main/metro/test/etc/data/application.xml~ (from rev 1940,
trunk/main/metro/test/etc/data/application.xml)




  • r1946 - in trunk/main/metro: appliance/etc/data appliance/etc/xsds appliance/src/main/dpml/station/info appliance/src/main/net/dpml/station sample/etc station/etc/prefs/plans test/etc/data, mcconnell at BerliOS, 04/06/2007

Archive powered by MHonArc 2.6.24.

Top of Page