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