/**
* 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.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import tern.angular.AngularType;
import tern.server.protocol.outline.IJSNode;
/**
* Angular module.
*
*/
public class Module extends AngularElement implements IModule {
private final DirectivesByTagName allDirectives;
private final Map<String, DirectivesByTagName> directivesByTagName;
public Module(String name) {
this(name, null, null, null, null);
}
public Module(String name, Long start, Long end, String file, IJSNode parent) {
super(name, AngularType.module, start, end, file, parent);
this.directivesByTagName = new HashMap<String, DirectivesByTagName>();
this.allDirectives = new DirectivesByTagName();
}
void addDirective(Directive directive) {
Collection<String> tagNames = directive.getTagNames();
if (tagNames.size() > 0) {
for (String tagName : tagNames) {
addDirective(tagName, directive);
}
} else {
addDirective(DirectiveHelper.ANY_TAG, directive);
}
allDirectives.addDirective(directive);
}
private void addDirective(String tagName, Directive directive) {
DirectivesByTagName directives = getDirectivesByTagName(tagName, true);
directives.addDirective(directive);
}
private DirectivesByTagName getDirectivesByTagName(String tagName, boolean createIfNotExists) {
if (tagName == null) {
return allDirectives;
}
DirectivesByTagName result = directivesByTagName.get(tagName);
if (result == null && createIfNotExists) {
result = new DirectivesByTagName();
directivesByTagName.put(tagName, result);
}
return result;
}
public Directive getDirective(String tagName, String name, Restriction restriction) {
DirectivesByTagName result = getDirectivesByTagName(tagName, false);
Directive directive = null;
if (result != null) {
directive = result.getDirective(name, restriction);
}
if (directive == null) {
return getDirectivesByTagName(DirectiveHelper.ANY_TAG, false).getDirective(name, restriction);
}
return directive;
}
public void collectDirectives(String tagName, String directiveName, IDirectiveSyntax syntax,
List<Directive> existingDirectives, Restriction restriction, IDirectiveCollector collector) {
// collect directives from tag names.
DirectivesByTagName container = getDirectivesByTagName(tagName, false);
collectDirectives(directiveName, syntax, existingDirectives, restriction, collector, container);
if (!DirectiveHelper.ANY_TAG.equals(tagName)) {
// collect directives from 'any' tag names.
container = getDirectivesByTagName(DirectiveHelper.ANY_TAG, false);
collectDirectives(directiveName, syntax, existingDirectives, restriction, collector, container);
}
}
private void collectDirectives(String directiveName, IDirectiveSyntax syntax, List<Directive> ignoreDirectives,
Restriction restriction, IDirectiveCollector collector, DirectivesByTagName container) {
if (container != null) {
container.collectDirectives(directiveName, syntax, ignoreDirectives, restriction, collector);
}
}
protected static boolean isMatch(List<Directive> ignoreDirectives, Restriction restriction, Directive directive) {
if (directive == null) {
return false;
}
if (isIgnore(directive, ignoreDirectives)) {
return false;
}
return directive.isMatch(restriction);
}
private static boolean isIgnore(Directive directive, List<Directive> ignoreDirectives) {
if (ignoreDirectives == null) {
return false;
}
return ignoreDirectives.contains(directive);
}
@Override
public IModule getModule() {
return this;
}
}