package org.eclipse.dltk.tcl.internal.structure; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.PriorityDLTKExtensionManager; import org.eclipse.dltk.core.SimpleClassNewInstanceDLTKExtensionManager; import org.eclipse.dltk.core.SimpleDLTKExtensionManager.ElementInfo; import org.eclipse.dltk.tcl.core.TclPlugin; import org.eclipse.dltk.tcl.structure.ITclModelBuilder; import org.eclipse.dltk.tcl.structure.ITclModelBuilderDetector; public class ModelBuilderManager { private static final String ID_ATTR = "id"; private static final String EXTENSION_PROCESSOR = TclPlugin.PLUGIN_ID + ".tclModelBuilder"; private static final String EXTENSION_DETECTOR = TclPlugin.PLUGIN_ID + ".tclModelBuilderDetector"; private static final String CLASS_ATTR = "class"; private static class SimpleExtensionManager extends PriorityDLTKExtensionManager { public SimpleExtensionManager(String extensionPoint) { super(extensionPoint, ID_ATTR); } public Object getInitObject(ElementInfo ext) { try { if (ext != null) { if (ext.object == null) { ext.object = createObject(ext.config); } return ext.object; } } catch (CoreException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } return null; } protected Object createObject(IConfigurationElement cfg) throws CoreException { return cfg.createExecutableExtension(CLASS_ATTR); } public Object get(String name) { return getInitObject(getElementInfo(name)); } } private SimpleExtensionManager commands = new SimpleExtensionManager( EXTENSION_PROCESSOR); private SimpleClassNewInstanceDLTKExtensionManager detectors = new SimpleClassNewInstanceDLTKExtensionManager( EXTENSION_DETECTOR); public ITclModelBuilder getModelBuilder(String name) { return (ITclModelBuilder) commands.get(name); } public ITclModelBuilderDetector[] getDetectors() { ElementInfo[] objects = detectors.getElementInfos(); ITclModelBuilderDetector[] results = new ITclModelBuilderDetector[objects.length]; for (int i = 0; i < objects.length; i++) { try { results[i] = (ITclModelBuilderDetector) detectors .createObject(objects[i]); } catch (CoreException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } } return results; } private static ModelBuilderManager sInstance = null; public static synchronized ModelBuilderManager getInstance() { if (sInstance == null) { sInstance = new ModelBuilderManager(); } return sInstance; } }