Projekt

Obecné

Profil

Stáhnout (7.36 KB) Statistiky
| Větev: | Revize:
1
package vldc.aswi.service;
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.RoleRepository;
11
import vldc.aswi.domain.Assembly;
12
import vldc.aswi.domain.Role;
13
import vldc.aswi.domain.parameter.Parameter;
14
import vldc.aswi.service.parameter.ParameterManager;
15

    
16
import javax.transaction.Transactional;
17
import java.util.ArrayList;
18
import java.util.LinkedList;
19
import java.util.List;
20

    
21
/**
22
 * Manager for Assembly.
23
 */
24
@Service
25
@Slf4j
26
public class AssemblyManagerImpl implements AssemblyManager {
27

    
28
    /** Autowired assembly repository. */
29
    @Autowired
30
    private AssemblyRepository assemblyRepository;
31

    
32
    /** Autowired role repository. */
33
    @Autowired
34
    private RoleRepository roleRepository;
35

    
36
    /** Autowired configuration manager. */
37
    @Autowired
38
    private ConfigurationManager configurationManager;
39

    
40
    /** Autowired parameter manager. */
41
    @Autowired
42
    private ParameterManager parameterManager;
43

    
44
    /**
45
     * Initialization setup for assembly manager. Check if assembly repository contains
46
     * records and if not, initialize default values.
47
     */
48
    @EventListener(classes = {
49
            ContextRefreshedEvent.class
50
    })
51
    @Order(1)
52
    @Transactional
53
    public void setup() {
54
        if (this.assemblyRepository.count() == 0) {
55
            log.info("No assembly present, creating items.");
56

    
57
        }
58
    }
59

    
60
    /**
61
     * Get all Assemblies from database.
62
     * @return List of assemblies.
63
     */
64
    @Override
65
    public List<Assembly> getAssemblies() {
66
        List<Assembly> retVal = new LinkedList<>();
67
        this.assemblyRepository.findAll().forEach(retVal::add);
68
        return retVal;
69
    }
70

    
71
    /**
72
     * Get all Assemblies from database ordered.
73
     * @return List of assemblies.
74
     */
75
    @Override
76
    public List<Assembly> getAssembliesOrdered() {
77
        return this.assemblyRepository.getByOrderByAssemblyOrderAsc();
78
    }
79

    
80
    /**
81
     * Get all Assemblies from database with role, ordered.
82
     * @return List of assemblies.
83
     */
84
    @Override
85
    public List<Assembly> getAssembliesWithRoleOrdered(Role role) {
86
        return this.assemblyRepository.getByRolesContainingAndIsPublicOrderByAssemblyOrderAsc(role, 1);
87
    }
88

    
89
    /**
90
     * Get assembly by id.
91
     * @param id - ID of assembly.
92
     * @return Assembly.
93
     */
94
    @Override
95
    public Assembly getAssemblyById(Long id) {
96
        Assembly assembly = this.assemblyRepository.getById(id);
97
        assembly.sortParameterList();
98
        return assembly;
99
    }
100

    
101
    /**
102
     * Update assembly order.
103
     * @param data - sorted IDs.
104
     */
105
    @Override
106
    public void updateAssemblyOrder(String data) {
107
        String[] idOrder = data.split(",");
108
        for (int i = 0; i < idOrder.length; i++) {
109
            Assembly assembly = getAssemblyById(Long.valueOf(idOrder[i]));
110
            assembly.setAssemblyOrder(i + 1);
111
            this.assemblyRepository.save(assembly);
112
        }
113
    }
114

    
115
    /**
116
     * Update assembly.
117
     * @param updatedAssemblyValues - Assembly values.
118
     * @return ID of assembly.
119
     */
120
    @Override
121
    public Long updateAssembly(Assembly updatedAssemblyValues) {
122
        Assembly assembly = getAssemblyById(updatedAssemblyValues.getId());
123
        assembly.setName(updatedAssemblyValues.getName());
124
        assembly.setSQLQuery(updatedAssemblyValues.getSQLQuery());
125
        assembly.setIsPublic(updatedAssemblyValues.getIsPublic());
126
        this.assemblyRepository.save(assembly);
127

    
128
        updateAssemblyRoles(updatedAssemblyValues.getId(), updatedAssemblyValues.getRoles());
129

    
130
        return assembly.getId();
131
    }
132

    
133
    /**
134
     * Update assembly's roles.
135
     * @param id - ID of assembly.
136
     * @param updatedRoles - List of roles.
137
     */
138
    private void updateAssemblyRoles(Long id, List<Role> updatedRoles) {
139
        Assembly assembly = getAssemblyById(id);
140
        List<Role> currentRoles = assembly.getRoles();
141

    
142
        if (updatedRoles != null) {
143
            // Find new roles.
144
            List<Role> currentRolesNew = new LinkedList<>(currentRoles);
145
            List<Role> updatedRolesNew = new LinkedList<>(updatedRoles);
146
            updatedRolesNew.removeAll(currentRolesNew);
147

    
148
            // Find deleted roles.
149
            List<Role> currentRolesDeleted = new LinkedList<>(currentRoles);
150
            List<Role> updatedRolesDeleted = new LinkedList<>(updatedRoles);
151
            currentRolesDeleted.removeAll(updatedRolesDeleted);
152

    
153
            // If no role has been deleted or added, then updating is unnecessary.
154
            if (updatedRolesNew.size() == 0 && currentRolesDeleted.size() == 0) return;
155

    
156
            // Add new roles and remove deleted roles.
157
            for (Role newRole : updatedRolesNew) {
158
                currentRoles.add(this.roleRepository.getById(newRole.getId()));
159
            }
160
            currentRoles.removeAll(currentRolesDeleted);
161
        }
162

    
163
        // Save updates to database.
164
        this.assemblyRepository.save(assembly);
165
    }
166

    
167
    /**
168
     * Create new assembly.
169
     * @param assemblyValues - Assembly values.
170
     * @return ID of assembly.
171
     */
172
    @Override
173
    public Long createAssembly(Assembly assemblyValues) {
174
        // Create new assembly and assign values.
175
        Assembly assembly = new Assembly();
176
        assembly.setName(assemblyValues.getName());
177
        assembly.setSQLQuery(assemblyValues.getSQLQuery());
178

    
179
        Assembly lastAssembly = this.assemblyRepository.findFirst1ByOrderByAssemblyOrder();
180
        int order = 1;
181

    
182
        if (lastAssembly != null) {
183
            order = lastAssembly.getAssemblyOrder() + 1;
184
        }
185

    
186
        assembly.setAssemblyOrder(order);
187
        assembly.setIsPublic(assemblyValues.getIsPublic());
188
        List<Role> roles = new LinkedList<>();
189

    
190
        // Add access for roles.
191
        if (assemblyValues.getRoles() != null && assemblyValues.getRoles().size() > 0) {
192
            for (Role newRole : assemblyValues.getRoles()) {
193
                roles.add(this.roleRepository.getById(newRole.getId()));
194
            }
195
        }
196

    
197
        assembly.setRoles(roles);
198

    
199
        // Create new record in database.
200
        this.assemblyRepository.save(assembly);
201

    
202
        return assembly.getId();
203
    }
204

    
205
    /**
206
     * Delete assembly with ID.
207
     * @param id - ID of assembly.
208
     * @return True if delete was successful, otherwise false.
209
     */
210
    @Override
211
    public boolean deleteAssembly(Long id) {
212
        // TODO: Do it as transactional.
213
        try {
214
            // Delete configurations, which using current assembly.
215
            this.configurationManager.deleteConfigurations(id);
216

    
217
            // Delete parameters in current assembly.
218
            this.parameterManager.deleteParameters(id);
219

    
220
            Assembly assembly = this.assemblyRepository.getById(id);
221

    
222
            // Remove roles from 'Sestava_ma_Role' table.
223
            List<Role> roleList = new ArrayList<>(assembly.getRoles());
224
            for (Role role : roleList) {
225
                assembly.removeRole(role);
226
            }
227

    
228
            // Delete assembly.
229
            this.assemblyRepository.delete(assembly);
230
            // TODO: Send message for all users using this assembly.
231
            return true;
232
        } catch (Exception e) {
233
            return false;
234
        }
235
    }
236
}
(2-2/16)