/******************************************************************************* * Copyright (c) 2009 MATERNA Information & Communications. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html. For further * project-related information visit http://www.ws4d.org. The most recent * version of the JMEDS framework can be obtained from * http://sourceforge.net/projects/ws4d-javame. ******************************************************************************/ package org.ws4d.java.schema; import java.io.IOException; import org.ws4d.java.io.xml.ElementParser; import org.ws4d.java.structures.EmptyStructures; import org.ws4d.java.structures.Iterator; import org.ws4d.java.structures.LinkedList; import org.ws4d.java.structures.List; import org.ws4d.java.types.QName; import org.ws4d.java.util.StringUtil; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; public class RestrictedSimpleContent extends SimpleContent implements Facets { protected List facets = EmptyStructures.EMPTY_LIST; static final void handleRestriction(ElementParser parser, RestrictedSimpleContent t, String targetNamespace, Schema schema) throws XmlPullParserException, IOException, SchemaException { String base = parser.getAttributeValue(null, InheritType.ATTRIBUTE_BASE); if (base == null) { throw new SchemaException("Cannot restrict given type. No base type set."); } String p = SchemaUtil.getPrefix(base); String n = SchemaUtil.getName(base); String ns = parser.getNamespace(p); t.setBaseLink(new QName(n, ns)); while (parser.nextTag() != XmlPullParser.END_TAG) { String namespace = parser.getNamespace(); String name = parser.getName(); if (XMLSCHEMA_NAMESPACE.equals(namespace)) { if (StringUtil.equalsIgnoreCase(FACET_ENUMERATION, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_FRACTIONDIGITS, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_LENGTH, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MAXEXCLUSIVE, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MAXINCLUSIVE, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MAXLENGTH, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MINEXCLUSIVE, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MININCLUSIVE, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_MINLENGTH, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_PATTERN, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_TOTALDIGITS, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(FACET_WHITESPACE, name)) { RestrictedSimpleType.handleFacet(parser, t, t); } else if (StringUtil.equalsIgnoreCase(TAG_SIMPLETYPE, name)) { Type baseType = createSimpleType(parser, targetNamespace, schema); /* * don't set it as base type as there is already one given * by the 'base' attribute; rather, take the additional * restrictions defined within this 'baseType' and apply * them on 't' */ // t.setBase(baseType); if (baseType instanceof RestrictedSimpleType) { RestrictedSimpleType tt = (RestrictedSimpleType) baseType; for (Iterator it = tt.facets(); it.hasNext();) { t.addFacet((Facet) it.next()); } } } else if (StringUtil.equalsIgnoreCase(Attribute.TAG_ATTRIBUTE, name)) { Attribute a = Attribute.createAttribute(parser, targetNamespace, schema); t.addAttribute(a); } else if (StringUtil.equalsIgnoreCase(AttributeGroup.TAG_ATTRIBUTEGROUP, name)) { AttributeGroup g = AttributeGroup.createAttributeGroup(parser, targetNamespace, schema); t.addAttributeGroup(g); } else if (StringUtil.equalsIgnoreCase(TAG_ANYATTRIBUTE, name)) { AnyAttribute a = AnyAttribute.createAnyAttribute(parser); t.setAnyAttribute(a); } else if (StringUtil.equalsIgnoreCase(Annotation.TAG_ANNOTATION, name)) { Annotation.handleAnnotation(parser, t); } } } if (t.getBaseLink() == null && t.getBase() == null) { throw new IOException("Cannot restrict given type. No base type set."); } } RestrictedSimpleContent() { super(); } public RestrictedSimpleContent(String name, String namespace) { this(new QName(name, namespace)); } public RestrictedSimpleContent(QName name) { super(name); } /* * (non-Javadoc) * @see org.ws4d.java.types.schema.SimpleType#getSchemaIdentifier() */ public int getSchemaIdentifier() { return XSD_RESTRICTEDSIMPLECONTENT; } public Iterator facets() { return facets.iterator(); } public void addFacet(Facet f) { if (facets == EmptyStructures.EMPTY_LIST) { facets = new LinkedList(); } facets.add(f); } void serialize(XmlSerializer serializer, Schema schema) throws IOException { serializer.startTag(XMLSCHEMA_NAMESPACE, ComplexType.TAG_COMPLEXTYPE); if (getName() != null) { serializer.attribute(null, ATTRIBUTE_NAME, getName().getLocalPart()); } serializer.startTag(XMLSCHEMA_NAMESPACE, TAG_SIMPLECONTENT); serializer.startTag(XMLSCHEMA_NAMESPACE, TAG_RESTRICTION); QName baseName = base.getName(); schema.addBaseReference(base); String prefix = serializer.getPrefix(baseName.getNamespace(), false); if (!(prefix == null || "".equals(prefix))) { baseName.setPrefix(prefix); serializer.attribute(null, ATTRIBUTE_BASE, baseName.getLocalPartPrefixed()); } else { serializer.attribute(null, ATTRIBUTE_BASE, baseName.getLocalPart()); } for (Iterator it = facets(); it.hasNext();) { Facet f = (Facet) it.next(); f.serialize(serializer); } serializeAttributes(serializer, schema); serializeAttributeGroups(serializer, schema); serializeAnyAttribute(serializer, schema); serializer.endTag(XMLSCHEMA_NAMESPACE, TAG_RESTRICTION); serializer.endTag(XMLSCHEMA_NAMESPACE, TAG_SIMPLECONTENT); serializer.endTag(XMLSCHEMA_NAMESPACE, ComplexType.TAG_COMPLEXTYPE); } }