JarHandler.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.luni.internal.net.www.protocol.jar; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.MalformedURLException; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URLConnection; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URLStreamHandler; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.URLUtil; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Handler extends URLStreamHandler { 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a connection to the jar file pointed by this <code>URL</code> 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the file system 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return java.net.URLConnection A connection to the resource pointed by 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this url. 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param u 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.net.URL The URL to which the connection is pointing to 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @thows IOException thrown if an IO error occurs when this method tries to 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * establish connection. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected URLConnection openConnection(URL u) throws IOException { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new JarURLConnection(u); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URL the context URL 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param spec 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.lang.String the spec string 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param start 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location to start parsing from 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param limit 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location where parsing ends 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void parseURL(URL url, String spec, int start, int limit) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String file = url.getFile(); 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file == null) { 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = ""; //$NON-NLS-1$ 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (limit > start) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spec = spec.substring(start, limit); 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spec = ""; //$NON-NLS-1$ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (spec.indexOf("!/") == -1 && (file.indexOf("!/") == -1)) { //$NON-NLS-1$ //$NON-NLS-2$ 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(Msg.getString("K01b6")); //$NON-NLS-1$ 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file.equals("")) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = spec; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (spec.charAt(0) == '/') { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, file.indexOf('!') + 1) + spec; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int idx = file.indexOf('!'); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String tmpFile = file.substring(idx + 1, file.lastIndexOf('/') + 1) + spec; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project tmpFile = URLUtil.canonicalizePath(tmpFile); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, idx + 1) + tmpFile; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check that the embedded url is valid 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new URL(file); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (MalformedURLException e) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(e.toString()); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setURL(url, "jar", "", -1, null, null, file, null, null); //$NON-NLS-1$//$NON-NLS-2$ 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Build and return the externalized string representation of url. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return String the externalized string representation of url 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a URL 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected String toExternalForm(URL url) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuffer sb = new StringBuffer(); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append("jar:"); //$NON-NLS-1$ 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(url.getFile()); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String ref = url.getRef(); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ref != null) { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(ref); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 110