package com.hundsun.ares.studio.emfadapter;
import java.util.Map;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.hundsun.ares.studio.core.model.extendable.ExtendModelConverterManager;
public class AresSAXXMLHandler extends SAXXMLHandler {
Map options;
public AresSAXXMLHandler(XMLResource xmiResource, XMLHelper helper,
Map<?, ?> options) {
super(xmiResource, helper, options);
this.options = options;
}
/**
* Create an object based on the prefix and type name.
*/
protected EObject createObjectByType(String prefix, String name, boolean top) {
if (top) {
handleTopLocations(prefix, name);
}
EFactory eFactory = getFactoryForPrefix(prefix);
String uri = helper.getURI(prefix);
if (eFactory == null && prefix.equals("") && uri == null) {
EPackage ePackage = handleMissingPackage(null);
if (ePackage == null) {
error(new PackageNotFoundException(null, getLocation(),
getLineNumber(), getColumnNumber()));
} else {
eFactory = ePackage.getEFactoryInstance();
}
}
documentRoot = createDocumentRoot(prefix, uri, name, eFactory, top);
if (documentRoot != null)
return documentRoot;
EObject newObject = null;
if (top && options != null
&& options.get(AresXMLProcessor.ROOT) != null
&& options.get(AresXMLProcessor.ROOT) instanceof EObject) {
newObject = (EObject) options.get(AresXMLProcessor.ROOT);
if (newObject != null) {
if (disableNotify)
newObject.eSetDeliver(false);
handleObjectAttribs(newObject);
}
} else {
if (useNewMethods) {
newObject = createObject(eFactory, helper.getType(eFactory,
name), false);
} else {
newObject = createObjectFromFactory(eFactory, name);
}
}
newObject = validateCreateObjectFromFactory(eFactory, name, newObject,
top);
if (top) {
processTopObject(newObject);
// check for simple feature
if (extendedMetaData != null && newObject != null) {
EStructuralFeature simpleFeature = extendedMetaData
.getSimpleFeature(newObject.eClass());
if (simpleFeature != null) {
isSimpleFeature = true;
isIDREF = simpleFeature instanceof EReference;
objects.push(null);
mixedTargets.push(null);
types.push(simpleFeature);
text = new StringBuffer();
}
}
}
return newObject;
}
boolean extendModel = false;
StringBuffer buffer = new StringBuffer();
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
if(name.equals(ExtendModelConverterManager.MAP_STRING)){
extendModel = true;
buffer = new StringBuffer();
}
if(extendModel){
buffer.append("<");
buffer.append(name);
for(int i = 0; i < attributes.getLength(); i++){
buffer.append(" ");
buffer.append(attributes.getQName(i));
buffer.append("=\"");
buffer.append(attributes.getValue(i));
buffer.append("\"");
}
buffer.append(">");
}
}
@Override
public void endElement(String uri, String localName, String name) {
super.endElement(uri, localName, name);
if(extendModel){
buffer.append("</");
buffer.append(name);
buffer.append(">");
}
if(name.equals(ExtendModelConverterManager.MAP_STRING)){
extendModel = false;
options.put(AresXMLLoadImpl.EXTEND_STRING, buffer.toString());
buffer = null;
}
}
@Override
public void characters(char[] ch, int start, int length) {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(extendModel){
for(int i = 0;i < length;i++){
buffer.append(ch[start+i]);
}
}
}
}