private static final void ensureScalaPath(Map<String, String> options, String[] cp) { // (check if it's in the classpath) try { Class.forName("scala.None", false, ClassLoader.getSystemClassLoader()); } catch (ClassNotFoundException e) { // (case: scala library not in the classpath) if (options.containsKey(SCALA_PATH)) { // (case: scala_path option set) try { String path = options.get(SCALA_PATH); if (!(new File(path).exists())) { System.err.println("The library strongly integrates with the Scala runtime, "); System.err.println("however it could not find the Scala library (scala-library.jar) "); System.err.println( "at the path given by the command line option '" + SCALA_PATH + "': " + path); log.exit(ExitCode.BAD_OPTION); } URL url = new File(path).toURI().toURL(); URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class<URLClassLoader> sysclass = URLClassLoader.class; Method method = sysclass.getDeclaredMethod("addURL", url.getClass()); boolean savedAccessible = method.isAccessible(); method.setAccessible(true); method.invoke(sysloader, new Object[] {url}); method.setAccessible(savedAccessible); Class.forName("scala.None", false, ClassLoader.getSystemClassLoader()); } catch (Exception ex) { throw log.fail(ex); } // end try catch } else { // (case: we cannot find the scala library at all) System.err.println("The library strongly integrates with the Scala runtime, "); System.err.println( "however it could not find the Scala library (scala-library.jar) in the classpath, "); System.err.println("and the '" + SCALA_PATH + "' command line argument is not set."); log.exit(ExitCode.BAD_OPTION); } } options.remove(SCALA_PATH); }
@SuppressWarnings("rawtypes") protected static final Map<String, Field> fillOptions( Class<?>[] classes, Map<String, String> options, boolean ensureAllOptions) { // --Get Fillable Options Map<String, Field> canFill = new HashMap<String, Field>(); Map<String, Marker> required = new HashMap<String, Marker>(); Map<String, String> interner = new HashMap<String, String>(); for (Class c : classes) { Field[] fields = null; try { fields = c.getDeclaredFields(); } catch (Throwable e) { log.debug( LOG_TAG, "Could not check fields for class: " + c.getName() + " (caused by " + e.getClass() + ": " + e.getMessage() + ")"); continue; } for (Field f : fields) { Option o = f.getAnnotation(Option.class); if (o != null) { // (check if field is static) if ((f.getModifiers() & Modifier.STATIC) == 0) { log.err(LOG_TAG, "Option can only be applied to static field: " + c + "." + f); System.exit(ExitCode.BAD_OPTION.code); } // (required marker) Marker mark = null; if (o.required()) { mark = new Marker(); mark.unset(); } // (add main name) String name = o.name().toLowerCase(); if (name.equals("")) { name = f.getName().toLowerCase(); } if (canFill.containsKey(name)) { String name1 = canFill.get(name).getDeclaringClass().getCanonicalName() + "." + canFill.get(name).getName(); String name2 = f.getDeclaringClass().getCanonicalName() + "." + f.getName(); if (!name1.equals(name2)) { log.err( LOG_TAG, "Multiple declarations of option " + name + ": " + name1 + " and " + name2); System.exit(ExitCode.BAD_OPTION.code); } else { log.err( LOG_TAG, "Class is in classpath multiple times: " + canFill.get(name).getDeclaringClass().getCanonicalName()); } } canFill.put(name, f); if (mark != null) required.put(name, mark); interner.put(name, name); // (add alternate names) if (!o.alt().equals("")) { for (String alt : o.alt().split(" *, *")) { alt = alt.toLowerCase(); if (canFill.containsKey(alt) && !alt.equals(name)) throw new IllegalArgumentException( "Multiple declarations of option " + alt + ": " + canFill.get(alt) + " and " + f); canFill.put(alt, f); if (mark != null) required.put(alt, mark); interner.put(alt, name); } } } } } // --Fill Options for (String key : options.keySet()) { String rawKey = key; key = key.toLowerCase(); // (get values) String value = options.get(rawKey); Field target = canFill.get(key); // (mark required option as fulfilled) Marker mark = required.get(key); if (mark != null) { mark.set(); } // (fill the field) if (target != null) { // (case: declared option) fillField(target, value); } else if (ensureAllOptions) { // (case: undeclared option) // split the key int lastDotIndex = rawKey.lastIndexOf('.'); if (lastDotIndex < 0) { log.err(LOG_TAG, "Unrecognized option: " + key); System.exit(ExitCode.BAD_OPTION.code); } String className = rawKey.substring(0, lastDotIndex); String fieldName = rawKey.substring(lastDotIndex + 1); // get the class Class clazz = null; try { clazz = ClassLoader.getSystemClassLoader().loadClass(className); } catch (Exception e) { log.err(LOG_TAG, "Could not set option: " + rawKey + "; no such class: " + className); System.exit(ExitCode.BAD_OPTION.code); } // get the field try { target = clazz.getField(fieldName); } catch (Exception e) { log.err( LOG_TAG, "Could not set option: " + rawKey + "; no such field: " + fieldName + " in class: " + className); System.exit(ExitCode.BAD_OPTION.code); } fillField(target, value); } } // --Ensure Required boolean good = true; for (String key : required.keySet()) { if (!required.get(key).isSet()) { log.err( LOG_TAG, "Missing required option: " + interner.get(key) + " <in class: " + canFill.get(key).getDeclaringClass() + ">"); required.get(key).set(); // don't duplicate error messages good = false; } } if (!good) { System.exit(ExitCode.BAD_OPTION.code); } return canFill; }