package com.cimphony.cimtoole.util;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import com.cimphony.cimtoole.ecore.EcoreGenerator;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.vocabulary.XSD;
public class CIMToolEcoreUtil {
private static Map<Resource, Class<?>> XSD_TO_CLASS_MAP = new HashMap<Resource, Class<?>>();
private static Map<String, Class<?>> XSD_URI_TO_CLASS_MAP = new HashMap<String, Class<?>>();
private static Map<Class<?>, Resource> CLASS_TO_XSD_MAP = new HashMap<Class<?>, Resource>();
private static Map<String, EDataType> XSD_URI_TO_EDATATYPE_MAP = new HashMap<String, EDataType>();
private static Map<Resource, String> XSD_TO_PATTERN = new HashMap<Resource, String>();
private static boolean INITIALISED = false;
private static void init(){
XSD_TO_CLASS_MAP.put(XSD.xstring, java.lang.String.class);
XSD_TO_CLASS_MAP.put(XSD.integer, java.math.BigInteger.class);
XSD_TO_CLASS_MAP.put(XSD.xint, int.class);
XSD_TO_CLASS_MAP.put(XSD.xlong, long.class);
XSD_TO_CLASS_MAP.put(XSD.xshort, short.class);
XSD_TO_CLASS_MAP.put(XSD.decimal, java.math.BigDecimal.class);
XSD_TO_CLASS_MAP.put(XSD.xfloat, float.class);
XSD_TO_CLASS_MAP.put(XSD.xdouble, double.class);
XSD_TO_CLASS_MAP.put(XSD.xboolean, boolean.class);
XSD_TO_CLASS_MAP.put(XSD.xbyte, byte.class);
XSD_TO_CLASS_MAP.put(XSD.QName, javax.xml.namespace.QName.class);
XSD_TO_CLASS_MAP.put(XSD.dateTime, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.base64Binary, byte[].class);
XSD_TO_CLASS_MAP.put(XSD.hexBinary, byte[].class);
XSD_TO_CLASS_MAP.put(XSD.unsignedInt, long.class);
XSD_TO_CLASS_MAP.put(XSD.unsignedShort, int.class);
XSD_TO_CLASS_MAP.put(XSD.unsignedByte, short.class);
XSD_TO_CLASS_MAP.put(XSD.time, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.date, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.gDay, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.gMonth, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.gMonthDay, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.gYear, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.gYearMonth, java.util.Date.class);
XSD_TO_CLASS_MAP.put(XSD.anyURI, java.lang.Object.class);
XSD_TO_CLASS_MAP.put(XSD.duration, javax.xml.datatype.Duration.class);
XSD_TO_CLASS_MAP.put(XSD.NOTATION, javax.xml.namespace.QName.class);
for (Resource k : XSD_TO_CLASS_MAP.keySet()){
XSD_URI_TO_CLASS_MAP.put(k.getURI(), XSD_TO_CLASS_MAP.get(k));
if (!CLASS_TO_XSD_MAP.containsKey(XSD_TO_CLASS_MAP.get(k))){
CLASS_TO_XSD_MAP.put(XSD_TO_CLASS_MAP.get(k), k);
}
}
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xstring.toString(), EcorePackage.eINSTANCE.getEString());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.integer.toString(), EcorePackage.eINSTANCE.getEInt());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xint.toString(), EcorePackage.eINSTANCE.getEInt());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xlong.toString(), EcorePackage.eINSTANCE.getELong());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xshort.toString(), EcorePackage.eINSTANCE.getEShort());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.decimal.toString(), EcorePackage.eINSTANCE.getEBigDecimal());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xfloat.toString(), EcorePackage.eINSTANCE.getEFloat());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xdouble.toString(), EcorePackage.eINSTANCE.getEDouble());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xboolean.toString(), EcorePackage.eINSTANCE.getEBoolean());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.xbyte.toString(), EcorePackage.eINSTANCE.getEByte());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.QName.toString(), EcorePackage.eINSTANCE.getEString());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.base64Binary.toString(), EcorePackage.eINSTANCE.getEByteArray());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.hexBinary.toString(), EcorePackage.eINSTANCE.getEByteArray());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.unsignedInt.toString(), EcorePackage.eINSTANCE.getEInt());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.unsignedShort.toString(), EcorePackage.eINSTANCE.getEShort());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.unsignedByte.toString(), EcorePackage.eINSTANCE.getEByte());
XSD_URI_TO_EDATATYPE_MAP.put(XSD.NOTATION.toString(), EcorePackage.eINSTANCE.getEString());
XSD_TO_PATTERN.put(XSD.dateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSZ");
XSD_TO_PATTERN.put(XSD.time, "HH:mm:ss.SSSZ");
XSD_TO_PATTERN.put(XSD.date, "yyyy-MM-dd");
XSD_TO_PATTERN.put(XSD.gDay, "DD");
XSD_TO_PATTERN.put(XSD.gMonth, "MM");
XSD_TO_PATTERN.put(XSD.gMonthDay, "dd");
XSD_TO_PATTERN.put(XSD.gYear, "yyyy");
XSD_TO_PATTERN.put(XSD.gYearMonth, "MM");
XSD_TO_PATTERN.put(XSD.duration, "HH:mm:ss.SSS");
}
private static Map<String, EDataType> getTimeTypes(){
Map<String, EDataType> newMap = new HashMap<String, EDataType>();
for (Resource r : XSD_TO_PATTERN.keySet()){
EDataType newType = EcoreFactory.eINSTANCE.createEDataType();
String name = r.getLocalName();
name = name.substring(0,1).toUpperCase() + name.substring(1);
newType.setName("CIM"+name);
newType.setInstanceClass(Date.class);
EAnnotation annotation = EcoreFactory.eINSTANCE.createEAnnotation();
annotation.setSource(EcoreGenerator.RDF_SERIALISATION_ANNOTATION);
annotation.getDetails().put("CIMDatePattern", XSD_TO_PATTERN.get(r));
newType.getEAnnotations().add(annotation);
EAnnotation profileAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
profileAnnotation.setSource("http:///org/eclipse/emf/ecore/util/ExtendedMetaData");
profileAnnotation.getDetails().put("baseType", r.toString());
newType.getEAnnotations().add(profileAnnotation);
newMap.put(r.toString(), newType);
}
return newMap;
}
public static Map<String, EDataType> getEDataTypeMap(){
if (!INITIALISED) init();
Map<String, EDataType> newMap = new HashMap<String, EDataType>();
newMap.putAll(XSD_URI_TO_EDATATYPE_MAP);
newMap.putAll(CIMToolEcoreUtil.getTimeTypes());
return Collections.unmodifiableMap(newMap);
}
public static Class<?> getTypeClass(Resource type){
if (!INITIALISED) init();
return XSD_TO_CLASS_MAP.get(type);
}
public static Class<?> getTypeClass(String type){
if (!INITIALISED) init();
return XSD_URI_TO_CLASS_MAP.get(type);
}
public static Resource getType(Class<?> cls){
if (!INITIALISED) init();
return CLASS_TO_XSD_MAP.get(cls);
}
public static String getDocumentation(EModelElement eModelElement){
EAnnotation an = eModelElement.getEAnnotation("http://www.eclipse.org/emf/2002/GenModel"); //$NON-NLS-1$
String text = null;
if (an != null) {
if (an.getDetails().containsKey("documentation")) {//$NON-NLS-1$
text = an.getDetails().get("documentation"); //$NON-NLS-1$
} else if (an.getDetails().containsKey("Documentation")) { //$NON-NLS-1$
text = an.getDetails().get("Documentation"); //$NON-NLS-1$
}
}
return text;
}
}