use of eu.esdihumboldt.hale.io.xsd.reader.internal.XmlGroupReferenceProperty in project hale by halestudio.
the class XmlSchemaReader method createPropertiesFromParticle.
/**
* Extracts attribute definitions from a {@link XmlSchemaParticle}.
*
* @param declaringGroup the definition of the declaring group
* @param particle the particle
* @param schemaLocation the schema location
* @param schemaNamespace the schema namespace
* @param forceGroup force creating a group (e.g. if the parent is a choice)
*/
private void createPropertiesFromParticle(DefinitionGroup declaringGroup, XmlSchemaParticle particle, String schemaLocation, String schemaNamespace, boolean forceGroup) {
// particle:
if (particle instanceof XmlSchemaSequence) {
// <sequence>
XmlSchemaSequence sequence = (XmlSchemaSequence) particle;
// once will result in no group if not forced)
if (forceGroup || sequence.getMinOccurs() != 1 || sequence.getMaxOccurs() != 1) {
// create a sequence group
QName sequenceName = createGroupName(declaringGroup, "sequence");
DefaultGroupPropertyDefinition sequenceGroup = new DefaultGroupPropertyDefinition(sequenceName, declaringGroup, false);
// set cardinality
long max = (sequence.getMaxOccurs() == Long.MAX_VALUE) ? (Cardinality.UNBOUNDED) : (sequence.getMaxOccurs());
sequenceGroup.setConstraint(Cardinality.get(sequence.getMinOccurs(), max));
// set choice constraint (no choice)
sequenceGroup.setConstraint(ChoiceFlag.DISABLED);
// set metadata
setMetadata(sequenceGroup, sequence, schemaLocation);
// use group as parent
declaringGroup = sequenceGroup;
}
for (int j = 0; j < sequence.getItems().getCount(); j++) {
XmlSchemaObject object = sequence.getItems().getItem(j);
if (object instanceof XmlSchemaElement) {
// <element>
createPropertyFromElement((XmlSchemaElement) object, declaringGroup, schemaLocation, schemaNamespace);
// </element>
} else if (object instanceof XmlSchemaParticle) {
// contained particles, e.g. a choice
// content doesn't need to be grouped, it can be decided in
// the method
createPropertiesFromParticle(declaringGroup, (XmlSchemaParticle) object, schemaLocation, schemaNamespace, false);
}
}
// </sequence>
} else if (particle instanceof XmlSchemaChoice) {
// <choice>
XmlSchemaChoice choice = (XmlSchemaChoice) particle;
// create a choice group
QName choiceName = createGroupName(declaringGroup, "choice");
DefaultGroupPropertyDefinition choiceGroup = new DefaultGroupPropertyDefinition(choiceName, declaringGroup, // no flatten allowed
false);
// because of choice
// set custom display name
choiceGroup.setConstraint(DISPLAYNAME_CHOICE);
// set cardinality
long max = (choice.getMaxOccurs() == Long.MAX_VALUE) ? (Cardinality.UNBOUNDED) : (choice.getMaxOccurs());
choiceGroup.setConstraint(Cardinality.get(choice.getMinOccurs(), max));
// set choice constraint
choiceGroup.setConstraint(ChoiceFlag.ENABLED);
// set metadata
setMetadata(choiceGroup, choice, schemaLocation);
// create properties with choiceGroup as parent
for (int j = 0; j < choice.getItems().getCount(); j++) {
XmlSchemaObject object = choice.getItems().getItem(j);
if (object instanceof XmlSchemaElement) {
// <element>
createPropertyFromElement((XmlSchemaElement) object, choiceGroup, schemaLocation, schemaNamespace);
} else if (object instanceof XmlSchemaParticle) {
// contained particles, e.g. a choice or sequence
// inside a choice they must form a group
createPropertiesFromParticle(choiceGroup, (XmlSchemaParticle) object, schemaLocation, schemaNamespace, true);
}
}
// </choice>
} else if (particle instanceof XmlSchemaGroupRef) {
// <group ref="..." />
XmlSchemaGroupRef groupRef = (XmlSchemaGroupRef) particle;
QName groupName = groupRef.getRefName();
long max = (groupRef.getMaxOccurs() == Long.MAX_VALUE) ? (Cardinality.UNBOUNDED) : (groupRef.getMaxOccurs());
long min = groupRef.getMinOccurs();
/*
* Only allow flatten if group is not forced and appears exactly
* once
*/
XmlGroupReferenceProperty property = new XmlGroupReferenceProperty(groupName, declaringGroup, index, groupName, !forceGroup && min == 1 && max == 1);
// set cardinality constraint
property.setConstraint(Cardinality.get(min, max));
// set metadata
setMetadata(property, groupRef, schemaLocation);
} else if (particle instanceof XmlSchemaAny) {
// XXX ignore for now
reporter.info(new IOMessageImpl("Particle that allows any element is not supported.", null, particle.getLineNumber(), particle.getLinePosition()));
} else {
reporter.error(new IOMessageImpl("Unrecognized particle: " + particle.getClass().getSimpleName(), null, particle.getLineNumber(), particle.getLinePosition()));
}
}
Aggregations