content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR and Genuitec LLC.
   *  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
   *  Piotr Tomiak <piotr@genuitec.com> - refactoring of file management API
   */
  package tern.scriptpath.impl.dom;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  
  import tern.ITernFile;
  import tern.ITernProject;
  import tern.internal.resources.InternalTernResourcesManager;
  import tern.scriptpath.ITernScriptResource;
  import tern.scriptpath.impl.AbstractTernFileScriptPath;
  import tern.utils.StringUtils;
  
  /**
   * HTML/JSP page script path. This script path implementation gives the
   * capability to select an HTML/JSP file with "Add File" in the Tern
   * "Script Path" property page project and retrieve list of JS files declared in
   * the DOM "script" elements.
   * 
   */
  public class DOMElementsScriptPath extends AbstractTernFileScriptPath {
  
  	private static final String SCRIPT_ELT = "script"; //$NON-NLS-1$
  	private static final String HTTP_ATTR = "http"; //$NON-NLS-1$
  	private static final String SRC_ATTR = "src"; //$NON-NLS-1$
  	
  	public DOMElementsScriptPath(ITernProject project, ITernFile file, String external) {
  		super(project, file, external);
  	}
  
  	@Override
  	public List<ITernScriptResource> getScriptResources() {
  		List<ITernScriptResource> resources = new ArrayList<ITernScriptResource>();
  		Document document = getDocument();
  		if (document != null) {
  			// loop for each script elements (how to improve that?)
  			int localScriptNb = 0;
  			Element scriptElt = null;
  			String src = null;
  			NodeList scripts = getScriptNodes(document);
  			for (int i = 0; i < scripts.getLength(); i++) {
  				scriptElt = (Element) scripts.item(i);
  				src = scriptElt.getAttribute(SRC_ATTR);
  				ITernScriptResource resource;
  				if (StringUtils.isEmpty(src)) {
  					// JS script declared in the HTML document.
  					// updateFiles(domFile, scriptElt, localScriptNb++, doc,
  					// names);
  					resource = createDOMContentScriptResource(localScriptNb++);
  				} else {
  					if (src.startsWith(HTTP_ATTR)) {
  						// JS script declared in http://
  						resource = new DOMAbsoluteURLScriptResource(src);
  					} else {
  						// JS script declared in an external file.
  						resource = createDOMRelativeURLScriptResource(src);
  					}
  				}
  				if (resource != null) {
  					resources.add(resource);
  				}
  			}
  		}
  		return resources;
  	}
  	
  	protected NodeList getScriptNodes(Document document) {
  		return document.getElementsByTagName(SCRIPT_ELT);
  	}
  
  	protected ITernScriptResource createDOMAbsoluteURLScriptResource(String src) {
  		return new DOMAbsoluteURLScriptResource(src);
  	}
  	
  	protected ITernScriptResource createDOMRelativeURLScriptResource(String relativePath) {
  		return new DOMRelativeURLScriptResource(getFile(), relativePath);
  	}
  	
  	protected ITernScriptResource createDOMContentScriptResource(int localScriptNb) {
  		return new DOMContentScriptResource(getFile(), localScriptNb);
  	}
  
  	protected Document getDocument() {
  		return InternalTernResourcesManager.getInstance().getDocument(getFile());
  	}
  
  }
  