/**
* Copyright (c) 2004-2007 IBM Corporation and others.
* 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.mapping.ecore2ecore.action;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionDelegate;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.mapping.domain.PluginAdapterFactoryMappingDomain;
import org.eclipse.emf.mapping.ecore2ecore.Ecore2EcoreFactory;
import org.eclipse.emf.mapping.ecore2ecore.Ecore2EcoreMappingRoot;
import org.eclipse.emf.mapping.ecore2ecore.presentation.Ecore2EcoreEditorPlugin;
import org.eclipse.emf.mapping.provider.MappingItemProviderAdapterFactory;
/**
*
*/
public class MapToEcoreActionDelegate extends ActionDelegate
{
private static final List<String> FILE_EXTENSIONS = Arrays.asList(new String [] { "ecore", "emof" });
private static final String ECORE2ECORE_FILE_EXTENSION = "ecore2ecore";
protected EPackage getInputEPackage(IStructuredSelection structuredSelection)
{
if (IFile.class.isInstance(structuredSelection.getFirstElement()))
{
IFile file = (IFile)structuredSelection.getFirstElement();
if (FILE_EXTENSIONS.contains(file.getFullPath().getFileExtension()))
{
return
(EPackage)EcoreUtil.getObjectByType
(new ResourceSetImpl().getResource(URI.createPlatformResourceURI(file.getFullPath().toString(), true), true).getContents(),
EcorePackage.Literals.EPACKAGE);
}
}
return null;
}
protected IFile getFile(Resource resource)
{
URI uri = resource.getURI();
uri = resource.getResourceSet().getURIConverter().normalize(uri);
String platformResourceString = uri.toPlatformString(true);
return platformResourceString != null ?
ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(platformResourceString)) :
null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action)
{
final IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
Object selection = ((IStructuredSelection)workbenchWindow.getSelectionService().getSelection()).getFirstElement();
final IFile selectedEcoreFile =
selection instanceof IFile && FILE_EXTENSIONS.contains(((IFile)selection).getFileExtension()) ?
(IFile)selection :
null;
ViewerFilter viewerFilter = new ViewerFilter()
{
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
if (element instanceof IFile)
{
IFile file = (IFile)element;
return
FILE_EXTENSIONS.contains(file.getFileExtension()) &&
(selectedEcoreFile == null || !selectedEcoreFile.getFullPath().equals(file.getFullPath()));
}
return true;
}
};
final IFile[] files = WorkspaceResourceDialog.openFileSelection(
workbenchWindow.getShell(),
null,
Ecore2EcoreEditorPlugin.INSTANCE.getString("_UI_SelectOutputEcoreModels_label"),
true,
null,
Collections.singletonList(viewerFilter));
if (files.length > 0)
{
final EPackage inputEPackage = getInputEPackage((IStructuredSelection)workbenchWindow.getSelectionService().getSelection());
final Resource inputResource = inputEPackage.eResource();
ProgressMonitorDialog dialog = new ProgressMonitorDialog(workbenchWindow.getShell());
try
{
dialog.run(false, true,
new WorkspaceModifyOperation()
{
@Override
protected void execute(IProgressMonitor progressMonitor)
{
try
{
progressMonitor.beginTask("", files.length);
for (int i = 0; i < files.length; i++)
{
Resource outputResource = inputResource.getResourceSet().getResource(
URI.createPlatformResourceURI(files[i].getFullPath().toString(), true),
true);
EPackage outputEPackage = (EPackage)EcoreUtil.getObjectByType(outputResource.getContents(), EcorePackage.Literals.EPACKAGE);
String base = inputResource.getURI().trimFileExtension().lastSegment() + "_2_" +
outputResource.getURI().trimFileExtension().lastSegment();
URI mappingURI = outputResource.getURI().trimSegments(1).appendSegment(base).appendFileExtension(ECORE2ECORE_FILE_EXTENSION);
Resource mappingResource = inputResource.getResourceSet().createResource(mappingURI);
progressMonitor.subTask(MessageFormat.format(
Ecore2EcoreEditorPlugin.INSTANCE.getString("_UI_BuildingMappingFromTo_message"),
new Object[] { inputResource.getURI().lastSegment(), outputResource.getURI().lastSegment() }));
mappingResource.getContents().add(createMappingRoot(inputEPackage, outputEPackage));
try
{
mappingResource.save(null);
IFile file = getFile(mappingResource);
IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
final IWorkbenchPart activePart = workbenchPage.getActivePart();
if (activePart instanceof ISetSelectionTarget)
{
final ISelection targetSelection = new StructuredSelection(file);
workbenchWindow.getShell().getDisplay().asyncExec(new Runnable()
{
public void run()
{
((ISetSelectionTarget)activePart).selectReveal(targetSelection);
}
});
}
try {
workbenchPage.openEditor(new FileEditorInput(file), workbenchWindow.getWorkbench().getEditorRegistry().getDefaultEditor(file.getFullPath().toString()).getId());
} catch (PartInitException pie) {
Ecore2EcoreEditorPlugin.INSTANCE.log(pie);
}
}
catch (IOException ioe)
{
Ecore2EcoreEditorPlugin.INSTANCE.log(ioe);
}
}
}
finally
{
progressMonitor.done();
}
}
});
}
catch (InterruptedException ie)
{
// ignore
}
catch (InvocationTargetException ite)
{
Ecore2EcoreEditorPlugin.INSTANCE.log(ite);
}
}
}
protected static Ecore2EcoreMappingRoot createMappingRoot(EPackage inputEPackage, EPackage outputEPackage)
{
Ecore2EcoreMappingRoot mappingRoot = Ecore2EcoreFactory.eINSTANCE.createEcore2EcoreMappingRoot();
mappingRoot.setTopToBottom(true);
AdapterFactory ecoreAdapterFactory = new EcoreItemProviderAdapterFactory();
AdapterFactory composedAdapterFactory = new ComposedAdapterFactory(
new AdapterFactory []
{
new ResourceItemProviderAdapterFactory(),
new MappingItemProviderAdapterFactory(),
ecoreAdapterFactory
});
mappingRoot.setDomain(new PluginAdapterFactoryMappingDomain(composedAdapterFactory, ecoreAdapterFactory, null, null));
mappingRoot.getInputs().add(inputEPackage);
mappingRoot.getOutputs().add(outputEPackage);
return mappingRoot;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
* org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection)
{
action.setEnabled(IStructuredSelection.class.isInstance(selection) && getInputEPackage((IStructuredSelection)selection) != null);
}
}