Last active
August 29, 2015 14:19
-
-
Save NunoPinheiro/9fd5bb667e8b1d77de03 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.fenixedu.academic.task; | |
import java.sql.ResultSet; | |
import java.sql.SQLException; | |
import java.sql.Statement; | |
import java.util.HashMap; | |
import java.util.Locale; | |
import java.util.Map; | |
import java.util.stream.Collector; | |
import java.util.stream.Collector.Characteristics; | |
import org.fenixedu.academic.domain.student.StudentStatute; | |
import org.fenixedu.academic.domain.student.StudentStatuteType; | |
import org.fenixedu.academic.util.Bundle; | |
import org.fenixedu.academic.util.ConnectionManager; | |
import org.fenixedu.bennu.core.domain.Bennu; | |
import org.fenixedu.bennu.core.i18n.BundleUtil; | |
import org.fenixedu.bennu.scheduler.custom.CustomTask; | |
import org.fenixedu.commons.i18n.LocalizedString; | |
import pt.ist.fenixframework.Atomic.TxMode; | |
import com.google.gson.JsonArray; | |
import com.google.gson.JsonElement; | |
public class DumpStatutes extends CustomTask { | |
private static final String ORG_FENIXEDU_ACADEMIC_DOMAIN_STUDENT_STATUTE_TYPE = | |
"org.fenixedu.academic.domain.student.StatuteType"; | |
private static final int UNIQUE_CLASSID_SALT = 23; | |
@Override | |
public void runTask() throws Exception { | |
int classId = findNextClassId(); | |
StringBuilder builder = new StringBuilder(); | |
long oid = ((long) classId << 32); | |
out(builder, "INSERT INTO FF$DOMAIN_CLASS_INFO (DOMAIN_CLASS_NAME, DOMAIN_CLASS_ID) VALUES ('%s', %s);\n", | |
ORG_FENIXEDU_ACADEMIC_DOMAIN_STUDENT_STATUTE_TYPE, classId); | |
Map<StudentStatuteType, Long> oidMap = new HashMap<>(); | |
for (StudentStatuteType enumType : StudentStatuteType.values()) { | |
String enumNameKey = StudentStatuteType.class.getSimpleName() + "." + enumType.name(); | |
LocalizedString typeName = | |
new LocalizedString(Locale.getDefault(), BundleUtil.getString(Bundle.ENUMERATION, Locale.getDefault(), | |
enumNameKey)); | |
typeName.with(Locale.ENGLISH, BundleUtil.getString(Bundle.ENUMERATION, Locale.ENGLISH, enumNameKey)); | |
boolean appliedOnRegistration = (enumType == StudentStatuteType.SENIOR); | |
boolean grantsWorkingStudentStatute = (enumType == StudentStatuteType.WORKING_STUDENT); | |
boolean associativeLeaderStatute = (enumType == StudentStatuteType.ASSOCIATIVE_LEADER); | |
boolean specialSeasonGrantedByRequest = (enumType == StudentStatuteType.SPECIAL_SEASON_GRANTED_BY_REQUEST); | |
boolean grantOwnerStatute = (enumType == StudentStatuteType.SAS_GRANT_OWNER); | |
boolean seniorStatute = (enumType == StudentStatuteType.SENIOR); | |
boolean handicappedStatute = (enumType == StudentStatuteType.HANDICAPPED); | |
boolean specialSeasonGranted = enumType.isSpecialSeasonGranted(); | |
boolean active = true; | |
boolean explicitCreation = enumType.isExplicitCreation(); | |
boolean visible = enumType.isVisible(); | |
String externalId = Bennu.getInstance().getExternalId(); | |
oidMap.put(enumType, ++oid); | |
out(builder, | |
"INSERT INTO STATUTE_TYPE (CODE, NAME, APPLIED_ON_REGISTRATION, GRANTS_WORKING_STUDENT_STATUTE, ASSOCIATIVE_LEADER_STATUTE, " | |
+ "SPECIAL_SEASON_GRANTED_BY_REQUEST, GRANT_OWNER_STATUTE, SENIOR_STATUTE, HANDICAPPED_STATUTE, SPECIAL_SEASON_GRANTED, ACTIVE, EXPLICIT_CREATION, VISIBLE, OID_ROOT_DOMAIN_OBJECT) " | |
+ "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s'); -- %s\n", enumNameKey, 'typeName | |
.json().toString()', appliedOnRegistration, grantsWorkingStudentStatute, associativeLeaderStatute, | |
specialSeasonGrantedByRequest, grantOwnerStatute, seniorStatute, handicappedStatute, specialSeasonGranted, | |
active, explicitCreation, visible, externalId, enumNameKey); | |
} | |
for (StudentStatute statute : Bennu.getInstance().getStudentStatutesSet()) { | |
out(builder, "UPDATE STUDENT_STATUTE SET OID_TYPE = %s WHERE OID = %s;\n", oidMap.get(statute.getStatuteType()), | |
statute.getExternalId()); | |
} | |
output("dumpStatutes.sql", builder.toString().getBytes()); | |
taskLog(builder.toString()); | |
} | |
private static void out(StringBuilder builder, String format, Object... args) { | |
builder.append(String.format(format, args)); | |
} | |
private int findNextClassId(String type) throws SQLException { | |
int classId; | |
try (Statement stmt = ConnectionManager.getCurrentSQLConnection().createStatement()) { | |
try (ResultSet rs = stmt.executeQuery("select MAX(DOMAIN_CLASS_ID) from FF$DOMAIN_CLASS_INFO")) { | |
rs.next(); | |
classId = rs.getInt(1) + 1; | |
} | |
} | |
try (PreparedStatement stmt = | |
ConnectionManager.getCurrentSQLConnection().prepareStatement( | |
"INSERT INTO FF$DOMAIN_CLASS_INFO (DOMAIN_CLASS_ID, DOMAIN_CLASS_NAME) VALUES (?,?)")) { | |
stmt.setInt(1, classId); | |
stmt.setString(2, type); | |
stmt.executeUpdate(); | |
} | |
return classId; | |
} | |
public static <T extends JsonElement> Collector<T, JsonArray, JsonArray> toJsonArray() { | |
return Collector.of(JsonArray::new, (array, element) -> array.add(element), (one, other) -> { | |
one.addAll(other); | |
return one; | |
}, Characteristics.IDENTITY_FINISH); | |
} | |
@Override | |
public TxMode getTxMode() { | |
return TxMode.READ; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment