Projekt

Obecné

Profil

Stáhnout (16.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.ParameterRepository;
14
import vldc.aswi.dao.parameter.ParameterTypeRepository;
15
import vldc.aswi.dao.parameter.ParameterValueRepository;
16
import vldc.aswi.domain.*;
17
import vldc.aswi.domain.parameter.Parameter;
18
import vldc.aswi.domain.parameter.ParameterValue;
19

    
20
import javax.transaction.Transactional;
21
import java.util.LinkedList;
22
import java.util.List;
23

    
24
/**
25
 * Manager for Parameter.
26
 */
27
@Service
28
@Slf4j
29
public class ParameterManagerImpl implements ParameterManager {
30

    
31
    /** Autowired parameter repository. */
32
    @Autowired
33
    private ParameterRepository parameterRepository;
34

    
35
    /** Autowired assembly repository. */
36
    @Autowired
37
    private AssemblyRepository assemblyRepository;
38

    
39
    /** Autowired parameterType repository. */
40
    @Autowired
41
    private ParameterTypeRepository parameterTypeRepository;
42

    
43
    /** Autowired location repository. */
44
    @Autowired
45
    private LocationRepository locationRepository;
46

    
47
    /** Autowired function repository. */
48
    @Autowired
49
    private FunctionRepository functionRepository;
50

    
51
    /** Autowired operator repository. */
52
    @Autowired
53
    private OperatorRepository operatorRepository;
54

    
55
    /** Autowired parameterValue repository. */
56
    @Autowired
57
    private ParameterValueRepository parameterValueRepository;
58

    
59
    /**
60
     * Initialization setup for parameter manager. Check if parameter repository contains
61
     * records and if not, initialize default values.
62
     */
63
    @EventListener(classes = {
64
            ContextRefreshedEvent.class
65
    })
66
    @Order(1)
67
    @Transactional
68
    public void setup() {
69
        if (this.parameterRepository.count() == 0) {
70
            log.info("No parameter present, creating items.");
71

    
72
        }
73
    }
74

    
75
    /**
76
     * Get all parameters from database.
77
     * @return List of parameters.
78
     */
79
    @Override
80
    public List<Parameter> getParameters() {
81
        List<Parameter> retVal = new LinkedList<>();
82
        this.parameterRepository.findAll().forEach(retVal::add);
83
        return retVal;
84
    }
85

    
86
    /**
87
     * Add new parameter into database.
88
     * @param assemblyId - Assembly in which parameter is presented.
89
     * @param parameterValuesList - Parameter values.
90
     */
91
    @Override
92
    public void addParameters(Long assemblyId, List<Parameter> parameterValuesList) {
93
        Assembly assembly = this.assemblyRepository.getById(assemblyId);
94
        // TODO: test it.
95
        if (parameterValuesList == null) return;
96

    
97
        for (Parameter parameterValues : parameterValuesList) {
98
            // Create new parameter and assign him all values.
99
            Parameter parameter = new Parameter();
100
            parameter.setName(parameterValues.getNameOfSelect());
101
            parameter.setNameOfSelect(parameterValues.getNameOfSelect());
102
            parameter.setAssembly(assembly);
103
            parameter.setParameterType(this.parameterTypeRepository.findByName(parameterValues.getParameterType().getName()));
104
            parameter.setDefaultValue(parameterValues.getDefaultValue());
105

    
106
            List<Location> locationList = new LinkedList<>();
107
            List<Function> functionList = new LinkedList<>();
108
            List<Operator> operatorList = new LinkedList<>();
109
            List<ParameterValue> valueList = new LinkedList<>();
110

    
111
            // Try to put all locations into list.
112
            if (parameterValues.getLocations() != null && parameterValues.getLocations().size() > 0) {
113
                for (Location location : parameterValues.getLocations()) {
114
                    locationList.add(this.locationRepository.getById(location.getId()));
115
                }
116
            }
117

    
118
            // Try to put all functions into list.
119
            if (parameterValues.getFunctions() != null && parameterValues.getFunctions().size() > 0) {
120
                for (Function function : parameterValues.getFunctions()) {
121
                    functionList.add(this.functionRepository.getById(function.getId()));
122
                }
123
            }
124

    
125
            // Try to put all operators into list.
126
            if (parameterValues.getOperators() != null && parameterValues.getOperators().size() > 0) {
127
                for (Operator operator : parameterValues.getOperators()) {
128
                    operatorList.add(this.operatorRepository.getById(operator.getId()));
129
                }
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

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

    
145
            // Insert parameter into database.
146
            this.parameterRepository.save(parameter);
147
        }
148
    }
149

    
150
    /**
151
     * Update parameter - remove deleted parameters, add new parameters, update updated parameters.
152
     * @param assemblyId - Assembly in which parameter is presented.
153
     * @param newAssemblyParameters - List of parameters.
154
     */
155
    @Override
156
    public void updateParameters(Long assemblyId, List<Parameter> newAssemblyParameters) {
157
        Assembly assembly = this.assemblyRepository.getById(assemblyId);
158
        List<Parameter> currentAssemblyParameters = assembly.getParameters();
159

    
160
        // Find new parameters.
161
        List<Parameter> currentAssemblyParametersNew = new LinkedList<>(currentAssemblyParameters);
162
        List<Parameter> newAssemblyParametersNew = new LinkedList<>(newAssemblyParameters);
163
        newAssemblyParametersNew.removeAll(currentAssemblyParametersNew);
164

    
165
        // Find deleted parameters.
166
        List<Parameter> currentAssemblyParametersDeleted = new LinkedList<>(currentAssemblyParameters);
167
        List<Parameter> newAssemblyParametersDeleted = new LinkedList<>(newAssemblyParameters);
168
        currentAssemblyParametersDeleted.removeAll(newAssemblyParametersDeleted);
169

    
170
        // Find duplicate elements - for updating.
171
        List<Parameter> currentAssemblyParametersUpdated = new LinkedList<>(currentAssemblyParameters);
172
        List<Parameter> newAssemblyParametersUpdated = new LinkedList<>(newAssemblyParameters);
173
        newAssemblyParametersUpdated.retainAll(currentAssemblyParametersUpdated);
174

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

    
178
        // Remove deleted parameters.
179
        for (Parameter parameter : currentAssemblyParametersDeleted) {
180
            for (ParameterValue parameterValue : parameter.getParameterValues()) {
181
                // Remove parameters values.
182
                this.parameterValueRepository.delete(parameterValue);
183
            }
184

    
185
            // Remove parameter.
186
            this.parameterRepository.delete(parameter);
187
        }
188

    
189
        // Update rest parameters.
190
        updateParameters(newAssemblyParametersUpdated);
191

    
192
        // Add new parameters
193
        addParameters(assemblyId, newAssemblyParametersNew);
194
    }
195

    
196
    /**
197
     * Update updated parameters.
198
     * @param parameterValuesList - List of updated parameters.
199
     */
200
    private void updateParameters(List<Parameter> parameterValuesList) {
201
        for (Parameter parameterValues : parameterValuesList) {
202
            // Get current parameter from database.
203
            Parameter parameter = this.parameterRepository.getById(parameterValues.getId());
204
            // Update current parameter values.
205
            parameter.setName(parameterValues.getName());
206
            parameter.setNameOfSelect(parameterValues.getNameOfSelect());
207
            parameter.setAssembly(this.assemblyRepository.getById(parameterValues.getAssembly().getId()));
208
            parameter.setParameterType(this.parameterTypeRepository.getById(parameterValues.getParameterType().getId()));
209
            parameter.setDefaultValue(parameterValues.getDefaultValue());
210

    
211
            // Insert changes into database.
212
            this.parameterRepository.save(parameter);
213

    
214
            // Update parameter values, locations, functions and operators.
215
            updateParameterValues(parameterValues.getId(), parameterValues.getParameterValues());
216
            updateParameterLocations(parameterValues.getId(), parameterValues.getLocations());
217
            updateParameterFunctions(parameterValues.getId(), parameterValues.getFunctions());
218
            updateParameterOperators(parameterValues.getId(), parameterValues.getOperators());
219
        }
220
    }
221

    
222
    /**
223
     * Update current parameter locations.
224
     * @param id - Id of parameter.
225
     * @param updatedLocations - List of locations.
226
     */
227
    private void updateParameterLocations(Long id, List<Location> updatedLocations) {
228
        Parameter parameter = this.parameterRepository.getById(id);
229
        List<Location> currentLocations = parameter.getLocations();
230

    
231
        // Get new locations.
232
        List<Location> currentLocationsNew = new LinkedList<>(currentLocations);
233
        List<Location> updatedLocationsNew = new LinkedList<>(updatedLocations);
234
        updatedLocationsNew.removeAll(currentLocationsNew);
235

    
236
        // Get deleted locations.
237
        List<Location> currentLocationsDeleted = new LinkedList<>(currentLocations);
238
        List<Location> updatedLocationsDeleted = new LinkedList<>(updatedLocations);
239
        currentLocationsDeleted.removeAll(updatedLocationsDeleted);
240

    
241
        // If there is no change, do not update.
242
        if (updatedLocationsNew.size() == 0 && currentLocationsDeleted.size() == 0) return;
243

    
244
        // Add new locations.
245
        for (Location newLocation : updatedLocationsNew) {
246
            currentLocations.add(this.locationRepository.getById(newLocation.getId()));
247
        }
248

    
249
        // Remove deleted locations.
250
        currentLocations.removeAll(currentLocationsDeleted);
251

    
252
        // Insert changes into database.
253
        this.parameterRepository.save(parameter);
254
    }
255

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

    
265
        // Get new functions.
266
        List<Function> currentFunctionsNew = new LinkedList<>(currentFunctions);
267
        List<Function> updatedFunctionsNew = new LinkedList<>(updatedFunctions);
268
        updatedFunctionsNew.removeAll(currentFunctionsNew);
269

    
270
        // Get deleted functions.
271
        List<Function> currentFunctionsDeleted = new LinkedList<>(currentFunctions);
272
        List<Function> updatedFunctionsDeleted = new LinkedList<>(updatedFunctions);
273
        currentFunctionsDeleted.removeAll(updatedFunctionsDeleted);
274

    
275
        // If there is no change, do not update.
276
        if (updatedFunctionsNew.size() == 0 && currentFunctionsDeleted.size() == 0) return;
277

    
278
        // Add new functions.
279
        for (Function newFunction : updatedFunctionsNew) {
280
            currentFunctions.add(this.functionRepository.getById(newFunction.getId()));
281
        }
282

    
283
        // Delete removed functions.
284
        currentFunctions.removeAll(currentFunctionsDeleted);
285

    
286
        // Insert changes into database.
287
        this.parameterRepository.save(parameter);
288
    }
289

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

    
299
        // Get new operators.
300
        List<Operator> currentOperatorsNew = new LinkedList<>(currentOperators);
301
        List<Operator> updatedOperatorsNew = new LinkedList<>(updatedOperators);
302
        updatedOperatorsNew.removeAll(currentOperatorsNew);
303

    
304
        // Get deleted operators.
305
        List<Operator> currentOperatorsDeleted = new LinkedList<>(currentOperators);
306
        List<Operator> updatedOperatorsDeleted = new LinkedList<>(updatedOperators);
307
        currentOperatorsDeleted.removeAll(updatedOperatorsDeleted);
308

    
309
        // If there is no changes, do not update.
310
        if (updatedOperatorsNew.size() == 0 && currentOperatorsDeleted.size() == 0) return;
311

    
312
        // Insert new operators.
313
        for (Operator newOperator : updatedOperatorsNew) {
314
            currentOperators.add(this.operatorRepository.getById(newOperator.getId()));
315
        }
316

    
317
        // Delete removed operators.
318
        currentOperators.removeAll(currentOperatorsDeleted);
319

    
320
        // Insert changes into database.
321
        this.parameterRepository.save(parameter);
322
    }
323

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

    
333
        // Get new parameter values.
334
        List<ParameterValue> currentParameterValuesNew = new LinkedList<>(currentParameterValues);
335
        List<ParameterValue> newParameterValuesNew = new LinkedList<>(newParameterValues);
336
        newParameterValuesNew.removeAll(currentParameterValuesNew);
337

    
338
        // Get deleted parameter values.
339
        List<ParameterValue> currentParameterValuesDeleted = new LinkedList<>(currentParameterValues);
340
        List<ParameterValue> newParameterValuesDeleted = new LinkedList<>(newParameterValues);
341
        currentParameterValuesDeleted.removeAll(newParameterValuesDeleted);
342

    
343
        // Get updated parameter values.
344
        List<ParameterValue> currentParameterValuesUpdated = new LinkedList<>(currentParameterValues);
345
        List<ParameterValue> newParameterValuesUpdated = new LinkedList<>(newParameterValues);
346
        newParameterValuesUpdated.retainAll(currentParameterValuesUpdated);
347

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

    
351
        // Delete removed parameter values.
352
        for (ParameterValue parameterValue : currentParameterValuesDeleted) {
353
            this.parameterValueRepository.delete(parameterValue);
354
        }
355

    
356
        // Update parameter values.
357
        updateParameterValueValues(newParameterValuesUpdated);
358

    
359
        // Add new parameter values.
360
        addParameterValueValues(parameterId, newParameterValuesNew);
361
    }
362

    
363
    /**
364
     * Update all updated parameter values.
365
     * @param updatedParameterValuesList - List of all updated parameter values.
366
     */
367
    private void updateParameterValueValues(List<ParameterValue> updatedParameterValuesList) {
368
        for (ParameterValue parameterValueValues : updatedParameterValuesList) {
369
            ParameterValue parameterValue = this.parameterValueRepository.getById(parameterValueValues.getId());
370
            parameterValue.setValue(parameterValueValues.getValue());
371

    
372
            // Insert changes into database.
373
            this.parameterValueRepository.save(parameterValue);
374
        }
375
    }
376

    
377
    /**
378
     * Add new parameter values.
379
     * @param parameterId - ID of parameter.
380
     * @param newParameterValuesNew - List of new parameter values.
381
     */
382
    private void addParameterValueValues(Long parameterId, List<ParameterValue> newParameterValuesNew) {
383
        Parameter parameter = this.parameterRepository.getById(parameterId);
384

    
385
        for (ParameterValue parameterValueValues : newParameterValuesNew) {
386
            ParameterValue parameterValue = new ParameterValue();
387
            parameterValue.setValue(parameterValueValues.getValue());
388
            parameterValue.setParameter(parameter);
389

    
390
            // Insert new parameterValue into database.
391
            this.parameterValueRepository.save(parameterValue);
392
        }
393
    }
394
}
(4-4/8)