X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=eclipse%2Fplugins%2Forg.argeo.eclipse.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Feclipse%2Fspring%2FSpringCommandHandler.java;fp=eclipse%2Fplugins%2Forg.argeo.eclipse.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Feclipse%2Fspring%2FSpringCommandHandler.java;h=9f3161c2ecfde0453b19cd19191e2787020da286;hb=dcaa55aad26d7fd945a713af5854741f82dd13f3;hp=0000000000000000000000000000000000000000;hpb=17ab4abc34cd258435a9efdb8dd00228af859613;p=lgpl%2Fargeo-commons.git 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 index 000000000..9f3161c2e --- /dev/null +++ b/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java @@ -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) { + } + +}