package plan.report; import java.util.*; import plan.dom.*; /** * Utility class for printing text-oriented reports to standard output. */ public class Report { /** Entirely static class. Ensure no instances are created. */ private Report() { } // Old FORTRAN trick gives a picture of the field-widths. static final private String LINE = "============================================================================="; static final private String PICT = "iiiii dddddddddddddddddddddddddd pppp ssss hhhhhhhhhh ccccccccccccccccccccccc"; static final private String HEAD = "id short description prio size champion customers"; static final private int WIDTH_ID = PICT.lastIndexOf("i") - PICT.indexOf("i") + 1; static final private int WIDTH_DESC = PICT.lastIndexOf("d") - PICT.indexOf("d") + 1; static final private int WIDTH_PRIO = PICT.lastIndexOf("p") - PICT.indexOf("p") + 1; static final private int WIDTH_SIZE = PICT.lastIndexOf("s") - PICT.indexOf("s") + 1; static final private int WIDTH_CHAMP = PICT.lastIndexOf("h") - PICT.indexOf("h") + 1; static final private int WIDTH_CUST = PICT.lastIndexOf("c") - PICT.indexOf("c") + 1; /** Write the report header. * @param head the header message to be printed */ static public void writeHeader(String head) { System.out.println(LINE); System.out.println(head); System.out.print("Report generated at: "); System.out.println(new Date().toString()); System.out.println(LINE); } /** Write a table summarizing the number of features and their sizings. * The table has the feature lists along the columns and four rows: * <ul> * <li>high priority features * <li>medium priority features * <li>low priority features * <li>all features * </ul> * Each entry in the table gives the number of features and the sum of the sizings. * @param fl the variouos FeatureLists comprising the columns */ static public void writeSummaryTable(FeatureList[] fl) { final int ROW_LABEL_WIDTH = 8; final int COL_WIDTH = (80 - ROW_LABEL_WIDTH) / 3; // print summar headers System.out.println("Summary"); System.out.println("num_features / total_sizing:"); // print column-label row writeField("", ROW_LABEL_WIDTH); for(int i = 0; i < fl.length; i++) writeField(fl[i].getLabel(), COL_WIDTH); System.out.println(); // print each of the 4 other rows final Priority[] pr = {Priority.high,Priority.med,Priority.low,null}; for (int p = 0; p < pr.length; p++) { writeField((pr[p] == null ? "TOTAL" : pr[p].toString()), ROW_LABEL_WIDTH); for (int i = 0; i < 3; i++) { String field = "" + fl[i].numFeatures(pr[p]) + "/" + fl[i].totalSizingOfFeatures(pr[p]); writeField(field, COL_WIDTH); } System.out.println(); } // terminate this section of the report with a line System.out.println(LINE); } /** Write out details for all the features in the specified FeatureList. * @param title a title for this section of the report * @param fl the list of features to print */ static public void writeFeatures(String title, FeatureList fl) { System.out.println(title); System.out.println(HEAD); Iterator i = fl.featureIterator(); if (i.hasNext()) while (i.hasNext()) writeFeature((Feature)i.next()); else System.out.println("<NO FEATURES>"); System.out.println(LINE); } /** Write details for the given feature. * @param f the feature to print */ static void writeFeature(Feature f) { writeField("" + f.getId(), WIDTH_ID); System.out.print(" "); writeField(f.getShortDescription(), WIDTH_DESC); System.out.print(" "); writeField(f.getPriority().toString(), WIDTH_PRIO); System.out.print(" "); writeField("" + f.getSizing(), WIDTH_SIZE); System.out.print(" "); writeField(f.getChampion().getName(), WIDTH_CHAMP); System.out.print(" "); writeField(customerDesirability(f), WIDTH_CUST); System.out.println(); } /** Write the given string in a filed of the given width. * If the length of the string is bigger than the field width, * replace the end of the string by a "...". * @param s the string to print in the field * @param width the field width */ static void writeField(String s, int width) { if (s.length() > width) s = s.substring(0, width - 3).concat("..."); int nBlanks = width - s.length(); while (nBlanks-- > 0) s += " "; System.out.print(s); } /** Return a string that expresses the desirability * by customers of the specified feature. * @param f the features whose customer desirability is to be returned * @return a textual expression of the desirability */ static String customerDesirability(Feature f) { // start with the numerical rating String s = "" + f.customerDesirability(); // add a comma-separated list of the names of desirous customers // along with their level of desire. Iterator i = f.customerRequestIterator(); if (i.hasNext()) { s += " ["; while (i.hasNext()) { CustomerRequest cr = (CustomerRequest)i.next(); s += cr.getCustomer().getName() + "(" + cr.getDesirability() + ")"; if (i.hasNext()) s += ","; } s += "]"; } else s += " [<none>]"; return s; } }