Skip to content

Instantly share code, notes, and snippets.

@pedrosan7os
Created November 13, 2014 10:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pedrosan7os/72890f08a2f57dd31bb5 to your computer and use it in GitHub Desktop.
Save pedrosan7os/72890f08a2f57dd31bb5 to your computer and use it in GitHub Desktop.
ExportAcademicAuthorizations
package pt.ist.fenix.webapp;
import java.util.HashSet;
import java.util.Set;
import net.sourceforge.fenixedu.domain.AcademicProgram;
import net.sourceforge.fenixedu.domain.Person;
import net.sourceforge.fenixedu.domain.accessControl.PersistentAccessGroup;
import net.sourceforge.fenixedu.domain.accessControl.UnitGroup;
import net.sourceforge.fenixedu.domain.accessControl.academicAdministration.AcademicOperationType;
import net.sourceforge.fenixedu.domain.accessControl.academicAdministration.PersistentAcademicAuthorizationGroup;
import net.sourceforge.fenixedu.domain.administrativeOffice.AdministrativeOffice;
import net.sourceforge.fenixedu.domain.organizationalStructure.AccountabilityTypeEnum;
import net.sourceforge.fenixedu.domain.organizationalStructure.Party;
import net.sourceforge.fenixedu.domain.organizationalStructure.Unit;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.bennu.core.groups.NobodyGroup;
import org.fenixedu.bennu.core.groups.UnionGroup;
import org.fenixedu.bennu.core.groups.UserGroup;
import org.fenixedu.bennu.scheduler.custom.CustomTask;
import org.joda.time.DateTime;
import pt.ist.fenixframework.Atomic.TxMode;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
public class ExportAcademicAuthorizations extends CustomTask {
@Override
public TxMode getTxMode() {
return TxMode.READ;
}
@Override
public void runTask() throws Exception {
JsonArray rules = new JsonArray();
for (PersistentAccessGroup persistentAccessGroup : Bennu.getInstance().getPersistentAccessGroupSet()) {
export(rules, (PersistentAcademicAuthorizationGroup) persistentAccessGroup, null);
}
for (PersistentAccessGroup persistentAccessGroup : Bennu.getInstance().getDeletedPersistentAccessGroupSet()) {
PersistentAcademicAuthorizationGroup academicRule = (PersistentAcademicAuthorizationGroup) persistentAccessGroup;
export(rules, academicRule, academicRule.getCreated());
}
output("rules.json", new GsonBuilder().setPrettyPrinting().create().toJson(rules).getBytes());
}
private void export(JsonArray rules, PersistentAcademicAuthorizationGroup academicRule, DateTime revoked) {
if (academicRule.getOldGroup() != null) {
export(rules, (PersistentAcademicAuthorizationGroup) academicRule.getOldGroup(), academicRule.getCreated());
}
JsonObject rule = new JsonObject();
AcademicOperationType operation = academicRule.getOperation();
if (operation.equals(AcademicOperationType.MANAGE_CONTRIBUTORS)) { // deleted operation
return;
}
rule.addProperty("operation", operation.name());
rule.addProperty("created", academicRule.getCreated().toString());
if (revoked != null) {
if (revoked.isBefore(academicRule.getCreated().plusSeconds(5))) {
return;
}
rule.addProperty("revoked", revoked.toString());
}
rule.addProperty("creator", academicRule.getCreator().getUsername());
rule.addProperty("group", convertGroup(academicRule.getMemberSet()));
if (!academicRule.getOfficeSet().isEmpty()) {
JsonArray offices = new JsonArray();
for (AdministrativeOffice office : academicRule.getOfficeSet()) {
offices.add(new JsonPrimitive(office.getExternalId()));
}
rule.add("offices", offices);
}
if (!academicRule.getProgramSet().isEmpty()) {
JsonArray programs = new JsonArray();
for (AcademicProgram program : academicRule.getProgramSet()) {
programs.add(new JsonPrimitive(program.getExternalId()));
}
rule.add("programs", programs);
}
rules.add(rule);
}
private String convertGroup(Set<Party> memberSet) {
Set<User> people = new HashSet<>();
Set<Unit> units = new HashSet<>();
for (Party party : memberSet) {
if (party instanceof Person) {
people.add(((Person) party).getUser());
} else {
units.add((Unit) party);
}
}
return UnionGroup.of(
UserGroup.of(people),
units.stream().map(u -> (Group) UnitGroup.get(u, AccountabilityTypeEnum.WORKING_CONTRACT, true))
.reduce((result, group) -> result.or(group)).orElseGet(NobodyGroup::get)).getExpression();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment