/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ /** * */ package org.ebayopensource.turmeric.eclipse.errorlibrary.providers; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.errorlibrary.ErrorLibraryActivator; import org.ebayopensource.turmeric.eclipse.errorlibrary.resources.SOAMessages; import org.ebayopensource.turmeric.eclipse.exception.resources.SOAGetErrorLibraryProviderFailedException; import org.ebayopensource.turmeric.eclipse.utils.collections.ListUtil; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.dialogs.ListDialog; /** * A factory for creating ErrorLibraryProvider objects. * * @author yayu * @since 1.0.0 */ public final class ErrorLibraryProviderFactory { private static String preferredProviderID = null; private static Map<String, IErrorLibraryProvider> errorProviders = new LinkedHashMap<String, IErrorLibraryProvider>(); private static final SOALogger logger = SOALogger.getLogger(); /** The Constant PROP_KEY_PROVIDER_ID. */ public static final String PROP_KEY_PROVIDER_ID = "providerID"; /** The Constant PROP_KEY_PROVIDER_IMPLEMENTATION. */ public static final String PROP_KEY_PROVIDER_IMPLEMENTATION = "providerImplementation"; private static ErrorLibraryProviderFactory factory = new ErrorLibraryProviderFactory(); /** * */ private ErrorLibraryProviderFactory() { super(); } /** * Gets the single instance of ErrorLibraryProviderFactory. * * @return single instance of ErrorLibraryProviderFactory */ public static ErrorLibraryProviderFactory getInstance() { return factory; } /** * Gets the error library providers. * * @return the error library providers * @throws SOAGetErrorLibraryProviderFailedException the sOA get error library provider failed exception */ public List<IErrorLibraryProvider> getErrorLibraryProviders() throws SOAGetErrorLibraryProviderFailedException{ if (errorProviders.isEmpty() == true) { try { final IExtensionRegistry registry = Platform.getExtensionRegistry(); final IExtensionPoint extensionPoint = registry .getExtensionPoint(ErrorLibraryActivator.PLUGIN_ID + ".soaErrorLibProvider"); if (extensionPoint != null) { IExtension[] extensions = extensionPoint.getExtensions(); final Map<String, IConfigurationElement> providers = new LinkedHashMap<String, IConfigurationElement>(); for (final IExtension extension : extensions) { for (final IConfigurationElement element : extension .getConfigurationElements()) { final String providerID = element .getAttribute(PROP_KEY_PROVIDER_ID); providers.put(providerID, element); errorProviders.put(providerID, (IErrorLibraryProvider) element.createExecutableExtension(PROP_KEY_PROVIDER_IMPLEMENTATION)); } } } } catch (Exception e) { throw new SOAGetErrorLibraryProviderFailedException( SOAMessages.CONTENT_PROVIDER_NOT_FOUND, e); } } return ListUtil.arrayList(errorProviders.values()); } /** * Sets the preferred error library provider id. * * @param providerId the new preferred error library provider id */ public void setPreferredErrorLibraryProviderId(String providerId) { preferredProviderID = providerId; } /** * Gets the preferred provider. * * @return The preferred error library content provider * @throws SOAGetErrorLibraryProviderFailedException the sOA get error library provider failed exception */ public IErrorLibraryProvider getPreferredProvider() throws SOAGetErrorLibraryProviderFailedException { IErrorLibraryProvider preferredProvider = null; if (preferredProviderID == null) { try { final List<IErrorLibraryProvider> providers = getErrorLibraryProviders(); if (providers.size() == 1) { preferredProviderID = providers.get(0).getProviderID(); logger.info(SOAMessages.PREF_CONTENT_PROVIDER, preferredProviderID); } else { showDialogAndSelectProvider(); } } catch (Exception e) { throw new SOAGetErrorLibraryProviderFailedException( SOAMessages.CONTENT_PROVIDER_NOT_FOUND, e); } } if (errorProviders.isEmpty() == true) { getErrorLibraryProviders(); } preferredProvider = errorProviders.get(preferredProviderID); if (preferredProvider == null) { // no error providers found. bad bad. throw an exception throw new SOAGetErrorLibraryProviderFailedException( SOAMessages.CONTENT_PROVIDER_NOT_FOUND); } return preferredProvider; } private void showDialogAndSelectProvider() { IStructuredContentProvider contentProvider = new ErrorLibraryStructuredContentProvider(); ILabelProvider labelProvider = new ErrorLibraryLabelProvider(); ListDialog dialog = new ListDialog( UIUtil.getActiveShell()); dialog.setContentProvider(contentProvider); dialog.setLabelProvider(labelProvider); dialog.setInput(new Object()); dialog.setMessage("Please select a preferred error library provider to use, " + "\nthe selected provider will be used as the default provider."); if (dialog.open() == Window.OK) { Object[] objects = dialog.getResult(); if (objects != null && objects.length > 0) { preferredProviderID = ((IErrorLibraryProvider)objects[0]).getProviderID(); logger.info(SOAMessages.PREF_CONTENT_PROVIDER, preferredProviderID); } } } private class ErrorLibraryStructuredContentProvider implements IStructuredContentProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } /** * {@inheritDoc} */ @Override public Object[] getElements(Object inputElement) { try { return getErrorLibraryProviders().toArray(); } catch (SOAGetErrorLibraryProviderFailedException e) { return Collections.EMPTY_LIST.toArray(); } } } private static class ErrorLibraryLabelProvider implements ILabelProvider { @Override public Image getImage(Object element) { return null; } @Override public String getText(Object element) { if (element instanceof IErrorLibraryProvider) { return ((IErrorLibraryProvider)element).getProviderID(); } return ""; } @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } } }