package fi.otavanopisto.muikku.schooldata.events;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import fi.otavanopisto.muikku.model.users.UserGroupEntity;
import fi.otavanopisto.muikku.model.users.UserGroupUserEntity;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier;
import fi.otavanopisto.muikku.users.UserGroupEntityController;
import fi.otavanopisto.muikku.users.UserSchoolDataIdentifierController;
public class DefaultSchoolDataUserGroupListener {
@Inject
private Logger logger;
@Inject
private UserGroupEntityController userGroupEntityController;
@Inject
private UserSchoolDataIdentifierController userSchoolDataIdentifierController;
@PostConstruct
public void init() {
discoveredUserGroups = new HashMap<>();
discoveredUserGroupUsers = new HashMap<>();
}
private String getUserGroupDiscoveryId(String dataSource, String identifier) {
return "DUG-" + dataSource + "/" + identifier;
}
private String getUserGroupUserDiscoveryId(String dataSource, String identifier) {
return "DUGU-" + dataSource + "/" + identifier;
}
public void onSchoolDataUserGroupDiscoveredEvent(@Observes SchoolDataUserGroupDiscoveredEvent event) {
String discoverId = getUserGroupDiscoveryId(event.getDataSource(), event.getIdentifier());
if (discoveredUserGroups.containsKey(discoverId)) {
event.setDiscoveredUserGroupEntityId(discoveredUserGroups.get(discoverId));
return;
}
UserGroupEntity userGroupEntity = userGroupEntityController.findUserGroupEntityByDataSourceAndIdentifier(event.getDataSource(), event.getIdentifier(), true);
if ((userGroupEntity == null) || (userGroupEntity.getArchived())) {
if (userGroupEntity == null) {
userGroupEntity = userGroupEntityController.createUserGroupEntity(event.getDataSource(), event.getIdentifier());
}
else {
userGroupEntityController.unarchiveUserGroupEntity(userGroupEntity);
}
discoveredUserGroups.put(discoverId, userGroupEntity.getId());
event.setDiscoveredUserGroupEntityId(userGroupEntity.getId());
} else {
logger.warning("UserGroupEntity for " + event.getIdentifier() + "/" + event.getDataSource() + " already exists");
}
}
public void onSchoolDataUserGroupRemovedEvent(@Observes SchoolDataUserGroupRemovedEvent event) {
UserGroupEntity userGroupEntity = userGroupEntityController.findUserGroupEntityByDataSourceAndIdentifier(event.getDataSource(), event.getIdentifier());
if (userGroupEntity != null) {
userGroupEntityController.archiveUserGroupEntity(userGroupEntity);
}
}
public void onSchoolDataUserGroupUpdatedEvent(@Observes SchoolDataUserGroupUpdatedEvent event) {
}
public void onSchoolDataUserGroupUserDiscoveredEvent(@Observes SchoolDataUserGroupUserDiscoveredEvent event) {
String discoverId = getUserGroupUserDiscoveryId(event.getDataSource(), event.getIdentifier());
if (discoveredUserGroupUsers.containsKey(discoverId)) {
event.setDiscoveredUserGroupUserEntityId(discoveredUserGroupUsers.get(discoverId));
return;
}
UserGroupEntity userGroupEntity = userGroupEntityController.findUserGroupEntityByDataSourceAndIdentifier(event.getUserGroupDataSource(), event.getUserGroupIdentifier(), true);
if (userGroupEntity != null) {
if (!userGroupEntity.getArchived()) {
UserGroupUserEntity userGroupUserEntity = userGroupEntityController.findUserGroupUserEntityByDataSourceAndIdentifier(event.getDataSource(), event.getIdentifier(), true);
if ((userGroupUserEntity == null) || (userGroupUserEntity.getArchived())) {
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierByDataSourceAndIdentifier(event.getUserDataSource(), event.getUserIdentifier());
if (userSchoolDataIdentifier != null) {
if (userGroupUserEntity == null) {
userGroupUserEntity = userGroupEntityController.createUserGroupUserEntity(userGroupEntity, event.getDataSource(), event.getIdentifier(), userSchoolDataIdentifier);
}
else {
userGroupEntityController.unarchiveUserGroupUserEntity(userGroupUserEntity);
userGroupEntityController.updateUserSchoolDataIdentifier(userGroupUserEntity, userSchoolDataIdentifier);
}
discoveredUserGroupUsers.put(discoverId, userGroupUserEntity.getId());
event.setDiscoveredUserGroupUserEntityId(userGroupUserEntity.getId());
} else {
logger.warning("could not add group user because UserSchoolDataIdentifier for " + event.getUserIdentifier() + "/" + event.getUserDataSource() + " wasn't found");
}
} else {
logger.warning("UserGroupUserEntity for " + event.getIdentifier() + "/" + event.getDataSource() + " already exists");
}
}
} else {
logger.warning("could not init user group user because usergroup #" + event.getUserGroupIdentifier() + '/' + event.getUserGroupDataSource() + " could not be found");
}
}
public void onSchoolDataUserGroupUserRemovedEvent(@Observes SchoolDataUserGroupUserRemovedEvent event) {
String discoverId = getUserGroupUserDiscoveryId(event.getDataSource(), event.getIdentifier());
discoveredUserGroupUsers.remove(discoverId);
UserGroupUserEntity userGroupUserEntity = userGroupEntityController.findUserGroupUserEntityByDataSourceAndIdentifier(event.getDataSource(), event.getIdentifier());
if (userGroupUserEntity != null) {
userGroupEntityController.archiveUserGroupUserEntity(userGroupUserEntity);
}
}
public void onSchoolDataUserGroupUserUpdatedEvent(@Observes SchoolDataUserGroupUserUpdatedEvent event) {
UserGroupUserEntity userGroupUserEntity = userGroupEntityController.findUserGroupUserEntityByDataSourceAndIdentifier(event.getDataSource(), event.getIdentifier());
UserGroupEntity userGroupEntity = userGroupEntityController.findUserGroupEntityByDataSourceAndIdentifier(event.getUserGroupDataSource(), event.getUserGroupIdentifier());
if ((userGroupUserEntity != null) && (userGroupEntity != null)) {
userGroupEntityController.updateUserGroupEntity(userGroupUserEntity, userGroupEntity);
} else
logger.warning(String.format("Couldn't find userGroupUserEntity (%s) or userGroupEntity (%s)", event.getIdentifier(), event.getUserGroupIdentifier()));
}
private Map<String, Long> discoveredUserGroups;
private Map<String, Long> discoveredUserGroupUsers;
}