Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.console/src/org/eclipse/equinox/console/commands/CommandsTracker.java')
-rwxr-xr-xbundles/org.eclipse.equinox.console/src/org/eclipse/equinox/console/commands/CommandsTracker.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.console/src/org/eclipse/equinox/console/commands/CommandsTracker.java b/bundles/org.eclipse.equinox.console/src/org/eclipse/equinox/console/commands/CommandsTracker.java
new file mode 100755
index 000000000..2b5f68c6a
--- /dev/null
+++ b/bundles/org.eclipse.equinox.console/src/org/eclipse/equinox/console/commands/CommandsTracker.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2013 SAP AG.
+ * 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:
+ * Lazar Kirchev, SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.console.commands;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+public class CommandsTracker {
+ private Set<String> commandNames;
+ private ServiceTracker<Object, Set<String>> commandsTracker = null;
+ private static final Object lock = new Object();
+
+ public CommandsTracker(BundleContext bundleContext) {
+ commandNames = Collections.synchronizedSet(new HashSet<String>());
+ try {
+ Filter filter = bundleContext.createFilter(String.format("(&(%s=*)(%s=*))", CommandProcessor.COMMAND_SCOPE, CommandProcessor.COMMAND_FUNCTION));
+ commandsTracker = new ServiceTracker<Object, Set<String>>(bundleContext, filter, new CommandsTrackerCustomizer());
+ commandsTracker.open();
+ } catch (InvalidSyntaxException e) {
+ //do nothing;
+ }
+ }
+
+ public Set<String> getCommands() {
+ synchronized (lock) {
+ return new HashSet<String>(commandNames);
+ }
+ }
+
+ class CommandsTrackerCustomizer implements ServiceTrackerCustomizer<Object, Set<String>> {
+ public Set<String> addingService(ServiceReference<Object> reference) {
+ Object scope = reference.getProperty(CommandProcessor.COMMAND_SCOPE);
+ Object function = reference.getProperty(CommandProcessor.COMMAND_FUNCTION);
+
+ if (scope != null && function != null) {
+ synchronized (lock) {
+ if (function.getClass().isArray()) {
+ for (Object func : ((Object[]) function)) {
+ commandNames.add(scope.toString() + ":" + func.toString());
+ }
+ } else {
+ commandNames.add(scope.toString() + ":" + function.toString());
+ }
+ return commandNames;
+ }
+ }
+ return null;
+ }
+
+ public void modifiedService(ServiceReference<Object> reference, Set<String> commandNames) {
+ // nothing to do
+ }
+
+ public void removedService(ServiceReference<Object> reference, Set<String> commandNames) {
+ Object scope = reference.getProperty(CommandProcessor.COMMAND_SCOPE);
+ Object function = reference.getProperty(CommandProcessor.COMMAND_FUNCTION);
+
+ if (scope != null && function != null) {
+ if (!function.getClass().isArray()) {
+ commandNames.remove(scope.toString() + ":" + function.toString());
+ } else {
+ for (Object func : (Object[]) function) {
+ commandNames.remove(scope.toString() + ":" + func.toString());
+ }
+ }
+ }
+ }
+
+ }
+}

Back to the top