package org.smartly.commons.lang.compilers; import org.smartly.commons.util.StringUtils; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * */ public final class CompilerRegistry { //-- repos: key=extension, value=compiler --// private final Map<String, Class<? extends ICompiler>> _classes; private final Map<String, ICompiler> _objects; private CompilerRegistry() { _classes = Collections.synchronizedMap(new HashMap<String, Class<? extends ICompiler>>()); _objects = Collections.synchronizedMap(new HashMap<String, ICompiler>()); } public void registerClass(final String ext, final Class<? extends ICompiler> compilerClass) { synchronized (_classes) { _classes.put(this.removeDot(ext), compilerClass); } } public void registerInstance(final String ext, final ICompiler compilerInstance) { synchronized (_objects) { _objects.put(this.removeDot(ext), compilerInstance); } } public void removeAll(final String ext) { synchronized (_objects) { _objects.remove(this.removeDot(ext)); } synchronized (_classes) { _classes.remove(this.removeDot(ext)); } } public ICompiler getCompiler(final String ext) { synchronized (_objects) { final String key = removeDot(ext); if (_objects.containsKey(key)) { return _objects.get(key); } else { //-- creates compile instance --// synchronized (_classes) { final ICompiler instance = this.createCompiler(key); if (null != instance) { _objects.put(key, instance); } return instance; } } } } // ------------------------------------------------------------------------ // p r i v a t e // ------------------------------------------------------------------------ private String removeDot(final String ext) { return StringUtils.replace(ext, ".", ""); } private ICompiler createCompiler(final String key) { if (_classes.containsKey(key)) { try { return _classes.get(key).newInstance(); } catch (Throwable ignored) { } } return null; } // ------------------------------------------------------------------------ // S T A T I C // ------------------------------------------------------------------------ private static CompilerRegistry __instance; private static CompilerRegistry getInstance() { if (null == __instance) { __instance = new CompilerRegistry(); } return __instance; } public static void register(final String ext, final Class<? extends ICompiler> compilerClass) { getInstance().registerClass(ext, compilerClass); } public static void register(final String ext, final ICompiler compilerInstance) { getInstance().registerInstance(ext, compilerInstance); } public static void remove(final String ext) { getInstance().removeAll(ext); } public static ICompiler get(final String ext) { return getInstance().getCompiler(ext); } }