net.triptech.metahive.web.ContributeController.java Source code

Java tutorial

Introduction

Here is the source code for net.triptech.metahive.web.ContributeController.java

Source

/*******************************************************************************
 * Copyright (c) 2012 David Harrison, Triptech Ltd.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     David Harrison, Triptech Ltd - initial API and implementation
 ******************************************************************************/
package net.triptech.metahive.web;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.triptech.metahive.FlashScope;
import net.triptech.metahive.messaging.JmsRecalculateRequest;
import net.triptech.metahive.model.DataGrid;
import net.triptech.metahive.model.Definition;
import net.triptech.metahive.model.Organisation;
import net.triptech.metahive.model.Person;
import net.triptech.metahive.model.Submission;
import net.triptech.metahive.model.SubmittedField;
import net.triptech.metahive.model.ValidatedDataGrid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@RequestMapping("/contribute")
@Controller
public class ContributeController extends BaseController {

    @Autowired
    private transient JmsTemplate metahiveContributionTemplate;

    @Autowired
    private transient JmsTemplate keyValueGenerationTemplate;

    /**
     * Begin the contribute data process.
     *
     * @param uiModel the ui model
     * @param request the http servlet request
     * @return the string
     */
    @PreAuthorize("hasAnyRole('ROLE_CONTRIBUTOR','ROLE_EDITOR','ROLE_ADMIN')")
    @RequestMapping(method = RequestMethod.GET)
    public String begin(@RequestParam(value = "id", required = false) Long id, Model uiModel,
            HttpServletRequest request) {

        Person user = loadUser(request);

        String page = "contribute/noorganisation";

        Definition uniqueIdDef = Definition.findUniqueIdentifierDefinition();

        if (uniqueIdDef == null) {
            page = "contribute/nouniqueid";
        }

        if (user != null && user.getOrganisations() != null && uniqueIdDef != null) {
            Organisation organisation = null;
            if (user.getOrganisations().size() == 1) {
                organisation = user.getOrganisations().iterator().next();
            }
            if (user.getOrganisations().size() > 1) {
                if (id != null) {
                    for (Organisation userOrg : user.getOrganisations()) {
                        if (userOrg.getId().compareTo(id) == 0) {
                            organisation = userOrg;
                        }
                    }
                } else {
                    uiModel.addAttribute("organisations", user.getOrganisations());
                    page = "contribute/select";
                }
            }

            if (organisation != null) {

                page = "contribute/nodefinitions";

                Map<String, List<Definition>> definitions = Definition
                        .groupDefinitions(Definition.findSubmissionDefinitions(organisation));

                if (definitions != null && definitions.size() > 0) {
                    uiModel.addAttribute("organisationId", organisation.getId());
                    uiModel.addAttribute("uniqueIdDef", uniqueIdDef);
                    uiModel.addAttribute("definitions", definitions);
                    page = "contribute/begin";
                }
            }
        }

        return page;
    }

    @PreAuthorize("hasAnyRole('ROLE_CONTRIBUTOR','ROLE_EDITOR','ROLE_ADMIN')")
    @RequestMapping(value = "/submission", method = RequestMethod.GET)
    public String submission(@RequestParam(value = "id", required = true) Long id, Model uiModel,
            HttpServletRequest request) throws Exception {

        uiModel.addAttribute("organisationId", id);

        return "contribute/submission";
    }

    @RequestMapping(value = "/preview", method = RequestMethod.POST)
    public String preview(@RequestParam(value = "previewData", required = true) String data, Model uiModel,
            HttpServletRequest request) throws Exception {

        uiModel.addAttribute("validatedDataGrid", validateGrid(data));

        return "contribute/preview";
    }

    @PreAuthorize("hasAnyRole('ROLE_CONTRIBUTOR','ROLE_EDITOR','ROLE_ADMIN')")
    @RequestMapping(value = "/complete", method = RequestMethod.POST)
    public String complete(@RequestParam(value = "submissionId", required = true) Long id,
            @RequestParam(value = "submissionData", required = true) String data, Model uiModel,
            HttpServletRequest request) throws Exception {

        Person user = loadUser(request);

        String page = "redirect:/contribute";

        if (user != null && user.getOrganisations() != null) {
            for (Organisation userOrg : user.getOrganisations()) {
                if (userOrg.getId().compareTo(id) == 0) {
                    // Save the submission and add it to the processing queue
                    Submission submission = new Submission();
                    submission.setPerson(user);
                    submission.setOrganisation(userOrg);
                    submission.setRawData(data);

                    submission.persist();
                    submission.flush();

                    metahiveContributionTemplate.convertAndSend(submission.getId());

                    FlashScope.appendMessage(getMessage("metahive_submissions_complete"), request);
                    page = "redirect:/submissions";
                }
            }
        }
        return page;
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    @PreAuthorize("hasRole('ROLE_ADMIN','ROLE_EDITOR')")
    public String delete(@PathVariable("id") Long id, Model uiModel, HttpServletRequest request) {

        Submission submission = Submission.findSubmission(id);

        List<JmsRecalculateRequest> toProcess = new ArrayList<JmsRecalculateRequest>();

        if (submission != null) {
            for (SubmittedField submittedField : submission.getSubmittedFields()) {
                // Build a list of JMS requests to process following the delete
                JmsRecalculateRequest req = new JmsRecalculateRequest();
                req.setPrimaryRecordId(submittedField.getPrimaryRecordId());
                req.setSecondaryRecordId(submittedField.getSecondaryRecordId());
                req.setTertiaryRecordId(submittedField.getTertiaryRecordId());
                req.setDefinitionId(submittedField.getDefinition().getId());

                toProcess.add(req);
            }
            submission.remove();
        }

        for (JmsRecalculateRequest req : toProcess) {
            keyValueGenerationTemplate.convertAndSend(req);
        }

        uiModel.asMap().clear();

        FlashScope.appendMessage(getMessage("metahive_delete_complete", Submission.class), request);

        return "redirect:/submissions";
    }

    @RequestMapping(value = "/template.xls", method = RequestMethod.POST)
    public ModelAndView buildTemplate(@RequestParam(value = "definitions", required = true) String[] definitionIds,
            HttpServletRequest request, HttpServletResponse response) throws Exception {

        List<Definition> definitions = Definition.findDefinitionEntries(definitionIds);

        DataGrid dataGrid = new DataGrid();
        dataGrid.setTitle("Contribution template");

        dataGrid.addHeaderField(loadPreferences().getPrimaryRecordName());

        for (Definition definition : definitions) {
            dataGrid.addHeaderField(definition.getName());
        }

        return new ModelAndView("ExcelTemplateView", "dataGrid", dataGrid);
    }

    /**
     * Validate the data grid.
     *
     * @param data the data
     * @return the validated data grid
     */
    private ValidatedDataGrid validateGrid(final String data) {
        return new ValidatedDataGrid(new DataGrid(data));
    }

}