/** | |
* 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; | |
} |