mcconnell 2003/08/19 06:39:25
Modified: merlin/merlin-platform/tutorials/composition README.txt
Added: merlin/merlin-platform/tutorials/composition maven.xml
project.xml
merlin/merlin-platform/tutorials/composition/application/impl
project.xml
merlin/merlin-platform/tutorials/composition/application/impl/conf
block.xml config.xml
merlin/merlin-platform/tutorials/composition/application/impl/src/java/tutorial/application
Application.java
merlin/merlin-platform/tutorials/composition/location/api
project.xml
merlin/merlin-platform/tutorials/composition/location/api/src/java/tutorial/location
LocationService.java
merlin/merlin-platform/tutorials/composition/location/impl
project.xml
merlin/merlin-platform/tutorials/composition/location/impl/conf
block.xml
merlin/merlin-platform/tutorials/composition/location/impl/src/java/tutorial/location
LocationComponent.java LocationComponent.xprofile
merlin/merlin-platform/tutorials/composition/publisher/api
project.xml
merlin/merlin-platform/tutorials/composition/publisher/api/src/java/tutorial/publisher
PublisherService.java
merlin/merlin-platform/tutorials/composition/publisher/impl
project.xml
merlin/merlin-platform/tutorials/composition/publisher/impl/conf
block.xml
merlin/merlin-platform/tutorials/composition/publisher/impl/src/java/tutorial/publisher
PublisherComponent.java
Removed: merlin/merlin-platform/tutorials/composition build.xml
merlin/merlin-platform/tutorials/composition/src/config/application
block.xml
merlin/merlin-platform/tutorials/composition/src/config/location
block.xml
merlin/merlin-platform/tutorials/composition/src/config/publisher
block.xml
merlin/merlin-platform/tutorials/composition/src/java/tutorial
LocationService.java PublisherService.java
merlin/merlin-platform/tutorials/composition/src/java/tutorial/application
Application.java Application.xinfo
merlin/merlin-platform/tutorials/composition/src/java/tutorial/location
LocationComponent.java LocationComponent.xinfo
LocationComponent.xprofile
merlin/merlin-platform/tutorials/composition/src/java/tutorial/publisher
PublisherComponent.java PublisherComponent.xinfo
Log:
Update composition tutorial to maven 10 and Merlin 3.0.
Revision Changes Path
1.2 +35 -1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/README.txt
Index: README.txt
===================================================================
RCS file:
/home/cvs/avalon-sandbox/merlin/merlin-platform/tutorials/composition/README.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- README.txt 18 Aug 2003 19:39:35 -0000 1.1
+++ README.txt 19 Aug 2003 13:39:24 -0000 1.2
@@ -1,2 +1,36 @@
-I'M NOT STABLE - COME BACK LATER.
\ No newline at end of file
+Composition Management
+----------------------
+
+This tutorial presents the creation ofn virtual components
+using composition of package containers. In this demonstration
+we have three application groups, a top level application, a
+locator system, and a publisher system. The top level app
+pulls in the two sub-systems as virtual components. The sub-
+systems are themselves fuolly deployable containers in their
+own right and could be executed independetly.
+
+
+ $ maven build
+ $ merlin application\impl\target\*.jar -system %MAVEN_HOME% -execute
+
+ [INFO ] (application.publisher.publisher): created
+ [INFO ] (application.location.info): location: Paris
+ [INFO ] (application.application): servicing application
+ [INFO ] (application.location.info): location: Paris
+ [INFO ] (application.publisher.publisher): created
+ [INFO ] (application.publisher.publisher):
+ ******************
+ * Paris
+ ******************
+ [INFO ] (application.application): done
+
+
+Use the following command to pull in container debug level log entries.
+
+ $ merlin application\impl\target\*.jar -system %MAVEN_HOME% -execute -config
application\impl\conf\config.xml
+
+
+The purpose of this demonstration is to show how the container can be viewed as an
implementation strategy for the creation of a virtual service, and how that service
can be composed within a higher level containers, enabling new services without
artificial barriers.
+
+
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/maven.xml
Index: maven.xml
===================================================================
<project default="jar:jar" xmlns:maven="jelly:maven" xmlns:j="jelly:core"
xmlns:util="jelly:util">
<preGoal name="java:compile">
<attainGoal name="avalon:meta"/>
</preGoal>
<goal name="build">
<maven:reactor
basedir="${basedir}"
includes="**/project.xml"
excludes="project.xml"
goals="jar:install"
banner="Installing:"
ignoreFailures="false" />
</goal>
<goal name="cleanup">
<maven:reactor
basedir="${basedir}"
includes="**/project.xml"
excludes="project.xml"
goals="clean"
banner="Installing:"
ignoreFailures="false" />
</goal>
<goal name="update">
<attainGoal name="cleanup"/>
<attainGoal name="build"/>
</goal>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<groupId>merlin-tutorial</groupId>
<name>Merlin Composition Tutorial</name>
<package>tutorial</package>
<currentVersion>1.0</currentVersion>
<inceptionYear>2003</inceptionYear>
<shortDescription>Merlin Configuration Tutorial.</shortDescription>
<build>
<sourceDirectory>${basedir}/src/java</sourceDirectory>
<resources>
<resource>
<directory>${basedir}/conf</directory>
<targetPath>BLOCK-INF</targetPath>
<includes>
<include>block.xml</include>
</includes>
</resource>
<resource>
<directory>${maven.src.dir}/java</directory>
<includes>
<include>**/*.x*</include>
</includes>
</resource>
</resources>
<jars></jars>
</build>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/application/impl/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<extend>${basedir}/../../project.xml</extend>
<id>application-impl</id>
<name>Composition Application</name>
<dependencies>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-impl</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>merlin-tutorial</groupId>
<artifactId>locator-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>merlin-tutorial</groupId>
<artifactId>publisher-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/application/impl/conf/block.xml
Index: block.xml
===================================================================
<container name="application">
<classloader>
<classpath>
<repository>
<resource id="avalon-framework:avalon-framework-api" version="SNAPSHOT"/>
<resource id="avalon-framework:avalon-framework-impl" version="SNAPSHOT"/>
<resource id="merlin-tutorial:locator-api" version="1.0"/>
<resource id="merlin-tutorial:publisher-api" version="1.0"/>
<resource id="merlin-tutorial:application-impl" version="1.0"/>
</repository>
</classpath>
</classloader>
<include name="location" id="merlin-tutorial:locator-impl" version="1.0"/>
<include name="publisher" id="merlin-tutorial:publisher-impl" version="1.0"/>
<component name="application"
class="tutorial.application.Application">
</component>
</container>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/application/impl/conf/config.xml
Index: config.xml
===================================================================
<targets>
<target path="/application/application">
<categories priority="DEBUG"/>
</target>
<target path="/application/publisher/publisher">
<categories priority="DEBUG"/>
</target>
<target path="/application/location/info">
<categories priority="DEBUG"/>
</target>
</targets>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/application/impl/src/java/tutorial/application/Application.java
Index: Application.java
===================================================================
package tutorial.application;
import java.io.File;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.activity.Disposable;
import tutorial.location.LocationService;
import tutorial.publisher.PublisherService;
/**
* PublisherComponent from Merlin's Composition Tutorial
*
* @avalon.component version="1.0" name="test"
* @author Stephen McConnell
*/
public class Application extends AbstractLogEnabled implements Serviceable,
Disposable
{
/**
* Servicing of the component by the container during
* which service dependencies declared under the component
* can be resolved using the supplied service manager. In this
* example the component uses a LocatorService service to log a
* message exposing a location.
*
* @param manager the service manager
* @avalon.dependency key="locator" type="tutorial.location.LocationService"
* @avalon.dependency key="publisher" type="tutorial.publisher.PublisherService"
*/
public void service( ServiceManager manager ) throws ServiceException
{
getLogger().info( "servicing application" );
LocationService locator = null;
Object object = manager.lookup( "locator" );
if( object instanceof LocationService )
{
locator = (LocationService) object;
}
else
{
final String error =
"Object " + object.getClass().getName()
+ " does not implement the LocatorService class.";
throw new ServiceException( "locator", error );
}
PublisherService publisher = null;
object = manager.lookup( "publisher" );
if( object instanceof PublisherService )
{
publisher = (PublisherService) object;
}
else
{
final String error =
"Object " + object.getClass().getName()
+ " does not implement the PublisherService class.";
throw new ServiceException( "publisher", error );
}
//
// get the location from the locator and publish
// it using the publisher
//
publisher.publish(
"\n******************"
+ "\n* " + locator.getLocation()
+ "\n******************");
getLogger().info( "done" );
}
public void dispose()
{
getLogger().info( "disposal" );
}
}
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/api/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<extend>${basedir}/../../project.xml</extend>
<id>locator-api</id>
<name>Composition Locator API</name>
<dependencies>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>SNAPSHOT</version>
</dependency>
</dependencies>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/api/src/java/tutorial/location/LocationService.java
Index: LocationService.java
===================================================================
package tutorial.location;
/**
* LocationService from Merlin's Composition Tutorial
*
* @author Stephen McConnell
*/
public interface LocationService
{
/**
* Return a location.
* @return a location
*/
public String getLocation();
}
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/impl/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<extend>${basedir}/../../project.xml</extend>
<id>locator-impl</id>
<name>Composition Locator Impl</name>
<dependencies>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-impl</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>merlin-tutorial</groupId>
<artifactId>locator-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/impl/conf/block.xml
Index: block.xml
===================================================================
<container name="locator">
<services>
<service type="tutorial.location.LocationService">
<source>info</source>
</service>
</services>
<classloader>
<classpath>
<repository>
<resource id="avalon-framework:avalon-framework-api" version="SNAPSHOT"/>
<resource id="avalon-framework:avalon-framework-impl" version="SNAPSHOT"/>
<resource id="merlin-tutorial:locator-api" version="1.0"/>
<resource id="merlin-tutorial:locator-impl" version="1.0"/>
</repository>
</classpath>
</classloader>
<component name="info"
class="tutorial.location.LocationComponent">
<configuration>
<source>Paris</source>
</configuration>
</component>
</container>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/impl/src/java/tutorial/location/LocationComponent.java
Index: LocationComponent.java
===================================================================
package tutorial.location;
import java.io.File;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.activity.Disposable;
/**
* HelloComponent from Merlin's Tutorial
*
* @avalon.component version="1.0" name="location-provider"
* @avalon.service type="tutorial.location.LocationService"
* @author Stephen McConnell
*/
public class LocationComponent extends AbstractLogEnabled implements
Configurable, Disposable, LocationService
{
private String m_location = "unknown";
/**
* Configuration of the component by the container. The
* implementation gets a child element named 'source' and
* assigns log the value.
*
* @param config the component configuration
* @exception ConfigurationException if a configuration error occurs
*/
public void configure( Configuration config ) throws
ConfigurationException
{
m_location = config.getChild( "source" ).getValue( "unknown" );
getLogger().info( "location: " + m_location );
}
/**
* Return a location.
* @return a location
*/
public String getLocation()
{
return m_location;
}
public void dispose()
{
getLogger().info( "disposal" );
}
}
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/location/impl/src/java/tutorial/location/LocationComponent.xprofile
Index: LocationComponent.xprofile
===================================================================
<?xml version="1.0"?>
<profiles>
<profile name="locator">
<configuration>
<source>Paris</source>
</configuration>
</profile>
</profiles>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/publisher/api/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<extend>${basedir}/../../project.xml</extend>
<id>publisher-api</id>
<name>Composition Publisher API</name>
<dependencies>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>SNAPSHOT</version>
</dependency>
</dependencies>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/publisher/api/src/java/tutorial/publisher/PublisherService.java
Index: PublisherService.java
===================================================================
package tutorial.publisher;
/**
* HelloComponent from Merlin's Tutorial
*
* @author Stephen McConnell
*/
public interface PublisherService
{
/**
* Publish a message.
* @param message the message to publish
*/
public void publish( String message );
}
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/publisher/impl/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<project>
<extend>${basedir}/../../project.xml</extend>
<id>publisher-impl</id>
<name>Composition Publisher Impl</name>
<dependencies>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework-impl</artifactId>
<version>SNAPSHOT</version>
</dependency>
<dependency>
<groupId>merlin-tutorial</groupId>
<artifactId>publisher-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/publisher/impl/conf/block.xml
Index: block.xml
===================================================================
<container name="publisher-block">
<services>
<service type="tutorial.publisher.PublisherService">
<source>publisher</source>
</service>
</services>
<classloader>
<classpath>
<repository>
<resource id="avalon-framework:avalon-framework-api" version="SNAPSHOT"/>
<resource id="avalon-framework:avalon-framework-impl" version="SNAPSHOT"/>
<resource id="merlin-tutorial:publisher-api" version="1.0"/>
<resource id="merlin-tutorial:publisher-impl" version="1.0"/>
</repository>
</classpath>
</classloader>
<component name="publisher"
class="tutorial.publisher.PublisherComponent"/>
</container>
1.1
avalon-sandbox/merlin/merlin-platform/tutorials/composition/publisher/impl/src/java/tutorial/publisher/PublisherComponent.java
Index: PublisherComponent.java
===================================================================
package tutorial.publisher;
import java.io.File;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.activity.Disposable;
/**
* PublisherComponent from Merlin's Composition Tutorial
*
* @avalon.component version="1.0" name="publisher"
* @avalon.service type="tutorial.publisher.PublisherService"
* @author Stephen McConnell
*/
public class PublisherComponent extends AbstractLogEnabled implements
PublisherService, Disposable
{
/**
* Supply of the logging channel by the container.
* @param logger the logging channel
*/
public void enableLogging( Logger logger )
{
logger.info( "created" );
super.enableLogging( logger );
}
/**
* Publish a message.
* @param message the message to publish
*/
public void publish( String message )
{
getLogger().info( message );
}
public void dispose()
{
getLogger().info( "disposal" );
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]