1 package org.splat.simer;
5 * @author Daniel Brunier-Coulin
6 * @copyright OPEN CASCADE 2012
11 import java.text.SimpleDateFormat;
12 import java.util.ArrayList;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.ResourceBundle;
17 import org.apache.log4j.Logger;
18 import org.splat.dal.bo.kernel.User;
19 import org.splat.dal.bo.som.Document;
20 import org.splat.dal.bo.som.DocumentType;
21 import org.splat.dal.bo.som.KnowledgeElement;
22 import org.splat.dal.bo.som.ProgressState;
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.bo.som.Study;
27 import org.splat.kernel.Do;
28 import org.splat.manox.Toolbox;
29 import org.splat.manox.Writer;
30 import org.splat.service.DocumentService;
31 import org.splat.service.DocumentTypeService;
32 import org.splat.service.StepService;
33 import org.splat.service.StudyService;
34 import org.splat.service.dto.KnowledgeElementDTO;
35 import org.splat.service.technical.RepositoryService;
36 import org.splat.som.Revision;
37 import org.splat.som.Step;
38 import org.splat.som.StepRights;
39 import org.splat.som.StudyRights;
40 import org.splat.util.BeanHelper;
41 import org.splat.wapp.ToolBar;
43 public class OpenStudy extends AbstractOpenObject implements OpenStudyServices {
48 protected final static Logger LOGGER = org.splat.simer.Action.LOG;
50 private transient Study _mystudy;
52 * User rights on the open study.
54 private transient StudyRights _urightstudy;
56 * User rights on the selected step.
58 private transient StepRights _urightstep;
59 private transient String _version;
60 private transient String _credate;
61 private transient String _lasdate;
62 private transient Publication _selecdoc;
64 * Injected step service.
66 private StepService _stepService;
68 * Injected repository service.
70 private RepositoryService _repositoryService;
72 * Injected document type service.
74 private DocumentTypeService _documentTypeService;
76 * Injected document service.
78 private DocumentService _documentService;
80 * The injected Study service.
82 private StudyService _studyService;
84 // ==============================================================================================================================
86 // ==============================================================================================================================
89 * Open the given study in the current http session.
95 * @return this open study object
97 public OpenStudy open(final User user, final Study study) {
98 ResourceBundle custom = ResourceBundle.getBundle("som",
99 getApplicationSettings().getCurrentLocale());
100 SimpleDateFormat datstring = new SimpleDateFormat(custom
101 .getString("date.format"));
102 Revision.Format verstring = new Revision.Format(getProjectSettings()
103 .getRevisionPattern());
105 _cuser = user; // May be null if nobody connected
107 _selection = "0.1"; // Default selection
110 // Preparation of the display
111 _version = verstring.format(_mystudy.getVersion());
112 _credate = datstring.format(_mystudy.getDate());
113 _lasdate = ""; // Not yet supported
114 _description = _mystudy.getDescription();
115 _involving = new ArrayList<Step>(1);
116 _context = new ArrayList<SimulationContextFacade>();
117 _ustep = getProjectElementService().getFirstStep(_mystudy);
118 _ustep.setActor(_cuser);
119 _involving.add(_ustep);
120 for (Iterator<SimulationContext> i = _ustep.getAllSimulationContexts()
121 .iterator(); i.hasNext();) {
122 _context.add(new SimulationContextFacade(i.next(),
123 getProjectSettings().getAllSteps(),
124 getApplicationSettings()));
126 if (getStudyService().isStaffedBy(_mystudy, _cuser)
127 || getStudyService().hasActor(_mystudy, _cuser)) {
128 // ProgressState state = mystudy.getProgressState();
129 // if (state == ProgressState.inCHECK) popup = getApplicationSettings().getPopupMenu("stapprovable");
130 // else if (state == ProgressState.APPROVED) popup = getApplicationSettings().getPopupMenu("stapproved");
131 /* else */_popup = getApplicationSettings().getPopupMenu(
133 _popup.setContext("study", new StudyRights(_cuser, _mystudy));
135 _urightstudy = new StudyRights(_cuser, _mystudy);
136 _urightstep = new StepRights(_cuser, _ustep);
138 // RKV menu = new StudyMenu(mystudy);
139 _menu = (getMenu()).init(_mystudy); // RKV
140 _menu.selects(_selection); // Initializes menu items to be displayed
141 setupContents(); // Initializes documents and knowledge at ustep
145 // ==============================================================================================================================
147 // ==============================================================================================================================
149 public String getAuthorName() {
150 return _mystudy.getAuthor().toString();
153 public Long getIndex() {
154 return _mystudy.getIndex();
157 public String getDate() {
162 public StudyMenu getMenu() {
163 return (StudyMenu) _menu;
166 public void setMenu(final StudyMenu aMenu) {
170 public ProgressState getProgressState() {
171 return _mystudy.getProgressState();
174 public String getLastModificationDate() {
178 public ToolBar getModuleBar() {
179 return getApplicationSettings().getModuleBar(getSelectedStep());
182 public String getReference() {
183 return _mystudy.getReference();
186 public Publication getSelectedDocument() {
190 public StepRights getSelectedStepRights() {
194 public StudyRights getStudyRights() {
198 public Study getStudyObject() {
202 public String getTitle() {
203 return _mystudy.getTitle();
206 public String getType() {
208 * RKV: return ResourceBundle.getBundle("labels", getApplicationSettings().getCurrentLocale()).getString( "label.study");
213 public String getVersion() {
217 public boolean isStepEnabled() {
218 return _urightstep.isEnabled();
221 // ==============================================================================================================================
223 // ==============================================================================================================================
225 public URL newTemplateBasedDocument(final String typename, final User author) {
226 String filename = typename + ".xml"; // Only XML templates are writeable
227 File template = new File(getRepositoryService().getTemplatePath()
229 if (!template.exists()) {
233 // Session connex = Database.getCurSession();
234 // Transaction transax = connex.beginTransaction();
236 File udir = getRepositoryService().getDownloadDirectory(author);
237 File credoc = new File(udir.getPath() + "/" + filename);
239 // Creation of the meta-document
240 Step step = getSelectedStep(); // Should we check if the given document type is compatible ?
241 DocumentType type = getDocumentTypeService().selectType(typename);
242 Document.Properties dprop = new Document.Properties();
243 Document medoc = getStepService().createDocument(step,
244 dprop.setType(type).setFormat("xml").setAuthor(author))
248 // Instantiation of the template into the user download directory
249 if (!udir.exists()) {
252 if (credoc.exists()) {
255 Do.copy(template, credoc);
257 // Transfer to the document of all known properties
258 ResourceBundle locale = ResourceBundle.getBundle("som",
259 getApplicationSettings().getCurrentLocale());
260 SimpleDateFormat get = new SimpleDateFormat(locale
261 .getString("date.format"));
262 Writer tool = Toolbox.getWriter(credoc);
263 List<Step> slist = getInvolvedSteps();
264 for (Iterator<Step> i = slist.iterator(); i.hasNext();) {
265 List<SimulationContext> clist = i.next()
266 .getAllSimulationContexts();
267 for (Iterator<SimulationContext> j = clist.iterator(); j
269 SimulationContext context = j.next();
270 tool.updateProperty(context.getType().getName(), context
274 tool.updateProperty("reference", medoc.getReference());
275 tool.updateProperty("study", _mystudy.getTitle());
276 tool.updateProperty("step", locale.getString(
277 "folder.step." + step.getNumber()).replaceAll("''", "'"));
278 tool.updateProperty("author", author.getUsername().toUpperCase());
279 tool.updateProperty("date", get.format(medoc.getCreationDate()));
280 tool.updateProperty("history", locale.getString("label.creation")
281 .replaceAll("''", "'"));
284 return new URL(getApplicationSettings().getDownloadURL(author)
286 } catch (Exception saverror) {
287 LOGGER.error("Reason:", saverror);
292 public void selectDocument(final String docurl) {
293 String prefix = getApplicationSettings().getRepositoryURL();
295 if (docurl.startsWith(prefix)) {
297 String path = docurl.substring(prefix.length());
298 Document value = getDocumentService().getDocumentByPath(path);
300 _selecdoc = _ustep.getDocument(value.getIndex());
301 } catch (Exception error) {
302 LOGGER.error("Reason:", error);
307 public void setSelection(final String step) {
308 if (!step.equals(_selection)) {
311 setupPreviousToSelectedSteps();
312 updateSimulationContexts(); // Initializes contexts according to the selected steps
314 _ustep = _involving.get(_involving.size() - 1);
315 _urightstep = new StepRights(_cuser, _ustep);
316 _ustep.setActor(_cuser);
317 _menu.selects(_selection); // Updates menu items to be displayed
318 setupContents(); // The contents may have changed even if the selection is the same
321 // ==============================================================================================================================
322 // Protected services
323 // ==============================================================================================================================
325 protected void add(final Publication doc) {
326 DocumentFacade facade = new DocumentFacade(this, doc,
327 getProjectSettings(), getPublicationService(),
328 getApplicationSettings());
329 boolean first = (_contents.size() == 0);
331 docpres.put(doc.getIndex(), facade);
332 _contents.add(0, facade); // Prepend the new publication
334 this.getMenu().refreshSelectedItem();
339 protected void add(final SimulationContext contex) {
340 SimulationContextFacade facade = new SimulationContextFacade(contex,
341 getProjectSettings().getAllSteps(), getApplicationSettings());
343 _context.add(facade);
346 protected void add(final KnowledgeElement kelm) {
347 KnowledgeElementFacade facade = new KnowledgeElementFacade(BeanHelper
348 .copyBean(kelm, KnowledgeElementDTO.class),
349 getApplicationSettings());
350 // RKV KnowledgeIterator known = knowledge.get(kelm.getType().getIndex() - 2);
351 // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
352 // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
353 KnowledgeIterator known = null;
354 for (KnowledgeIterator aKnowledgeSection : _knowledge) {
355 if (aKnowledgeSection.getIndex().equals(
356 String.valueOf(kelm.getType().getIndex()))) {
357 known = aKnowledgeSection;
361 if (known != null) { // RKV:End
362 knowpres.put(kelm.getIndex(), facade);
363 known._list.add(facade); // Insert the new knowledge at the end of the corresponding knowledge type
367 protected void remove(final Publication doctag) {
368 for (Iterator<DocumentFacade> i = _contents.iterator(); i.hasNext();) {
369 DocumentFacade facade = i.next();
370 if (facade.isFacadeOf(doctag)) {
375 if (_contents.size() == 0) {
376 this.getMenu().refreshSelectedItem();
380 protected void changeUser(final User user) {
383 if (getStudyService().isStaffedBy(_mystudy, _cuser)) {
384 _popup = getApplicationSettings().getPopupMenu("steditable");
385 _popup.setContext("study", new StudyRights(_cuser, _mystudy));
387 // ustep = getProjectElementService().getFirstStep(mystudy);
388 if (_ustep != null) {
389 _ustep.setActor(_cuser);
391 _urightstudy = new StudyRights(_cuser, _mystudy);
392 _urightstep = new StepRights(_cuser, _ustep);
395 protected void remove(final SimulationContext contex) {
396 for (Iterator<SimulationContextFacade> i = _context.iterator(); i
398 SimulationContextFacade facade = i.next();
399 if (!facade.isFacadeOf(contex)) {
407 protected void remove(final KnowledgeElement kelm) {
408 // RKV: KnowledgeIterator known = _knowledge.get((int) (kelm.getType()
409 // RKV: .getIndex() - 2));
410 // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
411 // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
412 KnowledgeIterator known = null;
413 for (KnowledgeIterator aKnowledgeSection : _knowledge) {
414 if (aKnowledgeSection.getIndex().equals(
415 String.valueOf(kelm.getType().getIndex()))) {
416 known = aKnowledgeSection;
420 if (known != null) { // RKV:End
421 knowpres.remove(kelm.getIndex());
422 for (Iterator<KnowledgeElementFacade> i = known._list.iterator(); i
424 KnowledgeElementFacade facade = i.next();
425 if (!facade.isFacadeOf(BeanHelper.copyBean(kelm,
426 KnowledgeElementDTO.class))) {
435 protected void update(final Publication doc) {
436 DocumentFacade facade = docpres.get(doc.getIndex());
437 if (facade != null) {
442 protected void update(final KnowledgeElementDTO kelm) {
443 KnowledgeElementFacade facade = knowpres.get(kelm.getIndex());
444 if (facade != null) {
445 facade.refresh(kelm);
449 protected void updateSimulationContexts() {
451 for (Iterator<Step> i = _involving.iterator(); i.hasNext();) {
452 for (Iterator<SimulationContext> j = i.next()
453 .getAllSimulationContexts().iterator(); j.hasNext();) {
454 _context.add(new SimulationContextFacade(j.next(),
455 getProjectSettings().getAllSteps(),
456 getApplicationSettings()));
461 // ==============================================================================================================================
463 // ==============================================================================================================================
465 private void setupPreviousToSelectedSteps() {
466 String[] item = _selection.split("\\x2E");
467 int major = Integer.valueOf(item[0]);
468 int minor = Integer.valueOf(item[1]);
474 Scenario[] branch = _mystudy.getScenarii();
475 Scenario scenar = branch[0];
476 for (int i = 0; i < branch.length; i++) {
478 if (scenar.getIndex() == major) {
479 break; // Supposed exist
482 step = getProjectElementService().getSteps(scenar);
483 base = step[0].getNumber() - 1;
484 for (int i = 0; i + base < minor; i++) {
485 _involving.add(step[i]);
488 step = getProjectElementService().getSteps(_mystudy);
489 for (int i = step.length - 1; i > -1; i--) {
490 Step firstep = step[i];
491 if (firstep.getNumber() > base) {
494 _involving.add(0, firstep);
499 * Get the stepService.
501 * @return the stepService
503 public StepService getStepService() {
508 * Set the stepService.
511 * the stepService to set
513 public void setStepService(final StepService stepService) {
514 _stepService = stepService;
518 * Get the repositoryService.
520 * @return the repositoryService
522 public RepositoryService getRepositoryService() {
523 return _repositoryService;
527 * Set the repositoryService.
529 * @param repositoryService
530 * the repositoryService to set
532 public void setRepositoryService(final RepositoryService repositoryService) {
533 _repositoryService = repositoryService;
537 * Get the documentTypeService.
539 * @return the documentTypeService
541 public DocumentTypeService getDocumentTypeService() {
542 return _documentTypeService;
546 * Set the documentTypeService.
548 * @param documentTypeService
549 * the documentTypeService to set
551 public void setDocumentTypeService(
552 final DocumentTypeService documentTypeService) {
553 _documentTypeService = documentTypeService;
557 * Get the studyService.
559 * @return the studyService
561 public StudyService getStudyService() {
562 return _studyService;
566 * Set the studyService.
568 * @param studyService
569 * the studyService to set
571 public void setStudyService(final StudyService studyService) {
572 _studyService = studyService;
576 * Get the documentService.
578 * @return the documentService
580 public DocumentService getDocumentService() {
581 return _documentService;
585 * Set the documentService.
587 * @param documentService
588 * the documentService to set
590 public void setDocumentService(final DocumentService documentService) {
591 _documentService = documentService;
594 public Study getMystudy() {
598 public void setMystudy(final Study mystudy) {
599 this._mystudy = mystudy;