use of eu.esdihumboldt.hale.common.schema.model.TypeDefinition in project hale by halestudio.
the class XmlSchemaReaderTest method testRead_definitive_chapter03.
/**
* Test reading a simple XML schema that is split into several files. Tests
* also the {@link XmlElements} and {@link MappingRelevantFlag} constraints
*
* @throws Exception if reading the schema fails
*/
@Test
public void testRead_definitive_chapter03() throws Exception {
URI location = getClass().getResource("/testdata/definitive/chapter03env.xsd").toURI();
LocatableInputSupplier<? extends InputStream> input = new DefaultInputSupplier(location);
XmlIndex schema = (XmlIndex) readSchema(input);
// envelope element
XmlElement envelope = schema.getElements().get(new QName("http://example.org/ord", "envelope"));
assertNotNull(envelope);
TypeDefinition envType = envelope.getType();
// mappable
assertTrue(envType.getConstraint(MappingRelevantFlag.class).isEnabled());
// XmlElements
Collection<? extends XmlElement> elements = envType.getConstraint(XmlElements.class).getElements();
assertEquals(1, elements.size());
assertEquals(envelope, elements.iterator().next());
// order
PropertyDefinition order = envType.getChild(new QName("http://example.org/ord", "order")).asProperty();
assertNotNull(order);
TypeDefinition orderType = order.getPropertyType();
// mappable
assertTrue(orderType.getConstraint(MappingRelevantFlag.class).isEnabled());
// number
PropertyDefinition number = orderType.getChild(new QName("http://example.org/ord", "number")).asProperty();
assertNotNull(number);
// binding must be string
assertEquals(String.class, number.getPropertyType().getConstraint(Binding.class).getBinding());
// items
PropertyDefinition items = orderType.getChild(new QName("http://example.org/ord", "items")).asProperty();
assertNotNull(items);
// not mappable
assertFalse(items.getPropertyType().getConstraint(MappingRelevantFlag.class).isEnabled());
// no elements
assertTrue(items.getPropertyType().getConstraint(XmlElements.class).getElements().isEmpty());
// SpecialOrderType
// extension to OrderType, should be mappable using xsi:type
TypeDefinition specialOrderType = schema.getType(new QName("http://example.org/ord", "SpecialOrderType"));
assertNotNull(specialOrderType);
// number of declared children
assertEquals(1, specialOrderType.getDeclaredChildren().size());
// number of children
assertEquals(3, specialOrderType.getChildren().size());
// mappable
assertTrue(specialOrderType.getConstraint(MappableFlag.class).isEnabled());
// no elements
assertTrue(specialOrderType.getConstraint(XmlElements.class).getElements().isEmpty());
// overall mappable types
Collection<? extends TypeDefinition> mt = schema.getMappingRelevantTypes();
// envelope, order, special order
assertEquals(2, mt.size());
}
use of eu.esdihumboldt.hale.common.schema.model.TypeDefinition in project hale by halestudio.
the class XmlSchemaReaderTest method testRead_definitive_choice.
/**
* Test reading a simple XML schema with choices and complex types.
*
* @throws Exception if reading the schema fails
*/
@Test
public void testRead_definitive_choice() throws Exception {
URI location = getClass().getResource("/testdata/definitive/choice_complex.xsd").toURI();
LocatableInputSupplier<? extends InputStream> input = new DefaultInputSupplier(location);
XmlIndex schema = (XmlIndex) readSchema(input);
// ItemsType
TypeDefinition itemsType = schema.getType(new QName("ItemsType"));
assertNotNull(itemsType);
Collection<? extends ChildDefinition<?>> children = itemsType.getChildren();
assertEquals(1, children.size());
// choice
GroupPropertyDefinition choice = children.iterator().next().asGroup();
assertNotNull(choice);
// cardinality
Cardinality cc = choice.getConstraint(Cardinality.class);
assertEquals(0, cc.getMinOccurs());
assertEquals(Cardinality.UNBOUNDED, cc.getMaxOccurs());
// choice flag
assertTrue(choice.getConstraint(ChoiceFlag.class).isEnabled());
// children
assertEquals(3, choice.getDeclaredChildren().size());
// shirt
PropertyDefinition shirt = choice.getChild(new QName("shirt")).asProperty();
assertNotNull(shirt);
// hat
PropertyDefinition hat = choice.getChild(new QName("hat")).asProperty();
assertNotNull(hat);
// umbrella
PropertyDefinition umbrella = choice.getChild(new QName("umbrella")).asProperty();
assertNotNull(umbrella);
// TODO extend with advanced complex type tests?
}
use of eu.esdihumboldt.hale.common.schema.model.TypeDefinition in project hale by halestudio.
the class XmlSchemaReaderTest method testRead_shiporder_types_cycle.
/**
* Test reading a simple XML schema that uses several custom named types and
* has a cycle.
*
* @throws Exception if reading the schema fails
*/
@Test
public void testRead_shiporder_types_cycle() throws Exception {
URI location = getClass().getResource("/testdata/shiporder/shiporder-types-cycle.xsd").toURI();
LocatableInputSupplier<? extends InputStream> input = new DefaultInputSupplier(location);
XmlIndex schema = (XmlIndex) readSchema(input);
String ns = "http://www.example.com";
assertEquals(ns, schema.getNamespace());
// shiporder element
Collection<XmlElement> elements = getElementsWithNS(ns, schema.getElements().values());
assertEquals(1, elements.size());
XmlElement shiporder = elements.iterator().next();
assertNotNull(shiporder);
TypeDefinition type = shiporder.getType();
assertEquals(5, type.getChildren().size());
// contained shiporder element
PropertyDefinition s2 = type.getChild(new QName(ns, "shiporder")).asProperty();
assertNotNull(s2);
assertEquals(type, s2.getPropertyType());
}
use of eu.esdihumboldt.hale.common.schema.model.TypeDefinition in project hale by halestudio.
the class XmlSchemaReaderTest method testRead_definitive_attributegroup.
/**
* Test reading a simple XML schema that uses an attribute group and an
* attribute with xs:date type.
*
* @throws Exception if reading the schema fails
*/
@Test
public void testRead_definitive_attributegroup() throws Exception {
URI location = getClass().getResource("/testdata/definitive/attributegroup.xsd").toURI();
LocatableInputSupplier<? extends InputStream> input = new DefaultInputSupplier(location);
XmlIndex schema = (XmlIndex) readSchema(input);
// ShirtType
TypeDefinition type = schema.getType(new QName("ShirtType"));
assertNotNull(type);
// not there any more because it is flattened away
// // IdentifierGroup
// GroupPropertyDefinition group = type.getChild(new QName("IdentifierGroup")).asGroup();
// assertNotNull(group);
// // not a choice
// assertFalse(group.getConstraint(ChoiceFlag.class).isEnabled());
// id
PropertyDefinition id = type.getChild(new QName("id")).asProperty();
assertNotNull(id);
// property type must be a simple type
assertTrue(id.getPropertyType().getConstraint(HasValueFlag.class).isEnabled());
// binding must be string
assertEquals(String.class, id.getPropertyType().getConstraint(Binding.class).getBinding());
// required
Cardinality cc = id.getConstraint(Cardinality.class);
assertEquals(1, cc.getMinOccurs());
assertEquals(1, cc.getMaxOccurs());
// version
PropertyDefinition version = type.getChild(new QName("version")).asProperty();
assertNotNull(version);
// property type must be a simple type
assertTrue(version.getPropertyType().getConstraint(HasValueFlag.class).isEnabled());
// effDate
PropertyDefinition effDate = type.getChild(new QName("effDate")).asProperty();
assertNotNull(effDate);
// binding must be compatible to Date
assertTrue(Date.class.isAssignableFrom(effDate.getPropertyType().getConstraint(Binding.class).getBinding()));
}
use of eu.esdihumboldt.hale.common.schema.model.TypeDefinition in project hale by halestudio.
the class CustomTypeContentHelper method applyConfiguration.
/**
* Apply a custom type configuration to the given schema.
*
* @param index the XML schema
* @param association the custom type configuration for an individual
* property
*/
public static void applyConfiguration(XmlIndex index, CustomTypeContentAssociation association) {
CustomTypeContent config = association.getConfig();
// property identified by a list of qualified names
List<QName> property = association.getProperty();
PropertyDefinition propDef = null;
DefinitionGroup propParent = null;
if (property != null && property.size() > 1) {
QName typeName = property.get(0);
TypeDefinition type = index.getType(typeName);
if (type != null) {
LinkedList<QName> nameQueue = new LinkedList<>(property.subList(1, property.size()));
Definition<?> parent = null;
Definition<?> child = type;
while (!nameQueue.isEmpty() && child != null) {
parent = child;
QName name = nameQueue.pollFirst();
child = DefinitionUtil.getChild(parent, name);
}
if (nameQueue.isEmpty() && child instanceof PropertyDefinition) {
propDef = (PropertyDefinition) child;
if (parent instanceof TypeDefinition) {
propParent = (DefinitionGroup) parent;
} else if (parent instanceof ChildDefinition<?>) {
ChildDefinition<?> pc = (ChildDefinition<?>) parent;
if (pc.asProperty() != null) {
propParent = pc.asProperty().getPropertyType();
} else if (pc.asGroup() != null) {
propParent = pc.asGroup();
}
} else {
log.error("Illegal parent for custom type content property");
return;
}
} else {
log.warn("Cannot apply custom type content configuration due to invalid property path");
return;
}
} else {
log.warn("Cannot apply custom type content configuration due because the type {} starting the property path could not be found", typeName);
return;
}
} else {
log.warn("Cannot apply custom type content configuration due to missing property path");
return;
}
switch(config.getMode()) {
case simple:
applySimpleMode(propDef, propParent, config);
case elements:
applyElementsMode(propDef, propParent, config, index);
default:
log.error("Unrecognized custom type content mode {}", config.getMode().name());
}
}
Aggregations