Projekt

Obecné

Profil

Stáhnout (12.2 KB) Statistiky
| Větev: | Revize:
1
package vldc.aswi.web.controller;
2

    
3
import org.springframework.beans.factory.annotation.Autowired;
4
import org.springframework.stereotype.Controller;
5
import org.springframework.ui.ModelMap;
6
import org.springframework.validation.BeanPropertyBindingResult;
7
import org.springframework.validation.BindingResult;
8
import org.springframework.web.bind.annotation.*;
9
import org.springframework.web.servlet.ModelAndView;
10
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
11
import vldc.aswi.domain.Assembly;
12
import vldc.aswi.domain.Configuration;
13
import vldc.aswi.domain.Location;
14
import vldc.aswi.domain.Operator;
15
import vldc.aswi.domain.parameter.ParameterInConfiguration;
16
import vldc.aswi.model.ExportType;
17
import vldc.aswi.model.table.contingencyTable.ContingencyTableRow;
18
import vldc.aswi.service.*;
19
import vldc.aswi.service.parameter.ParameterManager;
20
import vldc.aswi.utils.AuthControl;
21
import vldc.aswi.utils.Utils;
22

    
23
import javax.servlet.http.HttpServletRequest;
24
import javax.servlet.http.HttpServletResponse;
25
import vldc.aswi.validators.ConfigurationValidator;
26

    
27
import javax.validation.Valid;
28
import java.util.ArrayList;
29
import java.util.Comparator;
30
import java.util.List;
31

    
32
/**
33
 * Manager for configuration.
34
 */
35
@Controller
36
public class ConfigurationController extends BasicController{
37

    
38
    /** Autowired location manager. */
39
    @Autowired
40
    private LocationManager locationManager;
41

    
42
    /** Autowired assembly manager. */
43
    @Autowired
44
    private AssemblyManager assemblyManager;
45

    
46
    /** Autowired sql query manager. */
47
    @Autowired
48
    private SqlQueryManager sqlQueryManager;
49

    
50
    /** Autowired export manager. */
51
    @Autowired
52
    private ExportManager exportManager;
53

    
54
    /** Autowired parameter manager. */
55
    @Autowired
56
    private ParameterManager parameterManager;
57

    
58
    /** Autowired configuration manager */
59
    @Autowired
60
    private ConfigurationManager configurationManager;
61

    
62
    /** Autowired configuration validator */
63
    @Autowired
64
    private ConfigurationValidator configurationValidator;
65

    
66
    /** Name of thymeleaf parameter, which will contain text in assembly form. */
67
    private String assemblyTitleName = "title";
68

    
69
    /** Title text for table generation form.  */
70
    private String generateTableTitleText = "Generování tabulky - ";
71

    
72
    /**
73
     * Opens an configuration page after configuration name was clicked
74
     * @param id ID of configuration
75
     * @return modelAndView of page to be shown
76
     */
77
    @GetMapping("/configuration")
78
    public ModelAndView configurationGet(@RequestParam("configurationID") String id,
79
                                         @ModelAttribute("successText") String successMsg,
80
                                         @ModelAttribute("errorText") String errorMsg) {
81
        ModelAndView modelAndView = new ModelAndView("assembly");
82

    
83
        ModelMap modelMap = modelAndView.getModelMap();
84

    
85
        Configuration configuration = configurationManager.getConfigurationById(Long.parseLong(id));
86

    
87
        // TODO: 04.05.2020 error page when id doesn't exist
88

    
89
        String userName = AuthControl.getUserName();
90

    
91
        if (userName == null) {
92
            // TODO: 04.05.2020 error message, user not authenticated
93
        }
94
        else if (!userName.equals(configuration.getUser().getUsername())) {
95
            // TODO: 04.05.2020 error page wrong user
96
            return new ModelAndView("redirect:/");
97
        }
98

    
99
        List<ParameterInConfiguration> parametersInConfiguration = new ArrayList<>(configuration.getParametersInConfiguration());
100
        configuration.setParametersInConfiguration(parametersInConfiguration);
101

    
102
        initializeFields(configuration);
103
        Comparator<ParameterInConfiguration> comparator = Comparator.comparingInt(o -> o.getParameter().getParameterOrder());
104

    
105
        modelMap.addAttribute("configuration", configuration);
106
        modelMap.addAttribute("comparator", comparator);
107
        modelMap.addAttribute("formAction", "/configuration?configurationID=" + configuration.getId());
108

    
109
        modelMap.addAttribute(assemblySuccessName, successMsg);
110
        modelMap.addAttribute(assemblyErrorName, errorMsg);
111

    
112
        return modelAndView;
113
    }
114

    
115
    /**
116
     * Saves or edits configuration and redirects to the page with configuration
117
     * @param newConfiguration contained with configuration data
118
     * @param id ID of configuration, if empty new configuration is created
119
     * @param bindingResult binding result
120
     * @return modelAndView with redirection
121
     */
122
    @PostMapping("/configuration")
123
    public ModelAndView configurationPost(@Valid Configuration newConfiguration,
124
                                           BindingResult bindingResult,
125
                                           @RequestParam("isNotRemoveEmpty") String isNotRemoveEmptyString,
126
                                           @RequestParam("configurationID") String id,
127
                                           @RequestParam(required=false, value="generateTable") String generateTable,
128
                                           @RequestParam(required=false, value="exportXlsx") String exportXlsx,
129
                                           @RequestParam(required=false, value="exportPdf") String exportPdf,
130
                                           @RequestParam(required=false, value="saveConfiguration") String saveConfiguration,
131
                                            RedirectAttributes redirectAttributes,
132
                                            HttpServletRequest request,
133
                                            HttpServletResponse response
134
                                          )
135
    {
136
        ModelAndView modelAndView = new ModelAndView();
137
        ModelMap modelMap = modelAndView.getModelMap();
138
        boolean isNotRemoveEmpty = isNotRemoveEmptyString == null || !isNotRemoveEmptyString.equals("");
139

    
140
        if (bindingResult.hasErrors()) {
141
            // TODO: 04.05.2020 Error message
142
            modelAndView.setViewName("redirect:/");
143

    
144
            return modelAndView;
145
        }
146

    
147
        if (generateTable != null)
148
        {
149
            prepareForTable(newConfiguration);
150
            BindingResult errors = new BeanPropertyBindingResult(newConfiguration, newConfiguration.getClass().getName());
151
            configurationValidator.validate(newConfiguration, errors);
152
            if (errors.hasErrors()) {
153
                addConfigurationDataIntoModelAndView(newConfiguration, modelAndView, modelMap);
154

    
155
                modelMap.addAttribute(assemblyErrorName, getFullErrorMessage(errors));
156
                modelMap.addAttribute(assemblyTitleName, generateTableTitleText + " " + newConfiguration.getName());
157
            }
158
            else {
159
                List<ContingencyTableRow> rows = this.sqlQueryManager.getContingencyTableRow(newConfiguration.getAssembly(),
160
                        newConfiguration.getParametersInConfiguration(), isNotRemoveEmpty);
161

    
162
                modelMap.addAttribute("configurationID", id);
163
                modelMap.addAttribute("contingencyTableRows", rows);
164
                addConfigurationDataIntoModelAndView(newConfiguration, modelAndView, modelMap);
165
            }
166
        }
167
        else if (exportXlsx != null)
168
        {
169
            prepareForTable(newConfiguration);
170
            this.exportManager.exportContingencyTable(newConfiguration, isNotRemoveEmpty, response, ExportType.XLSX);
171

    
172
            // Return null, because we want to continue on our page with selected parameters / attributes.
173
            return null;
174
        }
175
        else if (exportPdf != null)
176
        {
177
            prepareForTable(newConfiguration);
178
            this.exportManager.exportContingencyTable(newConfiguration, isNotRemoveEmpty, response, ExportType.PDF);
179

    
180
            // Return null, because we want to continue on our page with selected parameters / attributes.
181
            return null;
182
        }
183
        else if (saveConfiguration != null)
184
        {
185
            Configuration configuration = configurationManager.saveConfiguration(newConfiguration, id);
186

    
187
            initializeFields(configuration);
188

    
189
            redirectAttributes.addFlashAttribute(assemblySuccessName, "Šablona byla úspěšně uložena");
190
            modelAndView.setViewName("redirect:/configuration?configurationID=" + configuration.getId());
191

    
192
        }
193

    
194
        return modelAndView;
195
    }
196

    
197
    /**
198
     * Get method for configuration delete.
199
     * @param id - ID of configuration.
200
     * @return ModelAndView for index.
201
     */
202
    @GetMapping("/configuration_delete")
203
    public ModelAndView configurationDeleteGet(@RequestParam("configurationID") String id, RedirectAttributes redirectAttributes) {
204
        ModelAndView modelAndView = new ModelAndView("redirect:/");
205

    
206
        Long configurationId = Utils.tryParseLong(id);
207

    
208
        if (configurationId == null) {
209
            redirectAttributes.addFlashAttribute(assemblyErrorName, "Sestavu se nepodařilo odstranit");
210
        }
211

    
212
        boolean success = this.configurationManager.deleteConfiguration(configurationId);
213

    
214
        if (success)
215
        {
216
            redirectAttributes.addFlashAttribute(assemblySuccessName, "Sestava byla úspěšně odstraněna");
217
        }
218
        else
219
        {
220
            redirectAttributes.addFlashAttribute(assemblyErrorName, "Sestavu se nepodařilo odstranit");
221
        }
222

    
223
        return modelAndView;
224
    }
225

    
226
    /**
227
     * Initializes fields of a given configuration
228
     * @param configuration configuration which fields should be initialized
229
     */
230
    private void initializeFields(Configuration configuration) {
231
        for(ParameterInConfiguration parameterInConfiguration : configuration.getParametersInConfiguration()) {
232
            if(parameterInConfiguration.getLocation() == null) {
233
                parameterInConfiguration.setLocation(new Location());
234
            }
235
            if(parameterInConfiguration.getOperator() == null) {
236
                parameterInConfiguration.setOperator(new Operator());
237
            }
238
            if(parameterInConfiguration.getFunctions() == null) {
239
                parameterInConfiguration.setFunctions(new ArrayList<>());
240
            }
241
        }
242
    }
243

    
244
    /**
245
     * Prepares the configuration for contingency table generation. Initializes assembly and parameters of parameters in
246
     * configuration.
247
     * @param configuration configuration to be prepared.
248
     */
249
    private void prepareForTable(Configuration configuration) {
250
        Assembly assembly = assemblyManager.getAssemblyById(configuration.getAssembly().getId());
251
        configuration.setAssembly(assembly);
252

    
253
        for(int i = 0; i < configuration.getParametersInConfiguration().size(); i++) {
254
            ParameterInConfiguration parameterInConfiguration = configuration.getParametersInConfiguration().get(i);
255
            parameterInConfiguration.setParameter(parameterManager.getParameterById(parameterInConfiguration.getParameter().getId()));
256
            parameterInConfiguration.setParameter(assembly.getParameters().get(i));
257
            if (parameterInConfiguration.getLocation() != null) {
258
                parameterInConfiguration.setLocation(locationManager.getLocationById(parameterInConfiguration.getLocation().getId()));
259
            } else {
260
                parameterInConfiguration.setLocation(new Location());
261
            }
262
            parameterInConfiguration.setConfiguration(configuration);
263
        }
264

    
265
        Comparator<ParameterInConfiguration> comparator = Comparator.comparingInt(o -> o.getParameter().getParameterOrder());
266
        configuration.getParametersInConfiguration().sort(comparator);
267
    }
268

    
269
    /**
270
     * Adds configuration and other data to modelAndView.
271
     * @param newConfiguration Configuration to be added to the modelAndView.
272
     * @param modelAndView ModelAndView to which to which modelMap belongs.
273
     * @param modelMap ModelMap to which data is added.
274
     */
275
    private void addConfigurationDataIntoModelAndView(Configuration newConfiguration, ModelAndView modelAndView, ModelMap modelMap) {
276
        Comparator<ParameterInConfiguration> comparator = Comparator.comparingInt(o -> o.getParameter().getParameterOrder());
277
        initializeFields(newConfiguration);
278
        modelMap.addAttribute("configuration", newConfiguration);
279
        modelMap.addAttribute("comparator", comparator);
280
        modelMap.addAttribute("formAction", "/configuration?configurationID=" + newConfiguration.getAssembly().getId());
281
        modelAndView.setViewName("assembly");
282
    }
283
}
(3-3/5)