User: d_jencks
  Date: 02/02/28 08:28:44

  Added:       core/src/xdoclet/tags PropertyTagsHandler.java
  Log:
  New PropertyTagsHandler. For use with getter/setter methods having a specified tag.  
Provides access to the other method of the pair.  Generally other method tags should 
be located on the first method in the file of the getter/setter pair
  
  Revision  Changes    Path
  1.1                  xdoclet/core/src/xdoclet/tags/PropertyTagsHandler.java
  
  Index: PropertyTagsHandler.java
  ===================================================================
  
  package xdoclet.tags;
  
  import com.sun.javadoc.*;
  
  import xdoclet.XDocletException;
  import xdoclet.ejb.DataObjectSubTask;
  import xdoclet.template.PrettyPrintWriter;
  import xdoclet.util.DocletUtil;
  import xdoclet.util.TypeConversionUtil;
  import xdoclet.util.Log;
  import xdoclet.util.Translator;
  
  import java.beans.Introspector;
  import java.util.*;
  
  import org.apache.log4j.Category;
  
  /**
   * PropertyTagsHandler.java
   *
   * @author    <a href="mailto:[EMAIL PROTECTED]";>David Jencks</a>
   * @created   Wed Feb 27 21:53:15 2002
   * @version   $$
   */
  
  public class PropertyTagsHandler extends AbstractProgramElementTagsHandler
  {
  
        /**
         * Evaluates the body block for each managed attribute of current mbean.You may
         * set whether superclasses are examined also with the superclass attribute.
         * Finds attributes with getter, setter, or both. The getter and setter should
         * have javabean naming convention. (david jencks)
         *
         * @param template              The body of the block tag
         * @param attributes
         * @exception XDocletException  Description of Exception
         * @doc:tag                     type="block"
         * @doc:param                   name="superclasses" optional="true"
         *      values="true,false" description="Include properties of superclasses.
         *      True by default."
         * @doc:param                   name="tagName" optional="false"
         *      description="The required tag for methods to be considered a getter or
         *      setter. For example, jmx:managed-attribute."
         */
        public void forAllPropertiesWithTag( String template, Properties attributes ) 
throws XDocletException
        {
                Category cat = Log.getCategory( PropertyTagsHandler.class, 
"forAllPropertiesHavingTag" );
  
                cat.debug( "in forAllPropertiesHavingTag" );
  
                boolean superclasses = TypeConversionUtil.stringToBoolean( 
attributes.getProperty( "superclasses" ), true );
  
                String requiredTag = attributes.getProperty( "tagName" );
  
                if( requiredTag == null )
                {
                        throw new XDocletException( "missing required tag parameter in 
forAllPropertiesHavingTag" );
                }
  
                // end of if ()
  
                ClassDoc oldClass = getCurrentClass();
                List already = new ArrayList();
  
                //loop over superclasses
                do
                {
                        MethodDoc[] methods = getCurrentClass().methods();
                        MethodDoc old_cur_method = getCurrentMethod();
  
                        for( int j = 0; j < methods.length; j++ )
                        {
                                MethodDoc current_method = methods[j];
  
                                cat.debug( "looking at method " + 
current_method.name() );
                                if( DocletUtil.hasTag( current_method, requiredTag ) )
                                {
                                        setCurrentMethod( current_method );
  
                                        String property_name = 
MethodTagsHandler.getMethodNameWithoutPrefixFor( current_method );
  
                                        cat.debug( "property identified " + 
property_name );
  
                                        if( !already.contains( property_name ) )
                                        {
                                                generate( template );
  
                                                already.add( property_name );
                                        }
                                }
  
                                setCurrentMethod( old_cur_method );
  
                        }
                        // Add super class info
                        pushCurrentClass( getCurrentClass().superclass() );
                }while ( superclasses && getCurrentClass() != null );
  
                setCurrentClass( oldClass );
        }
  
        /**
         * The block tag <code>ifHasGetMethod</code> looks for a get method based on
         * the attribute name from the current method, sets the current method to that
         * get method, and applies the template if found. This is used to look for
         * getters for mbean managed attributes. The get method found may be the
         * current method.
         *
         * @param template              a <code>String</code> value
         * @param attributes            a <code>Properties</code> value
         * @exception XDocletException  if an error occurs
         * @doc:tag                     type="block"
         * @doc:param                   name="tagName" optional="false"
         *      description="The required tag for methods to be considered a getter or
         *      setter. For example, jmx:managed-attribute.
         */
        public void ifHasGetMethodWithTag( String template, Properties attributes ) 
throws XDocletException
        {
                MethodDoc get_method = getGetMethodWithTag( attributes );
  
                if( get_method != null )
                {
                        MethodDoc old_method = getCurrentMethod();
  
                        setCurrentMethod( get_method );
                        try
                        {
                                generate( template );
                        }
                        finally
                        {
                                setCurrentMethod( old_method );
                        }
                        // end of try-catch
                }
        }
  
        /**
         * The block tag <code>ifHasSetMethod</code> looks for a set method based on
         * the attribute name from the current method, sets the current method to that
         * set method, and applies the template if found. This is used to look for
         * setters for mbean managed attributes. The set method found may be the
         * current method.
         *
         * @param template              a <code>String</code> value
         * @param attributes            a <code>Properties</code> value
         * @exception XDocletException  if an error occurs
         * @doc:tag                     type="block"
         * @doc:param                   name="tagName" optional="false"
         *      description="The required tag for methods to be considered a getter or
         *      setter. For example, jmx:managed-attribute."
         */
        public void ifHasSetMethodWithTag( String template, Properties attributes ) 
throws XDocletException
        {
                MethodDoc set_method = getSetMethodWithTag( attributes );
  
                if( set_method != null )
                {
                        MethodDoc old_method = getCurrentMethod();
  
                        setCurrentMethod( set_method );
                        try
                        {
                                generate( template );
                        }
                        finally
                        {
                                setCurrentMethod( old_method );
                        }
                        // end of try-catch
                }
        }
  
        /**
         * The <code>propertyTypeWithTag</code> method figures out the type for the
         * current property with tag by looking for a getter, then a setter.
         *
         * @param attributes            a <code>Properties</code> value including the
         *      tagName required.
         * @return                      the <code>String</code> fully qualified name of
         *      the property type.
         * @exception XDocletException  if an error occurs
         * @doc:tag                     type="content"
         * @doc:param                   name="tagName" optional="false"
         *      description="The required tag for methods to be considered a getter or
         *      setter. For example, jmx:managed-attribute."
         */
        public String propertyTypeWithTag( Properties attributes ) throws 
XDocletException
        {
                MethodDoc getter = getGetMethodWithTag( attributes );
  
                if( getter != null )
                {
                        return MethodTagsHandler.getMethodTypeFor( getter );
                }
  
                // end of if ()
  
                MethodDoc setter = getSetMethodWithTag( attributes );
  
                if( setter != null )
                {
                        Parameter parameter = setter.parameters()[0];
  
                        return parameter.type().toString();
                }
                // end of if ()
                throw new XDocletException( "no current property found" );
        }
  
        /**
         * Searches for the MethodDoc of the method with name methodName and returns
         * it. Copied from MethodTagsHandler
         *
         * @param methodName  Description of Parameter
         * @return            The MethodDocForMethodName value
         */
        protected MethodDoc getMethodDocForMethodName( String methodName )
        {
                if( methodName != null )
                        return extractMethodDoc( getCurrentClass(), methodName );
  
                return null;
        }
  
        private MethodDoc getGetMethodWithTag( Properties attributes ) throws 
XDocletException
        {
                String requiredTag = attributes.getProperty( "tagName" );
  
                if( requiredTag == null )
                {
                        throw new XDocletException( "missing required tag parameter in 
forAllPropertiesHavingTag" );
                }
  
                // end of if ()
  
                MethodDoc current_method = getCurrentMethod();
  
                if( current_method.name().startsWith( "get" ) || 
current_method.name().startsWith( "is" ) )
                {
                        if( DocletUtil.hasTag( current_method, requiredTag ) )
                        {
                                return current_method;
                        }
                        // end of if ()
  
                        return null;
                }
  
                // end of if ()
  
                String attributeName = 
MethodTagsHandler.getMethodNameWithoutPrefixFor( current_method );
                MethodDoc getter = getMethodDocForMethodName( "get" + attributeName );
  
                if( getter != null )
                {
                        if( DocletUtil.hasTag( getter, requiredTag ) )
                        {
  
                                return getter;
                        }
                        // end of if ()
  
                        return null;
                }
                // end of if ()
                getter = getMethodDocForMethodName( "is" + attributeName );
                //not too safe.. should check it's boolean.
                if( getter != null && DocletUtil.hasTag( getter, requiredTag ) )
                {
                        return getter;
                }
                return null;
        }
  
        private MethodDoc getSetMethodWithTag( Properties attributes ) throws 
XDocletException
        {
                String requiredTag = attributes.getProperty( "tagName" );
  
                if( requiredTag == null )
                {
                        throw new XDocletException( "missing required tag parameter in 
forAllPropertiesHavingTag" );
                }
  
                // end of if ()
  
                MethodDoc current_method = getCurrentMethod();
  
                if( current_method.name().startsWith( "set" ) )
                {
                        if( DocletUtil.hasTag( current_method, requiredTag ) )
                        {
                                return current_method;
                        }
                        // end of if ()
  
                        return null;
                }
  
                // end of if ()
  
                String attributeName = 
MethodTagsHandler.getMethodNameWithoutPrefixFor( current_method );
                MethodDoc setter = getMethodDocForMethodName( "set" + attributeName );
  
                if( setter != null && DocletUtil.hasTag( setter, requiredTag ) )
                {
  
                        return setter;
                }
                // end of if ()
  
                return null;
        }
  
        //copied from MethodTagsHandler
        private MethodDoc extractMethodDoc( ClassDoc clazz, String methodName )
        {
                MethodDoc[] methods = clazz.methods();
  
                for( int i = 0; i < methods.length; i++ )
                {
                        if( methods[i].name().equals( methodName ) )
                        {
                                return methods[i];
                        }
                }
  
                return null;
        }
  
  }
  // PropertyTagsHandler
  
  
  

_______________________________________________
Xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to