Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 7638be72

Přidáno uživatelem Vojtěch Danišík před asi 4 roky(ů)

re #7886 Assembly validator completed (validating sql query, parameter name in select and parameter location) + displaying temp error message.
Added title for edit / add assembly forms.
Added toString method for all domains.

Zobrazit rozdíly:

src/main/java/vldc/aswi/database/DatabaseInterface.java
31 31
        this.jdbcTemplate = jdbcTemplate;
32 32
    }
33 33

  
34
    /**
35
     * Get list of table column names from SQL query.
36
     * @param sqlQuery - SQL query.
37
     * @return List of table column names. If null is returned, then it means that SQL query is not valid.
38
     */
39
    public List<String> getNameOfColumnsFromQuery(String sqlQuery) {
40
        try
41
        {
42
            // Try extract columns from database using SQL query.
43
            return jdbcTemplate.query(
44
                sqlQuery,
45
                new ResultSetExtractor<List<String>>() {
46
                    @Override
47
                    public List<String> extractData(ResultSet resultSet) throws SQLException {
48
                        List<String> tableColumnNames = new ArrayList<>();
49

  
50
                        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
51
                        int columnCount = resultSetMetaData.getColumnCount();
52

  
53
                        // The column count starts from 1.
54
                        for (int i = 1; i <= columnCount; i++ ) {
55
                            String columnName = resultSetMetaData.getColumnName(i);
56
                            tableColumnNames.add(columnName);
57
                        }
58

  
59
                        return tableColumnNames;
60
                    }
61
                }
62
            );
63

  
64
        }
65
        catch (DataAccessException e)
66
        {
67
            // If SQL query is not valid, then JdbcTemplate returned DataAccess exception.
68
            return null;
69
        }
70
    }
71

  
34 72
    /**
35 73
     * Validate given SQLQuery.
36 74
     * @param sqlQuery - Tested SQL Query.
37 75
     * @return true if SQL query is valid, false if not.
38 76
     */
39 77
    public boolean validateSQLQuery(String sqlQuery) {
78

  
40 79
        try
41 80
        {
81
            // Try validate SQL query.
42 82
            jdbcTemplate.execute("EXPLAIN PLAN FOR " + sqlQuery);
43 83
            return true;
44 84
        }
45 85
        catch (DataAccessException e)
46 86
        {
87
            // If SQL query is not valid, then JdbcTemplate returned DataAccess exception.
47 88
            return false;
48 89
        }
49 90
    }
......
70 111
                            tableColumnsList.add(new TableColumn(columnName));
71 112
                        }
72 113

  
114
                        // Add values from row to every column.
73 115
                        while(resultSet.next()) {
74 116
                            for (int i = 1; i <= columnCount; i++) {
75 117
                                tableColumnsList.get(i - 1).addValue(resultSet.getString(i));
......
78 120

  
79 121
                        Map<String, TableColumn> tableColumnMap = new HashMap<>();
80 122

  
123
                        // Create map, where key is tablecolumn name.
81 124
                        for (TableColumn column : tableColumnsList) {
82 125
                            tableColumnMap.put(column.getName(), column);
83 126
                        }
src/main/java/vldc/aswi/domain/Assembly.java
74 74
    public boolean equals(Object obj) {
75 75
        return super.equals(obj);
76 76
    }
77

  
78
    /**
79
     * Overriding toString method to prevent StackOverflowError.
80
     * @return Object with zero parameters.
81
     */
82
    @Override
83
    public String toString() {
84
        return "Assembly[]";
85
    }
77 86
}
src/main/java/vldc/aswi/domain/Configuration.java
58 58
    public boolean equals(Object obj) {
59 59
        return super.equals(obj);
60 60
    }
61

  
62
    /**
63
     * Overriding toString method to prevent StackOverflowError.
64
     * @return Object with zero parameters.
65
     */
66
    @Override
67
    public String toString() {
68
        return "Configuration[]";
69
    }
61 70
}
src/main/java/vldc/aswi/domain/Function.java
50 50
    public boolean equals(Object obj) {
51 51
        return super.equals(obj);
52 52
    }
53

  
54
    /**
55
     * Overriding toString method to prevent StackOverflowError.
56
     * @return Object with zero parameters.
57
     */
58
    @Override
59
    public String toString() {
60
        return "Function[]";
61
    }
53 62
}
src/main/java/vldc/aswi/domain/Location.java
47 47
    public boolean equals(Object obj) {
48 48
        return super.equals(obj);
49 49
    }
50

  
51
    /**
52
     * Overriding toString method to prevent StackOverflowError.
53
     * @return Object with zero parameters.
54
     */
55
    @Override
56
    public String toString() {
57
        return "Location[]";
58
    }
50 59
}
src/main/java/vldc/aswi/domain/Operator.java
47 47
    public boolean equals(Object obj) {
48 48
        return super.equals(obj);
49 49
    }
50

  
51
    /**
52
     * Overriding toString method to prevent StackOverflowError.
53
     * @return Object with zero parameters.
54
     */
55
    @Override
56
    public String toString() {
57
        return "Operator[]";
58
    }
50 59
}
src/main/java/vldc/aswi/domain/Role.java
45 45
    public boolean equals(Object obj) {
46 46
        return super.equals(obj);
47 47
    }
48

  
49
    /**
50
     * Overriding toString method to prevent StackOverflowError.
51
     * @return Object with zero parameters.
52
     */
53
    @Override
54
    public String toString() {
55
        return "Role[]";
56
    }
48 57
}
src/main/java/vldc/aswi/domain/User.java
54 54
    public boolean equals(Object obj) {
55 55
        return super.equals(obj);
56 56
    }
57

  
58
    /**
59
     * Overriding toString method to prevent StackOverflowError.
60
     * @return Object with zero parameters.
61
     */
62
    @Override
63
    public String toString() {
64
        return "User[]";
65
    }
57 66
}
src/main/java/vldc/aswi/domain/parameter/Parameter.java
95 95
    }
96 96

  
97 97
    /**
98
     * Overriding toString method to prevent StackOverflowError when parsing values from assembly form.
99
     * @return Parameter info.
98
     * Overriding toString method to prevent StackOverflowError.
99
     * @return Object with zero parameters.
100 100
     */
101 101
    @Override
102 102
    public String toString() {
103
        return "Parameter[name=" + name + ", nameOfSelect=" + nameOfSelect + ", defaultHodnota=" + defaultValue + "]";
103
        return "Parameter[]";
104 104
    }
105 105

  
106 106
    /**
src/main/java/vldc/aswi/domain/parameter/ParameterInConfiguration.java
75 75
    public boolean equals(Object obj) {
76 76
        return super.equals(obj);
77 77
    }
78

  
79
    /**
80
     * Overriding toString method to prevent StackOverflowError.
81
     * @return Object with zero parameters.
82
     */
83
    @Override
84
    public String toString() {
85
        return "ParameterInConfiguration[]";
86
    }
78 87
}
src/main/java/vldc/aswi/domain/parameter/ParameterType.java
45 45
    public boolean equals(Object obj) {
46 46
        return super.equals(obj);
47 47
    }
48

  
49
    /**
50
     * Overriding toString method to prevent StackOverflowError.
51
     * @return Object with zero parameters.
52
     */
53
    @Override
54
    public String toString() {
55
        return "ParameterType[]";
56
    }
48 57
}
src/main/java/vldc/aswi/domain/parameter/ParameterValue.java
43 43
    public boolean equals(Object obj) {
44 44
        return super.equals(obj);
45 45
    }
46

  
47
    /**
48
     * Overriding toString method to prevent StackOverflowError.
49
     * @return Object with zero parameters.
50
     */
51
    @Override
52
    public String toString() {
53
        return "ParameterValue[]";
54
    }
46 55
}
src/main/java/vldc/aswi/service/AssemblyManagerImpl.java
85 85
     */
86 86
    @Override
87 87
    public Long updateAssembly(Assembly updatedAssemblyValues) {
88
        // TODO: test it.
89 88
        Assembly assembly = getAssemblyById(updatedAssemblyValues.getId());
90 89
        assembly.setName(updatedAssemblyValues.getName());
91 90
        assembly.setSQLQuery(updatedAssemblyValues.getSQLQuery());
......
104 103
     * @param updatedRoles - List of roles.
105 104
     */
106 105
    private void updateAssemblyRoles(Long id, List<Role> updatedRoles) {
107
        // TODO: test it.
108 106
        Assembly assembly = getAssemblyById(id);
109 107
        List<Role> currentRoles = assembly.getRoles();
110 108

  
src/main/java/vldc/aswi/service/SqlQueryManager.java
22 22
     * @return true if SQL query is ok, false if not.
23 23
     */
24 24
    boolean validateSQLQuery(String sqlQuery);
25

  
26
    /**
27
     * Get list of table column names from SQL query.
28
     * @param sqlQuery - SQL query.
29
     * @return List of table column names.
30
     */
31
    List<String> getNameOfColumnsFromQuery(String sqlQuery);
25 32
}
src/main/java/vldc/aswi/service/SqlQueryManagerImpl.java
30 30
     */
31 31
    @Override
32 32
    public List<ContingencyTableRow> getContingencyTableRow(String sqlQuery) {
33
        Map<String, TableColumn> tableColumns = databaseInterface.executeQueryAndReturnTableColumns(sqlQuery);
33
        Map<String, TableColumn> tableColumns = this.databaseInterface.executeQueryAndReturnTableColumns(sqlQuery);
34 34
        return Converter.convertTableColumnsToContingencyTableRows(tableColumns);
35 35
    }
36 36

  
......
41 41
     */
42 42
    @Override
43 43
    public boolean validateSQLQuery(String sqlQuery) {
44
        return databaseInterface.validateSQLQuery(sqlQuery);
44
        return this.databaseInterface.validateSQLQuery(sqlQuery);
45
    }
46

  
47
    /**
48
     * Get list of table column names from SQL query.
49
     * @param sqlQuery - SQL query.
50
     * @return List of table column names.
51
     */
52
    public List<String> getNameOfColumnsFromQuery(String sqlQuery) {
53
        return this.databaseInterface.getNameOfColumnsFromQuery(sqlQuery);
45 54
    }
46 55
}
src/main/java/vldc/aswi/service/parameter/ParameterManagerImpl.java
106 106
            List<Location> locationList = new LinkedList<>();
107 107
            List<Function> functionList = new LinkedList<>();
108 108
            List<Operator> operatorList = new LinkedList<>();
109
            List<ParameterValue> valueList = new LinkedList<>();
109 110

  
110 111
            // Try to put all locations into list.
111 112
            if (parameterValues.getLocations() != null && parameterValues.getLocations().size() > 0) {
......
128 129
                }
129 130
            }
130 131

  
132
            // Try to put all operators into list.
133
            if (parameterValues.getParameterValues() != null && parameterValues.getParameterValues().size() > 0) {
134
                for (ParameterValue parameterValue : parameterValues.getParameterValues()) {
135
                    valueList.add(this.parameterValueRepository.getById(parameterValue.getId()));
136
                }
137
            }
138

  
131 139
            // Set lists of values into parameter.
132 140
            parameter.setLocations(locationList);
133 141
            parameter.setFunctions(functionList);
134 142
            parameter.setOperators(operatorList);
143
            parameter.setParameterValues(valueList);
135 144

  
136 145
            // Insert parameter into database.
137 146
            this.parameterRepository.save(parameter);
......
145 154
     */
146 155
    @Override
147 156
    public void updateParameters(Long assemblyId, List<Parameter> newAssemblyParameters) {
148
        // TODO: test it.
149 157
        Assembly assembly = this.assemblyRepository.getById(assemblyId);
150 158
        List<Parameter> currentAssemblyParameters = assembly.getParameters();
151 159

  
......
165 173
        newAssemblyParametersUpdated.retainAll(currentAssemblyParametersUpdated);
166 174

  
167 175
        // If no parameter has been deleted or added, then updating is unnecessary.
168
        if (newAssemblyParametersNew.size() == 0 && currentAssemblyParametersDeleted.size() == 0 && newAssemblyParametersUpdated.size() == currentAssemblyParameters.size()) return;
176
        if (newAssemblyParametersNew.size() == 0 && currentAssemblyParametersDeleted.size() == 0 && newAssemblyParametersUpdated.size() == 0) return;
169 177

  
170 178
        // Remove deleted parameters.
171 179
        for (Parameter parameter : currentAssemblyParametersDeleted) {
......
190 198
     * @param parameterValuesList - List of updated parameters.
191 199
     */
192 200
    private void updateParameters(List<Parameter> parameterValuesList) {
193
        // TODO: test it.
194 201
        for (Parameter parameterValues : parameterValuesList) {
195 202
            // Get current parameter from database.
196 203
            Parameter parameter = this.parameterRepository.getById(parameterValues.getId());
......
218 225
     * @param updatedLocations - List of locations.
219 226
     */
220 227
    private void updateParameterLocations(Long id, List<Location> updatedLocations) {
221
        // TODO: test it.
222 228
        Parameter parameter = this.parameterRepository.getById(id);
223 229
        List<Location> currentLocations = parameter.getLocations();
224 230

  
......
253 259
     * @param updatedFunctions - List of functions.
254 260
     */
255 261
    private void updateParameterFunctions(Long id, List<Function> updatedFunctions) {
256
        // TODO: test it.
257 262
        Parameter parameter = this.parameterRepository.getById(id);
258 263
        List<Function> currentFunctions = parameter.getFunctions();
259 264

  
......
288 293
     * @param updatedOperators - List of operators.
289 294
     */
290 295
    private void updateParameterOperators(Long id, List<Operator> updatedOperators) {
291
        // TODO: test it.
292 296
        Parameter parameter = this.parameterRepository.getById(id);
293 297
        List<Operator> currentOperators = parameter.getOperators();
294 298

  
......
323 327
     * @param newParameterValues - List of parameter values.
324 328
     */
325 329
    private void updateParameterValues(Long parameterId, List<ParameterValue> newParameterValues) {
326
        // TODO: test it.
327 330
        Parameter parameter = this.parameterRepository.getById(parameterId);
328 331
        List<ParameterValue> currentParameterValues = parameter.getParameterValues();
329 332

  
......
343 346
        newParameterValuesUpdated.retainAll(currentParameterValuesUpdated);
344 347

  
345 348
        // If there is no changes, do not update.
346
        if (newParameterValuesNew.size() == 0 && currentParameterValuesDeleted.size() == 0 && newParameterValuesUpdated.size() == currentParameterValues.size()) return;
349
        if (newParameterValuesNew.size() == 0 && currentParameterValuesDeleted.size() == 0 && newParameterValuesUpdated.size() == 0) return;
347 350

  
348 351
        // Delete removed parameter values.
349 352
        for (ParameterValue parameterValue : currentParameterValuesDeleted) {
......
362 365
     * @param updatedParameterValuesList - List of all updated parameter values.
363 366
     */
364 367
    private void updateParameterValueValues(List<ParameterValue> updatedParameterValuesList) {
365
        // TODO: test it.
366 368
        for (ParameterValue parameterValueValues : updatedParameterValuesList) {
367 369
            ParameterValue parameterValue = this.parameterValueRepository.getById(parameterValueValues.getId());
368 370
            parameterValue.setValue(parameterValueValues.getValue());
......
378 380
     * @param newParameterValuesNew - List of new parameter values.
379 381
     */
380 382
    private void addParameterValueValues(Long parameterId, List<ParameterValue> newParameterValuesNew) {
381
        // TODO: test it.
382 383
        Parameter parameter = this.parameterRepository.getById(parameterId);
383 384

  
384 385
        for (ParameterValue parameterValueValues : newParameterValuesNew) {
src/main/java/vldc/aswi/validators/AssemblyValidator.java
8 8
import vldc.aswi.domain.parameter.Parameter;
9 9
import vldc.aswi.service.SqlQueryManager;
10 10

  
11
import java.util.List;
12

  
11 13
/**
12 14
 * Validator for assembly.
13 15
 */
......
25 27
     */
26 28
    @Override
27 29
    public boolean supports(Class<?> aClass) {
28
        return Assembly.class.equals(aClass);
30
        return Assembly.class.isAssignableFrom(aClass);
29 31
    }
30 32

  
31 33
    /**
......
35 37
     */
36 38
    @Override
37 39
    public void validate(Object obj, Errors errors) {
38
        // TODO: VALIDATING   - https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html
39
        // TODO: ERROR STYLES - https://mkyong.com/spring-mvc/spring-mvc-form-errors-tag-example/
40 40

  
41 41
        // Get assembly values.
42 42
        Assembly assembly = (Assembly) obj;
43 43

  
44 44
        // Validate SQL Query.
45
        boolean isSQLQueryValid = this.sqlQueryManager.validateSQLQuery(assembly.getSQLQuery());
45
        List<String> columnNames = this.sqlQueryManager.getNameOfColumnsFromQuery(assembly.getSQLQuery());
46 46

  
47
        if (!isSQLQueryValid) {
47
        if (columnNames == null) {
48 48
            errors.rejectValue("SQLQuery", "SQL Query není validní!");
49
            // Field error in object 'assembly' on field 'SQLQuery': rejected value [SELECT SP.fakulta_S as fakulta_studia,
50
            // SP.kodSP_i as program_studia, fn_meaning2(SP.typ,'TYP_OBORU') as typ_studia, fn_meaning2(SP.forma,'FORMA_OBORU_NEW')
51
            // as forma_studia, OS.prijmeni || ' ' || OS.jmeno as osoba, trunc((sysdate - OS.datum_naroz) / 365) as vek, 1 as pocet
52
            // FROM studijni_programy SP, studenti ST, osoby OS WHERE SP.stpridno = ST.stpridno AND ST.osobidno = OS.osobidno AND
53
            // exists (SELECT 'a' FROM studenti_v_roce SVR WHERE ST.os_cislo = SVR.os_cislo AND SVR.rok_platnosti >= '2018') AND
54
            // ROWNUM <= 50];
55
            // codes [SQL Query není validní!.assembly.SQLQuery,SQL Query není validní!.
56
            // SQLQuery,SQL Query není validní!.java.lang.String,SQL Query není validní!]; arguments []; default message [null]
57 49
        }
58 50

  
59
        // TODO: test validation for new assembly -> especially for parameters.
60
        for (int i = 0; i < assembly.getParameters().size(); i++) {
61
            // TODO: Parametr - Pokud název v SQL nebude v dotazu SQL, bude vyhozena chyba.
62
            // TODO: Maybe nejdříve vzít všechny sloupce a potom zkontrolovat jestli obsahuje ten vybranej sloupec ?
63
            // TODO: A kontrolovat to podle ".. as NAZEV_SLOUPCE" nebo jako "SP.TYP_STUDIA ...." ???
51
        if (assembly.getParameters() != null && assembly.getParameters().size() > 0) {
52
            for (int i = 0; i < assembly.getParameters().size(); i++) {
53
                Parameter parameter = assembly.getParameters().get(i);
64 54

  
65
            /*
66
            if (!isParameterNameInSQLQuery) {
67
                errors.rejectValue("parameterSQLName" + i, "Název parametru v SQL query není validní!");
68
            }
69
             */
55
                // Check if parameter's nameOfSelect is contained in column names of SQL query.
56
                if (parameter.getNameOfSelect() == null || !columnNames.stream().anyMatch(parameter.getNameOfSelect()::equalsIgnoreCase)) {
57
                    errors.reject("parameters[" + i + "].nameOfSelect", "Název parametru v SQL query není validní u parametru '" + parameter.getName() + "'!");
58
                }
70 59

  
71
            Parameter parameter = assembly.getParameters().get(i);
72
            // Check if current parameter have at least 1 location.
73
            if (parameter == null || parameter.getLocations() == null || parameter.getLocations().size() == 0) {
74
                errors.rejectValue("parameters[" + i + "].locations", "Není vybrána žádná lokace!");
60
                // Check if current parameter have at least 1 location.
61
                if (parameter.getLocations() == null || parameter.getLocations().size() == 0) {
62
                    errors.rejectValue("parameters[" + i + "].locations", "", "Není vybrána žádná lokace u parametru '" + parameter.getName() + "'!");
63
                }
75 64
            }
76 65
        }
77 66
    }
src/main/java/vldc/aswi/web/controller/AssemblyController.java
23 23
 * Controller for assembly.
24 24
 */
25 25
@Controller
26
public class AssemblyController {
26
public class AssemblyController extends BasicController {
27 27

  
28 28
    /** Autowired sql query manager. */
29 29
    @Autowired
......
61 61
    @Autowired
62 62
    private AssemblyValidator assemblyValidator;
63 63

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

  
67
    /** Title text for assembly edit form.  */
68
    private String assemblyEditTitleText = "Editace - ";
69

  
70
    /** Title text for new assembly form. */
71
    private String assemblyNewTitleText = "Vytvoření nové sestavy";
72

  
73
    /** Name of thymeleaf parameter, which will contain error text from validator. */
74
    private String assemblyErrorName = "errorText";
75

  
64 76
    /**
65 77
     * Bind assembly validator.
66 78
     * @param binder Binder.
......
102 114
        return modelAndView;
103 115
    }
104 116

  
117
    /**
118
     * Get method for assembly edit.
119
     * @param id - Id of assembly.
120
     * @return ModelAndView for assembly edit.
121
     */
105 122
    @GetMapping("/assembly_edit")
106 123
    public ModelAndView assemblyEditIndex(@Valid @ModelAttribute("assemblyID") String id) {
107 124
        ModelAndView modelAndView = new ModelAndView("assembly_manage");
......
111 128
        Assembly assembly = this.assemblyManager.getAssemblyById(Long.parseLong(id));
112 129

  
113 130
        modelMap.addAttribute("assembly", assembly);
131

  
132
        modelMap.addAttribute(assemblyTitleName, assemblyEditTitleText + " " + assembly.getName());
133

  
114 134
        modelMap.addAttribute("allRoles", this.roleManager.getRoles());
115 135
        modelMap.addAttribute("allParameterTypes", this.parameterTypeManager.getParameterTypes());
116 136
        modelMap.addAttribute("allFunctions", this.functionManager.getFunctions());
......
120 140
        return modelAndView;
121 141
    }
122 142

  
143
    /**
144
     * Post method for assembly edit.
145
     * @param assembly - Edited assembly values.
146
     * @param result - Validator results.
147
     * @param assemblyIsPublic - Attribute indicating if assembly is public or not.
148
     * @return ModelAndView for assembly edit.
149
     */
123 150
    @PostMapping("/assembly_edit")
124
    public ModelAndView assemblyEditPostIndex(@Valid @ModelAttribute("assembly") Assembly assembly, @Valid @ModelAttribute("checkboxPublic") String assemblyIsPublic) {
151
    public ModelAndView assemblyEditPostIndex(@Valid @ModelAttribute("assembly") Assembly assembly, BindingResult result,
152
                                              @Valid @ModelAttribute("checkboxPublic") String assemblyIsPublic) {
125 153

  
126 154
        ModelAndView modelAndView = new ModelAndView("assembly_manage");
127 155
        ModelMap modelMap = modelAndView.getModelMap();
128 156

  
129
        if (assemblyIsPublic.equals("on")) assembly.setIsPublic(1);
130
        else assembly.setIsPublic(0);
157
        if (result.hasErrors()) {
158
            modelMap.addAttribute("assembly", assembly);
159

  
160
            modelMap.addAttribute(assemblyErrorName, getFullErrorMessage(result));
161
            modelMap.addAttribute(assemblyTitleName, assemblyEditTitleText + " " + assembly.getName());
162
        }
163
        else {
164
            if (assemblyIsPublic.equals("on")) assembly.setIsPublic(1);
165
            else assembly.setIsPublic(0);
131 166

  
132
        // TODO: chybí defaultValue.
133
        Long assemblyID = this.assemblyManager.updateAssembly(assembly);
134
        this.parameterManager.updateParameters(assemblyID, assembly.getParameters());
135
        Assembly updatedAssembly = this.assemblyManager.getAssemblyById(assembly.getId());
167
            // TODO: chybí defaultValue.
168
            Long assemblyID = this.assemblyManager.updateAssembly(assembly);
169
            this.parameterManager.updateParameters(assemblyID, assembly.getParameters());
170
            Assembly updatedAssembly = this.assemblyManager.getAssemblyById(assembly.getId());
136 171

  
137
        modelMap.addAttribute("assembly", updatedAssembly);
172
            modelMap.addAttribute("assembly", updatedAssembly);
173
            modelMap.addAttribute(assemblyTitleName, assemblyEditTitleText + " " + updatedAssembly.getName());
174
        }
138 175

  
139 176
        modelMap.addAttribute("allRoles", this.roleManager.getRoles());
140 177
        modelMap.addAttribute("allParameterTypes", this.parameterTypeManager.getParameterTypes());
......
145 182
        return modelAndView;
146 183
    }
147 184

  
185
    /**
186
     * Get method for new assembly form.
187
     * @return ModelAndView for new assembly.
188
     */
148 189
    @GetMapping("/assembly_new")
149 190
    public ModelAndView assemblyNewIndex() {
150 191
        ModelAndView modelAndView = new ModelAndView("assembly_manage");
......
152 193
        ModelMap modelMap = modelAndView.getModelMap();
153 194

  
154 195
        modelMap.addAttribute("assembly", new Assembly());
196

  
197
        modelMap.addAttribute(assemblyTitleName, assemblyNewTitleText);
198

  
155 199
        modelMap.addAttribute("allRoles", this.roleManager.getRoles());
156 200
        modelMap.addAttribute("allParameterTypes", this.parameterTypeManager.getParameterTypes());
157 201
        modelMap.addAttribute("allFunctions", this.functionManager.getFunctions());
......
161 205
        return modelAndView;
162 206
    }
163 207

  
208
    /**
209
     * Post method for new assembly form.
210
     * @param assembly - Assembly values.
211
     * @param result - Validator results.
212
     * @return
213
     */
164 214
    @PostMapping("/assembly_new")
165
    public ModelAndView assemblyNewIndexPost(@Valid @ModelAttribute("assembly") Assembly assembly) {
215
    public ModelAndView assemblyNewIndexPost(@Valid @ModelAttribute("assembly") Assembly assembly, BindingResult result) {
166 216
        ModelAndView modelAndView = new ModelAndView();
167 217

  
218
        if (result.hasErrors()) {
219
            ModelMap modelMap = modelAndView.getModelMap();
220
            modelAndView.setViewName("assembly_manage");
221

  
222
            modelMap.addAttribute("assembly", assembly);
223

  
224
            modelMap.addAttribute(assemblyTitleName, assemblyNewTitleText);
225
            modelMap.addAttribute(assemblyErrorName, getFullErrorMessage(result));
226

  
227
            modelMap.addAttribute("allRoles", this.roleManager.getRoles());
228
            modelMap.addAttribute("allParameterTypes", this.parameterTypeManager.getParameterTypes());
229
            modelMap.addAttribute("allFunctions", this.functionManager.getFunctions());
230
            modelMap.addAttribute("allOperators", this.operatorManager.getOperators());
231
            modelMap.addAttribute("allLocations", this.locationManager.getLocations());
232
        }
233

  
168 234
        ModelMap modelMap = modelAndView.getModelMap();
169 235

  
170 236
        // TODO: chybí získání default value.
171 237
        Long assemblyId = this.assemblyManager.createAssembly(assembly);
172 238
        this.parameterManager.addParameters(assemblyId, assembly.getParameters());
173 239

  
174
        modelAndView.setViewName("redirect:/assembly_edit?assemblyID=" + assembly.getId());
240
        modelAndView.setViewName("redirect:/assembly_edit?assemblyID=" + assemblyId);
175 241

  
176 242
        return modelAndView;
177 243
    }
src/main/java/vldc/aswi/web/controller/BasicController.java
1
package vldc.aswi.web.controller;
2

  
3
import org.springframework.stereotype.Controller;
4
import org.springframework.validation.BindingResult;
5
import org.springframework.validation.FieldError;
6
import org.springframework.validation.ObjectError;
7

  
8
@Controller
9
public class BasicController {
10

  
11
    /**
12
     * Return message containings all errors from validator.
13
     * @param result Validator results.
14
     * @return String message containings all errors from validator.
15
     */
16
    protected String getFullErrorMessage(BindingResult result) {
17
        String message = "";
18

  
19
        for (Object object : result.getAllErrors()) {
20
            if (object instanceof FieldError) {
21
                FieldError fieldError = (FieldError) object;
22

  
23
                message += fieldError.getDefaultMessage() + ", ";
24
                continue;
25
            }
26

  
27
            if (object instanceof ObjectError) {
28
                ObjectError objectError = (ObjectError) object;
29

  
30
                message += objectError.getDefaultMessage()  + ", ";
31
                continue;
32
            }
33
        }
34
        return message;
35
    }
36
}
src/main/java/vldc/aswi/web/controller/IndexController.java
23 23
import java.util.Map;
24 24

  
25 25
@Controller
26
public class IndexController {
26
public class IndexController extends BasicController {
27 27

  
28 28
	@Autowired
29 29
	private SqlQueryManager sqlQueryManager;
src/main/java/vldc/aswi/web/controller/LoginController.java
4 4
import org.springframework.web.bind.annotation.GetMapping;
5 5

  
6 6
@Controller
7
public class LoginController {
7
public class LoginController extends BasicController {
8 8

  
9 9
	@GetMapping("/login")
10 10
	public String login() {
src/main/webapp/WEB-INF/templates/assembly_manage.html
25 25

  
26 26
  <div class="container">
27 27
    <a href="/" class="btn btn-success mb-2">Zpět</a>
28
    <h1>
29
      Editace - Studenti - studijní programy
28
    <h1 th:text="${title}">
30 29
    </h1>
31 30
  </div>
32 31

  
32
  <p th:text="${errorText}"></p>
33

  
33 34
<form th:object="${assembly}" th:action="${assembly.id} != null ? @{/assembly_edit(assemblyID=${assembly.id})} : @{/assembly_new}" method="post">
34 35
  <input type="hidden" th:field="*{id}" th:value="*{id}" />
35 36
  <div class="container box">

Také k dispozici: Unified diff