avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mcconn...@apache.org
Subject cvs commit: jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/builder/doc-files TypeBuilder.gif
Date Sun, 07 Jul 2002 04:33:17 GMT
mcconnell    2002/07/06 21:33:17

  Added:       assembly/src/java/org/apache/excalibur/meta/builder
                        ProfileBuilder.java ProfileCreator.java
                        XMLProfileCreator.java
               assembly/src/java/org/apache/excalibur/meta/builder/doc-files
                        TypeBuilder.gif
  Log:
  Profile XML support
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/builder/ProfileBuilder.java
  
  Index: ProfileBuilder.java
  ===================================================================
  /*
   * 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.excalibur.meta.builder;
  
  import java.io.InputStream;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.excalibur.meta.info.Type;
  import org.apache.excalibur.meta.data.Profile;
  
  /**
   * A ProfileBuilder is responsible for building {@link Profile}
   * objects from Configuration objects. 
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/07 04:33:16 $
   */
  public final class ProfileBuilder
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( TypeBuilder.class );
  
      private final ProfileCreator m_xmlProfileCreator = createXMLProfileCreator();
  
      /**
       * Build Profile from the XML descriptor format.
       *
       * @param classname The classname of Component
       * @param classLoader the ClassLoader to load info from
       * @return the created Type
       * @throws Exception if an error occurs
       */
      public Profile[] build( Type type, final ClassLoader classLoader )
          throws Exception
      {
          final String xprofile =
              type.getInfo().getImplementationKey().replace( '.', '/' ) + ".xprofile";
          final InputStream inputStream =
              classLoader.getResourceAsStream( xprofile );
          final ProfileCreator creator = getXMLProfileCreator( xprofile );
          if( null == inputStream )
          {
              return creator.createProfiles( type, new DefaultConfiguration("profiles", null
) );
          }
          else
          {
              return creator.createProfiles( type, inputStream );
          }
      }
  
      public Profile build( Type type, Configuration profile )
          throws Exception
      {
          final ProfileCreator creator = getXMLProfileCreator( "implicit" );
          return creator.createProfile( type, profile );
      }
  
      /**
       * Utility to get xml info builder, else throw
       * an exception if missing descriptor.
       *
       * @return the InfoCreator
       */
      private ProfileCreator getXMLProfileCreator( final String classname )
          throws Exception
      {
          if( null != m_xmlProfileCreator )
          {
              return m_xmlProfileCreator;
          }
          else
          {
              final String message =
                  REZ.getString( "builder.missing-xml-creator.error",
                                 classname );
              throw new Exception( message );
          }
      }
  
      /**
       * Utility to get XMLProfileCreator if XML files are on
       * ClassPath.
       *
       * @return the XML {@link InfoCreator}
       */
      private static ProfileCreator createXMLProfileCreator()
      {
          ProfileCreator xmlProfileCreator = null;
          try
          {
              xmlProfileCreator = new XMLProfileCreator();
          }
          catch( final Exception e )
          {
              //Ignore it if ClassNot found due to no
              //XML Classes on classpath
          }
          return xmlProfileCreator;
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/builder/ProfileCreator.java
  
  Index: ProfileCreator.java
  ===================================================================
  /*
   * 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.excalibur.meta.builder;
  
  import org.apache.excalibur.meta.data.Profile;
  import org.apache.excalibur.meta.info.Type;
  import java.io.InputStream;
  import org.apache.avalon.framework.configuration.Configuration;
  
  /**
   * Simple interface used to create {@link Profile}
   * from stream. This abstraction was primarily created so
   * that the Type could be built from non-XML
   * sources and no XML classes need be in the classpath.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/07 04:33:16 $
   */
  public interface ProfileCreator
  {
      /**
       * Create a {@link Profile} from stream
       *
       * @param key the name of component type that we are looking up
       * @param inputStream the stream that the resource is loaded from
       * @return the newly created {@link Type}
       * @throws Exception
       */
      Profile[] createProfiles( Type type, InputStream inputStream )
          throws Exception;
  
      /**
       * Create a {@link Profile} from a configuration
       *
       * @param key the name of component type that we are looking up
       * @param inputStream the stream that the resource is loaded from
       * @return the newly created {@link Type}
       * @throws Exception
       */
      Profile[] createProfiles( Type type, Configuration config )
          throws Exception;
  
      Profile createProfile( Type type, Configuration config )
          throws Exception;
  
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/builder/XMLProfileCreator.java
  
  Index: XMLProfileCreator.java
  ===================================================================
  /*
   * 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.excalibur.meta.builder;
  
  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.Properties;
  import java.util.Vector;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.Version;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.excalibur.meta.info.Type;
  import org.apache.excalibur.meta.data.Profile;
  import org.apache.excalibur.meta.data.DefaultProfile;
  import org.apache.excalibur.configuration.ContextFactory;
  import org.xml.sax.InputSource;
  
  /**
   * Handles internalization of an XML based description of a {@link Type}
   * from a Configuration object. The format for Configuration object
   * is specified in the <a href="package-summary.html#external">package summary</a>.
   *
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/07/07 04:33:16 $
   */
  public final class XMLProfileCreator
      implements ProfileCreator
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( XMLInfoCreator.class );
  
      /**
       * Create a {@link Type} object for specified
       * classname, loaded from specified {@link InputStream}.
       *
       * @param implementationKey The classname of Component
       * @param inputStream the InputStream to load Type from
       * @return the created Type
       * @throws ConfigurationException if an error occurs
       */
      public Profile[] createProfiles( Type type, InputStream inputStream )
          throws Exception
      {
          final InputSource input = new InputSource( inputStream );
          final Configuration configuration = ConfigurationBuilder.build( input );
          return createProfiles( type, configuration );
      }
  
      /**
       * Create a {@link Profile} object for specified classname from
       * specified configuration data.
       *
       * @param classname The classname of Component
       * @param info the Type configuration
       * @return the created Type
       * @throws ConfigurationException if an error occurs
       */
      public Profile[] createProfiles( Type type, final Configuration info )
          throws Exception
      {
          Vector vector = new Vector();
          Configuration[] profiles = info.getChildren("component");
          if( profiles.length == 0 )
          {
              //
              // build a default profile
              //
  
              return new Profile[]{ 
                 new DefaultProfile( null, null, null, null, type, Profile.IMPLICIT  ) };
          }
          for( int i=0; i<profiles.length; i++ )
          {
             vector.add( buildProfile( type, profiles[i], Profile.PACKAGED ) );
          }
          return (Profile[]) vector.toArray( new Profile[0] );
      }
  
      public Profile createProfile( Type type, Configuration config )
          throws Exception
      {
          return buildProfile( type, config, Profile.EXPLICIT );
      }
  
      private Profile buildProfile( Type type, Configuration profile, int mode ) throws Exception
      {
          String name = null;
          if( mode == Profile.EXPLICIT )
          {
              name = profile.getAttribute("name");
          }
          Parameters params = Parameters.fromConfiguration( profile.getChild("parameters")
);
          Configuration config = profile.getChild("configuration");
          Context context = ContextFactory.createContextFromConfiguration( 
            null, profile.getChild("context") );
          return new DefaultProfile( name, params, config, context, type, mode  );
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/builder/doc-files/TypeBuilder.gif
  
  	<<Binary file>>
  
  

--
To unsubscribe, e-mail:   <mailto:avalon-cvs-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:avalon-cvs-help@jakarta.apache.org>


Mime
View raw message