padre-master/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfCollectionTypeResolver.java
package org.eclipse.epsilon.emc.emf;

import java.util.Collection;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.epsilon.eol.EolModule;
import org.eclipse.epsilon.eol.types.EolCollectionType;
import org.eclipse.epsilon.eol.types.IEolCollectionTypeResolver;

public class EmfCollectionTypeResolver implements IEolCollectionTypeResolver {
	
	public static void main(String[] args) throws Exception {
		
		EolModule m = new EolModule();
		m.parse("EClass.all.first().eAttributes.isKindOf(Set).println();");
		ResourceSet rs = new ResourceSetImpl();
		rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());
		Resource r = rs.createResource(URI.createFileURI(""));
		EObject root = EcorePackage.eINSTANCE;
		r.getContents().add(root);
		
		InMemoryEmfModel model = new InMemoryEmfModel("M", r, EcorePackage.eINSTANCE);
		m.getContext().getModelRepository().addModel(model);
		m.execute();
		
	}
	
	@Override
	public boolean canResolveType(Collection<?> c) {
		
		return c instanceof Setting;
		
	}

	@Override
	public EolCollectionType resolveType(Collection<?> c) {
		
		EStructuralFeature sf = ((Setting) c).getEStructuralFeature();
		if (sf.isOrdered()) {
			if (sf.isUnique()) return EolCollectionType.OrderedSet;
			else return EolCollectionType.Sequence;
		}
		else {
			if (sf.isUnique()) return EolCollectionType.Set;
			else return EolCollectionType.Bag;
		}
 	}
	
}
