Projekt

Obecné

Profil

Stáhnout (6.97 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.service.parameter.ParameterManager;
14

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

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

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

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

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

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

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

    
56
        }
57
    }
58

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

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

    
79
    /**
80
     * Get assembly by id.
81
     * @param id - ID of assembly.
82
     * @return Assembly.
83
     */
84
    @Override
85
    public Assembly getAssemblyById(Long id) {
86
        return assemblyRepository.getById(id);
87
    }
88

    
89
    /**
90
     * Update assembly order.
91
     * @param data - sorted IDs.
92
     */
93
    @Override
94
    public void updateAssemblyOrder(String data) {
95
        String[] idOrder = data.split(",");
96
        for (int i = 0; i < idOrder.length; i++) {
97
            Assembly assembly = getAssemblyById(Long.valueOf(idOrder[i]));
98
            assembly.setAssemblyOrder(i + 1);
99
            this.assemblyRepository.save(assembly);
100
        }
101
    }
102

    
103
    /**
104
     * Update assembly.
105
     * @param updatedAssemblyValues - Assembly values.
106
     * @return ID of assembly.
107
     */
108
    @Override
109
    public Long updateAssembly(Assembly updatedAssemblyValues) {
110
        Assembly assembly = getAssemblyById(updatedAssemblyValues.getId());
111
        assembly.setName(updatedAssemblyValues.getName());
112
        assembly.setSQLQuery(updatedAssemblyValues.getSQLQuery());
113
        assembly.setAssemblyOrder(updatedAssemblyValues.getAssemblyOrder());
114
        assembly.setIsPublic(updatedAssemblyValues.getIsPublic());
115
        this.assemblyRepository.save(assembly);
116

    
117
        updateAssemblyRoles(updatedAssemblyValues.getId(), updatedAssemblyValues.getRoles());
118

    
119
        return assembly.getId();
120
    }
121

    
122
    /**
123
     * Update assembly's roles.
124
     * @param id - ID of assembly.
125
     * @param updatedRoles - List of roles.
126
     */
127
    private void updateAssemblyRoles(Long id, List<Role> updatedRoles) {
128
        Assembly assembly = getAssemblyById(id);
129
        List<Role> currentRoles = assembly.getRoles();
130

    
131
        if (updatedRoles != null) {
132
            // Find new roles.
133
            List<Role> currentRolesNew = new LinkedList<>(currentRoles);
134
            List<Role> updatedRolesNew = new LinkedList<>(updatedRoles);
135
            updatedRolesNew.removeAll(currentRolesNew);
136

    
137
            // Find deleted roles.
138
            List<Role> currentRolesDeleted = new LinkedList<>(currentRoles);
139
            List<Role> updatedRolesDeleted = new LinkedList<>(updatedRoles);
140
            currentRolesDeleted.removeAll(updatedRolesDeleted);
141

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

    
145
            // Add new roles and remove deleted roles.
146
            for (Role newRole : updatedRolesNew) {
147
                currentRoles.add(this.roleRepository.getById(newRole.getId()));
148
            }
149
            currentRoles.removeAll(currentRolesDeleted);
150
        }
151

    
152
        // Save updates to database.
153
        this.assemblyRepository.save(assembly);
154
    }
155

    
156
    /**
157
     * Create new assembly.
158
     * @param assemblyValues - Assembly values.
159
     * @return ID of assembly.
160
     */
161
    @Override
162
    public Long createAssembly(Assembly assemblyValues) {
163
        // Create new assembly and assign values.
164
        Assembly assembly = new Assembly();
165
        assembly.setName(assemblyValues.getName());
166
        assembly.setSQLQuery(assemblyValues.getSQLQuery());
167

    
168
        Assembly lastAssembly = this.assemblyRepository.findFirst1ByOrderByAssemblyOrder();
169
        int order = 1;
170

    
171
        if (lastAssembly != null) {
172
            order = lastAssembly.getAssemblyOrder() + 1;
173
        }
174

    
175
        assembly.setAssemblyOrder(order);
176
        assembly.setIsPublic(assemblyValues.getIsPublic());
177
        List<Role> roles = new LinkedList<>();
178

    
179
        // Add access for roles.
180
        if (assemblyValues.getRoles() != null && assemblyValues.getRoles().size() > 0) {
181
            for (Role newRole : assemblyValues.getRoles()) {
182
                roles.add(this.roleRepository.getById(newRole.getId()));
183
            }
184
        }
185

    
186
        assembly.setRoles(roles);
187

    
188
        // Create new record in database.
189
        this.assemblyRepository.save(assembly);
190

    
191
        return assembly.getId();
192
    }
193

    
194
    /**
195
     * Delete assembly with ID.
196
     * @param id - ID of assembly.
197
     * @return True if delete was successful, otherwise false.
198
     */
199
    @Override
200
    public boolean deleteAssembly(Long id) {
201
        try {
202
            // Delete configurations, which using current assembly.
203
            this.configurationManager.deleteConfigurations(id);
204

    
205
            // Delete parameters in current assembly.
206
            this.parameterManager.deleteParameters(id);
207

    
208
            Assembly assembly = this.assemblyRepository.getById(id);
209

    
210
            // Remove roles from 'Sestava_ma_Role' table.
211
            List<Role> roleList = new ArrayList<>(assembly.getRoles());
212
            for (Role role : roleList) {
213
                assembly.removeRole(role);
214
            }
215

    
216
            // Delete assembly.
217
            this.assemblyRepository.delete(assembly);
218
            // TODO: Send message for all users using this assembly.
219
            return true;
220
        } catch (Exception e) {
221
            return false;
222
        }
223
    }
224
}
(2-2/16)