]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java
Improve Spring Integration
[lgpl/argeo-commons.git] / eclipse / plugins / org.argeo.eclipse.ui / src / main / java / org / argeo / eclipse / spring / SpringCommandHandler.java
diff --git a/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java b/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java
new file mode 100644 (file)
index 0000000..9f3161c
--- /dev/null
@@ -0,0 +1,87 @@
+package org.argeo.eclipse.spring;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.commands.IHandlerListener;
+import org.springframework.context.ApplicationContext;
+
+public class SpringCommandHandler implements IHandler {
+       private final static Log log = LogFactory
+                       .getLog(SpringCommandHandler.class);
+
+       public void addHandlerListener(IHandlerListener handlerListener) {
+       }
+
+       public void dispose() {
+       }
+
+       public Object execute(ExecutionEvent event) throws ExecutionException {
+               try {
+                       if (log.isDebugEnabled())
+                               log.debug("Execute " + event + " via spring command handler "
+                                               + this);
+
+                       // Find the application context of the bundle defining the command
+                       // extension
+                       // ICommandService commandService =
+                       // (ICommandService)ArgeoUiPlugin.getDefault().getWorkbench().getService(ICommandService.class);
+                       //              
+                       // Command command =
+                       // commandService.getCommand(event.getCommand().getId());
+                       // log.debug("command=" + command);
+                       // log.debug("Command id " + command.getId());
+                       //              
+                       // Platform.getExtensionRegistry().getE
+                       //              
+                       // IExtension extension =
+                       // Platform.getExtensionRegistry().getExtension(
+                       // "org.eclipse.ui.commands", command.getId());
+                       // log.debug("extension=" + extension);
+                       // String bundleSymbolicName = extension.getContributor().getName();
+
+                       // Assume that the defining bundle name is the first part of the
+                       // command
+                       // id
+                       // TODO: make it more flexible and robust
+                       String commandId = event.getCommand().getId();
+                       String bundleSymbolicName = commandId.substring(0, commandId
+                                       .lastIndexOf('.'));
+                       ApplicationContext applicationContext = ApplicationContextTracker
+                                       .getApplicationContext(bundleSymbolicName);
+
+                       // retrieve the command via its id
+                       String beanName = event.getCommand().getId();
+                       if (!applicationContext.containsBean(beanName))
+                               throw new ExecutionException("No bean found with name "
+                                               + beanName + " in bundle " + bundleSymbolicName);
+                       Object bean = applicationContext.getBean(beanName);
+
+                       if (!(bean instanceof IHandler))
+                               throw new ExecutionException("Bean with name " + beanName
+                                               + " and class " + bean.getClass()
+                                               + " does not implement the IHandler interface.");
+
+                       IHandler handler = (IHandler) bean;
+                       return handler.execute(event);
+               } catch (Exception e) {
+                       // TODO: use eclipse error management
+                       log.error(e);
+                       return null;
+               }
+       }
+
+       public boolean isEnabled() {
+               return true;
+       }
+
+       public boolean isHandled() {
+               return true;
+       }
+
+       public void removeHandlerListener(IHandlerListener handlerListener) {
+       }
+
+}