package fi.otavanopisto.muikku.plugins.search; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.enterprise.event.Observes; import javax.enterprise.event.TransactionPhase; import javax.inject.Inject; import fi.otavanopisto.muikku.schooldata.SchoolDataBridgeSessionController; import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier; import fi.otavanopisto.muikku.schooldata.entity.UserGroup; import fi.otavanopisto.muikku.schooldata.entity.Workspace; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupDiscoveredEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupRemovedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUpdatedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserDiscoveredEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserRemovedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserGroupUserUpdatedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataUserUpdatedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceDiscoveredEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceRemovedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceUpdatedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceUserDiscoveredEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceUserRemovedEvent; import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceUserUpdatedEvent; import fi.otavanopisto.muikku.search.SearchIndexer; import fi.otavanopisto.muikku.users.UserGroupController; @Stateless public class SchoolDataIndexListeners { @Inject private Logger logger; @Inject private SchoolDataBridgeSessionController schoolDataBridgeSessionController; @Inject private UserGroupController userGroupController; @Inject private SearchIndexer indexer; @Inject private UserIndexer userIndexer; @Inject private WorkspaceIndexer workspaceIndexer; public void onSchoolDataWorkspaceDiscoveredEvent(@Observes (during = TransactionPhase.BEFORE_COMPLETION) SchoolDataWorkspaceDiscoveredEvent event) { workspaceIndexer.indexWorkspace(event.getDataSource(), event.getIdentifier()); } public void onSchoolDataWorkspaceUpdatedEvent(@Observes SchoolDataWorkspaceUpdatedEvent event) { workspaceIndexer.indexWorkspace(event.getDataSource(), event.getIdentifier()); } public void onSchoolDataWorkspaceRemovedEvent(@Observes SchoolDataWorkspaceRemovedEvent event) { indexer.remove(Workspace.class.getSimpleName(), event.getSearchId()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataWorkspaceUserDiscoveredEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataWorkspaceUserDiscoveredEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataWorkspaceUserUpdatedEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataWorkspaceUserUpdatedEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataWorkspaceUserRemovedEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataWorkspaceUserRemovedEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } public void onSchoolDataUserUpdatedEvent(@Observes SchoolDataUserUpdatedEvent event) { List<SchoolDataIdentifier> removeIdentifiers = new ArrayList<>(event.getRemovedIdentifiers()); List<SchoolDataIdentifier> updatedIdentifiers = new ArrayList<>(event.getDiscoveredIdentifiers()); updatedIdentifiers.addAll(event.getUpdatedIdentifiers()); for (SchoolDataIdentifier identifier : updatedIdentifiers) { userIndexer.indexUser(identifier.getDataSource(), identifier.getIdentifier()); } for (SchoolDataIdentifier identifier : removeIdentifiers) { userIndexer.removeUser(identifier.getDataSource(), identifier.getIdentifier()); } } public void onSchoolDataUserGroupDiscoveredEvent(@Observes SchoolDataUserGroupDiscoveredEvent event) { schoolDataBridgeSessionController.startSystemSession(); try { UserGroup userGroup = userGroupController.findUserGroup(event.getDataSource(), event.getIdentifier()); if (userGroup != null) { indexer.index(UserGroup.class.getSimpleName(), userGroup); } else { logger.warning("could not index user group because user group '" + event.getIdentifier() + '/' + event.getDataSource() + "' could not be found"); } } finally { schoolDataBridgeSessionController.endSystemSession(); } } public void onSchoolDataUserGroupRemovedEvent(@Observes SchoolDataUserGroupRemovedEvent event) { indexer.remove(UserGroup.class.getSimpleName(), event.getSearchId()); } public void onSchoolDataUserGroupUpdatedEvent(@Observes SchoolDataUserGroupUpdatedEvent event) { schoolDataBridgeSessionController.startSystemSession(); try { UserGroup userGroup = userGroupController.findUserGroup(event.getDataSource(), event.getIdentifier()); if (userGroup != null) { indexer.index(UserGroup.class.getSimpleName(), userGroup); } else { logger.warning("could not index user group because user group '" + event.getIdentifier() + '/' + event.getDataSource() + "' could not be found"); } } finally { schoolDataBridgeSessionController.endSystemSession(); } } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataUserGroupUserDiscoveredEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataUserGroupUserDiscoveredEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataUserGroupUserUpdatedEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataUserGroupUserUpdatedEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void onSchoolDataUserGroupUserRemovedEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataUserGroupUserRemovedEvent event) { userIndexer.indexUser(event.getUserDataSource(), event.getUserIdentifier()); } }