Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceLifecycleManager.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceLifecycleManager.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceLifecycleManager.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceLifecycleManager.java Thu Dec 13 18:17:39 2018 @@ -79,6 +79,6 @@ public interface ServiceLifecycleManager * @param name the name of the service * @exception ServiceException the service was not found */ - void decommision( String name ) + void decommission( String name ) throws ServiceException; }
Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/crypto/CryptoStreamFactory.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/crypto/CryptoStreamFactory.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/crypto/CryptoStreamFactory.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/crypto/CryptoStreamFactory.java Thu Dec 13 18:17:39 2018 @@ -1,5 +1,7 @@ package org.apache.fulcrum.yaafi.framework.crypto; +import java.io.InputStream; + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -21,124 +23,103 @@ package org.apache.fulcrum.yaafi.framewo import org.apache.fulcrum.yaafi.framework.reflection.Clazz; -import java.io.InputStream; - /** * Factory class to get a decrypting input stream for reading configuration - * files. The implementation uses dynamic class loading to make decryption - * an optional feature which is highly desirable when avoiding the ECCN - * export code problems. + * files. The implementation uses dynamic class loading to make decryption an + * optional feature which is highly desirable when avoiding the ECCN export code + * problems. * * @author <a href="mailto:[email protected]">Siegfried Goeschl </a> */ -public class CryptoStreamFactory -{ - /** is the instance already initialized */ - private static boolean isInitialized; - - /** the factory to create encrypting input streams */ - private static Object cryptoStreamFactory; - - /** the name of the class to be loaded */ - private static String className = "org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl"; - - /** - * Create a (potentially) decrypting input stream using the default - * password. - * - * @param is the input stream to be decrypted - * @param isEncrypted the encryption mode (true|false|auto) - * @return a decrypting input stream - * @throws Exception reading the input stream failed - */ - public static InputStream getDecryptingInputStream( InputStream is, String isEncrypted ) - throws Exception - { - InputStream result; - - if( isEncrypted.equalsIgnoreCase("true") ) - { - // a decrypting input stream was requested - result = createDecryptingInputStream(is, "getInputStream"); - } - else if( isEncrypted.equalsIgnoreCase("auto") && hasCryptoStreamFactory()) - { - // no user-supplied preferences but crypto stream is available - result = createDecryptingInputStream(is, "getSmartInputStream"); - } - else if( isEncrypted.equalsIgnoreCase("auto") && !hasCryptoStreamFactory()) - { - // no user-supplied perferences so we fall back to normal input stream - result = is; - } - else if( isEncrypted.equalsIgnoreCase("false") ) - { - // just use normal input stream - result = is; - } - else - { - throw new IllegalArgumentException("Unknown decryption mode : " + isEncrypted); - } - - return result; - } - - /** - * Factory method to create a decrypting input stream. - * - * @param is the input stream to be decrypted - * @param factoryMethodName the name of the factory method - * @return a decrypting input stream - * @throws Exception creating the decrypting input stream failed - */ - private static InputStream createDecryptingInputStream( InputStream is, String factoryMethodName ) - throws Exception - { - Class[] signature = {InputStream.class}; - Object[] args = {is}; - Object cryptoStreamFactory = getCryptoStreamFactory(); - - if(cryptoStreamFactory == null) - { - throw new IllegalStateException("No CryptoStreamFactory available - unable to create a decrypting input stream"); - } - else - { - return (InputStream) Clazz.invoke(cryptoStreamFactory, factoryMethodName, signature, args); - } - } - - /** - * Factory method to create a CryptoStreamFactory. - */ - private synchronized static Object getCryptoStreamFactory() - throws Exception - { - if(!isInitialized) - { - isInitialized = true; - ClassLoader clazzLoader = CryptoStreamFactory.class.getClassLoader(); - - if(Clazz.hasClazz(clazzLoader, className)) - { - Class[] signature = {}; - Object[] args = {}; - Class<?> clazz = Clazz.getClazz(clazzLoader, className); - cryptoStreamFactory = Clazz.newInstance(clazz, signature, args); - } - } - - return cryptoStreamFactory; - } - - /** - * @return true if a CryptoStreamFactory is available - */ - private static boolean hasCryptoStreamFactory() - throws Exception - { - return ( getCryptoStreamFactory() != null ); - } +public class CryptoStreamFactory { + /** is the instance already initialized */ + private static boolean isInitialized; + + /** the factory to create encrypting input streams */ + private static Object cryptoStreamFactory; + + /** the name of the class to be loaded */ + private static String className = "org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl"; + + /** + * Create a (potentially) decrypting input stream using the default password. + * + * @param is the input stream to be decrypted + * @param isEncrypted the encryption mode (true|false|auto) + * @return a decrypting input stream + * @throws Exception reading the input stream failed + */ + public static InputStream getDecryptingInputStream(InputStream is, String isEncrypted) throws Exception { + InputStream result; + + if (isEncrypted.equalsIgnoreCase("true")) { + // a decrypting input stream was requested + result = createDecryptingInputStream(is, "getInputStream"); + } else if (isEncrypted.equalsIgnoreCase("auto") && hasCryptoStreamFactory()) { + // no user-supplied preferences but crypto stream is available + result = createDecryptingInputStream(is, "getSmartInputStream"); + } else if (isEncrypted.equalsIgnoreCase("auto") && !hasCryptoStreamFactory()) { + // no user-supplied perferences so we fall back to normal input stream + result = is; + } else if (isEncrypted.equalsIgnoreCase("false")) { + // just use normal input stream + result = is; + } else { + throw new IllegalArgumentException("Unknown decryption mode : " + isEncrypted); + } + + return result; + } + + /** + * Factory method to create a decrypting input stream. + * + * @param is the input stream to be decrypted + * @param factoryMethodName the name of the factory method + * @return a decrypting input stream + * @throws Exception creating the decrypting input stream failed + */ + private static InputStream createDecryptingInputStream(InputStream is, String factoryMethodName) throws Exception { + Class[] signature = { InputStream.class }; + Object[] args = { is }; + Object cryptoStreamFactory = getCryptoStreamFactory(); + + if (cryptoStreamFactory == null) { + throw new IllegalStateException( + "No CryptoStreamFactory available - unable to create a decrypting input stream"); + } else { + return (InputStream) Clazz.invoke(cryptoStreamFactory, factoryMethodName, signature, args); + } + } + + /** + * Factory method to create a CryptoStreamFactory. + * + * @return a CryptoStreamFactory + * @throws Exception generic exception + */ + private synchronized static Object getCryptoStreamFactory() throws Exception { + if (!isInitialized) { + isInitialized = true; + ClassLoader clazzLoader = CryptoStreamFactory.class.getClassLoader(); + + if (Clazz.hasClazz(clazzLoader, className)) { + Class[] signature = {}; + Object[] args = {}; + Class<?> clazz = Clazz.getClazz(clazzLoader, className); + cryptoStreamFactory = Clazz.newInstance(clazz, signature, args); + } + } + + return cryptoStreamFactory; + } + + /** + * @return true if a CryptoStreamFactory is available + * @throws Exception generic exception + */ + private static boolean hasCryptoStreamFactory() throws Exception { + return getCryptoStreamFactory() != null; + } } Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/factory/ServiceContainerConfiguration.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/factory/ServiceContainerConfiguration.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/factory/ServiceContainerConfiguration.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/factory/ServiceContainerConfiguration.java Thu Dec 13 18:17:39 2018 @@ -33,731 +33,642 @@ import org.apache.avalon.framework.conte import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.service.ServiceManager; +import org.apache.commons.lang3.StringUtils; import org.apache.fulcrum.yaafi.framework.constant.AvalonMerlinConstants; import org.apache.fulcrum.yaafi.framework.container.ServiceConstants; +import org.apache.fulcrum.yaafi.framework.crypto.CryptoStreamFactory; import org.apache.fulcrum.yaafi.framework.util.InputStreamLocator; import org.apache.fulcrum.yaafi.framework.util.Validate; -import org.apache.fulcrum.yaafi.framework.crypto.CryptoStreamFactory; /** - * Helper class to capture configuration related stuff. The are two ways - * for setting up the configuration: + * Helper class to capture configuration related stuff. The are two ways for + * setting up the configuration: * <ul> - * <li>set all parameters manually</li> - * <li>use a containerConfiguration file and provide the remaining settings</li> + * <li>set all parameters manually</li> + * <li>use a containerConfiguration file and provide the remaining settings</li> * </ul> * * The Avalon context and configuration are created by * <ul> - * <li>createFinalContext()</li> - * <li>createFinalConfiguration()</li> + * <li>createFinalContext()</li> + * <li>createFinalConfiguration()</li> * </ul> * - * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> + * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> */ -public class ServiceContainerConfiguration -{ - /** our default implementation class of the service container */ - private String serviceContainerClazzName; - - /** the location of the component role file */ - private String componentRolesLocation; - - /** is the component role file encrypted? */ - private String isComponentRolesEncrypted; - - /** the location of the component configuration file */ - private String componentConfigurationLocation; - - /** is the component configuration file encrypted? */ - private String isComponentConfigurationEncrypted; - - /** the location of the paramaters file */ - private String parametersLocation; - - /** is the parameters file encrypted? */ - private String isParametersEncrypted; - - /** the user-supplied Avalon context */ - private DefaultContext context; - - /** the Avalon logger */ - private Logger logger; - - /** the application directory */ - private String applicationRootDir; - - /** the temporary directory */ - private String tempRootDir; - - /** the class loader passed in the Avalon Context */ - private ClassLoader componentClassLoader; - - /** the type of container where YAAFI is embedded */ - private String containerFlavour; - - /** the caller-supplied container configuration */ - private Configuration containerConfiguration; - - /** to lookup service in the parent container */ - private ServiceManager parentServiceManager; - - /** a list of ServiceManager maintaining their own services */ - private String[] serviceManagerList; - - /** Constructor */ - public ServiceContainerConfiguration() - { - this(ConsoleLogger.LEVEL_DEBUG); - } - - /** - * Constructor. - * - * @param logLevel the log level for the console logger. - */ - public ServiceContainerConfiguration(int logLevel) - { - this.logger = new ConsoleLogger(logLevel); - this.containerFlavour = ServiceConstants.AVALON_CONTAINER_YAAFI; - this.serviceContainerClazzName = ServiceConstants.CLAZZ_NAME; - this.componentRolesLocation = ServiceConstants.COMPONENT_ROLE_VALUE; - this.isComponentRolesEncrypted = "false"; - this.componentConfigurationLocation = ServiceConstants.COMPONENT_CONFIG_VALUE; - this.isComponentConfigurationEncrypted = "false"; - this.parametersLocation = ServiceConstants.COMPONENT_PARAMETERS_VALUE; - this.isParametersEncrypted = "false"; - this.context = new DefaultContext(); - this.applicationRootDir = new File("").getAbsolutePath(); - this.tempRootDir = System.getProperty("java.io.tmpdir","."); - this.componentClassLoader = this.getClass().getClassLoader(); - } - - /** - * Add a new entry to the context by creating a new one. - * @param name the name of the new entry - * @param value the value of the new entry - */ - public void addToContext( String name, Object value ) - { - Validate.notEmpty(name,"name"); - Validate.notNull(value,"value"); - this.getContext().put( name, value ); - } - - /** - * Add a hashtable to the context - * @param hashtable the Hashtable to be added - */ - public void addToContext( Hashtable<?, ?> hashtable ) - { - Validate.notNull(hashtable,"hashtable"); - - String name = null; - Object value = null; - Enumeration<?> keys = hashtable.keys(); - - while( keys.hasMoreElements() ) - { - name = (String) keys.nextElement(); - value = hashtable.get( name ); - this.addToContext( name, value ); - } - } - - /** - * Create the final Avalon context passed to YAAFI containing - * <ul> - * <li>user-supplied context</li> - * <li>urn:avalon:home</li> - * <li>urn:avalon:temp</li> - * <li>urn:avalon:name</li> - * <li>urn:avalon:partition</li> - * <li>urn:avalon:classloader</li> - * </ul> - * - * @return the final Context - */ - - public Context createFinalContext() - { - // 1) add the application root dir - - this.addToContext( - AvalonMerlinConstants.URN_AVALON_HOME, - this.getApplicationRootDir() - ); - - // 2) add the temp root dir - - this.addToContext( - AvalonMerlinConstants.URN_AVALON_TEMP, - this.getTempRootDir() - ); - - // 3) add the Avalon name - - this.addToContext( - AvalonMerlinConstants.URN_AVALON_NAME, - ServiceConstants.ROLE_NAME - ); - - // 4) add the Avalon partition name - - this.addToContext( - AvalonMerlinConstants.URN_AVALON_PARTITION, - "root" - ); - - // 5) add the class loader - - this.addToContext( - AvalonMerlinConstants.URN_AVALON_CLASSLOADER, - this.getComponentClassLoader() - ); - - return this.getContext(); - } - - /** - * Create a final configuration. - * - * @return the configuration - */ - public Configuration createFinalConfiguration() - { - DefaultConfiguration result = null; - - if( this.getContainerConfiguration() != null ) - { - return this.getContainerConfiguration(); - } - else - { - // the root element is "fulcrum-yaafi" - - result = new DefaultConfiguration( - ServiceConstants.ROLE_NAME - ); - - // add the following fragement - // - // <containerFlavour>merlin</containerFlavour> - - DefaultConfiguration containerFlavourConfig = new DefaultConfiguration( - ServiceConstants.CONTAINERFLAVOUR_CONFIG_KEY - ); - - containerFlavourConfig.setValue( this.getContainerFlavour() ); - - result.addChild( containerFlavourConfig ); - - // add the following fragement - // - // <containerClazzName>...</containerClazzName> - - DefaultConfiguration containerClazzNameConfig = new DefaultConfiguration( - ServiceConstants.CONTAINERCLAZZNAME_CONFIG_KEY - ); - - containerClazzNameConfig.setValue( this.getServiceContainerClazzName() ); - - result.addChild( containerClazzNameConfig ); - - - // add the following fragement - // - // <componentRoles> - // <location>../conf/componentRoles.xml</location> - // <isEncrypted>true</isEncrypted> - // </componentRoles> - - DefaultConfiguration componentRolesConfig = new DefaultConfiguration( - ServiceConstants.COMPONENT_ROLE_KEYS - ); - - DefaultConfiguration componentRolesLocation = new DefaultConfiguration( - ServiceConstants.COMPONENT_LOCATION_KEY - ); - - componentRolesLocation.setValue( - this.getComponentRolesLocation() - ); - - DefaultConfiguration componentRolesIsEncrypted = new DefaultConfiguration( - ServiceConstants.COMPONENT_ISENCRYPTED_KEY - ); - - componentRolesIsEncrypted.setValue( - this.isComponentRolesEncrypted() - ); - - componentRolesConfig.addChild( componentRolesLocation ); - componentRolesConfig.addChild( componentRolesIsEncrypted ); - - result.addChild( componentRolesConfig ); - - // add the following fragement - // - // <componentConfiguration> - // <location>../conf/componentRoles.xml</location> - // <isEncrypted>true</isEncrypted> - // </componentConfiguration> - - DefaultConfiguration componentConfigurationConfig = new DefaultConfiguration( - ServiceConstants.COMPONENT_CONFIG_KEY - ); - - DefaultConfiguration componentConfigurationLocation = new DefaultConfiguration( - ServiceConstants.COMPONENT_LOCATION_KEY - ); - - componentConfigurationLocation.setValue( - this.getComponentConfigurationLocation() - ); - - DefaultConfiguration componentConfigurationIsEncrypted = new DefaultConfiguration( - ServiceConstants.COMPONENT_ISENCRYPTED_KEY - ); - - componentConfigurationIsEncrypted.setValue( - this.isComponentConfigurationEncrypted() - ); - - componentConfigurationConfig.addChild( componentConfigurationLocation ); - componentConfigurationConfig.addChild( componentConfigurationIsEncrypted ); - - result.addChild( componentConfigurationConfig ); - - // Add the following fragement - // - // <parameters> - // <location>../conf/parameters.properties</location> - // <isEncrypted>true</isEncrypted> - // </parameters> - - DefaultConfiguration parameterConfigurationConfig = new DefaultConfiguration( - ServiceConstants.COMPONENT_PARAMETERS_KEY - ); - - DefaultConfiguration parameterConfigurationLocation = new DefaultConfiguration( - ServiceConstants.COMPONENT_LOCATION_KEY - ); - - parameterConfigurationLocation.setValue( - this.getParametersLocation() - ); - - DefaultConfiguration parameterConfigurationIsEncrypted = new DefaultConfiguration( - ServiceConstants.COMPONENT_ISENCRYPTED_KEY - ); - - parameterConfigurationIsEncrypted.setValue( - this.isParametersEncrypted() - ); - - parameterConfigurationConfig.addChild( parameterConfigurationLocation ); - parameterConfigurationConfig.addChild( parameterConfigurationIsEncrypted ); - - result.addChild( parameterConfigurationConfig ); - - // Add the following fragement - // - // <serviceManagers> - // <serviceManagers>springFrameworkService</serviceManager> - // </serviceManagers> - - if(this.hasServiceManagerList()) - { - DefaultConfiguration serviceManagerListConfig = new DefaultConfiguration( - ServiceConstants.SERVICEMANAGER_LIST_KEY - ); - - for(int i=0; i<this.serviceManagerList.length; i++) - { - DefaultConfiguration serviceManagerConfig = new DefaultConfiguration( - ServiceConstants.SERVICEMANAGER_KEY - ); - - serviceManagerConfig.setValue(this.serviceManagerList[i]); - - serviceManagerListConfig.addChild(serviceManagerConfig); - } - - result.addChild( serviceManagerListConfig ); - } - - - return result; - } - } - - ///////////////////////////////////////////////////////////////////////// - // Generated Getters/Setters - ///////////////////////////////////////////////////////////////////////// - - /** - * @return Returns the serviceContainerClazzName. - */ - private String getServiceContainerClazzName() - { - return this.serviceContainerClazzName; - } - - /** - * @return Returns the componentConfigurationLocation. - */ - private String getComponentConfigurationLocation() - { - return componentConfigurationLocation; - } - - /** - * @param componentConfigurationLocation The componentConfigurationLocation to set. - */ - public void setComponentConfigurationLocation( - String componentConfigurationLocation) - { - Validate.notNull(componentConfigurationLocation,"componentConfigurationLocation"); - this.componentConfigurationLocation = componentConfigurationLocation; - } - - /** - * @return Returns the componentRolesLocation. - */ - private String getComponentRolesLocation() - { - return componentRolesLocation; - } - - /** - * @param componentRolesLocation The componentRolesLocation to set. - */ - public void setComponentRolesLocation(String componentRolesLocation) - { - this.componentRolesLocation = componentRolesLocation; - } - - /** - * @return Returns the context. - */ - private DefaultContext getContext() - { - return context; - } - - /** - * @param context The context to set. - */ - public void setContext(Context context) - { - if( context instanceof DefaultContext ) - { - this.context = (DefaultContext) context; - } - else - { - this.context = new DefaultContext( context ); - } - } - - /** - * @return Returns the isComponentConfigurationEncrypted. - */ - private String isComponentConfigurationEncrypted() - { - return isComponentConfigurationEncrypted; - } - - /** - * @param isComponentConfigurationEncrypted The isComponentConfigurationEncrypted to set. - */ - public void setComponentConfigurationEncrypted( - String isComponentConfigurationEncrypted) - { - this.isComponentConfigurationEncrypted = isComponentConfigurationEncrypted; - } - - /** - * @return Returns the isComponentRolesEncrypted. - */ - private String isComponentRolesEncrypted() - { - return isComponentRolesEncrypted; - } - /** - * @param isComponentRolesEncrypted The isComponentRolesEncrypted to set. - */ - public void setComponentRolesEncrypted(String isComponentRolesEncrypted) - { - this.isComponentRolesEncrypted = isComponentRolesEncrypted; - } - - /** - * @return Returns the isParametersEncrypted. - */ - private String isParametersEncrypted() - { - return isParametersEncrypted; - } - - /** - * @param isParametersEncrypted The isParametersEncrypted to set. - */ - public void setParametersEncrypted(String isParametersEncrypted) - { - Validate.notEmpty(isParametersEncrypted,"isParametersEncrypted"); - this.isParametersEncrypted = isParametersEncrypted; - } - - /** - * @return Returns the logger. - */ - public Logger getLogger() - { - return logger; - } - - /** - * @param logger The logger to set. - */ - public void setLogger(Logger logger) - { - this.logger = logger; - } - - /** - * @return Returns the parametersLocation. - */ - private String getParametersLocation() - { - return parametersLocation; - } - - /** - * @param parametersLocation The parametersLocation to set. - */ - public void setParametersLocation(String parametersLocation) - { - this.parametersLocation = parametersLocation; - } - - /** - * @return Returns the applicationRootDir. - */ - private File getApplicationRootDir() - { - return new File(applicationRootDir); - } - - /** - * @param applicationRootDir The applicationRootDir to set. - */ - public void setApplicationRootDir(String applicationRootDir) - { - Validate.notNull(applicationRootDir, "applicationRootDir"); - - if( applicationRootDir.equals(".") ) - { - this.applicationRootDir = new File("").getAbsolutePath(); - } - else - { - this.applicationRootDir = new File( applicationRootDir ).getAbsolutePath(); - } - } - - /** - * @return Returns the tempRootDir. - */ - private File getTempRootDir() - { - return makeAbsoluteFile(this.getApplicationRootDir(),this.tempRootDir); - } - - /** - * @param tempRootDir The tempRootDir to set. - */ - public void setTempRootDir(String tempRootDir) - { - Validate.notNull(tempRootDir, "tempRootDir"); - this.tempRootDir = tempRootDir; - } - - /** - * @return Returns the classLoader. - */ - private ClassLoader getComponentClassLoader() - { - return componentClassLoader; - } - - /** - * @param componentClassLoader The classLoader to set. - */ - public void setComponentClassLoader(ClassLoader componentClassLoader) - { - Validate.notNull(componentClassLoader, "componentClassLoader"); - this.componentClassLoader = componentClassLoader; - } - - /** - * @return Returns the containerFlavour. - */ - private String getContainerFlavour() - { - return containerFlavour; - } - /** - * @param containerFlavour The containerFlavour to set. - */ - public void setContainerFlavour(String containerFlavour) - { - this.containerFlavour = containerFlavour; - } - - /** - * @return Returns the containerConfiguration. - */ - private Configuration getContainerConfiguration() - { - return containerConfiguration; - } - - /** - * @param containerConfiguration The containerConfiguration to set. - */ - public void setContainerConfiguration(Configuration containerConfiguration) - { - this.containerConfiguration = containerConfiguration; - } - - /** - * Get the parent service manager to find service managed by the - * parent container. - * - * @return the parent container - */ - - public ServiceManager getParentServiceManager() { - return parentServiceManager; - } - - /** - * Set the parent service manager to find service managed by the - * parent container. - * - * @param parentServiceManager the parent container - */ - public void setParentServiceManager(ServiceManager parentServiceManager) { - this.parentServiceManager = parentServiceManager; - } - - /** - * Get a list of service manager managing their own set of services. - * - * @return a list of service implementing the ServiceManager interface - */ - public String[] getServiceManagerList() { - return serviceManagerList; - } - - /** - * Set a list of service manager managing their own set of services. - * - * @param serviceManagerList a list of service implementing the ServiceManager interface - */ - public void setServiceManagerList(String[] serviceManagerList) { - this.serviceManagerList = serviceManagerList; - } - - /** - * @return is a list of service manager managing their own set of services defined - */ - public boolean hasServiceManagerList() - { - return ((this.serviceManagerList != null) && (this.serviceManagerList.length > 0)); - } - - /** - * Loads a containerConfiguration file and set is as the Avalon - * configuration to be used for Configurable.configure(). Take - * care that the implementation uses an InputStreamLocator to - * find the containerConfiguration which uses the previously - * set application root directory. - * - * @param location the location of the containerConfiguration - * @throws IOException loading the configuration failed - */ - public void loadContainerConfiguration( String location ) - throws IOException - { - this.loadContainerConfiguration( location, "false" ); - } - - /** - * Loads a containerConfiguration file and set is as the Avalon - * configuration to be used for Configurable.configure(). Take - * care that the implementation uses an InputStreamLocator to - * find the containerConfiguration which uses the previously - * set application root directory. - * - * @param location the location of the containerConfiguration - * @param isEncrypted is the file encrypted - * @throws IOException loading the configuration failed - */ - public void loadContainerConfiguration( String location, String isEncrypted ) - throws IOException - { - Configuration result = null; - - InputStreamLocator locator = new InputStreamLocator( - this.getApplicationRootDir(), - this.getLogger() - ); - - DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); - InputStream is = locator.locate( location ); - - if( is != null ) - { - try - { - is = CryptoStreamFactory.getDecryptingInputStream(is ,isEncrypted); - result = builder.build( is ); - this.setContainerConfiguration( result ); - } - catch ( Exception e ) - { - String msg = "Unable to parse the following file : " + location; - this.getLogger().error( msg , e ); - throw new IOException(msg); - } - } - else - { - String msg = "Unable to locate the containerConfiguration file : " + location; - this.getLogger().error(msg); - throw new IOException(msg); - } - } - - /** - * Determines the absolute file. - * @param baseDir the base directory - * @param fileName the filename - * @return the absolute path - */ - private static File makeAbsoluteFile( File baseDir, String fileName ) - { - File result = new File(fileName); - - if(!result.isAbsolute()) - { - result = new File( baseDir, fileName ); - } - - return result; - } +public class ServiceContainerConfiguration { + /** our default implementation class of the service container */ + private String serviceContainerClazzName; + + /** the location of the component role file */ + private String componentRolesLocation; + + /** is the component role file encrypted? */ + private String isComponentRolesEncrypted; + + /** the location of the component configuration file */ + private String componentConfigurationLocation; + + /** is the component configuration file encrypted? */ + private String isComponentConfigurationEncrypted; + + /** the location of the paramaters file */ + private String parametersLocation; + + /** is the parameters file encrypted? */ + private String isParametersEncrypted; + + /** the user-supplied Avalon context */ + private DefaultContext context; + + /** the Avalon logger */ + private Logger logger; + + /** the application directory */ + private String applicationRootDir; + + /** the temporary directory */ + private String tempRootDir; + + /** the class loader passed in the Avalon Context */ + private ClassLoader componentClassLoader; + + /** the type of container where YAAFI is embedded */ + private String containerFlavour; + + /** the caller-supplied container configuration */ + private Configuration containerConfiguration; + + /** to lookup service in the parent container */ + private ServiceManager parentServiceManager; + + /** a list of ServiceManager maintaining their own services */ + private String[] serviceManagerList; + + /** Constructor */ + public ServiceContainerConfiguration() { + this(ConsoleLogger.LEVEL_DEBUG); + } + + /** + * Constructor. + * + * @param logLevel the log level for the console logger. + */ + public ServiceContainerConfiguration(int logLevel) { + this.logger = new ConsoleLogger(logLevel); + this.containerFlavour = ServiceConstants.AVALON_CONTAINER_YAAFI; + this.serviceContainerClazzName = ServiceConstants.CLAZZ_NAME; + this.componentRolesLocation = ServiceConstants.COMPONENT_ROLE_VALUE; + this.isComponentRolesEncrypted = "false"; + this.componentConfigurationLocation = ServiceConstants.COMPONENT_CONFIG_VALUE; + this.isComponentConfigurationEncrypted = "false"; + this.parametersLocation = ServiceConstants.COMPONENT_PARAMETERS_VALUE; + this.isParametersEncrypted = "false"; + this.context = new DefaultContext(); + this.applicationRootDir = new File("").getAbsolutePath(); + this.tempRootDir = System.getProperty("java.io.tmpdir", "."); + this.componentClassLoader = this.getClass().getClassLoader(); + } + + /** + * Add a new entry to the context by creating a new one. + * + * @param name the name of the new entry + * @param value the value of the new entry + */ + public void addToContext(String name, Object value) { + Validate.notEmpty(name, "name"); + Validate.notNull(value, "value"); + this.getContext().put(name, value); + } + + /** + * Add a hashtable to the context + * + * @param hashtable the Hashtable to be added + */ + public void addToContext(Hashtable<?, ?> hashtable) { + Validate.notNull(hashtable, "hashtable"); + + String name = null; + Object value = null; + Enumeration<?> keys = hashtable.keys(); + + while (keys.hasMoreElements()) { + name = (String) keys.nextElement(); + value = hashtable.get(name); + this.addToContext(name, value); + } + } + + /** + * Create the final Avalon context passed to YAAFI containing + * <ul> + * <li>user-supplied context</li> + * <li>urn:avalon:home</li> + * <li>urn:avalon:temp</li> + * <li>urn:avalon:name</li> + * <li>urn:avalon:partition</li> + * <li>urn:avalon:classloader</li> + * </ul> + * + * @return the final Context + * @throws Exception if filename not defined + * @throws IOException if file not found + */ + + public Context createFinalContext() throws IOException, Exception { + // 1) add the application root dir + + this.addToContext(AvalonMerlinConstants.URN_AVALON_HOME, this.getApplicationRootDir()); + + // 2) add the temp root dir + + this.addToContext(AvalonMerlinConstants.URN_AVALON_TEMP, this.getTempRootDir()); + + // 3) add the Avalon name + + this.addToContext(AvalonMerlinConstants.URN_AVALON_NAME, ServiceConstants.ROLE_NAME); + + // 4) add the Avalon partition name + + this.addToContext(AvalonMerlinConstants.URN_AVALON_PARTITION, "root"); + + // 5) add the class loader + + this.addToContext(AvalonMerlinConstants.URN_AVALON_CLASSLOADER, this.getComponentClassLoader()); + + return this.getContext(); + } + + /** + * Create a final configuration. + * + * @return the configuration + */ + public Configuration createFinalConfiguration() { + DefaultConfiguration result = null; + + if (this.getContainerConfiguration() != null) { + return this.getContainerConfiguration(); + } else { + // the root element is "fulcrum-yaafi" + + result = new DefaultConfiguration(ServiceConstants.ROLE_NAME); + + // add the following fragement + // + // <containerFlavour>merlin</containerFlavour> + + DefaultConfiguration containerFlavourConfig = new DefaultConfiguration( + ServiceConstants.CONTAINERFLAVOUR_CONFIG_KEY); + + containerFlavourConfig.setValue(this.getContainerFlavour()); + + result.addChild(containerFlavourConfig); + + // add the following fragement + // + // <containerClazzName>...</containerClazzName> + + DefaultConfiguration containerClazzNameConfig = new DefaultConfiguration( + ServiceConstants.CONTAINERCLAZZNAME_CONFIG_KEY); + + containerClazzNameConfig.setValue(this.getServiceContainerClazzName()); + + result.addChild(containerClazzNameConfig); + + // add the following fragement + // + // <componentRoles> + // <location>../conf/componentRoles.xml</location> + // <isEncrypted>true</isEncrypted> + // </componentRoles> + + DefaultConfiguration componentRolesConfig = new DefaultConfiguration(ServiceConstants.COMPONENT_ROLE_KEYS); + + DefaultConfiguration componentRolesLocation = new DefaultConfiguration( + ServiceConstants.COMPONENT_LOCATION_KEY); + + componentRolesLocation.setValue(this.getComponentRolesLocation()); + + DefaultConfiguration componentRolesIsEncrypted = new DefaultConfiguration( + ServiceConstants.COMPONENT_ISENCRYPTED_KEY); + + componentRolesIsEncrypted.setValue(this.isComponentRolesEncrypted()); + + componentRolesConfig.addChild(componentRolesLocation); + componentRolesConfig.addChild(componentRolesIsEncrypted); + + result.addChild(componentRolesConfig); + + // add the following fragement + // + // <componentConfiguration> + // <location>../conf/componentRoles.xml</location> + // <isEncrypted>true</isEncrypted> + // </componentConfiguration> + + DefaultConfiguration componentConfigurationConfig = new DefaultConfiguration( + ServiceConstants.COMPONENT_CONFIG_KEY); + + DefaultConfiguration componentConfigurationLocation = new DefaultConfiguration( + ServiceConstants.COMPONENT_LOCATION_KEY); + + componentConfigurationLocation.setValue(this.getComponentConfigurationLocation()); + + DefaultConfiguration componentConfigurationIsEncrypted = new DefaultConfiguration( + ServiceConstants.COMPONENT_ISENCRYPTED_KEY); + + componentConfigurationIsEncrypted.setValue(this.isComponentConfigurationEncrypted()); + + componentConfigurationConfig.addChild(componentConfigurationLocation); + componentConfigurationConfig.addChild(componentConfigurationIsEncrypted); + + result.addChild(componentConfigurationConfig); + + // Add the following fragement + // + // <parameters> + // <location>../conf/parameters.properties</location> + // <isEncrypted>true</isEncrypted> + // </parameters> + + DefaultConfiguration parameterConfigurationConfig = new DefaultConfiguration( + ServiceConstants.COMPONENT_PARAMETERS_KEY); + + DefaultConfiguration parameterConfigurationLocation = new DefaultConfiguration( + ServiceConstants.COMPONENT_LOCATION_KEY); + + parameterConfigurationLocation.setValue(this.getParametersLocation()); + + DefaultConfiguration parameterConfigurationIsEncrypted = new DefaultConfiguration( + ServiceConstants.COMPONENT_ISENCRYPTED_KEY); + + parameterConfigurationIsEncrypted.setValue(this.isParametersEncrypted()); + + parameterConfigurationConfig.addChild(parameterConfigurationLocation); + parameterConfigurationConfig.addChild(parameterConfigurationIsEncrypted); + + result.addChild(parameterConfigurationConfig); + + // Add the following fragement + // + // <serviceManagers> + // <serviceManagers>springFrameworkService</serviceManager> + // </serviceManagers> + + if (this.hasServiceManagerList()) { + DefaultConfiguration serviceManagerListConfig = new DefaultConfiguration( + ServiceConstants.SERVICEMANAGER_LIST_KEY); + + for (int i = 0; i < this.serviceManagerList.length; i++) { + DefaultConfiguration serviceManagerConfig = new DefaultConfiguration( + ServiceConstants.SERVICEMANAGER_KEY); + + serviceManagerConfig.setValue(this.serviceManagerList[i]); + + serviceManagerListConfig.addChild(serviceManagerConfig); + } + + result.addChild(serviceManagerListConfig); + } + + return result; + } + } + + ///////////////////////////////////////////////////////////////////////// + // Generated Getters/Setters + ///////////////////////////////////////////////////////////////////////// + + /** + * @return Returns the serviceContainerClazzName. + */ + private String getServiceContainerClazzName() { + return this.serviceContainerClazzName; + } + + /** + * @return Returns the componentConfigurationLocation. + */ + private String getComponentConfigurationLocation() { + return componentConfigurationLocation; + } + + /** + * @param componentConfigurationLocation The componentConfigurationLocation to + * set. + */ + public void setComponentConfigurationLocation(String componentConfigurationLocation) { + Validate.notNull(componentConfigurationLocation, "componentConfigurationLocation"); + this.componentConfigurationLocation = componentConfigurationLocation; + } + + /** + * @return Returns the componentRolesLocation. + */ + private String getComponentRolesLocation() { + return componentRolesLocation; + } + + /** + * @param componentRolesLocation The componentRolesLocation to set. + */ + public void setComponentRolesLocation(String componentRolesLocation) { + this.componentRolesLocation = componentRolesLocation; + } + + /** + * @return Returns the context. + */ + private DefaultContext getContext() { + return context; + } + + /** + * @param context The context to set. + */ + public void setContext(Context context) { + if (context instanceof DefaultContext) { + this.context = (DefaultContext) context; + } else { + this.context = new DefaultContext(context); + } + } + + /** + * @return Returns the isComponentConfigurationEncrypted. + */ + private String isComponentConfigurationEncrypted() { + return isComponentConfigurationEncrypted; + } + + /** + * @param isComponentConfigurationEncrypted The + * isComponentConfigurationEncrypted to + * set. + */ + public void setComponentConfigurationEncrypted(String isComponentConfigurationEncrypted) { + this.isComponentConfigurationEncrypted = isComponentConfigurationEncrypted; + } + + /** + * @return Returns the isComponentRolesEncrypted. + */ + private String isComponentRolesEncrypted() { + return isComponentRolesEncrypted; + } + + /** + * @param isComponentRolesEncrypted The isComponentRolesEncrypted to set. + */ + public void setComponentRolesEncrypted(String isComponentRolesEncrypted) { + this.isComponentRolesEncrypted = isComponentRolesEncrypted; + } + + /** + * @return Returns the isParametersEncrypted. + */ + private String isParametersEncrypted() { + return isParametersEncrypted; + } + + /** + * @param isParametersEncrypted The isParametersEncrypted to set. + */ + public void setParametersEncrypted(String isParametersEncrypted) { + Validate.notEmpty(isParametersEncrypted, "isParametersEncrypted"); + this.isParametersEncrypted = isParametersEncrypted; + } + + /** + * @return Returns the logger. + */ + public Logger getLogger() { + return logger; + } + + /** + * @param logger The logger to set. + */ + public void setLogger(Logger logger) { + this.logger = logger; + } + + /** + * @return Returns the parametersLocation. + */ + private String getParametersLocation() { + return parametersLocation; + } + + /** + * @param parametersLocation The parametersLocation to set. + */ + public void setParametersLocation(String parametersLocation) { + this.parametersLocation = parametersLocation; + } + + /** + * @return Returns the applicationRootDir. + */ + private File getApplicationRootDir() { + return new File(applicationRootDir); + } + + /** + * @param applicationRootDir The applicationRootDir to set. + */ + public void setApplicationRootDir(String applicationRootDir) { + Validate.notNull(applicationRootDir, "applicationRootDir"); + + if (applicationRootDir.equals(".")) { + this.applicationRootDir = new File("").getAbsolutePath(); + } else { + this.applicationRootDir = new File(applicationRootDir).getAbsolutePath(); + } + } + + /** + * @return Returns the tempRootDir. + * @throws Exception + * @throws IOException + */ + private File getTempRootDir() throws IOException, Exception { + return makeAbsoluteFile(this.getApplicationRootDir(), this.tempRootDir); + } + + /** + * @param tempRootDir The tempRootDir to set. + */ + public void setTempRootDir(String tempRootDir) { + Validate.notNull(tempRootDir, "tempRootDir"); + this.tempRootDir = tempRootDir; + } + + /** + * @return Returns the classLoader. + */ + private ClassLoader getComponentClassLoader() { + return componentClassLoader; + } + + /** + * @param componentClassLoader The classLoader to set. + */ + public void setComponentClassLoader(ClassLoader componentClassLoader) { + Validate.notNull(componentClassLoader, "componentClassLoader"); + this.componentClassLoader = componentClassLoader; + } + + /** + * @return Returns the containerFlavour. + */ + private String getContainerFlavour() { + return containerFlavour; + } + + /** + * @param containerFlavour The containerFlavour to set. + */ + public void setContainerFlavour(String containerFlavour) { + this.containerFlavour = containerFlavour; + } + + /** + * @return Returns the containerConfiguration. + */ + private Configuration getContainerConfiguration() { + return containerConfiguration; + } + + /** + * @param containerConfiguration The containerConfiguration to set. + */ + public void setContainerConfiguration(Configuration containerConfiguration) { + this.containerConfiguration = containerConfiguration; + } + + /** + * Get the parent service manager to find service managed by the parent + * container. + * + * @return the parent container + */ + + public ServiceManager getParentServiceManager() { + return parentServiceManager; + } + + /** + * Set the parent service manager to find service managed by the parent + * container. + * + * @param parentServiceManager the parent container + */ + public void setParentServiceManager(ServiceManager parentServiceManager) { + this.parentServiceManager = parentServiceManager; + } + + /** + * Get a list of service manager managing their own set of services. + * + * @return a list of service implementing the ServiceManager interface + */ + public String[] getServiceManagerList() { + return serviceManagerList; + } + + /** + * Set a list of service manager managing their own set of services. + * + * @param serviceManagerList a list of service implementing the ServiceManager + * interface + */ + public void setServiceManagerList(String[] serviceManagerList) { + this.serviceManagerList = serviceManagerList; + } + + /** + * @return true if there is a service manager defined + */ + public boolean hasServiceManagerList() { + if (this.serviceManagerList != null && this.serviceManagerList.length > 0) + return true; + return false; + } + + /** + * Loads a containerConfiguration file and set is as the Avalon configuration to + * be used for Configurable.configure(). Take care that the implementation uses + * an InputStreamLocator to find the containerConfiguration which uses the + * previously set application root directory. + * + * @param location the location of the containerConfiguration + * @throws IOException loading the configuration failed + */ + public void loadContainerConfiguration(String location) throws IOException { + this.loadContainerConfiguration(location, "false"); + } + + /** + * Loads a containerConfiguration file and set is as the Avalon configuration to + * be used for Configurable.configure(). Take care that the implementation uses + * an InputStreamLocator to find the containerConfiguration which uses the + * previously set application root directory. + * + * @param location the location of the containerConfiguration + * @param isEncrypted is the file encrypted + * @throws IOException loading the configuration failed + */ + public void loadContainerConfiguration(String location, String isEncrypted) throws IOException { + Configuration result = null; + + InputStreamLocator locator = new InputStreamLocator(this.getApplicationRootDir(), this.getLogger()); + + DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); + InputStream is = locator.locate(location); + + if (is != null) { + try { + is = CryptoStreamFactory.getDecryptingInputStream(is, isEncrypted); + result = builder.build(is); + this.setContainerConfiguration(result); + } catch (Exception e) { + String msg = "Unable to parse the following file : " + location; + this.getLogger().error(msg, e); + throw new IOException(msg); + } + } else { + String msg = "Unable to locate the containerConfiguration file : " + location; + this.getLogger().error(msg); + throw new IOException(msg); + } + } + + /** + * Determines the absolute file. + * + * @param baseDir the base directory + * @param fileName the filename + * @return the absolute path + */ + private static File makeAbsoluteFile(File baseDir, String fileName) throws IOException, Exception { + if (baseDir.exists()) { + if (!StringUtils.isEmpty(fileName)) { + File result = new File(fileName); + if (!result.isAbsolute()) { + result = new File(baseDir, fileName); + } + return result; + } else { + throw new Exception("No filename specified"); + } + } else { + throw new IOException("The directory does not exist"); + } + } } Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java Thu Dec 13 18:17:39 2018 @@ -45,7 +45,7 @@ public class ConfigurationUtil */ public static void expand(Logger logger, DefaultConfiguration defaultConfiguration, Map<?, ?> vars) throws ConfigurationException { - if((vars == null) || (vars.size() == 0)) + if( vars == null || vars.size() == 0) { return; } Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/InputStreamLocator.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/InputStreamLocator.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/InputStreamLocator.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/InputStreamLocator.java Thu Dec 13 18:17:39 2018 @@ -33,147 +33,120 @@ import org.apache.avalon.framework.logge * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> */ -public class InputStreamLocator -{ - /** the root directory of our search */ - private File rootDir; - - /** the logger to be used */ - private Logger logger; - - /** - * Constructor - */ - public InputStreamLocator() - { - this.rootDir = new File( new File("").getAbsolutePath() ); - this.logger = new NullLogger(); - } - - /** - * Constructor - * - * @param rootDir the root directory to start the search */ - public InputStreamLocator( File rootDir ) - { - this( rootDir, new NullLogger() ); - } - - /** - * Constructor - * - * @param rootDir the root directory to start the search - * @param logger the logger to be used - */ - public InputStreamLocator( File rootDir, Logger logger ) - { - this.rootDir = rootDir; - this.logger = logger; - } - - /** - * Locate the file with the given position using the following steps - * - * @param location the location of the source to be loaded - * @return input stream of the source - * @throws IOException if source is not found - */ - public InputStream locate( String location ) throws IOException - { - if( ( location == null ) || ( location.length() == 0 ) ) - { - return null; - } - - String baseName = null; - File file = null; - InputStream is = null; - - // try to load a relative location with the given root dir - // e.g. "componentRoles.xml" located in the current working directory - - if( is == null ) - { - file = new File( this.rootDir, location ); - - this.getLogger().debug("Looking for " + location + " in the root directory"); - - if( file.exists() ) - { - is = new FileInputStream( file ); - this.getLogger().debug("Found " + location + " as " + file.getAbsolutePath() ); - } - } - - // try to load an absolute location as file - // e.g. "/foo/componentRoles.xml" from the root of the file system - - if( is == null ) - { - file = new File( location ); - - this.getLogger().debug("Looking for " + location + " as absolute file location"); - - if( file.isAbsolute() && file.exists() ) - { - is = new FileInputStream( file ); - this.getLogger().debug("Found " + location + " as " + file.getAbsolutePath() ); - } - } - - // try to load an absolute location through the classpath - // e.g. "/componentRoles.xml" located in the classpath - - if( ( is == null ) && ( location.startsWith( "/" ) == true ) ) - { - this.getLogger().debug("Looking for " + location + " using the class loader"); - is = getClass().getResourceAsStream( location ); - - if( is != null ) - { - this.getLogger().debug("Successfully located " + location); - } - } - - // try to load the last part of the file name using the classloader - // e.g. "conf/componentRoles.xml" as "/componentRoles.xml" located in - // the classpath. - - if( ( is == null ) && ( location.startsWith( "/" ) == false ) ) - { - baseName = '/' + new File(location).getName(); - this.getLogger().debug("Looking for " + baseName + " using the class loader"); - is = getClass().getResourceAsStream( baseName ); - - if( is != null ) - { - this.getLogger().debug("Successfully located " + baseName); - } - } - - if( is == null ) - { - this.getLogger().info("Unable to find any resource with the name '" + location + "'"); - } - - return is; - } - - /** - * @return Returns the logger. - */ - protected Logger getLogger() - { - return logger; - } - - /** - * @return Returns the rootDir. - */ - protected File getRootDir() - { - return rootDir; - } - +public class InputStreamLocator { + + /** the root directory of our search */ + private File rootDir; + + /** the logger to be used */ + private Logger logger; + + /** + * Constructor + */ + public InputStreamLocator() { + this.rootDir = new File(new File("").getAbsolutePath()); + this.logger = new NullLogger(); + } + + /** + * Constructor + * + * @param rootDir the root directory to start the search + */ + public InputStreamLocator(File rootDir) { + this(rootDir, new NullLogger()); + } + + /** + * Constructor + * + * @param rootDir the root directory to start the search + * @param logger the logger to be used + */ + public InputStreamLocator(File rootDir, Logger logger) { + this.rootDir = rootDir; + this.logger = logger; + } + + /** + * Locate the file with the given position using the following steps + * + * @param location the location of the source to be loaded + * @return input stream of the source + * @throws IOException if source is not found + */ + public InputStream locate(String location) throws IOException { + if (location == null || location.length() == 0) { + return null; + } + + String baseName = null; + File file = null; + InputStream is = null; + + // try to load a relative location with the given root dir + // e.g. "componentRoles.xml" located in the current working directory + if (is == null) { + file = new File(this.rootDir, location); + + this.logger.debug("Looking for " + location + " in the root directory"); + + if (file.exists()) { + is = new FileInputStream(file); + this.logger.debug("Found " + location + " as " + file.getAbsolutePath()); + } + } + + // try to load an absolute location as file + // e.g. "/foo/componentRoles.xml" from the root of the file system + if (is == null) { + file = new File(location); + + this.logger.debug("Looking for " + location + " as absolute file location"); + + if (file.isAbsolute() && file.exists()) { + is = new FileInputStream(file); + this.logger.debug("Found " + location + " as " + file.getAbsolutePath()); + } + } + + // try to load an absolute location through the classpath + // e.g. "/componentRoles.xml" located in the classpath + if (is == null && location.startsWith("/") == true) { + this.logger.debug("Looking for " + location + " using the class loader"); + is = getClass().getResourceAsStream(location); + + if (is != null) { + this.logger.debug("Successfully located " + location); + } + } + + // try to load the last part of the file name using the classloader + // e.g. "conf/componentRoles.xml" as "/componentRoles.xml" located in + // the classpath. + + if (is == null && location.startsWith("/") == false) { + baseName = '/' + new File(location).getName(); + this.logger.debug("Looking for " + baseName + " using the class loader"); + is = getClass().getResourceAsStream(baseName); + if (is != null) { + this.logger.debug("Successfully located " + baseName); + } + } + + if (is == null) { + this.logger.info("Unable to find any resource with the name '" + location + "'"); + } + + return is; + } + + /** + * @return Returns the rootDir. + */ + protected File getRootDir() { + return rootDir; + } } Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/jamon/JamonInterceptorServiceImpl.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/jamon/JamonInterceptorServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/jamon/JamonInterceptorServiceImpl.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/jamon/JamonInterceptorServiceImpl.java Thu Dec 13 18:17:39 2018 @@ -64,7 +64,7 @@ public class JamonInterceptorServiceImpl private String performanceMonitorClassName; /** the implementation class name for the performance monitor */ - private Class performanceMonitorClass; + private Class<?> performanceMonitorClass; /** the class name of the JAMon MonitorFactory */ private static final String MONITORFACTORY_CLASSNAME = "com.jamonapi.MonitorFactory"; @@ -240,7 +240,7 @@ public class JamonInterceptorServiceImpl try { Class[] signature = { String.class, Method.class, Boolean.class }; - Object[] args = { serviceName, method, (isEnabled) ? Boolean.TRUE : Boolean.FALSE }; + Object[] args = { serviceName, method, isEnabled ? Boolean.TRUE : Boolean.FALSE }; result = (JamonPerformanceMonitor) Clazz.newInstance(this.performanceMonitorClass, signature, args); return result; } catch (Exception e) { Modified: turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/javasimon/JavaSimonInterceptorServiceImpl.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/javasimon/JavaSimonInterceptorServiceImpl.java?rev=1848876&r1=1848875&r2=1848876&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/javasimon/JavaSimonInterceptorServiceImpl.java (original) +++ turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/interceptor/javasimon/JavaSimonInterceptorServiceImpl.java Thu Dec 13 18:17:39 2018 @@ -44,287 +44,261 @@ import org.apache.fulcrum.yaafi.intercep * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> */ -public class JavaSimonInterceptorServiceImpl - extends BaseInterceptorServiceImpl - implements JavaSimonInterceptorService, Reconfigurable, ThreadSafe, Disposable, Initializable -{ +public class JavaSimonInterceptorServiceImpl extends BaseInterceptorServiceImpl + implements JavaSimonInterceptorService, Reconfigurable, ThreadSafe, Disposable, Initializable { /** are the JavaSimon classes in the classpath */ private boolean isJavaSimonAvailable; - /** the file to hold the report */ - private File reportFile; + /** the file to hold the report */ + private File reportFile; - /** the time in ms between two reports */ - private long reportTimeout; + /** the time in ms between two reports */ + private long reportTimeout; - /** do we create a report during disposal of the service */ - private boolean reportOnExit; + /** do we create a report during disposal of the service */ + private boolean reportOnExit; - /** the time when the next report is due */ - private long nextReportTimestamp; - - /** the implementation class name for the performance monitor */ - private String performanceMonitorClassName; - - /** the implementation class name for the performance monitor */ - private Class<?> performanceMonitorClass; - - /** the class name of the JavaSimon factory */ - private static final String MONITORFACTORY_CLASSNAME = "org.javasimon.SimonManager"; - - /** the class name of the JavaSimon MonitorFactory */ - private static final String DEFAULT_PERFORMANCEMONITOR_CLASSNAME = "org.apache.fulcrum.yaafi.interceptor.javasimon.JavaSimon4PerformanceMonitorImpl"; - - ///////////////////////////////////////////////////////////////////////// - // Avalon Service Lifecycle Implementation - ///////////////////////////////////////////////////////////////////////// - - /** - * Constructor - */ - public JavaSimonInterceptorServiceImpl() - { - super(); - } - - /** - * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) - */ - public void configure(Configuration configuration) throws ConfigurationException - { - super.configure(configuration); - this.reportTimeout = configuration.getChild("reportTimeout").getValueAsLong(0); - - // parse the performance monitor class name - this.performanceMonitorClassName = configuration.getChild("performanceMonitorClassName").getValue(DEFAULT_PERFORMANCEMONITOR_CLASSNAME); - - // parse the report file name - String reportFileName = configuration.getChild("reportFile").getValue("./javasimon.html"); - this.reportFile = this.makeAbsoluteFile( reportFileName ); - - // determine when to create the next report - this.nextReportTimestamp = System.currentTimeMillis() + this.reportTimeout; - - // do we create a report on disposal - this.reportOnExit = configuration.getChild("reportOnExit").getValueAsBoolean(false); - } - - /** - * @see Initializable#initialize() - */ - public void initialize() throws Exception - { - ClassLoader classLoader = this.getClassLoader(); - - if (!Clazz.hasClazz(classLoader, MONITORFACTORY_CLASSNAME)) - { - String msg = "The JavaSimonInterceptorService is disabled since the JavaSimon classes are not found in the classpath"; - this.getLogger().warn(msg); - this.isJavaSimonAvailable = false; - return; - } - - if (!Clazz.hasClazz(classLoader, this.performanceMonitorClassName)) - { - String msg = "The JavaSimonInterceptorService is disabled since the performance monitor class is not found in the classpath"; - this.getLogger().warn(msg); - this.isJavaSimonAvailable = false; - return; - } - - // load the performance monitor class - this.performanceMonitorClass = Clazz.getClazz(this.getClassLoader(), this.performanceMonitorClassName); - - // check if we can create an instance of the performance monitor class - JavaSimonPerformanceMonitor testMonitor = this.createJavaSimonPerformanceMonitor(null, null, true); - if(testMonitor == null) - { - String msg = "The JavaSimonInterceptorService is disabled since the performance monitor can't be instantiated"; - this.getLogger().warn(msg); - this.isJavaSimonAvailable = false; - return; - } - - this.getLogger().debug("The JavaSimonInterceptorService is enabled"); - this.isJavaSimonAvailable = true; - } - - /** - * @see Reconfigurable#reconfigure(Configuration) - */ - public void reconfigure(Configuration configuration) throws ConfigurationException - { - super.reconfigure(configuration); - this.configure(configuration); - } - - /** - * @see Disposable#dispose() - */ - public void dispose() - { - if( this.reportOnExit ) - { - this.run(); - } - - this.reportFile = null; - } - - ///////////////////////////////////////////////////////////////////////// - // Service interface implementation - ///////////////////////////////////////////////////////////////////////// - - /** - * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onEntry(AvalonInterceptorContext) - */ - public void onEntry(AvalonInterceptorContext interceptorContext) - { - if( this.isJavaSimonAvailable() ) - { - this.writeReport(); - - String serviceShortHand = interceptorContext.getServiceShorthand(); - Method serviceMethod = interceptorContext.getMethod(); - boolean isEnabled = this.isServiceMonitored(interceptorContext ); - JavaSimonPerformanceMonitor monitor = this.createJavaSimonPerformanceMonitor(serviceShortHand, serviceMethod, isEnabled); - monitor.start(); - interceptorContext.getRequestContext().put(this.getServiceName(), monitor); - } - } - - /** - * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onExit(AvalonInterceptorContext, Object) - */ - public void onExit(AvalonInterceptorContext interceptorContext, Object result) - { - if( this.isJavaSimonAvailable() ) - { - JavaSimonPerformanceMonitor monitor; - monitor = (JavaSimonPerformanceMonitor) interceptorContext.getRequestContext().remove(this.getServiceName()); - monitor.stop(); - } - } - - /** - * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onError(AvalonInterceptorContext, Throwable) - */ - public void onError(AvalonInterceptorContext interceptorContext,Throwable t) - { - if( this.isJavaSimonAvailable() ) - { - JavaSimonPerformanceMonitor monitor; - monitor = (JavaSimonPerformanceMonitor) interceptorContext.getRequestContext().remove(this.getServiceName()); - monitor.stop(t); - } - } - - /** - * Writes the JavaSimon report to the file system. - * - * @see Runnable#run() - */ - public void run() - { - this.writeReport(this.reportFile); - } - - ///////////////////////////////////////////////////////////////////////// - // Service Implementation - ///////////////////////////////////////////////////////////////////////// - - /** - * @return Returns the isJavaSimonAvailable. - */ - protected final boolean isJavaSimonAvailable() - { - return this.isJavaSimonAvailable; - } - - /** - * Factory method for creating an implementation of a JavaSimonPerformanceMonitor. - * - * @param serviceName the service name - * @param method the method - * @param isEnabled is the monitor enabled - * @return the instance or <b>null</b> if the creation failed - */ - @SuppressWarnings("rawtypes") - protected JavaSimonPerformanceMonitor createJavaSimonPerformanceMonitor(String serviceName, Method method, boolean isEnabled) - { - JavaSimonPerformanceMonitor result = null; - - try - { - Class[] signature = { String.class, Method.class, Boolean.class }; - Object[] args = { serviceName, method, (isEnabled) ? Boolean.TRUE : Boolean.FALSE}; - result = (JavaSimonPerformanceMonitor) Clazz.newInstance(this.performanceMonitorClass, signature, args); - } - catch(Exception e) - { - String msg = "Failed to create a performance monitor instance : " + this.performanceMonitorClassName; - this.getLogger().error(msg, e); - } - - return result; - } - - /** - * Write a report file - */ - protected void writeReport() - { - if( this.reportTimeout > 0 ) - { - long currTimestamp = System.currentTimeMillis(); - - if( currTimestamp > this.nextReportTimestamp ) - { - this.nextReportTimestamp = currTimestamp + this.reportTimeout; - this.writeReport(this.reportFile); - } - } - } - - /** - * Write the HTML report to the given destination. - * - * @param reportFile the report destination - */ - protected void writeReport( File reportFile ) - { - PrintWriter printWriter = null; - - if( this.isJavaSimonAvailable() ) - { - try - { - if( this.getLogger().isDebugEnabled() ) - { - this.getLogger().debug( "Writing JavaSimon report to " + reportFile.getAbsolutePath() ); - } - - // Update to eliminate reliance on default encoding (DM_DEFAULT_ENCODING) - Writer w = new OutputStreamWriter(new FileOutputStream(reportFile), "UTF-8"); - printWriter = new PrintWriter( w ); - - // JavaSimonPerformanceMonitor monitor = this.createJavaSimonPerformanceMonitor(null, null, true); - String report = "Not implemented yet ..."; - printWriter.write( report ); - printWriter.close(); - } - catch( Throwable t ) - { - String msg = "Generating the JavaSimon report failed for " + reportFile.getAbsolutePath(); - this.getLogger().error(msg,t); - } - finally - { - if( printWriter != null ) - { - printWriter.close(); - } - } - } - } + /** the time when the next report is due */ + private long nextReportTimestamp; + + /** the implementation class name for the performance monitor */ + private String performanceMonitorClassName; + + /** the implementation class name for the performance monitor */ + private Class<?> performanceMonitorClass; + + /** the class name of the JavaSimon factory */ + private static final String MONITORFACTORY_CLASSNAME = "org.javasimon.SimonManager"; + + /** the class name of the JavaSimon MonitorFactory */ + private static final String DEFAULT_PERFORMANCEMONITOR_CLASSNAME = "org.apache.fulcrum.yaafi.interceptor.javasimon.JavaSimon4PerformanceMonitorImpl"; + + ///////////////////////////////////////////////////////////////////////// + // Avalon Service Lifecycle Implementation + ///////////////////////////////////////////////////////////////////////// + + /** + * Constructor + */ + public JavaSimonInterceptorServiceImpl() { + super(); + } + + /** + * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) + */ + public void configure(Configuration configuration) throws ConfigurationException { + super.configure(configuration); + this.reportTimeout = configuration.getChild("reportTimeout").getValueAsLong(0); + + // parse the performance monitor class name + this.performanceMonitorClassName = configuration.getChild("performanceMonitorClassName") + .getValue(DEFAULT_PERFORMANCEMONITOR_CLASSNAME); + + // parse the report file name + String reportFileName = configuration.getChild("reportFile").getValue("./javasimon.html"); + this.reportFile = this.makeAbsoluteFile(reportFileName); + + // determine when to create the next report + this.nextReportTimestamp = System.currentTimeMillis() + this.reportTimeout; + + // do we create a report on disposal + this.reportOnExit = configuration.getChild("reportOnExit").getValueAsBoolean(false); + } + + /** + * @see Initializable#initialize() + */ + public void initialize() throws Exception { + ClassLoader classLoader = this.getClassLoader(); + + if (!Clazz.hasClazz(classLoader, MONITORFACTORY_CLASSNAME)) { + String msg = "The JavaSimonInterceptorService is disabled since the JavaSimon classes are not found in the classpath"; + this.getLogger().warn(msg); + this.isJavaSimonAvailable = false; + return; + } + + if (!Clazz.hasClazz(classLoader, this.performanceMonitorClassName)) { + String msg = "The JavaSimonInterceptorService is disabled since the performance monitor class is not found in the classpath"; + this.getLogger().warn(msg); + this.isJavaSimonAvailable = false; + return; + } + + // load the performance monitor class + this.performanceMonitorClass = Clazz.getClazz(this.getClassLoader(), this.performanceMonitorClassName); + + // check if we can create an instance of the performance monitor class + JavaSimonPerformanceMonitor testMonitor = this.createJavaSimonPerformanceMonitor(null, null, true); + if (testMonitor == null) { + String msg = "The JavaSimonInterceptorService is disabled since the performance monitor can't be instantiated"; + this.getLogger().warn(msg); + this.isJavaSimonAvailable = false; + return; + } + + this.getLogger().debug("The JavaSimonInterceptorService is enabled"); + this.isJavaSimonAvailable = true; + } + + /** + * @see Reconfigurable#reconfigure(Configuration) + */ + public void reconfigure(Configuration configuration) throws ConfigurationException { + super.reconfigure(configuration); + this.configure(configuration); + } + + /** + * @see Disposable#dispose() + */ + public void dispose() { + if (this.reportOnExit) { + this.run(); + } + + this.reportFile = null; + } + + ///////////////////////////////////////////////////////////////////////// + // Service interface implementation + ///////////////////////////////////////////////////////////////////////// + + /** + * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onEntry(AvalonInterceptorContext) + */ + public void onEntry(AvalonInterceptorContext interceptorContext) { + if (this.isJavaSimonAvailable()) { + this.writeReport(); + + String serviceShortHand = interceptorContext.getServiceShorthand(); + Method serviceMethod = interceptorContext.getMethod(); + boolean isEnabled = this.isServiceMonitored(interceptorContext); + JavaSimonPerformanceMonitor monitor = this.createJavaSimonPerformanceMonitor(serviceShortHand, + serviceMethod, isEnabled); + monitor.start(); + interceptorContext.getRequestContext().put(this.getServiceName(), monitor); + } + } + + /** + * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onExit(AvalonInterceptorContext, + * Object) + */ + public void onExit(AvalonInterceptorContext interceptorContext, Object result) { + if (this.isJavaSimonAvailable()) { + JavaSimonPerformanceMonitor monitor; + monitor = (JavaSimonPerformanceMonitor) interceptorContext.getRequestContext() + .remove(this.getServiceName()); + monitor.stop(); + } + } + + /** + * @see org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService#onError(AvalonInterceptorContext, + * Throwable) + */ + public void onError(AvalonInterceptorContext interceptorContext, Throwable t) { + if (this.isJavaSimonAvailable()) { + JavaSimonPerformanceMonitor monitor; + monitor = (JavaSimonPerformanceMonitor) interceptorContext.getRequestContext() + .remove(this.getServiceName()); + monitor.stop(t); + } + } + + /** + * Writes the JavaSimon report to the file system. + * + * @see Runnable#run() + */ + public void run() { + this.writeReport(this.reportFile); + } + + ///////////////////////////////////////////////////////////////////////// + // Service Implementation + ///////////////////////////////////////////////////////////////////////// + + /** + * @return Returns the isJavaSimonAvailable. + */ + protected final boolean isJavaSimonAvailable() { + return this.isJavaSimonAvailable; + } + + /** + * Factory method for creating an implementation of a + * JavaSimonPerformanceMonitor. + * + * @param serviceName the service name + * @param method the method + * @param isEnabled is the monitor enabled + * @return the instance or <b>null</b> if the creation failed + */ + @SuppressWarnings("rawtypes") + protected JavaSimonPerformanceMonitor createJavaSimonPerformanceMonitor(String serviceName, Method method, + boolean isEnabled) { + JavaSimonPerformanceMonitor result = null; + + try { + Class[] signature = { String.class, Method.class, Boolean.class }; + Object[] args = { serviceName, method, isEnabled ? Boolean.TRUE : Boolean.FALSE }; + result = (JavaSimonPerformanceMonitor) Clazz.newInstance(this.performanceMonitorClass, signature, args); + } catch (Exception e) { + String msg = "Failed to create a performance monitor instance : " + this.performanceMonitorClassName; + this.getLogger().error(msg, e); + } + + return result; + } + + /** + * Write a report file + */ + protected void writeReport() { + if (this.reportTimeout > 0) { + long currTimestamp = System.currentTimeMillis(); + + if (currTimestamp > this.nextReportTimestamp) { + this.nextReportTimestamp = currTimestamp + this.reportTimeout; + this.writeReport(this.reportFile); + } + } + } + + /** + * Write the HTML report to the given destination. + * + * @param reportFile the report destination + */ + protected void writeReport(File reportFile) { + PrintWriter printWriter = null; + + if (this.isJavaSimonAvailable()) { + try { + if (this.getLogger().isDebugEnabled()) { + this.getLogger().debug("Writing JavaSimon report to " + reportFile.getAbsolutePath()); + } + + // Update to eliminate reliance on default encoding (DM_DEFAULT_ENCODING) + Writer w = new OutputStreamWriter(new FileOutputStream(reportFile), "UTF-8"); + printWriter = new PrintWriter(w); + + // JavaSimonPerformanceMonitor monitor = + // this.createJavaSimonPerformanceMonitor(null, null, true); + String report = "Not implemented yet ..."; + printWriter.write(report); + printWriter.close(); + } catch (Throwable t) { + String msg = "Generating the JavaSimon report failed for " + reportFile.getAbsolutePath(); + this.getLogger().error(msg, t); + } finally { + if (printWriter != null) { + printWriter.close(); + } + } + } + } }
