1 /* 2 * The Apache Software License, Version 1.1 3 * 4 * Copyright (c) 1999 The Apache Software Foundation. All rights 5 * reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 19 * 3. The end-user documentation included with the redistribution, if 20 * any, must include the following acknowlegement: 21 * "This product includes software developed by the 22 * Apache Software Foundation (http://www.apache.org/)." 23 * Alternately, this acknowlegement may appear in the software itself, 24 * if and wherever such third-party acknowlegements normally appear. 25 * 26 * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software 27 * Foundation" must not be used to endorse or promote products derived 28 * from this software without prior written permission. For written 29 * permission, please contact apache@apache.org. 30 * 31 * 5. Products derived from this software may not be called "Apache" 32 * nor may "Apache" appear in their names without prior written 33 * permission of the Apache Group. 34 * 35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 46 * SUCH DAMAGE. 47 * ==================================================================== 48 * 49 * This software consists of voluntary contributions made by many 50 * individuals on behalf of the Apache Software Foundation. For more 51 * information on the Apache Software Foundation, please see 52 * <http://www.apache.org/>. 53 * 54 * [Additional notices, if required by prior licensing conditions] 55 * 56 */ 57 58 59 package org.apache.tomcat.util; 60 61 import java.net.URL; 62 import java.io.File; 63 import java.net.MalformedURLException; 64 import java.io.IOException; 65 66 /** 67 * 68 * @author James Todd [gonzo@eng.sun.com] 69 */ 70 71 public class URLUtil { 72 public static URL resolve(String s) 73 throws MalformedURLException { 74 return resolve(s, null); 75 } 76 77 public static URL resolve(String s, URL url) 78 throws MalformedURLException { 79 URL resolve = null; 80 81 // construct a URL via the following heuristics: 82 // 83 // if arg contains ":/" then 84 // assume a valid uri 85 // else if url arg is specified 86 // construct uri 87 // else if an absolute path then 88 // construct file uri 89 // else 90 // construct file uri by prepending the 91 // working directory 92 93 if (s.indexOf("://") > -1 || 94 s.indexOf("file:") > -1 ) { 95 resolve = new URL(s); 96 } else if (url != null) { 97 resolve = new URL(url, s); 98 } else if (s.startsWith(File.separator) || 99 s.startsWith("/") || 100 (s.length() >= 2 && 101 Character.isLetter(s.charAt(0)) && 102 s.charAt(1) == ':')) { 103 String fName = s; 104 105 try { 106 fName = (String)(new File(s)).getCanonicalPath(); 107 } catch (NullPointerException npe) { 108 } catch (IOException npe) { 109 } 110 111 resolve = new URL("file", "", fName); 112 } else { 113 String path = System.getProperty("user.dir") + 114 File.separator + s; 115 116 resolve = new URL("file", "", path); 117 } 118 119 if (! resolve.getProtocol().equalsIgnoreCase( 120 org.apache.tomcat.core.Constants.Request.WAR) && 121 resolve.getFile().toLowerCase().endsWith( 122 "." + Constants.MIME.WAR)) { 123 URL u = new URL(Constants.MIME.WAR + ":" + 124 resolve.toString()); 125 126 resolve = u; 127 } 128 129 resolve = new URL(trim(resolve.toString(), ".", "..")); 130 resolve = new URL(trim(resolve.toString(), "./")); 131 132 return resolve; 133 } 134 135 private static String trim(String s, String t) { 136 return trim(s, t, null); 137 } 138 139 private static String trim(String s, String r, String t) { 140 while (s.endsWith(r) && 141 ((t == null) ? true : (! s.endsWith(t)))) { 142 int i = s.length() - r.length(); 143 144 s = s.substring(0, i); 145 } 146 147 return s; 148 } 149 }