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