package org.tanaguru.webapp.controller;
/*
* Tanaguru - Automated webpage assessment
* Copyright (C) 2008-2015 Tanaguru.org
*
* This file is part of Tanaguru.
*
* Tanaguru is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact us by mail: tanaguru AT tanaguru DOT org
*/
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.tanaguru.webapp.entity.contract.Contract;
import org.tanaguru.webapp.entity.functionality.Functionality;
import org.tanaguru.webapp.exception.ForbiddenPageException;
import org.tanaguru.webapp.exception.ForbiddenUserException;
import org.tanaguru.webapp.util.TgolKeyStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.LocaleResolver;
/**
*
* @author jkowalczyk
*/
@Controller
public class ContractController extends AbstractController {
private LocaleResolver localeResolver;
@Autowired
public final void setLocaleResolver(LocaleResolver localeResolver) {
this.localeResolver = localeResolver;
}
private List<String> authorizedFunctionalityForTrend = new ArrayList();
public List<String> getAuthorizedFunctionalityForTrend() {
return authorizedFunctionalityForTrend;
}
public void setAuthorizedFunctionalityForTrend(List<String> authorizedFunctionalityForTrend) {
this.authorizedFunctionalityForTrend = authorizedFunctionalityForTrend;
}
public ContractController() {
super();
}
/**
*
* @param contractId
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value=TgolKeyStore.CONTRACT_URL, method=RequestMethod.GET)
@Secured({TgolKeyStore.ROLE_USER_KEY, TgolKeyStore.ROLE_ADMIN_KEY})
public String displayContractPage (
@RequestParam(TgolKeyStore.CONTRACT_ID_KEY) String contractId,
HttpServletRequest request,
HttpServletResponse response,
Model model) {
Long contractIdValue;
try {
contractIdValue = Long.valueOf(contractId);
} catch (NumberFormatException nfe) {
throw new ForbiddenPageException(getCurrentUser());
}
if (!isUserOwnedContract(contractIdValue)) {
throw new ForbiddenUserException(getCurrentUser());
}
return displayContractPage(request, model, contractIdValue);
}
/**
*
* @param request
* @param model
* @param contractId
* @return
*/
private String displayContractPage(
HttpServletRequest request,
Model model,
Long contractId) {
model.addAttribute(TgolKeyStore.LOCALE_KEY,localeResolver.resolveLocale(request));
Contract contract = getContractDataService().read(contractId);
if (isContractExpired(contract)) {
throw new ForbiddenUserException(getCurrentUser());
}
// add the action list to the view
// model.addAttribute(TgolKeyStore.CONTRACT_ACTION_LIST_KEY, actionHandler.getActionList(contract));
if (isContractHasFunctionalityAllowingTrend(contract)) {
model.addAttribute(TgolKeyStore.DISPLAY_RESULT_TREND_KEY, true);
}
if(isContractHasFunctionalityAllowingManualAudit(contract)){
model.addAttribute(TgolKeyStore.CONTRACT_WITH_MANUAL_AUDIT_KEY, true);
}
return displayContractView(contract, model);
}
/**
* We iterate through the list of functionalities associated with the contract
* to determine whether a manual audit option has to be displayed.
* @param contract
* @return
*/
private boolean isContractHasFunctionalityAllowingManualAudit(Contract contract) {
for (Functionality functionality : contract.getFunctionalitySet()) {
if (functionality.getId() == 5) {
return true;
}
}
return false;
}
/**
* We iterate through the list of functionalities associated with the contract
* to determine whether a trend has to be displayed.
* @param contract
* @return
*/
private boolean isContractHasFunctionalityAllowingTrend(Contract contract) {
for (Functionality functionality : contract.getFunctionalitySet()) {
if (authorizedFunctionalityForTrend.contains(functionality.getCode())) {
return true;
}
}
return false;
}
/**
* This methods checks whether the given contract belongs to the authenticated
* user of the current session
* @param contractId
* @return
*/
private boolean isUserOwnedContract(Long contractId){
for (Contract contract : getCurrentUser().getContractSet()) {
if (contract.getId().equals(contractId)) {
return true;
}
}
return false;
}
}