diff options
author | Andrew Niefer | 2009-10-09 20:49:13 +0000 |
---|---|---|
committer | Andrew Niefer | 2009-10-09 20:49:13 +0000 |
commit | be70c40f6a0c18c8909db78b889cdaa4fb4158fb (patch) | |
tree | ac4c26a01e0cd8e61a40ff460ccd04aae09bc642 | |
parent | c33eff97a04c3e8251f7e227927427dc2b9e3fde (diff) | |
download | rt.equinox.p2-20091010.tar.gz rt.equinox.p2-20091010.tar.xz rt.equinox.p2-20091010.zip |
4 files changed, 73 insertions, 13 deletions
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Messages.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Messages.java index 1ec043a93..1f4b3c69c 100644 --- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Messages.java +++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Messages.java @@ -56,6 +56,8 @@ public class Messages extends NLS { public static String Repo2RunnableTask_errorTransforming; public static String SlicingOption_invalidFilterFormat; + public static String skippingInvalidFilter; + static { // initialize resource bundles NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties index 0363e9ce9..6b07d7fc7 100644 --- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties +++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties @@ -23,6 +23,7 @@ no_profile_registry=Unable to acquire profile registry service. unable_to_process_uri=Unable to process as URI: {0} unable_to_start_exemplarysetup=Unable to start exemplarysetup bundle. unknown_repository_type=Repository is of an unknown type: {0} +skippingInvalidFilter=Invalid filter format, skipping {0}. MirrorApplication_artifactDestinationNoSource=Destination artifact repository specified without a corresponding source artifact repository. MirrorApplication_metadataDestinationNoSource=Destination metadata repository specified without a corresponding source metadata repository. @@ -34,6 +35,7 @@ MirrorApplication_validateAndMirrorProblems=Problems occurred during validation ProcessRepo_location_not_url=Repository location {0} must be a URL. ProcessRepo_must_be_local=Repository must be local: {0} + SlicingOption_invalid_platform=Invalid platform filter format: {0}. SlicingOption_invalidFilterFormat=Invalid filter format: {0} exception_destinationNotModifiable = The destination repository must be modifiable: {0}. diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/IUDescription.java b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/IUDescription.java index 1da4d098e..70a91b01c 100644 --- a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/IUDescription.java +++ b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/IUDescription.java @@ -10,15 +10,13 @@ *******************************************************************************/ package org.eclipse.equinox.p2.internal.repository.tools.tasks; -import org.eclipse.equinox.internal.provisional.p2.metadata.Version; - -import org.eclipse.equinox.internal.provisional.p2.metadata.query.CompositeQuery; - -import org.eclipse.equinox.internal.provisional.p2.metadata.query.Query; - import java.util.*; import org.apache.tools.ant.types.DataType; +import org.eclipse.equinox.internal.provisional.p2.metadata.Version; import org.eclipse.equinox.internal.provisional.p2.metadata.query.*; +import org.eclipse.equinox.p2.internal.repository.tools.Activator; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; /** * @since 1.0 @@ -32,6 +30,7 @@ public class IUDescription extends DataType { private String version; private String queryString; private boolean required = true; + private String artifactFilter = null; public IUDescription() { super(); @@ -52,6 +51,17 @@ public class IUDescription extends DataType { this.queryString = query; } + public void setArtifacts(String filter) { + if (filter != null && !filter.startsWith(ANT_PREFIX)) + this.artifactFilter = filter; + } + + public Filter getArtifactFilter() throws InvalidSyntaxException { + if (artifactFilter != null) + return Activator.getBundleContext().createFilter(artifactFilter); + return null; + } + public void setRequired(boolean required) { this.required = required; } diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/RemoveIUTask.java b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/RemoveIUTask.java index ce40d6dcf..c766504b8 100644 --- a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/RemoveIUTask.java +++ b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/RemoveIUTask.java @@ -10,24 +10,27 @@ *******************************************************************************/ package org.eclipse.equinox.p2.internal.repository.tools.tasks; -import org.eclipse.equinox.internal.provisional.p2.metadata.query.Collector; - -import org.eclipse.equinox.internal.provisional.p2.metadata.query.Query; - -import java.util.Iterator; +import java.util.*; import org.apache.tools.ant.BuildException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactDescriptor; import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactRepository; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.metadata.IArtifactKey; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.internal.provisional.p2.metadata.query.*; import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.p2.internal.repository.tools.AbstractApplication; import org.eclipse.equinox.p2.internal.repository.tools.Messages; import org.eclipse.osgi.util.NLS; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; public class RemoveIUTask extends AbstractRepositoryTask { + private static final String CLASSIFIER = "classifier"; //$NON-NLS-1$ + private static final String ID = "id"; //$NON-NLS-1$ + private static final String VERSION = "version"; //$NON-NLS-1$ protected static class RemoveIUApplication extends AbstractApplication { //Only need the application to reuse super's repo management. @@ -56,6 +59,7 @@ public class RemoveIUTask extends AbstractRepositoryTask { IMetadataRepository repository = application.getDestinationMetadataRepository(); IArtifactRepository artifacts = application.getDestinationArtifactRepository(); + final Set toRemove = new HashSet(); for (Iterator iter = iuTasks.iterator(); iter.hasNext();) { IUDescription iu = (IUDescription) iter.next(); Query iuQuery = iu.createQuery(); @@ -65,16 +69,48 @@ public class RemoveIUTask extends AbstractRepositoryTask { if (collector.isEmpty()) getProject().log(NLS.bind(Messages.AbstractRepositoryTask_unableToFind, iu.toString())); - else if (repository.removeInstallableUnits(iuQuery, null) && artifacts != null) { + else { for (Iterator iterator = collector.iterator(); iterator.hasNext();) { IInstallableUnit unit = (IInstallableUnit) iterator.next(); IArtifactKey[] keys = unit.getArtifacts(); + Filter filter = null; + try { + filter = iu.getArtifactFilter(); + } catch (InvalidSyntaxException e) { + getProject().log(NLS.bind(Messages.skippingInvalidFilter, iu.toString())); + continue; + } + + //we will only remove the metadata if all artifacts were removed + boolean removeMetadata = true; for (int i = 0; i < keys.length; i++) { - artifacts.removeDescriptor(keys[i]); + if (filter == null) { + artifacts.removeDescriptor(keys[i]); + } else { + IArtifactDescriptor[] descriptors = artifacts.getArtifactDescriptors(keys[i]); + for (int j = 0; j < descriptors.length; j++) { + if (filter.match(createDictionary(descriptors[j]))) { + artifacts.removeDescriptor(descriptors[j]); + } else { + removeMetadata = false; + } + } + } } + if (removeMetadata) + toRemove.add(unit); } } } + + if (toRemove.size() > 0) { + Query removeQuery = new MatchQuery() { + public boolean isMatch(Object candidate) { + return toRemove.contains(candidate); + } + }; + repository.removeInstallableUnits(removeQuery, null); + } } catch (ProvisionException e) { throw new BuildException(e); } finally { @@ -85,4 +121,14 @@ public class RemoveIUTask extends AbstractRepositoryTask { } } } + + private Dictionary createDictionary(IArtifactDescriptor descriptor) { + Hashtable result = new Hashtable(5); + result.putAll(descriptor.getProperties()); + IArtifactKey key = descriptor.getArtifactKey(); + result.put(CLASSIFIER, key.getClassifier()); + result.put(ID, key.getId()); + result.put(VERSION, key.getVersion()); + return result; + } } |