package com.temenos.interaction.rimdsl.scoping;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider.AbstractImpl;
import org.eclipse.xtext.naming.QualifiedName;
import com.google.inject.Inject;
import com.temenos.interaction.rimdsl.rim.Command;
import com.temenos.interaction.rimdsl.rim.DomainDeclaration;
import com.temenos.interaction.rimdsl.rim.Event;
import com.temenos.interaction.rimdsl.rim.Relation;
import com.temenos.interaction.rimdsl.rim.ResourceInteractionModel;
import com.temenos.interaction.rimdsl.rim.State;
/**
* IRIS QualifiedNameProvider.
*
* Don't use the DefaultDeclarativeQualifiedNameProvider, as its polymorphic
* thing seems to be a slower (measured), and its cache seems to have memory
* impacts; simply coding this out explicit/clear seems to be better.
*
* @see http://www.eclipse.org/Xtext/documentation.html#scoping
*
* @author Michael Vorburger
*/
public class RIMDslQualifiedNameProvider extends AbstractImpl {
@Inject
private IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
public QualifiedName getFullyQualifiedName(EObject obj) {
QualifiedName partialQualifiedName = null;
if (obj instanceof DomainDeclaration) {
DomainDeclaration d = (DomainDeclaration) obj;
partialQualifiedName = toQualifiedName(d.getName());
} else if (obj instanceof ResourceInteractionModel) {
ResourceInteractionModel r = (ResourceInteractionModel) obj;
partialQualifiedName = toQualifiedName(r.getName());
} else if (obj instanceof State) {
State s = (State) obj;
partialQualifiedName = toQualifiedName(s.getName());
} else if (obj instanceof Event) {
Event e = (Event) obj;
partialQualifiedName = toQualifiedName(e.getName());
} else if (obj instanceof Command) {
Command c = (Command) obj;
partialQualifiedName = toQualifiedName(c.getName());
} else if (obj instanceof Relation) {
Relation r = (Relation) obj;
partialQualifiedName = toQualifiedName(r.getName());
} else {
return null;
}
if (partialQualifiedName != null) {
EObject parent = obj.eContainer();
QualifiedName parentsQualifiedName = getFullyQualifiedName(parent);
if (parentsQualifiedName != null)
partialQualifiedName = parentsQualifiedName.append(partialQualifiedName);
}
return partialQualifiedName;
}
private QualifiedName toQualifiedName(String name) {
if (name != null)
return converter.toQualifiedName(name);
return null;
}
}