You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by do...@apache.org on 2002/11/12 04:48:34 UTC

cvs commit: jakarta-avalon-excalibur/info/src/java/org/apache/avalon/framework/tools/generator QDoxInfoBuilder.java MetaGenerateTask.java InfoBuilder.java

donaldp     2002/11/11 19:48:34

  Modified:    info/src/java/org/apache/avalon/framework/tools/generator
                        MetaGenerateTask.java
  Added:       info/src/java/org/apache/avalon/framework/tools/generator
                        QDoxInfoBuilder.java
  Removed:     info/src/java/org/apache/avalon/framework/tools/generator
                        InfoBuilder.java
  Log:
  rename builder to avoid conflicts
  
  Revision  Changes    Path
  1.4       +2 -2      jakarta-avalon-excalibur/info/src/java/org/apache/avalon/framework/tools/generator/MetaGenerateTask.java
  
  Index: MetaGenerateTask.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/info/src/java/org/apache/avalon/framework/tools/generator/MetaGenerateTask.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MetaGenerateTask.java	12 Nov 2002 03:47:29 -0000	1.3
  +++ MetaGenerateTask.java	12 Nov 2002 03:48:34 -0000	1.4
  @@ -133,7 +133,7 @@
               final DocletTag tag = javaClass.getTagByName( "avalon.component" );
               if( null != tag )
               {
  -                final InfoBuilder infoBuilder = new InfoBuilder();
  +                final QDoxInfoBuilder infoBuilder = new QDoxInfoBuilder();
                   final ComponentInfo info = infoBuilder.buildComponentInfo( javaClass );
                   final String fqn = javaClass.getFullyQualifiedName();
                   final String filename =
  
  
  
  1.1                  jakarta-avalon-excalibur/info/src/java/org/apache/avalon/framework/tools/generator/QDoxInfoBuilder.java
  
  Index: QDoxInfoBuilder.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.avalon.framework.tools.generator;
  
  import com.thoughtworks.qdox.model.DocletTag;
  import com.thoughtworks.qdox.model.JavaClass;
  import com.thoughtworks.qdox.model.JavaMethod;
  import com.thoughtworks.qdox.model.Type;
  import java.util.ArrayList;
  import org.apache.avalon.framework.info.Attribute;
  import org.apache.avalon.framework.info.ComponentDescriptor;
  import org.apache.avalon.framework.info.ComponentInfo;
  import org.apache.avalon.framework.info.ContextDescriptor;
  import org.apache.avalon.framework.info.DependencyDescriptor;
  import org.apache.avalon.framework.info.EntryDescriptor;
  import org.apache.avalon.framework.info.LoggerDescriptor;
  import org.apache.avalon.framework.info.ServiceDescriptor;
  
  /**
   * This is a utility class that is used to build a ComponentInfo object
   * from QDoxs JavaClass object model. This essentially involves interpreting
   * all of the javadoc tags present in JavaClass object model.
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/12 03:48:34 $
   */
  public class QDoxInfoBuilder
  {
      private static final String CONTEXT_CLASS = "org.apache.avalon.framework.context.Context";
      private static final String LOGGER_CLASS = "org.apache.avalon.framework.logger.Logger";
      private static final String COMPONENT_MANAGER_CLASS =
          "org.apache.avalon.framework.component.ComponentManager";
      private static final String SERVICE_MANAGER_CLASS =
          "org.apache.avalon.framework.component.ServiceManager";
  
      private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[ 0 ];
  
      /**
       * Build a ComponentInfo object for specified class.
       *
       * @param javaClass the class
       * @return the ComponentInfo object
       */
      public ComponentInfo buildComponentInfo( final JavaClass javaClass )
      {
          final ComponentDescriptor component = buildComponentDescriptor( javaClass );
          final ContextDescriptor context = buildContextDescriptor( javaClass );
          final LoggerDescriptor[] loggers = buildLoggers( javaClass );
          final ServiceDescriptor[] services = buildServices( javaClass );
          final DependencyDescriptor[] dependencies = buildDependencies( javaClass );
  
          return new ComponentInfo( component, loggers, context, services, dependencies );
      }
  
      /**
       * Build the set of dependency descriptors for specified class.
       *
       * @param javaClass the class
       * @return the set of dependency descriptors
       */
      private DependencyDescriptor[] buildDependencies( final JavaClass javaClass )
      {
          JavaMethod method =
              getLifecycleMethod( javaClass, "compose", COMPONENT_MANAGER_CLASS );
  
          //If no compose then try for a service method ...
          if( null == method )
          {
              method =
                  getLifecycleMethod( javaClass, "service", SERVICE_MANAGER_CLASS );
          }
  
          if( null == method )
          {
              return new DependencyDescriptor[ 0 ];
          }
          else
          {
              final ArrayList deps = new ArrayList();
              final DocletTag[] tags = method.getTagsByName( "avalon.dependency" );
              for( int i = 0; i < tags.length; i++ )
              {
                  final DocletTag tag = tags[ i ];
                  final String unresolvedType = getNamedParameter( tag, "interface" );
                  final String type = resolveType( javaClass, unresolvedType );
                  final String key = getNamedParameter( tag, "key", type );
                  final String optional = getNamedParameter( tag, "optional", "false" );
                  final boolean isOptional = "true".equals( optional );
                  final DependencyDescriptor dependency =
                      new DependencyDescriptor( key, type, isOptional, EMPTY_ATTRIBUTES );
                  deps.add( dependency );
              }
              return (DependencyDescriptor[])deps.toArray( new DependencyDescriptor[ deps.size() ] );
          }
      }
  
      /**
       * Build the set of service descriptors for specified class.
       *
       * @param javaClass the class
       * @return the set of service descriptors
       */
      private ServiceDescriptor[] buildServices( final JavaClass javaClass )
      {
          final ArrayList services = new ArrayList();
          final DocletTag[] tags = javaClass.getTagsByName( "avalon.service" );
          for( int i = 0; i < tags.length; i++ )
          {
              final DocletTag tag = tags[ i ];
              final String unresolvedType = getNamedParameter( tag, "type" );
              final String type = resolveType( javaClass, unresolvedType );
              final ServiceDescriptor service = new ServiceDescriptor( type, EMPTY_ATTRIBUTES );
              services.add( service );
          }
          return (ServiceDescriptor[])services.toArray( new ServiceDescriptor[ services.size() ] );
      }
  
      /**
       * Build the set of logger descriptors for specified class.
       *
       * @param javaClass the class
       * @return the set of logger descriptors
       */
      private LoggerDescriptor[] buildLoggers( final JavaClass javaClass )
      {
          final JavaMethod method =
              getLifecycleMethod( javaClass, "enableLogging", LOGGER_CLASS );
          if( null == method )
          {
              return new LoggerDescriptor[ 0 ];
          }
          else
          {
              final ArrayList loggers = new ArrayList();
              final DocletTag[] tags = method.getTagsByName( "avalon.loggers" );
              for( int i = 0; i < tags.length; i++ )
              {
                  final String name =
                      getNamedParameter( tags[ i ], "name", "" );
                  final LoggerDescriptor logger =
                      new LoggerDescriptor( name, EMPTY_ATTRIBUTES );
                  loggers.add( logger );
              }
              return (LoggerDescriptor[])loggers.toArray( new LoggerDescriptor[ loggers.size() ] );
          }
      }
  
      /**
       * Build the context descriptor for specified class.
       *
       * @param javaClass the class
       * @return the context descriptor
       */
      private ContextDescriptor buildContextDescriptor( final JavaClass javaClass )
      {
          final JavaMethod method =
              getLifecycleMethod( javaClass, "contextualize", CONTEXT_CLASS );
          if( null == method )
          {
              return new ContextDescriptor( CONTEXT_CLASS,
                                            new EntryDescriptor[ 0 ],
                                            EMPTY_ATTRIBUTES );
          }
          else
          {
              String type = CONTEXT_CLASS;
              final DocletTag tag = method.getTagByName( "avalon.context" );
              if( null != tag && null != tag.getNamedParameter( "type" ) )
              {
                  type = resolveType( javaClass, tag.getNamedParameter( "type" ) );
              }
  
              final ArrayList entrySet = new ArrayList();
              final DocletTag[] tags = method.getTagsByName( "avalon.entry" );
              for( int i = 0; i < tags.length; i++ )
              {
                  final String key = getNamedParameter( tags[ i ], "key" );
                  final String entryType = getNamedParameter( tags[ i ], "type" );
                  final String optional = getNamedParameter( tags[ i ], "optional", "false" );
                  final boolean isOptional = "true".equals( optional );
                  final EntryDescriptor entry =
                      new EntryDescriptor( key, entryType, isOptional, EMPTY_ATTRIBUTES );
                  entrySet.add( entry );
              }
              final EntryDescriptor[] entrys =
                  (EntryDescriptor[])entrySet.toArray( new EntryDescriptor[ entrySet.size() ] );
  
              return new ContextDescriptor( type, entrys, EMPTY_ATTRIBUTES );
          }
      }
  
      /**
       * Build the component descriptor for specified class.
       *
       * @param javaClass the class
       * @return the component descriptor
       */
      private ComponentDescriptor buildComponentDescriptor( final JavaClass javaClass )
      {
          final String type = javaClass.getFullyQualifiedName();
          return new ComponentDescriptor( type, EMPTY_ATTRIBUTES );
      }
  
      /**
       * Resolve the specified type.
       * Resolving essentially means finding the fully qualified name of
       * a class from just it's short name.
       *
       * @param javaClass the java class relative to which the type must be resolved
       * @param type the unresolved type
       * @return the resolved type
       */
      private String resolveType( final JavaClass javaClass, final String type )
      {
          return javaClass.getParentSource().resolveType( type );
      }
  
      /**
       * Retrieve a method with specified name and one parameter of specified
       * type. The method must also return void.
       *
       * @param javaClass the java class to retrieve method for
       * @param methodName the name of the method
       * @param parameterType the class name of parameter
       * @return the method if such a method exists
       */
      private JavaMethod getLifecycleMethod( final JavaClass javaClass,
                                             final String methodName,
                                             final String parameterType )
      {
          final JavaMethod[] methods = javaClass.getMethods();
          for( int i = 0; i < methods.length; i++ )
          {
              final JavaMethod method = methods[ i ];
              if( methodName.equals( method.getName() ) &&
                  method.getReturns().equals( new Type( "void", 0 ) ) &&
                  method.getParameters().length == 1 &&
                  method.getParameters()[ 0 ].getType().getValue().equals( parameterType ) )
              {
                  return method;
              }
          }
          return null;
      }
  
      /**
       * Retrieve specified named parameter from tag. If the parameter
       * does not exist then return specified default value.
       *
       * @param tag the tag
       * @param name the name of parameter
       * @return the value of named parameter
       */
      private String getNamedParameter( final DocletTag tag,
                                        final String name,
                                        final String defaultValue )
      {
          final String value = tag.getNamedParameter( name );
          if( null == value )
          {
              return defaultValue;
          }
          return value;
      }
  
      /**
       * Retrieve specified named parameter from tag. If the parameter
       * does not exist then throw an exception.
       *
       * @param tag the tag
       * @param name the name of parameter
       * @return the value of named parameter
       */
      private static String getNamedParameter( final DocletTag tag, final String name )
      {
          final String value = tag.getNamedParameter( name );
          if( null == value )
          {
              final String message =
                  "Malformed tag '" + tag.getName() + "'. " +
                  "Missing required parameter '" + name + "'";
              throw new IllegalArgumentException( message );
          }
          return value;
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>