Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2009-10-09 20:49:13 +0000
committerAndrew Niefer2009-10-09 20:49:13 +0000
commitbe70c40f6a0c18c8909db78b889cdaa4fb4158fb (patch)
treeac4c26a01e0cd8e61a40ff460ccd04aae09bc642
parentc33eff97a04c3e8251f7e227927427dc2b9e3fde (diff)
downloadrt.equinox.p2-20091010.tar.gz
rt.equinox.p2-20091010.tar.xz
rt.equinox.p2-20091010.zip
bug 291424 - option to remove only some descriptorsv20091010
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Messages.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties2
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/IUDescription.java22
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/RemoveIUTask.java60
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;
+ }
}

Back to the top