/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. All rights reserved. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ package de.tub.tfs.henshin.analysis.ui; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.LinkedList; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.common.util.WrappedException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.impl.EPackageImpl; import org.eclipse.emf.ecore.impl.EcoreFactoryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceImpl; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.henshin.model.Module; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.handlers.HandlerUtil; import agg.xt_basis.GraGra; import de.tub.tfs.henshin.analysis.AggInfo; public class TranslateAgg extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { IStructuredSelection selection = (IStructuredSelection) HandlerUtil .getActiveMenuSelection(event); Object firstElement = selection.getFirstElement(); if (firstElement instanceof IFile) { IFile file = (IFile) firstElement; String filename = file.getRawLocationURI().getRawPath(); ResourceSet resourceSet = new ResourceSetImpl(); Resource res = resourceSet.getResource( URI.createFileURI(filename), true); res.unload(); try { res.load(null); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (Object obj: res.getContents()) { if (obj instanceof Module) { String missingPackages = "missing packages:\n"; for (EPackage pkg : ((Module)obj).getImports() ) { if(((EPackage)pkg).getName() == null){ Resource resource = loadEcoreModelsWithUri( ((EPackageImpl)pkg).eProxyURI(), ((Module) obj).eResource().getResourceSet()); if (resource == null){ missingPackages += (((EPackageImpl)pkg).eProxyURI()) + "\n"; } } } try { AggInfo aggInfo = new AggInfo((Module)obj); System.out.println(res.getURI().toFileString()); aggInfo.getAggGrammar().save(res.getURI().toFileString() + ".ggx"); }catch (Exception ex){ if (missingPackages.length() > 18) ErrorDialog.openError(Display.getDefault().getActiveShell(), "Convert failed!", "Could not find all referenced packages.\n",new Status(IStatus.ERROR,"org.eclipse.emft.henshin",missingPackages)); } //HenshinRegistry.instance.registerTransformationSystem((Module) obj); } } } return null; } public static GraGra exportToAGG(String henshinFileName,String exportFileName){ String filename = henshinFileName; ResourceSet resourceSet = new ResourceSetImpl(); Resource res = resourceSet.getResource( URI.createFileURI(filename), true); res.unload(); try { res.load(null); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (Object obj: res.getContents()) { if (obj instanceof Module) { String missingPackages = "missing packages:\n"; for (EPackage pkg : ((Module)obj).getImports() ) { if(((EPackage)pkg).getName() == null){ Resource resource = loadEcoreModelsWithUri( ((EPackageImpl)pkg).eProxyURI(), ((Module) obj).eResource().getResourceSet()); if (resource == null){ missingPackages += (((EPackageImpl)pkg).eProxyURI()) + "\n"; } } } try { AggInfo aggInfo = new AggInfo((Module)obj); aggInfo.getAggGrammar().save(res.getURI().toFileString() + ".ggx"); return aggInfo.getAggGrammar(); }catch (Exception ex){ if (missingPackages.length() > 18) ErrorDialog.openError(Display.getDefault().getActiveShell(), "Convert failed!", "Could not find all referenced packages.\n",new Status(IStatus.ERROR,"org.eclipse.emft.henshin",missingPackages)); } //HenshinRegistry.instance.registerTransformationSystem((Module) obj); } } return null; } public static GraGra exportToAGG(Module system,String exportFileName){ String missingPackages = "missing packages:\n"; for (EPackage pkg : system.getImports() ) { if(((EPackage)pkg).getName() == null){ Resource resource = loadEcoreModelsWithUri( ((EPackageImpl)pkg).eProxyURI(), system.eResource().getResourceSet()); if (resource == null){ missingPackages += (((EPackageImpl)pkg).eProxyURI()) + "\n"; } } } try { AggInfo aggInfo = new AggInfo(system); aggInfo.getAggGrammar().save(exportFileName + ".ggx"); return aggInfo.getAggGrammar(); }catch (Exception ex){ if (missingPackages.length() > 18) ErrorDialog.openError(Display.getDefault().getActiveShell(), "Convert failed!", "Could not find all referenced packages.\n",new Status(IStatus.ERROR,"org.eclipse.emft.henshin",missingPackages)); } return null; //HenshinRegistry.instance.registerTransformationSystem((Module) obj); } private static HashSet<String> missingEpackages = new HashSet<String>(); private static ResourceSet resourceSet = new ResourceSetImpl(); private static Resource loadEcoreModel(URI uri, String fileLoc) { try { if (fileLoc == null) return null; ResourceSet set = new ResourceSetImpl(); ResourceImpl r = (ResourceImpl) set.getResource( URI.createFileURI(fileLoc), true); boolean foundMulti = true; boolean found = false; LinkedList<String> foundURIs = new LinkedList<String>(); LinkedList<EPackage> foundPkgs = new LinkedList<EPackage>(); for (EObject pkg : r.getContents()) { if (pkg instanceof EPackage) { if (((EPackage) pkg).getNsURI().equals(uri.toString())) { found = true; } foundMulti &= ((EPackage) pkg).getNsURI().startsWith( uri.toString()); foundURIs.add(((EPackage) pkg).getNsURI()); foundPkgs.add((EPackage) pkg); } } if (foundURIs.isEmpty()) foundMulti = false; if (!found && !foundMulti) { missingEpackages.add(uri.toString()); return null;//resourceSet.delegatedGetResource(uri, true); } if (!found && foundMulti) { // missingEpackages.add(uri.toString()); EPackageImpl ePackage = (EPackageImpl) EcoreFactoryImpl.eINSTANCE .createEPackage(); ePackage.setName(uri.segment(0)); ePackage.setNsPrefix(uri.segment(0)); ePackage.setNsURI(uri.toString()); ePackage.eSetResource(r, null); EPackage.Registry.INSTANCE.put(uri.toString(), ePackage); for (EObject obj : r.getContents()) { if (obj instanceof EPackage) { ePackage.getESubpackages().add((EPackage) obj); } } // r.getContents().add(0, ePackage); } r.setURI(uri); for (EPackage pkg : foundPkgs) { if (!found && foundMulti) { ResourceImpl r1 = (ResourceImpl) set.getResource( URI.createFileURI(fileLoc), true); r1.setURI(URI.createURI(pkg.getNsURI())); r1.getContents().clear(); r1.getContents().add(pkg); resourceSet.getResources().add(r1); } EPackage.Registry.INSTANCE.put(((EPackage) pkg).getNsURI(), pkg); } /**/ // EPackage.Registry.INSTANCE.get(uri.toString()); if (found || foundMulti) resourceSet.getResources().add(r); return r;//super.delegatedGetResource(uri, true); } catch (WrappedException ex) { } return null; } private static LinkedList<File> findEcoreFiles(File[] listFiles) { LinkedList<File> result = new LinkedList<File>(); if (listFiles == null) return result; for (File file : listFiles) { if (file.isDirectory()) { LinkedList<File> f = findEcoreFiles(file.listFiles()); result.addAll(f); } else { if (file.getName().endsWith("ecore")) result.add(file); } } return result; } public static Resource loadEcoreModelsWithUri(URI uri,ResourceSet context){ try { // IWorkspaceRoot root = // ResourcesPlugin.getWorkspace().getRoot(); if (context != null) resourceSet = context; if (uri.toString().contains("#")){ uri = URI.createURI(uri.toString().substring(0, uri.toString().indexOf("#"))); } IWorkspaceRoot root = ResourcesPlugin.getWorkspace() .getRoot(); IProject[] projects = root.getProjects(); for (IProject iProject : projects) { LinkedList<File> ecoreFiles = findEcoreFiles(iProject .getLocation().toFile().listFiles()); for (File file : ecoreFiles) { Resource resource2 = loadEcoreModel(uri, file.getAbsolutePath()); if (resource2 != null) return resource2; } } Shell shell = new Shell(); FileDialog dialog = new FileDialog(shell); dialog.setText("EMF Package with URI \"" + uri.toString() + "\" could not be found. Please select the ECore Model File for this URI."); dialog.setFilterExtensions(new String[] { "*.ecore" }); // dialog.setText(uri.toString()); String p = dialog.open(); shell.dispose(); Resource r = loadEcoreModel(uri, p); return r; } catch (Exception e) { return null; } } }