Salome HOME
901495af93ba1f777ce25c6fee101e8cef0175ae
[tools/siman.git] / Workspace / Siman / src / org / splat / simer / OpenStudy.java
1 package org.splat.simer;
2
3 /**
4  * 
5  * @author    Daniel Brunier-Coulin
6  * @copyright OPEN CASCADE 2012
7  */
8
9 import java.io.File;
10 import java.net.URL;
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;
16
17 import org.splat.dal.bo.kernel.User;
18 import org.splat.dal.bo.som.Document;
19 import org.splat.dal.bo.som.DocumentType;
20 import org.splat.dal.bo.som.KnowledgeElement;
21 import org.splat.dal.bo.som.ProgressState;
22 import org.splat.dal.bo.som.Publication;
23 import org.splat.dal.bo.som.Scenario;
24 import org.splat.dal.bo.som.SimulationContext;
25 import org.splat.dal.bo.som.Study;
26 import org.splat.dal.bo.som.UsesRelation;
27 import org.splat.kernel.Do;
28 import org.splat.log.AppLogger;
29 import org.splat.manox.Toolbox;
30 import org.splat.manox.Writer;
31 import org.splat.service.DocumentService;
32 import org.splat.service.DocumentTypeService;
33 import org.splat.service.StepService;
34 import org.splat.service.StudyService;
35 import org.splat.service.dto.KnowledgeElementDTO;
36 import org.splat.service.technical.RepositoryService;
37 import org.splat.som.Revision;
38 import org.splat.som.Step;
39 import org.splat.som.StepRights;
40 import org.splat.som.StudyRights;
41 import org.splat.util.BeanHelper;
42 import org.splat.wapp.Constants;
43 import org.splat.wapp.ToolBar;
44
45 /**
46  * Presentation of the currently open study.
47  */
48 public class OpenStudy extends AbstractOpenObject implements OpenStudyServices {
49
50         /**
51          * Serial version ID.
52          */
53         protected final static AppLogger LOGGER = org.splat.simer.Action.LOG;
54
55         /**
56          * The currently open study.
57          */
58         private transient Study _mystudy;
59         /**
60          * User rights on the open study.
61          */
62         private transient StudyRights _urightstudy;
63         /**
64          * User rights on the selected step.
65          */
66         private transient StepRights _urightstep;
67         /**
68          * The study version.
69          */
70         private transient String _version;
71         /**
72          * The study creation date.
73          */
74         private transient String _credate;
75         /**
76          * The study modification date.
77          */
78         private transient String _lasdate;
79         /**
80          * The selected document publication.
81          */
82         private transient Publication _selecdoc;
83         /**
84          * Injected step service.
85          */
86         private StepService _stepService;
87         /**
88          * Injected repository service.
89          */
90         private RepositoryService _repositoryService;
91         /**
92          * Injected document type service.
93          */
94         private DocumentTypeService _documentTypeService;
95         /**
96          * Injected document service.
97          */
98         private DocumentService _documentService;
99         /**
100          * The injected Study service.
101          */
102         private StudyService _studyService;
103
104         // =========================================================================
105         // Constructor
106         // =========================================================================
107
108         /**
109          * Open the given study in the current http session.
110          * 
111          * @param user
112          *            the current user
113          * @param study
114          *            the study to open
115          * @return this open study object
116          */
117         public OpenStudy open(final User user, final Study study) {
118                 ResourceBundle custom = ResourceBundle.getBundle("som",
119                                 getApplicationSettings().getCurrentLocale());
120                 SimpleDateFormat datstring = new SimpleDateFormat(custom
121                                 .getString("date.format"), getApplicationSettings()
122                                 .getCurrentLocale());
123                 Revision.Format verstring = new Revision.Format(getProjectSettings()
124                                 .getRevisionPattern());
125
126                 _cuser = user; // May be null if nobody connected
127                 _mystudy = study;
128                 _selection = "0.1"; // Default selection
129                 _selecdoc = null;
130
131                 // Preparation of the display
132                 _version = verstring.format(_mystudy.getVersion());
133                 _credate = datstring.format(_mystudy.getDate());
134                 _lasdate = datstring.format(_mystudy.getLastModificationDate());
135                 _description = _mystudy.getDescription();
136                 _involving = new ArrayList<Step>(1);
137                 _context = new ArrayList<SimulationContextFacade>();
138                 _ustep = getProjectElementService().getFirstStep(_mystudy);
139                 _ustep.setActor(_cuser);
140                 _involving.add(_ustep);
141                 for (Iterator<SimulationContext> i = _ustep.getAllSimulationContexts()
142                                 .iterator(); i.hasNext();) {
143                         _context.add(new SimulationContextFacade(i.next(),
144                                         getProjectSettings().getAllSteps(),
145                                         getApplicationSettings()));
146                 }
147                 if (getStudyService().isStaffedBy(_mystudy, _cuser)
148                                 || getStudyService().hasActor(_mystudy, _cuser)) {
149                         // ProgressState state = mystudy.getProgressState();
150                         // if (state == ProgressState.inCHECK) popup = getApplicationSettings().getPopupMenu("stapprovable");
151                         // else if (state == ProgressState.APPROVED) popup = getApplicationSettings().getPopupMenu("stapproved");
152                         /* else */
153
154                         if (_mystudy.getProgressState() == ProgressState.TEMPLATE) {
155                                 if (_mystudy.isPublic()) {
156                                         _popup = getApplicationSettings().getPopupMenu(
157                                                         "steditableunmarkprivate");
158                                 } else {
159                                         _popup = getApplicationSettings().getPopupMenu(
160                                                         "steditableunmarkpublic");
161                                 }
162                         } else {
163
164                                 if (_mystudy.isPublic()) {
165                                         _popup = getApplicationSettings().getPopupMenu(
166                                                         "steditablemarkprivate");
167                                 } else {
168                                         if (_mystudy.getProgressState() == ProgressState.inWORK) {
169                                                 _popup = getApplicationSettings().getPopupMenu(
170                                                                 "steditable");
171                                         } else if (_mystudy.getProgressState() == ProgressState.inDRAFT) {
172                                                 _popup = getApplicationSettings().getPopupMenu(
173                                                                 "streviewable");
174                                         } else if (_mystudy.getProgressState() == ProgressState.inCHECK) {
175                                                 _popup = getApplicationSettings().getPopupMenu(
176                                                                 "stapprovable");
177                                         } else { // APPROVED
178                                                 _popup = getApplicationSettings().getPopupMenu(
179                                                                 "steditablemarkpublic");
180                                         }
181                                 }
182
183                         }
184                         _popup.setContext(Constants.STUDY_MENU, new StudyRights(_cuser,
185                                         _mystudy));
186                 }
187                 _urightstudy = new StudyRights(_cuser, _mystudy);
188                 _urightstep = new StepRights(_cuser, _ustep);
189
190                 // RKV menu = new StudyMenu(mystudy);
191                 _menu = (getMenu()).init(_mystudy); // RKV
192                 _menu.selects(_selection); // Initializes menu items to be displayed
193                 setupContents(); // Initializes documents and knowledge at ustep
194                 return this;
195         }
196
197         // =========================================================================
198         // Getters
199         // =========================================================================
200
201         /**
202          * {@inheritDoc}
203          * 
204          * @see org.splat.service.dto.Proxy#getAuthorName()
205          */
206         @Override
207         public String getAuthorName() {
208                 return _mystudy.getAuthor().toString();
209         }
210
211         /**
212          * {@inheritDoc}
213          * 
214          * @see org.splat.service.dto.Proxy#getIndex()
215          */
216         @Override
217         public Long getIndex() {
218                 return _mystudy.getIndex();
219         }
220
221         /**
222          * Get creation date.
223          * 
224          * @return the date
225          */
226         public String getDate() {
227                 return _credate;
228         }
229
230         /**
231          * {@inheritDoc}
232          * 
233          * @see org.splat.simer.AbstractOpenObject#getMenu()
234          */
235         @Override
236         public StudyMenu getMenu() {
237                 return (StudyMenu) _menu;
238         }
239
240         /**
241          * Set study menu.
242          * 
243          * @param aMenu
244          *            the study menu
245          */
246         public void setMenu(final StudyMenu aMenu) {
247                 _menu = aMenu;
248         }
249
250         /**
251          * {@inheritDoc}
252          * 
253          * @see org.splat.service.dto.Proxy#getProgressState()
254          */
255         @Override
256         public ProgressState getProgressState() {
257                 return _mystudy.getProgressState();
258         }
259
260         /**
261          * Get last modification date.
262          * 
263          * @return the date
264          */
265         public String getLastModificationDate() {
266                 return _lasdate;
267         }
268
269         /**
270          * Get the toolbar with buttons of available modules.
271          * 
272          * @return the toolbar
273          */
274         public ToolBar getModuleBar() {
275                 return getApplicationSettings().getModuleBar(getSelectedStep());
276         }
277
278         /**
279          * {@inheritDoc}
280          * 
281          * @see org.splat.service.dto.Proxy#getReference()
282          */
283         @Override
284         public String getReference() {
285                 return _mystudy.getReference();
286         }
287
288         /**
289          * {@inheritDoc}
290          * 
291          * @see org.splat.simer.OpenStudyServices#getSelectedDocument()
292          */
293         @Override
294         public Publication getSelectedDocument() {
295                 return _selecdoc;
296         }
297
298         /**
299          * Get user rights for the selected step.
300          * 
301          * @return user step rights
302          */
303         public StepRights getSelectedStepRights() {
304                 return _urightstep;
305         }
306
307         /**
308          * Get user rights for the study.
309          * 
310          * @return user study rights
311          */
312         public StudyRights getStudyRights() {
313                 return _urightstudy;
314         }
315
316         /**
317          * Get the detached study object.
318          * 
319          * @return the detached study object
320          */
321         public Study getStudyObject() {
322                 return _mystudy;
323         }
324
325         /**
326          * {@inheritDoc}
327          * 
328          * @see org.splat.service.dto.Proxy#getTitle()
329          */
330         @Override
331         public String getTitle() {
332                 return _mystudy.getTitle();
333         }
334
335         /**
336          * {@inheritDoc}
337          * 
338          * @see org.splat.service.dto.Proxy#getType()
339          */
340         @Override
341         public String getType() {
342                 /*
343                  * RKV: return ResourceBundle.getBundle("labels", getApplicationSettings().getCurrentLocale()).getString( "label.study");
344                  */
345                 return Constants.STUDY_MENU;
346         }
347
348         /**
349          * Get the study version.
350          * 
351          * @return the version string
352          */
353         public String getVersion() {
354                 return _version;
355         }
356
357         /**
358          * Check if the selected step is enabled for writing.
359          * 
360          * @return true if the selected step is enabled for writing
361          */
362         public boolean isStepEnabled() {
363                 return _urightstep.isEnabled();
364         }
365
366         // =========================================================================
367         // Public services
368         // =========================================================================
369
370         @Override
371         public URL newTemplateBasedDocument(final String typename, final User author) {
372                 String filename = typename + ".xml"; // Only XML templates are writeable
373                 File template = new File(getRepositoryService().getTemplatePath()
374                                 + filename);
375                 if (!template.exists()) {
376                         return null;
377                 }
378
379                 // Session connex = Database.getCurSession();
380                 // Transaction transax = connex.beginTransaction();
381                 try {
382                         File udir = getRepositoryService().getDownloadDirectory(author);
383                         File credoc = new File(udir.getPath() + "/" + filename);
384
385                         // Creation of the meta-document
386                         Step step = getSelectedStep(); // Should we check if the given document type is compatible ?
387                         DocumentType type = getDocumentTypeService().selectType(typename);
388                         Document.Properties dprop = new Document.Properties();
389                         Document medoc = getStepService().createDocument(step,
390                                         dprop.setType(type).setFormat("xml").setAuthor(author))
391                                         .value();
392                         // transax.commit();
393
394                         // Instantiation of the template into the user download directory
395                         if (!udir.exists()) {
396                                 udir.mkdir();
397                         }
398                         if (credoc.exists()) {
399                                 credoc.delete();
400                         }
401                         Do.copy(template, credoc);
402
403                         // Transfer to the document of all known properties
404                         ResourceBundle locale = ResourceBundle.getBundle("som",
405                                         getApplicationSettings().getCurrentLocale());
406                         SimpleDateFormat get = new SimpleDateFormat(locale
407                                         .getString("date.format"), getApplicationSettings()
408                                         .getCurrentLocale());
409                         Writer tool = Toolbox.getWriter(credoc);
410                         List<Step> slist = getInvolvedSteps();
411                         for (Iterator<Step> i = slist.iterator(); i.hasNext();) {
412                                 List<SimulationContext> clist = i.next()
413                                                 .getAllSimulationContexts();
414                                 for (Iterator<SimulationContext> j = clist.iterator(); j
415                                                 .hasNext();) {
416                                         SimulationContext context = j.next();
417                                         tool.updateProperty(context.getType().getName(), context
418                                                         .getValue());
419                                 }
420                         }
421                         tool.updateProperty("reference", medoc.getReference());
422                         tool.updateProperty(Constants.STUDY_MENU, _mystudy.getTitle());
423                         tool.updateProperty("step", locale.getString(
424                                         "folder.step." + step.getNumber()).replaceAll("''", "'"));
425                         tool.updateProperty("author", author.getUsername().toUpperCase());
426                         tool.updateProperty("date", get.format(medoc.getCreationDate()));
427                         tool.updateProperty("history", locale.getString("label.creation")
428                                         .replaceAll("''", "'"));
429                         tool.save();
430
431                         return new URL(getApplicationSettings().getDownloadURL(author)
432                                         + filename);
433                 } catch (Exception saverror) {
434                         LOGGER.error("Reason:", saverror);
435                         return null;
436                 }
437         }
438
439         public void selectDocument(final String docurl) {
440                 String prefix = getApplicationSettings().getRepositoryURL();
441
442                 if (docurl.startsWith(prefix)) {
443                         try {
444                                 String path = docurl.substring(prefix.length());
445                                 Document value = getDocumentService().getDocumentByPath(path);
446
447                                 _selecdoc = _ustep.getDocument(value.getIndex());
448                         } catch (Exception error) {
449                                 LOGGER.error("Reason:", error);
450                         }
451                 }
452         }
453
454         /**
455          * Select an activity (step).
456          * 
457          * @param step
458          *            the key of the step to select
459          */
460         public void setSelection(final String step) {
461                 if (!step.equals(_selection)) {
462                         _selection = step;
463                         _selecdoc = null;
464                         setupPreviousToSelectedSteps();
465                         updateSimulationContexts(); // Initializes contexts according to the selected steps
466                 }
467                 _ustep = _involving.get(_involving.size() - 1);
468                 _urightstep = new StepRights(_cuser, _ustep);
469                 _ustep.setActor(_cuser);
470                 _menu.selects(_selection); // Updates menu items to be displayed
471                 setupContents(); // The contents may have changed even if the selection is the same
472         }
473
474         // =========================================================================
475         // Protected services
476         // =========================================================================
477
478         /**
479          * Add a new document presentation facade.
480          * 
481          * @param doc
482          *            the document publication
483          */
484         protected void add(final Publication doc) {
485                 DocumentFacade facade = new DocumentFacade(this, doc,
486                                 getProjectSettings(), getPublicationService(),
487                                 getApplicationSettings());
488                 boolean first = (_contents.size() == 0);
489
490                 _docpres.put(doc.getIndex(), facade);
491                 _contents.add(0, facade); // Prepend the new publication
492                 if (first) {
493                         this.getMenu().refreshSelectedItem();
494                 }
495                 // Refresh dependencies. They can not be removed until removing this document.
496                 for (Publication pub : doc.getRelations(UsesRelation.class)) {
497                         update(pub);
498                 }
499         }
500
501         /**
502          * Add a simulation context presentation facade.
503          * 
504          * @param contex
505          *            the simulation context to add
506          */
507         protected void add(final SimulationContext contex) {
508                 SimulationContextFacade facade = new SimulationContextFacade(contex,
509                                 getProjectSettings().getAllSteps(), getApplicationSettings());
510
511                 _context.add(facade);
512         }
513
514         /**
515          * Add a knowledge element presentation facade.
516          * 
517          * @param kelm
518          *            the knowledge element to add
519          */
520         protected void add(final KnowledgeElement kelm) {
521                 KnowledgeElementFacade facade = new KnowledgeElementFacade(BeanHelper
522                                 .copyBean(kelm, KnowledgeElementDTO.class),
523                                 getApplicationSettings());
524                 // RKV KnowledgeIterator known = knowledge.get(kelm.getType().getIndex() - 2);
525                 // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
526                 // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
527                 KnowledgeIterator known = null;
528                 for (KnowledgeIterator aKnowledgeSection : _knowledge) {
529                         if (aKnowledgeSection.getIndex().equals(
530                                         String.valueOf(kelm.getType().getIndex()))) {
531                                 known = aKnowledgeSection;
532                                 break;
533                         }
534                 }
535                 if (known != null) { // RKV:End
536                         _knowpres.put(kelm.getIndex(), facade);
537                         known._list.add(facade); // Insert the new knowledge at the end of the corresponding knowledge type
538                 }
539         }
540
541         /**
542          * Remove the document presentation facade.
543          * 
544          * @param doctag
545          *            the document publication to remove
546          */
547         protected void remove(final Publication doctag) {
548                 for (Iterator<DocumentFacade> i = _contents.iterator(); i.hasNext();) {
549                         DocumentFacade facade = i.next();
550                         if (facade.isFacadeOf(doctag)) {
551                                 i.remove();
552                                 break;
553                         }
554                 }
555                 if (_contents.size() == 0) {
556                         this.getMenu().refreshSelectedItem();
557                 }
558         }
559
560         /**
561          * Change the currently connected user and refresh user's rights.
562          * 
563          * @param user
564          *            the new connected user
565          */
566         protected void changeUser(final User user) {
567                 _cuser = user;
568                 _popup = null;
569                 if (getStudyService().isStaffedBy(_mystudy, _cuser)) {
570                         _popup = getApplicationSettings().getPopupMenu(
571                                         "steditablemarkpublic");
572                         _popup.setContext(Constants.STUDY_MENU, new StudyRights(_cuser,
573                                         _mystudy));
574                 }
575                 // ustep = getProjectElementService().getFirstStep(mystudy);
576                 if (_ustep != null) {
577                         _ustep.setActor(_cuser);
578                 }
579                 _urightstudy = new StudyRights(_cuser, _mystudy);
580                 _urightstep = new StepRights(_cuser, _ustep);
581         }
582
583         /**
584          * Remove the simulation context presentation facade.
585          * 
586          * @param contex
587          *            the simulation context to remove
588          */
589         protected void remove(final SimulationContext contex) {
590                 for (Iterator<SimulationContextFacade> i = _context.iterator(); i
591                                 .hasNext();) {
592                         SimulationContextFacade facade = i.next();
593                         if (facade.isFacadeOf(contex)) {
594                                 i.remove();
595                                 break;
596                         }
597                 }
598         }
599
600         /**
601          * Remove the knowledge element presentation facade.
602          * 
603          * @param kelm
604          *            the knowledge element to remove
605          */
606         protected void remove(final KnowledgeElement kelm) {
607                 // RKV: KnowledgeIterator known = _knowledge.get((int) (kelm.getType()
608                 // RKV: .getIndex() - 2));
609                 // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
610                 // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
611                 KnowledgeIterator known = null;
612                 for (KnowledgeIterator aKnowledgeSection : _knowledge) {
613                         if (aKnowledgeSection.getIndex().equals(
614                                         String.valueOf(kelm.getType().getIndex()))) {
615                                 known = aKnowledgeSection;
616                                 break;
617                         }
618                 }
619                 if (known != null) { // RKV:End
620                         _knowpres.remove(kelm.getIndex());
621                         for (Iterator<KnowledgeElementFacade> i = known._list.iterator(); i
622                                         .hasNext();) {
623                                 KnowledgeElementFacade facade = i.next();
624                                 if (!facade.isFacadeOf(BeanHelper.copyBean(kelm,
625                                                 KnowledgeElementDTO.class))) {
626                                         continue;
627                                 }
628                                 i.remove();
629                                 break;
630                         }
631                 }
632         }
633
634         /**
635          * Refresh the document presentation facade.
636          * 
637          * @param doc
638          *            the document publication
639          */
640         protected void update(final Publication doc) {
641                 DocumentFacade facade = _docpres.get(doc.getIndex());
642                 if (facade != null) {
643                         facade.refresh();
644                 }
645         }
646
647         /**
648          * Refresh the knowledge element presentation facade.
649          * 
650          * @param kelm
651          *            the knowledge element DTO
652          */
653         protected void update(final KnowledgeElementDTO kelm) {
654                 KnowledgeElementFacade facade = _knowpres.get(kelm.getIndex());
655                 if (facade != null) {
656                         facade.refresh(kelm);
657                 }
658         }
659
660         /**
661          * Refresh simulation contexts presentation facades.
662          */
663         protected void updateSimulationContexts() {
664                 _context.clear();
665                 for (Iterator<Step> i = _involving.iterator(); i.hasNext();) {
666                         for (Iterator<SimulationContext> j = i.next()
667                                         .getAllSimulationContexts().iterator(); j.hasNext();) {
668                                 _context.add(new SimulationContextFacade(j.next(),
669                                                 getProjectSettings().getAllSteps(),
670                                                 getApplicationSettings()));
671                         }
672                 }
673         }
674
675         // =========================================================================
676         // Private services
677         // =========================================================================
678
679         private void setupPreviousToSelectedSteps() {
680                 String[] item = _selection.split("\\x2E");
681                 int major = Integer.valueOf(item[0]);
682                 int minor = Integer.valueOf(item[1]);
683                 int base = minor;
684                 Step[] step;
685
686                 _involving.clear();
687                 if (major > 0) {
688                         Scenario[] branch = _mystudy.getScenarii();
689                         Scenario scenar = branch[0];
690                         for (int i = 0; i < branch.length; i++) {
691                                 scenar = branch[i];
692                                 if (scenar.getIndex() == major) {
693                                         break; // Supposed exist
694                                 }
695                         }
696                         step = getProjectElementService().getSteps(scenar);
697                         base = step[0].getNumber() - 1;
698                         for (int i = 0; i + base < minor; i++) {
699                                 _involving.add(step[i]);
700                         }
701                 }
702                 step = getProjectElementService().getSteps(_mystudy);
703                 for (int i = step.length - 1; i > -1; i--) {
704                         Step firstep = step[i];
705                         if (firstep.getNumber() <= base) {
706                                 _involving.add(0, firstep);
707                         }
708                 }
709         }
710
711         /**
712          * Get the stepService.
713          * 
714          * @return the stepService
715          */
716         public StepService getStepService() {
717                 return _stepService;
718         }
719
720         /**
721          * Set the stepService.
722          * 
723          * @param stepService
724          *            the stepService to set
725          */
726         public void setStepService(final StepService stepService) {
727                 _stepService = stepService;
728         }
729
730         /**
731          * Get the repositoryService.
732          * 
733          * @return the repositoryService
734          */
735         public RepositoryService getRepositoryService() {
736                 return _repositoryService;
737         }
738
739         /**
740          * Set the repositoryService.
741          * 
742          * @param repositoryService
743          *            the repositoryService to set
744          */
745         public void setRepositoryService(final RepositoryService repositoryService) {
746                 _repositoryService = repositoryService;
747         }
748
749         /**
750          * Get the documentTypeService.
751          * 
752          * @return the documentTypeService
753          */
754         public DocumentTypeService getDocumentTypeService() {
755                 return _documentTypeService;
756         }
757
758         /**
759          * Set the documentTypeService.
760          * 
761          * @param documentTypeService
762          *            the documentTypeService to set
763          */
764         public void setDocumentTypeService(
765                         final DocumentTypeService documentTypeService) {
766                 _documentTypeService = documentTypeService;
767         }
768
769         /**
770          * Get the studyService.
771          * 
772          * @return the studyService
773          */
774         public StudyService getStudyService() {
775                 return _studyService;
776         }
777
778         /**
779          * Set the studyService.
780          * 
781          * @param studyService
782          *            the studyService to set
783          */
784         public void setStudyService(final StudyService studyService) {
785                 _studyService = studyService;
786         }
787
788         /**
789          * Get the documentService.
790          * 
791          * @return the documentService
792          */
793         public DocumentService getDocumentService() {
794                 return _documentService;
795         }
796
797         /**
798          * Set the documentService.
799          * 
800          * @param documentService
801          *            the documentService to set
802          */
803         public void setDocumentService(final DocumentService documentService) {
804                 _documentService = documentService;
805         }
806
807         /**
808          * Get the detached study object.
809          * 
810          * @return the detached study object
811          */
812         public Study getMystudy() {
813                 return _mystudy;
814         }
815
816         /**
817          * Set the study to present.
818          * 
819          * @param mystudy
820          *            the selected study detached object
821          */
822         public void setMystudy(final Study mystudy) {
823                 this._mystudy = mystudy;
824         }
825 }