Update of /cvsroot/xdoclet/xdoclet2/src/java/xdoclet/sdk/beans
In directory sc8-pr-cvs1:/tmp/cvs-serv22426/src/java/xdoclet/sdk/beans

Modified Files:
        BeanInfo.vm BeanInfoPlugin.java 
Log Message:
-Improved JavaBeans support (which is the metadata layer for XDoclet configuration)
-Made tests able to run in unforked mode

Index: BeanInfo.vm
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet2/src/java/xdoclet/sdk/beans/BeanInfo.vm,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** BeanInfo.vm 8 Mar 2003 14:21:10 -0000       1.1
--- BeanInfo.vm 12 Mar 2003 23:41:03 -0000      1.2
***************
*** 1,2 ****
--- 1,6 ----
+ ## Template for BeanInfo classes
+ ## Author: Aslak Hellesoy
+ ## Author: Laurent Etiemble ([EMAIL PROTECTED])
+ ## Version: $Revision$
  package $destinationPackageName;
  
***************
*** 11,17 ****
  import java.beans.SimpleBeanInfo;
  import java.lang.reflect.Method;
! import java.util.Vector;
! 
  public class $destinationUnqualifiedClassName extends SimpleBeanInfo {
  #set( $beanTag = $class.doc.getTag("bean.class", false) )
  
--- 15,34 ----
  import java.beans.SimpleBeanInfo;
  import java.lang.reflect.Method;
! import java.util.List;
! import java.util.ArrayList;
! import java.util.Map;
! import java.util.HashMap;
! 
! /**
!  * This BeanInfo class includes information from JavaDoc tags in the
!  * bean it describes.
!  */
  public class $destinationUnqualifiedClassName extends SimpleBeanInfo {
+ 
+     /**
+      * The BeanInfo provided by java.beans.Introspector.
+      */
+     private final BeanInfo _introspectedBeanInfo;
+ 
  #set( $beanTag = $class.doc.getTag("bean.class", false) )
  
***************
*** 37,50 ****
      private final BeanDescriptor _beanDescriptor = new BeanDescriptor( 
${class.qualifiedName}.class );
  
! #end   
      public $destinationUnqualifiedClassName() throws 
java.beans.IntrospectionException {
  #if( $beanTag.getAttributeValue("displayName") )
          _beanDescriptor.setDisplayName("$beanTag.getAttributeValue("displayName")");
  #end
! #if( $beanTag.getAttributeValue("expert") )
!         _beanDescriptor.setExpert("$beanTag.getAttributeValue("expert")");
  #end
  #if( $beanTag.getAttributeValue("hidden") )
!         _beanDescriptor.setHidden("$beanTag.getAttributeValue("hidden")");
  #end
  #if( $beanTag.getAttributeValue("name") )
--- 54,81 ----
      private final BeanDescriptor _beanDescriptor = new BeanDescriptor( 
${class.qualifiedName}.class );
  
! #end
!     private MethodDescriptor[] _methodDescriptors;
!     private PropertyDescriptor[] _propertyDescriptors;
! 
      public $destinationUnqualifiedClassName() throws 
java.beans.IntrospectionException {
+         // Let the Introspector do the dirty work.
+         _introspectedBeanInfo = Introspector.getBeanInfo( 
${class.qualifiedName}.class, Introspector.IGNORE_ALL_BEANINFO );
+ 
+         createPropertyDescriptors();
+         try {
+             createMethodDescriptors();
+         } catch( NoSuchMethodException e ) {
+             throw new IntrospectionException( e.getMessage() );
+         }
+ 
+ try{
  #if( $beanTag.getAttributeValue("displayName") )
          _beanDescriptor.setDisplayName("$beanTag.getAttributeValue("displayName")");
  #end
! #if( $beanTag.getAttributeValue("expert") == true )
!         _beanDescriptor.setExpert( $beanTag.getAttributeValue("expert") );
  #end
  #if( $beanTag.getAttributeValue("hidden") )
!         _beanDescriptor.setHidden( $beanTag.getAttributeValue("hidden") );
  #end
  #if( $beanTag.getAttributeValue("name") )
***************
*** 65,74 ****
          String order = info.getBeanDescriptor().getValue("propertyorder") == null ? 
"" : (String) info.getBeanDescriptor().getValue("propertyorder");
          PropertyDescriptor[] pd = getPropertyDescriptors();
!         for (int i = 0; i != pd.length; i++) {
!             if (order.indexOf(pd[i].getName()) == -1) {
!                 order = order + (order.length() == 0 ? "" : ":") + pd[i].getName();
              }
          }
          getBeanDescriptor().setValue("propertyorder", order);
      }
  
--- 96,109 ----
          String order = info.getBeanDescriptor().getValue("propertyorder") == null ? 
"" : (String) info.getBeanDescriptor().getValue("propertyorder");
          PropertyDescriptor[] pd = getPropertyDescriptors();
!         if( pd != null ) {
!             for (int i = 0; i != pd.length; i++) {
!                 if (order.indexOf(pd[i].getName()) == -1) {
!                     order = order + (order.length() == 0 ? "" : ":") + 
pd[i].getName();
!                 }
              }
          }
          getBeanDescriptor().setValue("propertyorder", order);
+ 
+ }catch(Throwable t){t.printStackTrace();}
      }
  
***************
*** 79,90 ****
       */
      public BeanInfo[] getAdditionalBeanInfo() {
!         Vector bi = new Vector();
          BeanInfo[] result = null;
  #if( $beanTag.getAttributeValue("stopClass") )
          for (Class cl = ${class.qualifiedName}.class.getSuperclass(); 
!cl.equals($beanTag.getAttributeValue("stopClass").class.getSuperclass()); cl = 
cl.getSuperclass()) {
!            bi.addElement(Introspector.getBeanInfo(cl));
          }
!         result = new BeanInfo[bi.size()];
!         bi.copyInto(result);
  #end
          return result;
--- 114,124 ----
       */
      public BeanInfo[] getAdditionalBeanInfo() {
!         List bi = new ArrayList();
          BeanInfo[] result = null;
  #if( $beanTag.getAttributeValue("stopClass") )
          for (Class cl = ${class.qualifiedName}.class.getSuperclass(); 
!cl.equals($beanTag.getAttributeValue("stopClass").class.getSuperclass()); cl = 
cl.getSuperclass()) {
!            bi.add(Introspector.getBeanInfo(cl));
          }
!         result = (BeanInfo[]) bi.toAray(mew BeanInfo[bi.size()]);
  #end
          return result;
***************
*** 118,120 ****
--- 152,270 ----
      }
  
+ ## Here we create PropertyDescriptors. We will use the PropertyDescriptors
+ ## provided by Introspector, set them all to hidden unless they are
+ ## described in the source code.
+     private void createPropertyDescriptors() {
+         // Map the existing property descriptors for easier manipulation.
+         Map propertyMap = new HashMap();
+ 
+         _propertyDescriptors = _introspectedBeanInfo.getPropertyDescriptors();
+         for( int i = 0; i < _propertyDescriptors.length; i++ ) {
+             // Set them to expert. We'll adjust that further down.
+             _propertyDescriptors[ i ].setHidden( true );
+             propertyMap.put( _propertyDescriptors[ i ].getName(), 
_propertyDescriptors[ i ] );
+         }
+         PropertyDescriptor propertyDescriptor = null;
+ #foreach( $method in $class.getMethods(true) )
+ #if( $method.public && $method.propertyName && $method.doc.hasTag("bean.property", 
true) )
+ #set( $beanPropertyTag = $method.doc.getTag("bean.property", true) )
+         propertyDescriptor = (PropertyDescriptor) propertyMap.get( 
"$method.propertyName" );
+ #if( $beanPropertyTag.getAttributeValue("name") )
+         propertyDescriptor.setName( "$beanPropertyTag.getAttributeValue("name")" );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("shortDescription") )
+         propertyDescriptor.setShortDescription( 
"$beanPropertyTag.getAttributeValue("shortDescription")" );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("displayName") )
+         propertyDescriptor.setDisplayName( 
"$beanPropertyTag.getAttributeValue("displayName")" );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("expert") )
+         propertyDescriptor.setExpert( $beanPropertyTag.getAttributeValue("expert") );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("hidden") )
+         propertyDescriptor.setExpert( $beanPropertyTag.getAttributeValue("hidden") );
+ #else
+         propertyDescriptor.setHidden( false );
+ #end
+ #foreach($attributeTag in $method.doc.getTags("bean.attribute", false))
+         
propertyDescriptor.setValue("$attributeTag.getAttributeValue("name")","$attributeTag.getAttributeValue("value")");
+ #end
+ #end
+ #end
+     }
+ 
+     public PropertyDescriptor[] getPropertyDescriptors() {
+         return _propertyDescriptors;
+     }
+ 
+     private void createMethodDescriptors() throws NoSuchMethodException {
+         // Map the existing method descriptors for easier manipulation.
+         Map methodMap = new HashMap();
+ 
+         MethodDescriptor[] methodDescriptors = 
_introspectedBeanInfo.getMethodDescriptors();
+         for( int i = 0; i < methodDescriptors.length; i++ ) {
+             // Set them to expert. We'll adjust that further down.
+             methodDescriptors[ i ].setHidden( true );
+             methodMap.put( methodDescriptors[ i ].getMethod(), methodDescriptors[ i 
] );
+         }
+         Method method = null;
+         // The original introspected MethodDescriptor
+         MethodDescriptor methodDescriptor = null;
+         // The new methodDescriptor
+         MethodDescriptor methodDescriptor2 = null;
+         ParameterDescriptor[] parameterDescriptors = null;
+ #foreach( $method in $class.getMethods(true) )
+ #if( $method.public && $method.doc.hasTag("bean.method", true) )
+ #set( $beanMethodTag = $method.doc.getTag("bean.method", true) )
+         method = ${class.type}.getMethod( "${method.name}", new Class[] 
{${method.parameterTypes}} );
+         methodDescriptor = (MethodDescriptor) methodMap.get( method );
+ 
+         // Make a new MethodDescriptor with ParameterDescriptors
+         parameterDescriptors = new 
ParameterDescriptor[method.getParameterTypes().length];
+ #foreach( $parameter in $method.parameters )
+         parameterDescriptors[${velocityCount}] = new ParameterDescriptor();
+         parameterDescriptors[${velocityCount}].setName("${parameter.name}");
+         
parameterDescriptors[${velocityCount}].setShortDescription("${parameter.description}");
+         
parameterDescriptors[${velocityCount}].setDisplayName("${parameter.description}");
+ #end
+         methodDescriptor2 = new MethodDescriptor( method, parameterDescriptors );
+         methodMap.put( method, methodDescriptor2 );
+ 
+ #if( $beanPropertyTag.getAttributeValue("name") )
+         methodDescriptor2.setName( "$beanMethodTag.getAttributeValue("name")" );
+ #else
+         methodDescriptor2.setName( methodDescriptor.getName() );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("shortDescription") )
+         methodDescriptor2.setShortDescription( 
"$beanMethodTag.getAttributeValue("shortDescription")" );
+ #else
+         methodDescriptor2.setShortDescription( 
methodDescriptor.getShortDescription() );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("displayName") )
+         methodDescriptor2.setDisplayName( 
"$beanMethodTag.getAttributeValue("displayName")" );
+ #else
+         methodDescriptor2.setDisplayName( methodDescriptor.getDisplayName() );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("expert") )
+         methodDescriptor2.setExpert( $beanPropertyTag.getAttributeValue("expert") );
+ #else
+         methodDescriptor2.setExpert( methodDescriptor.isExpert() );
+ #end
+ #if( $beanPropertyTag.getAttributeValue("hidden") )
+         methodDescriptor2.setExpert( $beanPropertyTag.getAttributeValue("hidden") );
+ #else
+         methodDescriptor2.setHidden( false );
+ #end
+ #foreach($attributeTag in $method.doc.getTags("bean.attribute", false))
+         
methodDescriptor2.setValue("$attributeTag.getAttributeValue("name")","$attributeTag.getAttributeValue("value")");
+ #end
+ #end
+ #end
+         List methodList = new ArrayList(methodMap.values());
+         _methodDescriptors = (MethodDescriptor[]) methodList.toArray(new 
MethodDescriptor[methodMap.size()]);
+     }
+ 
+     public MethodDescriptor[] getMethodDescriptors() {
+         return _methodDescriptors;
+     }
  }

Index: BeanInfoPlugin.java
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet2/src/java/xdoclet/sdk/beans/BeanInfoPlugin.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** BeanInfoPlugin.java 8 Mar 2003 14:21:11 -0000       1.1
--- BeanInfoPlugin.java 12 Mar 2003 23:41:03 -0000      1.2
***************
*** 11,17 ****
--- 11,19 ----
   * @ant.element display-name="BeanInfo" name="BeanInfo" parent="xdoclet.XDoclet"
   * @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Helles&oslash;y</a>
+  * @author        Laurent Etiemble ([EMAIL PROTECTED])
   * @version $Revision$
   */
  public class BeanInfoPlugin extends VelocityPlugin {
+     
      public BeanInfoPlugin() {
          // We don't want inner classes, classes should be public and not abstract.



-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open! 
Get cracking and register here for some mind boggling fun and 
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to