content: /**
   *  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.Collections;
  import java.util.List;
  
  import org.w3c.dom.Attr;
  import org.w3c.dom.Element;
  import org.w3c.dom.NamedNodeMap;
  
  /**
   * DOM directive provider.
   * 
   */
  public class DOMDirectiveProvider implements IDirectiveProvider {
  
  	private static final DOMDirectiveProvider INSTANCE = new DOMDirectiveProvider();
  
  	public static DOMDirectiveProvider getInstance() {
  		return INSTANCE;
  	}
  
  	@Override
  	public Directive getAngularDirective(Object project, Attr attr) {
  		if (attr == null) {
  			return null;
  		}
  		return AngularModulesManager.getInstance().getDirective(project,
  				attr.getOwnerElement().getNodeName(), attr.getName(),
  				Restriction.A);
  	}
  
  	@Override
  	public Directive getAngularDirective(Object project, Element element) {
  		if (element == null) {
  			return null;
  		}
  		return AngularModulesManager.getInstance().getDirective(project, null,
  				element.getTagName(), Restriction.E);
  	}
  
  	@Override
  	public DirectiveParameter getAngularDirectiveParameter(Object project,
  			Attr attr) {
  		Element element = attr.getOwnerElement();
  		// check if owner element is a directive?
  		Directive elementDirective = getAngularDirective(project, element);
  		if (elementDirective != null) {
  			return elementDirective.getParameter(attr.getName());
  		} else {
  			// retrieve directives from other attributes.
  			List<Directive> directives = getAngularDirectives(project,
  					attr.getOwnerElement(), attr);
  			DirectiveParameter parameter = null;
  			for (Directive directive : directives) {
  				parameter = directive.getParameter(attr.getName());
  				if (parameter != null) {
  					return parameter;
  				}
  			}
  		}
  		return null;
  	}
  
  	public List<Directive> getAngularDirectives(Object project,
  			Element element, Attr selectedAttr) {
  		if (element == null) {
  			return Collections.emptyList();
  		}
  		List<Directive> names = null;
  		NamedNodeMap attributes = element.getAttributes();
  		int length = attributes.getLength();
  		Attr attr = null;
  		for (int i = 0; i < length; i++) {
  			attr = (Attr) attributes.item(i);
  			if (selectedAttr == null || !selectedAttr.equals(attr)) {
  				Directive directive = getAngularDirective(project, attr);
  				if (directive != null) {
  					if (names == null) {
  						names = new ArrayList<Directive>();
  					}
  					names.add(directive);
  				}
  			}
  		}
  		return (List<Directive>) (names != null ? names : Collections
  				.emptyList());
  	}
  
  }
  