1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.myfaces.config.util; 20 21 import java.io.IOException; 22 import java.net.JarURLConnection; 23 import java.net.URL; 24 import java.net.URLConnection; 25 import java.util.jar.JarFile; 26 27 /** 28 * 29 * @author Leonardo Uribe 30 */ 31 public class JarUtils 32 { 33 34 public static JarFile getJarFile(URL url) throws IOException 35 { 36 URLConnection conn = url.openConnection(); 37 conn.setUseCaches(false); 38 conn.setDefaultUseCaches(false); 39 40 JarFile jarFile; 41 if (conn instanceof JarURLConnection) 42 { 43 jarFile = ((JarURLConnection) conn).getJarFile(); 44 } 45 else 46 { 47 jarFile = _getAlternativeJarFile(url); 48 } 49 return jarFile; 50 } 51 52 /** 53 * taken from org.apache.myfaces.view.facelets.util.Classpath 54 * 55 * For URLs to JARs that do not use JarURLConnection - allowed by the servlet spec - attempt to produce a JarFile 56 * object all the same. Known servlet engines that function like this include Weblogic and OC4J. This is not a full 57 * solution, since an unpacked WAR or EAR will not have JAR "files" as such. 58 */ 59 private static JarFile _getAlternativeJarFile(URL url) throws IOException 60 { 61 String urlFile = url.getFile(); 62 63 // Trim off any suffix - which is prefixed by "!/" on Weblogic 64 int separatorIndex = urlFile.indexOf("!/"); 65 66 // OK, didn't find that. Try the less safe "!", used on OC4J 67 if (separatorIndex == -1) 68 { 69 separatorIndex = urlFile.indexOf('!'); 70 } 71 72 if (separatorIndex != -1) 73 { 74 String jarFileUrl = urlFile.substring(0, separatorIndex); 75 // And trim off any "file:" prefix. 76 if (jarFileUrl.startsWith("file:")) 77 { 78 jarFileUrl = jarFileUrl.substring("file:".length()); 79 } 80 81 return new JarFile(jarFileUrl); 82 } 83 84 return null; 85 } 86 87 }