Search in sources :

Example 1 with XSDElement

use of easik.xml.xsd.nodes.elements.XSDElement in project fql by CategoricalData.

the class XSDExporter method createConstraint.

/**
 * Add an annotation explaining the equalizer and effect the isA.
 * <p/>
 * Today, this has two parts. First the annotation. For example in the
 * standard equalizer constraint in constraints.easik gives this annotation:
 *
 * <pre>
 * &lt;xs:annotation>
 *  &lt;xs:documentation>
 *     Equalizer(f3); B(f4) ;C(f5) ;Codomain =
 *     Equalizer(f1); D(f2) ;Codomain
 *   &lt;/xs:documentation>
 * &lt;/xs:annotation>
 * </pre>
 * <p/>
 * In addition, the equalizer entity has an "isA" relationship to another
 * entity at the start of the diagram, so this is reflected in the typing.
 * First, an element of equalizer type is added to the target of the "isA"
 * relationship. Second, since there is no need for a separate element in
 * the schema for the equalizer entity, its element is removed from the
 * sketch entity.
 *
 * @param eq
 *            the equalizer diagram constraint.
 * @todo Why not do this with standard isA relationships as well?
 * @todo The equalizer element should be added in some way so there is a
 *       "minoccurs" of zero.
 * @todo The equalizer does not really need a "key" element, but what if
 *       other constraints refer to it.
 */
private void createConstraint(final EqualizerConstraint<SketchFrame, SketchGraphModel, Sketch, EntityNode, SketchEdge> eq) {
    final List<ModelPath<SketchFrame, SketchGraphModel, Sketch, EntityNode, SketchEdge>> paths = eq.getEqualizerPaths();
    final EntityNode equalizer = eq.getEqualizerEntity();
    final XSDType domType = equalizer.getXsdType();
    final String keyrefName = Easik.getInstance().getSettings().getProperty("xml_keyref_name");
    final List<String> values = new ArrayList<>(paths.size());
    for (final ModelPath<SketchFrame, SketchGraphModel, Sketch, EntityNode, SketchEdge> path : paths) {
        final LinkedList<SketchEdge> tmpPath = new LinkedList<>(path.getEdges());
        tmpPath.removeFirst();
        if (tmpPath.size() == 0) {
            values.add(equalizer.getName() + '(' + path.getFirstEdge().getForeignKeyName(keyrefName) + ')');
        } else {
            values.add(equalizer.getName() + '(' + path.getFirstEdge().getForeignKeyName(keyrefName) + ')' + xmlJoinPath(tmpPath, true));
        }
    }
    final EntityNode isaNode = paths.get(0).getDomain();
    final XSDComplexType isaNodeType = (XSDComplexType) isaNode.getXsdType();
    final XSDElement element = equalizer.getXsdElement();
    element.setParent(isaNode.getXsdElement());
    isaNodeType.addAtom(element);
    equalizer.setXsdElement(null);
    domType.addAnnotation(new XSDAnnotation(EasikTools.join(" = " + lineSep, values)));
}
Also used : ArrayList(java.util.ArrayList) XSDElement(easik.xml.xsd.nodes.elements.XSDElement) LinkedList(java.util.LinkedList) EntityNode(easik.sketch.vertex.EntityNode) XSDType(easik.xml.xsd.nodes.types.XSDType) SketchGraphModel(easik.sketch.util.graph.SketchGraphModel) SketchFrame(easik.ui.SketchFrame) SketchEdge(easik.sketch.edge.SketchEdge) ModelPath(easik.model.path.ModelPath) Sketch(easik.sketch.Sketch) XSDAnnotation(easik.xml.xsd.nodes.XSDAnnotation) XSDComplexType(easik.xml.xsd.nodes.types.XSDComplexType)

Example 2 with XSDElement

use of easik.xml.xsd.nodes.elements.XSDElement in project fql by CategoricalData.

the class XSDExporter method createEntities.

/**
 * First pass - create the XML Schema types and the associated elements.
 * <p/>
 * Loop through the entities in the sketch. For each one, create a complex
 * type and a corresponding element.
 *
 * @see easik.xml.xsd.nodes.types.XSDComplexType
 * @see easik.xml.xsd.nodes.elements.XSDElement
 */
private void createEntities() {
    final Collection<EntityNode> nodeCollection = sketch.getEntities();
    for (final EntityNode entity : nodeCollection) {
        final XSDComplexType complexType = new XSDComplexType(entity, null);
        entity.setXsdType(complexType);
    }
    for (final EntityNode entity : nodeCollection) {
        entity.setXsdElement(new XSDElement(entity, topLevel));
    }
}
Also used : XSDElement(easik.xml.xsd.nodes.elements.XSDElement) XSDComplexType(easik.xml.xsd.nodes.types.XSDComplexType) EntityNode(easik.sketch.vertex.EntityNode)

Example 3 with XSDElement

use of easik.xml.xsd.nodes.elements.XSDElement in project fql by CategoricalData.

the class XSDExporter method createConstraint.

/**
 * Add an annotation explaining the sum constraint and effect the isAs.
 * <p/>
 * Today, this has two parts. First the annotation is truly just
 * documentation in this case. The second part of the constraint creation,
 * where the isA parts are added as elements of the type suffices to explain
 * everything that is needed. In the standard sum constraint in
 * constraints.easik gives this annotation:
 *
 * <pre>
 * &lt;xs:annotation>
 *  &lt;xs:documentation>
 *     Sum is a disjoint generalization of Summand1 and Summand2 and Summand3
 *   &lt;/xs:documentation>
 * &lt;/xs:annotation>
 * </pre>
 * <p/>
 * Each of the Summand entities have an "isA" relationship to the Sum entity
 * at the start of the diagram, so this is reflected in the typing. First,
 * an element of each Summand type is added to the target of the "isA"
 * relationship. Second, since there is no need for a separate element in
 * the schema for the Summand entity, its element is removed from the sketch
 * entity.
 *
 * @param sum
 *            the summand diagram constraint.
 * @todo Why not do this with standard isA relationships as well?
 */
private static void createConstraint(final SumConstraint<SketchFrame, SketchGraphModel, Sketch, EntityNode, SketchEdge> sum) {
    final Map<String, StringBuilder> codMap = new HashMap<>(10);
    final Map<String, XSDType> codToXMLType = new HashMap<>(10);
    XSDChoiceCompositor summands = new XSDChoiceCompositor(new ArrayList<XSDAbstractElement>(sum.getPaths().size()));
    String cdTypeName = "";
    XSDComplexType lastCodomainType = null;
    for (final ModelPath<SketchFrame, SketchGraphModel, Sketch, EntityNode, SketchEdge> path : sum.getPaths()) {
        final EntityNode coDomain = path.getCoDomain();
        final EntityNode dom = path.getDomain();
        final String coDomainName = coDomain.getName();
        final StringBuilder coDomainAnnotation;
        if (codMap.containsKey(coDomainName)) {
            coDomainAnnotation = codMap.get(coDomainName);
            coDomainAnnotation.append(" and ").append(dom.getName());
        } else {
            coDomainAnnotation = new StringBuilder(100);
            coDomainAnnotation.append(coDomain.getName()).append(" is a disjoint generalization of ").append(dom.getName());
        }
        final XSDComplexType codomainType = (XSDComplexType) coDomain.getXsdType();
        if ((null != lastCodomainType) && !cdTypeName.equals(codomainType.getName())) {
            if (!summands.isEmpty()) {
                lastCodomainType.addAtom(summands);
                summands = new XSDChoiceCompositor(new ArrayList<XSDAbstractElement>(sum.getPaths().size()));
            }
        }
        lastCodomainType = codomainType;
        cdTypeName = codomainType.getName();
        codToXMLType.put(coDomainName, codomainType);
        codMap.put(coDomainName, coDomainAnnotation);
        final XSDElement element = dom.getXsdElement();
        element.setParent(coDomain.getXsdElement());
        summands.addSubElement(element);
        dom.setXsdElement(null);
    }
    if (null != lastCodomainType) {
        if (!summands.isEmpty()) {
            lastCodomainType.addAtom(summands);
            summands = null;
        }
    }
    for (final Map.Entry<String, StringBuilder> entry : codMap.entrySet()) {
        final XSDType typ = codToXMLType.get(entry.getKey());
        typ.addAnnotation(new XSDAnnotation(entry.getValue().toString()));
    }
}
Also used : HashMap(java.util.HashMap) XSDAbstractElement(easik.xml.xsd.nodes.elements.XSDAbstractElement) ArrayList(java.util.ArrayList) XSDElement(easik.xml.xsd.nodes.elements.XSDElement) XSDType(easik.xml.xsd.nodes.types.XSDType) SketchGraphModel(easik.sketch.util.graph.SketchGraphModel) EntityNode(easik.sketch.vertex.EntityNode) SketchFrame(easik.ui.SketchFrame) SketchEdge(easik.sketch.edge.SketchEdge) Sketch(easik.sketch.Sketch) XSDChoiceCompositor(easik.xml.xsd.nodes.elements.XSDChoiceCompositor) XSDAnnotation(easik.xml.xsd.nodes.XSDAnnotation) HashMap(java.util.HashMap) Map(java.util.Map) XSDComplexType(easik.xml.xsd.nodes.types.XSDComplexType)

Aggregations

EntityNode (easik.sketch.vertex.EntityNode)3 XSDElement (easik.xml.xsd.nodes.elements.XSDElement)3 XSDComplexType (easik.xml.xsd.nodes.types.XSDComplexType)3 Sketch (easik.sketch.Sketch)2 SketchEdge (easik.sketch.edge.SketchEdge)2 SketchGraphModel (easik.sketch.util.graph.SketchGraphModel)2 SketchFrame (easik.ui.SketchFrame)2 XSDAnnotation (easik.xml.xsd.nodes.XSDAnnotation)2 XSDType (easik.xml.xsd.nodes.types.XSDType)2 ArrayList (java.util.ArrayList)2 ModelPath (easik.model.path.ModelPath)1 XSDAbstractElement (easik.xml.xsd.nodes.elements.XSDAbstractElement)1 XSDChoiceCompositor (easik.xml.xsd.nodes.elements.XSDChoiceCompositor)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1 Map (java.util.Map)1