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/08/25 14:10:02 UTC

cvs commit: jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet IsServiceProvisionFilter.java AvalonTagHandler.java componentinfo.xdt

donaldp     2002/08/25 05:10:02

  Modified:    containerkit/src/java/org/apache/excalibur/containerkit/demo/components
                        Component1.java
               containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet
                        AvalonTagHandler.java componentinfo.xdt
  Added:       containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet
                        IsServiceProvisionFilter.java
  Log:
  Start integrating the next generation of xdoclet and vastly simplifying the
  syntax of the template file.
  
  Revision  Changes    Path
  1.2       +1 -0      jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/demo/components/Component1.java
  
  Index: Component1.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/demo/components/Component1.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Component1.java	23 Aug 2002 08:51:15 -0000	1.1
  +++ Component1.java	25 Aug 2002 12:10:02 -0000	1.2
  @@ -45,6 +45,7 @@
   
       /**
        * @avalon.dependency role="fred" interface="Service1" optional="true" shareable="true"
  +     * @avalon.dependency role="fred" interface="Service1" shareable="true"
        */
       public void service( final ServiceManager manager )
           throws ServiceException
  
  
  
  1.3       +172 -45   jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet/AvalonTagHandler.java
  
  Index: AvalonTagHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet/AvalonTagHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AvalonTagHandler.java	25 Aug 2002 07:11:24 -0000	1.2
  +++ AvalonTagHandler.java	25 Aug 2002 12:10:02 -0000	1.3
  @@ -7,12 +7,16 @@
    */
   package org.apache.excalibur.containerkit.tools.xdoclet;
   
  -import java.util.Properties;
   import java.util.Collection;
   import java.util.Iterator;
  +import java.util.Properties;
  +import java.util.StringTokenizer;
  +import org.apache.commons.logging.Log;
   import xdoclet.XDocletException;
   import xdoclet.XDocletTagSupport;
  +import xdoclet.util.LogUtil;
   import xjavadoc.XClass;
  +import xjavadoc.XDoc;
   import xjavadoc.XMethod;
   import xjavadoc.XPackage;
   import xjavadoc.XTag;
  @@ -28,6 +32,148 @@
   {
       private static String c_attribute;
   
  +    public void forAllDeps( final String template )
  +        throws XDocletException
  +    {
  +        final IsServiceProvisionFilter filter = new IsServiceProvisionFilter();
  +        final Collection methods =
  +            getCurrentClass().getMethods( filter, false );
  +        final Iterator iterator = methods.iterator();
  +        while( iterator.hasNext() )
  +        {
  +            final XMethod method = (XMethod)iterator.next();
  +            setCurrentMethod( method );
  +            final XDoc doc = method.getDoc();
  +            final Iterator tags =
  +                doc.getTags( "avalon.dependency" ).iterator();
  +            while( tags.hasNext() )
  +            {
  +                final XTag tag = (XTag)tags.next();
  +                setCurrentMethodTag( tag );
  +                generate( template );
  +            }
  +        }
  +    }
  +
  +    public void forAllMethodAttributes( final String template,
  +                                        final Properties attributes )
  +        throws XDocletException
  +    {
  +        final XTag tag = getCurrentMethodTag();
  +        forAllMethodAttributes( tag, template, attributes );
  +    }
  +
  +    private void forAllMethodAttributes( final XTag tag,
  +                                         final String template,
  +                                         final Properties attributes )
  +        throws XDocletException
  +    {
  +        final String[] skips = getSkips( attributes );
  +        final Iterator attributeNames = tag.getAttributeNames().iterator();
  +        while( attributeNames.hasNext() )
  +        {
  +            final String name = (String)attributeNames.next();
  +            if( !matchesSkip( name, skips ) )
  +            {
  +                c_attribute = name;
  +                generate( template );
  +            }
  +        }
  +        c_attribute = null;
  +    }
  +
  +    private boolean matchesSkip( final String name,
  +                                 final String[] skips )
  +    {
  +        for( int i = 0; i < skips.length; i++ )
  +        {
  +            if( skips[ i ].equals( name ) )
  +            {
  +                return true;
  +            }
  +        }
  +        return false;
  +    }
  +
  +    private String[] getSkips( final Properties attributes )
  +    {
  +        final String skipList =
  +            attributes.getProperty( "skip", "" );
  +        return split( skipList, ", " );
  +    }
  +
  +    public String getAttributeValueAsType( final Properties attributes )
  +    {
  +        final Log log =
  +            LogUtil.getLog( AvalonTagHandler.class, "getAttributeValueAsType" );
  +        final String name = attributes.getProperty( "name", "" );
  +        final XTag tag = getCurrentMethodTag();
  +        final String value = tag.getAttributeValue( name );
  +        if( null == value )
  +        {
  +            log.fatal( "Missing attribute value with key '" +
  +                       name + "' in tag" + tag + " in class " +
  +                       getCurrentClass() );
  +            return "";
  +        }
  +
  +        return getQualifiedTypeName( value );
  +    }
  +
  +    private String getQualifiedTypeName( final String typeName )
  +    {
  +        if( -1 != typeName.indexOf( '.' ) )
  +        {
  +            //User has specified full
  +            return typeName;
  +        }
  +        else
  +        {
  +            final XClass currentClass = getCurrentClass();
  +
  +            XClass xClass = null;
  +            Collection classes = null;
  +
  +            classes =
  +                currentClass.getImportedClasses();
  +            xClass = findClass( typeName, classes );
  +            if( null != xClass )
  +            {
  +                return xClass.getQualifiedName();
  +            }
  +
  +            classes =
  +                currentClass.getContainingPackage().getClasses();
  +            xClass = findClass( typeName, classes );
  +            if( null != xClass )
  +            {
  +                return xClass.getQualifiedName();
  +            }
  +
  +            final Iterator xPackages =
  +                currentClass.getImportedPackages().iterator();
  +            while( xPackages.hasNext() )
  +            {
  +                final XPackage xPackage = (XPackage)xPackages.next();
  +                classes = xPackage.getClasses();
  +                xClass = findClass( typeName, classes );
  +                if( null != xClass )
  +                {
  +                    return xClass.getQualifiedName();
  +                }
  +            }
  +
  +            classes = getDefaultPackage().getClasses();
  +            xClass = findClass( typeName, classes );
  +            if( null != xClass )
  +            {
  +                return xClass.getQualifiedName();
  +            }
  +
  +            return typeName;
  +        }
  +    }
  +
       public void setCurrentClassTag( final Properties atributes )
           throws XDocletException
       {
  @@ -93,49 +239,9 @@
   
       public String attributeValueAsType( final Properties attributes )
       {
  -        final String typeName = attributeValue( attributes );
  -        if( -1 != typeName.indexOf( '.' ) )
  -        {
  -            //User has specified full
  -            return typeName;
  -        }
  -        else
  -        {
  -            XClass xClass = null;
  -
  -            xClass = findClass( typeName, getCurrentClass().getImportedClasses() );
  -            if( null != xClass )
  -            {
  -                return xClass.getQualifiedName();
  -            }
  -
  -            final Collection classes = getCurrentClass().getContainingPackage().getClasses();
  -            xClass = findClass( typeName, classes );
  -            if( null != xClass )
  -            {
  -                return xClass.getQualifiedName();
  -            }
  -
  -            final Iterator xPackages =
  -                getCurrentClass().getImportedPackages().iterator();
  -            while( xPackages.hasNext() )
  -            {
  -                final XPackage xPackage = (XPackage)xPackages.next();
  -                xClass = findClass( typeName, xPackage.getClasses() );
  -                if( null != xClass )
  -                {
  -                    return xClass.getQualifiedName();
  -                }
  -            }
  -
  -            xClass = findClass( typeName, getDefaultPackage().getClasses() );
  -            if( null != xClass )
  -            {
  -                return xClass.getQualifiedName();
  -            }
  -
  -            return typeName;
  -        }
  +        final String typeName =
  +            attributeValue( attributes );
  +        return getQualifiedTypeName( typeName );
       }
   
       private XPackage getDefaultPackage()
  @@ -217,4 +323,25 @@
               return getCurrentMethodTag();
           }
       }
  +
  +    /**
  +     * Splits the string on every token into an array of strings.
  +     *
  +     * @param string the string
  +     * @param onToken the token
  +     * @return the resultant array
  +     */
  +    private static final String[] split( final String string, final String onToken )
  +    {
  +        final StringTokenizer tokenizer = new StringTokenizer( string, onToken );
  +        final String[] result = new String[ tokenizer.countTokens() ];
  +
  +        for( int i = 0; i < result.length; i++ )
  +        {
  +            result[ i ] = tokenizer.nextToken();
  +        }
  +
  +        return result;
  +    }
   }
  +
  
  
  
  1.2       +5 -48     jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet/componentinfo.xdt
  
  Index: componentinfo.xdt
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet/componentinfo.xdt,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- componentinfo.xdt	18 Aug 2002 06:39:00 -0000	1.1
  +++ componentinfo.xdt	25 Aug 2002 12:10:02 -0000	1.2
  @@ -68,60 +68,17 @@
   
     <!-- services that are required by this Component -->
     <dependencies>
  -    <XDtMethod:ifHasMethod name="compose"
  -                           parameters="org.apache.avalon.framework.component.ComponentManager">
  -      <XDtMethod:setCurrentMethod name="compose"
  -                                  parameters="org.apache.avalon.framework.component.ComponentManager">
  -        <XDtMethod:forAllMethodTags tagName="avalon.dependency">
  +  <XDtAvalon:forAllDeps>
       <dependency<XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="optional"> optional="<XDtMethod:methodTagValue tagName="avalon.dependency" paramName="optional"/>"</XDtMethod:ifHasMethodTag>>
         <XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="role"><role><XDtMethod:methodTagValue tagName="avalon.dependency" paramName="role"/></role></XDtMethod:ifHasMethodTag>
  -      <XDtAvalon:setCurrentAttribute name="interface"/>
  -      <service-ref type="<XDtAvalon:attributeValueAsType/>"<XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="version"> version="<XDtMethod:methodTagValue tagName="avalon.dependency" paramName="version"/>"</XDtMethod:ifHasMethodTag>/>
  -      <XDtAvalon:unsetCurrentAttribute/>
  +      <service-ref type="<XDtAvalon:getAttributeValueAsType name="interface"/>"<XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="version"> version="<XDtMethod:methodTagValue tagName="avalon.dependency" paramName="version"/>"</XDtMethod:ifHasMethodTag>/>
         <attributes>
  -      <XDtAvalon:forAllAttributes isMethod="true">
  -        <XDtAvalon:ifAttributeNameNotEquals value="interface">
  -          <XDtAvalon:ifAttributeNameNotEquals value="version">
  -            <XDtAvalon:ifAttributeNameNotEquals value="role">
  -              <XDtAvalon:ifAttributeNameNotEquals value="optional">
  +      <XDtAvalon:forAllMethodAttributes skip="interface,version,role,optional">
           <attribute key="<XDtAvalon:attributeName/>" value="<XDtAvalon:attributeValue/>"/>
  -              </XDtAvalon:ifAttributeNameNotEquals>
  -            </XDtAvalon:ifAttributeNameNotEquals>
  -          </XDtAvalon:ifAttributeNameNotEquals>
  -        </XDtAvalon:ifAttributeNameNotEquals>
  -      </XDtAvalon:forAllAttributes>
  +      </XDtAvalon:forAllMethodAttributes>
         </attributes>
       </dependency>
  -        </XDtMethod:forAllMethodTags>
  -      </XDtMethod:setCurrentMethod>
  -    </XDtMethod:ifHasMethod>
  -    <XDtMethod:ifHasMethod name="service"
  -                           parameters="org.apache.avalon.framework.service.ServiceManager">
  -      <XDtMethod:setCurrentMethod name="service"
  -                                  parameters="org.apache.avalon.framework.service.ServiceManager">
  -        <XDtMethod:forAllMethodTags tagName="avalon.dependency">
  -    <dependency<XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="optional"> optional="<XDtMethod:methodTagValue tagName="avalon.dependency" paramName="optional"/>"</XDtMethod:ifHasMethodTag>>
  -      <XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="role"><role><XDtMethod:methodTagValue tagName="avalon.dependency" paramName="role"/></role></XDtMethod:ifHasMethodTag>
  -      <XDtAvalon:setCurrentAttribute name="interface"/>
  -      <service-ref type="<XDtAvalon:attributeValueAsType/>"<XDtMethod:ifHasMethodTag tagName="avalon.dependency" paramName="version"> version="<XDtMethod:methodTagValue tagName="avalon.dependency" paramName="version"/>"</XDtMethod:ifHasMethodTag>/>
  -      <XDtAvalon:unsetCurrentAttribute/>
  -      <attributes>
  -      <XDtAvalon:forAllAttributes isMethod="true">
  -        <XDtAvalon:ifAttributeNameNotEquals value="interface">
  -          <XDtAvalon:ifAttributeNameNotEquals value="version">
  -            <XDtAvalon:ifAttributeNameNotEquals value="role">
  -              <XDtAvalon:ifAttributeNameNotEquals value="optional">
  -        <attribute key="<XDtAvalon:attributeName/>" value="<XDtAvalon:attributeValue/>"/>
  -              </XDtAvalon:ifAttributeNameNotEquals>
  -            </XDtAvalon:ifAttributeNameNotEquals>
  -          </XDtAvalon:ifAttributeNameNotEquals>
  -        </XDtAvalon:ifAttributeNameNotEquals>
  -      </XDtAvalon:forAllAttributes>
  -      </attributes>
  -    </dependency>
  -        </XDtMethod:forAllMethodTags>
  -      </XDtMethod:setCurrentMethod>
  -    </XDtMethod:ifHasMethod>
  +  </XDtAvalon:forAllDeps>
     </dependencies>
   
   </component-info>
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/tools/xdoclet/IsServiceProvisionFilter.java
  
  Index: IsServiceProvisionFilter.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.containerkit.tools.xdoclet;
  
  import java.util.Collection;
  import xjavadoc.Filter;
  import xjavadoc.XMethod;
  import xjavadoc.XParameter;
  import xjavadoc.XProgramElement;
  
  /**
   * Filter for getting Service Provision methods (ie Serviceable/Composable).
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/08/25 12:10:02 $
   */
  public class IsServiceProvisionFilter
      implements Filter
  {
      private static final String SM_NAME =
          "org.apache.avalon.framework.service.ServiceManager";
      private static final String CM_NAME =
          "org.apache.avalon.framework.component.ComponentManager";
  
      public boolean accept( final XProgramElement element )
      {
          final String name = element.getName();
          final boolean serviceName = name.equals( "service" );
          final boolean composeName = name.equals( "compose" );
          if( !serviceName && !composeName )
          {
              //Need to be named service/compose
              return false;
          }
  
          //need to be a method
          if( !(element instanceof XMethod) )
          {
              return false;
          }
  
          final XMethod method = (XMethod)element;
          final Collection parameters = method.getParameters();
          if( 1 != parameters.size() )
          {
              return false;
          }
  
          final XParameter parameter = (XParameter)parameters.iterator().next();
  
          final String paramType = parameter.getType().getQualifiedName();
          if( serviceName && !paramType.equals( SM_NAME ) )
          {
              return false;
          }
          else if( composeName && !paramType.equals( CM_NAME ) )
          {
              return false;
          }
  
          return true;
      }
  }
  
  
  

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