Projekt

Obecné

Profil

Stáhnout (7.56 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.domain.parameter.Parameter;
15
import vldc.aswi.service.parameter.ParameterManager;
16

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

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

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

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

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

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

    
45
    /**
46
     * Initialization setup for assembly manager.
47
     * Check if table "Sestava" exists.
48
     */
49
    @EventListener(classes = {
50
            ContextRefreshedEvent.class
51
    })
52
    @Order(1)
53
    @Transactional
54
    public void setup() {
55
        try {
56
            if (this.assemblyRepository.count() == 0) {
57
                // Just checking if table exists.
58
            }
59
        }
60
        catch (InvalidDataAccessResourceUsageException e) {
61
            log.error("Table \"Sestava\" did not exists in database!");
62
            System.exit(1);
63
        }
64
    }
65

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

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

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

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

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

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

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

    
136
        return assembly.getId();
137
    }
138

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

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

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

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

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

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

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

    
185
        Assembly lastAssembly = this.assemblyRepository.findFirst1ByOrderByAssemblyOrder();
186
        int order = 1;
187

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

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

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

    
203
        assembly.setRoles(roles);
204

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

    
208
        return assembly.getId();
209
    }
210

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

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

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

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

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