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.hibernate.HibernateException;
19 import org.hibernate.Session;
20 import org.hibernate.Transaction;
21 import org.splat.dal.bo.kernel.User;
22 import org.splat.dal.bo.som.KnowledgeElement;
23 import org.splat.dal.bo.som.Publication;
24 import org.splat.dal.bo.som.Scenario;
25 import org.splat.dal.bo.som.SimulationContext;
26 import org.splat.dal.dao.som.Database;
27 import org.splat.dal.dao.som.KnowledgeElementDAO;
28 import org.splat.dal.dao.som.ScenarioDAO;
29 import org.splat.kernel.InvalidPropertyException;
30 import org.splat.kernel.MissedPropertyException;
31 import org.splat.kernel.MultiplyDefinedException;
32 import org.splat.service.technical.IndexService;
33 import org.splat.som.Step;
34 import org.springframework.transaction.annotation.Transactional;
37 * Scenario service implementation.
39 * @author <a href="mailto:roman.kozlov@opencascade.com">Roman Kozlov (RKV)</a>
41 public class ScenarioServiceImpl implements ScenarioService {
44 * Logger for this class.
46 protected final static Logger logger = Logger
47 .getLogger(ScenarioServiceImpl.class);
50 * Injected index service.
52 private IndexService _indexService;
54 * Injected step service.
56 private StepService _stepService;
58 * Injected publication service.
60 private PublicationService _publicationService;
62 * Injected project element service.
64 private ProjectElementService _projectElementService;
66 * Injected knowledge element DAO.
68 private KnowledgeElementDAO _knowledgeElementDAO;
70 * Injected scenario DAO.
72 private ScenarioDAO _scenarioDAO;
75 * Get the projectElementService.
77 * @return the projectElementService
79 public ProjectElementService getProjectElementService() {
80 return _projectElementService;
84 * Set the projectElementService.
86 * @param projectElementService
87 * the projectElementService to set
89 public void setProjectElementService(
90 ProjectElementService projectElementService) {
91 _projectElementService = projectElementService;
95 * Get the publicationService.
97 * @return the publicationService
99 public PublicationService getPublicationService() {
100 return _publicationService;
104 * Set the publicationService.
106 * @param publicationService
107 * the publicationService to set
109 public void setPublicationService(PublicationService publicationService) {
110 _publicationService = publicationService;
114 * Get the stepService.
116 * @return the stepService
118 public StepService getStepService() {
123 * Set the stepService.
126 * the stepService to set
128 public void setStepService(StepService stepService) {
129 _stepService = stepService;
135 * @see org.splat.service.ScenarioService#addKnowledgeElement(org.splat.dal.bo.som.Scenario,
136 * org.splat.dal.bo.som.KnowledgeElement.Properties)
139 public KnowledgeElement addKnowledgeElement(Scenario aScenario,
140 KnowledgeElement.Properties kprop) throws MissedPropertyException,
141 InvalidPropertyException, MultiplyDefinedException {
142 KnowledgeElement kelm = new KnowledgeElement(kprop
143 .setOwnerScenario(aScenario));
145 getKnowledgeElementDAO().create(kelm);
146 // RKV: commented because of BatchUpdateException during creation of a new study: session.flush(); //RKV
147 // Update of my persistent data
148 aScenario.getKnowledgeElements().add(kelm);
149 // RKV: commented because of NullPointerException during creation of a new study: session.merge(aScenario); //RKV
150 // Update of my transient data
151 List<KnowledgeElement> known = aScenario
152 .getKnowledgeElementsOf(kelm.getType()); // Initializes this.known, if not yet done
154 if (kelm.getType().equals("usecase")) {
155 aScenario.setUcase(kelm);
156 } else if (aScenario.getKnowledgeElementsList() != null) { // If null, knowl will be initialized when needed
157 aScenario.getKnowledgeElementsList().add(kelm);
159 // Update of the index of Knowledge Elements
160 getIndexService().add(kelm);
163 } catch (IOException error) {
164 logger.error("Unable to index the knowedge element '"
165 + kelm.getIndex() + "', reason:", error);
173 * Update the scenario in the database.
176 * the scenario to update
177 * @return true if updating succeeded
180 private boolean update(Scenario aScenario) {
181 boolean isOk = false;
183 getScenarioDAO().update(aScenario); // Update of relational base
185 } catch (Exception error) {
186 logger.error("Unable to re-index the knowledge element '"
187 + aScenario.getIndex() + "', reason:", error);
195 * @see org.splat.service.ScenarioService#checkin(org.splat.dal.bo.som.Scenario)
197 public void checkin(Scenario aScenario) {
198 aScenario.setUser(null);
199 aScenario.setLastModificationDate(Calendar.getInstance().getTime());
200 Database.getSession().update(aScenario);
208 public boolean checkout(Scenario aScenario, User user) {
209 if (!aScenario.getOwnerStudy().isStaffedBy(user))
212 aScenario.setUser(user);
213 aScenario.setLastModificationDate(Calendar.getInstance().getTime());
214 Database.getSession().update(aScenario);
221 * @see org.splat.service.ScenarioService#copyContentsUpTo(org.splat.dal.bo.som.Scenario, org.splat.som.Step)
223 public void copyContentsUpTo(Scenario scenario, Step lastep) {
224 Scenario base = (Scenario) lastep.getOwner();
225 Step[] from = getProjectElementService().getSteps(base);
226 Step[] to = getProjectElementService().getSteps(scenario);
227 for (int i = 0; i < from.length; i++) {
229 if (step.getNumber() > lastep.getNumber())
232 List<Publication> docs = step.getAllDocuments();
233 for (Iterator<Publication> j = docs.iterator(); j.hasNext();) {
234 Publication doc = getPublicationService().copy(j.next(),
235 scenario); // Creation of a new reference to the document
236 // Database.getSession().save(doc); Publications MUST be saved later through cascading when saving the scenario
239 List<SimulationContext> ctex = step.getAllSimulationContexts();
240 for (Iterator<SimulationContext> j = ctex.iterator(); j.hasNext();) {
241 getStepService().addSimulationContext(to[i], j.next());
249 * @see org.splat.service.ScenarioService#isEmpty(org.splat.dal.bo.som.Scenario)
251 public boolean isEmpty(Scenario scenario) {
252 Step[] mystep = getProjectElementService().getSteps(scenario);
253 boolean isEmp = true;
254 for (int i = 0; i < mystep.length; i++) {
255 if (mystep[i].isStarted()) {
267 public boolean isFinished(Scenario scenario) {
268 Step[] mystep = getProjectElementService().getSteps(scenario);
269 boolean notempty = false; // If this is empty, this is not finished
270 for (int i = 0; i < mystep.length; i++) {
271 if (!mystep[i].isStarted())
273 if (!mystep[i].isFinished())
281 * Get the knowledgeElementDAO.
283 * @return the knowledgeElementDAO
285 public KnowledgeElementDAO getKnowledgeElementDAO() {
286 return _knowledgeElementDAO;
290 * Set the knowledgeElementDAO.
292 * @param knowledgeElementDAO
293 * the knowledgeElementDAO to set
295 public void setKnowledgeElementDAO(KnowledgeElementDAO knowledgeElementDAO) {
296 _knowledgeElementDAO = knowledgeElementDAO;
300 * Get the indexService.
302 * @return the indexService
304 public IndexService getIndexService() {
305 return _indexService;
309 * Set the indexService.
311 * @param indexService
312 * the indexService to set
314 public void setIndexService(IndexService indexService) {
315 _indexService = indexService;
319 * Get the scenarioDAO.
321 * @return the scenarioDAO
323 public ScenarioDAO getScenarioDAO() {
328 * Set the scenarioDAO.
331 * the scenarioDAO to set
333 public void setScenarioDAO(ScenarioDAO scenarioDAO) {
334 _scenarioDAO = scenarioDAO;