package com.revolsys.record.io.format.esri.gdb.xml.model; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import com.revolsys.record.io.format.esri.gdb.xml.EsriGeodatabaseXmlConstants; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.FieldType; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.GeometryType; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.MergePolicyType; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.RelCardinality; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.RelClassKey; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.RelKeyRole; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.RelKeyType; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.RelNotification; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.SplitPolicyType; import com.revolsys.record.io.format.esri.gdb.xml.model.enums.WorkspaceType; import com.revolsys.record.io.format.xml.StaxReader; import com.revolsys.record.io.format.xml.XmlProcessor; import com.revolsys.spring.resource.ByteArrayResource; import com.revolsys.spring.resource.Resource; public class EsriGdbXmlParser extends XmlProcessor implements EsriGeodatabaseXmlConstants { private static final Map<String, Class<?>> TAG_NAME_CLASS_MAP = new HashMap<>(); static { TAG_NAME_CLASS_MAP.put(CHILDREN.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(SUBTYPE.getLocalPart(), Subtype.class); TAG_NAME_CLASS_MAP.put(FIELD_INFOS.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(SUBTYPE_FIELD_INFO.getLocalPart(), SubtypeFieldInfo.class); TAG_NAME_CLASS_MAP.put(RELATIONSHIP_CLASS_NAMES.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(CODED_VALUE.getLocalPart(), CodedValue.class); TAG_NAME_CLASS_MAP.put(CODED_VALUE_DOMAIN.getLocalPart(), CodedValueDomain.class); TAG_NAME_CLASS_MAP.put(CODED_VALUES.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(DATA_ELEMENT.getLocalPart(), DataElement.class); TAG_NAME_CLASS_MAP.put(DATASET_DEFINITIONS.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(DE_DATASET.getLocalPart(), DEDataset.class); TAG_NAME_CLASS_MAP.put(DE_GEO_DATASET.getLocalPart(), DEGeoDataset.class); TAG_NAME_CLASS_MAP.put(DE_FEATURE_DATASET.getLocalPart(), DEFeatureDataset.class); TAG_NAME_CLASS_MAP.put(DE_FEATURE_CLASS.getLocalPart(), DEFeatureClass.class); TAG_NAME_CLASS_MAP.put(DE_TABLE.getLocalPart(), DETable.class); TAG_NAME_CLASS_MAP.put(DOMAIN.getLocalPart(), Domain.class); TAG_NAME_CLASS_MAP.put(DOMAINS.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(ENVELOPE.getLocalPart(), Envelope.class); TAG_NAME_CLASS_MAP.put(ENVELOPE_N.getLocalPart(), EnvelopeN.class); TAG_NAME_CLASS_MAP.put(SPATIAL_REFERENCE.getLocalPart(), SpatialReference.class); TAG_NAME_CLASS_MAP.put(FIELD_ARRAY.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(FIELDS.getLocalPart(), null); TAG_NAME_CLASS_MAP.put(FIELD.getLocalPart(), Field.class); TAG_NAME_CLASS_MAP.put(INDEX_ARRAY.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(INDEXES.getLocalPart(), null); TAG_NAME_CLASS_MAP.put(METADATA.getLocalPart(), null); TAG_NAME_CLASS_MAP.put(INDEX.getLocalPart(), Index.class); TAG_NAME_CLASS_MAP.put(GEOMETRY_DEF.getLocalPart(), GeometryDef.class); TAG_NAME_CLASS_MAP.put(CONTROLLER_MEMBERSHIP.getLocalPart(), GeometryDef.class); TAG_NAME_CLASS_MAP.put(PROPERTY_ARRAY.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(PROPERTY_SET.getLocalPart(), null); TAG_NAME_CLASS_MAP.put(PROPERTY_SET_PROPERTY.getLocalPart(), PropertySetProperty.class); TAG_NAME_CLASS_MAP.put(EXTENT.getLocalPart(), EnvelopeN.class); TAG_NAME_CLASS_MAP.put(GEOGRAPHIC_COORDINATE_SYSTEM.getLocalPart(), GeographicCoordinateSystem.class); TAG_NAME_CLASS_MAP.put(PROJECTED_COORDINATE_SYSTEM.getLocalPart(), ProjectedCoordinateSystem.class); TAG_NAME_CLASS_MAP.put(SUBTYPES.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(SUBTYPES.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(WORKSPACE_DATA.getLocalPart(), ArrayList.class); TAG_NAME_CLASS_MAP.put(WORKSPACE_DEFINITION.getLocalPart(), WorkspaceDefinition.class); TAG_NAME_CLASS_MAP.put(WORKSPACE.getLocalPart(), Workspace.class); } @SuppressWarnings("unchecked") public static <T> T parse(final Resource resource) { final EsriGdbXmlParser parser = new EsriGdbXmlParser(); return (T)parser.process(resource); } @SuppressWarnings("unchecked") public static <T> T parse(final String text) { final byte[] bytes = text.getBytes(); final ByteArrayResource resource = new ByteArrayResource(bytes); return (T)parse(resource); } public EsriGdbXmlParser() { super("http://www.esri.com/schemas/ArcGIS/10.1", TAG_NAME_CLASS_MAP); } @Override protected void initConverters() { super.initConverters(); registerEnumConverter(FieldType.class); registerEnumConverter(MergePolicyType.class); registerEnumConverter(RelCardinality.class); registerEnumConverter(RelClassKey.class); registerEnumConverter(RelKeyRole.class); registerEnumConverter(RelKeyType.class); registerEnumConverter(RelNotification.class); registerEnumConverter(SplitPolicyType.class); registerEnumConverter(WorkspaceType.class); registerEnumConverter(GeometryType.class); } public List<ControllerMembership> processControllerMemberships(final StaxReader parser) throws XMLStreamException, IOException { final List<ControllerMembership> controllerMemberships = new ArrayList<>(); while (parser.nextTag() == XMLStreamConstants.START_ELEMENT) { final Object value = process(parser); if (value instanceof ControllerMembership) { final ControllerMembership controllerMembership = (ControllerMembership)value; controllerMemberships.add(controllerMembership); } } return controllerMemberships; } }