/******************************************************************************* * Copyright (c) 2001, 2005 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.provisional.registry; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.core.runtime.content.IContentTypeManager; import org.eclipse.wst.sse.ui.internal.Logger; public class AdapterFactoryRegistryImpl implements AdapterFactoryRegistry, AdapterFactoryRegistryExtension { protected final static String ATT_CLASS = "class"; //$NON-NLS-1$ private static AdapterFactoryRegistry instance = null; static synchronized public AdapterFactoryRegistry getInstance() { if (instance == null) { instance = new AdapterFactoryRegistryImpl(); } return instance; } // this map exists so there is only one provider // instance not duplicate providers for different content types private HashMap adapterProviders = null; private boolean DEBUG = false; /** * This HashMap contains: [contentTypeId -> element2providerMap] | V * [configurationElement -> AdapterFactoryProvider] * */ private HashMap hashMap = null; // providers with no content type associated // just added through the add(...) method private HashSet unassociatedProviders = null; private AdapterFactoryRegistryImpl() { super(); this.hashMap = new HashMap(); this.unassociatedProviders = new HashSet(); this.adapterProviders = new HashMap(); // doesn't instantiate classes, just stores configuration elements AdapterFactoryRegistryReader.readRegistry(hashMap); } void add(AdapterFactoryProvider adapterFactoryProvider) { this.unassociatedProviders.add(adapterFactoryProvider); } public Iterator getAdapterFactories() { if (DEBUG) { System.out.println("===================================================================================="); //$NON-NLS-1$ System.out.println("GETTING ALL ADAPTER FACTORIES"); //$NON-NLS-1$ } List results = new ArrayList(); // add providers that have no content type specification results.addAll(this.unassociatedProviders); Iterator it = this.hashMap.keySet().iterator(); String contentTypeId = null; while (it.hasNext()) { contentTypeId = (String) it.next(); if (DEBUG) System.out.println(" + for: " + contentTypeId); //$NON-NLS-1$ results.addAll(getAdapterFactoriesAsList(contentTypeId)); } if (DEBUG) { System.out.println("===================================================================================="); //$NON-NLS-1$ } return results.iterator(); } public Iterator getAdapterFactories(String contentTypeID) { if (DEBUG) { System.out.println("===================================================================================="); //$NON-NLS-1$ System.out.println("GETTING ADAPTER FACTORIES for: " + contentTypeID); //$NON-NLS-1$ } List results = new ArrayList(); // add providers that have no content type specification results.addAll(unassociatedProviders); // add unknown content type providers (for backwards compatability) results.addAll(getAdapterFactoriesAsList(AdapterFactoryRegistryReader.UNKNOWN_CONTENT_TYPE)); // add providers for specific content type results.addAll(getAdapterFactoriesAsList(Platform.getContentTypeManager().getContentType(contentTypeID))); if (DEBUG) { System.out.println("===================================================================================="); //$NON-NLS-1$ } return results.iterator(); } public List getAdapterFactoriesAsList(IContentType contentType) { IContentType type = contentType; List results = new ArrayList(); while (type != null && !type.getId().equals(IContentTypeManager.CT_TEXT)) { results.addAll(getAdapterFactoriesAsList(type.getId())); type = type.getBaseType(); } return results; } /** * Using this new API, only AdapterFactoryProviders for a certain content * type are instantiated. This will allow for the minimum number of * plugins to be loaded rather than all that implement the adapter factory * extension point. * * @param contentTypeID * @return */ public List getAdapterFactoriesAsList(String contentTypeID) { List results = new ArrayList(); // get element2Provider map for specified content type Object o = hashMap.get(contentTypeID); if (o != null) { // instantiate if necessary from // element2adapterFactoryProvider // map Map element2Provider = (Map) o; Iterator it = element2Provider.keySet().iterator(); IConfigurationElement element = null; String classname = null; Object existing = null; AdapterFactoryProvider p = null; while (it.hasNext()) { element = (IConfigurationElement) it.next(); o = element2Provider.get(element); if (o != null) { // this provider has already been created if (DEBUG) System.out.println("already created: " + element.getAttribute(ATT_CLASS)); //$NON-NLS-1$ results.add(o); } else { // need to create the provider try { classname = element.getAttribute(ATT_CLASS); if (DEBUG) System.out.println("about to create: " + classname); //$NON-NLS-1$ // check if we created one already existing = this.adapterProviders.get(classname); if (existing == null) { // this is the only place // AdapterFactoryProviders // are created p = (AdapterFactoryProvider) element.createExecutableExtension(ATT_CLASS); // $NON-NLS-1$ this.adapterProviders.put(classname, p); } else { p = (AdapterFactoryProvider) existing; } // add to element2Provider for this contentType element2Provider.put(element, p); // add to results to return for this method results.add(p); } catch (CoreException e) { // if the provider throws any exception, just log // and // continue Logger.logException(e); } } } } return results; } }