// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.debug.core.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
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.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.RegistryFactory;
/**
* Provides a collection of source wrappers. They are predefined and immutable.
*/
public interface IPredefinedSourceWrapProvider {
Collection<Entry> getWrappers();
/**
* Describes source wrapper.
*/
abstract class Entry {
private final String id;
private final SourceWrapSupport.Wrapper wrapper;
public Entry(String id, SourceWrapSupport.Wrapper wrapper) {
this.id = id;
this.wrapper = wrapper;
}
/**
* @return a unique id of the source wrap entry (fully qualified name is recommended)
*/
public String getId() {
return id;
}
/**
* @return an instance of source wrapper
*/
public SourceWrapSupport.Wrapper getWrapper() {
return wrapper;
}
/**
* @return a human-readable wrapper description that can be used in UI
*/
public abstract String getHumanDescription();
}
/**
* Provides a standard mean of accessing instance of this interface. It uses
* Eclipse/OSGI extension registry.
*/
class Access {
public static final String EXTENSION_POINT_ID =
"org.chromium.debug.core.model_IPredefinedSourceWrapProvider";
public static final String ELEMENT_NAME = "wrap-provider";
public static final String CLASS_PROPERTY = "class";
/**
* @return all entries from all providers in for of id-to-entry map
*/
public static Map<String, Entry> getEntries() {
return ENTRY_MAP;
}
private static final Map<String, Entry> ENTRY_MAP;
static {
ENTRY_MAP = new HashMap<String, Entry>();
for (IPredefinedSourceWrapProvider provider : getProviders()) {
for (IPredefinedSourceWrapProvider.Entry entry : provider.getWrappers()) {
ENTRY_MAP.put(entry.getId(), entry);
}
}
}
/**
* Provides a standard mean of getting an instances of interface. It uses
* Eclipse/OSGI extension registry.
*/
private static Collection<IPredefinedSourceWrapProvider> getProviders() {
List<IPredefinedSourceWrapProvider> result = new ArrayList<IPredefinedSourceWrapProvider>();
IExtensionPoint extensionPoint = RegistryFactory.getRegistry().getExtensionPoint(
EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
for (IExtension extension : extensions) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
if (!ELEMENT_NAME.equals(element.getName())) {
continue;
}
Object obj;
try {
obj = element.createExecutableExtension(CLASS_PROPERTY);
} catch (CoreException e) {
throw new RuntimeException(e);
}
IPredefinedSourceWrapProvider provider = (IPredefinedSourceWrapProvider) obj;
result.add(provider);
}
}
return result;
}
}
}