| /******************************************************************************* |
| * Copyright (c) 2011 BSI Business Systems Integration 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: |
| * Daniel Wiehl (BSI Business Systems Integration AG) - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.scout.sdk.ws.jaxws; |
| |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.resource.CompositeImageDescriptor; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.scout.commons.CompareUtility; |
| import org.eclipse.scout.sdk.ui.internal.ImageRegistry; |
| import org.eclipse.scout.sdk.ui.view.outline.pages.IPage; |
| import org.eclipse.scout.sdk.util.log.SdkLogManager; |
| import org.eclipse.scout.sdk.ws.jaxws.marker.commands.IMarkerCommand; |
| import org.eclipse.scout.sdk.ws.jaxws.util.listener.IPageReloadNotification; |
| import org.eclipse.scout.sdk.ws.jaxws.worker.MarkerQueueManager; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.SWTError; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.plugin.AbstractUIPlugin; |
| import org.osgi.framework.BundleContext; |
| |
| /** |
| * The activator class controls the plug-in life cycle |
| */ |
| public class JaxWsSdk extends AbstractUIPlugin implements JaxWsIcons { |
| |
| // The plug-in ID |
| public static final String PLUGIN_ID = "org.eclipse.scout.sdk.ws.jaxws"; |
| private static final String IMAGE_PATH = "resources/icons/"; |
| |
| private static JaxWsSdk m_plugin; |
| private static SdkLogManager logManager; |
| |
| private Map<String, IMarkerCommand> m_markerCommands; |
| private MarkerQueueManager m_markerQueueManager; |
| private Object m_pageRegistryLock; |
| private Map<Class<? extends IPage>, Set<IPageReloadNotification>> m_pageRegistry; |
| |
| public JaxWsSdk() { |
| m_markerCommands = new ConcurrentHashMap<String, IMarkerCommand>(); |
| m_pageRegistry = new HashMap<Class<? extends IPage>, Set<IPageReloadNotification>>(); |
| m_pageRegistryLock = new Object(); |
| } |
| |
| @Override |
| public void start(BundleContext context) throws Exception { |
| super.start(context); |
| m_plugin = this; |
| logManager = new SdkLogManager(this); |
| m_markerQueueManager = new MarkerQueueManager(); |
| } |
| |
| @Override |
| public void stop(BundleContext context) throws Exception { |
| if (m_markerQueueManager != null) { |
| m_markerQueueManager.cancelWorker(); |
| m_markerQueueManager = null; |
| } |
| logManager = null; |
| super.stop(context); |
| } |
| |
| public static JaxWsSdk getDefault() { |
| return m_plugin; |
| } |
| |
| public static void logInfo(Throwable t) { |
| logManager.logInfo(t); |
| } |
| |
| public static void logInfo(String message) { |
| logManager.logInfo(message); |
| } |
| |
| public static void logInfo(String message, Throwable t) { |
| logManager.logInfo(message, t); |
| } |
| |
| public static void logWarning(String message) { |
| logManager.logWarning(message); |
| } |
| |
| public static void logWarning(Throwable t) { |
| logManager.logWarning(t); |
| } |
| |
| public static void logWarning(String message, Throwable t) { |
| logManager.logWarning(message, t); |
| } |
| |
| public static void logError(Throwable t) { |
| logManager.logError(t); |
| } |
| |
| public static void logError(String message) { |
| logManager.logError(message); |
| } |
| |
| public static void logError(String message, Throwable t) { |
| logManager.logError(message, t); |
| } |
| |
| public IMarkerCommand getMarkerCommand(String markerSourceId) { |
| return m_markerCommands.get(markerSourceId); |
| } |
| |
| public IMarkerCommand addMarkerCommand(String markerSourceId, IMarkerCommand markerCommand) { |
| return m_markerCommands.put(markerSourceId, markerCommand); |
| } |
| |
| public void removeMarkerCommand(String markerSourceId) { |
| m_markerCommands.remove(markerSourceId); |
| } |
| |
| public void removeMarkerCommands(String markerGroupUUID) { |
| for (String markerSourceId : m_markerCommands.keySet()) { |
| if (markerSourceId.startsWith(markerGroupUUID)) { |
| m_markerCommands.remove(markerSourceId); |
| } |
| } |
| } |
| |
| public boolean containsMarkerCommands(String markerGroupUUID) { |
| Set<String> markerSourceIds = m_markerCommands.keySet(); |
| for (String markerSourceId : markerSourceIds) { |
| if (markerSourceId.startsWith(markerGroupUUID)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public MarkerQueueManager getMarkerQueueManager() { |
| return m_markerQueueManager; |
| } |
| |
| /** |
| * To load the model of a page |
| * |
| * @param pageClazz |
| * @param markerGroupUUID |
| * @param dataMask |
| */ |
| public void notifyPageReload(Class<? extends IPage> pageClazz, final String markerGroupUUID, final int dataMask) { |
| final IPageReloadNotification[] pages; |
| synchronized (m_pageRegistryLock) { |
| Set<IPageReloadNotification> pageSet = m_pageRegistry.get(pageClazz); |
| if (pageSet == null || pageSet.size() == 0) { |
| return; |
| } |
| pages = pageSet.toArray(new IPageReloadNotification[pageSet.size()]); |
| } |
| |
| Job job = new Job("Reload page content") { |
| |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| for (IPageReloadNotification page : pages) { |
| try { |
| if (CompareUtility.equals(markerGroupUUID, page.getMarkerGroupUUID())) { |
| page.reloadPage(dataMask); |
| } |
| } |
| catch (Exception e) { |
| logError("failed to notify listener", e); |
| } |
| } |
| return Status.OK_STATUS; |
| } |
| }; |
| job.schedule(); |
| } |
| |
| /** |
| * Register page to receive reload requests |
| * |
| * @param pageClazz |
| * @param page |
| */ |
| public void registerPage(Class<? extends IPage> pageClazz, IPageReloadNotification page) { |
| synchronized (m_pageRegistryLock) { |
| Set<IPageReloadNotification> pages = m_pageRegistry.get(pageClazz); |
| if (pages == null) { |
| pages = new HashSet<IPageReloadNotification>(); |
| m_pageRegistry.put(pageClazz, pages); |
| } |
| pages.add(page); |
| } |
| } |
| |
| /** |
| * Unregister page from receiving reload requests |
| * |
| * @param pageClazz |
| * @param page |
| */ |
| public void unregisterPage(Class<? extends IPage> pageClazz, IPageReloadNotification page) { |
| synchronized (m_pageRegistryLock) { |
| Set<IPageReloadNotification> pages = m_pageRegistry.get(pageClazz); |
| if (pages == null) { |
| return; |
| } |
| pages.remove(page); |
| } |
| } |
| |
| @Override |
| protected ImageRegistry createImageRegistry() { |
| // If we are in the UI Thread use that |
| if (Display.getCurrent() != null) { |
| return new ImageRegistry(Display.getCurrent()); |
| } |
| if (PlatformUI.isWorkbenchRunning()) { |
| return new ImageRegistry(PlatformUI.getWorkbench().getDisplay()); |
| } |
| // Invalid thread access if it is not the UI Thread |
| // and the workbench is not created. |
| throw new SWTError(SWT.ERROR_THREAD_INVALID_ACCESS); |
| } |
| |
| @Override |
| protected void initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry reg) { |
| } |
| |
| @Override |
| public ImageRegistry getImageRegistry() { |
| return (ImageRegistry) super.getImageRegistry(); |
| } |
| |
| /** |
| * Returns the image for the given composite descriptor. |
| */ |
| public static Image getImage(CompositeImageDescriptor imageDescriptor) { |
| return getDefault().getImageImpl(imageDescriptor); |
| } |
| |
| private Image getImageImpl(CompositeImageDescriptor imageDescriptor) { |
| return getImageRegistry().get(imageDescriptor); |
| } |
| |
| /** |
| * To get a cached image with one of the extensions [gif | png | jpg] |
| * |
| * @param name |
| * the name without extension located under resources/icons e.g. "person" |
| * @return the cached image |
| */ |
| public static Image getImage(String name) { |
| return getDefault().getImageImpl(name); |
| } |
| |
| private Image getImageImpl(String name) { |
| Image image = getImageRegistry().get(name); |
| if (image == null) { |
| loadImage(name); |
| image = getImageRegistry().get(name); |
| } |
| return image; |
| } |
| |
| /** |
| * To get a cached image with one of the extensions [gif | png | jpg] |
| * |
| * @param name |
| * the name without extension located under resources/icons e.g. "person" |
| * @return the cached image |
| */ |
| public static ImageDescriptor getImageDescriptor(String name) { |
| return getDefault().getImageDescriptorImpl(name); |
| } |
| |
| private ImageDescriptor getImageDescriptorImpl(String name) { |
| ImageDescriptor imageDesc = getImageRegistry().getDescriptor(name); |
| if (imageDesc == null) { |
| loadImage(name); |
| imageDesc = getImageRegistry().getDescriptor(name); |
| } |
| return imageDesc; |
| } |
| |
| private void loadImage(String name) { |
| ImageDescriptor desc = null; |
| // try already extension |
| desc = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, IMAGE_PATH + name); |
| // gif |
| if (desc == null) { |
| desc = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, IMAGE_PATH + name + ".gif"); |
| } |
| // png |
| if (desc == null) { |
| desc = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, IMAGE_PATH + name + ".png"); |
| } |
| // jpg |
| if (desc == null) { |
| desc = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, IMAGE_PATH + name + ".jpg"); |
| } |
| if (desc == null) { |
| logWarning("could not find image for plugin: '" + PLUGIN_ID + "' under: '" + IMAGE_PATH + name + "'."); |
| } |
| else { |
| getImageRegistry().put(name, desc); |
| } |
| } |
| } |