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.scriptpath.impl;
  
  import java.util.ArrayList;
  import java.util.Collection;
  
  import minimatch.Minimatch;
  import minimatch.PathAdapter;
  import tern.ITernProject;
  import tern.scriptpath.ITernScriptPathContainer;
  
  /**
   * Abstract class for container tern script path.
   *
   */
  public abstract class ContainerTernScriptPath extends AbstractTernScriptPath implements ITernScriptPathContainer {
  
  	private final Collection<Minimatch> inclusionMinimatchs;
  	private final Collection<Minimatch> exclusionMinimatchs;
  	private String[] inclusionPatterns;
  	private String[] exclusionPatterns;
  
  	public ContainerTernScriptPath(ITernProject project, ScriptPathsType type, String[] inclusionPatterns,
  			String[] exclusionPatterns, String externalLabel) {
  		super(project, type, externalLabel);
  		this.inclusionPatterns = inclusionPatterns;
  		this.exclusionPatterns = exclusionPatterns;
  		this.inclusionMinimatchs = create(inclusionPatterns);
  		this.exclusionMinimatchs = create(exclusionPatterns);
  	}
  
  	private Collection<Minimatch> create(String[] patterns) {
  		if (patterns == null || patterns.length < 1) {
  			return null;
  		}
  		Collection<Minimatch> minimatchs = new ArrayList<Minimatch>();
  		for (int i = 0; i < patterns.length; i++) {
  			minimatchs.add(new Minimatch(patterns[i]));
  		}
  		return minimatchs;
  	}
  
  	public <T> boolean isInScope(T filename, PathAdapter<T> adapter) {
  		if (filename == null) {
  			return false;
  		}
  		if (inclusionMinimatchs == null && exclusionMinimatchs == null) {
  			return true;
  		}
  		if (inclusionMinimatchs != null) {
  			boolean include = false;
  			for (Minimatch minimatch : inclusionMinimatchs) {
  				if (minimatch.match(filename, adapter)) {
  					include = true;
  					break;
  				}
  			}
  			if (!include) {
  				return false;
  			}
  		}
  		if (exclusionMinimatchs != null) {
  			for (Minimatch minimatch : exclusionMinimatchs) {
  				if (minimatch.match(filename, adapter)) {
  					return false;
  				}
  			}
  		}
  		return true;
  	}
  
  	@Override
  	public String[] getInclusionPatterns() {
  		return inclusionPatterns;
  	}
  
  	public boolean hasInclusionPatterns() {
  		return getInclusionPatterns() != null && getInclusionPatterns().length > 0;
  	}
  
  	@Override
  	public String[] getExclusionPatterns() {
  		return exclusionPatterns;
  	}
  
  	public boolean hasExclusionPatterns() {
  		return getExclusionPatterns() != null && getExclusionPatterns().length > 0;
  	}
  
  	@Override
  	public String toString() {
  		return new StringBuilder("[").append(getType()).append("]").append(", path(\"").append(getPath()).append("\")")
  				.append(" including(").append(toString(getInclusionPatterns())).append(")").append(", excluding(")
  				.append(toString(getExclusionPatterns())).append(")").toString();
  	}
  
  	private String toString(String[] patterns) {
  		if (patterns == null) {
  			return null;
  		}
  		StringBuilder s = new StringBuilder();
  		for (int i = 0; i < patterns.length; i++) {
  			if (i > 0) {
  				s.append(",");
  			}
  			s.append(patterns[i]);
  		}
  		return s.toString();
  	}
  }
  