package com.sap.furcas.runtime.parser.testbase.stubs; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; 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.util.QualifiedNamesHelper; import com.sap.furcas.runtime.parser.ANTLR3LocationToken; import com.sap.furcas.runtime.parser.IModelAdapter; public class StubModelAdapter implements IModelAdapter, IBareModelAdapter { protected StubModel model = new StubModel(); public String stringLiteralType = "FURCAS::TCS::Literal"; public Map<String, List<String>> supertypes = new HashMap<String, List<String>>(); public Object queryResult; /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#createOrResolveElement(java. util.List, java.util.Map, * com.sap.mi.textual.grammar.antlr3.ANTLR3LocationToken, com.sap.mi.textual.grammar.antlr3.ANTLR3LocationToken, boolean, * boolean) */ @Override public Object createOrResolveElement(List<String> typeName, Map<String, List<Object>> attributes, ANTLR3LocationToken firstToken, ANTLR3LocationToken lastToken, boolean resolveOnly, boolean createOnly) { Object ro = createElement(typeName); for (String key : attributes.keySet()) { List<Object> values = attributes.get(key); for (Object value : values) { set(ro, key, value); } } return ro; } @Override public Object createElement(List<String> typeName) { return model.create(QualifiedNamesHelper.getQualifiedString(typeName)); } @Override public Object get(Object ame_, String propertyName) { return ((StubModelElement) ame_).get(propertyName); } public Collection<Object> getElementsOfType(List<String> list) { StringBuilder buf = new StringBuilder(); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String part = iterator.next(); buf.append(part); if (iterator.hasNext()) { buf.append("::"); } } return new ArrayList<Object>(getElementsOfType(buf.toString())); } public Collection<StubModelElement> getElementsOfType(String type) { return model.getElementsOfType(type); } public String getString(Object ame, String propName) { return get(ame, propName).toString(); } @Override public void set(Object ame, String prop, Object value) { if (prop == null) { fail("Invalid call to set using null property."); } // if (value == null && prop.equals("name")) { // fail("Invalid call to set name using null value for " + // ((StubModelElement)ame).type + "." + prop ); // } ((StubModelElement) ame).set(prop, value); } @Override public void set(Object ame, String prop, Object value, int index) { if (prop == null) { fail("Invalid call to set using null property."); } // if (value == null && prop.equals("name")) { // fail("Invalid call to set name using null value for " + // ((StubModelElement)ame).type + "." + prop ); // } ((StubModelElement) ame).set(prop, value); } @Override public Object createEnumLiteral(List<String> names, String name) { return model.create(name); } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#getMetaType(java.util.List) */ @Override public Object getMetaType(List<String> typeNameList) { // typename is merely the string with the name of the meta type String typeName = QualifiedNamesHelper.getQualifiedString(typeNameList); return typeName; } @Override public boolean instanceOf(Object instance, Object typeName) { if (instance instanceof StubModelElement) { StubModelElement modelElement = (StubModelElement) instance; if (modelElement.type != null) { if (modelElement.type.equals(typeName)) { return true; } List<String> superList = supertypes.get(modelElement.type); if (superList != null) { for (String superType : superList) { if (superType.equals(typeName)) { return true; } } } } // System.out.println(modelElement.type + " not instanceOf " + // typeName); } return false; } /* * (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> targetTypeList, String targetKeyName, Object targetKeyValue) throws ModelAdapterException { Object val = null; String targetType = QualifiedNamesHelper.getQualifiedString(targetTypeList); Collection<StubModelElement> list = model.getElementsOfType(targetType); if (list != null) { for (Object object : list) { StubModelElement element = (StubModelElement) object; Object key = element.get(targetKeyName); if (key != null && key.equals(targetKeyValue)) { if (((StubModelElement) sourceModelElement).get(referencePropertyName) != null) { throw new ReferenceSettingException("Ambiguous reference for " + sourceModelElement + "." + referencePropertyName); } ((StubModelElement) sourceModelElement).set(referencePropertyName, element); val = element; } } } else { return null; // throw new // ModelAdapterException("StubModelAdapter has no element of type: " // + targetType + " while trying to set feature " + // ((StubModelElement)sourceModelElement).type + "." + // referencePropertyName); } return val; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#hasDeferredActions() */ @Override public boolean hasDeferredActions() { return false; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#performAllDeferredActions() */ @Override public Map<Object, Object> performAllDeferredActions() { return null; } /* * (non-Javadoc) * * @see com.sap.mi.textual.grammar.IModelAdapter#setMQLReference(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) { ((StubModelElement) modelElement).set(propertyName, queryResult); return queryResult; } /* * (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 { Object val = null; String targetType = QualifiedNamesHelper.getQualifiedString(valueTypeName); StubModelElement contextModelElement = (StubModelElement) contextObject; Collection<StubModelElement> list = model.getElementsOfType(targetType); if (list != null) { for (Object object : list) { StubModelElement element = (StubModelElement) object; // Object key = element.get(keyName); // if (key != null && key.equals(keyValue)) { if (contextModelElement != null && contextModelElement.equals(element)) { if (((StubModelElement) modelElement).get(propertyName) != null) { throw new ReferenceSettingException("Ambiguous reference for " + modelElement + "." + propertyName); } ((StubModelElement) modelElement).set(propertyName, element); val = element; } } } else { return null; // throw new // ModelAdapterException("StubModelAdapter has no element of type: " // + targetType + " while trying to set feature " + // ((StubModelElement)sourceModelElement).type + "." + // referencePropertyName); } return val; } @Override public Collection<Object> queryElement(List<String> type, Map<String, List<Object>> attributes) { fail("not implemented yet."); return null; } @Override public void unset(Object modelElement, String prop, Object value) { fail("not implemented yet"); } @Override public Collection<?> evaluateOCLQuery(Object modelElement, Object keyValue, String oclQuery, Object contextElement) { fail("not implemented yet"); return null; } }