/******************************************************************************* * 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.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 Group extends Reference { static final String TAG_GROUP = SCHEMA_GROUP; protected static int count = 0; protected ElementContainer container = null; public static int getGroupCount() { return count; } static final Group createGroup(ElementParser parser, String targetNamespace, Schema schema) throws XmlPullParserException, IOException, SchemaException { String gName = parser.getAttributeValue(null, ATTRIBUTE_NAME); String gRef = parser.getAttributeValue(null, ATTRIBUTE_REF); if (gName == null && gRef == null) { throw new SchemaException("Wrong group definiton. No name or reference set."); } Group g = null; if (gName != null) { g = new Group(new QName(gName, targetNamespace)); } else { g = new Group(); } if (gRef != null) { String p = SchemaUtil.getPrefix(gRef); String n = SchemaUtil.getName(gRef); String ns = parser.getNamespace(p); g.setReferenceLink(new QName(n, ns)); schema.addGroupForResolve(g); } int d = parser.getDepth(); while (parser.nextTag() != XmlPullParser.END_TAG && parser.getDepth() == d + 1) { String namespace = parser.getNamespace(); String name = parser.getName(); if (XMLSCHEMA_NAMESPACE.equals(namespace)) { if (StringUtil.equalsIgnoreCase(ElementContainer.TAG_ALL, name)) { ElementContainer container = new AllContainer(); ElementContainer.handleContainerElements(parser, container, targetNamespace, schema); g.container = container; } else if (StringUtil.equalsIgnoreCase(ElementContainer.TAG_SEQUENCE, name)) { ElementContainer container = new SequenceContainer(); ElementContainer.handleContainerElements(parser, container, targetNamespace, schema); g.container = container; } else if (StringUtil.equalsIgnoreCase(ElementContainer.TAG_CHOICE, name)) { ElementContainer container = new ChoiceContainer(); ElementContainer.handleContainerElements(parser, container, targetNamespace, schema); g.container = container; } else if (StringUtil.equalsIgnoreCase(Annotation.TAG_ANNOTATION, name)) { Annotation.handleAnnotation(parser, g); } } } return g; } Group() { this(null); } Group(QName name) { this.name = name; if ((name != null && !XMLSCHEMA_NAMESPACE.equals(name.getNamespace())) || name == null) { count++; } } /* * (non-Javadoc) * @see org.ws4d.java.types.schema.Annotation#getSchemaIdentifier() */ public int getSchemaIdentifier() { return XSD_GROUP; } public Element getElementByName(QName name) { return reference != null ? ((Group) reference).getElementByName(name) : container == null ? null : container.getElementByName(name); } public Element getElementByName(String name) { return reference != null ? ((Group) reference).getElementByName(name) : container == null ? null : container.getElementByName(name); } public int getElementCount() { return reference != null ? ((Group) reference).getElementCount() : container == null ? 0 : container.getElementCount(); } public boolean hasElements() { return reference != null ? ((Group) reference).hasElements() : container == null ? false : container.hasElements(); } public Iterator elements() { return reference != null ? ((Group) reference).elements() : container == null ? EmptyStructures.EMPTY_ITERATOR : container.allElements(); } public int getContainerType() { return reference != null ? ((Group) reference).getContainerType() : container != null ? container.getContainerType() : ComplexType.CONTAINER_ALL; } public int getContainerMinOccurs() { return reference != null ? ((Group) reference).getContainerMinOccurs() : container != null ? container.getMinOccurs() : 0; } public int getContainerMaxOccurs() { return reference != null ? ((Group) reference).getContainerMaxOccurs() : container != null ? container.getMaxOccurs() : 0; } /** * Returns the enclosed container for this group. * * @return the enclosed container. * @see SequenceContainer * @see AllContainer * @see ChoiceContainer */ public ElementContainer getContainer() { return reference != null ? ((Group) reference).getContainer() : container != null ? container : null; } public Iterator listAll() { if (reference != null) { return ((Group) reference).listAll(); } if (container == null) { return EmptyStructures.EMPTY_ITERATOR; } return container.listAll(); } void serialize(XmlSerializer serializer, Schema schema) throws IOException { serializer.startTag(XMLSCHEMA_NAMESPACE, TAG_GROUP); if (name != null) { serializer.attribute(null, ATTRIBUTE_NAME, name.getLocalPart()); } if (reference != null) { QName refName = reference.getName(); String prefix = serializer.getPrefix(refName.getNamespace(), false); if (!(prefix == null || "".equals(prefix))) { serializer.attribute(null, ATTRIBUTE_REF, prefix + ":" + refName.getLocalPart()); } else { serializer.attribute(null, ATTRIBUTE_REF, refName.getLocalPart()); } } if (container != null) { container.serialize(serializer, schema); } serializer.endTag(XMLSCHEMA_NAMESPACE, TAG_GROUP); } }