Author: mukulg
Date: Wed Feb 3 13:09:25 2010
New Revision: 906036
URL: http://svn.apache.org/viewvc?rev=906036&view=rev
Log:
adding support for xs:group serialization
Modified:
xerces/java/branches/xml-schema-1.1-dev/samples/xs/XSSerializer.java
Modified: xerces/java/branches/xml-schema-1.1-dev/samples/xs/XSSerializer.java
URL:
http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/samples/xs/XSSerializer.java?rev=906036&r1=906035&r2=906036&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/samples/xs/XSSerializer.java
(original)
+++ xerces/java/branches/xml-schema-1.1-dev/samples/xs/XSSerializer.java Wed
Feb 3 13:09:25 2010
@@ -27,6 +27,7 @@
import org.apache.xerces.impl.xs.XSAttributeDecl;
import org.apache.xerces.impl.xs.XSComplexTypeDecl;
import org.apache.xerces.impl.xs.XSElementDecl;
+import org.apache.xerces.impl.xs.XSGroupDecl;
import org.apache.xerces.impl.xs.XSWildcardDecl;
import org.apache.xerces.xs.StringList;
import org.apache.xerces.xs.XSAttributeUse;
@@ -163,6 +164,10 @@
XSNamedMap globalAttrDecls = xsModel.getComponents
(XSConstants.ATTRIBUTE_DECLARATION);
processGlobalAttrDecl(globalAttrDecls, document, schemaDeclDomNode);
+
+ XSNamedMap globalGroupDecls = xsModel.getComponents
+
(XSConstants.MODEL_GROUP_DEFINITION);
+ processGlobalGroupDecl(globalGroupDecls, document, schemaDeclDomNode);
return document;
} // end of, transformXSModelToDOM
@@ -420,12 +425,63 @@
XSAttributeDecl attrDecl = (XSAttributeDecl)
globalAttrDecls.item(attrIdx);
addAttributeToSchemaComponent(document, schemaDeclDomNode,
attrDecl);
- }
+ }
} // end of, processGlobalAttrDecl
+
+ /*
+ * Process global group declarations
+ */
+ private void processGlobalGroupDecl(XSNamedMap globalGroupDecls,
+ Document document,
+ Element schemaDeclDomNode) {
+ // iterating global group declarations in the Schema
+ for (int groupIdx = 0; groupIdx < globalGroupDecls.size(); groupIdx++)
{
+ XSGroupDecl groupDecl = (XSGroupDecl)
+ globalGroupDecls.item(groupIdx);
+ addGroupChildToSchemaComponent(document, schemaDeclDomNode,
+ groupDecl, true);
+ }
+
+ } // end of, processGlobalGroupDecl
+
+ /*
+ * Add xs:group child to a Schema component
+ */
+ private void addGroupChildToSchemaComponent(Document document,
+ Element parentDomNode,
+ XSGroupDecl groupDecl,
+ boolean isGlobal) {
+ Element groupDeclDomNode = document.createElementNS(XSD_LANGUAGE_URI,
+ XSD_LANGUAGE_PREFIX
+ + "group");
+ if (isGlobal) {
+ String groupName = groupDecl.getName();
+ groupDeclDomNode.setAttributeNS(null, "name", groupName);
+ XSModelGroup modelGroup = groupDecl.getModelGroup();
+ if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_SEQUENCE) {
+ addCompositorOnSchemaComponent(document, groupDeclDomNode,
+ modelGroup, "sequence", "1",
"1");
+ }
+ else if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_CHOICE) {
+ addCompositorOnSchemaComponent(document, groupDeclDomNode,
+ modelGroup, "choice", "1", "1");
+ }
+ else if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_ALL) {
+ addAllCompositorOnComplexType(document, groupDeclDomNode,
+ modelGroup, "1", "1");
+ }
+ }
+ else {
+
+ }
+
+ parentDomNode.appendChild(groupDeclDomNode);
+
+ } // end of, addGroupToSchemaComponent
/*
* Add attribute declaration to a Schema component (like xs:schema,
- * xs:complexType, ).
+ * xs:complexType etc).
*/
private void addAttributeToSchemaComponent(Document document,
Element parentDomNode,
@@ -715,19 +771,28 @@
XSParticle particle)
throws DOMException {
XSTerm particleTerm = particle.getTerm();
+
if (particleTerm instanceof XSModelGroup) {
XSModelGroup modelGroup = (XSModelGroup) particleTerm;
+ String minOccurs = getMinOccursVal(particle);
+ String maxOccurs = getMaxOccursVal(particle);
if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_SEQUENCE) {
addCompositorOnSchemaComponent(document, parentDomNode,
- modelGroup, "sequence");
+ modelGroup, "sequence",
+ minOccurs,
+ maxOccurs);
}
else if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_CHOICE) {
addCompositorOnSchemaComponent(document, parentDomNode,
- modelGroup, "choice");
+ modelGroup, "choice",
+ minOccurs,
+ maxOccurs);
}
else if (modelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_ALL) {
addAllCompositorOnComplexType(document, parentDomNode,
- modelGroup);
+ modelGroup,
+ minOccurs,
+ maxOccurs);
}
}
@@ -739,42 +804,57 @@
private void addCompositorOnSchemaComponent(Document document,
Element parentDomNode,
XSModelGroup modelGroup,
- String compositor)
+ String compositor,
+ String minOccurs,
+ String maxOccurs)
throws DOMException {
Element compositorDomNode = document.createElementNS(
XSD_LANGUAGE_URI,
XSD_LANGUAGE_PREFIX
+ compositor);
+ // add minOccurs & maxOccurs attributes to the compositor root
+ if (minOccurs != null && !minOccurs.equals("1")) {
+ compositorDomNode.setAttributeNS(null, "minOccurs",
+ minOccurs);
+ }
+ if (maxOccurs != null && !maxOccurs.equals("1")) {
+ compositorDomNode.setAttributeNS(null, "maxOccurs",
+ maxOccurs);
+ }
+
XSObjectList compositorChildren = modelGroup.getParticles();
for (int seqIdx = 0; seqIdx < compositorChildren.getLength();
seqIdx++) {
XSObject seqItem = compositorChildren.item(seqIdx);
- XSParticle seqParticle = (XSParticle) seqItem;
- String minOccurs = getMinOccursVal(seqParticle);
- String maxOccurs = getMaxOccursVal(seqParticle);
-
- XSTerm partclTerm = seqParticle.getTerm();
+ XSParticle compositorParticle = (XSParticle) seqItem;
+ String minOccursParticle = getMinOccursVal(compositorParticle);
+ String maxOccursParticle = getMaxOccursVal(compositorParticle);
+ XSTerm partclTerm = compositorParticle.getTerm();
if (partclTerm instanceof XSElementDeclaration) {
XSElementDecl elemDecl = (XSElementDecl) partclTerm;
addElementDeclToSchemaComponent(document,
compositorDomNode,
elemDecl,
- minOccurs,
- maxOccurs,
+ minOccursParticle,
+ maxOccursParticle,
false);
}
else if (partclTerm instanceof XSModelGroup) {
// Recursively adding model groups
XSModelGroup partlModelGroup = (XSModelGroup) partclTerm;
- if (modelGroup.getCompositor() ==
+ if (partlModelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_CHOICE) {
addCompositorOnSchemaComponent(document, compositorDomNode,
- partlModelGroup, "choice");
+ partlModelGroup, "choice",
+ minOccursParticle,
+ maxOccursParticle);
}
- else if (modelGroup.getCompositor() ==
+ else if (partlModelGroup.getCompositor() ==
XSModelGroup.COMPOSITOR_SEQUENCE) {
addCompositorOnSchemaComponent(document, compositorDomNode,
- partlModelGroup,
"sequence");
+ partlModelGroup, "sequence",
+ minOccursParticle,
+ maxOccursParticle);
}
}
else if (partclTerm instanceof XSWildcard) {
@@ -783,8 +863,6 @@
(XSWildcardDecl) partclTerm,
"any");
}
-
- // handle more compositor children like, group ...
}
parentDomNode.appendChild(compositorDomNode);
@@ -796,28 +874,39 @@
*/
private void addAllCompositorOnComplexType(Document document,
Element complxTypeDomNode,
- XSModelGroup modelGroup)
+ XSModelGroup modelGroup,
+ String minOccurs,
+ String maxOccurs)
throws DOMException {
Element allDeclDomNode = document.createElementNS(
XSD_LANGUAGE_URI,
XSD_LANGUAGE_PREFIX
- + "all");
+ + "all");
+ // add minOccurs & maxOccurs attributes to the compositor root
+ if (minOccurs != null && !minOccurs.equals("1")) {
+ allDeclDomNode.setAttributeNS(null, "minOccurs",
+ minOccurs);
+ }
+ if (maxOccurs != null && !maxOccurs.equals("1")) {
+ allDeclDomNode.setAttributeNS(null, "maxOccurs",
+ maxOccurs);
+ }
XSObjectList modelParticles = modelGroup.getParticles();
for (int prtclIdx = 0; prtclIdx < modelParticles.getLength();
prtclIdx++) {
XSParticle partclItem = (XSParticle) modelParticles.item(prtclIdx);
- String minOccurs = getMinOccursVal(partclItem);
- String maxOccurs = getMaxOccursVal(partclItem);
-
+ String minOccursParticle = getMinOccursVal(partclItem);
+ String maxOccursParticle = getMaxOccursVal(partclItem);
XSTerm partclTerm = partclItem.getTerm();
+
if (partclTerm instanceof XSElementDeclaration) {
addElementDeclToSchemaComponent(document,
allDeclDomNode,
(XSElementDecl) partclTerm,
- minOccurs,
- maxOccurs,
+ minOccursParticle,
+ maxOccursParticle,
false);
}
else if (partclTerm instanceof XSWildcard) {
@@ -968,7 +1057,7 @@
// unreach
return null;
- }
+ } // end of, getFacetName
/*
* Given an XSD particle, get it's minOccurs value as a String.
@@ -982,7 +1071,7 @@
}
return minOccursStr;
- }
+ } // end of, getMinOccursVal
/*
* Given an XSD particle, get it's maxOccurs value as a String.
@@ -1001,6 +1090,6 @@
}
return maxOccursStr;
- }
-
+ } // end of, getMaxOccursVal
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]