Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package bpiwowar.experiments;
  
  import java.util.Arrays;
  
An abstract task that takes care of parsing

Author(s):
Benjamin Piwowarski <benjamin@bpiwowar.net>
 
 public abstract class AbstractTask implements Task {
 	static final bpiwowar.argparser.Logger logger = Logger.getLogger();

Our parent task
 
 
 	public @interface Information {
The subtasks
 
 		Class<? extends Task>[] subtasks() default {};

Synopsis of the command
 
 		String synopsis() default "[options]";
 	}

Execute the task

Parameters:
args
Throws:
java.lang.Throwable
 
 	public int execute() throws Throwable {
 		return 0;
 	}
 
 	private static class DefaultAnnotationClass {
 	}
 
 	private static final Information DEFAULT_INFORMATION = DefaultAnnotationClass.class
Get the parent task

Returns:
 
 	public Task getParent() {
 		return ;
 	}

Process trailing arguments if we have some

Parameters:
args The arguments
Returns:
The unprocessed trailing arguments
Throws:
java.lang.Exception
 
 	public String[] processTrailingArguments(String[] argsthrows Exception {
 		return args;
 	}

The task to run
 
 
 	final public void init(String[] argsthrows Exception {
 		// The task to run is this for now
 		.info("Initialising task of class %s"getClass()
 		 = this;
 
 		// Get the information, if any
 		Information information = getClass().getAnnotation(Information.class);
 		if (information == null)
 			information = ;
 
 		String synopsis = String.format("%s %s"getName(),
 				information.synopsis());
 		if (information.subtasks().length > 0) {
 			.info("Task has subtasks");
 			synopsis += " <task>";
 		}
 
		ArgParser parser = new ArgParser(synopsis);
		parser.addOptions(thistrue);
		args = parser.matchAllArgs(args, 0, .,
		// Process what remains
		if (information.subtasks().length == 0) {
			// Check that we don't have trailing arguments
			if (args != null && args.length > 0)
				throw new RuntimeException(String.format(
						"Unprocessed command line arguments: %s",
						bpiwowar.argparser.utils.Output.toString(" "args)));
else {
			// We have subtasks
			if (args == null || args.length == 0) {
				..println("Possible subtasks are:");
				// Output the possible subtasks
				for (Class<? extends Tasksubtask : information.subtasks()) {
					Subtask annotation = subtask.getAnnotation(Subtask.class);
					if (annotation == null)
						.error("Class %s has no Subtask annotation",
								subtask.getCanonicalName());
					else
						..format("%s\t%s%n"annotation.name(),
								annotation.description());
				}
				return;
			}
			// --- Try to match the subclass
			Class<? extends TasksubtaskClass = null;
			String subtaskName = args[0];
			for (Class<? extends TaskaSubtask : information.subtasks()) {
				Subtask info = aSubtask.getAnnotation(Subtask.class);
				if (info == null)
					.error("Class %s has no Subtask annotation",
							aSubtask.getCanonicalName());
				else if (info.name().equals(subtaskName)) {
					if (subtaskClass != null)
						throw new RuntimeException(String.format(
								"Task name %s has multiple matches",
								subtaskName));
					subtaskClass = aSubtask;
				}
			}
			if (subtaskClass == null)
				throw new RuntimeException("Task " + subtaskName
" could not be found");
			// --- Run the subtask
			Subtask info = subtaskClass.getAnnotation(Subtask.class);
			.info("Initialising sub-task %s [%s]"info.name(),
					subtaskClass.getCanonicalName());
			Task subtask;
			if (subtaskClass.isMemberClass()) {
				// If it is a class enclosed in the main task class, then
				// we construct it with us
				Constructor<? extends Taskconstructor = subtaskClass
				subtask = constructor.newInstance(this);
else {
				subtask = subtaskClass.newInstance();
				if (subtask instanceof AbstractTask)
					((AbstractTasksubtask). = this;
			}
			// Initialise with remaining arguments
			args = Arrays.copyOfRange(args, 1, args.length);
			subtask.init(args);
			 = subtask;
		}
	}
	final public int run() throws Throwable {
		.info("Running task of class %s".getClass());
		if ( instanceof AbstractTask)
		return .run();
	}

Returns the name of the task

Returns:
The experiment name annotation, or the class name if there is no such annotation
	protected String getName() {
		if (annotation != null)
			return annotation.name();
	}
New to GrepCode? Check out our FAQ X