package com.sap.furcas.ide.editor.contentassist.modeladapter; 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 java.util.Set; 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; public class StubModelAdapter implements IBareModelAdapter { protected StubModel model = new StubModel(); public String stringLiteralType = "TCS::Literal"; public Map<String, List<String>> supertypes = new HashMap<String, List<String>>(); public String mqlQuery; public Object queryResult; @Override public Object createElement(List<String> typeName) { // System.out.println("Created" + typeName); return model.create(QualifiedNamesHelper.getQualifiedString(typeName)); } @Override public Object get(Object ame_, String propertyName) { return ((StubModelElement) ame_).get(propertyName); } public Set<StubModelElement> getElementsbyType(String type) { return model.getElementsByType(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) { System.err.println("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) */ public Object setReference(Object sourceModelElement, String referencePropertyName, List<String> targetTypeList, String targetKeyName, Object targetKeyValue) throws ModelAdapterException { Object val = null; String targetType = QualifiedNamesHelper .getQualifiedString(targetTypeList); Set<StubModelElement> list = model.getElementsByType(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 mqlQuery, Object contextElement, Object currentForeachElement) { this.mqlQuery = mqlQuery; ((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 { if (contextObject instanceof StubModelElement) { String targetType = QualifiedNamesHelper .getQualifiedString(valueTypeName); StubModelElement context = (StubModelElement) contextObject; // in this object,look for an object of the given type having given // attribute with given value. Collection<Object> contents = context.getAllContained(); for (Iterator<Object> iterator = contents.iterator(); iterator .hasNext();) { Object object = iterator.next(); if (object instanceof StubModelElement) { StubModelElement contentElement = (StubModelElement) object; if (contentElement.type.equals(targetType)) { Object candidateKeyValue = contentElement.get(keyName); if (candidateKeyValue != null && candidateKeyValue.equals(keyValue)) { ((StubModelElement) modelElement).set(propertyName, contentElement); return contentElement; } } } } } throw new ReferenceSettingException( "StubModelAdapter could not set reference."); } /* * (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) { Set<StubModelElement> allOfType = model .getElementsByType(QualifiedNamesHelper .getQualifiedString(type)); if (allOfType == null) { return null; } Collection<Object> results = new ArrayList<Object>(); for (StubModelElement e : allOfType) { boolean conforms = true; for (String key : attributes.keySet()) { if (!e.get(key).equals(attributes.get(key).get(0))) { conforms = false; } } if (conforms) { results.add(e); } } return results; } @Override public void set(Object modelElement, String prop, Object value, int index) { if (prop == null) { System.err.println("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) modelElement).set(prop, value); } @Override public void unset(Object modelElement, String prop, Object value) { if (prop == null) { System.err.println("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) modelElement).set(prop, null); } @Override public Object setReferenceWithLookup(Object sourceModelElement, String referencePropertyName, List<String> targetType, String targetKeyName, Object targetKeyValue) throws ModelAdapterException, ReferenceSettingException { // TODO Auto-generated method stub return null; } @Override public Collection<?> evaluateOCLQuery(Object modelElement, Object keyValue, String oclQuery, Object contextElement) throws ModelAdapterException { // TODO Auto-generated method stub return null; } }