12be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka/* 22be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project 32be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 42be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 52be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * you may not use this file except in compliance with the License. 62be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * You may obtain a copy of the License at 72be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 82be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 92be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * 102be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 112be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 122be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * See the License for the specific language governing permissions and 142be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * limitations under the License. 152be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka */ 162be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 176bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaokapackage com.android.inputmethod.latin.maketext; 182be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 192be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.io.IOException; 202be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.io.InputStream; 212be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.io.UnsupportedEncodingException; 222be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.net.URL; 232be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.net.URLDecoder; 242be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.ArrayList; 252be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.Enumeration; 262be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.jar.JarEntry; 272be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.jar.JarFile; 282be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 291e11c44d1b5f9ddf593c5407cb14c458be0056f2Tadashi G. Takaokapublic final class JarUtils { 302be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private JarUtils() { 312be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka // This utility class is not publicly instantiable. 322be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 332be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 349c9802e6473e5e2e2b792d5f14502139feb49637Tadashi G. Takaoka public static JarFile getJarFile(final Class<?> mainClass) { 359c9802e6473e5e2e2b792d5f14502139feb49637Tadashi G. Takaoka final String mainClassPath = "/" + mainClass.getName().replace('.', '/') + ".class"; 369c9802e6473e5e2e2b792d5f14502139feb49637Tadashi G. Takaoka final URL resUrl = mainClass.getResource(mainClassPath); 372be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (!resUrl.getProtocol().equals("jar")) { 382be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka throw new RuntimeException("Should run as jar"); 392be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 402be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String path = resUrl.getPath(); 412be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (!path.startsWith("file:")) { 422be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka throw new RuntimeException("Unknown jar path: " + path); 432be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 442be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String jarPath = path.substring("file:".length(), path.indexOf('!')); 452be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka try { 462be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return new JarFile(URLDecoder.decode(jarPath, "UTF-8")); 472be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } catch (UnsupportedEncodingException e) { 482be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } catch (IOException e) { 492be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 502be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return null; 512be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 522be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 532be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public static InputStream openResource(final String name) { 542be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return JarUtils.class.getResourceAsStream("/" + name); 552be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 562be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 572be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public interface JarFilter { 582be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public boolean accept(String dirName, String name); 592be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 602be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 612be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public static ArrayList<String> getNameListing(final JarFile jar, final JarFilter filter) { 622be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final ArrayList<String> result = new ArrayList<String>(); 632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final Enumeration<JarEntry> entries = jar.entries(); 642be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka while (entries.hasMoreElements()) { 652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final JarEntry entry = entries.nextElement(); 662be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String path = entry.getName(); 672be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final int pos = path.lastIndexOf('/'); 682be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String dirName = (pos >= 0) ? path.substring(0, pos) : ""; 692be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String name = (pos >= 0) ? path.substring(pos + 1) : path; 702be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (filter.accept(dirName, name)) { 712be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka result.add(path); 722be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 732be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 742be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return result; 752be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 762be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 772be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public static ArrayList<String> getNameListing(final JarFile jar, final String filterName) { 782be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return getNameListing(jar, new JarFilter() { 792be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka @Override 802be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka public boolean accept(final String dirName, final String name) { 812be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return name.equals(filterName); 822be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 832be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka }); 842be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 852be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka} 86