You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by ra...@apache.org on 2004/11/15 03:42:29 UTC

cvs commit: xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema SchemaPropertyImpl.java SchemaTypeImpl.java SchemaTypeSystemImpl.java StscJavaizer.java

radup       2004/11/14 18:42:29

  Modified:    v2/external/lib oldxbean.jar
               v2/src/typeimpl/org/apache/xmlbeans/impl/schema
                        SchemaPropertyImpl.java SchemaTypeImpl.java
                        SchemaTypeSystemImpl.java StscJavaizer.java
  Log:
  Change the .xsb format so that setter delimiters are no longer saved,
  but are computed on-demand, which saves quite a bit of time when loading
  large .xsb's.
  
  Revision  Changes    Path
  1.14      +4834 -4786xml-xmlbeans/v2/external/lib/oldxbean.jar
  
  	<<Binary file>>
  
  
  1.4       +10 -3     xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java
  
  Index: SchemaPropertyImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SchemaPropertyImpl.java	12 Feb 2004 20:06:21 -0000	1.3
  +++ SchemaPropertyImpl.java	15 Nov 2004 02:42:29 -0000	1.4
  @@ -116,10 +116,17 @@
       }
   
       public QNameSet getJavaSetterDelimiter()
  -        { return _javaSetterDelimiter == null ? QNameSet.EMPTY : _javaSetterDelimiter; }
  +    {
  +        if (_isAttribute)
  +            return QNameSet.EMPTY;
  +        if (_javaSetterDelimiter == null)
  +            ((SchemaTypeImpl) getContainerType()).assignJavaElementSetterModel();
  +        assert _javaSetterDelimiter != null;
  +        return _javaSetterDelimiter;
  +    }
   
  -    public void setJavaSetterDelimiter(QNameSet set)
  -        { mutate(); _javaSetterDelimiter = set; }
  +    void setJavaSetterDelimiter(QNameSet set)
  +        { _javaSetterDelimiter = set; }
   
       public QName[] acceptedNames()
       { 
  
  
  
  1.16      +125 -0    xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
  
  Index: SchemaTypeImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- SchemaTypeImpl.java	1 Oct 2004 04:35:01 -0000	1.15
  +++ SchemaTypeImpl.java	15 Nov 2004 02:42:29 -0000	1.16
  @@ -1463,6 +1463,131 @@
       public void setBuiltinTypeCode(int builtinTypeCode)
           { assertResolving(); _builtinTypeCode = builtinTypeCode; }
   
  +    synchronized void assignJavaElementSetterModel()
  +    {
  +        // To compute the element setter model, we need to compute the
  +        // delimiting elements for each element.
  +
  +        SchemaProperty[] eltProps = getElementProperties();
  +        SchemaParticle contentModel = getContentModel();
  +        Map state = new HashMap();
  +        QNameSet allContents = computeAllContainedElements(contentModel, state);
  +
  +        for (int i = 0; i < eltProps.length; i++)
  +        {
  +            SchemaPropertyImpl sImpl = (SchemaPropertyImpl)eltProps[i];
  +            QNameSet nde = computeNondelimitingElements(sImpl.getName(), contentModel, state);
  +            QNameSetBuilder builder = new QNameSetBuilder(allContents);
  +            builder.removeAll(nde);
  +            sImpl.setJavaSetterDelimiter(builder.toQNameSet());
  +        }
  +    }
  +
  +    /**
  +     * Used to compute setter model.
  +     *
  +     * Returns the QNameSet of all elements that can possibly come before an
  +     * element whose name is given by the target in a valid instance of the
  +     * contentModel.  When appending an element, it comes before the first
  +     * one that is not in this set.
  +     */
  +    private static QNameSet computeNondelimitingElements(QName target, SchemaParticle contentModel, Map state)
  +    {
  +        QNameSet allContents = computeAllContainedElements(contentModel, state);
  +        if (!allContents.contains(target))
  +            return QNameSet.EMPTY;
  +
  +        // If iterated, then all contents are delimiting.
  +        if (contentModel.getMaxOccurs() == null ||
  +            contentModel.getMaxOccurs().compareTo(BigInteger.ONE) > 0)
  +            return allContents;
  +
  +        QNameSetBuilder builder;
  +
  +        switch (contentModel.getParticleType())
  +        {
  +            case SchemaParticle.ALL:
  +            case SchemaParticle.ELEMENT:
  +            default:
  +                return allContents;
  +
  +            case SchemaParticle.WILDCARD:
  +                return QNameSet.singleton(target);
  +
  +            case SchemaParticle.CHOICE:
  +                builder = new QNameSetBuilder();
  +                for (int i = 0; i < contentModel.countOfParticleChild(); i++)
  +                {
  +                    QNameSet childContents = computeAllContainedElements(contentModel.getParticleChild(i), state);
  +                    if (childContents.contains(target))
  +                        builder.addAll(computeNondelimitingElements(target, contentModel.getParticleChild(i), state));
  +                }
  +                return builder.toQNameSet();
  +
  +            case SchemaParticle.SEQUENCE:
  +                builder = new QNameSetBuilder();
  +                boolean seenTarget = false;
  +                for (int i = contentModel.countOfParticleChild(); i > 0; )
  +                {
  +                    i--;
  +                    QNameSet childContents = computeAllContainedElements(contentModel.getParticleChild(i), state);
  +                    if (seenTarget)
  +                    {
  +                        builder.addAll(childContents);
  +                    }
  +                    else if (childContents.contains(target))
  +                    {
  +                        builder.addAll(computeNondelimitingElements(target, contentModel.getParticleChild(i), state));
  +                        seenTarget = true;
  +                    }
  +                }
  +                return builder.toQNameSet();
  +        }
  +    }
  +
  +    /**
  +     * Used to compute the setter model.
  +     *
  +     * Returns the set of all QNames of elements that could possibly be
  +     * contained in the given contentModel. The state variable is used
  +     * to record the results, so that if they are needed again later,
  +     * they do not need to be recomputed.
  +     */
  +    private static QNameSet computeAllContainedElements(SchemaParticle contentModel, Map state)
  +    {
  +        // Remember previously computed results to avoid complexity explosion
  +        QNameSet result = (QNameSet)state.get(contentModel);
  +        if (result != null)
  +            return result;
  +
  +        QNameSetBuilder builder;
  +
  +        switch (contentModel.getParticleType())
  +        {
  +            case SchemaParticle.ALL:
  +            case SchemaParticle.CHOICE:
  +            case SchemaParticle.SEQUENCE:
  +            default:
  +                builder = new QNameSetBuilder();
  +                for (int i = 0; i < contentModel.countOfParticleChild(); i++)
  +                {
  +                    builder.addAll(computeAllContainedElements(contentModel.getParticleChild(i), state));
  +                }
  +                result = builder.toQNameSet();
  +                break;
  +
  +            case SchemaParticle.WILDCARD:
  +                result = contentModel.getWildcardSet();
  +                break;
  +
  +            case SchemaParticle.ELEMENT:
  +                result = QNameSet.singleton(contentModel.getName());
  +                break;
  +        }
  +        state.put(contentModel, result);
  +        return result;
  +    }
  +
       public Class getJavaClass()
       {
           // This field is declared volatile and Class is immutable so this is allowed.
  
  
  
  1.15      +3 -3      xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java
  
  Index: SchemaTypeSystemImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- SchemaTypeSystemImpl.java	11 Nov 2004 04:02:21 -0000	1.14
  +++ SchemaTypeSystemImpl.java	15 Nov 2004 02:42:29 -0000	1.15
  @@ -77,7 +77,7 @@
   {
       public static final int DATA_BABE = 0xDA7ABABE;
       public static final int MAJOR_VERSION = 2;  // must match == to be compatible
  -    public static final int MINOR_VERSION = 19; // must be <= to be compatible
  +    public static final int MINOR_VERSION = 20; // must be <= to be compatible
       public static final int RELEASE_NUMBER = 0; // should be compatible even if < or >
   
       public static final int FILETYPE_SCHEMAINDEX = 1;
  @@ -2910,7 +2910,8 @@
                       (propflags & FLAG_PROP_JAVASINGLETON) != 0,
                       (propflags & FLAG_PROP_JAVAOPTIONAL) != 0,
                       (propflags & FLAG_PROP_JAVAARRAY) != 0);
  -            prop.setJavaSetterDelimiter(readQNameSet());
  +            if (atMost(2, 19, 0))
  +                prop.setJavaSetterDelimiter(readQNameSet());
               if (atLeast(2, 16, 0))
                   prop.setDefaultValue(readXmlValueObject());
   
  @@ -2945,7 +2946,6 @@
               writeString(prop.getJavaPropertyName());
               writeShort(prop.getJavaTypeCode());
               writeType(prop.javaBasedOnType());
  -            writeQNameSet(prop.getJavaSetterDelimiter());
               writeXmlValueObject(prop.getDefaultValue());
   
               if (! prop.isAttribute())
  
  
  
  1.9       +0 -127    xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java
  
  Index: StscJavaizer.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- StscJavaizer.java	3 Nov 2004 18:29:04 -0000	1.8
  +++ StscJavaizer.java	15 Nov 2004 02:42:29 -0000	1.9
  @@ -208,10 +208,6 @@
               SchemaProperty[] eltProps = sImpl.getElementProperties();
               SchemaProperty[] attrProps = sImpl.getAttributeProperties();
   
  -            // element setters result from a computation
  -            if (eltProps.length > 0)
  -                assignJavaElementSetterModel(eltProps, sImpl.getContentModel());
  -
               // Handing out java names - this permits us to avoid collisions.
               Set usedPropNames = new HashSet();
   
  @@ -342,129 +338,6 @@
               sImpl.setShortJavaImplName(
                       pickInnerJavaImplName(usedTypeNames, localname, javaname == null ? null : javaname + "Impl"));
               setExtensions(sImpl, state);
  -        }
  -    }
  -
  -    /**
  -     * Used to compute the setter model.
  -     *
  -     * Returns the set of all QNames of elements that could possibly be
  -     * contained in the given contentModel. The state variable is used
  -     * to record the results, so that if they are needed again later,
  -     * they do not need to be recomputed.
  -     */
  -    static QNameSet computeAllContainedElements(SchemaParticle contentModel, Map state)
  -    {
  -        // Remember previously computed results to avoid complexity explosion
  -        QNameSet result = (QNameSet)state.get(contentModel);
  -        if (result != null)
  -            return result;
  -
  -        QNameSetBuilder builder;
  -
  -        switch (contentModel.getParticleType())
  -        {
  -            case SchemaParticle.ALL:
  -            case SchemaParticle.CHOICE:
  -            case SchemaParticle.SEQUENCE:
  -            default:
  -                builder = new QNameSetBuilder();
  -                for (int i = 0; i < contentModel.countOfParticleChild(); i++)
  -                {
  -                    builder.addAll(computeAllContainedElements(contentModel.getParticleChild(i), state));
  -                }
  -                result = builder.toQNameSet();
  -                break;
  -
  -            case SchemaParticle.WILDCARD:
  -                result = contentModel.getWildcardSet();
  -                break;
  -
  -            case SchemaParticle.ELEMENT:
  -                result = QNameSet.singleton(contentModel.getName());
  -                break;
  -        }
  -        state.put(contentModel, result);
  -        return result;
  -    }
  -
  -    /**
  -     * Used to compute setter model.
  -     *
  -     * Returns the QNameSet of all elements that can possibly come before an
  -     * element whose name is given by the target in a valid instance of the
  -     * contentModel.  When appending an element, it comes before the first
  -     * one that is not in this set.
  -     */
  -    static QNameSet computeNondelimitingElements(QName target, SchemaParticle contentModel, Map state)
  -    {
  -        QNameSet allContents = computeAllContainedElements(contentModel, state);
  -        if (!allContents.contains(target))
  -            return QNameSet.EMPTY;
  -
  -        // If iterated, then all contents are delimiting.
  -        if (contentModel.getMaxOccurs() == null ||
  -            contentModel.getMaxOccurs().compareTo(BigInteger.ONE) > 0)
  -            return allContents;
  -
  -        QNameSetBuilder builder;
  -
  -        switch (contentModel.getParticleType())
  -        {
  -            case SchemaParticle.ALL:
  -            case SchemaParticle.ELEMENT:
  -            default:
  -                return allContents;
  -
  -            case SchemaParticle.WILDCARD:
  -                return QNameSet.singleton(target);
  -
  -            case SchemaParticle.CHOICE:
  -                builder = new QNameSetBuilder();
  -                for (int i = 0; i < contentModel.countOfParticleChild(); i++)
  -                {
  -                    QNameSet childContents = computeAllContainedElements(contentModel.getParticleChild(i), state);
  -                    if (childContents.contains(target))
  -                        builder.addAll(computeNondelimitingElements(target, contentModel.getParticleChild(i), state));
  -                }
  -                return builder.toQNameSet();
  -
  -            case SchemaParticle.SEQUENCE:
  -                builder = new QNameSetBuilder();
  -                boolean seenTarget = false;
  -                for (int i = contentModel.countOfParticleChild(); i > 0; )
  -                {
  -                    i--;
  -                    QNameSet childContents = computeAllContainedElements(contentModel.getParticleChild(i), state);
  -                    if (seenTarget)
  -                    {
  -                        builder.addAll(childContents);
  -                    }
  -                    else if (childContents.contains(target))
  -                    {
  -                        builder.addAll(computeNondelimitingElements(target, contentModel.getParticleChild(i), state));
  -                        seenTarget = true;
  -                    }
  -                }
  -                return builder.toQNameSet();
  -        }
  -    }
  -
  -    static void assignJavaElementSetterModel(SchemaProperty[] eltProps, SchemaParticle contentModel)
  -    {
  -        // To compute the element setter model, we need to compute the
  -        // delimiting elements for each element.
  -
  -        Map state = new HashMap();
  -        QNameSet allContents = computeAllContainedElements(contentModel, state);
  -
  -        for (int i = 0; i < eltProps.length; i++)
  -        {
  -            SchemaPropertyImpl sImpl = (SchemaPropertyImpl)eltProps[i];
  -            QNameSet nde = computeNondelimitingElements(sImpl.getName(), contentModel, state);
  -            QNameSetBuilder builder = new QNameSetBuilder(allContents);
  -            builder.removeAll(nde);
  -            sImpl.setJavaSetterDelimiter(builder.toQNameSet());
           }
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: commits-help@xmlbeans.apache.org