package fr.inria.atlanmod.neo4emf.tests.reflection; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; public class ValueFactory { private EPackage ePackage; private EFactory eFactory; public ValueFactory(EPackage ePackage, EFactory eFactory) { this.ePackage = ePackage; this.eFactory = eFactory; } /** * Returns a generated value for the given EObject. * @param eObject the object to generate a value for. * @return Object the generated value. * @note If the given EObject is multi-valued the returned Object * will be a EList<Object>. */ public Object generateValue(EStructuralFeature eFeature) { if(eFeature.isMany()) { EList<Object> features = new BasicEList<Object>(); features.add(getValue(eFeature.getEType())); features.add(getValue(eFeature.getEType())); return features; } return getValue(eFeature.getEType()); } /** * Returns a single generated value for the given EClassifier. * @param classifier the classifier to generate a value for. * @return Object the generated value. * @note This method is used internally by generateValue(). * @bug The generation of EDataType values is not correctly supported * (it can only generate values for basic types like EString, EInt ...) */ public Object getValue(EClassifier classifier) { // TODO handle datatypes properly // TODO handle enums (they are subclasses of EClassifier) if(ePackage.eContents().contains(classifier)) { // The classifier is a generated class return eFactory.create((EClass)classifier); } return EcoreUtil.createFromString((EDataType) classifier, Integer.toString((int)(Math.random()*100))); } }