1 /*****************************************************************************
5 * Creation date 06.10.2012
8 *****************************************************************************/
10 package org.splat.service;
12 import java.io.IOException;
13 import java.util.Calendar;
14 import java.util.Iterator;
15 import java.util.List;
17 import org.apache.log4j.Logger;
18 import org.splat.dal.bo.kernel.User;
19 import org.splat.dal.bo.som.KnowledgeElement;
20 import org.splat.dal.bo.som.Publication;
21 import org.splat.dal.bo.som.Scenario;
22 import org.splat.dal.bo.som.SimulationContext;
23 import org.splat.dal.dao.som.KnowledgeElementDAO;
24 import org.splat.dal.dao.som.ScenarioDAO;
25 import org.splat.kernel.InvalidPropertyException;
26 import org.splat.kernel.MissedPropertyException;
27 import org.splat.kernel.MultiplyDefinedException;
28 import org.splat.service.technical.IndexService;
29 import org.splat.som.Step;
30 import org.springframework.transaction.annotation.Transactional;
33 * Scenario service implementation.
35 * @author <a href="mailto:roman.kozlov@opencascade.com">Roman Kozlov (RKV)</a>
37 public class ScenarioServiceImpl implements ScenarioService {
40 * Logger for this class.
42 protected final static Logger logger = Logger
43 .getLogger(ScenarioServiceImpl.class);
46 * Injected index service.
48 private IndexService _indexService;
50 * Injected step service.
52 private StepService _stepService;
54 * Injected publication service.
56 private PublicationService _publicationService;
58 * Injected project element service.
60 private ProjectElementService _projectElementService;
62 * Injected knowledge element DAO.
64 private KnowledgeElementDAO _knowledgeElementDAO;
66 * Injected scenario DAO.
68 private ScenarioDAO _scenarioDAO;
71 * Get the projectElementService.
73 * @return the projectElementService
75 public ProjectElementService getProjectElementService() {
76 return _projectElementService;
80 * Set the projectElementService.
82 * @param projectElementService
83 * the projectElementService to set
85 public void setProjectElementService(
86 ProjectElementService projectElementService) {
87 _projectElementService = projectElementService;
91 * Get the publicationService.
93 * @return the publicationService
95 public PublicationService getPublicationService() {
96 return _publicationService;
100 * Set the publicationService.
102 * @param publicationService
103 * the publicationService to set
105 public void setPublicationService(PublicationService publicationService) {
106 _publicationService = publicationService;
110 * Get the stepService.
112 * @return the stepService
114 public StepService getStepService() {
119 * Set the stepService.
122 * the stepService to set
124 public void setStepService(StepService stepService) {
125 _stepService = stepService;
131 * @see org.splat.service.ScenarioService#addKnowledgeElement(org.splat.dal.bo.som.Scenario,
132 * org.splat.dal.bo.som.KnowledgeElement.Properties)
135 public KnowledgeElement addKnowledgeElement(Scenario aScenario,
136 KnowledgeElement.Properties kprop) throws MissedPropertyException,
137 InvalidPropertyException, MultiplyDefinedException {
138 KnowledgeElement kelm = new KnowledgeElement(kprop
139 .setOwnerScenario(aScenario));
141 getKnowledgeElementDAO().create(kelm);
142 // RKV: commented because of BatchUpdateException during creation of a new study: session.flush(); //RKV
143 // Update of my persistent data
144 aScenario.getKnowledgeElements().add(kelm);
145 // RKV: commented because of NullPointerException during creation of a new study: session.merge(aScenario); //RKV
146 // Update of my transient data
147 List<KnowledgeElement> known = aScenario
148 .getKnowledgeElementsOf(kelm.getType()); // Initializes this.known, if not yet done
150 if (kelm.getType().equals("usecase")) {
151 aScenario.setUcase(kelm);
152 } else if (aScenario.getKnowledgeElementsList() != null) { // If null, knowl will be initialized when needed
153 aScenario.getKnowledgeElementsList().add(kelm);
155 // Update of the index of Knowledge Elements
156 getIndexService().add(kelm);
159 } catch (IOException error) {
160 logger.error("Unable to index the knowedge element '"
161 + kelm.getIndex() + "', reason:", error);
169 * Update the scenario in the database.
172 * the scenario to update
173 * @return true if updating succeeded
176 private boolean update(Scenario aScenario) {
177 boolean isOk = false;
179 getScenarioDAO().update(aScenario); // Update of relational base
181 } catch (Exception error) {
182 logger.error("Unable to re-index the knowledge element '"
183 + aScenario.getIndex() + "', reason:", error);
191 * @see org.splat.service.ScenarioService#checkin(org.splat.dal.bo.som.Scenario)
193 public void checkin(Scenario aScenario) {
194 aScenario.setUser(null);
195 aScenario.setLastModificationDate(Calendar.getInstance().getTime());
196 getScenarioDAO().update(aScenario);
202 * @see org.splat.service.ScenarioService#checkout(org.splat.dal.bo.som.Scenario, org.splat.dal.bo.kernel.User)
204 public boolean checkout(Scenario aScenario, User user) {
205 if (!aScenario.getOwnerStudy().isStaffedBy(user))
208 aScenario.setUser(user);
209 aScenario.setLastModificationDate(Calendar.getInstance().getTime());
210 getScenarioDAO().update(aScenario);
217 * @see org.splat.service.ScenarioService#copyContentsUpTo(org.splat.dal.bo.som.Scenario, org.splat.som.Step)
219 public void copyContentsUpTo(Scenario scenario, Step lastep) {
220 Scenario base = (Scenario) lastep.getOwner();
221 Step[] from = getProjectElementService().getSteps(base);
222 Step[] to = getProjectElementService().getSteps(scenario);
223 for (int i = 0; i < from.length; i++) {
225 if (step.getNumber() > lastep.getNumber())
228 List<Publication> docs = step.getAllDocuments();
229 for (Iterator<Publication> j = docs.iterator(); j.hasNext();) {
230 Publication doc = getPublicationService().copy(j.next(),
231 scenario); // Creation of a new reference to the document
232 // Database.getSession().save(doc); Publications MUST be saved later through cascading when saving the scenario
235 List<SimulationContext> ctex = step.getAllSimulationContexts();
236 for (Iterator<SimulationContext> j = ctex.iterator(); j.hasNext();) {
237 getStepService().addSimulationContext(to[i], j.next());
245 * @see org.splat.service.ScenarioService#isEmpty(org.splat.dal.bo.som.Scenario)
247 public boolean isEmpty(Scenario scenario) {
248 Step[] mystep = getProjectElementService().getSteps(scenario);
249 boolean isEmp = true;
250 for (int i = 0; i < mystep.length; i++) {
251 if (mystep[i].isStarted()) {
263 public boolean isFinished(Scenario scenario) {
264 Step[] mystep = getProjectElementService().getSteps(scenario);
265 boolean notempty = false; // If this is empty, this is not finished
266 for (int i = 0; i < mystep.length; i++) {
267 if (!mystep[i].isStarted())
269 if (!mystep[i].isFinished())
277 * Get the knowledgeElementDAO.
279 * @return the knowledgeElementDAO
281 public KnowledgeElementDAO getKnowledgeElementDAO() {
282 return _knowledgeElementDAO;
286 * Set the knowledgeElementDAO.
288 * @param knowledgeElementDAO
289 * the knowledgeElementDAO to set
291 public void setKnowledgeElementDAO(KnowledgeElementDAO knowledgeElementDAO) {
292 _knowledgeElementDAO = knowledgeElementDAO;
296 * Get the indexService.
298 * @return the indexService
300 public IndexService getIndexService() {
301 return _indexService;
305 * Set the indexService.
307 * @param indexService
308 * the indexService to set
310 public void setIndexService(IndexService indexService) {
311 _indexService = indexService;
315 * Get the scenarioDAO.
317 * @return the scenarioDAO
319 public ScenarioDAO getScenarioDAO() {
324 * Set the scenarioDAO.
327 * the scenarioDAO to set
329 public void setScenarioDAO(ScenarioDAO scenarioDAO) {
330 _scenarioDAO = scenarioDAO;