package pt.utl.ist.scripts.runOnce; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import net.sourceforge.fenixedu.domain.Degree; import net.sourceforge.fenixedu.domain.Enrolment; import net.sourceforge.fenixedu.domain.ExecutionSemester; import net.sourceforge.fenixedu.domain.ExecutionYear; import net.sourceforge.fenixedu.domain.Grade; import net.sourceforge.fenixedu.domain.StudentCurricularPlan; import net.sourceforge.fenixedu.domain.degreeStructure.CycleType; import net.sourceforge.fenixedu.domain.student.Registration; import net.sourceforge.fenixedu.domain.student.Student; import pt.utl.ist.scripts.commons.AtomicScript; public class CreateRDPTable extends AtomicScript { public static void main(String[] args) { process(new CreateRDPTable()); System.out.flush(); System.err.flush(); System.exit(0); } @SuppressWarnings("deprecation") public static String slurp(String path) { File file = new File(path); FileInputStream fis = null; BufferedInputStream bis = null; DataInputStream dis = null; String s = ""; try { fis = new FileInputStream(file); // Here BufferedInputStream is added for fast reading. bis = new BufferedInputStream(fis); dis = new DataInputStream(bis); // dis.available() returns 0 if the file does not have more lines. while (dis.available() != 0) { // this statement reads the line from the file and print it to // the console. s += dis.readLine() + "\n"; } // dispose all the resources after using them. fis.close(); bis.close(); dis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return s; } @Override protected void run() throws Exception { final ExecutionYear executionYear = ExecutionYear.readCurrentExecutionYear(); String s = slurp("/tmp/student.csv"); String[] numbers = s.split("\n"); File out = new File("/tmp/outputTable.csv"); FileOutputStream fos = new FileOutputStream(out); for (String number : numbers) { System.out.println("Processing: " + number); Student student = Student.readStudentByNumber(Integer.valueOf(number)); BigDecimal ECTSApproved = new BigDecimal(0); BigDecimal ECTSEnroled = new BigDecimal(0); int totalClassification = 0; int curricularUnits = 0; Registration lastRegistration = null; for (Registration registration : student.getRegistrations()) { if (lastRegistration == null || lastRegistration.getStartDate().isAfter(registration.getStartDate())) { lastRegistration = registration; } // if // (registration.getEnrolments(ExecutionYear.readCurrentExecutionYear().getPreviousExecutionYear()).size() // > 0) { for (StudentCurricularPlan plan : registration.getStudentCurricularPlansSet()) { for (Enrolment enrolment : plan.getEnrolments()) { if (enrolment.getExecutionPeriod().isBefore(ExecutionSemester.readActualExecutionSemester())) { if (enrolment.isAproved(null)) { Grade grade = enrolment.getGrade(); ECTSApproved = ECTSApproved.add(enrolment.getEctsCreditsForCurriculum()); if (grade.isNumeric()) { totalClassification += grade.getIntegerValue(); curricularUnits++; } } ECTSEnroled = ECTSEnroled.add(enrolment.getEctsCreditsForCurriculum()); } } } // } } double result; double A = ECTSEnroled.longValue() != 0 ? ECTSApproved.divide(ECTSEnroled, 5, RoundingMode.HALF_EVEN).doubleValue() : 0; double B = ((curricularUnits != 0) ? ((double) totalClassification) / ((double) (curricularUnits * 20)) : 0); result = 100 * (A + B); final Degree degree = lastRegistration.getDegree(); final String degreeCode = degree.getSigla(); final CycleType cycleType = lastRegistration.getCycleType(executionYear); final StringBuilder builder = new StringBuilder(); builder.append(number); builder.append(","); builder.append(student.getPerson().getName()); builder.append(","); builder.append(degree.getDegreeType().getLocalizedName()); builder.append(","); builder.append(degreeCode); builder.append(","); builder.append(cycleType == null ? " " : cycleType.getDescription()); builder.append(","); builder.append(ECTSApproved.longValue()); builder.append(","); builder.append(ECTSEnroled.longValue()); builder.append(","); builder.append(totalClassification); builder.append(","); builder.append((double) (curricularUnits * 20)); builder.append(","); builder.append(round2Decimals(A)); builder.append(","); builder.append(round2Decimals(B)); builder.append(","); builder.append(round(result)); builder.append("\n"); final String string = builder.toString(); System.out.println(string); fos.write(string.getBytes()); } fos.close(); } private static long round(final double d) { return Math.round(d); } private final static BigDecimal ONE = new BigDecimal(1); private static BigDecimal round2Decimals(final double d) { final BigDecimal b = new BigDecimal(d); return round2Decimals(b); } private static BigDecimal round2Decimals(final BigDecimal b) { return b.divide(ONE, 2, BigDecimal.ROUND_HALF_EVEN); } }