blob: c003820a7cfa4a3645fc867e189a1341894f22d5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 compeople AG 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:
* compeople AG (Stefan Liebig) - initial API and implementation
* IBM - continuing development
*******************************************************************************/
package org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing;
import java.io.OutputStream;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactDescriptor;
/**
* Creates processing step instances from extensions and executes them.
*/
public class ProcessingStepHandler {
private static final String PROCESSING_STEPS_EXTENSION_ID = "org.eclipse.equinox.p2.artifact.repository.processingSteps"; //$NON-NLS-1$
public static IStatus checkStatus(OutputStream output) {
if (!(output instanceof ProcessingStep))
return Status.OK_STATUS;
return ((ProcessingStep) output).getStatus(true);
}
/**
* Check to see that we have processors for all the steps in the given descriptor
* @param descriptor the descriptor to check
* @return whether or not processors for all the descriptor's steps are installed
*/
public static boolean canProcess(IArtifactDescriptor descriptor) {
IExtensionRegistry registry = RegistryFactory.getRegistry();
IExtensionPoint point = registry.getExtensionPoint(PROCESSING_STEPS_EXTENSION_ID);
if (point == null)
return false;
ProcessingStepDescriptor[] steps = descriptor.getProcessingSteps();
for (int i = 0; i < steps.length; i++) {
if (point.getExtension(steps[i].getProcessorId()) == null)
return false;
}
return true;
}
public ProcessingStep[] create(ProcessingStepDescriptor[] descriptors, IArtifactDescriptor context) {
ProcessingStep[] result = new ProcessingStep[descriptors.length];
for (int i = 0; i < descriptors.length; i++)
result[i] = create(descriptors[i], context);
return result;
}
public ProcessingStep create(ProcessingStepDescriptor descriptor, IArtifactDescriptor context) {
IExtensionRegistry registry = RegistryFactory.getRegistry();
IExtension extension = registry.getExtension(PROCESSING_STEPS_EXTENSION_ID, descriptor.getProcessorId());
Exception error;
if (extension != null) {
IConfigurationElement[] config = extension.getConfigurationElements();
try {
Object object = config[0].createExecutableExtension("class"); //$NON-NLS-1$
ProcessingStep step = (ProcessingStep) object;
step.initialize(descriptor, context);
return step;
} catch (Exception e) {
error = e;
}
} else
error = new ProcessingStepHandlerException("Could not get extension " + PROCESSING_STEPS_EXTENSION_ID + " for desriptor id " + descriptor.getProcessorId());
int severity = descriptor.isRequired() ? IStatus.ERROR : IStatus.INFO;
ProcessingStep result = new EmptyProcessingStep();
result.setStatus(new Status(severity, Activator.ID, "Could not instantiate step:" + descriptor.getProcessorId(), error));
return result;
}
public OutputStream createAndLink(ProcessingStepDescriptor[] descriptors, IArtifactDescriptor context, OutputStream output, IProgressMonitor monitor) {
if (descriptors == null)
return output;
ProcessingStep[] steps = create(descriptors, context);
return link(steps, output, monitor);
}
public OutputStream link(ProcessingStep[] steps, OutputStream output, IProgressMonitor monitor) {
OutputStream previous = output;
for (int i = steps.length - 1; i >= 0; i--) {
ProcessingStep step = steps[i];
step.link(previous, monitor);
previous = step;
}
return previous;
}
protected static final class EmptyProcessingStep extends ProcessingStep {
// Just to hold the status
}
protected static final class ProcessingStepHandlerException extends Exception {
private static final long serialVersionUID = 1L;
public ProcessingStepHandlerException(String message) {
super(message);
}
}
}