tikhomirov@229: /* tikhomirov@229: * Copyright (c) 2011 TMate Software Ltd tikhomirov@229: * tikhomirov@229: * This program is free software; you can redistribute it and/or modify tikhomirov@229: * it under the terms of the GNU General Public License as published by tikhomirov@229: * the Free Software Foundation; version 2 of the License. tikhomirov@229: * tikhomirov@229: * This program is distributed in the hope that it will be useful, tikhomirov@229: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@229: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@229: * GNU General Public License for more details. tikhomirov@229: * tikhomirov@229: * For information on how to redistribute this software under tikhomirov@229: * the terms of a license other than GNU General Public License tikhomirov@229: * contact TMate Software at support@hg4j.com tikhomirov@229: */ tikhomirov@229: package org.tmatesoft.hg.internal; tikhomirov@229: tikhomirov@229: import java.util.ArrayList; tikhomirov@229: tikhomirov@229: import org.tmatesoft.hg.util.Path; tikhomirov@229: tikhomirov@229: /** tikhomirov@229: * @author Artem Tikhomirov tikhomirov@229: * @author TMate Software Ltd. tikhomirov@229: */ tikhomirov@229: public class PathScope implements Path.Matcher { tikhomirov@229: private final Path[] files; tikhomirov@229: private final Path[] dirs; tikhomirov@229: private final boolean recursiveDirs; tikhomirov@229: tikhomirov@229: public PathScope(boolean recursiveDirs, Path... paths) { tikhomirov@229: if (paths == null) { tikhomirov@229: throw new IllegalArgumentException(); tikhomirov@229: } tikhomirov@229: this.recursiveDirs = recursiveDirs; tikhomirov@229: ArrayList f = new ArrayList(5); tikhomirov@229: ArrayList d = new ArrayList(5); tikhomirov@229: for (Path p : paths) { tikhomirov@229: if (p.isDirectory()) { tikhomirov@229: d.add(p); tikhomirov@229: } else { tikhomirov@229: f.add(p); tikhomirov@229: } tikhomirov@229: } tikhomirov@229: files = f.toArray(new Path[f.size()]); tikhomirov@229: dirs = d.toArray(new Path[d.size()]); tikhomirov@229: } tikhomirov@229: tikhomirov@229: public boolean accept(Path path) { tikhomirov@229: if (path.isDirectory()) { tikhomirov@229: // either equals to or parent of a directory we know about. tikhomirov@229: // If recursiveDirs, accept also if nested to one of our directories. tikhomirov@229: // If one of configured files is nested under the path, accept. tikhomirov@229: for (Path d : dirs) { tikhomirov@229: switch(d.compareWith(path)) { tikhomirov@229: case Same : return true; tikhomirov@229: case Nested : return true; tikhomirov@229: case Parent : return recursiveDirs; tikhomirov@229: } tikhomirov@229: } tikhomirov@229: for (Path f : files) { tikhomirov@229: if (f.compareWith(path) == Path.CompareResult.Nested) { tikhomirov@229: return true; tikhomirov@229: } tikhomirov@229: } tikhomirov@229: } else { tikhomirov@229: for (Path d : dirs) { tikhomirov@229: if (d.compareWith(path) == Path.CompareResult.Parent) { tikhomirov@229: return true; tikhomirov@229: } tikhomirov@229: } tikhomirov@229: for (Path f : files) { tikhomirov@229: if (f.equals(path)) { tikhomirov@229: return true; tikhomirov@229: } tikhomirov@229: } tikhomirov@229: // either lives in a directory in out scope tikhomirov@229: // or there's a file that matches the path tikhomirov@229: } tikhomirov@229: // TODO Auto-generated method stub tikhomirov@229: return false; tikhomirov@229: } tikhomirov@229: }