blob: 612917bf38e6bf5bf15b5b277517605a4e2391da [file] [log] [blame]
package org.eclipse.gmf.internal.xpand.migration.ui;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.gmf.internal.xpand.RootManager;
import org.eclipse.gmf.internal.xpand.build.WorkspaceResourceManager;
import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue;
import org.eclipse.gmf.internal.xpand.migration.MigrationException;
import org.eclipse.gmf.internal.xpand.migration.XtendMigrationFacade;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
public class MigrateXtendResource implements IObjectActionDelegate {
static final String QVTO_EXTENSION = "qvto";
private Shell shell;
private IFile selectedFile;
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
shell = targetPart.getSite().getShell();
}
public void run(IAction action) {
IFile qvtoFile = getQvtoFile();
if (qvtoFile.exists() && !MessageDialog.openConfirm(shell, "Name conflict", "The file " + qvtoFile.getName() + " already present in this folder. Do you want to owerwrite it?")) {
return;
}
try {
InputStream inputStream = getQvtoResourceContent(qvtoFile.getCharset());
if (inputStream == null) {
return;
}
if (!qvtoFile.exists()) {
qvtoFile.create(inputStream, true, null);
} else {
qvtoFile.setContents(inputStream, true, true, null);
}
} catch (CoreException e) {
showError("Migration problems", "Following exception appears:\n\n" + e.getMessage());
}
}
private InputStream getQvtoResourceContent(String charset) {
RootManager rootManager = new RootManager(selectedFile.getProject());
String templateFullName = rootManager.getTemplateFullName(selectedFile);
if (templateFullName == null) {
showError("Incorrect xtend resource", "Unable to locate proper xpand root for this xtend resource");
return null;
}
WorkspaceResourceManager resourceManager = rootManager.getResourceManager(selectedFile);
XtendMigrationFacade migrationFacade = new XtendMigrationFacade(resourceManager, templateFullName);
try {
StringBuilder qvtoResourceContent = migrationFacade.migrateXtendResource();
return new ByteArrayInputStream(qvtoResourceContent.toString().getBytes(charset));
} catch (MigrationException e) {
reportMigrationException(e);
} catch (UnsupportedEncodingException e) {
showError("Unsupported encoding", "Specified encoding \"" + charset + "\" is not supported by the platform: " + e.getMessage());
}
return null;
}
private void reportMigrationException(MigrationException e) {
switch (e.getType()) {
case ANALYZATION_PROBLEMS:
StringBuilder sb = new StringBuilder("Following analyzation problems present:\n\n");
for (AnalysationIssue issue : e.getIssues()) {
sb.append(issue.toString());
sb.append("\n");
}
showError("Unable to load xtend resource", sb.toString());
return;
default:
showError("Migration exception", "Migration exception appears:\n" + e.getMessage());
}
}
private IFile getQvtoFile() {
IPath qvtoFilePath = selectedFile.getFullPath().removeFileExtension().addFileExtension(QVTO_EXTENSION);
IFile qvtoFile = ResourcesPlugin.getWorkspace().getRoot().getFile(qvtoFilePath);
return qvtoFile;
}
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.size() == 1 && structuredSelection.getFirstElement() instanceof IFile) {
selectedFile = (IFile) structuredSelection.getFirstElement();
action.setEnabled(true);
return;
}
}
selectedFile = null;
action.setEnabled(false);
}
private void showError(String title, String contents) {
MessageDialog.openError(shell, title, contents);
}
}