uidesigner/com.nokia.sdt.uimodel/src/com/nokia/sdt/component/ComponentSystem.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uidesigner/com.nokia.sdt.uimodel/src/com/nokia/sdt/component/ComponentSystem.java Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+/**
+ *
+ */
+package com.nokia.sdt.component;
+
+import com.nokia.sdt.uimodel.Messages;
+import com.nokia.sdt.uimodel.UIModelPlugin;
+import com.nokia.cpp.internal.api.utils.core.Check;
+import com.nokia.cpp.internal.api.utils.core.Logging;
+
+import org.eclipse.core.runtime.*;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * The interface for the component system.
+ *
+ * This maintains a collection of component providers. Each provider
+ * represents a specific implementation of components and
+ * can provide a unique set of IComponent instances.
+ *
+ * @see IComponent
+ *
+ *
+ */
+public class ComponentSystem {
+
+ /**
+ * Name of the component provider extension point
+ */
+ public static final String PROVIDER_EXTENSION = "componentProvider"; //$NON-NLS-1$
+
+ static private ComponentSystem instance;
+
+ /**
+ * Map of String -> IComponentProvider
+ */
+ private Map providers = new HashMap();
+
+ /**
+ * Returns the singleton instance of the component system
+ */
+ static public ComponentSystem getComponentSystem() {
+ if (instance == null) {
+ instance = new ComponentSystem();
+ }
+ return instance;
+ }
+
+ private ComponentSystem() {
+ }
+
+ /**
+ * Returns the requested component provider implementation, if loaded.
+ * @param id a string representing the provider
+ * @return provider or null if not yet loaded
+ * @throws CoreException
+ */
+ public synchronized IComponentProvider findProvider(String id) throws CoreException {
+ return (IComponentProvider) providers.get(id);
+ }
+
+ /**
+ * Returns the requested component provider implementation,
+ * loading its extension if necessary.
+ * @param id a string representing the provider
+ * @return provider or null if not found
+ * @throws CoreException
+ */
+ public synchronized IComponentProvider getProvider(String id) throws CoreException {
+ // check if already loaded this provider
+ IComponentProvider result = (IComponentProvider) providers.get(id);
+ if (result == null) {
+ result = loadExtensions(id);
+ providers.put(id, result);
+ }
+ return result;
+ }
+
+ /**
+ * Set the component provider
+ * <p>
+ * For testing to set a provider without requiring a running workbench.
+ * @param id a string representing the provider
+ * @param provider the provider instance (must not be null)
+ */
+ public synchronized void setProvider(String id, IComponentProvider provider) {
+ Check.checkArg(id);
+ Check.checkArg(provider);
+ providers.put(id, provider);
+ }
+
+ private IComponentProvider loadExtensions(String id) throws CoreException {
+ IComponentProvider result = null;
+
+ // Get implementors of the componentProvider extension point
+ IExtensionRegistry er = Platform.getExtensionRegistry();
+ if (er == null)
+ return null;
+
+ IExtensionPoint ep = er.getExtensionPoint(
+ UIModelPlugin.PLUGIN_ID, PROVIDER_EXTENSION);
+
+ IExtension matched = null;
+
+ // Iterate over all providers looking for the requested one
+ IExtension[] extensions = ep.getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ IExtension extension = extensions[i];
+ IConfigurationElement[] ces = extension.getConfigurationElements();
+ if (ces != null && ces.length >= 1) {
+ IConfigurationElement providerElement = ces[0];
+ String name = providerElement.getAttribute("name"); //$NON-NLS-1$
+ if (name != null && name.equals(id)) {
+ if (providerElement.getAttribute("class") != null) { //$NON-NLS-1$
+ if (result != null) {
+ Logging.log(UIModelPlugin.getDefault(),
+ Logging.newStatus(UIModelPlugin.getDefault(),
+ IStatus.ERROR,
+ MessageFormat.format(Messages.getString("ComponentSystem.1"),
+ new Object[] { id, extension.getUniqueIdentifier(), matched.getUniqueIdentifier() })
+
+ ));
+ } else {
+ result = (IComponentProvider) providerElement.createExecutableExtension("class"); //$NON-NLS-1$
+ matched = extension;
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+}