diff --git a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/InvalidFileContentException.java b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/InvalidFileContentException.java new file mode 100644 index 000000000..ad939847f --- /dev/null +++ b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/InvalidFileContentException.java @@ -0,0 +1,10 @@ +package edu.pdx.cs410J.grader.scoring; + +/** + * Created by sushamkumar on 9/1/17. + */ +public class InvalidFileContentException extends Exception { + public InvalidFileContentException() { super("Out file is corrupted"); } + public InvalidFileContentException(String message) { super(message); } + +} diff --git a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmission.java b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmission.java index cce95ed7f..f73c8230f 100644 --- a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmission.java +++ b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmission.java @@ -17,6 +17,13 @@ public class ProjectSubmission { private Double score; private String studentName; private Date submissionTime; + private Date gradedTime; + + + + public Date getGradedTime() {return gradedTime;} + + public void setGradedTime(Date gradedTime) {this.gradedTime = gradedTime;} public void setProjectName(String projectName) { this.projectName = projectName; diff --git a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParser.java b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParser.java index 8688dd8fd..cc87fc4f7 100644 --- a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParser.java +++ b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParser.java @@ -1,27 +1,116 @@ package edu.pdx.cs410J.grader.scoring; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; import java.io.Reader; +import java.io.StringReader; +import java.nio.CharBuffer; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; import java.util.Date; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Author: Susham Kumar */ public class ProjectSubmissionOutputFileParser { - public ProjectSubmissionOutputFileParser(Reader source) { + + private final BufferedReader bufferedReader; + private static final String SUBMITTEDBY="Submitted by"; + private static final String SUBMITTEDON="Submitted on"; + private static final String GRADEDON="Graded on"; + public ProjectSubmissionOutputFileParser(Reader source) { + if(source != null) { + bufferedReader = new BufferedReader(source); + } + else + throw new NullPointerException(); + } - public ProjectSubmission parse() { - throw new UnsupportedOperationException("Not implemented yet"); + public ProjectSubmission parse() throws ParseException, IOException, InvalidFileContentException { + + projectSubmission = new ProjectSubmission(); + String fileContents=null; + + + while((fileContents= bufferedReader.readLine()) !=null) { + fileContents=fileContents.trim(); + if(fileContents.contains("CS410J")){ // fileContents has the student Id and Project Name. + String[] splitContent=fileContents.split(Pattern.quote(".")); + projectSubmission.setProjectName(splitContent[splitContent.length -1]); + projectSubmission.setStudentId(splitContent[splitContent.length -2]); + + } + + if(fileContents.contains(SUBMITTEDBY)){ //fileContents has StudentName + String [] splitContent=fileContents.split(SUBMITTEDBY); + projectSubmission.setStudentName(splitContent[splitContent.length -1].trim()); + } + + if(fileContents.contains(SUBMITTEDON)){ //fileContents has Submission Time + String [] splitContent=fileContents.split(SUBMITTEDON); + projectSubmission.setSubmissionTime(parseSubmissionTime(splitContent[splitContent.length -1].trim())); + + } + + if(fileContents.contains(GRADEDON)){ //fileContents has Graded Time + String [] splitContent=fileContents.split(GRADEDON); + projectSubmission.setGradedTime(parseGradingTime(splitContent[splitContent.length -1].trim())); + } + + if(fileContents.contains("out of")){ //fileContents has Total Points and Awarded Points + + Pattern rightpattern = Pattern.compile("(?<=out of).*"); + Pattern leftpattern=Pattern.compile(".*(?=out of)"); + Matcher rightmatcher = rightpattern.matcher(fileContents); + Matcher leftmatcher = leftpattern.matcher(fileContents); + if (rightmatcher.find()) { + projectSubmission.setTotalPoints(Double.parseDouble(rightmatcher.group().trim())); + } + else + { + throw new InvalidFileContentException("Not able to retrieve Total Points"); + } + if(leftmatcher.find()){ + + projectSubmission.setScore(Double.parseDouble(leftmatcher.group().trim())); + } + else { + throw new InvalidFileContentException("Not able to retrieve the Score"); + } + } + } + return projectSubmission; } - public static Date parseSubmissionTime(String submissionTimeString) { - return null; + public static Date parseSubmissionTime(String submissionTimeString) throws ParseException { + + DateFormat format = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); + Date date = format.parse(submissionTimeString); + + return date; } - public static Date parseGradingTime(String gradingTimeString) { - return null; + public static Date parseGradingTime(String gradingTimeString) throws ParseException { + DateFormat gradingTimeFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); + String test= gradingTimeFormat.format(new Date()); + Date date = gradingTimeFormat.parse(gradingTimeString); + + return date; } + + + private ProjectSubmission projectSubmission; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); } diff --git a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionXmlConverter.java b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionXmlConverter.java index 97946f986..4b7cdb186 100644 --- a/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionXmlConverter.java +++ b/grader/src/main/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionXmlConverter.java @@ -9,70 +9,71 @@ import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.*; +import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ProjectSubmissionXmlConverter { - private final JAXBContext xmlContext; - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final JAXBContext xmlContext; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public ProjectSubmissionXmlConverter() throws JAXBException { - xmlContext = JAXBContext.newInstance(ProjectSubmission.class); - } + public ProjectSubmissionXmlConverter() throws JAXBException { + xmlContext = JAXBContext.newInstance(ProjectSubmission.class); + } - public void convertToXml(ProjectSubmission submission, Writer writer) throws JAXBException { - Marshaller marshaller = this.xmlContext.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - marshaller.marshal(submission, writer); - } + public void convertToXml(ProjectSubmission submission, Writer writer) throws JAXBException { + Marshaller marshaller = this.xmlContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(submission, writer); + } - public ProjectSubmission convertFromXml(Reader reader) throws JAXBException { - Unmarshaller unmarshaller = this.xmlContext.createUnmarshaller(); - return (ProjectSubmission) unmarshaller.unmarshal(reader); - } + public ProjectSubmission convertFromXml(Reader reader) throws JAXBException { + Unmarshaller unmarshaller = this.xmlContext.createUnmarshaller(); + return (ProjectSubmission) unmarshaller.unmarshal(reader); + } - public static void main(String... args) throws JAXBException { - List outFileNames = new ArrayList<>(); - outFileNames.addAll(Arrays.asList(args)); + public static void main(String... args) throws JAXBException { + List outFileNames = new ArrayList<>(); + outFileNames.addAll(Arrays.asList(args)); - if (outFileNames.isEmpty()) { - usage("Missing project submission out file name"); - } + if (outFileNames.isEmpty()) { + usage("Missing project submission out file name"); + } - ProjectSubmissionXmlConverter converter = new ProjectSubmissionXmlConverter(); - outFileNames.stream().map(File::new).forEach(converter::convertOutFileToXml); - } + ProjectSubmissionXmlConverter converter = new ProjectSubmissionXmlConverter(); + outFileNames.stream().map(File::new).forEach(converter::convertOutFileToXml); +} private void convertOutFileToXml(File outFile) { + + File xmlFile = null; if (!outFile.exists()) { logger.error("Output file \"" + outFile + "\" does not exist"); return; } - - ProjectSubmission submission; try { - ProjectSubmissionOutputFileParser parser = new ProjectSubmissionOutputFileParser(new FileReader(outFile)); - submission = parser.parse(); - } catch (FileNotFoundException e) { - logger.error("Could not file file " + outFile, e); - return; - } + ProjectSubmissionOutputFileParser parser = new ProjectSubmissionOutputFileParser(new FileReader(outFile)); + ProjectSubmission submission = parser.parse(); String outFileName = outFile.getName(); String filePrefix= outFileName.substring(outFileName.indexOf('.')); String xmlFileName = filePrefix + ".xml"; File directory = outFile.getParentFile(); - File xmlFile = new File(directory, xmlFileName); + xmlFile = new File(directory, xmlFileName); + - try { convertToXml(submission, new FileWriter(xmlFile)); - } catch (JAXBException | IOException e) { + } + catch (JAXBException | IOException e) { logger.error("While writing to " + xmlFile, e); } + catch (ParseException| InvalidFileContentException e) { + logger.error("Exception" + xmlFile, e); + } } diff --git a/grader/src/test/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParserTest.java b/grader/src/test/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParserTest.java index 4c27bbb88..1f66fb51d 100644 --- a/grader/src/test/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParserTest.java +++ b/grader/src/test/java/edu/pdx/cs410J/grader/scoring/ProjectSubmissionOutputFileParserTest.java @@ -3,9 +3,11 @@ import org.junit.Ignore; import org.junit.Test; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; +import java.text.ParseException; import java.util.Date; import java.util.List; @@ -25,7 +27,6 @@ public class ProjectSubmissionOutputFileParserTest { */ - @Ignore @Test public void parseProjectName() { OutputFile file = new OutputFile(); @@ -35,7 +36,6 @@ public void parseProjectName() { assertThat(submission.getProjectName(), equalTo("Project3")); } - @Ignore @Test public void parseStudentId() { OutputFile file = new OutputFile(); @@ -45,7 +45,6 @@ public void parseStudentId() { assertThat(submission.getStudentId(), equalTo("whitlock")); } - @Ignore @Test public void parseStudentName() { OutputFile file = new OutputFile(); @@ -56,9 +55,8 @@ public void parseStudentName() { assertThat(submission.getStudentName(), equalTo("David Whitlock")); } - @Ignore @Test - public void parseSubmissionTime() { + public void parseSubmissionTime() throws ParseException { OutputFile file = new OutputFile(); String submissionTimeString = "2017-Jul-28 19:51:41"; @@ -71,9 +69,9 @@ public void parseSubmissionTime() { assertThat(submission.getSubmissionTime(), equalTo(submissionTime)); } - @Ignore @Test - public void parseGradingTime() { + + public void parseGradingTime() throws ParseException { OutputFile file = new OutputFile(); String gradingTimeString = "Fri Jul 28 19:53:58 PDT 2017"; @@ -84,10 +82,10 @@ public void parseGradingTime() { ProjectSubmission submission = parse(file); Date gradingTime = ProjectSubmissionOutputFileParser.parseGradingTime(gradingTimeString); - assertThat(submission.getSubmissionTime(), equalTo(gradingTime)); + assertThat(submission.getGradedTime(), equalTo(gradingTime)); } - @Ignore + @Test public void parseTotalPoints() { OutputFile file = new OutputFile(); @@ -103,7 +101,7 @@ public void parseTotalPoints() { assertThat(submission.getTotalPoints(), equalTo(8.0)); } - @Ignore + @Test public void parseEmptyGrade() { OutputFile file = new OutputFile(); @@ -119,7 +117,7 @@ public void parseEmptyGrade() { assertThat(submission.getScore(), equalTo(null)); } - @Ignore + @Test public void parseSpecifiedGrade() { OutputFile file = new OutputFile(); @@ -185,7 +183,10 @@ public void parseCompilerTestWithNoOutput() { file.line(); file.line("***** Test 1: No arguments"); - ProjectSubmission submission = parse(file); + ProjectSubmission submission = null; + + submission = parse(file); + List testCases = submission.getTestCaseOutputs(); assertThat(testCases.size(), equalTo(2)); @@ -198,7 +199,7 @@ public void parseCompilerTestWithNoOutput() { @Ignore @Test - public void parseTest1() { + public void parseTest1() throws IOException, ParseException { OutputFile file = new OutputFile(); String testName = "Test 1"; String description = "No arguments"; @@ -234,9 +235,21 @@ public void parseTest1() { private ProjectSubmission parse(OutputFile file) { + ProjectSubmission projectSubmission = null; + try { String text = file.getText(); ProjectSubmissionOutputFileParser parser = new ProjectSubmissionOutputFileParser(new StringReader(text)); - return parser.parse(); + projectSubmission= parser.parse(); + + parser.parse(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InvalidFileContentException e) { + e.printStackTrace(); + } + return projectSubmission; } private class OutputFile {