/**
*
*/
package com.sap.furcas.runtime.tcs;
import java.util.ArrayList;
import java.util.List;
import com.sap.furcas.metamodel.FURCAS.TCS.Operator;
import com.sap.furcas.metamodel.FURCAS.TCS.OperatorTemplate;
import com.sap.furcas.metamodel.FURCAS.TCS.QualifiedNamedElement;
import com.sap.furcas.runtime.common.exceptions.MetaModelLookupException;
import com.sap.furcas.runtime.common.exceptions.NameResolutionFailedException;
import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup;
import com.sap.furcas.runtime.common.interfaces.ResolvedNameAndReferenceBean;
/**
*
*/
public class MetaModelElementResolutionHelper<Type extends Object> {
private final IMetaModelLookup<Type> metaLookup;
/**
* @param metaLookup
*/
public MetaModelElementResolutionHelper(IMetaModelLookup<Type> metaLookup) {
this.metaLookup = metaLookup;
}
@SuppressWarnings("unchecked")
public ResolvedNameAndReferenceBean<Type> resolve(QualifiedNamedElement template) throws NameResolutionFailedException {
if (template != null) {
ResolvedNameAndReferenceBean<Type> result;
try {
if (template.getMetaReference() != null ) { // implies we are using MOIN,
// since MOIN cannot reference other technical implementation of MMs
result = metaLookup.resolveReferenceName((Type) template.getMetaReference());
if (result == null) {
throw new NameResolutionFailedException("Reference "+ template.getMetaReference() +" not known in Metamodel.");
}
} else {
if (template.getNames() == null || template.getNames().size() == 0) {
throw new IllegalArgumentException("Bug: Template encountered having neither metamodel reference nor names.");
}
result = resolve(template.getNames());
if (result == null) {
throw new NameResolutionFailedException("Name "+ MessageHelper.getTemplateName(template) +" could not be resolved.");
}
}
} catch (MetaModelLookupException e) {
throw new NameResolutionFailedException(e);
}
if(template instanceof OperatorTemplate) {
List<String> names = new ArrayList<String>(result.getNames());
for (Operator op : ((OperatorTemplate)template).getOperators()) {
names.add(op.getName());
}
result = new ResolvedNameAndReferenceBean<Type>(result.getNames(), result.getReference(), names);
}
return result;
} else {
throw new IllegalArgumentException("template may not be null");
}
}
public ResolvedNameAndReferenceBean<Type> resolve(List<String> names) throws MetaModelLookupException {
if (names == null ) {
throw new IllegalArgumentException("null not allowed");
}
return metaLookup.resolveReference(names);
}
public IMetaModelLookup<Type> getMetaLookup() {
return metaLookup;
}
}