blob: edf7099dd279fd7d3cfff7e99db050a3266a84d2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 Mia-Software.
* 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:
* Sebastien Minguet (Mia-Software) - initial API and implementation
* Frederic Madiot (Mia-Software) - initial API and implementation
* Fabien Giquel (Mia-Software) - initial API and implementation
* Gabriel Barbier (Mia-Software) - initial API and implementation
* Erwan Breton (Sodifrance) - initial API and implementation
* Romain Dervaux (Mia-Software) - initial API and implementation
*******************************************************************************/
package org.eclipse.gmt.modisco.java.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
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.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.gmt.modisco.infra.discoverymanager.DiscoveryParameter;
import org.eclipse.gmt.modisco.infra.discoverymanager.DiscoveryParameterDirectionKind;
import org.eclipse.gmt.modisco.infra.discoverymanager.DiscoveryParameterImpl;
import org.eclipse.gmt.modisco.java.IModelReader;
import org.eclipse.gmt.modisco.java.JavaActivator;
import org.eclipse.gmt.modisco.java.Messages;
import org.eclipse.gmt.modisco.java.Model;
import org.eclipse.gmt.modisco.java.actions.ui.JavaWizard;
import org.eclipse.gmt.modisco.java.io.java.JavaReader;
import org.eclipse.gmt.modisco.java.io.java.binding.BindingManager;
import org.eclipse.gmt.modisco.java.io.library.LibraryReader;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/**
* Action to discover a Java model from a Java project and optionally its
* libraries.
* @deprecated the whole plug-in is replaced by "org.eclipse.modisco.java.discoverer" (without the "gmt" part)
*/
@Deprecated
public class DiscoverJavaModelFromJavaProject extends DefaultDiscoverer {
private static List<DiscoveryParameter> parametersKeys = null;
/**
* A parameter key. @see DiscoveryParametersBean
*/
public static final DiscoveryParameter PARAMETERS_BEAN = new DiscoveryParameterImpl(
"PARAMETERS_BEAN", DiscoveryParameterDirectionKind.in, //$NON-NLS-1$
DiscoveryParameter.class, false);
private boolean isCancelled = false;
private static Map<String, DiscoveryParametersBean> projectToDiscoParametersCache = new HashMap<String, DiscoveryParametersBean>();
private DiscoveryParametersBean currentProjectParameters = null;
private boolean logJavaAnalysisWarnings = false;
public DiscoveryParametersBean getCurrentProjectParameters() {
return this.currentProjectParameters;
}
public boolean isApplicableTo(final Object source) {
boolean result = false;
if (source instanceof IJavaProject) {
result = ((IJavaProject) source).getProject().isAccessible();
} else if (source instanceof IProject) {
IProject project = (IProject) source;
try {
if ((project.isAccessible()) && (project.hasNature(JavaCore.NATURE_ID))) {
result = true;
}
} catch (CoreException e) {
MoDiscoLogger.logError(e, JavaActivator.getDefault());
}
}
return result;
}
/**
* Discovers a Java model.
*
* @param source
* a {@link IJavaProject} instance
* @param parameters
* possible keys are :
* <ul>
* <li>{@link DefaultDiscoverer#PARAMETER_SILENT_MODE}
* <li>{@link DiscoverJavaModelFromJavaProject#PARAMETERS_BEAN}
* <li>{@link DefaultDiscoverer#PARAMETER_TARGET_RESOURCE}
* <li>{@link DefaultDiscoverer#PARAMETER_OVERWRITE_RESULT}
* <li>
* {@link DefaultDiscoverer#PARAMETER_LOG_JAVA_ANALYSIS_WARNINGS)
* </ul>
*/
public void discoverElement(final Object source,
final Map<DiscoveryParameter, Object> parameters) {
boolean isSilent = false;
boolean browseResult = true;
boolean overwriteExistingResult = true;
if (parameters != null) {
isSilent = Boolean.TRUE.equals(parameters.get(DefaultDiscoverer.PARAMETER_SILENT_MODE));
browseResult = !(Boolean.FALSE.equals(parameters
.get(DefaultDiscoverer.PARAMETER_BROWSE_RESULT)));
if (parameters.containsKey(DefaultDiscoverer.PARAMETER_OVERWRITE_RESULT)) {
overwriteExistingResult = (Boolean) parameters
.get(DefaultDiscoverer.PARAMETER_OVERWRITE_RESULT);
}
this.logJavaAnalysisWarnings = Boolean.TRUE.equals(parameters
.get(DefaultDiscoverer.PARAMETER_LOG_JAVA_ANALYSIS_WARNINGS));
}
setResourceResult(null);
// retrieval of Java project
IJavaProject tempProject = null;
if (source instanceof IJavaProject) {
tempProject = (IJavaProject) source;
} else if (source instanceof IProject) {
IProject project = (IProject) source;
try {
if (project.hasNature(JavaCore.NATURE_ID)) {
tempProject = JavaCore.create(project);
}
} catch (CoreException e) {
MoDiscoLogger.logError(e, JavaActivator.getDefault());
}
}
final IJavaProject project = tempProject;
if (project == null) {
throw new IllegalArgumentException("Not a Java project"); //$NON-NLS-1$
}
final IPath path = project.getProject().getFullPath().addTrailingSeparator()
.append(project.getElementName())
.addFileExtension(DefaultDiscoverer.JAVA_FILE_EXTENSION);
final List<Object> discoverableElements = retrieveDiscoveryParameters(parameters, project);
final IFile ifile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
Job job = null;
if (overwriteExistingResult || (!ifile.exists())) {
// discovering
if (!isSilent) {
// open the wizard (synchronous execution to block the thread)
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
public void run() {
Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
JavaWizard wizard = new JavaWizard(project, discoverableElements,
DiscoverJavaModelFromJavaProject.this.getCurrentProjectParameters());
WizardDialog dialog = new WizardDialog(shell, wizard);
int res = dialog.open();
if (res == Window.CANCEL) {
DiscoverJavaModelFromJavaProject.this.setCancelled(true);
}
}
});
if (isCancelled()) {
resetDiscoverer();
return;
}
}
job = initializeDiscoveryJob(path, project);
} else {
// browsing only
job = initializeBrowsingJob(ifile);
}
if (!isSilent && browseResult) {
scheduleEditorOpening(ResourcesPlugin.getWorkspace().getRoot().getFile(path), job,
parameters);
}
job.schedule();
try {
job.join();
} catch (InterruptedException e) {
IStatus status = new Status(IStatus.ERROR, JavaActivator.PLUGIN_ID, e.getMessage(), e);
JavaActivator.getDefault().getLog().log(status);
}
if (parameters != null) {
parameters.put(DefaultDiscoverer.PARAMETER_TARGET_RESOURCE, getResourceResult());
}
}
private List<Object> retrieveDiscoveryParameters(
final Map<DiscoveryParameter, Object> parameters, final IJavaProject project) {
// retrieve required projects and libraries
Set<IJavaProject> projects = null;
Set<IPackageFragmentRoot> libraries = null;
try {
projects = computeRequiredProjects(project);
libraries = computeRequiredLibraries(projects);
} catch (JavaModelException e) {
MoDiscoLogger.logError(e, JavaActivator.getDefault());
}
final List<Object> discoverableElements = new ArrayList<Object>();
discoverableElements.addAll(projects);
discoverableElements.addAll(libraries);
if (parameters != null
&& parameters.get(DiscoverJavaModelFromJavaProject.PARAMETERS_BEAN) != null) {
this.currentProjectParameters = (DiscoveryParametersBean) parameters
.get(DiscoverJavaModelFromJavaProject.PARAMETERS_BEAN);
// make sure the source java project is selected
this.currentProjectParameters.addElementToDiscover(project);
} else { // retrieve last user choices
this.currentProjectParameters = getParameters(project);
// some project/library might have been removed from project
// classpath
List<Object> elementsToRemove = new ArrayList<Object>();
for (Object oldParameter : this.currentProjectParameters.getElementsToDiscover()) {
if (!oldParameter.equals(project) && !discoverableElements.contains(oldParameter)) {
elementsToRemove.add(oldParameter);
}
}
for (Object oldParameterToRemove : elementsToRemove) {
this.currentProjectParameters.removeElementToDiscover(oldParameterToRemove);
}
}
return discoverableElements;
}
@Override
public String toString() {
return Messages.DiscoverJavaModelFromJavaProject_title;
}
protected Set<IJavaProject> computeRequiredProjects(final IJavaProject project)
throws JavaModelException {
Set<IJavaProject> projects = new LinkedHashSet<IJavaProject>();
// we keep package fragments which are binaries
projects.add(project);
for (String projectName : project.getRequiredProjectNames()) {
IJavaProject requiredProject = project.getJavaModel().getJavaProject(projectName);
if (requiredProject.getProject().isAccessible()) {
projects.add(requiredProject);
}
}
return projects;
}
protected Set<IPackageFragmentRoot> computeRequiredLibraries(
final Collection<IJavaProject> projects) throws JavaModelException {
Set<IPackageFragmentRoot> libraries = new LinkedHashSet<IPackageFragmentRoot>();
// we keep package fragments which are binaries
for (IJavaProject project : projects) {
for (IPackageFragmentRoot lib : project.getPackageFragmentRoots()) {
if (lib.exists() && lib.getKind() == IPackageFragmentRoot.K_BINARY) {
libraries.add(lib);
}
}
}
return libraries;
}
@SuppressWarnings("deprecation")
protected Map<IModelReader, Object> getReaders() {
Map<IModelReader, Object> readers = new HashMap<IModelReader, Object>();
for (Object element : this.currentProjectParameters.getElementsToDiscover()) {
Map<String, Object> elementOptions = this.currentProjectParameters
.getDiscoveryOptions(element);
if (element instanceof IJavaProject) {
JavaReader newJavaReader = new JavaReader(getEFactory(), elementOptions,
this.currentProjectParameters.isIncrementalMode(),
this.currentProjectParameters.isFullJavaLevel(),
this.currentProjectParameters.getExcludedElements(),
this.currentProjectParameters.getExcludedElementsRegEx(),
this.currentProjectParameters.getIncludedElementsRegEx(), this,
this.logJavaAnalysisWarnings);
readers.put(newJavaReader, element);
} else if (element instanceof IPackageFragmentRoot) {
readers.put(new LibraryReader(getEFactory(), elementOptions), element);
}
}
return readers;
}
/**
* Reset the discoverer, as it can be used multiple times.
*/
protected void resetDiscoverer() {
setCancelled(false);
}
protected BindingManager getBindingManager() {
return new BindingManager(getEFactory());
}
protected DiscoveryParametersBean getParameters(final IJavaProject project) {
String projectPath = project.getProject().getLocation().toString();
DiscoveryParametersBean parameters = DiscoverJavaModelFromJavaProject.projectToDiscoParametersCache
.get(projectPath);
if (parameters == null) {
parameters = new DiscoveryParametersBean();
// the selected java project must be discovered
parameters.addElementToDiscover(project);
DiscoverJavaModelFromJavaProject.projectToDiscoParametersCache.put(projectPath,
parameters);
}
return parameters;
}
public List<DiscoveryParameter> getDiscovererParameters() {
if (DiscoverJavaModelFromJavaProject.parametersKeys == null) {
DiscoverJavaModelFromJavaProject.parametersKeys = new ArrayList<DiscoveryParameter>();
DiscoverJavaModelFromJavaProject.parametersKeys
.add(DefaultDiscoverer.PARAMETER_SILENT_MODE);
DiscoverJavaModelFromJavaProject.parametersKeys
.add(DefaultDiscoverer.PARAMETER_TARGET_RESOURCE);
DiscoverJavaModelFromJavaProject.parametersKeys
.add(DiscoverJavaModelFromJavaProject.PARAMETERS_BEAN);
DiscoverJavaModelFromJavaProject.parametersKeys
.add(DefaultDiscoverer.PARAMETER_BROWSE_RESULT);
DiscoverJavaModelFromJavaProject.parametersKeys
.add(DefaultDiscoverer.PARAMETER_OVERWRITE_RESULT);
}
return DiscoverJavaModelFromJavaProject.parametersKeys;
}
public void setCancelled(final boolean cancel) {
this.isCancelled = cancel;
}
public boolean isCancelled() {
return this.isCancelled;
}
private final Job initializeDiscoveryJob(final IPath path, final IJavaProject project) {
Job job = new Job(Messages.DiscoverJavaModelFromJavaProject_jobLabel) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
IStatus result = null;
monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
try {
URI sourceURI = URI.createPlatformResourceURI(path.toString(), true);
Resource resource = getResource("", project); //$NON-NLS-1$
Model model = getEFactory().createModel();
BindingManager globalBindings = getBindingManager();
resource.getContents().add(model);
IModelReader reader = null;
for (Entry<IModelReader, Object> element : getReaders().entrySet()) {
reader = element.getKey();
Object source1 = element.getValue();
reader.readModel(source1, model, globalBindings, monitor);
if (monitor.isCanceled()) {
result = Status.CANCEL_STATUS;
return result;
}
}
if (reader != null) {
reader.terminate(monitor);
}
model.setName(project.getElementName());
// even if the serialisation throws an error, for instance,
// if an element is not contained in a resource,
// the resource is available for users.
DiscoverJavaModelFromJavaProject.this.setResourceResult(resource);
saveResource(sourceURI, path, resource, monitor);
if (monitor.isCanceled()) {
result = Status.CANCEL_STATUS;
return result;
}
result = Status.OK_STATUS;
} catch (Exception e) {
result = Status.CANCEL_STATUS;
IStatus status = new Status(IStatus.ERROR, JavaActivator.PLUGIN_ID,
"Unknown error.", e); //$NON-NLS-1$
JavaActivator.getDefault().getLog().log(status);
} finally {
monitor.done();
resetDiscoverer();
try {
// refresh the folder
project.getCorrespondingResource().refreshLocal(IResource.DEPTH_ONE,
new NullProgressMonitor());
if (monitor.isCanceled()) {
// if monitor is canceled, delete the model file
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile ifile = root.getFileForLocation(path);
if (ifile.exists()) {
ifile.delete(true, new NullProgressMonitor());
}
}
} catch (Exception e1) {
IStatus status = new Status(IStatus.ERROR, JavaActivator.PLUGIN_ID,
e1.getMessage(), e1);
JavaActivator.getDefault().getLog().log(status);
}
}
return result;
}
};
return job;
}
private final Job initializeBrowsingJob(final IFile ifile) {
Job job = new Job(Messages.DiscoverJavaModelFromJavaProject_browseJavaModel) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
IStatus result = Status.CANCEL_STATUS;
URI javaModelUri = URI.createPlatformResourceURI(ifile.getFullPath().toString(),
true);
ResourceSet resourceSet = new ResourceSetImpl();
Resource resource = resourceSet.getResource(javaModelUri, true);
setResourceResult(resource);
result = Status.OK_STATUS;
return result;
}
};
return job;
}
}