/**
*
*/
package com.sap.furcas.runtime.parser.impl;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.parser.ANTLR3LocationToken;
import com.sap.furcas.runtime.parser.IModelAdapter;
import com.sap.furcas.runtime.parser.ModelElementCreationException;
/**
* simple implementation using a simple resolution strategy and a
* IBareModelAdapter else.
*/
public class DefaultTextAwareModelAdapter implements IModelAdapter {
private final IBareModelAdapter modelAdapter;
/**
* @param modelAdapter
*/
public DefaultTextAwareModelAdapter(IBareModelAdapter modelAdapter) {
super();
if (modelAdapter == null) {
throw new IllegalArgumentException();
}
this.modelAdapter = modelAdapter;
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.ITextAwareModelAdapter#createOrResolveElement(java.util.List,
* java.util.Map,
* com.sap.mi.textual.grammar.antlr3.ANTLR3LocationToken,
* com.sap.mi.textual.grammar.antlr3.ANTLR3LocationToken)
*/
@Override
public Object createOrResolveElement(List<String> typeName, Map<String, List<Object>> attributes,
ANTLR3LocationToken firstToken, ANTLR3LocationToken lastToken, boolean resolveOnly, boolean createOnly)
throws ModelAdapterException, ModelElementCreationException {
// ModelElementProxy proxy = (ModelElementProxy) proxyObject;
// If referenceOnly, merely resolve it, don't create it
if (resolveOnly) {
try {
Collection<Object> resultSet = modelAdapter.queryElement(typeName, attributes);
if (resultSet != null && resultSet.size() >= 1) {
if (resultSet.size() == 1) {
return resultSet.iterator().next();
} else {
throw new ModelElementCreationException("Reference " + typeName + " with attributes " + attributes
+ " is ambiguous. Expected one result but found " + resultSet.size());
}
} else {
throw new ModelElementCreationException("Reference " + typeName + " with attributes " + attributes
+ " could not be resolved. Nothing found.");
}
} catch (ModelAdapterException e) {
// TODO move this to getModelAdapter() and
// delete ModelElement on errors (?)
throw new ModelElementCreationException("BUG: Exception resolving type " + typeName + " with attributes "
+ attributes + " : " + e.getMessage(), e);
}
} else { // create new object and set its attributes,
// this is the default behavior
Object createdObject = modelAdapter.createElement(typeName);
Set<String> features = attributes.keySet();
for (String prop : features) {
List<Object> valueList = attributes.get(prop);
for (Object value : valueList) {
if (value instanceof ModelElementProxy) {
ModelElementProxy valueProxy = (ModelElementProxy) value;
value = valueProxy.getRealObject();
if (value == null) {
throw new RuntimeException("Bug: proxy value for '" + prop + "' of type " + valueProxy.getType()
+ " had not been resolved.");
}
}
try {
set(createdObject, prop, value);
} catch (ModelAdapterException e) {
// TODO move this to
// getModelAdapter() and delete
// ModelElement on errors (?)
throw new ModelElementCreationException("Exception setting feature " + prop + " for object "
+ createdObject + " to " + value + ": " + e.getMessage(), e);
}
}
}
return createdObject;
}
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelAdapter#createEnumLiteral(java.util.List,
* java.lang.String)
*/
@Override
public Object createEnumLiteral(List<String> enumName, String name) throws ModelAdapterException {
return modelAdapter.createEnumLiteral(enumName, name);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelAdapter#hasDeferredActions()
*/
@Override
public boolean hasDeferredActions() {
return modelAdapter.hasDeferredActions();
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelAdapter#performAllDeferredActions()
*/
@Override
public Map<Object, Object> performAllDeferredActions() throws DeferredActionResolvingException {
return modelAdapter.performAllDeferredActions();
}
/*
* (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 {
modelAdapter.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 {
modelAdapter.set(modelElement, prop, value, index);
}
@Override
public void unset(Object modelElement, String prop, Object value) throws ModelAdapterException {
modelAdapter.unset(modelElement, prop, value);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelAdapter#setOclReference(java.lang.Object,
* java.lang.String, java.lang.Object, java.lang.String,
* java.lang.Object)
*/
@Override
public Object setReferenceWithOCLQuery(Object modelElement, String propertyName, Object keyValue, String oclQuery,
Object contextElement, Object currentForeachElement) throws ModelAdapterException, ReferenceSettingException {
return modelAdapter
.setReferenceWithOCLQuery(modelElement, propertyName, keyValue, oclQuery, contextElement, currentForeachElement);
}
@Override
public Collection<?> evaluateOCLQuery(Object modelElement, Object keyValue, String oclQuery, Object contextElement) throws ModelAdapterException {
return modelAdapter.evaluateOCLQuery(modelElement, keyValue, oclQuery, contextElement);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelAdapter#setReference(java.lang.Object,
* java.lang.String, java.util.List, java.lang.String,
* java.lang.Object)
*/
@Override
public Object setReferenceWithLookup(Object sourceModelElement, String referencePropertyName, List<String> targetType,
String targetKeyName, Object targetKeyValue) throws ModelAdapterException, ReferenceSettingException {
return modelAdapter.setReferenceWithLookup(sourceModelElement, referencePropertyName, targetType, targetKeyName, targetKeyValue);
}
/*
* (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 modelAdapter.setReferenceWithContextLookup(modelElement, propertyName, valueTypeName, keyName, keyValue, contextObject);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelElementInvestigator#get(java.lang.Object,
* java.lang.String)
*/
@Override
public Object get(Object modelElement, String propertyName) throws ModelAdapterException {
return modelAdapter.get(modelElement, propertyName);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelElementInvestigator#getMetaType(java.util.List)
*/
@Override
public Object getMetaType(List<String> typeName) throws ModelAdapterException {
return modelAdapter.getMetaType(typeName);
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.IModelElementInvestigator#instanceOf(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean instanceOf(Object instance, Object metaType) throws ModelAdapterException {
return modelAdapter.instanceOf(instance, metaType);
}
}