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 185aafac4db69e6d087c512cdfa5c7c0e2f1611681Jesse Wilsonpackage libcore.net.url; 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 265aafac4db69e6d087c512cdfa5c7c0e2f1611681Jesse Wilsonpublic class JarHandler extends URLStreamHandler { 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a connection to the jar file pointed by this <code>URL</code> 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the file system 30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return java.net.URLConnection A connection to the resource pointed by 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this url. 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param u 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.net.URL The URL to which the connection is pointing to 35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 36f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws IOException 37f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * thrown if an IO error occurs when this method tries to 38f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * establish connection. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected URLConnection openConnection(URL u) throws IOException { 425839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson return new JarURLConnectionImpl(u); 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URL the context URL 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param spec 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.lang.String the spec string 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param start 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location to start parsing from 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param limit 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * int the location where parsing ends 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void parseURL(URL url, String spec, int start, int limit) { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String file = url.getFile(); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file == null) { 60f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes file = ""; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (limit > start) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spec = spec.substring(start, limit); 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes spec = ""; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if (spec.indexOf("!/") == -1 && (file.indexOf("!/") == -1)) { 68b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new NullPointerException("Cannot find \"!/\""); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 7080a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (file.isEmpty()) { 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = spec; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (spec.charAt(0) == '/') { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, file.indexOf('!') + 1) + spec; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int idx = file.indexOf('!'); 76c5727263001f1eae068f7821063d7bfb2da8e24cJesse Wilson String tmpFile = file.substring(idx + 1, file.lastIndexOf('/') + 1) + spec; 77c5727263001f1eae068f7821063d7bfb2da8e24cJesse Wilson tmpFile = UrlUtils.canonicalizePath(tmpFile, true); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project file = file.substring(0, idx + 1) + tmpFile; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check that the embedded url is valid 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new URL(file); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (MalformedURLException e) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(e.toString()); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes setURL(url, "jar", "", -1, null, null, file, null, null); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Build and return the externalized string representation of url. 91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return String the externalized string representation of url 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a URL 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected String toExternalForm(URL url) { 98a389b4a499f40379b0b204d7ba1c2057663d95c0Jesse Wilson StringBuilder sb = new StringBuilder(); 99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sb.append("jar:"); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(url.getFile()); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String ref = url.getRef(); 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ref != null) { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(ref); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 108