Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package bpiwowar.experiments;
  
  import java.io.File;
  import java.net.URL;
 
 
 
Run an experiment

Author(s):
Benjamin Piwowarski <benjamin@bpiwowar.net>
 
 public class Run {
 
 	private static final String SEARCH_COMMAND = "search";
 	private static final String EXPERIMENT_PACKAGES = "META-INF/services/bpiwowar.experiments";
 	private static final Logger logger = Logger.getLogger();

Number of subpackages for this object
 
 	private static int EXPERIMENT_LEVEL = 3;

Main method

Parameters:
args
Throws:
java.lang.Throwable
 
 	public static void main(String[] argsthrows Throwable {
 		try {
 			new Run().run(args);
 		} catch (ArgParseException e) {
 			..println("Error while processing the arguments: " + e);
 		}
 	}
 
 	@Argument(name = "show-classes", help = "Show the qualified class names of the different tasks")
 	boolean showClassNames = false;
 
 	@Argument(name = "log4j", help = "Path to a log4j file", checkers = IOChecker.ValidFile.class)
 
 	@Argument(name = "xstream-output", help = "Serialize (with XStream) instead of running (after object initialisation)")
 
 	private void run(String[] argsthrows Throwable {
 		// Parse the arguments
 		ArgParser parser = new ArgParser("Run an experiment");
 		parser.addOptions(thistrue);
 		args = parser.matchAllArgs(args, 0, .,
 
 		// Set the log4j if not yet done
 		if ( != null) {
 			.info("Using another log4j configuration: %s");
 			PropertyConfigurator.configure(.getAbsolutePath());
 		}
 
 		// ---- Get the list of available experiments
 		final TreeMap<TaskNameClass<Task>> tasks = GenericHelper.newTreeMap();
 		while (e.hasMoreElements()) {
 			final URL url = e.nextElement();
 			.debug("Got URL %s"url);
 					url.openStream()));
 			String line;
 			while ((line = in.readLine()) != null) {
 				String packageName = line;
 				getTasks(urltaskspackageName);
 			}
 		}
		// Get our pre-defined tasks
		getTasks(nulltasksgetClass().getPackage().getName());
		if (tasks.isEmpty()) {
			.fatal("I did not find any valid experiment (service bpiwowar.experiments.ExperimentListProvider)");
			System.exit(1);
		}
		// ---- Check
		if (args.length == 0 || args[0].equals("list")) {
			// Display available experiments
			..format("Available experiments:%n");
			TreeMapArray<PackageNameStringmap = TreeMapArray.newInstance();
			for (Entry<TaskNameClass<Task>> entry : tasks.entrySet()) {
				// Group by group name
				TaskName task = entry.getKey();
					map.add(task.packageName, String.format("%s (%s)",
							task.nameentry.getValue().toString()));
				else
					map.add(task.packageNametask.name);
			}
			Stack<PackageNameancestors = new Stack<PackageName>();
			for (Entry<PackageNameArrayList<String>> entry : map.entrySet()) {
				final PackageName key = entry.getKey();
				while (!ancestors.isEmpty()
						&& key.commonPrefixLength(ancestors.peek()) != ancestors
					ancestors.pop();
				int nbAncestors = ancestors.size();
				int c = nbAncestors > 0 ? ancestors.peek().getLength() : 0;
				for (int i = 0; i < ci++)
					s.append("|");
				for (int i = ci < key.getLength(); i++) {
					s.append("|");
					ancestors.add(new PackageName(keyi + 1));
					..format("%s%n"s);
					..format("%s+ [%s]%n"sancestors.peek());
					nbAncestors++;
				}
				String prefix = s.toString();
				for (String task : entry.getValue())
					..format("%s|- %s%n"prefixtask);
				ancestors.add(key);
			}
			return;
else if (args[0].equals()) {
			final class Options {
				@OrderedArgument(required = true)
			}
			Options options = new Options();
			ap.addOptions(options);
			ap.matchAllArgs(args, 1);
			.info("Searching for %s"options.search);
			for (Entry<TaskNameClass<Task>> entry : tasks.entrySet()) {
				TaskName taskname = entry.getKey();
				if (taskname.name.contains(options.search)) {
							"[*] %s - %s%n   %s%n",
							taskname,
							entry.getValue(),
							entry.getValue()
				}
			}
			return;
		}
		// Get the task name & shift the argument array
		String taskName = args[0];
		args = Arrays.copyOfRange(args, 1, args.length);
		// Search for the task
		ArrayList<Class<Task>> matching = GenericHelper.newArrayList();
		for (Entry<TaskNameClass<Task>> entry : tasks.entrySet()) {
			if (entry.getKey()..equals(taskName))
				matching.add(entry.getValue());
		}
		// Check
		if (matching.isEmpty()) {
			..println("No task match " + taskName);
			System.exit(1);
		}
		if (matching.size() > 1) {
			..println("Too many tasks match " + taskName);
			System.exit(1);
		}
		// Run
		Class<TasktaskClass = matching.get(0);
		.info("Running experiment " + taskClass.getCanonicalName());
		Task task = taskClass.newInstance();
		int errorCode = 0;
		try {
			task.init(args);
			if ( != null) {
					out = .;
				else
				.info("Serializing the object into %s");
				new XStream().toXML(taskout);
				out.close();
else {
				errorCode = task.run();
			}
			.info("Finished task");
catch (Throwable t) {
			if (t instanceof InvocationTargetException && t.getCause() != null) {
				t = t.getCause();
			}
			.error("Exception thrown while executing the action:%n%s%n",
					t);
			// (force) quit the application (useful to quit running threads)
			errorCode = 2;
		}
		// Stop dandling threads
		System.exit(errorCode);
	}

Get the tasks within a package

Parameters:
url The URL of the file that contained
tasks a Map from a name
packageName The package to explore
	private void getTasks(URL urlfinal TreeMap<TaskNameClass<Task>> tasks,
			String packageName) {
		.debug("Check package " + packageName + " for experiments");
		final Checker checker = new Checker() {
			@SuppressWarnings("unchecked")
			public boolean accepts(Class<?> aClass) {
				.trace("Checking %s"aClass);
				TaskDescription exp = aClass
				if (exp != null && (Task.class.isAssignableFrom(aClass)))
					tasks.put(
							new TaskName(new PackageName(exp.project()), exp
									.name()), (Class<Task>) aClass);
				return false;
			}
		};
		// If URL is null, we try to get the URL of the package that contains
		// the specified resource
		final String name = "/" + packageName.replace('.''/');
		if (url == null)
			url = Introspection.class.getResource(name);
		// --- Distinguishes the cases where the file is a filesystem file
		File directory = new File(url.getFile());
		if (directory.isFile()) {
			for (int i = 0; i < i++)
				directory = directory.getParentFile();
			String[] names = packageName.split("\\.");
			for (String filename : names)
				directory = new File(directoryfilename);
			.debug("Checking directory %s"directory);
			Introspection.addClasses(checkernullpackageName, 0, directory);
else {
			.debug("Checking url %s"url);
			Introspection.addClasses(checkernullpackageName, 0, url);
		}
	}
New to GrepCode? Check out our FAQ X