blob: f61c0a1ddf31070ec2bcc4e1600fc27c56754d52 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2015 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.wizards.product;
import org.eclipse.pde.core.plugin.IPluginElement;
import java.util.ArrayList;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.util.PDETextHelper;
import org.eclipse.pde.internal.ui.PDEUIMessages;
public class RemoveSplashHandlerBindingAction extends Action implements ISplashHandlerConstants {
private IPluginModelBase fModel;
private IProgressMonitor fMonitor;
private CoreException fException;
private String fFieldProductID;
private String fFieldTargetPackage;
public RemoveSplashHandlerBindingAction() {
reset();
}
public void setFieldProductID(String fieldProductID) {
fFieldProductID = fieldProductID;
}
public void setFieldTargetPackage(String fieldTargetPackage) {
fFieldTargetPackage = fieldTargetPackage;
}
public void reset() {
fModel = null;
fMonitor = null;
fException = null;
fFieldProductID = null;
fFieldTargetPackage = null;
}
@Override
public void run() {
try {
updateModel();
} catch (CoreException e) {
fException = e;
}
}
public void hasException() throws CoreException {
// Release any caught exceptions
if (fException != null) {
throw fException;
}
}
public void setModel(IPluginModelBase model) {
fModel = model;
}
public void setMonitor(IProgressMonitor monitor) {
fMonitor = monitor;
}
private void updateModel() throws CoreException {
// Find the first splash handler extension
// We don't care about other splash handler extensions manually added
// by the user
IPluginExtension extension = findFirstExtension(F_SPLASH_HANDLERS_EXTENSION);
// Check to see if one was found
if (extension == null) {
// None found, our job is already done
return;
}
// Update progress work units
fMonitor.beginTask(NLS.bind(PDEUIMessages.RemoveSplashHandlerBindingAction_msgProgressRemoveProductBindings, F_SPLASH_HANDLERS_EXTENSION), 1);
// Find all product binding elements
IPluginElement[] productBindingElements = findProductBindingElements(extension);
// Remove all product binding elements that are malformed or match the
// target product ID
removeMatchingProductBindingElements(extension, productBindingElements);
// Update progress work units
fMonitor.done();
}
private void removeMatchingProductBindingElements(IPluginExtension extension, IPluginElement[] productBindingElements) throws CoreException {
// If there are no product binding elements, then our job is done
if ((productBindingElements == null) || (productBindingElements.length == 0)) {
return;
}
// Process all product binding elements
for (int i = 0; i < productBindingElements.length; i++) {
IPluginElement element = productBindingElements[i];
// Get the product ID attribute
IPluginAttribute productIDAttribute = element.getAttribute(F_ATTRIBUTE_PRODUCT_ID);
// Remove any product binding element that does not define a
// product ID
if ((productIDAttribute == null) || (PDETextHelper.isDefined(productIDAttribute.getValue()) == false)) {
extension.remove(element);
continue;
}
// Get the splash ID attribute
IPluginAttribute splashIDAttribute = element.getAttribute(F_ATTRIBUTE_SPLASH_ID);
// Remove any product binding element that does not define a
// splash ID
if ((splashIDAttribute == null) || (PDETextHelper.isDefined(splashIDAttribute.getValue()) == false)) {
extension.remove(element);
continue;
}
// Remove any product binding element whose product ID matches this
// product's ID and whose splash ID match's a generated splash
// handler template ID
if (productIDAttribute.getValue().equals(fFieldProductID) && isGeneratedSplashID(splashIDAttribute.getValue())) {
extension.remove(element);
}
}
}
private boolean isGeneratedSplashID(String value) {
String[][] choices = ISplashHandlerConstants.F_SPLASH_SCREEN_TYPE_CHOICES;
// Check to see if the splash ID matches any of the pre-generated
// splash handler template IDs
for (int i = 0; i < choices.length; i++) {
String splashID = fFieldTargetPackage + '.' + choices[i][0];
if (value.equals(splashID)) {
return true;
}
}
return false;
}
private IPluginElement[] findProductBindingElements(IPluginExtension extension) {
ArrayList<IPluginElement> elements = new ArrayList<>();
// Check to see if the extension has any children
if (extension.getChildCount() == 0) {
// Extension has no children
return null;
}
IPluginObject[] pluginObjects = extension.getChildren();
// Process all children
for (int j = 0; j < pluginObjects.length; j++) {
if (pluginObjects[j] instanceof IPluginElement) {
IPluginElement element = (IPluginElement) pluginObjects[j];
// Find product binding elements
if (element.getName().equals(F_ELEMENT_PRODUCT_BINDING)) {
elements.add(element);
}
}
}
// No product binding elements found
if (elements.size() == 0) {
return null;
}
// Return product binding elements
return elements.toArray(new IPluginElement[elements.size()]);
}
private IPluginExtension findFirstExtension(String extensionPointID) {
// Get all the extensions
IPluginExtension[] extensions = fModel.getPluginBase().getExtensions();
// Get the first extension matching the specified extension point ID
for (int i = 0; i < extensions.length; i++) {
String point = extensions[i].getPoint();
if (extensionPointID.equals(point)) {
return extensions[i];
}
}
return null;
}
}