/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.isis.core.runtime.snapshot; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet; import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils; /** * Utility methods relating to the Isis meta model. */ final class IsisSchema { /** * The generated XML schema references the NOF metamodel schema. This is the * default location for this schema. */ public static final String DEFAULT_LOCATION = "isis.xsd"; /** * The base of the namespace URI to use for application namespaces if none * explicitly supplied in the constructor. */ public final static String DEFAULT_URI_BASE = "http://isis.apache.org/ns/app/"; /** * Enumeration of isis:feature attribute representing a class */ public static final String FEATURE_CLASS = "class"; /** * Enumeration of isis:feature attribute representing a collection (1:n * association) */ public static final String FEATURE_COLLECTION = "collection"; /** * Enumeration of isis:feature attribute representing a reference (1:1 * association) */ public static final String FEATURE_REFERENCE = "reference"; /** * Enumeration of isis:feature attribute representing a value field */ public static final String FEATURE_VALUE = "value"; /** * Namespace prefix for {@link NS_URI}. * * The NamespaceManager will not allow any namespace to use this prefix. */ public static final String NS_PREFIX = "isis"; /** * URI representing the namespace of ObjectAdapter framework's metamodel. * * The NamespaceManager will not allow any namespaces with this URI to be * added. */ public static final String NS_URI = "http://isis.apache.org/ns/0.1/metamodel"; private final Helper helper; public IsisSchema() { this.helper = new Helper(); } void addNamespace(final Element element) { helper.rootElementFor(element).setAttributeNS(XsMetaModel.W3_ORG_XMLNS_URI, XsMetaModel.W3_ORG_XMLNS_PREFIX + ":" + IsisSchema.NS_PREFIX, IsisSchema.NS_URI); } /** * Creates an element in the "isis" namespace, appends to parent, and adds "isis" * namespace to the root element if required. */ Element appendElement(final Element parentElement, final String localName) { final Element element = helper.docFor(parentElement).createElementNS(IsisSchema.NS_URI, IsisSchema.NS_PREFIX + ":" + localName); parentElement.appendChild(element); // addNamespace(parentElement); return element; } /** * Appends an <code>isis:title</code> element with the supplied title string * to the provided element. */ public void appendIsisTitle(final Element element, final String titleStr) { final Document doc = helper.docFor(element); final Element titleElement = appendElement(element, "title"); titleElement.appendChild(doc.createTextNode(titleStr)); } /** * Gets an attribute with the supplied name in the Isis namespace from the * supplied element */ String getAttribute(final Element element, final String attributeName) { return element.getAttributeNS(IsisSchema.NS_URI, attributeName); } /** * Adds an <code>isis:annotation</code> attribute for the supplied class to * the supplied element. */ void setAnnotationAttribute(final Element element, final String annotation) { setAttribute(element, "annotation", IsisSchema.NS_PREFIX + ":" + annotation); } /** * Sets an attribute of the supplied element with the attribute being in the * Isis namespace. */ private void setAttribute(final Element element, final String attributeName, final String attributeValue) { element.setAttributeNS(IsisSchema.NS_URI, IsisSchema.NS_PREFIX + ":" + attributeName, attributeValue); } /** * Adds <code>isis:feature="class"</code> attribute and * <code>isis:oid="e;..."</code> for the supplied element. */ void setAttributesForClass(final Element element, final String oid) { setAttribute(element, "feature", FEATURE_CLASS); setAttribute(element, "oid", oid); } /** * Adds <code>isis:feature="reference"</code> attribute and * <code>isis:type="e;..."</code> for the supplied element. */ void setAttributesForReference(final Element element, final String prefix, final String fullyQualifiedClassName) { setAttribute(element, "feature", FEATURE_REFERENCE); setAttribute(element, "type", prefix + ":" + fullyQualifiedClassName); } /** * Adds <code>isis:feature="value"</code> attribute and * <code>isis:datatype="e;..."</code> for the supplied element. */ void setAttributesForValue(final Element element, final String datatypeName) { setAttribute(element, "feature", FEATURE_VALUE); setAttribute(element, "datatype", IsisSchema.NS_PREFIX + ":" + datatypeName); } /** * Adds an <code>isis:isEmpty</code> attribute for the supplied class to the * supplied element. */ void setIsEmptyAttribute(final Element element, final boolean isEmpty) { setAttribute(element, "isEmpty", "" + isEmpty); } /** * Adds <code>isis:feature="collection"</code> attribute, the * <code>isis:type="e;..."</code> and the * <code>isis:size="e;..."</code> for the supplied element. * * Additionally, if the <code>addOids</code> parameter is set, also adds * <code><oids></code> child elements. */ void setIsisCollection(final Element element, final String prefix, final String fullyQualifiedClassName, final ObjectAdapter collection) { setAttribute(element, "feature", FEATURE_COLLECTION); setAttribute(element, "type", prefix + ":" + fullyQualifiedClassName); final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(collection); setAttribute(element, "size", "" + facet.size(collection)); } }