package org.yakindu.base.types.resource;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
import org.eclipse.xtext.util.IAcceptor;
import org.yakindu.base.types.EnumerationType;
import org.yakindu.base.types.Type;
import org.yakindu.base.types.TypeAlias;
import org.yakindu.base.types.TypedElement;
import com.google.common.collect.Maps;
public class TypedResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {
/**
* This flag is true if the element has or contains elements with an unknown
* resp. unsupported type
*/
public static final String HAS_UNKNOWN_TYPE = "has_unknown_type";
/**
* For types that are visible (<code>Type.isVisible()==true</code>) this
* flag is true, otherwise false
*/
public static final String IS_VISIBLE_TYPE = "is_visible_type";
/**
* Type aliases whose original type is an enumeration type will have this
* flag set to true, otherwise this flag is missing
*/
public static final String IS_ALIAS_ON_ENUM = "is_alias_on_enum";
/**
* This flag indicates the if the type of a TypedElelemnt is complex or not
*/
public static final String HAS_COMPLEX_TYPE = "has_complex_type";
public boolean createEObjectDescriptions(EObject eObject, IAcceptor<IEObjectDescription> acceptor) {
if (getQualifiedNameProvider() == null)
return false;
if(!shouldCreateDescription(eObject))
return false;
try {
QualifiedName qualifiedName = getQualifiedNameProvider().getFullyQualifiedName(eObject);
if (qualifiedName != null) {
Map<String, String> userData = Maps.newHashMap();
defineUserData(eObject, userData);
acceptor.accept(EObjectDescription.create(qualifiedName, eObject, userData));
}
} catch (Exception exc) {
exc.printStackTrace();
}
return true;
}
protected boolean shouldCreateDescription(EObject object){
return true;
}
protected void defineUserData(EObject eObject, Map<String, String> userData) {
if (eObject instanceof TypedElement) {
userData.put(HAS_UNKNOWN_TYPE, String.valueOf(isUnknownType((TypedElement) eObject)));
userData.put(HAS_COMPLEX_TYPE, String.valueOf(hasComplexType((TypedElement) eObject)));
}
if (eObject instanceof Type) {
userData.put(IS_VISIBLE_TYPE, String.valueOf(((Type) eObject).isVisible()));
}
if (eObject instanceof TypeAlias) {
if (((TypeAlias) eObject).getOriginType() instanceof EnumerationType) {
userData.put(IS_ALIAS_ON_ENUM, String.valueOf(true));
}
}
}
protected boolean isUnknownType(TypedElement element) {
return false;
}
protected boolean hasComplexType(TypedElement element) {
return false ; //element.getType() instanceof ComplexType;
}
}