Skip to content

Instantly share code, notes, and snippets.

@NunoPinheiro
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save NunoPinheiro/9fd5bb667e8b1d77de03 to your computer and use it in GitHub Desktop.
Save NunoPinheiro/9fd5bb667e8b1d77de03 to your computer and use it in GitHub Desktop.
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