/** * */ package com.sap.furcas.parsergenerator.emf.tcs.inject; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.ocl.ecore.opposites.OppositeEndFinder; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import com.sap.furcas.metamodel.FURCAS.FURCASPackage; import com.sap.furcas.modeladaptation.emf.adaptation.EMFModelAdapter; import com.sap.furcas.modeladaptation.emf.lookup.QueryBasedEcoreMetaModelLookUp; import com.sap.furcas.runtime.common.exceptions.DeferredActionResolvingException; import com.sap.furcas.runtime.common.exceptions.ModelAdapterException; import com.sap.furcas.runtime.common.exceptions.ReferenceSettingException; import com.sap.furcas.runtime.common.interfaces.IBareModelAdapter; import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup; import com.sap.furcas.runtime.common.util.EcoreHelper; import com.sap.furcas.runtime.common.util.TCSSpecificOCLEvaluator; import com.sap.furcas.runtime.parser.PartitionAssignmentHandlerBaseImpl; import com.sap.ocl.oppositefinder.query2.Query2OppositeEndFinder; import de.hpi.sam.bp2009.solution.queryContextScopeProvider.QueryContextProvider; /** * Specialized EMF Adapter for TCS Syntaxes */ public class TCSSpecificEMFModelAdapter implements IBareModelAdapter { private final EMFModelAdapter adapter; /** * Instantiates an EMF model adapter to be used to create TCS syntax models. * * @param resourceSet * @param referenceScope all metamodels referenced by the syntax to be parsed */ public TCSSpecificEMFModelAdapter(ResourceSet resourceSet, Set<URI> referenceScope) { Resource transientResource = EcoreHelper.createTransientParsingResource(resourceSet, FURCASPackage.eINSTANCE.getNsURI()); // Though we get metamodel URIs passed in, we do actually want to instantiate TCS models. // The metamodels passed in are only referenced by the templates we create. Thus, they have to // to be passed as (additional) reference scope. Set<URI> metamodelURIs = new HashSet<URI>(); metamodelURIs.add(URI.createURI(FURCASPackage.eINSTANCE.getNsURI())); metamodelURIs.add(URI.createURI(EcorePackage.eINSTANCE.getNsURI())); QueryContextProvider queryContext = EcoreHelper.createProjectDependencyQueryContextProvider( resourceSet, referenceScope); OppositeEndFinder oppositeEndFinder = new Query2OppositeEndFinder(queryContext); TCSSpecificOCLEvaluator oclEvaluator = new TCSSpecificOCLEvaluator(oppositeEndFinder); IMetaModelLookup<EObject> metamodelLookup = new QueryBasedEcoreMetaModelLookUp(resourceSet, metamodelURIs); adapter = new EMFModelAdapter(resourceSet, new PartitionAssignmentHandlerBaseImpl(transientResource), metamodelLookup, referenceScope, oclEvaluator, oppositeEndFinder); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#createElement(java.lang.String) */ @Override public Object createElement(List<String> typeName) throws ModelAdapterException { Object element = adapter.createElement(typeName); return element; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#createEnumLiteral(java.lang. String, java.lang.String) */ @Override public Object createEnumLiteral(List<String> enumName, String name) throws ModelAdapterException { Object createdLiteral = adapter.createEnumLiteral(enumName, name); return createdLiteral; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#get(java.lang.Object, java.lang.String) */ @Override public Object get(Object modelElement, String propertyName) throws ModelAdapterException { Object element = adapter.get(modelElement, propertyName); return element; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#hasDeferredActions() */ @Override public boolean hasDeferredActions() { return adapter.hasDeferredActions(); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#instanceOf(java.lang.Object, java.lang.String) */ @Override public boolean instanceOf(Object instance, Object typeName) throws ModelAdapterException { return adapter.instanceOf(instance, typeName); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#performAllDeferredActions() */ @Override public Map<Object, Object> performAllDeferredActions() throws DeferredActionResolvingException { Map<Object, Object> map = adapter.performAllDeferredActions(); return map; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#set(java.lang.Object, java.lang.String, java.lang.Object) */ @Override public void set(Object modelElement, String prop, Object value) throws ModelAdapterException { adapter.set(modelElement, prop, value); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#set(java.lang.Object, java.lang.String, java.lang.Object, int) */ @Override public void set(Object modelElement, String prop, Object value, int index) throws ModelAdapterException { adapter.set(modelElement, prop, value, index); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#setReference(java.lang.Object, java.lang.String, java.lang.String, * java.lang.String, java.lang.Object) */ @Override public Object setReferenceWithLookup(Object sourceModelElement, String referencePropertyName, List<String> targetType, String targetKeyName, Object targetKeyValue) throws ModelAdapterException, ReferenceSettingException { Object reference = adapter.setReferenceWithLookup(sourceModelElement, referencePropertyName, targetType, targetKeyName, targetKeyValue); return reference; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#setOclReference(java.lang.Object , java.lang.String, java.lang.String) */ @Override public Object setReferenceWithOCLQuery(Object modelElement, String propertyName, Object keyValue, String oclQuery, Object contextObject, Object currentForeachElement) throws ModelAdapterException { Object result = adapter.setReferenceWithOCLQuery(modelElement, propertyName, keyValue, oclQuery, contextObject, currentForeachElement); return result; } @Override public Collection<?> evaluateOCLQuery(Object modelElement, Object keyValue, String oclQuery, Object contextElement) throws ModelAdapterException { throw new NotImplementedException(); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#getMetaType(java.util.List) */ @Override public Object getMetaType(List<String> typeName) throws ModelAdapterException { return adapter.getMetaType(typeName); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#setWithinContextObject(java. lang.Object, java.lang.String, java.util.List, * java.lang.String, java.lang.Object, java.lang.Object) */ @Override public Object setReferenceWithContextLookup(Object modelElement, String propertyName, List<String> valueTypeName, String keyName, Object keyValue, Object contextObject) throws ModelAdapterException, ReferenceSettingException { return adapter.setReferenceWithContextLookup(modelElement, propertyName, valueTypeName, keyName, keyValue, contextObject); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#queryElement(java.util.List, java.util.Map) */ @Override public Collection<Object> queryElement(List<String> type, Map<String, List<Object>> attributes) throws ModelAdapterException { return adapter.queryElement(type, attributes); } @Override public void unset(Object modelElement, String prop, Object value) throws ModelAdapterException { adapter.unset(modelElement, prop, value); } }