package org.bndtools.build.api; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import bndtools.Plugin; public final class BuildErrorDetailsHandlers { private static ILogger logger = Logger.getLogger(BuildErrorDetailsHandlers.class); public static final BuildErrorDetailsHandlers INSTANCE = new BuildErrorDetailsHandlers(); private final ConcurrentMap<String,BuildErrorDetailsHandler> cache = new ConcurrentHashMap<String,BuildErrorDetailsHandler>(); private BuildErrorDetailsHandlers() {} public BuildErrorDetailsHandler findHandler(String type) { if (type == null) return DefaultBuildErrorDetailsHandler.INSTANCE; BuildErrorDetailsHandler handler = cache.get(type); if (handler != null) return handler; handler = DefaultBuildErrorDetailsHandler.INSTANCE; IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(Plugin.PLUGIN_ID, "buildErrorDetailsHandlers"); if (elements != null) { for (IConfigurationElement element : elements) { if (type.equals(element.getAttribute("typeMatch"))) { try { handler = (BuildErrorDetailsHandler) element.createExecutableExtension("class"); break; } catch (Exception e) { logger.logError("Error instantiating build error handler for type " + type, e); } } } } BuildErrorDetailsHandler mapped = cache.putIfAbsent(type, handler); if (mapped != null) return mapped; return handler; } }