Return-Path: Delivered-To: apmail-jakarta-avalon-cvs-archive@apache.org Received: (qmail 79414 invoked from network); 23 Dec 2002 17:52:48 -0000 Received: from exchange.sun.com (192.18.33.10) by daedalus.apache.org with SMTP; 23 Dec 2002 17:52:48 -0000 Received: (qmail 28928 invoked by uid 97); 23 Dec 2002 17:54:01 -0000 Delivered-To: qmlist-jakarta-archive-avalon-cvs@jakarta.apache.org Received: (qmail 28860 invoked by uid 97); 23 Dec 2002 17:54:00 -0000 Mailing-List: contact avalon-cvs-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Avalon CVS List" Reply-To: "Avalon Developers List" Delivered-To: mailing list avalon-cvs@jakarta.apache.org Received: (qmail 28844 invoked by uid 97); 23 Dec 2002 17:53:59 -0000 X-Antivirus: nagoya (v4218 created Aug 14 2002) Date: 23 Dec 2002 17:52:40 -0000 Message-ID: <20021223175240.62367.qmail@icarus.apache.org> From: bloritsch@apache.org To: jakarta-avalon-cornerstone-cvs@apache.org Subject: cvs commit: jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/transport/publishing AbstractPublisher.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N bloritsch 2002/12/23 09:52:40 Modified: src/java/org/apache/avalon/cornerstone/blocks/datasource DefaultDataSourceSelector.java src/java/org/apache/avalon/cornerstone/blocks/event DefaultEventManager.java src/java/org/apache/avalon/cornerstone/blocks/masterstore AbstractFileRepository.java src/java/org/apache/avalon/cornerstone/blocks/sockets SSLFactoryBuilder.java src/java/org/apache/avalon/cornerstone/blocks/transport/publishing AbstractPublisher.java Log: Divorce ourselves from useing *phoenix.BlockContext--without sacrificing functionality Revision Changes Path 1.26 +185 -185 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/datasource/DefaultDataSourceSelector.java Index: DefaultDataSourceSelector.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/datasource/DefaultDataSourceSelector.java,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- DefaultDataSourceSelector.java 2 Oct 2002 01:52:15 -0000 1.25 +++ DefaultDataSourceSelector.java 23 Dec 2002 17:52:40 -0000 1.26 @@ -1,185 +1,185 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.avalon.cornerstone.blocks.datasource; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import org.apache.avalon.cornerstone.services.datasource.DataSourceSelector; -import org.apache.avalon.excalibur.datasource.DataSourceComponent; -import org.apache.avalon.framework.activity.Disposable; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.component.Component; -import org.apache.avalon.framework.component.ComponentException; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.context.ContextException; -import org.apache.avalon.framework.context.Contextualizable; -import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.logger.LogEnabled; -import org.apache.avalon.phoenix.BlockContext; - -/** - * The Default implementation for DataSourceSelector. - * The Configuration is like this: - * - *
  - * <myBlock>
  - *   <data-source name="default"
  - *     class="org.apache.avalon.excalibur.datasource.JdbcDataSource">
  - *     <!-- configuration for JdbcDataSource -->
  - *     <pool-controller min="5" max="10" connection-class="my.overrided.ConnectionClass">
  - *       <keep-alive>select 1</keep-alive>
  - *     </pool-controller>
  - *     <driver>com.database.jdbc.JdbcDriver</driver>
  - *     <dburl>jdbc:driver://host/mydb</dburl>
  - *     <user>username</user>
  - *     <password>password</password>
  - *   </data-source>
  - * </myBlock>
  - * 
- * - * @phoenix:block - * @phoenix:service name="org.apache.avalon.cornerstone.services.datasource.DataSourceSelector" - * - * @author Eung-ju Park - */ -public class DefaultDataSourceSelector - extends AbstractLogEnabled - implements DataSourceSelector, Contextualizable, Configurable, Initializable, Disposable -{ - private Configuration m_configuration; - private Map m_dataSources; - private BlockContext m_context; - - public void contextualize( final Context context ) - throws ContextException - { - m_context = (BlockContext)context; - } - - /** - * @phoenix:configuration-schema type="relax-ng" - */ - public void configure( final Configuration configuration ) - { - m_configuration = configuration; - } - - public void initialize() - throws Exception - { - m_dataSources = new HashMap(); - - Configuration[] dataSourceConfs = getDataSourceConfig(); - - for( int i = 0; i < dataSourceConfs.length; i++ ) - { - final Configuration dataSourceConf = dataSourceConfs[ i ]; - - final String name = dataSourceConf.getAttribute( "name" ); - final String clazz = dataSourceConf.getAttribute( "class" ); - final String driver = dataSourceConf.getChild( "driver", true ).getValue( "" ); - - final ClassLoader classLoader = - Thread.currentThread().getContextClassLoader(); - - DataSourceComponent component = null; - if( null == classLoader ) - { - if( !"".equals( driver ) ) - { - Class.forName( driver, true, Thread.currentThread().getContextClassLoader() ); - } - - component = (DataSourceComponent)Class.forName( clazz ).newInstance(); - } - else - { - if( !"".equals( driver ) ) - { - classLoader.loadClass( driver ); - } - - component = (DataSourceComponent)classLoader.loadClass( clazz ).newInstance(); - } - - if( component instanceof LogEnabled ) - { - setupLogger( component, name ); - } - component.configure( dataSourceConf ); - m_dataSources.put( name, component ); - - if( getLogger().isInfoEnabled() ) - { - getLogger().info( "DataSource " + name + " ready" ); - } - } - } - - private Configuration[] getDataSourceConfig() - { - final Configuration head = - m_configuration.getChild( "data-sources" ); - if( 0 != head.getChildren().length ) - { - final String message = - "WARNING: Child node in " + - "configuration of component named " + m_context.getName() + - " has been deprecated. Please put elements" + - " in root configuration element"; - getLogger().warn( message ); - System.out.println( message ); - return head.getChildren( "data-source" ); - } - else - { - return m_configuration.getChildren( "data-source" ); - } - } - - public void dispose() - { - final Iterator keys = m_dataSources.keySet().iterator(); - while( keys.hasNext() ) - { - final DataSourceComponent dsc = - (DataSourceComponent)m_dataSources.get( keys.next() ); - if( dsc instanceof Disposable ) - { - ((Disposable)dsc).dispose(); - } - } - } - - public boolean hasComponent( final Object hint ) - { - return m_dataSources.containsKey( hint ); - } - - public Component select( final Object hint ) - throws ComponentException - { - final Component component = (Component)m_dataSources.get( hint ); - - if( null == component ) - { - throw new ComponentException( "Unable to provide DataSourceComponent for " + hint ); - } - - return component; - } - - public void release( final Component component ) - { - //do nothing - } - -} +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.avalon.cornerstone.blocks.datasource; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.apache.avalon.cornerstone.services.datasource.DataSourceSelector; +import org.apache.avalon.excalibur.datasource.DataSourceComponent; +import org.apache.avalon.framework.activity.Disposable; +import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.component.Component; +import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.logger.LogEnabled; + +/** + * The Default implementation for DataSourceSelector. + * The Configuration is like this: + * + *
  + * <myBlock>
  + *   <data-source name="default"
  + *     class="org.apache.avalon.excalibur.datasource.JdbcDataSource">
  + *     <!-- configuration for JdbcDataSource -->
  + *     <pool-controller min="5" max="10" connection-class="my.overrided.ConnectionClass">
  + *       <keep-alive>select 1</keep-alive>
  + *     </pool-controller>
  + *     <driver>com.database.jdbc.JdbcDriver</driver>
  + *     <dburl>jdbc:driver://host/mydb</dburl>
  + *     <user>username</user>
  + *     <password>password</password>
  + *   </data-source>
  + * </myBlock>
  + * 
+ * + * @phoenix:block + * @phoenix:service name="org.apache.avalon.cornerstone.services.datasource.DataSourceSelector" + * + * @author Eung-ju Park + */ +public class DefaultDataSourceSelector + extends AbstractLogEnabled + implements DataSourceSelector, Contextualizable, Configurable, Initializable, Disposable +{ + private Configuration m_configuration; + private Map m_dataSources; + private String m_blockName; + + public void contextualize( final Context context ) + throws ContextException + { + m_blockName = (String) context.get("block.name"); + } + + /** + * @phoenix:configuration-schema type="relax-ng" + */ + public void configure( final Configuration configuration ) + { + m_configuration = configuration; + } + + public void initialize() + throws Exception + { + m_dataSources = new HashMap(); + + Configuration[] dataSourceConfs = getDataSourceConfig(); + + for( int i = 0; i < dataSourceConfs.length; i++ ) + { + final Configuration dataSourceConf = dataSourceConfs[ i ]; + + final String name = dataSourceConf.getAttribute( "name" ); + final String clazz = dataSourceConf.getAttribute( "class" ); + final String driver = dataSourceConf.getChild( "driver", true ).getValue( "" ); + + final ClassLoader classLoader = + Thread.currentThread().getContextClassLoader(); + + DataSourceComponent component = null; + if( null == classLoader ) + { + if( !"".equals( driver ) ) + { + Class.forName( driver, true, Thread.currentThread().getContextClassLoader() ); + } + + component = (DataSourceComponent)Class.forName( clazz ).newInstance(); + } + else + { + if( !"".equals( driver ) ) + { + classLoader.loadClass( driver ); + } + + component = (DataSourceComponent)classLoader.loadClass( clazz ).newInstance(); + } + + if( component instanceof LogEnabled ) + { + setupLogger( component, name ); + } + component.configure( dataSourceConf ); + m_dataSources.put( name, component ); + + if( getLogger().isInfoEnabled() ) + { + getLogger().info( "DataSource " + name + " ready" ); + } + } + } + + private Configuration[] getDataSourceConfig() + { + final Configuration head = + m_configuration.getChild( "data-sources" ); + if( 0 != head.getChildren().length ) + { + + final String message = + "WARNING: Child node in " + + "configuration of component named " + m_blockName + + " has been deprecated. Please put elements" + + " in root configuration element"; + getLogger().warn( message ); + System.out.println( message ); + return head.getChildren( "data-source" ); + } + else + { + return m_configuration.getChildren( "data-source" ); + } + } + + public void dispose() + { + final Iterator keys = m_dataSources.keySet().iterator(); + while( keys.hasNext() ) + { + final DataSourceComponent dsc = + (DataSourceComponent)m_dataSources.get( keys.next() ); + if( dsc instanceof Disposable ) + { + ((Disposable)dsc).dispose(); + } + } + } + + public boolean hasComponent( final Object hint ) + { + return m_dataSources.containsKey( hint ); + } + + public Component select( final Object hint ) + throws ComponentException + { + final Component component = (Component)m_dataSources.get( hint ); + + if( null == component ) + { + throw new ComponentException( "Unable to provide DataSourceComponent for " + hint ); + } + + return component; + } + + public void release( final Component component ) + { + //do nothing + } + +} 1.2 +10 -12 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/event/DefaultEventManager.java Index: DefaultEventManager.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/event/DefaultEventManager.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultEventManager.java 29 Nov 2002 21:30:06 -0000 1.1 +++ DefaultEventManager.java 23 Dec 2002 17:52:40 -0000 1.2 @@ -23,8 +23,6 @@ import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Disposable; -import org.apache.avalon.phoenix.BlockContext; - import org.apache.avalon.cornerstone.services.event.Event; import org.apache.avalon.cornerstone.services.event.Filter; import org.apache.avalon.cornerstone.services.event.EventManager; @@ -49,18 +47,18 @@ private Publisher m_publisher = new DefaultPublisher(); private Register m_register = new DefaultRegister(); private Hashtable m_subscribers = new Hashtable(); - + public Publisher getPublisher(){ return m_publisher; } public Register getRegister(){ return m_register; } - + public void contextualize( final Context context ) { } - + public void configure( final Configuration configuration ) throws ConfigurationException { @@ -76,7 +74,7 @@ public void initialize() throws Exception - { + { m_eventClass = Class.forName( m_rootEventType ); getLogger().info("Initialising eventClass " + m_eventClass); } @@ -84,10 +82,10 @@ public void dispose() { } - + class DefaultPublisher implements Publisher { - public void publish( final Event event ) + public void publish( final Event event ) { getLogger().info("Publishing event " + event.getClass()); System.out.println("Publishing event " + event.getClass()); @@ -102,7 +100,7 @@ } } } - + class DefaultRegister implements Register { public void subscribe( final Subscriber subscriber ) @@ -110,7 +108,7 @@ { if ( !m_eventClass.isAssignableFrom( subscriber.getEventType() ) ) throw new InvalidEventTypeException(); - + getLogger().info( "Subscribing event " + subscriber.getEventType().getName() ); // Add to list but prevent duplicate subscriptions if ( !m_subscribers.containsKey( subscriber.getUID() ) ){ @@ -122,7 +120,7 @@ } } public void unsubscribe( Subscriber subscriber ) - throws InvalidEventTypeException + throws InvalidEventTypeException { if ( !m_eventClass.isAssignableFrom( subscriber.getEventType() ) ) throw new InvalidEventTypeException(); @@ -137,5 +135,5 @@ } } } - + } 1.10 +319 -321 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/masterstore/AbstractFileRepository.java Index: AbstractFileRepository.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/masterstore/AbstractFileRepository.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- AbstractFileRepository.java 2 Oct 2002 01:52:16 -0000 1.9 +++ AbstractFileRepository.java 23 Dec 2002 17:52:40 -0000 1.10 @@ -1,321 +1,319 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.avalon.cornerstone.blocks.masterstore; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; -import org.apache.avalon.cornerstone.services.store.Repository; -import org.apache.avalon.excalibur.io.ExtensionFileFilter; -import org.apache.avalon.framework.activity.Initializable; -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.context.Context; -import org.apache.avalon.framework.context.Contextualizable; -import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.Serviceable; -import org.apache.avalon.phoenix.BlockContext; - -/** - * This an abstract class implementing functionality for creating a file-store. - * - * @author Stefano Mazzocchi - * @author Federico Barbieri - */ -public abstract class AbstractFileRepository - extends AbstractLogEnabled - implements Repository, Contextualizable, Serviceable, Configurable, Initializable -{ - protected static final boolean DEBUG = false; - - protected static final String HANDLED_URL = "file://"; - protected static final int BYTE_MASK = 0x0f; - protected static final char[] HEX_DIGITS = new char[] - { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' - }; - - protected String m_path; - protected String m_destination; - protected String m_extension; - protected String m_name; - protected FilenameFilter m_filter; - protected File m_baseDirectory; - - protected ServiceManager m_serviceManager; - protected BlockContext m_context; - - protected abstract String getExtensionDecorator(); - - public void contextualize( final Context context ) - { - final BlockContext blockContext = (BlockContext) context; - m_baseDirectory = blockContext.getBaseDirectory(); - } - - public void service( final ServiceManager serviceManager ) - throws ServiceException - { - m_serviceManager = serviceManager; - } - - public void configure( final Configuration configuration ) - throws ConfigurationException - { - if( null == m_destination ) - { - final String destination = configuration.getAttribute( "destinationURL" ); - setDestination( destination ); - } - } - - public void initialize() - throws Exception - { - getLogger().info( "Init " + getClass().getName() + " Store" ); - - m_name = RepositoryManager.getName(); - m_extension = "." + m_name + getExtensionDecorator(); - m_filter = new ExtensionFileFilter( m_extension ); - - final File directory = new File( m_path ); - directory.mkdirs(); - - getLogger().info( getClass().getName() + " opened in " + m_path ); - } - - protected void setDestination( final String destination ) - throws ConfigurationException - { - if( !destination.startsWith( HANDLED_URL ) ) - { - throw new ConfigurationException( "cannot handle destination " + destination ); - } - - m_path = destination.substring( HANDLED_URL.length() ); - - File directory; - - // Check for absolute path - if( m_path.startsWith( "/" ) ) - { - directory = new File( m_path ); - } - else - { - directory = new File( m_baseDirectory, m_path ); - } - - try - { - directory = directory.getCanonicalFile(); - } - catch( final IOException ioe ) - { - throw new ConfigurationException( "Unable to form canonical representation of " + - directory ); - } - - m_path = directory.toString(); - - m_destination = destination; - } - - protected AbstractFileRepository createChildRepository() - throws Exception - { - return (AbstractFileRepository) getClass().newInstance(); - } - - public Repository getChildRepository( final String childName ) - { - AbstractFileRepository child = null; - - try - { - child = createChildRepository(); - } - catch( final Exception e ) - { - throw new RuntimeException( "Cannot create child repository " + - childName + " : " + e ); - } - - try - { - child.service( m_serviceManager ); - } - catch( final ServiceException cme ) - { - throw new RuntimeException( "Cannot service child " + - "repository " + childName + - " : " + cme ); - } - - try - { - child.setDestination( m_destination + File.pathSeparatorChar + - childName + File.pathSeparator ); - } - catch( final ConfigurationException ce ) - { - throw new RuntimeException( "Cannot set destination for child child " + - "repository " + childName + - " : " + ce ); - } - - try - { - child.initialize(); - } - catch( final Exception e ) - { - throw new RuntimeException( "Cannot initialize child " + - "repository " + childName + - " : " + e ); - } - - if( DEBUG ) - { - getLogger().debug( "Child repository of " + m_name + " created in " + - m_destination + File.pathSeparatorChar + - childName + File.pathSeparator ); - } - - return child; - } - - protected File getFile( final String key ) - throws IOException - { - return new File( encode( key ) ); - } - - protected InputStream getInputStream( final String key ) - throws IOException - { - return new FileInputStream( getFile( key ) ); - } - - protected OutputStream getOutputStream( final String key ) - throws IOException - { - return new FileOutputStream( getFile( key ) ); - } - - /** - * Remove the object associated to the given key. - */ - public synchronized void remove( final String key ) - { - try - { - final File file = getFile( key ); - file.delete(); - if( DEBUG ) getLogger().debug( "removed key " + key ); - } - catch( final Exception e ) - { - throw new RuntimeException( "Exception caught while removing" + - " an object: " + e ); - } - } - - /** - * Indicates if the given key is associated to a contained object. - */ - public synchronized boolean containsKey( final String key ) - { - try - { - final File file = getFile( key ); - if( DEBUG ) getLogger().debug( "checking key " + key ); - return file.exists(); - } - catch( final Exception e ) - { - throw new RuntimeException( "Exception caught while searching " + - "an object: " + e ); - } - } - - /** - * Returns the list of used keys. - */ - public Iterator list() - { - final File storeDir = new File( m_path ); - final String[] names = storeDir.list( m_filter ); - final ArrayList list = new ArrayList(); - - for( int i = 0; i < names.length; i++ ) - { - list.add( decode( names[ i ] ) ); - } - - return list.iterator(); - } - - /** - * Returns a String that uniquely identifies the object. - * Note: since this method uses the Object.toString() - * method, it's up to the caller to make sure that this method - * doesn't change between different JVM executions (like - * it may normally happen). For this reason, it's highly recommended - * (even if not mandated) that Strings be used as keys. - */ - protected String encode( final String key ) - { - final byte[] bytes = key.getBytes(); - final char[] buffer = new char[ bytes.length << 1 ]; - - for( int i = 0, j = 0; i < bytes.length; i++ ) - { - final int k = bytes[ i ]; - buffer[ j++ ] = HEX_DIGITS[ ( k >>> 4 ) & BYTE_MASK ]; - buffer[ j++ ] = HEX_DIGITS[ k & BYTE_MASK ]; - } - - StringBuffer result = new StringBuffer(); - result.append( m_path ); - result.append( File.separator ); - result.append( buffer ); - result.append( m_extension ); - return result.toString(); - } - - /** - * Inverse of encode exept it do not use path. - * So decode(encode(s) - m_path) = s. - * In other words it returns a String that can be used as key to retive - * the record contained in the 'filename' file. - */ - protected String decode( String filename ) - { - filename = filename.substring( 0, filename.length() - m_extension.length() ); - final int size = filename.length(); - final byte[] bytes = new byte[ size >>> 1 ]; - - for( int i = 0, j = 0; i < size; j++ ) - { - bytes[ j ] = Byte.parseByte( filename.substring( i, i + 2 ), 16 ); - i += 2; - } - - return new String( bytes ); - } -} +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.avalon.cornerstone.blocks.masterstore; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import org.apache.avalon.cornerstone.services.store.Repository; +import org.apache.avalon.excalibur.io.ExtensionFileFilter; +import org.apache.avalon.framework.activity.Initializable; +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.context.Context; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.service.ServiceManager; +import org.apache.avalon.framework.service.Serviceable; +import org.apache.avalon.framework.context.ContextException; + +/** + * This an abstract class implementing functionality for creating a file-store. + * + * @author Stefano Mazzocchi + * @author Federico Barbieri + */ +public abstract class AbstractFileRepository + extends AbstractLogEnabled + implements Repository, Contextualizable, Serviceable, Configurable, Initializable +{ + protected static final boolean DEBUG = false; + + protected static final String HANDLED_URL = "file://"; + protected static final int BYTE_MASK = 0x0f; + protected static final char[] HEX_DIGITS = new char[] + { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + protected String m_path; + protected String m_destination; + protected String m_extension; + protected String m_name; + protected FilenameFilter m_filter; + protected File m_baseDirectory; + + protected ServiceManager m_serviceManager; + + protected abstract String getExtensionDecorator(); + + public void contextualize( final Context context ) throws ContextException + { + m_baseDirectory = (File) context.get("app.home"); + } + + public void service( final ServiceManager serviceManager ) + throws ServiceException + { + m_serviceManager = serviceManager; + } + + public void configure( final Configuration configuration ) + throws ConfigurationException + { + if( null == m_destination ) + { + final String destination = configuration.getAttribute( "destinationURL" ); + setDestination( destination ); + } + } + + public void initialize() + throws Exception + { + getLogger().info( "Init " + getClass().getName() + " Store" ); + + m_name = RepositoryManager.getName(); + m_extension = "." + m_name + getExtensionDecorator(); + m_filter = new ExtensionFileFilter( m_extension ); + + final File directory = new File( m_path ); + directory.mkdirs(); + + getLogger().info( getClass().getName() + " opened in " + m_path ); + } + + protected void setDestination( final String destination ) + throws ConfigurationException + { + if( !destination.startsWith( HANDLED_URL ) ) + { + throw new ConfigurationException( "cannot handle destination " + destination ); + } + + m_path = destination.substring( HANDLED_URL.length() ); + + File directory; + + // Check for absolute path + if( m_path.startsWith( "/" ) ) + { + directory = new File( m_path ); + } + else + { + directory = new File( m_baseDirectory, m_path ); + } + + try + { + directory = directory.getCanonicalFile(); + } + catch( final IOException ioe ) + { + throw new ConfigurationException( "Unable to form canonical representation of " + + directory ); + } + + m_path = directory.toString(); + + m_destination = destination; + } + + protected AbstractFileRepository createChildRepository() + throws Exception + { + return (AbstractFileRepository) getClass().newInstance(); + } + + public Repository getChildRepository( final String childName ) + { + AbstractFileRepository child = null; + + try + { + child = createChildRepository(); + } + catch( final Exception e ) + { + throw new RuntimeException( "Cannot create child repository " + + childName + " : " + e ); + } + + try + { + child.service( m_serviceManager ); + } + catch( final ServiceException cme ) + { + throw new RuntimeException( "Cannot service child " + + "repository " + childName + + " : " + cme ); + } + + try + { + child.setDestination( m_destination + File.pathSeparatorChar + + childName + File.pathSeparator ); + } + catch( final ConfigurationException ce ) + { + throw new RuntimeException( "Cannot set destination for child child " + + "repository " + childName + + " : " + ce ); + } + + try + { + child.initialize(); + } + catch( final Exception e ) + { + throw new RuntimeException( "Cannot initialize child " + + "repository " + childName + + " : " + e ); + } + + if( DEBUG ) + { + getLogger().debug( "Child repository of " + m_name + " created in " + + m_destination + File.pathSeparatorChar + + childName + File.pathSeparator ); + } + + return child; + } + + protected File getFile( final String key ) + throws IOException + { + return new File( encode( key ) ); + } + + protected InputStream getInputStream( final String key ) + throws IOException + { + return new FileInputStream( getFile( key ) ); + } + + protected OutputStream getOutputStream( final String key ) + throws IOException + { + return new FileOutputStream( getFile( key ) ); + } + + /** + * Remove the object associated to the given key. + */ + public synchronized void remove( final String key ) + { + try + { + final File file = getFile( key ); + file.delete(); + if( DEBUG ) getLogger().debug( "removed key " + key ); + } + catch( final Exception e ) + { + throw new RuntimeException( "Exception caught while removing" + + " an object: " + e ); + } + } + + /** + * Indicates if the given key is associated to a contained object. + */ + public synchronized boolean containsKey( final String key ) + { + try + { + final File file = getFile( key ); + if( DEBUG ) getLogger().debug( "checking key " + key ); + return file.exists(); + } + catch( final Exception e ) + { + throw new RuntimeException( "Exception caught while searching " + + "an object: " + e ); + } + } + + /** + * Returns the list of used keys. + */ + public Iterator list() + { + final File storeDir = new File( m_path ); + final String[] names = storeDir.list( m_filter ); + final ArrayList list = new ArrayList(); + + for( int i = 0; i < names.length; i++ ) + { + list.add( decode( names[ i ] ) ); + } + + return list.iterator(); + } + + /** + * Returns a String that uniquely identifies the object. + * Note: since this method uses the Object.toString() + * method, it's up to the caller to make sure that this method + * doesn't change between different JVM executions (like + * it may normally happen). For this reason, it's highly recommended + * (even if not mandated) that Strings be used as keys. + */ + protected String encode( final String key ) + { + final byte[] bytes = key.getBytes(); + final char[] buffer = new char[ bytes.length << 1 ]; + + for( int i = 0, j = 0; i < bytes.length; i++ ) + { + final int k = bytes[ i ]; + buffer[ j++ ] = HEX_DIGITS[ ( k >>> 4 ) & BYTE_MASK ]; + buffer[ j++ ] = HEX_DIGITS[ k & BYTE_MASK ]; + } + + StringBuffer result = new StringBuffer(); + result.append( m_path ); + result.append( File.separator ); + result.append( buffer ); + result.append( m_extension ); + return result.toString(); + } + + /** + * Inverse of encode exept it do not use path. + * So decode(encode(s) - m_path) = s. + * In other words it returns a String that can be used as key to retive + * the record contained in the 'filename' file. + */ + protected String decode( String filename ) + { + filename = filename.substring( 0, filename.length() - m_extension.length() ); + final int size = filename.length(); + final byte[] bytes = new byte[ size >>> 1 ]; + + for( int i = 0, j = 0; i < size; j++ ) + { + bytes[ j ] = Byte.parseByte( filename.substring( i, i + 2 ), 16 ); + i += 2; + } + + return new String( bytes ); + } +} 1.3 +258 -259 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/sockets/SSLFactoryBuilder.java Index: SSLFactoryBuilder.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/sockets/SSLFactoryBuilder.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- SSLFactoryBuilder.java 8 Oct 2002 21:43:32 -0000 1.2 +++ SSLFactoryBuilder.java 23 Dec 2002 17:52:40 -0000 1.3 @@ -1,259 +1,258 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.avalon.cornerstone.blocks.sockets; - -import com.sun.net.ssl.KeyManagerFactory; -import com.sun.net.ssl.SSLContext; -import com.sun.net.ssl.TrustManagerFactory; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.security.GeneralSecurityException; -import java.security.KeyStore; -import java.util.Arrays; -import javax.net.ssl.SSLServerSocketFactory; -import javax.net.ssl.SSLSocketFactory; -import org.apache.avalon.framework.activity.Disposable; -import org.apache.avalon.framework.activity.Initializable; -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.context.Context; -import org.apache.avalon.framework.context.Contextualizable; -import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.phoenix.BlockContext; - -/** - * Builds SSLContexts with desired properties. Hides all the gory - * details of SSLContext productions behind nice Avalon - * interfaces. Married to Sun JCA implementation. - *

- * Configuration looks like: - *

  - * <ssl-factory>
  - *    <keystore>
  - *      <file>conf/keystore</file> <!-- keystore file location -->
  - *      <password></password> <!-- Key Store file password, only used to check keystore integrity -->
  - *      <key-password></key-password> <!-- Only required when you need to decrypt a private key -->
  - *     <type>JKS</type> <!-- Key Store file format, defaults to JKS -->
  - *     <algorithm>SunX509</algorithm> <!-- Cryptography provider ID, defaults to SunX509 -->
  - *   </keystore>
  - *   <!-- SSL protocol to use, defaults to TLS, another possible value is SSL -->
  - *   <protocol>TLS</protocol>
  - * </ssl-factory>
  - * 
- *

- *

- * Notes on keystore files. Absolute paths are supported. Relative - * paths are interpreted relative to .sar base directory. Defaults to - * conf/keystore. Since keystore usually contains sensitive keys it - * maybe beneficial to not include the keystores into the .sar - * files. - *

- * @author Greg Steuck - */ -public class SSLFactoryBuilder extends AbstractLogEnabled - implements Configurable, Contextualizable, Disposable, Initializable -{ - private File m_baseDirectory; - private File m_keystoreFile; - - private String m_keystorePassword; - private String m_keyPassword; - private String m_protocol; - private String m_provider; - private String m_keystoreFormat; - - private SSLContext m_ctx; - - static - { - // Registers Sun's providers - java.security.Security.addProvider( new sun.security.provider.Sun() ); - java.security.Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() ); - } - - /** - * Requires a BlockContext. We'll see how we end up expressing - * these dependencies. - */ - public void contextualize( final Context context ) - { - final BlockContext blockContext = (BlockContext) context; - m_baseDirectory = blockContext.getBaseDirectory(); - } - - public void configure( final Configuration configuration ) - throws ConfigurationException - { - final Configuration storeConfig = configuration.getChild( "keystore" ); - final String fileName = storeConfig.getChild( "file" ).getValue( "conf/keystore" ); - final File configuredFile = new File( fileName ); - if ( ! configuredFile.isAbsolute() ) - { - m_keystoreFile = new File ( m_baseDirectory, fileName ); - } - else - { - m_keystoreFile = configuredFile; - } - - m_keystorePassword = storeConfig.getChild( "password" ).getValue( null ); - m_keyPassword = storeConfig.getChild( "key-password" ).getValue( null ); - // key is named incorrectly, left as is for compatibility - m_provider = storeConfig.getChild( "algorithm" ).getValue( "SunX509" ); - // key is named incorrectly, left as is for compatibility - m_keystoreFormat = storeConfig.getChild( "type" ).getValue( "JKS" ); - // ugly compatibility workaround follows - m_protocol = configuration.getChild( "protocol" ). - getValue( storeConfig.getChild( "protocol" ).getValue( "TLS" ) ); - } - - /** - * Produces a fresh ssl socket factory with configured parameters. - */ - public SSLSocketFactory buildSocketFactory() - { - return m_ctx.getSocketFactory(); - } - - /** - * Produces a fresh ssl server socket factory with configured - * parameters. - */ - public SSLServerSocketFactory buildServerSocketFactory() - { - return m_ctx.getServerSocketFactory(); - } - - public void initialize() - throws IOException, GeneralSecurityException - { - final FileInputStream keyStream = new FileInputStream( m_keystoreFile ); - try - { - m_ctx = makeContext( keyStream, m_keystorePassword, - m_keyPassword, m_protocol, - m_provider, m_keystoreFormat ); - } - finally - { - try - { - keyStream.close(); - } - catch ( IOException e ) - { - // avoids hiding exceptions from makeContext - // by catching this IOException - getLogger().error( "Error keyStream.close failed", e ); - } - } - } - - public void dispose() - { - m_keystorePassword = null; - m_keyPassword = null; - } - - /** - * Creates an SSL context which uses the keys and certificates - * provided by the given keyStream. For simplicity the - * same key stream (keystore) is used for both key and trust - * factory. - * - * @param keyStream to read the keys from - * @param keystorePassword password for the keystore, can be null - * if integrity verification is not desired - * @param keyPassword passphrase which unlocks the keys in the key file - * (should really be a char[] so that it can be cleaned after use) - * @param protocol the standard name of the requested protocol - * @param provider the standard name of the requested algorithm - * @param keystoreFormat the type of keystore - * - * @return context configured with these keys and certificates - * @throws IOException if files can't be read - * @throws GeneralSecurityException is something goes wrong inside - * cryptography framework - */ - private static SSLContext makeContext (InputStream keyStream, - String keystorePassword, - String keyPassword, - String protocol, - String provider, - String keystoreFormat ) - throws IOException, GeneralSecurityException - { - final KeyStore keystore = loadKeystore( keyStream, - keystorePassword, - keystoreFormat ); - final KeyManagerFactory kmf = KeyManagerFactory.getInstance( provider ); - // even though undocumented Sun's implementation doesn't allow - // null passphrases, but zero sized arrays are OK - final char [] passChars = ( keyPassword != null ) ? - keyPassword.toCharArray() : new char [0]; - try - { - kmf.init( keystore, passChars ); - } - finally - { - Arrays.fill( passChars, (char) 0 ); - } - - final TrustManagerFactory tmf = - TrustManagerFactory.getInstance( provider ); - tmf.init( keystore ); - - final SSLContext result = SSLContext.getInstance( protocol ); - result.init( kmf.getKeyManagers(), - tmf.getTrustManagers(), - new java.security.SecureRandom() ); - return result; - } - - /** - * Builds a keystore loaded from the given stream. The passphrase - * is used to verify the keystore file integrity. - * @param file to load from - * @param passphrase for the store integrity verification (or null if - * integrity check is not wanted) - * @param keystoreFormat the type of keystore - * @return loaded key store - * @throws IOException if file can not be read - * @throws GeneralSecurityException if key store can't be built - */ - private static KeyStore loadKeystore( InputStream keyStream, - String passphrase, - String keystoreFormat ) - throws GeneralSecurityException, IOException - { - final KeyStore ks = KeyStore.getInstance( keystoreFormat ); - - if ( passphrase != null ) - { - final char [] passChars = passphrase.toCharArray(); - try - { - ks.load( keyStream, passChars ); - } - finally - { - Arrays.fill( passChars, (char) 0 ); - } - } - else - { - ks.load( keyStream, null ); - } - - return ks; - } -} +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.avalon.cornerstone.blocks.sockets; + +import com.sun.net.ssl.KeyManagerFactory; +import com.sun.net.ssl.SSLContext; +import com.sun.net.ssl.TrustManagerFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.util.Arrays; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSocketFactory; +import org.apache.avalon.framework.activity.Disposable; +import org.apache.avalon.framework.activity.Initializable; +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.context.Context; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.context.*; + +/** + * Builds SSLContexts with desired properties. Hides all the gory + * details of SSLContext productions behind nice Avalon + * interfaces. Married to Sun JCA implementation. + *

+ * Configuration looks like: + *

  + * <ssl-factory>
  + *    <keystore>
  + *      <file>conf/keystore</file> <!-- keystore file location -->
  + *      <password></password> <!-- Key Store file password, only used to check keystore integrity -->
  + *      <key-password></key-password> <!-- Only required when you need to decrypt a private key -->
  + *     <type>JKS</type> <!-- Key Store file format, defaults to JKS -->
  + *     <algorithm>SunX509</algorithm> <!-- Cryptography provider ID, defaults to SunX509 -->
  + *   </keystore>
  + *   <!-- SSL protocol to use, defaults to TLS, another possible value is SSL -->
  + *   <protocol>TLS</protocol>
  + * </ssl-factory>
  + * 
+ *

+ *

+ * Notes on keystore files. Absolute paths are supported. Relative + * paths are interpreted relative to .sar base directory. Defaults to + * conf/keystore. Since keystore usually contains sensitive keys it + * maybe beneficial to not include the keystores into the .sar + * files. + *

+ * @author Greg Steuck + */ +public class SSLFactoryBuilder extends AbstractLogEnabled + implements Configurable, Contextualizable, Disposable, Initializable +{ + private File m_baseDirectory; + private File m_keystoreFile; + + private String m_keystorePassword; + private String m_keyPassword; + private String m_protocol; + private String m_provider; + private String m_keystoreFormat; + + private SSLContext m_ctx; + + static + { + // Registers Sun's providers + java.security.Security.addProvider( new sun.security.provider.Sun() ); + java.security.Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() ); + } + + /** + * Requires a BlockContext. We'll see how we end up expressing + * these dependencies. + */ + public void contextualize( final Context context ) throws ContextException + { + m_baseDirectory = (File) context.get("app.home"); + } + + public void configure( final Configuration configuration ) + throws ConfigurationException + { + final Configuration storeConfig = configuration.getChild( "keystore" ); + final String fileName = storeConfig.getChild( "file" ).getValue( "conf/keystore" ); + final File configuredFile = new File( fileName ); + if ( ! configuredFile.isAbsolute() ) + { + m_keystoreFile = new File ( m_baseDirectory, fileName ); + } + else + { + m_keystoreFile = configuredFile; + } + + m_keystorePassword = storeConfig.getChild( "password" ).getValue( null ); + m_keyPassword = storeConfig.getChild( "key-password" ).getValue( null ); + // key is named incorrectly, left as is for compatibility + m_provider = storeConfig.getChild( "algorithm" ).getValue( "SunX509" ); + // key is named incorrectly, left as is for compatibility + m_keystoreFormat = storeConfig.getChild( "type" ).getValue( "JKS" ); + // ugly compatibility workaround follows + m_protocol = configuration.getChild( "protocol" ). + getValue( storeConfig.getChild( "protocol" ).getValue( "TLS" ) ); + } + + /** + * Produces a fresh ssl socket factory with configured parameters. + */ + public SSLSocketFactory buildSocketFactory() + { + return m_ctx.getSocketFactory(); + } + + /** + * Produces a fresh ssl server socket factory with configured + * parameters. + */ + public SSLServerSocketFactory buildServerSocketFactory() + { + return m_ctx.getServerSocketFactory(); + } + + public void initialize() + throws IOException, GeneralSecurityException + { + final FileInputStream keyStream = new FileInputStream( m_keystoreFile ); + try + { + m_ctx = makeContext( keyStream, m_keystorePassword, + m_keyPassword, m_protocol, + m_provider, m_keystoreFormat ); + } + finally + { + try + { + keyStream.close(); + } + catch ( IOException e ) + { + // avoids hiding exceptions from makeContext + // by catching this IOException + getLogger().error( "Error keyStream.close failed", e ); + } + } + } + + public void dispose() + { + m_keystorePassword = null; + m_keyPassword = null; + } + + /** + * Creates an SSL context which uses the keys and certificates + * provided by the given keyStream. For simplicity the + * same key stream (keystore) is used for both key and trust + * factory. + * + * @param keyStream to read the keys from + * @param keystorePassword password for the keystore, can be null + * if integrity verification is not desired + * @param keyPassword passphrase which unlocks the keys in the key file + * (should really be a char[] so that it can be cleaned after use) + * @param protocol the standard name of the requested protocol + * @param provider the standard name of the requested algorithm + * @param keystoreFormat the type of keystore + * + * @return context configured with these keys and certificates + * @throws IOException if files can't be read + * @throws GeneralSecurityException is something goes wrong inside + * cryptography framework + */ + private static SSLContext makeContext (InputStream keyStream, + String keystorePassword, + String keyPassword, + String protocol, + String provider, + String keystoreFormat ) + throws IOException, GeneralSecurityException + { + final KeyStore keystore = loadKeystore( keyStream, + keystorePassword, + keystoreFormat ); + final KeyManagerFactory kmf = KeyManagerFactory.getInstance( provider ); + // even though undocumented Sun's implementation doesn't allow + // null passphrases, but zero sized arrays are OK + final char [] passChars = ( keyPassword != null ) ? + keyPassword.toCharArray() : new char [0]; + try + { + kmf.init( keystore, passChars ); + } + finally + { + Arrays.fill( passChars, (char) 0 ); + } + + final TrustManagerFactory tmf = + TrustManagerFactory.getInstance( provider ); + tmf.init( keystore ); + + final SSLContext result = SSLContext.getInstance( protocol ); + result.init( kmf.getKeyManagers(), + tmf.getTrustManagers(), + new java.security.SecureRandom() ); + return result; + } + + /** + * Builds a keystore loaded from the given stream. The passphrase + * is used to verify the keystore file integrity. + * @param file to load from + * @param passphrase for the store integrity verification (or null if + * integrity check is not wanted) + * @param keystoreFormat the type of keystore + * @return loaded key store + * @throws IOException if file can not be read + * @throws GeneralSecurityException if key store can't be built + */ + private static KeyStore loadKeystore( InputStream keyStream, + String passphrase, + String keystoreFormat ) + throws GeneralSecurityException, IOException + { + final KeyStore ks = KeyStore.getInstance( keystoreFormat ); + + if ( passphrase != null ) + { + final char [] passChars = passphrase.toCharArray(); + try + { + ks.load( keyStream, passChars ); + } + finally + { + Arrays.fill( passChars, (char) 0 ); + } + } + else + { + ks.load( keyStream, null ); + } + + return ks; + } +} 1.22 +301 -301 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/transport/publishing/AbstractPublisher.java Index: AbstractPublisher.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/transport/publishing/AbstractPublisher.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- AbstractPublisher.java 2 Oct 2002 01:52:16 -0000 1.21 +++ AbstractPublisher.java 23 Dec 2002 17:52:40 -0000 1.22 @@ -1,301 +1,301 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.avalon.cornerstone.blocks.transport.publishing; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.StringTokenizer; -import java.util.Vector; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.activity.Startable; -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.context.Context; -import org.apache.avalon.framework.context.Contextualizable; -import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.Serviceable; -import org.apache.avalon.phoenix.BlockContext; -import org.apache.excalibur.altrmi.common.MethodRequest; -import org.apache.excalibur.altrmi.server.AltrmiAuthenticator; -import org.apache.excalibur.altrmi.server.AltrmiPublisher; -import org.apache.excalibur.altrmi.server.ClassRetriever; -import org.apache.excalibur.altrmi.server.MethodInvocationHandler; -import org.apache.excalibur.altrmi.server.PublicationDescription; -import org.apache.excalibur.altrmi.server.PublicationException; -import org.apache.excalibur.altrmi.server.impl.AbstractServer; -import org.apache.excalibur.altrmi.server.impl.classretrievers.AbstractDynamicGeneratorClassRetriever; -import org.apache.excalibur.altrmi.server.impl.classretrievers.BcelDynamicGeneratorClassRetriever; -import org.apache.excalibur.altrmi.server.impl.classretrievers.JarFileClassRetriever; -import org.apache.excalibur.altrmi.server.impl.classretrievers.NoClassRetriever; - -/** - * Abstract Publisher. - * - * @author Paul Hammant Paul_Hammant@yahoo.com - * @author Thomas Kiesgen - * @version $Revision$ - */ -public abstract class AbstractPublisher - extends AbstractLogEnabled - implements AltrmiPublisher, Startable, Serviceable, Contextualizable, Configurable, - Initializable -{ - private AbstractServer m_abstractServer; - private ClassRetriever m_classRetriever; - private AltrmiAuthenticator m_altrmiAuthenticator; - protected File m_baseDirectory; - private boolean m_isDynamicPublisher = false; - - /** - * - * @param configuration - * @throws ConfigurationException - */ - public void configure( Configuration configuration ) - throws ConfigurationException - { - String classRetrieverType = configuration.getChild( "classRetrieverType" ).getValue(); - - if( classRetrieverType.equals( "jarFile" ) ) - { - StringTokenizer st = - new StringTokenizer( configuration.getChild( "gerneratedClassJarURLs" ).getValue(), - "," ); - Vector vector = new Vector(); - - while( st.hasMoreTokens() ) - { - try - { - String url = st.nextToken(); - - if( url.startsWith( "./" ) ) - { - File file = new File( m_baseDirectory, url.substring( 2, url.length() ) ); - - vector.add( file.toURL() ); - } - else - { - vector.add( new URL( url ) ); - } - } - catch( MalformedURLException e ) - { - getLogger() - .debug( "Can't create URL from config element 'gerneratedClassJarURLs'", - e ); - } - } - - URL[] urls = new URL[ vector.size() ]; - - vector.copyInto( urls ); - - m_classRetriever = new JarFileClassRetriever( urls ); - } - else if( classRetrieverType.equals( "none" ) ) - { - m_classRetriever = new NoClassRetriever(); - } - else if( classRetrieverType.equals( "bcel" ) ) - { - AbstractDynamicGeneratorClassRetriever generator = new BcelDynamicGeneratorClassRetriever(); - File classGenDir = new File( m_baseDirectory, configuration.getChild( "classGenDir" ).getValue( "" ) ); - generator.setClassGenDir( classGenDir.getAbsolutePath() ); - m_classRetriever = generator; - - m_isDynamicPublisher = true; - getLogger().debug( "setting classgen dir for generator to " + classGenDir.getAbsolutePath() ); - getLogger().debug( "setting class retriever to bcel dynamic generator" ); - } - - - else - { - throw new ConfigurationException( - "classRetrieverType must be 'bcel', 'jarFile' or 'none'" ); - } - } - - /** - * contextualize as per Contextualizable interface - * @param context - */ - public void contextualize( final Context context ) - { - m_baseDirectory = ( (BlockContext)context ).getBaseDirectory(); - } - - /** - * Service as per Serviceable interface - * @param manager a service manager - * @throws ServiceException if a problem during servicing - * @phoenix:dependency name="org.apache.excalibur.altrmi.server.AltrmiAuthenticator" - */ - public void service( ServiceManager manager ) - throws ServiceException - { - m_altrmiAuthenticator = - (AltrmiAuthenticator)manager.lookup( AltrmiAuthenticator.class.getName() ); - } - - /** - * initialize as per Initializable interface - * @throws Exception - */ - public void initialize() throws Exception - { - m_abstractServer.setClassRetriever( m_classRetriever ); - m_abstractServer.setAuthenticator( m_altrmiAuthenticator ); - } - - /** - * - * @param implementation - * @param asName - * @param interfaceToExpose - * @throws PublicationException - */ - public void publish( Object implementation, String asName, Class interfaceToExpose ) - throws PublicationException - { - if( getLogger().isDebugEnabled() ) - getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation - + ", interf: "+ interfaceToExpose + "]" ); - - if( m_isDynamicPublisher ) - { - ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, interfaceToExpose, this.getClass().getClassLoader() ); - if( getLogger().isDebugEnabled() ) - { - getLogger().debug( "generated dynamic proxy for published interface " + asName ); - } - } - - m_abstractServer.publish( implementation, asName, interfaceToExpose ); - } - - /** - * Publish an service - * @param implementation - * @param asName - * @param publicationDescription - * @throws PublicationException - */ - public void publish( - Object implementation, String asName, PublicationDescription publicationDescription ) - throws PublicationException - { - if( getLogger().isDebugEnabled() ) - getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation + "]" ); - - if( m_isDynamicPublisher ) - { - ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, publicationDescription, this.getClass().getClassLoader() ); - if( getLogger().isDebugEnabled() ) - { - getLogger().debug( "generated dynamic proxy for published interface " + asName ); - } - } - - - - m_abstractServer.publish( implementation, asName, publicationDescription ); - } - - /** - * - * @param object - * @param asName - * @throws PublicationException - */ - public void unPublish( Object object, String asName ) throws PublicationException - { - if( getLogger().isDebugEnabled() ) - getLogger().debug( "Unpublishing object [nane: " + asName + ", impl: " + object + "]" ); - - m_abstractServer.unPublish( object, asName ); - } - - /** - * - * @param object - * @param asName - * @param o1 - * @throws PublicationException - */ - public void replacePublished( Object object, String asName, Object o1 ) throws PublicationException - { - if( getLogger().isDebugEnabled() ) - getLogger().debug( "Replacing published object [nane: " + asName + ", existing: " + object + ", new: " + o1 + "]" ); - - m_abstractServer.replacePublished( object, asName, o1 ); - } - - /** - * - * @throws Exception - */ - public void start() throws Exception - { - m_abstractServer.start(); - } - - /** - * - * @throws Exception - */ - public void stop() throws Exception - { - m_abstractServer.stop(); - } - - /** - * - * @param request - * @param publishedName - * @return - */ - public MethodInvocationHandler getMethodInvocationHandler( MethodRequest request, String publishedName ) - { - return m_abstractServer.getMethodInvocationHandler( request, publishedName ); - } - - /** - * - * @param publishedName - * @return - */ - public MethodInvocationHandler getMethodInvocationHandler(String publishedName) - { - return m_abstractServer.getMethodInvocationHandler( publishedName ); - } - - /** - * - * @return - */ - protected AbstractServer getAbstractServer() - { - return m_abstractServer; - } - - /** - * - * @param abstractServer - */ - protected void setAbstractServer( AbstractServer abstractServer ) - { - m_abstractServer = abstractServer; - } -} +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.avalon.cornerstone.blocks.transport.publishing; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.StringTokenizer; +import java.util.Vector; +import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.activity.Startable; +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.context.Context; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.service.ServiceManager; +import org.apache.avalon.framework.service.Serviceable; +import org.apache.excalibur.altrmi.common.MethodRequest; +import org.apache.excalibur.altrmi.server.AltrmiAuthenticator; +import org.apache.excalibur.altrmi.server.AltrmiPublisher; +import org.apache.excalibur.altrmi.server.ClassRetriever; +import org.apache.excalibur.altrmi.server.MethodInvocationHandler; +import org.apache.excalibur.altrmi.server.PublicationDescription; +import org.apache.excalibur.altrmi.server.PublicationException; +import org.apache.excalibur.altrmi.server.impl.AbstractServer; +import org.apache.excalibur.altrmi.server.impl.classretrievers.AbstractDynamicGeneratorClassRetriever; +import org.apache.excalibur.altrmi.server.impl.classretrievers.BcelDynamicGeneratorClassRetriever; +import org.apache.excalibur.altrmi.server.impl.classretrievers.JarFileClassRetriever; +import org.apache.excalibur.altrmi.server.impl.classretrievers.NoClassRetriever; +import org.apache.avalon.framework.context.ContextException; + +/** + * Abstract Publisher. + * + * @author Paul Hammant Paul_Hammant@yahoo.com + * @author Thomas Kiesgen + * @version $Revision$ + */ +public abstract class AbstractPublisher + extends AbstractLogEnabled + implements AltrmiPublisher, Startable, Serviceable, Contextualizable, Configurable, + Initializable +{ + private AbstractServer m_abstractServer; + private ClassRetriever m_classRetriever; + private AltrmiAuthenticator m_altrmiAuthenticator; + protected File m_baseDirectory; + private boolean m_isDynamicPublisher = false; + + /** + * + * @param configuration + * @throws ConfigurationException + */ + public void configure( Configuration configuration ) + throws ConfigurationException + { + String classRetrieverType = configuration.getChild( "classRetrieverType" ).getValue(); + + if( classRetrieverType.equals( "jarFile" ) ) + { + StringTokenizer st = + new StringTokenizer( configuration.getChild( "gerneratedClassJarURLs" ).getValue(), + "," ); + Vector vector = new Vector(); + + while( st.hasMoreTokens() ) + { + try + { + String url = st.nextToken(); + + if( url.startsWith( "./" ) ) + { + File file = new File( m_baseDirectory, url.substring( 2, url.length() ) ); + + vector.add( file.toURL() ); + } + else + { + vector.add( new URL( url ) ); + } + } + catch( MalformedURLException e ) + { + getLogger() + .debug( "Can't create URL from config element 'gerneratedClassJarURLs'", + e ); + } + } + + URL[] urls = new URL[ vector.size() ]; + + vector.copyInto( urls ); + + m_classRetriever = new JarFileClassRetriever( urls ); + } + else if( classRetrieverType.equals( "none" ) ) + { + m_classRetriever = new NoClassRetriever(); + } + else if( classRetrieverType.equals( "bcel" ) ) + { + AbstractDynamicGeneratorClassRetriever generator = new BcelDynamicGeneratorClassRetriever(); + File classGenDir = new File( m_baseDirectory, configuration.getChild( "classGenDir" ).getValue( "" ) ); + generator.setClassGenDir( classGenDir.getAbsolutePath() ); + m_classRetriever = generator; + + m_isDynamicPublisher = true; + getLogger().debug( "setting classgen dir for generator to " + classGenDir.getAbsolutePath() ); + getLogger().debug( "setting class retriever to bcel dynamic generator" ); + } + + + else + { + throw new ConfigurationException( + "classRetrieverType must be 'bcel', 'jarFile' or 'none'" ); + } + } + + /** + * contextualize as per Contextualizable interface + * @param context + */ + public void contextualize( final Context context ) throws ContextException + { + m_baseDirectory = ( File ) context.get("app.home"); + } + + /** + * Service as per Serviceable interface + * @param manager a service manager + * @throws ServiceException if a problem during servicing + * @phoenix:dependency name="org.apache.excalibur.altrmi.server.AltrmiAuthenticator" + */ + public void service( ServiceManager manager ) + throws ServiceException + { + m_altrmiAuthenticator = + (AltrmiAuthenticator)manager.lookup( AltrmiAuthenticator.class.getName() ); + } + + /** + * initialize as per Initializable interface + * @throws Exception + */ + public void initialize() throws Exception + { + m_abstractServer.setClassRetriever( m_classRetriever ); + m_abstractServer.setAuthenticator( m_altrmiAuthenticator ); + } + + /** + * + * @param implementation + * @param asName + * @param interfaceToExpose + * @throws PublicationException + */ + public void publish( Object implementation, String asName, Class interfaceToExpose ) + throws PublicationException + { + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation + + ", interf: "+ interfaceToExpose + "]" ); + + if( m_isDynamicPublisher ) + { + ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, interfaceToExpose, this.getClass().getClassLoader() ); + if( getLogger().isDebugEnabled() ) + { + getLogger().debug( "generated dynamic proxy for published interface " + asName ); + } + } + + m_abstractServer.publish( implementation, asName, interfaceToExpose ); + } + + /** + * Publish an service + * @param implementation + * @param asName + * @param publicationDescription + * @throws PublicationException + */ + public void publish( + Object implementation, String asName, PublicationDescription publicationDescription ) + throws PublicationException + { + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation + "]" ); + + if( m_isDynamicPublisher ) + { + ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, publicationDescription, this.getClass().getClassLoader() ); + if( getLogger().isDebugEnabled() ) + { + getLogger().debug( "generated dynamic proxy for published interface " + asName ); + } + } + + + + m_abstractServer.publish( implementation, asName, publicationDescription ); + } + + /** + * + * @param object + * @param asName + * @throws PublicationException + */ + public void unPublish( Object object, String asName ) throws PublicationException + { + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Unpublishing object [nane: " + asName + ", impl: " + object + "]" ); + + m_abstractServer.unPublish( object, asName ); + } + + /** + * + * @param object + * @param asName + * @param o1 + * @throws PublicationException + */ + public void replacePublished( Object object, String asName, Object o1 ) throws PublicationException + { + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Replacing published object [nane: " + asName + ", existing: " + object + ", new: " + o1 + "]" ); + + m_abstractServer.replacePublished( object, asName, o1 ); + } + + /** + * + * @throws Exception + */ + public void start() throws Exception + { + m_abstractServer.start(); + } + + /** + * + * @throws Exception + */ + public void stop() throws Exception + { + m_abstractServer.stop(); + } + + /** + * + * @param request + * @param publishedName + * @return + */ + public MethodInvocationHandler getMethodInvocationHandler( MethodRequest request, String publishedName ) + { + return m_abstractServer.getMethodInvocationHandler( request, publishedName ); + } + + /** + * + * @param publishedName + * @return + */ + public MethodInvocationHandler getMethodInvocationHandler(String publishedName) + { + return m_abstractServer.getMethodInvocationHandler( publishedName ); + } + + /** + * + * @return + */ + protected AbstractServer getAbstractServer() + { + return m_abstractServer; + } + + /** + * + * @param abstractServer + */ + protected void setAbstractServer( AbstractServer abstractServer ) + { + m_abstractServer = abstractServer; + } +} -- To unsubscribe, e-mail: For additional commands, e-mail: