View Javadoc
1   package org.codehaus.classworlds.uberjar.protocol.jar;
2   
3   /*
4    $Id: Handler.java 115 2005-07-03 15:23:59Z jvanzyl $
5   
6    Copyright 2002 (C) The Werken Company. All Rights Reserved.
7   
8    Redistribution and use of this software and associated documentation
9    ("Software"), with or without modification, are permitted provided
10   that the following conditions are met:
11  
12   1. Redistributions of source code must retain copyright
13      statements and notices. Redistributions must also contain a
14      copy of this document.
15  
16   2. Redistributions in binary form must reproduce the
17      above copyright notice, this list of conditions and the
18      following disclaimer in the documentation and/or other
19      materials provided with the distribution.
20  
21   3. The name "classworlds" must not be used to endorse or promote
22      products derived from this Software without prior written
23      permission of The Werken Company. For written permission,
24      please contact bob@werken.com.
25  
26   4. Products derived from this Software may not be called "classworlds"
27      nor may "classworlds" appear in their names without prior written
28      permission of The Werken Company. "classworlds" is a registered
29      trademark of The Werken Company.
30  
31   5. Due credit should be given to The Werken Company.
32      (http://classworlds.werken.com/).
33  
34   THIS SOFTWARE IS PROVIDED BY THE WERKEN COMPANY AND CONTRIBUTORS
35   ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
36   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
37   FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
38   THE WERKEN COMPANY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
39   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
40   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
41   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
43   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
44   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
45   OF THE POSSIBILITY OF SUCH DAMAGE.
46  
47   */
48  
49  import java.io.IOException;
50  import java.net.URL;
51  import java.net.URLConnection;
52  import java.net.URLStreamHandler;
53  
54  /**
55   * This is copied from Classwords 1.1 org.codehaus.classworlds.uberjar.protocol.jar.Handler
56   * so that an additional dependency does not need to be added to plugins. The formatting is left as is to reduce
57   * the diff.
58   */
59  public class NonLockingJarHandler
60          extends URLStreamHandler {
61      // ----------------------------------------------------------------------
62      //     Class members
63      // ----------------------------------------------------------------------
64  
65      /**
66       * Singleton instance.
67       */
68      private static final NonLockingJarHandler INSTANCE = new NonLockingJarHandler();
69  
70      // ----------------------------------------------------------------------
71      //     Class methods
72      // ----------------------------------------------------------------------
73  
74      /**
75       * Retrieve the singleton instance.
76       *
77       * @return The singleton instance.
78       */
79      public static NonLockingJarHandler getInstance() {
80          return INSTANCE;
81      }
82  
83      // ----------------------------------------------------------------------
84      //     Constructors
85      // ----------------------------------------------------------------------
86  
87  
88      /**
89       * Construct.
90       */
91      public NonLockingJarHandler() {
92          // intentionally left blank
93      }
94  
95      // ----------------------------------------------------------------------
96      //     Instance methods
97      // ----------------------------------------------------------------------
98  
99      /**
100      * @see java.net.URLStreamHandler
101      */
102     public URLConnection openConnection(URL url)
103             throws IOException {
104         return new NonLockingJarUrlConnection(url);
105     }
106 
107     /**
108      * @see java.net.URLStreamHandler
109      */
110     public void parseURL(URL url,
111                          String spec,
112                          int start,
113                          int limit) {
114         String specPath = spec.substring(start,
115                 limit);
116 
117         String urlPath = null;
118 
119         if (specPath.charAt(0) == '/') {
120             urlPath = specPath;
121         } else if (specPath.charAt(0) == '!') {
122             String relPath = url.getFile();
123 
124             int bangLoc = relPath.lastIndexOf("!");
125 
126             if (bangLoc < 0) {
127                 urlPath = relPath + specPath;
128             } else {
129                 urlPath = relPath.substring(0,
130                         bangLoc) + specPath;
131             }
132         } else {
133             String relPath = url.getFile();
134 
135             if (relPath != null) {
136                 int lastSlashLoc = relPath.lastIndexOf("/");
137 
138                 if (lastSlashLoc < 0) {
139                     urlPath = "/" + specPath;
140                 } else {
141                     urlPath = relPath.substring(0,
142                             lastSlashLoc + 1) + specPath;
143                 }
144             } else {
145                 urlPath = specPath;
146             }
147         }
148 
149         setURL(url,
150                 "jar",
151                 "",
152                 0,
153                 null,
154                 null,
155                 urlPath,
156                 null,
157                 null);
158     }
159 }