Salome HOME
The draft of the "Copy from existing study" action is added. The YACS step is introdu...
[tools/siman.git] / Workspace / Siman-Common / src / org / splat / service / ProjectElementServiceImpl.java
1 /*****************************************************************************
2  * Company         OPEN CASCADE
3  * Application     SIMAN
4  * File            $Id$ 
5  * Creation date   07.10.2012
6  * @author         $Author$
7  * @version        $Revision$
8  *****************************************************************************/
9
10 package org.splat.service;
11
12 import java.util.HashMap;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16
17 import org.splat.dal.bo.som.ProjectElement;
18 import org.splat.dal.bo.som.Publication;
19 import org.splat.dal.dao.som.ProjectElementDAO;
20 import org.splat.service.technical.ProjectSettingsService;
21 import org.splat.service.technical.StepsConfigService;
22 import org.splat.som.Step;
23 import org.springframework.transaction.annotation.Transactional;
24
25 /**
26  * Project element service implementation.
27  * 
28  * @author RKV
29  * 
30  */
31 public class ProjectElementServiceImpl implements ProjectElementService {
32
33         /**
34          * Injected project settings service.
35          */
36         private StepsConfigService _stepsConfigService;
37         /**
38          * Injected project element DAO.
39          */
40         private ProjectElementDAO _projectElementDAO;
41
42         /**
43          * {@inheritDoc}
44          * 
45          * @see org.splat.service.ProjectElementService#getFirstStep(org.splat.dal.bo.som.ProjectElement)
46          */
47         public Step getFirstStep(final ProjectElement elem) {
48                 return getSteps(elem)[0];
49         }
50
51         public Step getLastStep(final ProjectElement elem) {
52                 Step[] mystep = getSteps(elem); // For getting the folders length, if null
53                 return mystep[mystep.length - 1];
54         }
55
56         /**
57          * {@inheritDoc}
58          * 
59          * @see org.splat.service.ProjectElementService#getSteps(org.splat.dal.bo.som.ProjectElement)
60          */
61         public Step[] getSteps(final ProjectElement elem) {
62                 if (elem.getFolders() == null) {
63                         List<ProjectSettingsService.Step> steps = getStepsConfigService()
64                                         .getStepsOf(elem.getClass());
65                         Iterator<ProjectSettingsService.Step> nstep = steps.iterator();
66
67                         elem.setFolders(new Step[steps.size()]);
68                         for (int i = 0; i < elem.getFolders().length; i++) {
69                                 elem.getFolders()[i] = new Step(nstep.next(), elem);
70                         }
71                 }
72                 return elem.getFolders(); // No protection against this object corruption as it would not corrupt the database
73         }
74
75         /**
76          * {@inheritDoc}
77          * 
78          * @see org.splat.service.ProjectElementService#getStepsMap(org.splat.dal.bo.som.ProjectElement)
79          */
80         public Map<Integer, Step> getStepsMap(final ProjectElement elem) {
81                 Step[] steps = getSteps(elem);
82                 Map<Integer, Step> res = new HashMap<Integer, Step>();
83                 for (Step step : steps) {
84                         res.put(step.getNumber(), step);
85                 }
86                 return res;
87         }
88
89         /**
90          * Refreshes the internal data potentially out-of-date. This function needs to be called when Publication objects are added to this
91          * Project Element before being saved. The reason is, as saving a persistent object changes its hashcode, hashed data need to be rebuilt
92          * after saving for making functions based on this hashcode such as remove(), working.
93          * 
94          * @param elem
95          *            the project element to refresh
96          */
97         @Transactional
98         public void refresh(final ProjectElement elem) {
99                 Publication[] curdoc = elem.getDocums().toArray(
100                                 new Publication[elem.getDocums().size()]);
101
102                 elem.setFolders(null); // Just in case
103                 elem.getDocums().clear();
104                 for (int i = 0; i < curdoc.length; i++) {
105                         elem.getDocums().add(curdoc[i]);
106                 }
107                 // No need to rebuild the list of SimulationContext as it does not use hashcodes
108                 getProjectElementDAO().update(elem);
109         }
110
111         /**
112          * Get steps config.
113          * 
114          * @return steps config service
115          */
116         private StepsConfigService getStepsConfigService() {
117                 return _stepsConfigService;
118         }
119
120         /**
121          * Set steps config service.
122          * 
123          * @param stepsConfigService
124          *            steps config service
125          */
126         public void setStepsConfigService(
127                         final StepsConfigService stepsConfigService) {
128                 _stepsConfigService = stepsConfigService;
129         }
130
131         /**
132          * Get the projectElementDAO.
133          * 
134          * @return the projectElementDAO
135          */
136         public ProjectElementDAO getProjectElementDAO() {
137                 return _projectElementDAO;
138         }
139
140         /**
141          * Set the projectElementDAO.
142          * 
143          * @param projectElementDAO
144          *            the projectElementDAO to set
145          */
146         public void setProjectElementDAO(final ProjectElementDAO projectElementDAO) {
147                 _projectElementDAO = projectElementDAO;
148         }
149 }