public static void main(final String[] args) throws Exception { // use the platform default proxy if available. // see sun.net.spi.DefaultProxySelector for details. try { System.setProperty("java.net.useSystemProxies","true"); } catch (SecurityException e) { // failing to set this property isn't fatal } if( Util.getSystemProperty(Driver.class,"noThreadSwap")!=null ) _main(args); // for the ease of debugging // run all the work in another thread so that the -Xss option // will take effect when compiling a large schema. See // http://developer.java.sun.com/developer/bugParade/bugs/4362291.html final Throwable[] ex = new Throwable[1]; Thread th = new Thread() { public void run() { try { _main(args); } catch( Throwable e ) { ex[0]=e; } } }; th.start(); th.join(); if(ex[0]!=null) { // re-throw if( ex[0] instanceof Exception ) throw (Exception)ex[0]; else throw (Error)ex[0]; } }
/** * Looks for all "META-INF/services/[className]" files and create one instance for each class name * found inside this file. */ private static <T> T[] findServices(Class<T> clazz, ClassLoader classLoader) { // if true, print debug output final boolean debug = com.sun.tools.xjc.util.Util.getSystemProperty(Options.class, "findServices") != null; // if we are running on Mustang or Dolphin, use ServiceLoader // so that we can take advantage of JSR-277 module system. try { Class<?> serviceLoader = Class.forName("java.util.ServiceLoader"); if (debug) System.out.println("Using java.util.ServiceLoader"); Iterable<T> itr = (Iterable<T>) serviceLoader .getMethod("load", Class.class, ClassLoader.class) .invoke(null, clazz, classLoader); List<T> r = new ArrayList<T>(); for (T t : itr) r.add(t); return r.toArray((T[]) Array.newInstance(clazz, r.size())); } catch (ClassNotFoundException e) { // fall through } catch (IllegalAccessException e) { Error x = new IllegalAccessError(); x.initCause(e); throw x; } catch (InvocationTargetException e) { Throwable x = e.getTargetException(); if (x instanceof RuntimeException) throw (RuntimeException) x; if (x instanceof Error) throw (Error) x; throw new Error(x); } catch (NoSuchMethodException e) { Error x = new NoSuchMethodError(); x.initCause(e); throw x; } String serviceId = "META-INF/services/" + clazz.getName(); // used to avoid creating the same instance twice Set<String> classNames = new HashSet<String>(); if (debug) { System.out.println("Looking for " + serviceId + " for add-ons"); } // try to find services in CLASSPATH try { Enumeration<URL> e = classLoader.getResources(serviceId); if (e == null) return (T[]) Array.newInstance(clazz, 0); ArrayList<T> a = new ArrayList<T>(); while (e.hasMoreElements()) { URL url = e.nextElement(); BufferedReader reader = null; if (debug) { System.out.println("Checking " + url + " for an add-on"); } try { reader = new BufferedReader(new InputStreamReader(url.openStream())); String impl; while ((impl = reader.readLine()) != null) { // try to instanciate the object impl = impl.trim(); if (classNames.add(impl)) { Class implClass = classLoader.loadClass(impl); if (!clazz.isAssignableFrom(implClass)) { pluginLoadFailure = impl + " is not a subclass of " + clazz + ". Skipping"; if (debug) System.out.println(pluginLoadFailure); continue; } if (debug) { System.out.println("Attempting to instanciate " + impl); } a.add(clazz.cast(implClass.newInstance())); } } reader.close(); } catch (Exception ex) { // let it go. StringWriter w = new StringWriter(); ex.printStackTrace(new PrintWriter(w)); pluginLoadFailure = w.toString(); if (debug) { System.out.println(pluginLoadFailure); } if (reader != null) { try { reader.close(); } catch (IOException ex2) { // ignore } } } } return a.toArray((T[]) Array.newInstance(clazz, a.size())); } catch (Throwable e) { // ignore any error StringWriter w = new StringWriter(); e.printStackTrace(new PrintWriter(w)); pluginLoadFailure = w.toString(); if (debug) { System.out.println(pluginLoadFailure); } return (T[]) Array.newInstance(clazz, 0); } }