cz.strmik.cmmitool.web.controller.EvidenceController.java Source code

Java tutorial

Introduction

Here is the source code for cz.strmik.cmmitool.web.controller.EvidenceController.java

Source

/**
 * The contents of this file are subject to the terms
 * of the GNU GPL 2.0 license. You may not use this
 * file except in compliance with the license.
 *
 * Copyright 2009 Luk Strmiska, All rights reserved.
 */
package cz.strmik.cmmitool.web.controller;

import cz.strmik.cmmitool.dao.GenericDao;
import cz.strmik.cmmitool.entity.project.Evidence;
import cz.strmik.cmmitool.entity.project.EvidenceMapping;
import cz.strmik.cmmitool.entity.project.EvidenceRating;
import cz.strmik.cmmitool.entity.model.Practice;
import cz.strmik.cmmitool.entity.project.Project;
import cz.strmik.cmmitool.entity.method.RatingScale;
import cz.strmik.cmmitool.entity.project.ProcessInstantiation;
import cz.strmik.cmmitool.enums.EvidenceCharacteristic;
import cz.strmik.cmmitool.enums.EvidenceStatus;
import cz.strmik.cmmitool.enums.EvidenceType;
import cz.strmik.cmmitool.enums.IndicatorType;
import cz.strmik.cmmitool.enums.PracticeEvidenceAdequacy;
import cz.strmik.cmmitool.service.EvidenceService;
import cz.strmik.cmmitool.util.tree.TreeGenerator;
import cz.strmik.cmmitool.util.validator.EvidenceValidator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.context.request.WebRequest;

/**
 *
 * @author Luk Strmiska, strmik@gmail.com
 * @version 1.0
 */
@Controller
@RequestMapping("/appraisal/evidence")
@SessionAttributes({ Attribute.PROJECT, Attribute.EVIDENCE })
public class EvidenceController extends AbstractController {

    private static final String DASHBOARD = "/appraisal/evidence/dashboard";
    private static final String FORM = "/appraisal/evidence/form";
    private static final String LINK = "/appraisal/evidence/link";
    private static final String CHARACTERIZE = "/appraisal/evidence/characterize";
    @Autowired
    private EvidenceService evidenceService;
    @Autowired
    private GenericDao<Evidence, Long> evidenceDao;
    @Autowired
    private GenericDao<ProcessInstantiation, Long> processInstantiationDao;
    @Autowired
    private GenericDao<Project, String> projectDao;
    @Autowired
    private GenericDao<Practice, Long> practiceDao;
    @Autowired
    private GenericDao<RatingScale, Long> ratingScaleDao;
    @Autowired
    private GenericDao<EvidenceRating, Long> evidenceRatingDao;

    @ModelAttribute("types")
    public Collection<EvidenceType> getTypes() {
        List<EvidenceType> levels = new ArrayList<EvidenceType>(EvidenceType.values().length);
        for (EvidenceType type : EvidenceType.values()) {
            levels.add(type);
        }
        return levels;
    }

    @ModelAttribute("statuses")
    public Collection<EvidenceStatus> getStatuses() {
        List<EvidenceStatus> levels = new ArrayList<EvidenceStatus>(EvidenceStatus.values().length);
        for (EvidenceStatus type : EvidenceStatus.values()) {
            levels.add(type);
        }
        return levels;
    }

    @RequestMapping(method = RequestMethod.GET, value = "/")
    public String showDashboard(ModelMap model, HttpSession session) {
        Project project = (Project) session.getAttribute(Attribute.PROJECT);
        if (project != null) {
            project = projectDao.read(project.getId());
            model.addAttribute(Attribute.PROJECT, project);
            model.addAttribute("evidence", evidenceService.getAllEvidenceOfProject(project));
            model.addAttribute("auditor", userIsAuditor(project));
        } else {
            log.warn("Project not found in session!");
        }
        return DASHBOARD;
    }

    @RequestMapping(value = "/add.do")
    public String addEvidence(ModelMap model) {
        Evidence evidence = new Evidence();
        evidence.setNew(true);
        evidence.setStatus(EvidenceStatus.ENTERED);
        model.addAttribute(Attribute.EVIDENCE, evidence);
        return FORM;
    }

    @RequestMapping(value = "/edit-{id}.do")
    public String editEvidence(@PathVariable("id") Long id, ModelMap model) {
        Evidence evidence = evidenceDao.read(id);
        evidence.setNew(false);
        model.addAttribute(Attribute.EVIDENCE, evidence);
        return FORM;
    }

    @RequestMapping(method = RequestMethod.POST, value = "/save-evidence.do")
    public String saveEvidence(@ModelAttribute(Attribute.EVIDENCE) Evidence evidence, BindingResult result,
            ModelMap modelMap, HttpSession session) {
        new EvidenceValidator().validate(evidence, result);
        if (result.hasErrors()) {
            return FORM;
        }
        evidence.setModifiedBy(getLoggedUser());
        Project project = projectDao.read(((Project) session.getAttribute(Attribute.PROJECT)).getId());
        if (evidence.isNew()) {
            evidence.setProject(project);
            evidence = evidenceDao.create(evidence);
        } else {
            evidence = evidenceDao.update(evidence);
        }
        modelMap.addAttribute(Attribute.EVIDENCE, evidence);
        modelMap.addAttribute("practiceTree", TreeGenerator.evidenceTree(project, evidence, evidenceDao));
        return LINK;
    }

    @RequestMapping(method = RequestMethod.POST, value = "/link.do")
    public String linkEvidence(@ModelAttribute(Attribute.EVIDENCE) Evidence evidence, ModelMap modelMap,
            HttpSession session, WebRequest request) {
        Iterator<String> it = request.getParameterNames();
        Map<Practice, Set<ProcessInstantiation>> pis = new HashMap<Practice, Set<ProcessInstantiation>>();
        while (it.hasNext()) {
            String param = it.next();
            if (!param.matches("^practice-\\d+?,inst-\\d+$")) {
                log.debug("skipping parameter " + param);
                continue;
            }
            String[] params = param.split(",");
            Long id = Long.parseLong(params[0].substring(9));
            Practice practice = practiceDao.read(id);
            if (!pis.containsKey(practice)) {
                pis.put(practice, new HashSet<ProcessInstantiation>());
            }
            id = Long.parseLong(params[1].substring(5));
            ProcessInstantiation pi = processInstantiationDao.read(id);
            pis.get(practice).add(pi);
        }
        evidenceService.linkEvidenceToPractices(evidence, pis);
        return "redirect:/appraisal/evidence/";
    }

    @RequestMapping(method = RequestMethod.GET, value = "/characterize.do")
    public String characterizeEvidence(@ModelAttribute(Attribute.PROJECT) Project project, ModelMap modelMap,
            HttpSession session) {
        project = projectDao.read(project.getId());
        checkIsAudior(project);
        modelMap.addAttribute("practiceTree", TreeGenerator.evidenceTree(project, null, evidenceDao));
        return CHARACTERIZE;
    }

    @RequestMapping(method = RequestMethod.POST, value = "/characterize.do")
    public String characterizeEvidenceSave(@ModelAttribute(Attribute.PROJECT) Project project, ModelMap modelMap,
            HttpSession session, WebRequest request) {
        project = projectDao.read(project.getId());
        checkIsAudior(project);
        Iterator<String> it = request.getParameterNames();
        while (it.hasNext()) {
            String param = it.next();
            String value = request.getParameter(param);
            if (log.isDebugEnabled()) {
                log.debug("Read parameter: " + param + " = " + value);
            }
            if (param.matches("^practice-char-\\d+?-\\d+$")) {
                setPracticeChar(param, value, project);
            } else if (param.matches("^practice-adequacy-\\d+?-\\d+$")) {
                setPracticeAdequacy(param, value, project);
            } else if (param.matches("^evidence-char-\\d+#\\d+#\\d+$")) {
                setEvidenceChar(param, value, project);
            } else if (param.matches("^evidence-ind-\\d+#\\d+#\\d+$")) {
                setEvidenceInd(param, value, project);
            } else {
                log.debug("skipping parameter " + param);
            }
        }
        projectDao.update(project);
        return "redirect:/appraisal/evidence/";
    }

    private void setPracticeChar(String param, String value, Project project) {
        String idString[] = param.substring(14).split("-");
        Long practiceId = Long.parseLong(idString[0]);
        Long instId = Long.parseLong(idString[1]);
        boolean found = false;
        for (EvidenceRating er : project.getEvidenceRating()) {
            if (er.getPractice().getId().equals(practiceId)
                    && er.getProcessInstantiation().getId().equals(instId)) {
                er.setCharacterizePracticeImplementation(ratingScaleDao.read(Long.parseLong(value)));
                er.setModifiedBy(getLoggedUser());
                if (log.isDebugEnabled()) {
                    log.debug("Evidence charcterization of practice " + er.getPractice() + " and pi "
                            + er.getProcessInstantiation() + " set to "
                            + er.getCharacterizePracticeImplementation());
                }
                found = true;
                break;
            }
        }
        if (!found) {
            EvidenceRating er = createEvidenceRating(project, practiceId, instId);
            er.setCharacterizePracticeImplementation(ratingScaleDao.read(Long.parseLong(value)));
        }
    }

    private void setPracticeAdequacy(String param, String value, Project project) {
        String idString[] = param.substring(18).split("-");
        Long practiceId = Long.parseLong(idString[0]);
        Long instId = Long.parseLong(idString[1]);
        boolean found = false;
        for (EvidenceRating er : project.getEvidenceRating()) {
            if (er.getPractice().getId().equals(practiceId)
                    && er.getProcessInstantiation().getId().equals(instId)) {
                er.setEvidenceAdequacy(PracticeEvidenceAdequacy.valueOf(value));
                er.setModifiedBy(getLoggedUser());
                if (log.isDebugEnabled()) {
                    log.debug("Evidence adequacy of practice " + er.getPractice() + " and pi "
                            + er.getProcessInstantiation() + " set to " + er.getEvidenceAdequacy());
                }
                found = true;
                break;
            }
        }
        if (!found) {
            EvidenceRating er = createEvidenceRating(project, practiceId, instId);
            er.setEvidenceAdequacy(PracticeEvidenceAdequacy.valueOf(value));
        }
    }

    private void setEvidenceChar(String param, String value, Project project) {
        String idString[] = param.substring(14).split("#");
        Long evidenceId = Long.parseLong(idString[0]);
        Long practiceId = Long.parseLong(idString[1]);
        Long instanceId = Long.parseLong(idString[2]);

        for (EvidenceMapping em : project.getEvidenceMappings()) {
            if (em.getEvidence().getId().equals(evidenceId) && em.getPractice().getId().equals(practiceId)
                    && em.getProcessInstantiation().getId().equals(instanceId)) {
                em.setCharacteristic(EvidenceCharacteristic.valueOf(value));
                em.getEvidence().setModifiedBy(getLoggedUser());
                if (log.isDebugEnabled()) {
                    log.debug(
                            "Characteristic of evidence " + em.getEvidence() + " set to " + em.getCharacteristic());
                }
                break;
            }
        }
    }

    private void setEvidenceInd(String param, String value, Project project) {
        String idString[] = param.substring(13).split("#");
        Long evidenceId = Long.parseLong(idString[0]);
        Long practiceId = Long.parseLong(idString[1]);
        Long instanceId = Long.parseLong(idString[2]);

        for (EvidenceMapping em : project.getEvidenceMappings()) {
            if (em.getEvidence().getId().equals(evidenceId) && em.getPractice().getId().equals(practiceId)
                    && em.getProcessInstantiation().getId().equals(instanceId)) {
                em.setIndicatorType(IndicatorType.valueOf(value));
                em.getEvidence().setModifiedBy(getLoggedUser());
                if (log.isDebugEnabled()) {
                    log.debug(
                            "Indicator type of evidence " + em.getEvidence() + " set to " + em.getIndicatorType());
                }
                break;
            }
        }
    }

    private EvidenceRating createEvidenceRating(Project project, long practiceId, long instId) {
        EvidenceRating er = new EvidenceRating();
        er.setModifiedBy(getLoggedUser());
        er.setProject(project);
        er.setPractice(practiceDao.read(practiceId));
        er.setProcessInstantiation(processInstantiationDao.read(instId));
        er = evidenceRatingDao.create(er);
        project.getEvidenceRating().add(er);
        if (log.isDebugEnabled()) {
            log.debug("Created new Evidence rating for practice " + er.getPractice() + " and inst "
                    + er.getProcessInstantiation());
        }
        return er;
    }

    private static final Log log = LogFactory.getLog(EvidenceController.class);

}