Search in sources :

Example 11 with TypeDefinition

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());
}
Also used : XmlElements(eu.esdihumboldt.hale.io.xsd.constraint.XmlElements) DefaultInputSupplier(eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier) QName(javax.xml.namespace.QName) XmlIndex(eu.esdihumboldt.hale.io.xsd.model.XmlIndex) XmlElement(eu.esdihumboldt.hale.io.xsd.model.XmlElement) URI(java.net.URI) GroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.GroupPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) Test(org.junit.Test)

Example 12 with TypeDefinition

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?
}
Also used : GroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.GroupPropertyDefinition) DefaultInputSupplier(eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier) Cardinality(eu.esdihumboldt.hale.common.schema.model.constraint.property.Cardinality) QName(javax.xml.namespace.QName) XmlIndex(eu.esdihumboldt.hale.io.xsd.model.XmlIndex) URI(java.net.URI) GroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.GroupPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) Test(org.junit.Test)

Example 13 with TypeDefinition

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());
}
Also used : DefaultInputSupplier(eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier) QName(javax.xml.namespace.QName) XmlIndex(eu.esdihumboldt.hale.io.xsd.model.XmlIndex) XmlElement(eu.esdihumboldt.hale.io.xsd.model.XmlElement) URI(java.net.URI) GroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.GroupPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) Test(org.junit.Test)

Example 14 with TypeDefinition

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()));
}
Also used : Binding(eu.esdihumboldt.hale.common.schema.model.constraint.type.Binding) DefaultInputSupplier(eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier) Cardinality(eu.esdihumboldt.hale.common.schema.model.constraint.property.Cardinality) QName(javax.xml.namespace.QName) XmlIndex(eu.esdihumboldt.hale.io.xsd.model.XmlIndex) URI(java.net.URI) GroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.GroupPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) Date(java.util.Date) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) Test(org.junit.Test)

Example 15 with TypeDefinition

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());
    }
}
Also used : QName(javax.xml.namespace.QName) ChildDefinition(eu.esdihumboldt.hale.common.schema.model.ChildDefinition) DefaultPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultPropertyDefinition) DefaultGroupPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultGroupPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) DefinitionGroup(eu.esdihumboldt.hale.common.schema.model.DefinitionGroup) LinkedList(java.util.LinkedList) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) DefaultTypeDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultTypeDefinition)

Aggregations

TypeDefinition (eu.esdihumboldt.hale.common.schema.model.TypeDefinition)192 QName (javax.xml.namespace.QName)58 PropertyDefinition (eu.esdihumboldt.hale.common.schema.model.PropertyDefinition)38 ArrayList (java.util.ArrayList)32 TypeEntityDefinition (eu.esdihumboldt.hale.common.align.model.impl.TypeEntityDefinition)26 DefaultTypeDefinition (eu.esdihumboldt.hale.common.schema.model.impl.DefaultTypeDefinition)26 Test (org.junit.Test)24 Instance (eu.esdihumboldt.hale.common.instance.model.Instance)22 PropertyEntityDefinition (eu.esdihumboldt.hale.common.align.model.impl.PropertyEntityDefinition)21 HashSet (java.util.HashSet)21 EntityDefinition (eu.esdihumboldt.hale.common.align.model.EntityDefinition)20 Schema (eu.esdihumboldt.hale.common.schema.model.Schema)20 InstanceCollection (eu.esdihumboldt.hale.common.instance.model.InstanceCollection)16 ChildContext (eu.esdihumboldt.hale.common.align.model.ChildContext)15 XmlElement (eu.esdihumboldt.hale.io.xsd.model.XmlElement)15 Cell (eu.esdihumboldt.hale.common.align.model.Cell)14 IOMessageImpl (eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl)14 MutableCell (eu.esdihumboldt.hale.common.align.model.MutableCell)12 Binding (eu.esdihumboldt.hale.common.schema.model.constraint.type.Binding)12 DefaultPropertyDefinition (eu.esdihumboldt.hale.common.schema.model.impl.DefaultPropertyDefinition)12