rdonkin     2004/02/21 08:34:57

  Modified:    betwixt/src/java/org/apache/commons/betwixt/io/read Tag:
                        REFACTORING-BRANCH_2004-01-13 BeanBindAction.java
                        ReadContext.java
  Log:
  Refactoring to simplify algorithm
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.2.4   +22 -143   
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/Attic/BeanBindAction.java
  
  Index: BeanBindAction.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/Attic/BeanBindAction.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- BeanBindAction.java       26 Jan 2004 22:20:01 -0000      1.1.2.3
  +++ BeanBindAction.java       21 Feb 2004 16:34:57 -0000      1.1.2.4
  @@ -61,8 +61,6 @@
    */
   package org.apache.commons.betwixt.io.read;
   
  -import java.util.Iterator;
  -import java.util.List;
   import java.util.Map;
   
   import org.apache.commons.betwixt.AttributeDescriptor;
  @@ -71,7 +69,6 @@
   import org.apache.commons.betwixt.XMLBeanInfo;
   import org.apache.commons.betwixt.XMLIntrospector;
   import org.apache.commons.betwixt.expression.Updater;
  -import org.apache.commons.collections.IteratorUtils;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   
  @@ -122,110 +119,31 @@
           update(context, instance);
       }
   
  -    private void updateCurrentDescriptor(ReadContext context, Object value)
  -        throws Exception {
  -        ElementDescriptor childDescriptor = context.getCurrentDescriptor();
  -        if (childDescriptor != null) {
  -            Updater updater = childDescriptor.getUpdater();
  -            if (updater != null) {
  -                updater.update(context, value);
  -            }
  -        }
  -    }
  -
       private void update(ReadContext context, Object value) throws Exception {
           Log log = context.getLog();
           boolean popped = false;
           //TODO: add dyna-bean support!
           // probably refactoring needed
  -        Iterator relativePathIterator =
  -            context.getRelativeElementPathIterator();
  -        if (relativePathIterator.hasNext()) {
  -            ElementDescriptor childDescriptor = context.getCurrentDescriptor();
  -            if (childDescriptor != null) {
  -                Updater updater = childDescriptor.getUpdater();
  -                if (updater != null) {
  -                    updater.update(context, value);
  -                } else {
  -                    // this is a workaround to make the tests run
  -                    // it will be replaced when proper support for maps is added
  -                    List list =
  -                        IteratorUtils.toList(
  -                            context.getRelativeElementPathIterator());
  -                    if (list.size() > 0) {
  -                        list.remove(list.size() - 1);
  -                        XMLBeanInfo lastMappedClazzInfo =
  -                            context.getLastMappedClassXMLBeanInfo();
  -                        childDescriptor =
  -                            lastMappedClazzInfo
  -                                .getElementDescriptor()
  -                                .getElementDescriptor(
  -                                list.iterator());
  -                        updater = childDescriptor.getUpdater();
  -                        if (updater != null) {
  -
  -                            updater.update(context, value);
  -
  -                        } else {
  -
  -                            String poppedElement = context.popElement();
  -                            popped = true;
  -                            updateCurrentDescriptor(context, value);
  -                        }
  -
  -                    } else {
  -                        String poppedElement = context.popElement();
  -                        popped = true;
  -                        updateCurrentDescriptor(context, value);
  -                    }
  -                }
  +        
  +        ElementDescriptor currentDescriptor = context.getCurrentDescriptor();
  +        ElementDescriptor parentDescriptor = context.getParentElementDescriptor();
  +        Updater updater = currentDescriptor.getUpdater();
  +        if (updater == null) {
  +            if (parentDescriptor != null) {
  +                updater = parentDescriptor.getUpdater();         
               }
  -        } else {
  -            // in here when we need to get hold of the parent class
  -            String element = context.popElement();
  +            String poppedElement = context.popElement();
               popped = true;
  -            XMLBeanInfo lastMappedClazzInfo =
  -                context.getLastMappedClassXMLBeanInfo();
  -            if (lastMappedClazzInfo != null) {
  -
  -                ElementDescriptor baseDescriptor =
  -                    lastMappedClazzInfo.getElementDescriptor();
  -                List list =
  -                    IteratorUtils.toList(
  -                        context.getRelativeElementPathIterator());
  -                list.add(element);
  -                ElementDescriptor childDescriptor =
  -                    lastMappedClazzInfo
  -                        .getElementDescriptor()
  -                        .getElementDescriptor(
  -                        list.iterator());
  -
  -                if (childDescriptor != null) {
  -                    list.remove(element);
  -                    Iterator iterator = list.iterator();
  -                    updateChild(
  -                        context,
  -                        value,
  -                        lastMappedClazzInfo,
  -                        childDescriptor,
  -                        iterator,
  -                        true);
  -                } else {
  -                    childDescriptor =
  -                        context.getRelativePathElementDescriptor();
  -                    Iterator iterator = context.getParentElementPathIterator();
  -
  -                    if (childDescriptor != null) {
  -                        updateChild(
  -                            context,
  -                            value,
  -                            lastMappedClazzInfo,
  -                            childDescriptor,
  -                            iterator,
  -                            false);
  -                    }
  +        }
  +        
  +        if ( updater == null ) {
  +            if (!context.isAtRootElement() && !context.isStackEmpty()) {
  +                if ( context.getLog().isDebugEnabled() ) {
  +                    context.getLog().debug("Cannot find updater for " + 
context.getCurrentElement());
                   }
               }
  +        } else {
  +            updater.update(context, value);
           }
   
           if (!popped) {
  @@ -233,46 +151,7 @@
           }
       }
   
  -    private void updateChild(
  -        ReadContext context,
  -        Object value,
  -        XMLBeanInfo lastMappedClazzInfo,
  -        ElementDescriptor descriptor,
  -        Iterator iterator,
  -        boolean useOriginal) {
  -
  -        Updater updater = descriptor.getUpdater();
  -        if (updater != null) {
  -            updater.update(context, value);
  -
  -        } else {
  -
  -            ElementDescriptor childDescriptor =
  -                lastMappedClazzInfo
  -                    .getElementDescriptor()
  -                    .getElementDescriptor(
  -                    iterator);
  -            if (childDescriptor == null
  -                || childDescriptor.getUpdater() == null) {
  -                if (useOriginal) {
  -
  -                    childDescriptor =
  -                        lastMappedClazzInfo.getElementDescriptor().findParent(
  -                            descriptor);
  -                } else {
  -                    childDescriptor =
  -                        lastMappedClazzInfo.getElementDescriptor().findParent(
  -                            childDescriptor);
  -                }
  -            }
  -            if (childDescriptor != null) {
  -                updater = childDescriptor.getUpdater();
  -                if (updater != null) {
  -                    updater.update(context, value);
  -                }
  -            }
  -        }
  -    }
  + 
   
       ElementDescriptor getElementDescriptor(
           ElementDescriptor propertyDescriptor,
  
  
  
  1.4.2.3   +62 -6     
jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
  
  Index: ReadContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/ReadContext.java,v
  retrieving revision 1.4.2.2
  retrieving revision 1.4.2.3
  diff -u -r1.4.2.2 -r1.4.2.3
  --- ReadContext.java  15 Jan 2004 20:21:21 -0000      1.4.2.2
  +++ ReadContext.java  21 Feb 2004 16:34:57 -0000      1.4.2.3
  @@ -281,11 +281,12 @@
                ElementDescriptor result = null;
                XMLBeanInfo lastMappedClazzInfo = getLastMappedClassXMLBeanInfo();
                if (lastMappedClazzInfo != null) {
  +            Iterator it = getParentElementPathIterator();
  +            Object test = it.next();
                        result =
                                lastMappedClazzInfo
                                        .getElementDescriptor()
  -                                     .getElementDescriptor(
  -                                     getParentElementPathIterator());
  +                                     .getElementDescriptor(it);
                }
                return result;
        }
  @@ -312,6 +313,56 @@
                }
                return lastMapped;
        }
  +    
  +    
  +    private Class getParentClass()
  +    {
  +        Class result = null;
  +        boolean first = true;
  +        for (int i = 0, size = elementMappingStack.size();
  +            i < size;
  +            i++) {
  +            Object entry = elementMappingStack.peek(i);
  +            if (entry instanceof Class) {
  +                if (first) {
  +                    first = false;
  +                } else {
  +                
  +                    result = (Class) entry;
  +                    break;
  +                }
  +            }
  +        }
  +        return result;
  +    }
  +    
  +    private XMLBeanInfo getParentXMLBeanInfo() throws IntrospectionException {
  +        XMLBeanInfo result = null;
  +        Class parentClass = getParentClass();
  +        if ( parentClass != null ) {
  +            result = getXMLIntrospector().introspect(parentClass);
  +        }
  +        return result;
  +    }
  +    
  +
  +    /**
  +     * @return
  +     */
  +    public ElementDescriptor getParentElementDescriptor() throws 
IntrospectionException {
  +        ElementDescriptor parentDescriptor = null;
  +        XMLBeanInfo parentInfo = getParentXMLBeanInfo();
  +        if ( parentInfo != null ) {
  +            Iterator it = getParentElementPathIterator();
  +            parentDescriptor =
  +                parentInfo
  +                    .getElementDescriptor()
  +                    .getElementDescriptor(it);            
  +        }
  +        
  +        return parentDescriptor;
  +    }
  +    
   
        public XMLBeanInfo getLastMappedClassXMLBeanInfo()
                throws IntrospectionException {
  @@ -348,6 +399,10 @@
                return (elementMappingStack.size() == 1);
        }
   
  +    public boolean isStackEmpty() {
  +        return (elementMappingStack.size() == 0);
  +    }
  +
   
        /**
          * Marks the element name stack with a class mapping.
  @@ -562,5 +617,6 @@
                        }
                }
        }
  +
   
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to