Projekt

Obecné

Profil

Stáhnout (7.57 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.dao.InvalidDataAccessResourceUsageException;
9
import org.springframework.stereotype.Service;
10
import vldc.aswi.dao.AssemblyRepository;
11
import vldc.aswi.dao.RoleRepository;
12
import vldc.aswi.domain.Assembly;
13
import vldc.aswi.domain.Role;
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.
46
     * Check if table "Sestava" exists.
47
     */
48
    @EventListener(classes = {
49
            ContextRefreshedEvent.class
50
    })
51
    @Order(1)
52
    @Transactional
53
    public void setup() {
54
        try {
55
            if (this.assemblyRepository.count() == 0) {
56
                // Just checking if table exists.
57
            }
58
        }
59
        catch (InvalidDataAccessResourceUsageException e) {
60
            log.error("Table \"Sestava\" did not exists in database!");
61
            System.exit(1);
62
        }
63
    }
64

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

    
76
    /**
77
     * Get all Assemblies from database ordered.
78
     * @return List of assemblies.
79
     */
80
    @Override
81
    public List<Assembly> getAssembliesOrdered() {
82
        return this.assemblyRepository.getByOrderByAssemblyOrderAsc();
83
    }
84

    
85
    /**
86
     * Get all Assemblies from database with role, ordered.
87
     * @return List of assemblies.
88
     */
89
    @Override
90
    public List<Assembly> getAssembliesWithRoleOrdered(Role role) {
91
        return this.assemblyRepository.getByRolesContainingAndIsPublicOrderByAssemblyOrderAsc(role, 1);
92
    }
93

    
94
    /**
95
     * Get assembly by id.
96
     * @param id - ID of assembly.
97
     * @return Assembly.
98
     */
99
    @Override
100
    public Assembly getAssemblyById(Long id) {
101
        Assembly assembly = this.assemblyRepository.getById(id);
102
        assembly.sortParameterList();
103
        return assembly;
104
    }
105

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

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

    
133
        updateAssemblyRoles(updatedAssemblyValues.getId(), updatedAssemblyValues.getRoles());
134

    
135
        return assembly.getId();
136
    }
137

    
138
    /**
139
     * Update assembly's roles.
140
     * @param id - ID of assembly.
141
     * @param updatedRoles - List of roles.
142
     */
143
    private void updateAssemblyRoles(Long id, List<Role> updatedRoles) {
144
        Assembly assembly = getAssemblyById(id);
145
        List<Role> currentRoles = assembly.getRoles();
146

    
147
        if (updatedRoles != null) {
148
            // Find new roles.
149
            List<Role> currentRolesNew = new LinkedList<>(currentRoles);
150
            List<Role> updatedRolesNew = new LinkedList<>(updatedRoles);
151
            updatedRolesNew.removeAll(currentRolesNew);
152

    
153
            // Find deleted roles.
154
            List<Role> currentRolesDeleted = new LinkedList<>(currentRoles);
155
            List<Role> updatedRolesDeleted = new LinkedList<>(updatedRoles);
156
            currentRolesDeleted.removeAll(updatedRolesDeleted);
157

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

    
161
            // Add new roles and remove deleted roles.
162
            for (Role newRole : updatedRolesNew) {
163
                currentRoles.add(this.roleRepository.getById(newRole.getId()));
164
            }
165
            currentRoles.removeAll(currentRolesDeleted);
166
        }
167

    
168
        // Save updates to database.
169
        this.assemblyRepository.save(assembly);
170
    }
171

    
172
    /**
173
     * Create new assembly.
174
     * @param assemblyValues - Assembly values.
175
     * @return ID of assembly.
176
     */
177
    @Override
178
    public Long createAssembly(Assembly assemblyValues) {
179
        // Create new assembly and assign values.
180
        Assembly assembly = new Assembly();
181
        assembly.setName(assemblyValues.getName());
182
        assembly.setSQLQuery(assemblyValues.getSQLQuery());
183

    
184
        Assembly lastAssembly = this.assemblyRepository.findTopByOrderByAssemblyOrderDesc();
185
        int order = 1;
186

    
187
        if (lastAssembly != null) {
188
            order = lastAssembly.getAssemblyOrder() + 1;
189
        }
190

    
191
        assembly.setAssemblyOrder(order);
192
        assembly.setIsPublic(assemblyValues.getIsPublic());
193
        List<Role> roles = new LinkedList<>();
194

    
195
        // Add access for roles.
196
        if (assemblyValues.getRoles() != null && assemblyValues.getRoles().size() > 0) {
197
            for (Role newRole : assemblyValues.getRoles()) {
198
                roles.add(this.roleRepository.getById(newRole.getId()));
199
            }
200
        }
201

    
202
        assembly.setRoles(roles);
203

    
204
        // Create new record in database.
205
        this.assemblyRepository.save(assembly);
206

    
207
        return assembly.getId();
208
    }
209

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

    
222
            // Delete parameters in current assembly.
223
            this.parameterManager.deleteParameters(id);
224

    
225
            Assembly assembly = this.assemblyRepository.getById(id);
226

    
227
            // Remove roles from 'Sestava_ma_Role' table.
228
            List<Role> roleList = new ArrayList<>(assembly.getRoles());
229
            for (Role role : roleList) {
230
                assembly.removeRole(role);
231
            }
232

    
233
            this.assemblyRepository.save(assembly);
234

    
235
            // Delete assembly.
236
            this.assemblyRepository.delete(assembly);
237
            // TODO: Send message for all users using this assembly.
238
            return true;
239
        } catch (Exception e) {
240
            return false;
241
        }
242
    }
243
}
(2-2/16)