/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.core; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.ecore.xmi.XMLHelper; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler; import org.eclipse.emf.ecore.xml.type.XMLTypePackage; import org.jboss.tools.smooks.model.common.AbstractAnyType; /** * @author Dart * */ public class SmooksSAXXMLHandler extends SAXXMLHandler { public SmooksSAXXMLHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) { super(xmiResource, helper, options); } /* * (non-Javadoc) * * @see * org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler#processObject(org.eclipse * .emf.ecore.EObject) */ @Override protected void processObject(EObject object) { if (object instanceof AbstractAnyType) { ((AbstractAnyType) object).setLockCOmmentIndexChange(true); } super.processObject(object); } /* * (non-Javadoc) * * @see * org.eclipse.emf.ecore.xmi.impl.XMLHandler#endElement(java.lang.String, * java.lang.String, java.lang.String) */ @Override public void endElement(String uri, String localName, String name) { elements.pop(); Object type = types.pop(); if (type == OBJECT_TYPE) { if (text == null) { Object object = objects.pop(); if (object instanceof AbstractAnyType) { ((AbstractAnyType) object).setLockCOmmentIndexChange(false); } mixedTargets.pop(); } else { EObject object = objects.popEObject(); if (object instanceof AbstractAnyType) { ((AbstractAnyType) object).setLockCOmmentIndexChange(false); } if (mixedTargets.peek() != null && (object.eContainer() != null || recordUnknownFeature && (eObjectToExtensionMap.containsValue(object) || ((InternalEObject) object) .eDirectResource() != null))) { handleMixedText(); mixedTargets.pop(); } else { if (text.length() != 0) { handleProxy((InternalEObject) object, text.toString().trim()); } mixedTargets.pop(); text = null; } } } else if (isIDREF) { Object object = objects.pop(); if (object instanceof AbstractAnyType) { ((AbstractAnyType) object).setLockCOmmentIndexChange(false); } mixedTargets.pop(); if (text != null) { setValueFromId(objects.peekEObject(), (EReference) type, text.toString()); text = null; } isIDREF = false; } else if (isTextFeatureValue(type)) { EObject eObject = objects.popEObject(); if (eObject instanceof AbstractAnyType) { ((AbstractAnyType) eObject).setLockCOmmentIndexChange(false); } mixedTargets.pop(); if (eObject == null) { eObject = objects.peekEObject(); } setFeatureValue(eObject, (EStructuralFeature) type, text == null ? null : text.toString()); text = null; } if (isSimpleFeature) { types.pop(); Object object = objects.pop(); if (object instanceof AbstractAnyType) { ((AbstractAnyType) object).setLockCOmmentIndexChange(false); } mixedTargets.pop(); isSimpleFeature = false; } helper.popContext(prefixesToFactories); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.xmi.impl.XMLHandler#comment(char[], int, int) */ @Override public void comment(char[] ch, int start, int length) { String comment = new String(ch, start, length); Object obj = objects.get(objects.size() - 1); if (mixedTargets.peek() != null) { if (text != null) { handleMixedText(); } handleComment(comment); } else { // if (obj != null && obj instanceof AnyType) { // FeatureMap featureMap = ((AnyType) obj).getMixed(); // if (featureMap != null) { // try { // featureMap.add(XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__COMMENT, // comment); // } catch (Exception e) { // e.printStackTrace(); // } // text = null; // } // } if (obj != null && obj instanceof AbstractAnyType) { int currentSize = ((AbstractAnyType) obj).eContents().size(); ((AbstractAnyType) obj).addComment(comment, new Integer(currentSize)); } } } /* * (non-Javadoc) * * @see * org.eclipse.emf.ecore.xmi.impl.XMLHandler#handleComment(java.lang.String) */ @Override protected void handleComment(String comment) { FeatureMap featureMap = mixedTargets.peek(); featureMap.add(XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__COMMENT, comment); text = null; } }