// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.shared.util; import com.google.common.base.Preconditions; /** * Utilities for working with workspace paths. */ public class PathUtils { /** * The root path of workspaces. */ public static final String WORKSPACE_ROOT = "/"; /** * A visitor used to visit a path. */ public static interface PathVisitor { /** * Visits a path. * * @param path the path string * @param name the name of the directory or file at this path */ public abstract void visit(String path, String name); } /** * Normalizes a path by removing trailing slash, unless the path is the root path. * * @param path the path to the directory or file */ public static String normalizePath(String path) { if (WORKSPACE_ROOT.equals(path)) { return path; } if (path.isEmpty()) { return WORKSPACE_ROOT; } int maybeSlash = path.length() - 1; return path.charAt(maybeSlash) == '/' ? path.substring(0, maybeSlash) : path; } /** * Walks every directory a path from the rootPath to the target path. * * @param path the path to walk * @param rootPath the root to start walking, inclusive * @param visitor the visitor that will be visited along the way */ public static void walk(String path, String rootPath, PathVisitor visitor) { // Ensure that the path ends with a separator. if (!path.endsWith("/")) { path += "/"; } rootPath = normalizePath(rootPath); Preconditions.checkArgument(path.startsWith(rootPath), "path \"" + path + "\" must be a descendent of rootPath \"" + rootPath + "\""); int nextSlash = rootPath.length(); while (nextSlash != -1) { String curPath = path.substring(0, nextSlash); String name = ""; if (nextSlash > 0) { int prevSlash = path.lastIndexOf("/", nextSlash - 1); name = curPath.substring(prevSlash + 1); } // Visit the path. visitor.visit(curPath, name); // Iterate to the next child directory. nextSlash = path.indexOf("/", nextSlash + 1); } } }