Java tutorial
// 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.gitiles; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.io.Files; import java.util.StringTokenizer; /** Static utilities for dealing with pathnames. */ class PathUtil { private static final CharMatcher MATCHER = CharMatcher.is('/'); static final Splitter SPLITTER = Splitter.on(MATCHER); static String simplifyPathUpToRoot(String path, String root) { if (path.startsWith("/")) { return null; } root = Strings.nullToEmpty(root); // simplifyPath() normalizes "a/../../" to "a", so manually check whether // the path leads above the root. int depth = new StringTokenizer(root, "/").countTokens(); for (String part : SPLITTER.split(path)) { if (part.equals("..")) { depth--; if (depth < 0) { return null; } } else if (!part.isEmpty() && !part.equals(".")) { depth++; } } String result = Files.simplifyPath(!root.isEmpty() ? root + "/" + path : path); return !result.equals(".") ? result : ""; } static String basename(String path) { path = MATCHER.trimTrailingFrom(path); int slash = path.lastIndexOf('/'); if (slash < 0) { return path; } return path.substring(slash + 1); } private PathUtil() { } }