package org.eclipse.emf.test.tools.codegen; import java.util.Collections; import java.util.Iterator; import java.util.Map; import org.eclipse.emf.codegen.ecore.genmodel.GenBase; import org.eclipse.emf.codegen.ecore.genmodel.GenJDKLevel; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory; import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; import org.eclipse.emf.codegen.util.ImportManager; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; 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.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.emf.test.common.TestUtil; import org.eclipse.emf.test.tools.AllSuites; import junit.framework.TestCase; public class BaseGenModelTest extends TestCase { public BaseGenModelTest(String name) { super(name); } // For now, I've only used single-package models, but this could be expanded to handle multi-package scenarios. // protected GenModel loadModel(String filename) { ResourceSet rs = new ResourceSetImpl(); rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); URI baseURI = URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID)).appendSegment("data").appendSegment(""); URI uri = URI.createFileURI(filename).resolve(baseURI); Resource resource = rs.getResource(uri, true); assertEquals(1, resource.getContents().size()); EPackage ePackage = (EPackage)resource.getContents().get(0); GenModel genModel = GenModelFactory.eINSTANCE.createGenModel(); genModel.initialize(Collections.singletonList(ePackage)); genModel.setComplianceLevel(GenJDKLevel.JDK50_LITERAL); assertEquals(1, genModel.getGenPackages().size()); return genModel; } protected void initializeModel(GenModel genModel) { for (Iterator<EObject> i = genModel.eAllContents(); i.hasNext(); ) { EObject object = i.next(); if (object instanceof GenBase) { GenBase genBase = (GenBase)object; EModelElement eModelElement = genBase.getEcoreModelElement(); if (eModelElement != null) { EAnnotation eAnnotation = eModelElement.getEAnnotation(GenModelPackage.eNS_URI); if (eAnnotation != null) { for (Map.Entry<String, String> entry : eAnnotation.getDetails()) { EStructuralFeature feature = genBase.eClass().getEStructuralFeature(entry.getKey()); if (feature instanceof EAttribute) { EAttribute attribute = (EAttribute)feature; genBase.eSet(attribute, EcoreUtil.createFromString(attribute.getEAttributeType(), entry.getValue())); } } } } } } } protected void prepareModel(GenModel genModel, String qualifiedClassName) { int i = qualifiedClassName.lastIndexOf('.'); String packageName = i != -1 ? qualifiedClassName.substring(0, i) : null; String className = i != -1 ? qualifiedClassName.substring(i + 1) : qualifiedClassName; ImportManager importManager = new ImportManager(packageName); importManager.addMasterImport(packageName, className); genModel.setImportManager(importManager); } protected static final String GEN_MODEL_TEST_URI = "http://www.eclipse.org/emf/GenModelTest"; protected String getExpectedValue(EModelElement modelElement, String name, String detail) { EAnnotation annotation = modelElement.getEAnnotation(GEN_MODEL_TEST_URI); if (annotation != null) { if (detail != null) { String key = name + detail; if (annotation.getDetails().containsKey(key)) { return annotation.getDetails().get(key); } } return annotation.getDetails().get(name); } return null; } }