/**
* Copyright (c) 2005-2006 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.converter.util;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.converter.ConverterPlugin;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
/**
* @since 2.2.0
*/
public class ConverterUtil
{
public static class EPackageList extends UniqueEList.FastCompare<EPackage>
{
private static final long serialVersionUID = 1L;
public EPackageList()
{
super();
}
public EPackageList(Collection<? extends EPackage> collection)
{
super(collection);
}
public EPackageList(int initialCapacity)
{
super(initialCapacity);
}
@Override
protected Object[] newData(int capacity)
{
return new EPackage [capacity];
}
}
public static class GenPackageList extends UniqueEList.FastCompare<GenPackage>
{
private static final long serialVersionUID = 1L;
public GenPackageList()
{
super();
}
public GenPackageList(Collection<? extends GenPackage> collection)
{
super(collection);
}
public GenPackageList(int initialCapacity)
{
super(initialCapacity);
}
@Override
protected Object[] newData(int capacity)
{
return new GenPackage [capacity];
}
}
public static class WorkspaceResourceValidator
{
/**
* Invokes the Platform validateEdit method for all the read-only files
* referred by a given resource in the list. Returns null if the resources
* can be saved or a comma separated list of the files that are read-only.
* @param emfResources
* @return String
*/
public static String validate(List<Resource> emfResources)
{
org.eclipse.core.resources.IWorkspace workspace = org.eclipse.core.resources.ResourcesPlugin.getWorkspace();
org.eclipse.core.resources.IWorkspaceRoot workspaceRoot= workspace.getRoot();
List<org.eclipse.core.resources.IResource> workspaceFiles = new ArrayList<org.eclipse.core.resources.IResource>(emfResources.size());
List<File> externalFiles = new ArrayList<File>(emfResources.size());
for (Resource resource : emfResources)
{
URI uri = resource.getURI().trimFragment();
if (uri.isFile())
{
File file = new File(uri.toFileString());
if (file.isFile() && !file.canWrite())
{
externalFiles.add(file);
}
}
else if (uri.isPlatformResource())
{
String path = uri.toPlatformString(true);
org.eclipse.core.resources.IResource workspaceResource = workspaceRoot.findMember(new org.eclipse.core.runtime.Path(path));
if (workspaceResource != null && workspaceResource.getType() == org.eclipse.core.resources.IResource.FILE && workspaceResource.getResourceAttributes().isReadOnly())
{
workspaceFiles.add(workspaceResource);
}
}
}
StringBuffer readOnlyFiles = new StringBuffer();
if (!workspaceFiles.isEmpty())
{
Object context = null;
if (org.eclipse.core.runtime.Platform.getBundle("org.eclipse.swt") != null)
{
context = ShellFinder.getActiveShell();
}
org.eclipse.core.resources.IFile[] files = workspaceFiles.toArray(new org.eclipse.core.resources.IFile [workspaceFiles.size()]);
if (!workspace.validateEdit(files, context).isOK())
{
for (int i = 0; i < files.length; i++)
{
if (files[i].isReadOnly())
{
readOnlyFiles.append(", ").append(files[i].getFullPath().toString());
}
}
}
}
if (!externalFiles.isEmpty())
{
for (File file : externalFiles)
{
readOnlyFiles.append(", ").append(file.getAbsolutePath());
}
}
return readOnlyFiles.length() == 0 ?
null :
readOnlyFiles.deleteCharAt(0).deleteCharAt(0).toString();
}
}
public static class ShellFinder
{
public static Object getActiveShell()
{
if (org.eclipse.core.runtime.Platform.getBundle("org.eclipse.swt") != null)
{
try
{
return org.eclipse.swt.widgets.Display.getCurrent().getActiveShell();
}
catch (Throwable t)
{
// Ignore
}
}
return null;
}
}
public static final int ACTION_DEFAULT = 0;
public static final int ACTION_MESSAGE_NONE = 1; //0000 0000 0001
public static final int ACTION_MESSAGE_SET = 2; //0000 0000 0010
public static final int ACTION_MESSAGE_SET_TYPED = 4; //0000 0000 0100
public static final int ACTION_MESSAGE_SET_ERROR = 8; //0000 0000 1000
public static final int ACTION_DIALOG_NONE = 1 << 8; //0001 0000 0000
public static final int ACTION_DIALOG_SHOW_IF_HAS_CHILD = 2 << 8; //0010 0000 0000
public static final int ACTION_DIALOG_SHOW = 4 << 8; //0100 0000 0000
public static final int ACTION_DIALOG_SHOW_ERROR = 8 << 8; //1000 0000 0000
private static final int ACTION_MESSAGE_MASK = 0x00F; //0000 0000 1111
private static final int ACTION_DIALOG_MASK = 0xF00; //1111 0000 0000
public static class DecodedAction
{
public int message;
public int dialog;
}
public static DecodedAction decodeAction(int actionCode)
{
DecodedAction decodedAction = new DecodedAction();
decodedAction.message = actionCode & ACTION_MESSAGE_MASK;
if (ACTION_MESSAGE_SET_ERROR == (decodedAction.message & ACTION_MESSAGE_SET_ERROR))
{
decodedAction.message = ACTION_MESSAGE_SET_ERROR;
}
else if (ACTION_MESSAGE_SET_TYPED == (decodedAction.message & ACTION_MESSAGE_SET_TYPED))
{
decodedAction.message = ACTION_MESSAGE_SET_TYPED;
}
else if (ACTION_MESSAGE_SET == (decodedAction.message & ACTION_MESSAGE_SET))
{
decodedAction.message = ACTION_MESSAGE_SET;
}
else if (ACTION_MESSAGE_NONE == (decodedAction.message & ACTION_MESSAGE_NONE))
{
decodedAction.message = ACTION_MESSAGE_NONE;
}
else
{
decodedAction.message = ACTION_DEFAULT;
}
decodedAction.dialog = actionCode & ACTION_DIALOG_MASK;
if (ACTION_DIALOG_SHOW_ERROR == (decodedAction.dialog & ACTION_DIALOG_SHOW_ERROR))
{
decodedAction.dialog = ACTION_DIALOG_SHOW_ERROR;
}
else if(ACTION_DIALOG_SHOW == (decodedAction.dialog & ACTION_DIALOG_SHOW))
{
decodedAction.dialog = ACTION_DIALOG_SHOW;
}
else if(ACTION_DIALOG_SHOW_IF_HAS_CHILD == (decodedAction.dialog & ACTION_DIALOG_SHOW_IF_HAS_CHILD))
{
decodedAction.dialog = ACTION_DIALOG_SHOW_IF_HAS_CHILD;
}
else if(ACTION_DIALOG_NONE == (decodedAction.dialog & ACTION_DIALOG_NONE))
{
decodedAction.dialog = ACTION_DIALOG_NONE;
}
else
{
decodedAction.dialog = ACTION_DEFAULT;
}
return decodedAction;
}
public static int computeActionCode(Diagnostic diagnostic)
{
if (ConverterPlugin.ID.equals(diagnostic.getSource()))
{
int actionCode = diagnostic.getCode();
for (Diagnostic child : diagnostic.getChildren())
{
actionCode |= computeActionCode(child);
}
return actionCode;
}
else
{
return ACTION_DEFAULT;
}
}
public static Diagnostic createDiagnostic(Diagnostic baseDiagnostic, String source, int code)
{
BasicDiagnostic basicDiagnostic = new BasicDiagnostic(
baseDiagnostic.getSeverity(), source, code,
baseDiagnostic.getMessage(), baseDiagnostic.getData().toArray());
basicDiagnostic.addAll(baseDiagnostic);
return basicDiagnostic;
}
public static Diagnostic mergeDiagnostic(Diagnostic baseDiagnostic, Diagnostic diagnosticToBeMerged)
{
if (diagnosticToBeMerged == null)
{
return baseDiagnostic;
}
else
{
if (baseDiagnostic == null)
{
return diagnosticToBeMerged;
}
else if (baseDiagnostic instanceof DiagnosticChain)
{
((DiagnosticChain)baseDiagnostic).merge(diagnosticToBeMerged);
return baseDiagnostic;
}
else
{
BasicDiagnostic basicDiagnostic = new BasicDiagnostic(
baseDiagnostic.getSeverity(), baseDiagnostic.getSource(), baseDiagnostic.getCode(),
baseDiagnostic.getMessage(), baseDiagnostic.getData().toArray());
basicDiagnostic.addAll(baseDiagnostic);
basicDiagnostic.add(diagnosticToBeMerged);
return basicDiagnostic;
}
}
}
public static Diagnostic createErrorDiagnostic(Throwable throwable, boolean showErrorDialog)
{
Diagnostic diagnostic = BasicDiagnostic.toDiagnostic(throwable);
if (showErrorDialog)
{
BasicDiagnostic basicDiagnostic =
new BasicDiagnostic(
Diagnostic.ERROR,
ConverterPlugin.ID,
ACTION_DIALOG_SHOW_ERROR,
ConverterPlugin.INSTANCE.getString("_UI_GenericExceptionDialog_message"),
new Object[]{throwable});
basicDiagnostic.add(diagnostic);
diagnostic = basicDiagnostic;
}
else
{
BasicDiagnostic basicDiagnostic =
new BasicDiagnostic(
Diagnostic.ERROR,
ConverterPlugin.ID,
ACTION_DEFAULT,
ConverterPlugin.INSTANCE.getString("_UI_GenericException_message", new Object[]{diagnostic.getMessage()}),
new Object[]{throwable});
basicDiagnostic.addAll(diagnostic);
diagnostic = basicDiagnostic;
}
return diagnostic;
}
public static ResourceSet createResourceSet()
{
ResourceSet result = new ResourceSetImpl();
result.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap());
return result;
}
public static List<EPackage> computeRequiredPackages(EPackage ePackage)
{
List<EPackage> referencedEPackages = new ConverterUtil.EPackageList();
for (Iterator<EObject> j = ePackage.eAllContents(); j.hasNext();)
{
EObject eObject = j.next();
for (Object o : eObject.eCrossReferences())
{
if (o instanceof EClassifier)
{
EClassifier eClassifier = (EClassifier)o;
referencedEPackages.add(eClassifier.getEPackage());
}
}
}
referencedEPackages.remove(ePackage);
for (Iterator<EPackage> i = referencedEPackages.iterator(); i.hasNext();)
{
EPackage referencedEPackage = i.next();
if (referencedEPackage.getNsURI().equals(ePackage.getNsURI()))
{
i.remove();
}
}
return referencedEPackages.isEmpty() ? Collections.<EPackage>emptyList() : referencedEPackages;
}
public static String getQualifiedName(EPackage ePackage)
{
if (ePackage == null)
{
return null;
}
else
{
StringBuffer label = new StringBuffer(ePackage.getName());
EPackage parentEPackage = ePackage.getESuperPackage();
while (parentEPackage != null)
{
label.insert(0, ".").insert(0, parentEPackage.getName());
parentEPackage = parentEPackage.getESuperPackage();
}
return label.toString();
}
}
}