blob: 8e48cd56845d661bf5124d92e0433e4d9edede5b [file] [log] [blame]
/**
******************************************************************************
* Copyright © 2017-2018 PTA GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
******************************************************************************
*/
package org.eclipse.openk.elogbook.controller;
import static org.eclipse.openk.elogbook.common.mapper.ResponsibilityMapper.PROCESS_MODE.CONFIRM;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.log4j.Logger;
import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
import org.eclipse.openk.elogbook.common.mapper.HResponsibilityMapper;
import org.eclipse.openk.elogbook.common.mapper.ResponsibilityMapper;
import org.eclipse.openk.elogbook.common.util.Comparators.TblResponsibilityIdComparator;
import org.eclipse.openk.elogbook.exceptions.BtbException;
import org.eclipse.openk.elogbook.exceptions.BtbGone;
import org.eclipse.openk.elogbook.exceptions.BtbInternalServerError;
import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
import org.eclipse.openk.elogbook.persistence.dao.HTblResponsibilityDao;
import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
import org.eclipse.openk.elogbook.persistence.dao.TblResponsibilityDao;
import org.eclipse.openk.elogbook.persistence.model.HTblResponsibility;
import org.eclipse.openk.elogbook.persistence.model.TblResponsibility;
import org.eclipse.openk.elogbook.viewmodel.HistoricalShiftChanges;
import org.eclipse.openk.elogbook.viewmodel.ResponsibilitySearchFilter;
import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
public class BackendControllerResponsibility {
private static final Logger LOGGER = Logger.getLogger(BackendControllerResponsibility.class.getName());
public static final String MSG_DATA_OUTDATED_CATCHING_NEW_DATASET = "Data outdated catching new dataset";
public enum POST_RESPONSIBILITY_MODE { PLAN, FETCH }
private static ResponsibilityMapper responsibilityMapper = null;
private static HResponsibilityMapper historicalResponsibilityMapper = null;
public List<TerritoryResponsibility> getCurrentResponsibilities(String modUser) {
LOGGER.debug("getCurrentResponsibilities() is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
List<TblResponsibility> tblResponsibilityList;
List<TerritoryResponsibility> territoryResponsibilities;
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
TblResponsibilityDao dao = new TblResponsibilityDao(em);
tblResponsibilityList = dao.getResponsibilitiesForUser(modUser);
territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
} finally {
LOGGER.debug("getCurrentResponsibilities is finished");
}
LOGGER.debug("getCurrentResponsibilities() finished");
return territoryResponsibilities;
}
public List<TerritoryResponsibility> getPlannedResponsibilities(String modUser) {
LOGGER.debug("getPlannedResponsibilities() is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
List<TblResponsibility> tblResponsibilityList;
List<TerritoryResponsibility> territoryResponsibilities;
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
TblResponsibilityDao dao = new TblResponsibilityDao(em);
tblResponsibilityList = dao.getPlannedResponsibilitiesForUser(modUser);
territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
} finally {
LOGGER.debug("getPlannedResponsibilities is finished");
}
LOGGER.debug("getPlannedResponsibilities() finished");
return territoryResponsibilities;
}
public List<TerritoryResponsibility> getAllResponsibilities() {
LOGGER.debug("getAllResponsibilities() is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
List<TblResponsibility> tblResponsibilityList;
List<TerritoryResponsibility> territoryResponsibilities;
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
TblResponsibilityDao dao = new TblResponsibilityDao(em);
tblResponsibilityList = dao.getAllResponsibilities();
territoryResponsibilities = getResponsibilityMapper(em).mapToContainerVModelList(tblResponsibilityList);
} finally {
LOGGER.debug("getAllResponsibilities is finished");
}
LOGGER.debug("getAllResponsibilities() finished");
return territoryResponsibilities;
}
public List<TerritoryResponsibility> getHistoricalResponsibilitiesByTransactionId(Integer transactionId) {
LOGGER.debug("getHistoricalResponsibilitiesByTransactionId is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
List<HTblResponsibility> htblResponsibilityList;
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
HTblResponsibilityDao hdao = new HTblResponsibilityDao(em);
htblResponsibilityList = hdao.getHistoricalResponsibilitiesByTransactionId(transactionId);
return getHistoricalResponsibilityMapper(em).mapToContainerVModelList(htblResponsibilityList);
} finally {
LOGGER.debug("getHistoricalResponsibilitiesByTransactionId is finished");
}
}
public List<TerritoryResponsibility> postResponsibilities(List<TerritoryResponsibility> territoryResponsibilityList,
String modUser, POST_RESPONSIBILITY_MODE mode ) throws BtbException {
LOGGER.debug("postResponsibilities is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
em.getTransaction().begin();
TblResponsibilityDao tblResponsibilityDao = new TblResponsibilityDao(em);
List<TerritoryResponsibility> territoryResponsibilities;
if( mode == POST_RESPONSIBILITY_MODE.PLAN ) {
territoryResponsibilities = storePlannedResponsibilitiesInDB(
territoryResponsibilityList, tblResponsibilityDao, getResponsibilityMapper(em), modUser);
}
else {
territoryResponsibilities = storeFetchedResponsibilitiesInDB(
territoryResponsibilityList, tblResponsibilityDao, getResponsibilityMapper(em), modUser);
}
em.getTransaction().commit();
return territoryResponsibilities;
} finally {
LOGGER.debug("postResponsibilities is finished");
}
}
public List<TerritoryResponsibility> confirmResponsibilities(
List<TerritoryResponsibility> territoryResponsibilityList, String modUser) throws BtbException {
LOGGER.debug("confirmResponsibilities is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
em.getTransaction().begin();
TblResponsibilityDao tblResponsibilityDao = new TblResponsibilityDao(em);
HTblResponsibilityDao htblResponsibilityDao = new HTblResponsibilityDao(em);
List<TblResponsibility> plannedResponsibilitiesCurrentUser = tblResponsibilityDao
.getPlannedResponsibilitiesForUser(modUser);
List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser = new ArrayList<>();
for (TblResponsibility tblResponsibility : plannedResponsibilitiesCurrentUser) {
originalPlannedResponsibilitiesCurrentUser
.add((TblResponsibility) SerializationUtils.clone(tblResponsibility));
}
List<TerritoryResponsibility> territoryResponsibilities;
try {
territoryResponsibilities = storeConfirmedResponsibilitiesInDBAndHistorize(territoryResponsibilityList,
tblResponsibilityDao, htblResponsibilityDao, getResponsibilityMapper(em), modUser,
plannedResponsibilitiesCurrentUser, originalPlannedResponsibilitiesCurrentUser);
} catch (BtbGone btbGone) {
LOGGER.debug(MSG_DATA_OUTDATED_CATCHING_NEW_DATASET, btbGone);
em.getTransaction().rollback();
return getResponsibilityMapper(em).mapToContainerVModelList(originalPlannedResponsibilitiesCurrentUser);
}
em.getTransaction().commit();
return territoryResponsibilities;
} finally {
LOGGER.debug("confirmResponsibilities is finished");
}
}
/**
* Find all shift changes between start date and end date (given as parameters) and return them in a list.
*
* @param filter
* the {@link ResponsibilitySearchFilter}
* @return a list containing all shift changes over the specified period
* @throws BtbException
* if an error occurs
*/
public HistoricalShiftChanges getHistoricalShiftChanges(ResponsibilitySearchFilter filter) throws BtbException {
LOGGER.debug("getHistgoricalShiftChanges(responsibilitySearchFilter) is called");
LOGGER.debug("-> ResponsibilitySearchFilter=" + JsonGeneratorBase.getGson().toJson(filter));
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
HTblResponsibilityDao hTblResponsibilityDao = new HTblResponsibilityDao();
Date transferDateFrom = filter.getTransferDateFrom();
Date transferDateTo = filter.getTransferDateTo();
List<HTblResponsibility> hTblResponsibilities = hTblResponsibilityDao
.findHTblResponsibilitiesInPeriod(transferDateFrom, transferDateTo);
return getHistoricalResponsibilityMapper(em).mapTblResponsibilitiesInPeriod(hTblResponsibilities,
transferDateFrom, transferDateTo);
} finally {
LOGGER.debug("getHistoricalShiftChanges() is finished");
}
}
public Boolean getIsObserver(String modUser) {
LOGGER.debug("getIsObserver() is called");
EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
boolean isObserver = false;
try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
TblResponsibilityDao dao = new TblResponsibilityDao(em);
List<TblResponsibility> tblResponsibilityList = dao.getNewOrCurrentResponisbleUser(modUser);
if (tblResponsibilityList.isEmpty()) {
isObserver = true;
}
} finally {
LOGGER.debug("getIsObserver is finished");
}
LOGGER.debug("getIsObserver() finished");
return isObserver;
}
private synchronized ResponsibilityMapper getResponsibilityMapper(EntityManager em) {
if (responsibilityMapper == null) {
LOGGER.debug("ResponsibilityMapper initializing");
responsibilityMapper = new ResponsibilityMapper();
}
return responsibilityMapper;
}
private synchronized HResponsibilityMapper getHistoricalResponsibilityMapper(EntityManager em) {
if (historicalResponsibilityMapper == null) {
LOGGER.debug("HistoricalResponsibilityMapper initializing");
historicalResponsibilityMapper = new HResponsibilityMapper(new RefGridTerritoryDao(em),
new RefBranchDao(em));
}
return historicalResponsibilityMapper;
}
private static List<TerritoryResponsibility> storeFetchedResponsibilitiesInDB(
List<TerritoryResponsibility> territoryResponsibilityList,
TblResponsibilityDao tdao,
ResponsibilityMapper responsibilityMapper,
String modUser) throws BtbInternalServerError {
if (territoryResponsibilityList != null && !territoryResponsibilityList.isEmpty()) {
List<TblResponsibility> allResp = tdao.getAllResponsibilities();
List<TblResponsibility> tblResponsibilityList;
tblResponsibilityList = responsibilityMapper.mapFetchFromVModelList(territoryResponsibilityList,
allResp, modUser);
for (TblResponsibility tblResponsibility : tblResponsibilityList) {
try {
tdao.storeInTx(tblResponsibility);
} catch (Exception e) {
LOGGER.error("Error storing Responsibilities", e);
throw new BtbInternalServerError("Error storing Responsibilities, e");
}
}
}
return null; // NOSONAR
}
private static List<TerritoryResponsibility> storePlannedResponsibilitiesInDB(
List<TerritoryResponsibility> territoryResponsibilityList, TblResponsibilityDao tdao,
ResponsibilityMapper responsibilityMapper, String modUser) throws BtbInternalServerError {
if (territoryResponsibilityList != null && !territoryResponsibilityList.isEmpty()) {
List<TblResponsibility> responsibilitiesForCurrentUser = tdao.getResponsibilitiesForUser(modUser);
List<TblResponsibility> tblResponsibilityList;
try {
tblResponsibilityList = responsibilityMapper.mapFromVModelList(territoryResponsibilityList,
responsibilitiesForCurrentUser, ResponsibilityMapper.PROCESS_MODE.PLAN, modUser);
} catch (BtbGone btbGone) {
LOGGER.debug(MSG_DATA_OUTDATED_CATCHING_NEW_DATASET, btbGone);
return responsibilityMapper.mapToContainerVModelList(responsibilitiesForCurrentUser);
}
for (TblResponsibility tblResponsibility : tblResponsibilityList) {
try {
tdao.storeInTx(tblResponsibility);
} catch (Exception e) {
LOGGER.error("Error storing Responsibilities", e);
throw new BtbInternalServerError("Error storing Responsibilities, e");
}
}
}
return null; // NOSONAR an empty list could also be returned as an actual result of a user for example with zero
// responsibilities
// but we have to differentiate between actual results and outdated dataset of responsibilities.
}
private static List<TerritoryResponsibility> storeConfirmedResponsibilitiesInDBAndHistorize(
List<TerritoryResponsibility> territoryResponsibilityList, TblResponsibilityDao tdao,
HTblResponsibilityDao htdao, ResponsibilityMapper responsibilityMapper, String modUser,
List<TblResponsibility> plannedResponsibilitiesCurrentUser,
List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser) throws BtbInternalServerError, BtbGone {
if (territoryResponsibilityList != null && !territoryResponsibilityList.isEmpty()) {
List<TblResponsibility> tblResponsibilityList = responsibilityMapper.mapFromVModelList(
territoryResponsibilityList, plannedResponsibilitiesCurrentUser, CONFIRM, modUser);
List<HTblResponsibility> historyConfirmedResponsibilities = createHistoryConfirmedResponsibilities(
tblResponsibilityList, originalPlannedResponsibilitiesCurrentUser, htdao, modUser);
storeConfirmedResponsibilitiesInDBForHistory(historyConfirmedResponsibilities, htdao);
storeConfirmedResponsibilitiesInDBinTx(tblResponsibilityList, tdao);
}
return null; // NOSONAR an empty list could also be returned as an actual result of a user for example with zero
// responsibilities
// but we have to differentiate between actual results and outdated dataset of responsibilities.
}
private static List<HTblResponsibility> createHistoryConfirmedResponsibilities(
List<TblResponsibility> tblResponsibilityList,
List<TblResponsibility> originalPlannedResponsibilitiesCurrentUser, HTblResponsibilityDao htdao,
String modUser) throws BtbInternalServerError {
LOGGER.debug("createHistoryConfirmedResponsibilities is called");
Timestamp now = new Timestamp(System.currentTimeMillis());
Integer lastTransactionId = htdao.getLastTransactionId();
lastTransactionId++;
originalPlannedResponsibilitiesCurrentUser.sort(new TblResponsibilityIdComparator());
tblResponsibilityList.sort(new TblResponsibilityIdComparator());
List<HTblResponsibility> hTblResponsibilityList = new ArrayList<>();
for (int i = 0; i < tblResponsibilityList.size(); i++) {
TblResponsibility tblResponsibility = tblResponsibilityList.get(i);
if (!tblResponsibility.getResponsibleUser().equals(modUser)) {
continue;
}
TblResponsibility originalPlannedResposibility = originalPlannedResponsibilitiesCurrentUser.get(i);
HTblResponsibility hTblResponsibility = HResponsibilityMapper.mapFromTblResponsibility(tblResponsibility);
hTblResponsibility.setFormerResponsibleUser(originalPlannedResposibility.getResponsibleUser());
hTblResponsibility.setTransactionId(lastTransactionId);
hTblResponsibility.setTransferDate(now);
hTblResponsibilityList.add(hTblResponsibility);
}
LOGGER.debug("createHistoryConfirmedResponsibilities is finished");
return hTblResponsibilityList;
}
private static void storeConfirmedResponsibilitiesInDBinTx(List<TblResponsibility> tblResponsibilityList,
TblResponsibilityDao tdao) throws BtbInternalServerError {
for (TblResponsibility tblResponsibility : tblResponsibilityList) {
try {
tdao.storeInTx(tblResponsibility);
} catch (Exception e) {
LOGGER.error("Error storing ConfirmationResponsibilities", e);
throw new BtbInternalServerError("Error storing ConfirmationResponsibilities, e");
}
}
}
private static void storeConfirmedResponsibilitiesInDBForHistory(List<HTblResponsibility> htblResponsibilityList,
HTblResponsibilityDao htdao) throws BtbInternalServerError {
for (HTblResponsibility tblResponsibility : htblResponsibilityList) {
try {
htdao.storeInTx(tblResponsibility);
} catch (Exception e) {
LOGGER.error("Error storing History ConfirmationResponsibilities", e);
throw new BtbInternalServerError("Error storing History ConfirmationResponsibilities, e");
}
}
}
}