package com.sap.furcas.runtime.parser.impl; import java.util.List; import org.eclipse.emf.ecore.EObject; import com.sap.furcas.runtime.common.exceptions.ModelAdapterException; import com.sap.furcas.runtime.common.exceptions.ReferenceSettingException; import com.sap.furcas.runtime.common.interfaces.IModelElementProxy; import com.sap.furcas.runtime.parser.ANTLR3LocationToken; import com.sap.furcas.runtime.parser.IModelAdapter; import com.sap.furcas.runtime.parser.ModelElementCreationException; import com.sap.furcas.runtime.parser.ParsingError; import com.sap.furcas.runtime.parser.impl.context.ContextManager; public class DefaultLookupDelayedReference extends DelayedReference { public DefaultLookupDelayedReference(IModelElementProxy currentContextElement, Object currentForeachElement, Object modelElement, String propertyName, List<String> valueTypeName, String keyName, Object keyValue, String lookIn, String autoCreate, List<String> createAs, boolean importContext, String createIn, boolean b, ANTLR3LocationToken lastToken) { super(currentContextElement, currentForeachElement, modelElement, propertyName, valueTypeName, keyName, keyValue, lookIn, autoCreate, createAs, importContext, createIn, b, ReferenceType.TYPE_OCL, lastToken); } public DefaultLookupDelayedReference(IModelElementProxy currentContextElement, Object currentForeachElement, Object object, String propertyName, String keyName, Object keyValue, String query, boolean optional, ANTLR3LocationToken lastToken) { super(currentContextElement, currentForeachElement, object, propertyName, keyName, keyValue, query, ReferenceType.TYPE_OCL, optional, lastToken); } /** * default way of setting references, instead of using MQL query * * @param reference * @param modelAdapter * @param referenceContext * @param contextByElement * @throws ModelAdapterException * @throws ModelElementCreationException */ public boolean setDelayedReference(DelayedReference reference, IModelAdapter modelAdapter, ContextManager contextManager, ObservableInjectingParser parser) throws ModelAdapterException, ModelElementCreationException { Object contextElement = reference.getContextElement(); if (contextElement instanceof IModelElementProxy) { IModelElementProxy proxyContext = (IModelElementProxy) contextElement; contextElement = proxyContext.getRealObject(); } // TODO validate no obsolete property args are set try { contextElement = DelayedReferencesHelper.getNavigatedContextElementFromReference(reference, modelAdapter, contextManager, contextElement); if (reference.getModelElement() instanceof ModelElementProxy) { ModelElementProxy proxy = (ModelElementProxy) reference .getModelElement(); if (proxy.getRealObject() == null) { Object result; result = modelAdapter.createOrResolveElement( proxy.getType(), proxy.getAttributeMap(), null, null, false, true); if (result instanceof EObject) { reference.setModelElement(result); } } else { reference.setModelElement(proxy.getRealObject()); } } Object result = modelAdapter.setReferenceWithOCLQuery( reference.getModelElement(), reference.getPropertyName(), reference.getKeyValue(), reference.getOclQuery(), contextElement, reference.getCurrentForeachElement()); if (result == null) { String message = "Referenced ModelElement for query '" + reference.getOclQuery() + "' was not found for property '" + reference.getPropertyName() + "' of " + reference.getModelElement().getClass().getName() + " with key value: " + reference.getKeyValue(); parser.getInjector().addError(new ParsingError(message, reference.getToken())); return false; } else { reference.setRealValue(result); return true; } } catch (ReferenceSettingException rse) { parser.getInjector().addError(new ParsingError(rse.getMessage(), reference.getToken())); return false; } catch (LookupPathNavigationException lpne) { parser.getInjector().addError(new ParsingError(lpne.getMessage(), reference.getToken())); return false; } catch (ModelElementCreationException e) { parser.getInjector().addError(new ParsingError(e.getMessage(), reference.getToken())); return false; } } }