package org.hawk.modelio; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; 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.uml2.uml.Element; import org.eclipse.uml2.uml.Model; import org.eclipse.uml2.uml.UMLPackage; import org.eclipse.uml2.uml.internal.resource.UMLResourceFactoryImpl; import org.eclipse.uml2.uml.resource.UMLResource; import org.modelio.gproject.data.project.DefinitionScope; import org.modelio.gproject.data.project.FragmentType; import org.modelio.gproject.data.project.ProjectDescriptor; import org.modelio.gproject.data.project.ProjectDescriptorReader; import org.modelio.gproject.fragment.IProjectFragment; import org.modelio.gproject.fragment.exml.ExmlFragment; import org.modelio.gproject.gproject.GProject; import org.modelio.gproject.gproject.GProjectFactory; import org.modelio.gproject.model.MModelServices; import org.modelio.gproject.module.catalog.FileModuleStore; import org.modelio.metamodel.data.MetamodelLoader; import org.modelio.metamodel.mda.Project; import org.modelio.metamodel.uml.statik.Package; import org.modelio.vbasic.auth.NoneAuthData; import org.modelio.vbasic.progress.NullProgress; import org.modelio.vcore.smkernel.mapi.MObject; import org.modelio.xmi.generation.ExportServices; import org.modelio.xmi.generation.GenerationProperties; import org.hawk.core.model.*; import org.hawk.core.IModelResourceFactory;; public class ModelioModelResource implements IHawkModelResource { File modelioProj; private IModelResourceFactory parser; @Override public void unload() { modelioProj = null; } public ModelioModelResource(File f, IModelResourceFactory p) { parser = p; modelioProj = f; } @Override public Iterator<IHawkObject> getAllContents() { return getAllContentsSet().iterator(); } @Override public HashSet<IHawkObject> getAllContentsSet() { HashSet<IHawkObject> allElements = new HashSet<IHawkObject>(); Model modelioElements = null; try { modelioElements = getModel(modelioProj.getCanonicalPath()); } catch (IOException e) { } if (modelioElements != null){ EList<Element> all = modelioElements.allOwnedElements(); for (Element e:all){ allElements.add(new ModelioObject(e)); } } return allElements; } private Model getModel(String path){ //Load a Modelio project Model m = null; //Start by loading the Modelio Metamodel MetamodelLoader.Load(); //Load the description of a given project //Path p = Paths.get("/home/shah/modelio/workspace/Project2/project.conf"); Path p = Paths.get("/media/titan-data/Hawk/uk.ac.york.cs.mde.hawk.modelio/samples/Project2/project.conf"); // Path p = Paths.get(path); System.err.println("Path is: "+ path); ProjectDescriptor pd; GProject gp =null; try { pd = new ProjectDescriptorReader().read(p, DefinitionScope.LOCAL); //Load the project Path fms = Paths.get(System.getProperty("java.io.tmpdir")+"/.modelio/3.2/modules"); //@SuppressWarnings("deprecation") gp = (GProject) GProjectFactory.openProject(pd, new NoneAuthData(), new FileModuleStore(fms), new NullProgress()); //Navigate through the modelio model for ( IProjectFragment ipf : gp.getOwnFragments()){ if(ipf.getType().equals(FragmentType.EXML)){ ExmlFragment ef = (ExmlFragment)ipf; Iterator<MObject> iterator = ef.doGetRoots().iterator(); Project o = (Project) iterator.next(); //Get the Model package of the first fragment Package entryPoint = o.getModel(); //Specify the XMI file // File file = new File("/tmp/export.xmi"); // XMI Export //Initiate the generation properties GenerationProperties genProp = GenerationProperties.getInstance(); genProp.initialize(new MModelServices(gp)); genProp.setTimeDisplayerActivated(false); genProp.setSelectedPackage(entryPoint); // genProp.setFilePath(file); genProp.setSelectedPackage(entryPoint); // genProp.setRoundtripEnabled(false); //Create a EMF resource // Resource resource = createResource(file.getAbsolutePath()); //XMI Export ExportServices exportService = new ExportServices(); //exportService.createEcoreModel(resource, null); m= exportService.createEcoreModel(entryPoint, null); } } } catch (IOException e1) { }finally{ if (gp !=null) gp.close(); } return m; } @Override public String getType() { return parser.getType(); } @Override public int getSignature(IHawkObject o) { return o.hashCode(); } private static Resource createResource(final String resourcePath) { File file = new File(resourcePath); if (!file.exists()) { file.getParentFile().mkdirs(); try { Thread.sleep(100); } catch (InterruptedException e) { // Xmi.LOG.error(e); } } ResourceSet resourceSet2 = new ResourceSetImpl(); // Register the default resource factory -- only needed for // stand-alone! //resourceSet2.getPackageRegistry().put(org.eclipse.uml2.uml.UMLPackage.eNS_URI, UMLPackage.eINSTANCE); resourceSet2.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE); Map<URI, URI> uriMap = resourceSet2.getURIConverter().getURIMap(); //URI uri = URI.createURI("jar:file:/D:/work/phoenix/toolkit/modeliotool/plugins.org.eclipse.uml2.uml.resources_org.eclipse.uml2.uml.resources_3.1.100.v201008191510.jar!/"); // for example URI uri = URI.createURI("jar:file:/media/titan-data/experiments-parsers/modelio/modelio3.1-src/RCPTARGET/uml2_3.2/plugins/org.eclipse.uml2.uml.resources_3.1.100.v201008191510.jar!/"); uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP), uri.appendSegment("libraries").appendSegment("")); uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP), uri.appendSegment("metamodels").appendSegment("")); uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP), uri.appendSegment("profiles").appendSegment("")); resourceSet2.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new UMLResourceFactoryImpl()); // Get the URI of the model file. URI fileURI2 = URI.createFileURI(file.getAbsolutePath()); Resource resource2 = resourceSet2.createResource(fileURI2); return resource2; } }