/*******************************************************************************
* Copyright (c) 2011 Bundlemaker project team.
* 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:
* Bundlemaker project team - initial API and implementation
******************************************************************************/
package org.bundlemaker.core.ui.utils;
import java.lang.reflect.InvocationTargetException;
import org.bundlemaker.core.analysis.AnalysisCore;
import org.bundlemaker.core.analysis.IBundleMakerArtifact;
import org.bundlemaker.core.parser.IParserAwareBundleMakerProject;
import org.bundlemaker.core.project.BundleMakerProjectState;
import org.bundlemaker.core.resource.IModularizedSystem;
import org.bundlemaker.core.ui.ErrorDialogUtil;
import org.bundlemaker.core.ui.artifact.configuration.IArtifactModelConfigurationProvider;
import org.bundlemaker.core.ui.internal.Activator;
import org.bundlemaker.core.ui.internal.BundleMakerUiUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.PlatformUI;
/**
* A {@link IRunnableWithProgress} that initializes and (re-parses) a bundlemaker project
*
* @see BundleMakerProjectOpener for a convienence class that not only parses the project but also runs all required
* actions for the UI handling
*
* @author Nils Hartmann (nils@nilshartmann.net)
*
*/
public class ParseBundleMakerProjectRunnable implements IRunnableWithProgress {
private final IParserAwareBundleMakerProject _bundleMakerProject;
private IBundleMakerArtifact _defaultModularizedSystem = null;
/**
* @param bundleMakerProject
*/
public ParseBundleMakerProjectRunnable(IParserAwareBundleMakerProject bundleMakerProject) {
_bundleMakerProject = bundleMakerProject;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
_bundleMakerProject.initialize(monitor);
// Check if initializing was successful
BundleMakerProjectState state = _bundleMakerProject.getState();
if (state == BundleMakerProjectState.INITIALIZED | state == BundleMakerProjectState.READY) {
// parse the project
_bundleMakerProject.parseAndOpen(monitor);
} else {
return;
}
_defaultModularizedSystem = getDefaultModularizedSystemArtifact(_bundleMakerProject, monitor);
} catch (Exception ex) {
// Forward exception
throw new InvocationTargetException(ex);
}
}
/**
* Initialize and parse the specified project
*
* <p>
* Errors happening during the operation are reported via Error Log and an Error Dialog
*
* @param bundleMakerProject
* @return true if the project has been successfully opened
*/
public static IBundleMakerArtifact parseProject(IParserAwareBundleMakerProject bundleMakerProject) {
// Create runnable
ParseBundleMakerProjectRunnable runnable = new ParseBundleMakerProjectRunnable(bundleMakerProject);
// Execute runnable via IProgressService
try {
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
} catch (InvocationTargetException ex) {
// Report Error to error log
Throwable cause = ex.getCause();
BundleMakerUiUtils.logError("Error while parsing project: " + cause, cause);
// Report error to user
Throwable throwable = ErrorDialogUtil.getNestedNonCoreThrowable(cause);
ErrorDialogUtil.errorDialogWithStackTrace("Error while parsing project", throwable.getMessage(),
Activator.PLUGIN_ID,
throwable);
// MessageDialog.openError(Display.getCurrent().getActiveShell(), ,
// String.format(:%n%s%nSee Error Log for details", cause));
} catch (InterruptedException ex) {
// ignore. User has canceled the operation
}
// Refresh navigator tree
BundleMakerUiUtils.refreshProjectExplorer();
return runnable._defaultModularizedSystem;
}
/**
* <p>
* </p>
*
* @param bundleMakerProject
* @param monitor
* @return
* @throws CoreException
*/
protected static IBundleMakerArtifact getDefaultModularizedSystemArtifact(
IParserAwareBundleMakerProject bundleMakerProject,
IProgressMonitor monitor)
throws CoreException {
if (monitor != null) {
monitor.subTask("Creating default Analysis Model");
}
IArtifactModelConfigurationProvider artifactModelConfigurationProvider = Activator.getDefault()
.getArtifactModelConfigurationProvider();
IModularizedSystem modularizedSystem = bundleMakerProject.getModularizedSystemWorkingCopy();
//
return AnalysisCore.getAnalysisModel(modularizedSystem, artifactModelConfigurationProvider
.getArtifactModelConfiguration(), monitor);
}
}