Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.osgi.compatibility.state/src/org/eclipse/osgi/internal/resolver/UserState.java')
-rw-r--r--bundles/org.eclipse.osgi.compatibility.state/src/org/eclipse/osgi/internal/resolver/UserState.java63
1 files changed, 63 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi.compatibility.state/src/org/eclipse/osgi/internal/resolver/UserState.java b/bundles/org.eclipse.osgi.compatibility.state/src/org/eclipse/osgi/internal/resolver/UserState.java
new file mode 100644
index 000000000..905927941
--- /dev/null
+++ b/bundles/org.eclipse.osgi.compatibility.state/src/org/eclipse/osgi/internal/resolver/UserState.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2010 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
+ * Rob Harrop - SpringSource Inc. (bug 247522)
+ *******************************************************************************/
+package org.eclipse.osgi.internal.resolver;
+
+import java.util.*;
+import org.eclipse.osgi.service.resolver.*;
+import org.osgi.framework.BundleException;
+
+/**
+ * This implementation of State does a bookkeeping of all added/removed
+ */
+public class UserState extends StateImpl {
+ // TODO this is not an accurate way to record updates
+ private final Set<String> updated = Collections.synchronizedSet(new HashSet<String>());
+
+ public boolean removeBundle(BundleDescription description) {
+ if (description.getLocation() != null)
+ updated.remove(description.getLocation());
+ if (!super.removeBundle(description))
+ return false;
+ return true;
+ }
+
+ public boolean updateBundle(BundleDescription newDescription) {
+ if (!super.updateBundle(newDescription))
+ return false;
+ updated.add(newDescription.getLocation());
+ return true;
+ }
+
+ /**
+ * @throws BundleException
+ */
+ public StateDelta compare(State baseState) throws BundleException {
+ BundleDescription[] current = this.getBundles();
+ StateDeltaImpl delta = new StateDeltaImpl(this);
+ // process additions and updates
+ for (int i = 0; i < current.length; i++) {
+ BundleDescription existing = baseState.getBundleByLocation(current[i].getLocation());
+ if (existing == null)
+ delta.recordBundleAdded((BundleDescriptionImpl) current[i]);
+ else if (updated.contains(current[i].getLocation()))
+ delta.recordBundleUpdated((BundleDescriptionImpl) current[i]);
+ }
+ // process removals
+ BundleDescription[] existing = baseState.getBundles();
+ for (int i = 0; i < existing.length; i++) {
+ BundleDescription local = getBundleByLocation(existing[i].getLocation());
+ if (local == null)
+ delta.recordBundleRemoved((BundleDescriptionImpl) existing[i]);
+ }
+ return delta;
+ }
+}

Back to the top