Home | History | Annotate | Download | only in impl
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5  ******************************************************************************
      6  * Copyright (C) 2005-2015, International Business Machines Corporation and
      7  * others. All Rights Reserved.
      8  ******************************************************************************
      9  */
     10 
     11 package android.icu.impl;
     12 
     13 import java.io.BufferedReader;
     14 import java.io.File;
     15 import java.io.IOException;
     16 import java.io.InputStream;
     17 import java.io.InputStreamReader;
     18 import java.lang.reflect.InvocationTargetException;
     19 import java.lang.reflect.Method;
     20 import java.net.JarURLConnection;
     21 import java.net.URISyntaxException;
     22 import java.net.URL;
     23 import java.util.Enumeration;
     24 import java.util.HashMap;
     25 import java.util.Map;
     26 import java.util.jar.JarEntry;
     27 import java.util.jar.JarFile;
     28 
     29 /**
     30  * @hide Only a subset of ICU is exposed in Android
     31  */
     32 public abstract class URLHandler {
     33     public static final String PROPNAME = "urlhandler.props";
     34 
     35     private static final Map<String, Method> handlers;
     36 
     37     private static final boolean DEBUG = ICUDebug.enabled("URLHandler");
     38 
     39     static {
     40         Map<String, Method> h = null;
     41 
     42         BufferedReader br = null;
     43         try {
     44             @SuppressWarnings("resource")  // Closed by BufferedReader.
     45             ClassLoader loader = ClassLoaderUtil.getClassLoader(URLHandler.class);
     46             InputStream is = loader.getResourceAsStream(PROPNAME);
     47 
     48             if (is != null) {
     49                 Class<?>[] params = { URL.class };
     50                 br = new BufferedReader(new InputStreamReader(is));
     51 
     52                 for (String line = br.readLine(); line != null; line = br.readLine()) {
     53                     line = line.trim();
     54 
     55                     if (line.length() == 0 || line.charAt(0) == '#') {
     56                         continue;
     57                     }
     58 
     59                     int ix = line.indexOf('=');
     60 
     61                     if (ix == -1) {
     62                         if (DEBUG) System.err.println("bad urlhandler line: '" + line + "'");
     63                         break;
     64                     }
     65 
     66                     String key = line.substring(0, ix).trim();
     67                     String value = line.substring(ix+1).trim();
     68 
     69                     try {
     70                         Class<?> cl = Class.forName(value);
     71                         Method m = cl.getDeclaredMethod("get", params);
     72 
     73                         if (h == null) {
     74                             h = new HashMap<String, Method>();
     75                         }
     76 
     77                         h.put(key, m);
     78                     }
     79                     catch (ClassNotFoundException e) {
     80                         if (DEBUG) System.err.println(e);
     81                     }
     82                     catch(NoSuchMethodException e) {
     83                         if (DEBUG) System.err.println(e);
     84                     }
     85                     catch(SecurityException e) {
     86                         if (DEBUG) System.err.println(e);
     87                     }
     88                 }
     89                 br.close();
     90             }
     91         } catch (Throwable t) {
     92             if (DEBUG) System.err.println(t);
     93         } finally {
     94             if (br != null) {
     95                 try {
     96                     br.close();
     97                 } catch (IOException ignored) {
     98                 }
     99             }
    100         }
    101 
    102         handlers = h;
    103     }
    104 
    105     public static URLHandler get(URL url) {
    106         if (url == null) {
    107             return null;
    108         }
    109 
    110         String protocol = url.getProtocol();
    111 
    112         if (handlers != null) {
    113             Method m = handlers.get(protocol);
    114 
    115             if (m != null) {
    116                 try {
    117                     URLHandler handler = (URLHandler)m.invoke(null, new Object[] { url });
    118 
    119                     if (handler != null) {
    120                         return handler;
    121                     }
    122                 }
    123                 catch(IllegalAccessException e) {
    124                     if (DEBUG) System.err.println(e);
    125                 }
    126                 catch(IllegalArgumentException e) {
    127                     if (DEBUG) System.err.println(e);
    128                 }
    129                 catch(InvocationTargetException e) {
    130                     if (DEBUG) System.err.println(e);
    131                 }
    132             }
    133         }
    134 
    135         return getDefault(url);
    136     }
    137 
    138     protected static URLHandler getDefault(URL url) {
    139         URLHandler handler = null;
    140 
    141         String protocol = url.getProtocol();
    142         try {
    143             if (protocol.equals("file")) {
    144                 handler = new FileURLHandler(url);
    145             } else if (protocol.equals("jar") || protocol.equals("wsjar")) {
    146                 handler = new JarURLHandler(url);
    147             }
    148         } catch (Exception e) {
    149             // ignore - just return null
    150         }
    151         return handler;
    152     }
    153 
    154     private static class FileURLHandler extends URLHandler {
    155         File file;
    156 
    157         FileURLHandler(URL url) {
    158             try {
    159                 file = new File(url.toURI());
    160             } catch (URISyntaxException use) {
    161                 // fall through
    162             }
    163             if (file == null || !file.exists()) {
    164                 if (DEBUG) System.err.println("file does not exist - " + url.toString());
    165                 throw new IllegalArgumentException();
    166             }
    167         }
    168 
    169         @Override
    170         public void guide(URLVisitor v, boolean recurse, boolean strip) {
    171             if (file.isDirectory()) {
    172                 process(v, recurse, strip, "/", file.listFiles());
    173             } else {
    174                 v.visit(file.getName());
    175             }
    176         }
    177 
    178         private void process(URLVisitor v, boolean recurse, boolean strip, String path, File[] files) {
    179             if (files != null) {
    180                 for (int i = 0; i < files.length; i++) {
    181                     File f = files[i];
    182 
    183                     if (f.isDirectory()) {
    184                         if (recurse) {
    185                             process(v, recurse, strip, path + f.getName()+ '/', f.listFiles());
    186                         }
    187                     } else {
    188                         v.visit(strip? f.getName() : path + f.getName());
    189                     }
    190                 }
    191             }
    192         }
    193     }
    194 
    195     private static class JarURLHandler extends URLHandler {
    196         JarFile jarFile;
    197         String prefix;
    198 
    199         JarURLHandler(URL url) {
    200             try {
    201                 prefix = url.getPath();
    202 
    203                 int ix = prefix.lastIndexOf("!/");
    204 
    205                 if (ix >= 0) {
    206                     prefix = prefix.substring(ix + 2); // truncate after "!/"
    207                 }
    208 
    209                 String protocol = url.getProtocol();
    210                 if (!protocol.equals("jar")) {
    211                     // change the protocol to "jar"
    212                     // Note: is this really OK?
    213                     String urlStr = url.toString();
    214                     int idx = urlStr.indexOf(":");
    215                     if (idx != -1) {
    216                         url = new URL("jar" + urlStr.substring(idx));
    217                     }
    218                 }
    219 
    220                 JarURLConnection conn = (JarURLConnection)url.openConnection();
    221                 jarFile = conn.getJarFile();
    222             }
    223             catch (Exception e) {
    224                 if (DEBUG) System.err.println("icurb jar error: " + e);
    225                 throw new IllegalArgumentException("jar error: " + e.getMessage());
    226             }
    227         }
    228 
    229         @Override
    230         public void guide(URLVisitor v, boolean recurse, boolean strip) {
    231             try {
    232                 Enumeration<JarEntry> entries = jarFile.entries();
    233 
    234                 while (entries.hasMoreElements()) {
    235                     JarEntry entry = entries.nextElement();
    236 
    237                     if (!entry.isDirectory()) { // skip just directory paths
    238                         String name = entry.getName();
    239 
    240                         if (name.startsWith(prefix)) {
    241                             name = name.substring(prefix.length());
    242                             int ix = name.lastIndexOf('/');
    243                             if (ix > 0 && !recurse) {
    244                                 continue;
    245                             }
    246                             if (strip && ix != -1) {
    247                                 name = name.substring(ix+1);
    248                             }
    249                             v.visit(name);
    250                         }
    251                     }
    252                 }
    253             }
    254             catch (Exception e) {
    255                 if (DEBUG) System.err.println("icurb jar error: " + e);
    256             }
    257         }
    258     }
    259 
    260     public void guide(URLVisitor visitor, boolean recurse)
    261     {
    262         guide(visitor, recurse, true);
    263     }
    264 
    265     public abstract void guide(URLVisitor visitor, boolean recurse, boolean strip);
    266 
    267     public interface URLVisitor {
    268         void visit(String str);
    269     }
    270 }
    271