001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.xbean.classpath;
018    
019    import java.io.File;
020    import java.net.URL;
021    import java.net.URLClassLoader;
022    import java.security.AccessController;
023    import java.security.PrivilegedAction;
024    
025    public abstract class SunURLClassPath implements ClassPath {
026        public static ClassLoader getContextClassLoader() {
027            return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
028                public Object run() {
029                    return Thread.currentThread().getContextClassLoader();
030                }
031            });
032        }
033    
034        private java.lang.reflect.Field ucpField;
035    
036        protected void addJarToPath(final URL jar, final URLClassLoader loader) throws Exception {
037            this.getURLClassPath(loader).addURL(jar);
038        }
039    
040        protected void addJarsToPath(final File dir, final URLClassLoader loader) throws Exception {
041            if (dir == null || !dir.exists()) return;
042            //System.out.println("DIR "+dir);
043            // Get the list of jars and zips
044            String[] jarNames = dir.list(new java.io.FilenameFilter() {
045                public boolean accept(File dir, String name) {
046                    //System.out.println("FILE "+name);
047                    return (name.endsWith(".jar") || name.endsWith(".zip"));
048                }
049            });
050    
051            // Create URLs from them
052            final URL[] jars = new URL[jarNames.length];
053            for (int j = 0; j < jarNames.length; j++) {
054                jars[j] = new File(dir, jarNames[j]).toURL();
055            }
056    
057            sun.misc.URLClassPath path = getURLClassPath(loader);
058            for (int i = 0; i < jars.length; i++) {
059                //System.out.println("URL "+jars[i]);
060                path.addURL(jars[i]);
061            }
062        }
063    
064        protected sun.misc.URLClassPath getURLClassPath(URLClassLoader loader) throws Exception {
065            return (sun.misc.URLClassPath) getUcpField().get(loader);
066        }
067    
068        private java.lang.reflect.Field getUcpField() throws Exception {
069            if (ucpField == null) {
070                // Add them to the URLClassLoader's classpath
071                ucpField = (java.lang.reflect.Field) AccessController.doPrivileged(new PrivilegedAction() {
072                    public Object run() {
073                        java.lang.reflect.Field ucp = null;
074                        try {
075                            ucp = URLClassLoader.class.getDeclaredField("ucp");
076                            ucp.setAccessible(true);
077                        } catch (Exception e2) {
078                            e2.printStackTrace();
079                        }
080                        return ucp;
081                    }
082                });
083            }
084    
085            return ucpField;
086        }
087    
088    }