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
