001package edu.pdx.cs.joy.grader;
002
003import ch.qos.logback.classic.Level;
004import ch.qos.logback.classic.Logger;
005import com.google.common.annotations.VisibleForTesting;
006import edu.pdx.cs.joy.grader.canvas.GradesFromCanvasImporter;
007import edu.pdx.cs.joy.grader.gradebook.ui.GradeBookGUI;
008import edu.pdx.cs.joy.grader.poa.ui.PlanOfAttackGrader;
009import org.slf4j.LoggerFactory;
010
011import java.io.PrintStream;
012import java.lang.reflect.InvocationTargetException;
013import java.lang.reflect.Method;
014import java.util.ArrayList;
015import java.util.List;
016
017public class GraderTools {
018
019  public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
020    String tool = null;
021    List<String> toolArgs = new ArrayList<>();
022    for (String arg : args) {
023      if (arg.equals("-debug")) {
024        setLoggingLevelToDebug();
025
026      } else if (tool == null) {
027        tool = arg;
028
029      } else {
030        toolArgs.add(arg);
031      }
032    }
033
034    if (tool == null) {
035      usage("Missing tool");
036    }
037
038
039    invokeMainMethod(getToolClass(tool), toolArgs.toArray(new String[toolArgs.size()]));
040  }
041
042  @VisibleForTesting
043  static void setLoggingLevelToDebug() {
044    Logger logger = (Logger) LoggerFactory.getLogger("edu.pdx.cs.joy.grader");
045    logger.setLevel(Level.DEBUG);
046  }
047
048  private static Class getToolClass(String tool) {
049    switch (tool) {
050      case "gradebook":
051        return GradeBookGUI.class;
052
053      case "fetch":
054        return FetchAndProcessGraderEmail.class;
055
056      case "importFromCanvas" :
057        return GradesFromCanvasImporter.class;
058
059      case "importFromProjectReports" :
060        return ProjectGradesImporter.class;
061
062      case "mailFileToStudent" :
063        return StudentFileMailer.class;
064
065      case "gradePOAs":
066        return PlanOfAttackGrader.class;
067
068      case "generateGradeSummary":
069        return SummaryReport.class;
070
071      case "htmlForSurveyResults":
072        return SurveyResponsesFromD2LGenerator.class;
073
074      case "fixAndroidZips":
075        return AndroidZipFixer.class;
076
077      case "projectTimeEstimates":
078        return ProjectTimeEstimatesSummary.class;
079
080      case "generateStudentInitialsFile":
081        return GenerateStudentInitialsFile.class;
082
083      case "findUngradedSubmissions":
084        return FindUngradedSubmissions.class;
085
086      default:
087        usage("Unknown tool: " + tool);
088        return null;
089    }
090  }
091
092  @SuppressWarnings("unchecked")
093  private static void invokeMainMethod(Class aClass, String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
094    Method main = aClass.getMethod("main", args.getClass());
095    main.invoke(aClass, new Object[] { args });
096
097  }
098
099  private static void usage(String message) {
100    PrintStream err = System.err;
101    err.println("** " + message);
102    err.println();
103    err.println("Executes one of the Grader tools");
104    err.println();
105    err.println("usage: GraderTools tool toolArg*");
106    err.println("  tool                           The tool to execute");
107    err.println("    gradebook                    The Grade Book GUI");
108    err.println("    fetch                        Fetch student surveys or projects from the Grader's");
109    err.println("                                 emails account");
110    err.println("    importFromCanvas             Import grades from a Canvas CSV");
111    err.println("    importFromProjectReports     Import grades from graded project reports");
112    err.println("    mailFileToStudent            Email text files to students");
113    err.println("    gradePOAs                    Tool for downloading and grading POAs");
114    err.println("    generateGradeSummary         Generate grade summary report for one or more students");
115    err.println("    htmlForSurveyResults         Generate an html file for the responses to a D2L survey");
116    err.println("    fixAndroidZips               Fix zip files for the Android project to work with grading script");
117    err.println("    projectTimeEstimates         Generate markdown that summarizes the estimated project hours");
118    err.println("    generateStudentInitialsFile  Generate a list of student initials from a grade book");
119    err.println("    findUngradedSubmissions      List submissions that need to be tested or graded");
120    err.println("  toolArg                        A command line argument to send to the tool");
121    err.println();
122
123    System.exit(1);
124  }
125}