package plan;
import plan.input.*;
import plan.report.*;
import plan.dom.*;
/** This class is used to parse the command line and drive the program. */
public class Plan {
/** This class is entirely static. Ensure no objects of this class get created. */
private Plan() { }
/** Features fitting under this ratio of resourcing are considered "just-missed". */
static private final double JUST_MISSED_RATIO = 1.5;
/** Main program.
* Expects three arguments:<br>
* <code> <feature_file.xml> <product_name> <person-days-available></code><br>
* Any errors result in an error message and a usage message to stderr
* and termination with an exit code of -1.
* Correct execution will result in an exit code of 0.
*/
public static void main(String[] argv) {
// get data from test scaffolding
// The real XML file reader is being worked on now.
FileInput reader = new TestInput();
// check for correct number of arguments
if (argv.length != 3)
dieUsage("wrong number of arguments");
// check for non-null filename
String filename = argv[0];
if (filename == null || filename.equals(""))
dieUsage("empty filename specified");
// check for non-null osftware product
String software = argv[1];
if (software == null || software.equals(""))
dieUsage("empty software name specified");
// parse capacity, checking for errors
String capacityStr = argv[2];
double capacity = 0.0;
try {
capacity = Double.parseDouble(capacityStr);
} catch (NumberFormatException e) {
dieUsage("Illegal capacity specified, '" + capacityStr + "'");
}
if (capacity <= 0)
dieUsage("Capacity specified, '" + capacityStr + "' must be be greater than 0");
// read the XML feature file. Returns the root "Company" object from the file.
Company c = null;
try {
c = reader.readFile(filename);
} catch (java.io.FileNotFoundException e) {
dieUsage("File not found, '" + filename + "'");
} catch (java.io.IOException e) {
dieUsage("IO error while opening file '" + filename + "'");
}
// check that software product specified on the command line exists in the file
Software s = c.getSoftware(software);
if( s == null )
dieUsage("Specified software product not found, '" + software + "'");
// plan a release given the capacity in person-days specified on the command line
Release planned = s.planRelease(capacity);
planned.setDesignator("in-plan");
// plan a second release given the extra capacity and subtract the features from
// the above rleease, leaving just the excess.
Release overflow = s.planRelease(capacity * JUST_MISSED_RATIO);
overflow.subtract(planned);
overflow.setDesignator("just-missed");
// write the report header, echoing the comamnd line
Report.writeHeader("File: " + filename + " Product: " + software + " Capacity: " + capacityStr);
// write a summary chart for all the features, the in-plan features, and the just-missed features
final FeatureList[] featureListsToSummarize = {s, planned, overflow};
Report.writeSummaryTable(featureListsToSummarize);
// write details for the in-plan features
Report.writeFeatures("In-Plan Features for sizing " + capacityStr, planned);
// write details for the just-missed features
Report.writeFeatures("Just-Missed Features under sizing " + capacity * JUST_MISSED_RATIO, overflow);
// all went well
System.exit(0);
}
/** Print an error message and a usage message to stderr, and die with exit code -1
* @param msg the error message to print
*/
private static void dieUsage(String msg) {
System.err.println("Error: " + msg);
System.err.println("Usage: java Plan filename productname capacity");
System.exit(1);
}
}