blob: 18825051356672810c1d3d997865b143e2a2f98a [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.pde.plugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.egf.common.helper.BundleHelper;
import org.eclipse.egf.core.pde.EGFPDEPlugin;
import org.eclipse.egf.core.pde.helper.PluginHelper;
import org.eclipse.egf.core.pde.internal.ui.ModelModification;
import org.eclipse.egf.core.pde.internal.ui.PDEModelUtility;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.IBaseModel;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.core.plugin.WorkspacePluginModelBase;
/**
* Base class to implement a command that performs bundle changes in the
* plugin.xml file.
*
* @author Guillaume Brocard
*/
public abstract class AbstractChangesCommand implements IPluginChangesCommand {
private String _bundleId;
private IPluginModelBase _pluginModelBase;
private IProject _project;
public AbstractChangesCommand(IProject project) throws CoreException {
Assert.isNotNull(project);
_project = project;
IPluginModelBase fakeModel = BundleHelper.getPluginModelBase(_project);
if (fakeModel == null) {
throw new CoreException(EGFPDEPlugin.getDefault().newStatus(IStatus.ERROR, NLS.bind("AbstractChangesCommand(..) _ project ''{0}'' is not a bundle project.", _project.getModificationStamp()), null)); //$NON-NLS-1$
}
}
/**
* Get the plug-in model id
*
* @return the bundleId
*/
public String getBundleId() {
if (_bundleId == null) {
if (_pluginModelBase != null) {
_bundleId = BundleHelper.getBundleId(_pluginModelBase);
}
}
return _bundleId;
}
/**
* Get the plug-in model that this command is performed against.
*
* @return the pluginModelBase
*/
public IPluginModelBase getPluginModelBase() {
return _pluginModelBase;
}
/**
* @see org.eclipse.egf.core.pde.plugin.IPluginChangesCommand#execute(org.eclipse.core.runtime.IProgressMonitor)
*/
public void execute(IProgressMonitor monitor) throws CoreException {
if (_project.getFile(PDEModelUtility.F_PLUGIN).exists()) {
modifyExistingPlugin(monitor);
} else {
createNewPlugin(monitor);
}
}
private void createNewPlugin(IProgressMonitor monitor) throws CoreException {
IPluginModelBase fakeModel = BundleHelper.getPluginModelBase(_project);
if (fakeModel == null) {
throw new CoreException(EGFPDEPlugin.getDefault().newStatus(IStatus.ERROR, NLS.bind("AbstractChangesCommand.createNewPlugin(..) _ project ''{0}'' is not a bundle project.", _project.getModificationStamp()), null)); //$NON-NLS-1$
}
WorkspacePluginModelBase pluginModel = PluginHelper.createWorkspacePluginModelBase(fakeModel);
if (pluginModel == null) {
return;
}
_pluginModelBase = pluginModel;
doExecute(monitor);
pluginModel.save();
PluginHelper.updateBuildFile(pluginModel);
}
private void modifyExistingPlugin(final IProgressMonitor monitor) {
EGFPDEPlugin.getDisplay().asyncExec(new Runnable() {
public void run() {
// Create an update operation that deals with modifying
// extensions.
ModelModification updateOperation = new ModelModification(_project.getFile(PDEModelUtility.F_PLUGIN)) {
@Override
protected void modifyModel(IBaseModel model, IProgressMonitor innerMonitor) throws CoreException {
if (model == null) {
return;
}
if (model instanceof IPluginModelBase == false) {
return;
}
_pluginModelBase = (IPluginModelBase) model;
doExecute(innerMonitor);
}
};
// Let's update the file.
PDEModelUtility.modifyModel(updateOperation, monitor);
}
});
}
protected abstract void doExecute(IProgressMonitor monitor) throws CoreException;
}