JarHandler.java revision a389b4a499f40379b0b204d7ba1c2057663d95c0
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 * 39f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws IOException 40f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * thrown if an IO error occurs when this method tries to 41f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * establish connection. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected URLConnection openConnection(URL u) throws IOException { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new JarURLConnection(u); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URL the context URL 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param spec 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.lang.String the spec string 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param start 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location to start parsing from 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param limit 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location where parsing ends 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void parseURL(URL url, String spec, int start, int limit) { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String file = url.getFile(); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file == null) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = ""; //$NON-NLS-1$ 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (limit > start) { 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spec = spec.substring(start, limit); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spec = ""; //$NON-NLS-1$ 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (spec.indexOf("!/") == -1 && (file.indexOf("!/") == -1)) { //$NON-NLS-1$ //$NON-NLS-2$ 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(Msg.getString("K01b6")); //$NON-NLS-1$ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file.equals("")) { 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = spec; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (spec.charAt(0) == '/') { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, file.indexOf('!') + 1) + spec; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int idx = file.indexOf('!'); 79f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson String tmpFile = file.substring(idx + 1, file.lastIndexOf('/') + 1) 80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson + spec; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project tmpFile = URLUtil.canonicalizePath(tmpFile); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, idx + 1) + tmpFile; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check that the embedded url is valid 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new URL(file); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (MalformedURLException e) { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(e.toString()); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setURL(url, "jar", "", -1, null, null, file, null, null); //$NON-NLS-1$//$NON-NLS-2$ 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Build and return the externalized string representation of url. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return String the externalized string representation of url 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a URL 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected String toExternalForm(URL url) { 102a389b4a499f40379b0b204d7ba1c2057663d95c0Jesse Wilson StringBuilder sb = new StringBuilder(); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append("jar:"); //$NON-NLS-1$ 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(url.getFile()); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String ref = url.getRef(); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ref != null) { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(ref); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 112