tikhomirov@64: /* tikhomirov@64: * Copyright (c) 2011 TMate Software Ltd tikhomirov@64: * tikhomirov@64: * This program is free software; you can redistribute it and/or modify tikhomirov@64: * it under the terms of the GNU General Public License as published by tikhomirov@64: * the Free Software Foundation; version 2 of the License. tikhomirov@64: * tikhomirov@64: * This program is distributed in the hope that it will be useful, tikhomirov@64: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@64: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@64: * GNU General Public License for more details. tikhomirov@64: * tikhomirov@64: * For information on how to redistribute this software under tikhomirov@64: * the terms of a license other than GNU General Public License tikhomirov@102: * contact TMate Software at support@hg4j.com tikhomirov@64: */ tikhomirov@133: package org.tmatesoft.hg.util; tikhomirov@64: tikhomirov@64: /** tikhomirov@64: * Identify repository files (not String nor io.File). Convenient for pattern matching. Memory-friendly. tikhomirov@64: * tikhomirov@64: * @author Artem Tikhomirov tikhomirov@64: * @author TMate Software Ltd. tikhomirov@64: */ tikhomirov@64: public final class Path implements CharSequence, Comparable/*Cloneable? - although clone for paths make no sense*/{ tikhomirov@64: // private String[] segments; tikhomirov@64: // private int flags; // dir, unparsed tikhomirov@64: private String path; tikhomirov@64: tikhomirov@64: /*package-local*/Path(String p) { tikhomirov@64: path = p; tikhomirov@64: } tikhomirov@64: tikhomirov@148: /** tikhomirov@148: * Check if this is directory's path. tikhomirov@148: * Note, this method doesn't perform any file system operation. tikhomirov@148: * tikhomirov@148: * @return true when this path points to a directory tikhomirov@148: */ tikhomirov@148: public boolean isDirectory() { tikhomirov@148: // XXX simple logic for now. Later we may decide to have an explicit factory method to create directory paths tikhomirov@148: return path.charAt(path.length() - 1) == '/'; tikhomirov@148: } tikhomirov@148: tikhomirov@64: public int length() { tikhomirov@64: return path.length(); tikhomirov@64: } tikhomirov@64: tikhomirov@64: public char charAt(int index) { tikhomirov@64: return path.charAt(index); tikhomirov@64: } tikhomirov@64: tikhomirov@64: public CharSequence subSequence(int start, int end) { tikhomirov@64: // new Path if start-end matches boundaries of any subpath tikhomirov@64: return path.substring(start, end); tikhomirov@64: } tikhomirov@64: tikhomirov@64: @Override tikhomirov@64: public String toString() { tikhomirov@64: return path; // CharSequence demands toString() impl tikhomirov@64: } tikhomirov@64: tikhomirov@64: public int compareTo(Path o) { tikhomirov@64: return path.compareTo(o.path); tikhomirov@64: } tikhomirov@64: tikhomirov@64: @Override tikhomirov@64: public boolean equals(Object obj) { tikhomirov@64: if (obj != null && getClass() == obj.getClass()) { tikhomirov@64: return this == obj || path.equals(((Path) obj).path); tikhomirov@64: } tikhomirov@64: return false; tikhomirov@64: } tikhomirov@64: @Override tikhomirov@64: public int hashCode() { tikhomirov@64: return path.hashCode(); tikhomirov@64: } tikhomirov@64: tikhomirov@64: public static Path create(String path) { tikhomirov@64: if (path == null) { tikhomirov@64: throw new IllegalArgumentException(); tikhomirov@64: } tikhomirov@77: if (path.indexOf('\\') != -1) { tikhomirov@77: throw new IllegalArgumentException(); tikhomirov@77: } tikhomirov@64: Path rv = new Path(path); tikhomirov@64: return rv; tikhomirov@64: } tikhomirov@133: tikhomirov@133: /** tikhomirov@133: * Path filter. tikhomirov@133: */ tikhomirov@64: public interface Matcher { tikhomirov@141: boolean accept(Path path); tikhomirov@141: } tikhomirov@141: tikhomirov@141: /** tikhomirov@141: * Factory for paths tikhomirov@141: */ tikhomirov@141: public interface Source { tikhomirov@141: Path path(String p); tikhomirov@141: } tikhomirov@141: tikhomirov@141: /** tikhomirov@141: * Straightforward {@link Source} implementation that creates new Path instance for each supplied string tikhomirov@141: */ tikhomirov@141: public static class SimpleSource implements Source { tikhomirov@141: private final PathRewrite normalizer; tikhomirov@141: tikhomirov@141: public SimpleSource(PathRewrite pathRewrite) { tikhomirov@141: if (pathRewrite == null) { tikhomirov@141: throw new IllegalArgumentException(); tikhomirov@141: } tikhomirov@141: normalizer = pathRewrite; tikhomirov@141: } tikhomirov@141: tikhomirov@141: public Path path(String p) { tikhomirov@141: return Path.create(normalizer.rewrite(p)); tikhomirov@141: } tikhomirov@64: } tikhomirov@64: }