You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2002/08/29 23:22:52 UTC

cvs commit: jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester IDTest1.xml TestIDRead.java

rdonkin     2002/08/29 14:22:52

  Modified:    betwixt/src/java/org/apache/commons/betwixt/io
                        BeanCreateRule.java BeanReader.java
               betwixt/src/test/org/apache/commons/betwixt/digester
                        TestIDRead.java
  Added:       betwixt/src/test/org/apache/commons/betwixt/digester
                        IDTest1.xml
  Log:
  Added (basic) support for ID-IDREF matching in reading. More work needs to be done later for some advanced cases.
  
  Revision  Changes    Path
  1.10      +81 -17    jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanCreateRule.java
  
  Index: BeanCreateRule.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanCreateRule.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- BeanCreateRule.java	29 Aug 2002 19:16:17 -0000	1.9
  +++ BeanCreateRule.java	29 Aug 2002 21:22:52 -0000	1.10
  @@ -113,29 +113,52 @@
       private Class beanClass;
       /** The prefix added to digester rules */
       private String pathPrefix;
  +    /** Beans digested indexed by <code>ID</code> */
  +    private Map beansById = new HashMap();
  +    /** Use id's to match beans */
  +    private boolean matchIDs = true;
       
  -    public BeanCreateRule(ElementDescriptor descriptor, Class beanClass, String pathPrefix) {
  -        this.descriptor = descriptor;
  -        this.context = new Context();
  -        this.beanClass = beanClass;
  -        this.pathPrefix = pathPrefix;
  -        if (log.isTraceEnabled()) {
  -            log.trace("Created bean create rule");
  -            log.trace("Descriptor=" + descriptor);
  -            log.trace("Class=" + beanClass);
  -            log.trace("Path prefix=" + pathPrefix);
  -        }
  +    public BeanCreateRule(
  +                            ElementDescriptor descriptor, 
  +                            Class beanClass, 
  +                            String pathPrefix, 
  +                            boolean matchIDs) {
  +        this( 
  +                descriptor, 
  +                beanClass, 
  +                new Context(), 
  +                pathPrefix,
  +                matchIDs);
  +    }
  +    
  +    public BeanCreateRule(ElementDescriptor descriptor, Class beanClass, boolean matchIDs) {
  +        this( descriptor, beanClass, descriptor.getQualifiedName() + "/" , matchIDs);
       }
       
  -    public BeanCreateRule(ElementDescriptor descriptor, Class beanClass) {
  -        this( descriptor, beanClass, descriptor.getQualifiedName() + "/" );
  +    public BeanCreateRule(
  +                            ElementDescriptor descriptor, 
  +                            Context context, 
  +                            String pathPrefix,
  +                            boolean matchIDs) {
  +        this( 
  +                descriptor, 
  +                descriptor.getSingularPropertyType(), 
  +                context, 
  +                pathPrefix,
  +                matchIDs);
       }
       
  -    public BeanCreateRule(ElementDescriptor descriptor, Context context, String pathPrefix) {
  +    private BeanCreateRule(
  +                            ElementDescriptor descriptor, 
  +                            Class beanClass,
  +                            Context context, 
  +                            String pathPrefix,
  +                            boolean matchIDs) {
           this.descriptor = descriptor;        
           this.context = context;
  -        this.beanClass = descriptor.getSingularPropertyType();
  +        this.beanClass = beanClass;
           this.pathPrefix = pathPrefix;
  +        this.matchIDs = matchIDs;
           if (log.isTraceEnabled()) {
               log.trace("Created bean create rule");
               log.trace("Descriptor=" + descriptor);
  @@ -144,6 +167,7 @@
           }
       }
       
  +    
           
       // Rule interface
       //-------------------------------------------------------------------------    
  @@ -168,6 +192,8 @@
               }
           }
           
  +
  +        
           // XXX: if a single rule instance gets reused and nesting occurs
           // XXX: we should probably use a stack of booleans to test if we created a bean
           // XXX: or let digester take nulls, which would be easier for us ;-)
  @@ -223,6 +249,17 @@
                   }
                   
                   addChildRules();
  +                
  +                // add bean for ID matching
  +                if ( matchIDs ) {
  +                    // XXX need to support custom ID attribute names
  +                    // XXX i have a feeling that the current mechanism might need to change
  +                    // XXX so i'm leaving this till later
  +                    String id = attributes.getValue( "id" );
  +                    if ( id != null ) {
  +                        beansById.put( id, instance );
  +                    }
  +                }
               }
           }
       }
  @@ -254,12 +291,39 @@
           }
       }
   
  +    /** 
  +     * Tidy up.
  +     */
  +    public void finish() {
  +        // clear beans map
  +        beansById.clear();
  +    }
  +
   
       // Implementation methods
       //-------------------------------------------------------------------------    
       
       /** Factory method to create new bean instances */
       protected Object createBean(Attributes attributes) throws Exception {
  +        //
  +        // See if we've got an IDREF
  +        //
  +        // XXX This should be customizable but i'm not really convinced by the existing system
  +        // XXX maybe it's going to have to change so i'll use 'idref' for nows
  +        //
  +        if ( matchIDs ) {
  +            String idref = attributes.getValue( "idref" );
  +            if ( idref != null ) {
  +                // XXX need to check up about ordering
  +                // XXX this is a very simple system that assumes that id occurs before idrefs
  +                // XXX would need some thought about how to implement a fuller system
  +                Object bean = beansById.get( idref );
  +                if ( bean != null ) {
  +                    return bean;
  +                }
  +            }
  +        }
  +        
           try {
               return beanClass.newInstance();
           }
  @@ -327,7 +391,7 @@
                               path = "*/"+desc[0].getQualifiedName();
                           }
                       }
  -                    Rule rule = new BeanCreateRule( childDescriptor, context, path);
  +                    Rule rule = new BeanCreateRule( childDescriptor, context, path, matchIDs);
                       addRule(path, rule);
                       continue;
                   }
  @@ -361,7 +425,7 @@
                               addPrimitiveTypeRule(path, childDescriptor);
                           }
                           else {
  -                            Rule rule = new BeanCreateRule( childDescriptor, context, path + '/' );
  +                            Rule rule = new BeanCreateRule( childDescriptor, context, path + '/', matchIDs );
                               addRule( path, rule );
                           }
                       }
  
  
  
  1.4       +17 -1     jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanReader.java
  
  Index: BeanReader.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/BeanReader.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BeanReader.java	29 Aug 2002 19:28:50 -0000	1.3
  +++ BeanReader.java	29 Aug 2002 21:22:52 -0000	1.4
  @@ -96,6 +96,8 @@
       private Log log = LogFactory.getLog( BeanReader.class );
       /** The registered classes */
       private Set registeredClasses = new HashSet();
  +    /** Should the reader use <code>ID</code>'s to match */
  +    private boolean matchIDs = true;
       
       /**
        * Construct a new BeanReader with default properties.
  @@ -203,6 +205,20 @@
           this.log = log;
           setLogger(log);
       }
  +    
  +    /** 
  +     * Should the reader use <code>ID</code> attributes to match beans.
  +     */
  +    public boolean getMatchIDs() {
  +        return matchIDs;
  +    }
  +    
  +    /**
  +     * Set whether the read should use <code>ID</code> attributes to match beans.
  +     */
  +    public void setMatchIDs(boolean matchIDs) {
  +        this.matchIDs = matchIDs;
  +    }
           
       // Implementation methods
       //-------------------------------------------------------------------------    
  @@ -211,7 +227,7 @@
        * Adds a new bean create rule for the specified path
        */
       protected void addBeanCreateRule( String path, ElementDescriptor elementDescriptor, Class beanClass ) {
  -        Rule rule = new BeanCreateRule( elementDescriptor, beanClass, path + "/" );
  +        Rule rule = new BeanCreateRule( elementDescriptor, beanClass, path + "/" , matchIDs);
           addRule( path, rule );
   
           if ( log.isDebugEnabled() ) {
  
  
  
  1.2       +55 -6     jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/TestIDRead.java
  
  Index: TestIDRead.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/TestIDRead.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestIDRead.java	29 Aug 2002 19:28:50 -0000	1.1
  +++ TestIDRead.java	29 Aug 2002 21:22:52 -0000	1.2
  @@ -124,9 +124,6 @@
   //        reader.getXMLIntrospector().setLog(log);
           
           reader.registerBeanClass( IDBean.class );
  -        //reader.registerBeanClass( "IDBean/children/IDBean", IDBean.class );
  -
  -        System.out.println(reader.getRules().rules());
   
           InputStream in = new FileInputStream( 
               getTestFile("src/test/org/apache/commons/betwixt/digester/SimpleReadTest.xml") );
  @@ -144,6 +141,58 @@
               
               IDBean gamma = (IDBean) alpha.getChildren().get(1);
               assertEquals("Wrong name (B)", "gamma" ,  gamma.getName());
  +        }
  +        finally {
  +            in.close();
  +        }
  +    }
  +    
  +    public void testIDRead() throws Exception {
  +        
  +        BeanReader reader = new BeanReader();
  +        
  +//         logging just for this method
  +//        SimpleLog log = new SimpleLog("[XMLIntrospectorHelper]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        XMLIntrospectorHelper.setLog(log);
  +//        
  +//        log = new SimpleLog("[BeanCreateRule]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        BeanCreateRule.setLog(log);
  +//
  +//        log = new SimpleLog("[BeanReader]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);        
  +//        reader.setLog(log);
  +//
  +//        log = new SimpleLog("[XMLIntrospector]");
  +//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
  +//        reader.getXMLIntrospector().setLog(log);
  +        
  +        reader.registerBeanClass( IDBean.class );
  +
  +        InputStream in = new FileInputStream( 
  +            getTestFile("src/test/org/apache/commons/betwixt/digester/IDTest1.xml") );
  +            
  +        try {
  +            Object obj = reader.parse( in );
  +            
  +            assertEquals("Read bean type is incorrect", true, (obj instanceof IDBean) );
  +            IDBean alpha = (IDBean) obj;
  +            
  +            assertEquals("Wrong list size (A)", 2 ,  alpha.getChildren().size());
  +            
  +            IDBean beta = (IDBean) alpha.getChildren().get(0);
  +            assertEquals("Wrong name (A)", "beta" ,  beta.getName());
  +            
  +            IDBean gamma = (IDBean) alpha.getChildren().get(1);
  +            assertEquals("Wrong name (B)", "gamma" ,  gamma.getName());
  +            assertEquals("Wrong list size (B)", 2 ,  gamma.getChildren().size());
  +            
  +            IDBean sonOfGamma = (IDBean) gamma.getChildren().get(1);
  +            assertEquals("Wrong id (A)", "two" ,  sonOfGamma.getId());
  +            assertEquals("Wrong name (C)", "beta" ,  sonOfGamma.getName());
  +            
  +            assertEquals("IDREF bean not equal to ID bean", beta,  sonOfGamma);
           }
           finally {
               in.close();
  
  
  
  1.1                  jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/digester/IDTest1.xml
  
  Index: IDTest1.xml
  ===================================================================
  <?xml version="1.0"?>
  <IDBean id="1">
      <name>alpha</name>
      <children>
          <IDBean id="2">
              <name>beta</name>
              <children/>
              <id>two</id>
          </IDBean>
          <IDBean id="3">
              <name>gamma</name>
              <children>	
                  <IDBean id="4">
                      <name>epsilon</name>
                      <children/>
                      <id>four</id>	
                  </IDBean>
                  <IDBean idref="2"/>
              </children>
              <id>three</id>
          </IDBean>
      </children>
      <id>one</id>
  </IDBean>
  
  

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