Projekt

Obecné

Profil

Stáhnout (20.6 KB) Statistiky
| Větev: | Revize:
1
package vldc.aswi.service.parameter;
2

    
3
import lombok.extern.slf4j.Slf4j;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.context.event.ContextRefreshedEvent;
6
import org.springframework.context.event.EventListener;
7
import org.springframework.core.annotation.Order;
8
import org.springframework.stereotype.Service;
9
import vldc.aswi.dao.AssemblyRepository;
10
import vldc.aswi.dao.FunctionRepository;
11
import vldc.aswi.dao.LocationRepository;
12
import vldc.aswi.dao.OperatorRepository;
13
import vldc.aswi.dao.parameter.ParameterInConfigurationRepository;
14
import vldc.aswi.dao.parameter.ParameterRepository;
15
import vldc.aswi.dao.parameter.ParameterTypeRepository;
16
import vldc.aswi.dao.parameter.ParameterValueRepository;
17
import vldc.aswi.domain.*;
18
import vldc.aswi.domain.parameter.Parameter;
19
import vldc.aswi.domain.parameter.ParameterInConfiguration;
20
import vldc.aswi.domain.parameter.ParameterValue;
21

    
22
import javax.transaction.Transactional;
23
import java.util.ArrayList;
24
import java.util.LinkedList;
25
import java.util.List;
26

    
27
/**
28
 * Manager for Parameter.
29
 */
30
@Service
31
@Slf4j
32
public class ParameterManagerImpl implements ParameterManager {
33

    
34
    /** Autowired parameter repository. */
35
    @Autowired
36
    private ParameterRepository parameterRepository;
37

    
38
    /** Autowired assembly repository. */
39
    @Autowired
40
    private AssemblyRepository assemblyRepository;
41

    
42
    /** Autowired parameterType repository. */
43
    @Autowired
44
    private ParameterTypeRepository parameterTypeRepository;
45

    
46
    /** Autowired location repository. */
47
    @Autowired
48
    private LocationRepository locationRepository;
49

    
50
    /** Autowired function repository. */
51
    @Autowired
52
    private FunctionRepository functionRepository;
53

    
54
    /** Autowired operator repository. */
55
    @Autowired
56
    private OperatorRepository operatorRepository;
57

    
58
    /** Autowired parameterValue repository. */
59
    @Autowired
60
    private ParameterValueRepository parameterValueRepository;
61

    
62
    /** Autowired parameter in configuration manager. */
63
    @Autowired
64
    private ParameterInConfigurationManager parameterInConfigurationManager;
65

    
66
    /**
67
     * Initialization setup for parameter manager. Check if parameter repository contains
68
     * records and if not, initialize default values.
69
     */
70
    @EventListener(classes = {
71
            ContextRefreshedEvent.class
72
    })
73
    @Order(1)
74
    @Transactional
75
    public void setup() {
76
        if (this.parameterRepository.count() == 0) {
77
            log.info("No parameter present, creating items.");
78

    
79
        }
80
    }
81

    
82
    /**
83
     * Get all parameters from database.
84
     * @return List of parameters.
85
     */
86
    @Override
87
    public List<Parameter> getParameters() {
88
        List<Parameter> retVal = new LinkedList<>();
89
        this.parameterRepository.findAll().forEach(retVal::add);
90
        return retVal;
91
    }
92

    
93
    /**
94
     * Add new parameter into database.
95
     * @param assemblyId - Assembly in which parameter is presented.
96
     * @param parameterValuesList - Parameter values.
97
     */
98
    @Override
99
    public void addParameters(Long assemblyId, List<Parameter> parameterValuesList) {
100
        Assembly assembly = this.assemblyRepository.getById(assemblyId);
101
        if (parameterValuesList == null) return;
102

    
103
        for (Parameter parameterValues : parameterValuesList) {
104
            // Create new parameter and assign him all values.
105
            Parameter parameter = new Parameter();
106
            parameter.setName(parameterValues.getName());
107
            parameter.setNameOfSelect(parameterValues.getNameOfSelect());
108
            parameter.setAssembly(assembly);
109
            parameter.setParameterOrder(parameterValues.getParameterOrder());
110
            parameter.setParameterType(this.parameterTypeRepository.findByName(parameterValues.getParameterType().getName()));
111
            parameter.setDefaultValue(parameterValues.getDefaultValue());
112

    
113
            List<Location> locationList = new LinkedList<>();
114
            List<Function> functionList = new LinkedList<>();
115
            List<Operator> operatorList = new LinkedList<>();
116
            List<ParameterValue> valueList = new LinkedList<>();
117

    
118
            // Try to put all locations into list.
119
            if (parameterValues.getLocations() != null && parameterValues.getLocations().size() > 0) {
120
                for (Location location : parameterValues.getLocations()) {
121
                    locationList.add(this.locationRepository.getById(location.getId()));
122
                }
123
            }
124

    
125
            // Try to put all functions into list.
126
            if (parameterValues.getFunctions() != null && parameterValues.getFunctions().size() > 0) {
127
                for (Function function : parameterValues.getFunctions()) {
128
                    functionList.add(this.functionRepository.getById(function.getId()));
129
                }
130
            }
131

    
132
            // Try to put all operators into list.
133
            if (parameterValues.getOperators() != null && parameterValues.getOperators().size() > 0) {
134
                for (Operator operator : parameterValues.getOperators()) {
135
                    operatorList.add(this.operatorRepository.getById(operator.getId()));
136
                }
137
            }
138

    
139
            if (parameter.getParameterType().getName().equals("Výčet")) {
140
                // Try to put all values into list.
141
                if (parameterValues.getParameterValues() != null && parameterValues.getParameterValues().size() > 0) {
142
                    for (ParameterValue parameterValue : parameterValues.getParameterValues()) {
143
                        valueList.add(this.parameterValueRepository.getById(parameterValue.getId()));
144
                    }
145
                }
146

    
147
                parameter.setParameterValues(valueList);
148
            }
149

    
150
            // Set lists of values into parameter.
151
            parameter.setLocations(locationList);
152
            parameter.setFunctions(functionList);
153
            parameter.setOperators(operatorList);
154

    
155
            // Insert parameter into database.
156
            this.parameterRepository.save(parameter);
157
        }
158
    }
159

    
160
    /**
161
     * Update parameter - remove deleted parameters, add new parameters, update updated parameters.
162
     * @param assemblyId - Assembly in which parameter is presented.
163
     * @param newAssemblyParameters - List of parameters.
164
     */
165
    @Override
166
    public void updateParameters(Long assemblyId, List<Parameter> newAssemblyParameters) {
167
        Assembly assembly = this.assemblyRepository.getById(assemblyId);
168
        List<Parameter> currentAssemblyParameters = assembly.getParameters();
169

    
170
        if (newAssemblyParameters != null) {
171
            // Remove removed parameters.
172
            newAssemblyParameters = removeRemovedParametersFromList(newAssemblyParameters);
173

    
174
            // Find new parameters.
175
            List<Parameter> currentAssemblyParametersNew = new LinkedList<>(currentAssemblyParameters);
176
            List<Parameter> newAssemblyParametersNew = new LinkedList<>(newAssemblyParameters);
177
            newAssemblyParametersNew.removeAll(currentAssemblyParametersNew);
178

    
179
            // Find deleted parameters.
180
            List<Parameter> currentAssemblyParametersDeleted = new LinkedList<>(currentAssemblyParameters);
181
            List<Parameter> newAssemblyParametersDeleted = new LinkedList<>(newAssemblyParameters);
182
            currentAssemblyParametersDeleted.removeAll(newAssemblyParametersDeleted);
183

    
184
            // Find duplicate elements - for updating.
185
            List<Parameter> currentAssemblyParametersUpdated = new LinkedList<>(currentAssemblyParameters);
186
            List<Parameter> newAssemblyParametersUpdated = new LinkedList<>(newAssemblyParameters);
187
            newAssemblyParametersUpdated.retainAll(currentAssemblyParametersUpdated);
188

    
189
            // If no parameter has been deleted or added, then updating is unnecessary.
190
            if (newAssemblyParametersNew.size() == 0 && currentAssemblyParametersDeleted.size() == 0 && newAssemblyParametersUpdated.size() == 0)
191
                return;
192

    
193
            // Remove deleted parameters.
194
            for (Parameter parameterWithValues : currentAssemblyParametersDeleted) {
195
                deleteParameter(parameterWithValues.getId());
196
            }
197

    
198
            // Update rest parameters.
199
            updateParameters(newAssemblyParametersUpdated);
200

    
201
            // Add new parameters
202
            addParameters(assemblyId, newAssemblyParametersNew);
203

    
204
            assembly.setParameters(this.parameterRepository.getByAssemblyId(assemblyId));
205
        }
206
    }
207

    
208
    /**
209
     * Remove removed parameters by web application.
210
     * Web page returns list of parameters, even those, which was removed, but those parameters
211
     * are empty object (null values in every attribute), so we need to remove them from list.
212
     * @param parameterValuesList - List of parameters from web.
213
     * @return Filtered list of parameters.
214
     */
215
    private List<Parameter> removeRemovedParametersFromList(List<Parameter> parameterValuesList) {
216
        List<Parameter> filteredParametersWithValues = new ArrayList<Parameter>();
217

    
218
        for (Parameter parameterWithValues : parameterValuesList) {
219
            // Because name of parameter is required, then we know that parameter
220
            // with name == null is just empty object.
221
            if (parameterWithValues.getName() != null) {
222
                filteredParametersWithValues.add(parameterWithValues);
223
            }
224
        }
225

    
226
        return filteredParametersWithValues;
227
    }
228

    
229
    /**
230
     * Update updated parameters.
231
     * @param parameterValuesList - List of updated parameters.
232
     */
233
    private void updateParameters(List<Parameter> parameterValuesList) {
234
        for (Parameter parameterValues : parameterValuesList) {
235
            // Get current parameter from database.
236
            Parameter parameter = this.parameterRepository.getById(parameterValues.getId());
237
            // Update current parameter values.
238
            parameter.setName(parameterValues.getName());
239
            parameter.setParameterOrder(parameterValues.getParameterOrder());
240
            parameter.setNameOfSelect(parameterValues.getNameOfSelect());
241
            parameter.setAssembly(this.assemblyRepository.getById(parameterValues.getAssembly().getId()));
242
            parameter.setParameterType(this.parameterTypeRepository.getById(parameterValues.getParameterType().getId()));
243
            parameter.setDefaultValue(parameterValues.getDefaultValue());
244

    
245
            // Insert changes into database.
246
            this.parameterRepository.save(parameter);
247

    
248
            // Update parameter values, locations, functions and operators.
249
            if (parameter.getParameterType().equals("Výčet")) {
250
                updateParameterValues(parameterValues.getId(), parameterValues.getParameterValues());
251
            }
252

    
253
            updateParameterLocations(parameterValues.getId(), parameterValues.getLocations());
254
            updateParameterFunctions(parameterValues.getId(), parameterValues.getFunctions());
255
            updateParameterOperators(parameterValues.getId(), parameterValues.getOperators());
256
        }
257
    }
258

    
259
    /**
260
     * Update current parameter locations.
261
     * @param id - Id of parameter.
262
     * @param updatedLocations - List of locations.
263
     */
264
    private void updateParameterLocations(Long id, List<Location> updatedLocations) {
265
        Parameter parameter = this.parameterRepository.getById(id);
266
        List<Location> currentLocations = parameter.getLocations();
267

    
268
        // Get new locations.
269
        List<Location> currentLocationsNew = new LinkedList<>(currentLocations);
270
        List<Location> updatedLocationsNew = new LinkedList<>(updatedLocations);
271
        updatedLocationsNew.removeAll(currentLocationsNew);
272

    
273
        // Get deleted locations.
274
        List<Location> currentLocationsDeleted = new LinkedList<>(currentLocations);
275
        List<Location> updatedLocationsDeleted = new LinkedList<>(updatedLocations);
276
        currentLocationsDeleted.removeAll(updatedLocationsDeleted);
277

    
278
        // If there is no change, do not update.
279
        if (updatedLocationsNew.size() == 0 && currentLocationsDeleted.size() == 0) return;
280

    
281
        // Add new locations.
282
        for (Location newLocation : updatedLocationsNew) {
283
            currentLocations.add(this.locationRepository.getById(newLocation.getId()));
284
        }
285

    
286
        // Remove deleted locations.
287
        currentLocations.removeAll(currentLocationsDeleted);
288

    
289
        // Insert changes into database.
290
        this.parameterRepository.save(parameter);
291
    }
292

    
293
    /**
294
     * Update current parameter functions.
295
     * @param id - Id of parameter.
296
     * @param updatedFunctions - List of functions.
297
     */
298
    private void updateParameterFunctions(Long id, List<Function> updatedFunctions) {
299
        Parameter parameter = this.parameterRepository.getById(id);
300
        List<Function> currentFunctions = parameter.getFunctions();
301

    
302
        // Get new functions.
303
        List<Function> currentFunctionsNew = new LinkedList<>(currentFunctions);
304
        List<Function> updatedFunctionsNew = new LinkedList<>(updatedFunctions);
305
        updatedFunctionsNew.removeAll(currentFunctionsNew);
306

    
307
        // Get deleted functions.
308
        List<Function> currentFunctionsDeleted = new LinkedList<>(currentFunctions);
309
        List<Function> updatedFunctionsDeleted = new LinkedList<>(updatedFunctions);
310
        currentFunctionsDeleted.removeAll(updatedFunctionsDeleted);
311

    
312
        // If there is no change, do not update.
313
        if (updatedFunctionsNew.size() == 0 && currentFunctionsDeleted.size() == 0) return;
314

    
315
        // Add new functions.
316
        for (Function newFunction : updatedFunctionsNew) {
317
            currentFunctions.add(this.functionRepository.getById(newFunction.getId()));
318
        }
319

    
320
        // Delete removed functions.
321
        currentFunctions.removeAll(currentFunctionsDeleted);
322

    
323
        // Insert changes into database.
324
        this.parameterRepository.save(parameter);
325
    }
326

    
327
    /**
328
     * Update current parameter operators.
329
     * @param id - Id of parameter.
330
     * @param updatedOperators - List of operators.
331
     */
332
    private void updateParameterOperators(Long id, List<Operator> updatedOperators) {
333
        Parameter parameter = this.parameterRepository.getById(id);
334
        List<Operator> currentOperators = parameter.getOperators();
335

    
336
        // Get new operators.
337
        List<Operator> currentOperatorsNew = new LinkedList<>(currentOperators);
338
        List<Operator> updatedOperatorsNew = new LinkedList<>(updatedOperators);
339
        updatedOperatorsNew.removeAll(currentOperatorsNew);
340

    
341
        // Get deleted operators.
342
        List<Operator> currentOperatorsDeleted = new LinkedList<>(currentOperators);
343
        List<Operator> updatedOperatorsDeleted = new LinkedList<>(updatedOperators);
344
        currentOperatorsDeleted.removeAll(updatedOperatorsDeleted);
345

    
346
        // If there is no changes, do not update.
347
        if (updatedOperatorsNew.size() == 0 && currentOperatorsDeleted.size() == 0) return;
348

    
349
        // Insert new operators.
350
        for (Operator newOperator : updatedOperatorsNew) {
351
            currentOperators.add(this.operatorRepository.getById(newOperator.getId()));
352
        }
353

    
354
        // Delete removed operators.
355
        currentOperators.removeAll(currentOperatorsDeleted);
356

    
357
        // Insert changes into database.
358
        this.parameterRepository.save(parameter);
359
    }
360

    
361
    /**
362
     * Update current parameter values.
363
     * @param parameterId - ID of parameter.
364
     * @param newParameterValues - List of parameter values.
365
     */
366
    private void updateParameterValues(Long parameterId, List<ParameterValue> newParameterValues) {
367
        Parameter parameter = this.parameterRepository.getById(parameterId);
368
        List<ParameterValue> currentParameterValues = parameter.getParameterValues();
369

    
370
        // Get new parameter values.
371
        List<ParameterValue> currentParameterValuesNew = new LinkedList<>(currentParameterValues);
372
        List<ParameterValue> newParameterValuesNew = new LinkedList<>(newParameterValues);
373
        newParameterValuesNew.removeAll(currentParameterValuesNew);
374

    
375
        // Get deleted parameter values.
376
        List<ParameterValue> currentParameterValuesDeleted = new LinkedList<>(currentParameterValues);
377
        List<ParameterValue> newParameterValuesDeleted = new LinkedList<>(newParameterValues);
378
        currentParameterValuesDeleted.removeAll(newParameterValuesDeleted);
379

    
380
        // Get updated parameter values.
381
        List<ParameterValue> currentParameterValuesUpdated = new LinkedList<>(currentParameterValues);
382
        List<ParameterValue> newParameterValuesUpdated = new LinkedList<>(newParameterValues);
383
        newParameterValuesUpdated.retainAll(currentParameterValuesUpdated);
384

    
385
        // If there is no changes, do not update.
386
        if (newParameterValuesNew.size() == 0 && currentParameterValuesDeleted.size() == 0 && newParameterValuesUpdated.size() == 0) return;
387

    
388
        // Delete removed parameter values.
389
        for (ParameterValue parameterValue : currentParameterValuesDeleted) {
390
            this.parameterValueRepository.delete(parameterValue);
391
        }
392

    
393
        // Update parameter values.
394
        updateParameterValueValues(newParameterValuesUpdated);
395

    
396
        // Add new parameter values.
397
        addParameterValueValues(parameterId, newParameterValuesNew);
398
    }
399

    
400
    /**
401
     * Update all updated parameter values.
402
     * @param updatedParameterValuesList - List of all updated parameter values.
403
     */
404
    private void updateParameterValueValues(List<ParameterValue> updatedParameterValuesList) {
405
        for (ParameterValue parameterValueValues : updatedParameterValuesList) {
406
            ParameterValue parameterValue = this.parameterValueRepository.getById(parameterValueValues.getId());
407
            parameterValue.setValue(parameterValueValues.getValue());
408

    
409
            // Insert changes into database.
410
            this.parameterValueRepository.save(parameterValue);
411
        }
412
    }
413

    
414
    /**
415
     * Add new parameter values.
416
     * @param parameterId - ID of parameter.
417
     * @param newParameterValuesNew - List of new parameter values.
418
     */
419
    private void addParameterValueValues(Long parameterId, List<ParameterValue> newParameterValuesNew) {
420
        Parameter parameter = this.parameterRepository.getById(parameterId);
421

    
422
        for (ParameterValue parameterValueValues : newParameterValuesNew) {
423
            ParameterValue parameterValue = new ParameterValue();
424
            parameterValue.setValue(parameterValueValues.getValue());
425
            parameterValue.setParameter(parameter);
426

    
427
            // Insert new parameterValue into database.
428
            this.parameterValueRepository.save(parameterValue);
429
        }
430
    }
431

    
432
    /**
433
     * Delete parameter by id.
434
     * @param parameterId - ID of parameter.
435
     * @return True if parameter was successfully deleted, false if not.
436
     */
437
    private boolean deleteParameter(Long parameterId) {
438
        try {
439
            Parameter parameter = this.parameterRepository.getById(parameterId);
440

    
441
            this.parameterInConfigurationManager.deleteParametersInConfiguration(parameterId, false);
442

    
443
            // Delete removed parameter values.
444
            for (ParameterValue parameterValue : parameter.getParameterValues()) {
445
                this.parameterValueRepository.delete(parameterValue);
446
            }
447

    
448
            // Delete all functions from parameter in table 'Parametr_ma_Funkce'.
449
            List<Function> functionList = new ArrayList<>(parameter.getFunctions());
450
            for (Function function : functionList) {
451
                parameter.removeFunction(function);
452
            }
453

    
454
            // Delete all operators from parameter in table 'Parametr_ma_Operator'.
455
            List<Operator> operatorList = new ArrayList<>(parameter.getOperators());
456
            for (Operator operator : operatorList) {
457
                parameter.removeOperator(operator);
458
            }
459

    
460
            // Delete all locations from parameter in table 'Parametr_ma_Umisteni'.
461
            List<Location> locationList = new ArrayList<>(parameter.getLocations());
462
            for (Location location : locationList) {
463
                parameter.removeLocation(location);
464
            }
465

    
466
            this.parameterRepository.delete(parameter);
467

    
468
            return true;
469
        }
470
        catch (Exception e) {
471
            return false;
472
        }
473
    }
474

    
475
    /**
476
     * Delete parameters by assembly id.
477
     * @param assemblyId - ID of assembly.
478
     * @return True if all parameters were successfully deleted, false if not.
479
     */
480
    @Override
481
    public boolean deleteParameters(Long assemblyId) {
482
        try {
483
            List<Parameter> parameters = this.parameterRepository.getByAssemblyId(assemblyId);
484

    
485
            for (Parameter parameter : parameters) {
486
                boolean success = deleteParameter(parameter.getId());
487
                if (success == false) {
488
                    return false;
489
                }
490
            }
491
            return true;
492
        } catch (Exception e) {
493
            return false;
494
        }
495
    }
496
}
(4-4/8)