/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.angular.modules; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; public class AngularModulesManager { private static final AngularModulesManager INSTANCE = new AngularModulesManager(); public static AngularModulesManager getInstance() { return INSTANCE; } private final List<IAngularModulesRegistry> defaultRegistries; private final Map<Object, IAngularModulesRegistry> customRegistries; private AngularModulesManager() { this.defaultRegistries = new ArrayList<IAngularModulesRegistry>(); this.customRegistries = new HashMap<Object, IAngularModulesRegistry>(); defaultRegistries.add(new XMLAngularModulesRegistry()); } public void addRegistry(IAngularModulesRegistry registry) { defaultRegistries.add(registry); } public void addRegistry(Object project, IAngularModulesRegistry registry) { customRegistries.put(project, registry); } public void collectDirectives(Object project, String tagName, String directiveName, IDirectiveSyntax syntax, List<Directive> existingDirectives, Restriction restriction, IDirectiveCollector collector) { // collect directives of each modules. collectDefaultDirectives(tagName, directiveName, syntax, existingDirectives, restriction, collector); if (project != null) { IAngularModulesRegistry registry = customRegistries.get(project); if (registry != null) { registry.collectDirectives(tagName, directiveName, syntax, existingDirectives, restriction, collector); } } // collect directives parameters of directive to ignore if (existingDirectives != null) { for (Directive directive : existingDirectives) { collectDirectiveParameters(directive, directiveName, collector); } } } public void collectDirectiveParameters(Directive directive, String name, IDirectiveParameterCollector collector) { Collection<DirectiveParameter> parameters = directive.getParameters(); for (DirectiveParameter parameter : parameters) { if (parameter.getName().startsWith(name)) { collector.add(parameter); } } } private void collectDefaultDirectives(String tagName, String directiveName, IDirectiveSyntax syntax, List<Directive> existingDirectives, Restriction restriction, IDirectiveCollector collector) { for (IAngularModulesRegistry registry : defaultRegistries) { registry.collectDirectives(tagName, directiveName, syntax, existingDirectives, restriction, collector); } } public Directive getDirective(String tagName, String name, Restriction restriction) { Directive directive = null; for (IAngularModulesRegistry registry : defaultRegistries) { directive = registry.getDirective(tagName, name, restriction); if (directive != null) { return directive; } } return null; } public Module getModule(String name) { Module module = null; for (IAngularModulesRegistry registry : defaultRegistries) { module = registry.getModule(name); if (module != null) { return module; } } return null; } public Directive getDirective(Object project, String tagName, String name, Restriction restriction) { Directive directive = getDirective(tagName, name, restriction); if (directive != null) { return directive; } if (project != null) { IAngularModulesRegistry registry = customRegistries.get(project); if (registry != null) { return registry.getDirective(tagName, name, restriction); } } return null; } }