Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.m2e.core/src/org/eclipse/m2e/core/scm/ScmHandlerFactory.java')
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/scm/ScmHandlerFactory.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/scm/ScmHandlerFactory.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/scm/ScmHandlerFactory.java
new file mode 100644
index 00000000..8d3c7d92
--- /dev/null
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/scm/ScmHandlerFactory.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2010 Sonatype, Inc.
+ * 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:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.m2e.core.scm;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+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.m2e.core.core.IMavenConstants;
+import org.eclipse.m2e.core.core.MavenLogger;
+
+
+/**
+ * An SCM handler factory
+ *
+ * @author Eugene Kuleshov
+ */
+public class ScmHandlerFactory {
+
+
+ public static final String EXTENSION_SCM_HANDLERS = IMavenConstants.PLUGIN_ID + ".scmHandlers"; //$NON-NLS-1$
+
+ public static final String EXTENSION_SCM_HANDLERS_UI = IMavenConstants.PLUGIN_ID + ".scmHandlersUi"; //$NON-NLS-1$
+
+ private static final String ELEMENT_SCM_HANDLER = "handler"; //$NON-NLS-1$
+
+ private static final String ELEMENT_SCM_HANDLER_UI = "handlerUi"; //$NON-NLS-1$
+
+ private static volatile Map<String, List<ScmHandler>> scms;
+
+ private static volatile Map<String, ScmHandlerUi> scmUis;
+
+ public static synchronized void addScmHandlerUi(ScmHandlerUi handlerUi) {
+ getScmUis().put(handlerUi.getType(), handlerUi);
+ }
+
+ public static synchronized ScmHandlerUi getHandlerUiByType(String type) {
+ return type == null ? null : getScmUis().get(type);
+ }
+
+ public static synchronized void addScmHandler(ScmHandler handler) {
+ List<ScmHandler> handlers = getScms().get(handler.getType());
+ if(handlers == null) {
+ handlers = new ArrayList<ScmHandler>();
+ getScms().put(handler.getType(), handlers);
+ }
+ handlers.add(handler);
+ Collections.sort(handlers);
+ }
+
+ public static synchronized String[] getTypes() {
+ Map<String, List<ScmHandler>> scms = getScms();
+ return scms.keySet().toArray(new String[scms.size()]);
+ }
+
+ public static synchronized ScmHandler getHandler(String url) throws CoreException {
+ String type = ScmUrl.getType(url);
+ return getHandlerByType(type);
+ }
+
+ public static synchronized ScmHandler getHandlerByType(String type) {
+ List<ScmHandler> handlers = getScms().get(type);
+ if(handlers == null) {
+ return null;
+ }
+ return handlers.get(0);
+ }
+
+ private static Map<String, List<ScmHandler>> getScms() {
+ if(scms == null) {
+ scms = new TreeMap<String, List<ScmHandler>>();
+ for(ScmHandler scmHandler : readScmHanderExtensions()) {
+ addScmHandler(scmHandler);
+ }
+ }
+ return scms;
+ }
+
+ private static Map<String, ScmHandlerUi> getScmUis() {
+ if(scmUis == null) {
+ scmUis = new TreeMap<String, ScmHandlerUi>();
+ List<ScmHandlerUi> scmHandlerUis = readScmHandlerUiExtensions();
+ for(ScmHandlerUi scmHandlerUi : scmHandlerUis) {
+ addScmHandlerUi(scmHandlerUi);
+ }
+ }
+ return scmUis;
+ }
+
+ private static List<ScmHandler> readScmHanderExtensions() {
+ List<ScmHandler> scmHandlers = new ArrayList<ScmHandler>();
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint scmHandlersExtensionPoint = registry.getExtensionPoint(EXTENSION_SCM_HANDLERS);
+ if(scmHandlersExtensionPoint != null) {
+ IExtension[] scmHandlersExtensions = scmHandlersExtensionPoint.getExtensions();
+ for(IExtension extension : scmHandlersExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for(IConfigurationElement element : elements) {
+ if(element.getName().equals(ELEMENT_SCM_HANDLER)) {
+ try {
+ scmHandlers.add((ScmHandler) element.createExecutableExtension(ScmHandler.ATTR_CLASS));
+ } catch(CoreException ex) {
+ MavenLogger.log(ex);
+ }
+ }
+ }
+ }
+ }
+ return scmHandlers;
+ }
+
+ private static List<ScmHandlerUi> readScmHandlerUiExtensions() {
+ ArrayList<ScmHandlerUi> scmHandlerUis = new ArrayList<ScmHandlerUi>();
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint scmHandlersUiExtensionPoint = registry.getExtensionPoint(EXTENSION_SCM_HANDLERS_UI);
+ if(scmHandlersUiExtensionPoint != null) {
+ IExtension[] scmHandlersUiExtensions = scmHandlersUiExtensionPoint.getExtensions();
+ for(IExtension extension : scmHandlersUiExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for(IConfigurationElement element : elements) {
+ if(element.getName().equals(ELEMENT_SCM_HANDLER_UI)) {
+ try {
+ scmHandlerUis.add((ScmHandlerUi) element.createExecutableExtension(ScmHandlerUi.ATTR_CLASS));
+ } catch(CoreException ex) {
+ MavenLogger.log(ex);
+ }
+ }
+ }
+ }
+ }
+ return scmHandlerUis;
+ }
+
+}

Back to the top