Network Java Tutorial

// 
// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// 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.
// 
/**
 * URI Holder. This class assists with the decoding and encoding or HTTP URI's.
 * It differs from the java.net.URL class as it does not provide communications
 * ability, but it does assist with query string formatting.
 * 


 * UTF-8 encoding is used by default for % encoded characters. This may be
 * overridden with the org.mortbay.util.URI.charset system property.
 * 
 * @see UrlEncoded
 * @author Greg Wilkins (gregw)
 */
public class Utils {
  public static final String SLASH = "/";
  /**
   * Add two URI path segments. Handles null and empty paths, path and query
   * params (eg ?a=b or ;JSESSIONID=xxx) and avoids duplicate '/'
   * 
   * @param p1
   *          URI path segment
   * @param p2
   *          URI path segment
   * @return Legally combined path segments.
   */
  public static String addPaths(String p1, String p2) {
    if (p1 == null || p1.length() == 0) {
      if (p1 != null && p2 == null)
        return p1;
      return p2;
    }
    if (p2 == null || p2.length() == 0)
      return p1;
    int split = p1.indexOf(';');
    if (split < 0)
      split = p1.indexOf('?');
    if (split == 0)
      return p2 + p1;
    if (split < 0)
      split = p1.length();
    StringBuffer buf = new StringBuffer(p1.length() + p2.length() + 2);
    buf.append(p1);
    if (buf.charAt(split - 1) == '/') {
      if (p2.startsWith(SLASH)) {
        buf.deleteCharAt(split - 1);
        buf.insert(split - 1, p2);
      } else
        buf.insert(split, p2);
    } else {
      if (p2.startsWith(SLASH))
        buf.insert(split, p2);
      else {
        buf.insert(split, '/');
        buf.insert(split + 1, p2);
      }
    }
    return buf.toString();
  }
}