On 2002.02.28 16:25:53 -0500 Ara Abrahamian wrote: > And why there's no simple forAllProeprties method? What if you just want > to iterate on getter/setters and not getter/setters having @tag x?
For my purposes at the moment, I applied YAGNI and KISS. Do you have a use case? david jencks > > Ara. > > > -----Original Message----- > > From: [EMAIL PROTECTED] [mailto:xdoclet-devel- > > [EMAIL PROTECTED]] On Behalf Of David Jencks > > Sent: Thursday, February 28, 2002 7:59 PM > > To: [EMAIL PROTECTED] > > Subject: [Xdoclet-devel] CVS update: xdoclet/core/src/xdoclet/tags > > PropertyTagsHandler.java > > > > 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 > > > _________________________________________________________ > Do You Yahoo!? > Get your free @yahoo.com address at http://mail.yahoo.com > > > _______________________________________________ > Xdoclet-devel mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/xdoclet-devel > > _______________________________________________ Xdoclet-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/xdoclet-devel
