/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.common.xmi; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @since 8.0 */ public class TerminatingXMIHeaderContentHandler extends DefaultHandler { public static final String HEADER_FOUND_EXCEPTION_MESSAGE = "HeaderFoundException"; //$NON-NLS-1$ public static final String XMI_NOT_FOUND_EXCEPTION_MESSAGE = "XMINotFoundException"; //$NON-NLS-1$ private static final String XMI_TAG_NAME = "XMI"; //$NON-NLS-1$ private static final String VIRTUAL_DATABASE_TAG_NAME = "VirtualDatabase"; //$NON-NLS-1$ private static final String MODEL_ANNOTATION_TAG_NAME = "ModelAnnotation"; //$NON-NLS-1$ private static final String XMI_VERSION_0020_ATTRIBUTE_NAME = "xmi:version"; //$NON-NLS-1$ private static final String XMI_VERSION_0011_ATTRIBUTE_NAME = "xmi.version"; //$NON-NLS-1$ private static final String PRODUCER_NAME_ATTRIBUTE_NAME = "ProducerName"; //$NON-NLS-1$ private static final String PRODUCER_VERSION_ATTRIBUTE_NAME = "ProducerVersion"; //$NON-NLS-1$ private static final String UUID_ATTRIBUTE_NAME = "uuid"; //$NON-NLS-1$ private static final String DESCRIPTION_ATTRIBUTE_NAME = "description"; //$NON-NLS-1$ private static final String PRIMARY_URI_ATTRIBUTE_NAME = "primaryMetamodelUri"; //$NON-NLS-1$ private static final String MODEL_TYPE_ATTRIBUTE_NAME = "modelType"; //$NON-NLS-1$ private static final String VISIBLE_ATTRIBUTE_NAME = "visible"; //$NON-NLS-1$ private static final String MODEL_NAMESPACE_URI = "namespaceURI"; //$NON-NLS-1$ private static final String MODEL_IMPORT_TAG_NAME = "modelImports"; //$NON-NLS-1$ private static final String MODELS_TAG_NAME = "models"; //$NON-NLS-1$ private static final String IMPORT_PATH_ATTRIBUTE_NAME = "path"; //$NON-NLS-1$ private static final String IMPORT_LOC_ATTRIBUTE_NAME = "modelLocation"; //$NON-NLS-1$ private static final String IMPORT_NAME_ATTRIBUTE_NAME = "name"; //$NON-NLS-1$ private static final String IMPORT_TYPE_ATTRIBUTE_NAME = "modelType"; //$NON-NLS-1$ private static final String IMPORT_UUID_ATTRIBUTE_NAME = "uuid"; //$NON-NLS-1$ private static final String IMPORT_PRIMARY_METAMODEL_URI_ATTRIBUTE_NAME = "primaryMetamodelUri"; //$NON-NLS-1$ private boolean foundXmiStartElement; private boolean foundAnnotationStartElement; private boolean foundAnnotationEndElement; private boolean foundVdbStartElement; private boolean foundVdbEndElement; private XMIHeader header; public TerminatingXMIHeaderContentHandler() { super(); this.foundXmiStartElement = false; this.foundAnnotationStartElement = false; this.foundAnnotationEndElement = false; this.foundVdbStartElement = false; this.foundVdbEndElement = false; } // ================================================================================== // I N T E R F A C E M E T H O D S // ================================================================================== /** * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String) */ @Override public void startPrefixMapping( String prefix, String uri ) throws SAXException { this.getXmiHeader().addNamespaceURI(uri); super.startPrefixMapping(prefix, uri); } /** * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement( String uri, String localName, String qName, Attributes atts ) throws SAXException { // Found the XMI tag if (localName.equalsIgnoreCase(XMI_TAG_NAME)) { this.processAttributes(atts); this.foundXmiStartElement = true; } // Found the model annotation element else if (localName.equalsIgnoreCase(MODEL_ANNOTATION_TAG_NAME)) { this.processAttributes(atts); this.foundAnnotationStartElement = true; } // Found the virtual database element else if (localName.equalsIgnoreCase(VIRTUAL_DATABASE_TAG_NAME)) { this.processVdbAttributes(atts); this.foundAnnotationStartElement = true; this.foundVdbStartElement = true; } // Found the models element else if (localName.equalsIgnoreCase(MODELS_TAG_NAME) && this.foundVdbStartElement) { this.processImportAttributes(atts); } // Found the model import element else if (localName.equalsIgnoreCase(MODEL_IMPORT_TAG_NAME)) { this.processImportAttributes(atts); } this.checkForCompletion(); super.startElement(uri, localName, qName, atts); } /** * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ @Override public void endElement( String namespaceURI, String localName, String qName ) throws SAXException { this.checkForCompletion(); if (localName.equals(MODEL_ANNOTATION_TAG_NAME)) { this.foundAnnotationEndElement = true; } else if (localName.equals(VIRTUAL_DATABASE_TAG_NAME)) { this.foundAnnotationEndElement = true; this.foundVdbEndElement = true; } super.endElement(namespaceURI, localName, qName); } // ================================================================================== // P U B L I C M E T H O D S // ================================================================================== public XMIHeader getXmiHeader() { if (this.header == null) { this.header = new XMIHeader(); } return this.header; } // ================================================================================== // P R I V A T E M E T H O D S // ================================================================================== private void checkForCompletion() throws SAXException { if (!this.foundXmiStartElement && !this.foundAnnotationStartElement && !this.foundVdbStartElement) { throw new SAXException(XMI_NOT_FOUND_EXCEPTION_MESSAGE); } if (this.foundAnnotationStartElement && this.foundAnnotationEndElement && !this.foundVdbStartElement) { throw new SAXException(HEADER_FOUND_EXCEPTION_MESSAGE); } if (this.foundVdbStartElement && this.foundVdbEndElement) { throw new SAXException(HEADER_FOUND_EXCEPTION_MESSAGE); } } private void processAttributes( final Attributes atts ) { // Check the root for model annotation information for (int i = 0; i < atts.getLength(); i++) { String name = atts.getLocalName(i); String value = atts.getValue(i); String qname = atts.getQName(i); // The UUID associated with the model is the ModelAnnotation UUID // unless this is a VDB in which case it is the VirtualDatabase UUID if (name.equalsIgnoreCase(UUID_ATTRIBUTE_NAME) && !this.foundVdbStartElement) { this.getXmiHeader().setUUID(value); } else if (name.equalsIgnoreCase(DESCRIPTION_ATTRIBUTE_NAME)) { this.getXmiHeader().setDescription(value); } else if (name.equalsIgnoreCase(PRODUCER_NAME_ATTRIBUTE_NAME)) { this.getXmiHeader().setProducerName(value); } else if (name.equalsIgnoreCase(PRODUCER_VERSION_ATTRIBUTE_NAME)) { this.getXmiHeader().setProducerVersion(value); } else if (name.equalsIgnoreCase(PRIMARY_URI_ATTRIBUTE_NAME)) { this.getXmiHeader().setPrimaryMetamodelURI(value); } else if (name.equalsIgnoreCase(MODEL_TYPE_ATTRIBUTE_NAME)) { this.getXmiHeader().setModelType(value); } else if (name.equalsIgnoreCase(MODEL_NAMESPACE_URI)) { this.getXmiHeader().setModelNamespaceUri(value); } else if (name.equalsIgnoreCase(VISIBLE_ATTRIBUTE_NAME)) { this.getXmiHeader().setVisible(value); } else if (qname.equalsIgnoreCase(XMI_VERSION_0020_ATTRIBUTE_NAME)) { this.getXmiHeader().setXmiVersion(value); } else if (qname.equalsIgnoreCase(XMI_VERSION_0011_ATTRIBUTE_NAME)) { this.getXmiHeader().setXmiVersion(value); } } } private void processVdbAttributes( final Attributes atts ) { // Check the root for model annotation information for (int i = 0; i < atts.getLength(); i++) { String name = atts.getLocalName(i); String value = atts.getValue(i); String qname = atts.getQName(i); // The UUID associated with the model is the ModelAnnotation UUID // unless this is a VDB in which case it is the VirtualDatabase UUID if (name.equalsIgnoreCase(UUID_ATTRIBUTE_NAME)) { this.getXmiHeader().setUUID(value); } else if (qname.equalsIgnoreCase(XMI_VERSION_0020_ATTRIBUTE_NAME)) { this.getXmiHeader().setXmiVersion(value); } } } private void processImportAttributes( final Attributes atts ) { // Check the root for model annotation information ModelImportInfo info = new ModelImportInfo(); for (int i = 0; i < atts.getLength(); i++) { String name = atts.getLocalName(i); String value = atts.getValue(i); if (name.equalsIgnoreCase(IMPORT_PATH_ATTRIBUTE_NAME)) { info.setPath(value); } else if (name.equalsIgnoreCase(IMPORT_LOC_ATTRIBUTE_NAME)) { info.setLocation(value); } else if (name.equalsIgnoreCase(IMPORT_UUID_ATTRIBUTE_NAME)) { info.setUUID(value); } else if (name.equalsIgnoreCase(IMPORT_NAME_ATTRIBUTE_NAME)) { info.setName(value); } else if (name.equalsIgnoreCase(IMPORT_TYPE_ATTRIBUTE_NAME)) { info.setModelType(value); } else if (name.equalsIgnoreCase(IMPORT_PRIMARY_METAMODEL_URI_ATTRIBUTE_NAME)) { info.setPrimaryMetamodelURI(value); } } this.getXmiHeader().addModelImportInfo(info); } // // Check the root for model annotation information // VdbModelInfo info = new VdbModelInfo(); // for (int i = 0; i < atts.getLength(); i++){ // String name = atts.getLocalName(i); // String value = atts.getValue(i); // if (name.equalsIgnoreCase(UUID_ATTRIBUTE_NAME)) { // info.setUUID(value); // } else if (name.equalsIgnoreCase(NAME_ATTRIBUTE_NAME)) { // info.setName(value); // } else if (name.equalsIgnoreCase(MODEL_PATH_ATTRIBUTE_NAME)) { // info.setPath(value); // } else if (name.equalsIgnoreCase(MODEL_TYPE_ATTRIBUTE_NAME)) { // info.setModelType(value); // } else if (name.equalsIgnoreCase(PRIMARY_URI_ATTRIBUTE_NAME)) { // info.setPrimaryMetamodelURI(value); // } else if (name.equalsIgnoreCase(VISIBLE_ATTRIBUTE_NAME)) { // info.setVisible(value); // } // } // this.getVdbHeader().addModelInfo(info); }