Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStep.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStepHandler.java53
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF5
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/plugin.xml12
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/AlwaysDisabled.java28
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java44
10 files changed, 155 insertions, 16 deletions
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
index 02340afdf..4306c1213 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.artifact.repository;singleton:=true
-Bundle-Version: 1.2.200.qualifier
+Bundle-Version: 1.3.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.artifact.repository.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml b/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
index 0aac67153..f38947c34 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
@@ -9,6 +9,6 @@
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.artifact.repository</artifactId>
- <version>1.2.200-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
index 7eb071752..c088e95ed 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 compeople AG and others.
+ * Copyright (c) 2007, 2018 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* compeople AG (Stefan Liebig) - initial API and implementation
* IBM Corporation - ongoing development
+* Mykola Nikishov - continuing development
*******************************************************************************/
package org.eclipse.equinox.internal.p2.artifact.processors.pack200;
@@ -47,7 +48,7 @@ public class Pack200ProcessorStep extends AbstractBufferingStep {
@Override
public void initialize(IProvisioningAgent agent, IProcessingStepDescriptor descriptor, IArtifactDescriptor context) {
super.initialize(agent, descriptor, context);
- if (!UnpackStep.canUnpack()) {
+ if (!isEnabled()) {
IStatus status = null;
if (detailedResult) {
status = new Status(IStatus.ERROR, Activator.ID, MirrorRequest.ARTIFACT_PROCESSING_ERROR, "Unpack facility not configured.", null); //$NON-NLS-1$
@@ -103,4 +104,9 @@ public class Pack200ProcessorStep extends AbstractBufferingStep {
new JarProcessorExecutor().runJarProcessor(options);
return new File(getWorkDir(), incoming.getName().substring(0, incoming.getName().length() - PACKED_SUFFIX.length()));
}
+
+ @Override
+ public boolean isEnabled() {
+ return UnpackStep.canUnpack();
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStep.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStep.java
index 734a5482a..b32c1cfee 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStep.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStep.java
@@ -11,6 +11,7 @@
* Contributors:
* compeople AG (Stefan Liebig) - initial API and implementation
* IBM Corporation - continuing development
+* Mykola Nikishov - continuing development
*******************************************************************************/
package org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing;
@@ -133,4 +134,16 @@ public abstract class ProcessingStep extends OutputStream implements IStateful {
public IStatus getStatus(boolean deep) {
return ProcessingStepHandler.getStatus(this, deep);
}
+
+ /**
+ * If step has dependencies that may come and go during application's
+ * lifetime (i.e., user may uninstall CLI utility that step depended on),
+ * this method checks if such dependencies are available.
+ *
+ * @return if step's dependencies are satisfied
+ * @since 1.3
+ */
+ public boolean isEnabled() {
+ return true;
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStepHandler.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStepHandler.java
index 25a099eb6..adc2fc484 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStepHandler.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/provisional/p2/artifact/repository/processing/ProcessingStepHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
-* Copyright (c) 2007, 2017 compeople AG and others.
+* Copyright (c) 2007, 2018 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,14 +11,21 @@
* Contributors:
* compeople AG (Stefan Liebig) - initial API and implementation
* IBM - continuing development
+* Mykola Nikishov - continuing development
*******************************************************************************/
package org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing;
+import static java.util.Arrays.stream;
+import static java.util.Optional.ofNullable;
+import static java.util.stream.Collectors.toList;
+
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.ArtifactOutputStream;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
import org.eclipse.equinox.internal.provisional.p2.repository.IStateful;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
@@ -38,19 +45,49 @@ public class ProcessingStepHandler {
}
/**
- * Check to see that we have processors for all the steps in the given descriptor
+ * Check to see that we have processors for all required steps in the given descriptor
* @param descriptor the descriptor to check
* @return whether or not processors for all the descriptor's steps are installed
+ * @see IProcessingStepDescriptor#isRequired()
*/
public static boolean canProcess(IArtifactDescriptor descriptor) {
- IExtensionRegistry registry = RegistryFactory.getRegistry();
- IExtensionPoint point = registry.getExtensionPoint(PROCESSING_STEPS_EXTENSION_ID);
+ IExtensionPoint point = ofNullable(RegistryFactory.getRegistry())
+ .map(r -> r.getExtensionPoint(PROCESSING_STEPS_EXTENSION_ID))
+ .orElse(null);
if (point == null)
return false;
- IProcessingStepDescriptor[] steps = descriptor.getProcessingSteps();
- for (int i = 0; i < steps.length; i++) {
- if (point.getExtension(steps[i].getProcessorId()) == null)
- return false;
+
+ List<String> processorIds = stream(descriptor.getProcessingSteps())
+ // ignore steps that are not required
+ .filter(IProcessingStepDescriptor::isRequired)
+ .map(IProcessingStepDescriptor::getProcessorId)
+ .collect(toList());
+ try {
+ for (String processorId : processorIds) {
+ IExtension requiredExtension = point.getExtension(processorId);
+ if (requiredExtension == null)
+ return false;
+
+ List<IConfigurationElement> stepConfigs = stream(requiredExtension.getConfigurationElements())
+ // skip anything but step elements
+ .filter(config -> "step".equals(config.getName())) //$NON-NLS-1$
+ .collect(toList());
+ if (stepConfigs.size() != 1)
+ // do not tolerate no or multiple step elements
+ return false;
+
+ IConfigurationElement stepConfig = stepConfigs.get(0);
+ ProcessingStep stepToCheck = (ProcessingStep) stepConfig.createExecutableExtension("class"); //$NON-NLS-1$
+ if (!stepToCheck.isEnabled())
+ return false;
+ }
+ } catch (InvalidRegistryObjectException e) {
+ // extension is no longer valid, log and ignore
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID, "", e)); //$NON-NLS-1$
+ return false;
+ } catch (CoreException e) {
+ // unable to instantiate an extension, already logged, ignore
+ return false;
}
return true;
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
index c24b00f55..761be42ef 100644
--- a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.tests;singleton:=true
-Bundle-Version: 1.7.400.qualifier
+Bundle-Version: 1.7.500.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.equinox.p2.tests.TestActivator
Bundle-Vendor: %providerName
@@ -53,7 +53,8 @@ Require-Bundle: org.eclipse.equinox.frameworkadmin,
org.eclipse.equinox.p2.transport.ecf;bundle-version="1.0.0",
org.eclipse.equinox.p2.publisher.eclipse;bundle-version="1.0.0",
org.eclipse.equinox.p2.operations;bundle-version="2.1.0",
- org.eclipse.equinox.p2.ui.sdk.scheduler
+ org.eclipse.equinox.p2.ui.sdk.scheduler,
+ org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.3.0,2.0.0)"
Eclipse-RegisterBuddy: org.eclipse.equinox.p2.artifact.repository
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Eclipse-BundleShape: dir
diff --git a/bundles/org.eclipse.equinox.p2.tests/plugin.xml b/bundles/org.eclipse.equinox.p2.tests/plugin.xml
index 70f56fb29..841b529ea 100644
--- a/bundles/org.eclipse.equinox.p2.tests/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/plugin.xml
@@ -37,6 +37,18 @@
id="org.eclipse.equinox.p2.processing.Multiplier">
<step class="org.eclipse.equinox.p2.tests.artifact.repository.processing.Multiplier"/>
</extension>
+ <extension
+ point="org.eclipse.equinox.p2.artifact.repository.processingSteps"
+ id="org.eclipse.equinox.p2.processing.AlwaysDisabled">
+ <step class="org.eclipse.equinox.p2.tests.artifact.repository.processing.AlwaysDisabled"/>
+ </extension>
+ <extension
+ point="org.eclipse.equinox.p2.artifact.repository.processingSteps"
+ id="org.eclipse.equinox.p2.processing.MultipleSteps">
+ <step class="org.eclipse.equinox.p2.tests.artifact.repository.processing.Adder"/>
+ <step class="org.eclipse.equinox.p2.tests.artifact.repository.processing.ByteShifter"/>
+ <step class="org.eclipse.equinox.p2.tests.artifact.repository.processing.Multiplier"/>
+ </extension>
<extension
point="org.eclipse.equinox.p2.engine.actions">
<action
diff --git a/bundles/org.eclipse.equinox.p2.tests/pom.xml b/bundles/org.eclipse.equinox.p2.tests/pom.xml
index 5c8d6bb61..f29c44ced 100644
--- a/bundles/org.eclipse.equinox.p2.tests/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/pom.xml
@@ -16,7 +16,7 @@
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.tests</artifactId>
- <version>1.7.400-SNAPSHOT</version>
+ <version>1.7.500-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/AlwaysDisabled.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/AlwaysDisabled.java
new file mode 100644
index 000000000..6835e99de
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/AlwaysDisabled.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+* Copyright (c) 2018 Mykola Nikishov.
+*
+* This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License 2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*
+* Contributors:
+* Mykola Nikishov - initial API and implementation
+*******************************************************************************/
+package org.eclipse.equinox.p2.tests.artifact.repository.processing;
+
+import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
+
+public class AlwaysDisabled extends ProcessingStep {
+
+ public AlwaysDisabled() {
+ // needed
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return false;
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
index 04216eb73..c8df6b48d 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
-* Copyright (c) 2007, 2017 compeople AG and others.
+* Copyright (c) 2007, 2018 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* compeople AG (Stefan Liebig) - initial API and implementation
* IBM - continuing development
+* Mykola Nikishov - continuing development
*******************************************************************************/
package org.eclipse.equinox.p2.tests.artifact.repository.processing;
@@ -27,9 +28,11 @@ import org.eclipse.equinox.internal.p2.artifact.processors.md5.MD5Verifier;
import org.eclipse.equinox.internal.p2.artifact.processors.pack200.Pack200ProcessorStep;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
import org.eclipse.equinox.internal.p2.jarprocessor.PackStep;
+import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStepHandler;
import org.eclipse.equinox.p2.repository.artifact.IProcessingStepDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.eclipse.equinox.p2.tests.TestActivator;
@@ -41,6 +44,45 @@ public class ProcessingStepHandlerTest extends AbstractProvisioningTest {
ProcessingStepHandler handler = new ProcessingStepHandler();
IProgressMonitor monitor = new NullProgressMonitor();
+ public void testCanProcess_Ok() {
+ ArtifactDescriptor descriptor = new ArtifactDescriptor(ArtifactKey.parse("classifier,id,1.0.0"));
+ descriptor.setProcessingSteps(new ProcessingStepDescriptor[] {new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true)});
+
+ assertTrue(ProcessingStepHandler.canProcess(descriptor));
+ }
+
+ public void testCanProcess_FailNoSuchStep() {
+ String noSuchStepId = "org.eclipse.equinox.p2.processing.test.Dummy";
+ ArtifactDescriptor descriptor = new ArtifactDescriptor(ArtifactKey.parse("classifier,id,1.0.0"));
+ descriptor.setProcessingSteps(new ProcessingStepDescriptor[] {new ProcessingStepDescriptor(noSuchStepId, null, true), new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.ByteShifter", "1", true)});
+
+ assertFalse(ProcessingStepHandler.canProcess(descriptor));
+ }
+
+ public void testCanProcess_FailAlwaysDisabled() {
+ ArtifactDescriptor descriptor = new ArtifactDescriptor(ArtifactKey.parse("classifier,id,1.0.0"));
+ String processorId = "org.eclipse.equinox.p2.processing.AlwaysDisabled";
+ descriptor.setProcessingSteps(new ProcessingStepDescriptor[] {new ProcessingStepDescriptor(processorId, null, true), new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.ByteShifter", "1", true)});
+
+ assertFalse(ProcessingStepHandler.canProcess(descriptor));
+ }
+
+ public void testCanProcess_OkOptionalAlwaysDisabled() {
+ ArtifactDescriptor descriptor = new ArtifactDescriptor(ArtifactKey.parse("classifier,id,1.0.0"));
+ String processorId = "org.eclipse.equinox.p2.processing.AlwaysDisabled";
+ descriptor.setProcessingSteps(new ProcessingStepDescriptor[] {new ProcessingStepDescriptor(processorId, null, false), new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.ByteShifter", "1", true)});
+
+ assertTrue("Not enabled optional step should not block processing", ProcessingStepHandler.canProcess(descriptor));
+ }
+
+ public void testCanProcess_FailMultipleSteps() {
+ ArtifactDescriptor descriptor = new ArtifactDescriptor(ArtifactKey.parse("classifier,id,1.0.0"));
+ String processorId = "org.eclipse.equinox.p2.processing.MultipleSteps";
+ descriptor.setProcessingSteps(new ProcessingStepDescriptor[] {new ProcessingStepDescriptor(processorId, null, true), new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.ByteShifter", "1", true)});
+
+ assertFalse(String.format("Multiple step attributes in %s are not supported", processorId), ProcessingStepHandler.canProcess(descriptor));
+ }
+
public void testExecuteNoPSs() throws IOException {
IProcessingStepDescriptor[] descriptors = new IProcessingStepDescriptor[0];
OutputStream result = new ByteArrayOutputStream(10);

Back to the top