Salome HOME
More business logic has been moved from BO to services. ServiceLocator is created...
[tools/siman.git] / Workspace / Siman-Common / src / org / splat / dal / bo / som / Scenario.java
1 package org.splat.dal.bo.som;
2 /**
3  * 
4  * @author    Daniel Brunier-Coulin
5  * @copyright OPEN CASCADE 2012
6  */
7
8 import java.util.Calendar;
9 import java.util.Collections;
10 import java.util.Date;
11 import java.util.HashMap;
12 import java.util.Iterator;
13 import java.util.List;
14 import java.util.Set;
15 import java.util.HashSet;
16 import java.util.Vector;
17
18 import org.splat.dal.bo.kernel.Persistent;
19 import org.splat.dal.bo.kernel.User;
20 import org.splat.dal.dao.som.Database;
21 import org.splat.kernel.InvalidPropertyException;
22 import org.splat.kernel.MissedPropertyException;
23 import org.splat.kernel.MultiplyDefinedException;
24 import org.splat.som.Step;
25
26
27 public class Scenario extends ProjectElement {
28
29 //  Persistent fields
30     private Study                 owner;
31         private int                   sid;               // Identifier unique in the scope of owner study
32         private User                  cuser;             // User having checked-out the scenario, if done
33     /**
34      * The persistent set of scenario knowledge elements.
35      */
36     private Set<KnowledgeElement> kelms;
37
38 //  Transient fields
39     /**
40      * The transient map of knowledge elements grouped by types.
41      */
42     transient private HashMap<Long, List<KnowledgeElement>> known;
43     /**
44      * The scenario transient list of knowledge elements.
45      */
46     transient private List<KnowledgeElement>                   knowl;  // Copy of kelms excluding the internal Knowledge Element (ucase below)
47         /**
48          * The scenario transient "use case" knowledge element.
49          */
50         transient private KnowledgeElement                         ucase;  // Internal Knowledge Element for accessing to all used simulation contexts
51
52
53 //  ==============================================================================================================================
54 //  Construction
55 //  ==============================================================================================================================
56
57
58     /**
59      *   Fields initialization class.
60      */
61     public static class Properties extends Persistent.Properties {
62 //  ------------------------------------------------------------
63       private Study    owner    = null;
64       private Scenario previous = null;
65       private Step     base     = null;
66       private String   title    = null;
67       private String   summary  = null;
68       private User     manager  = null;
69       private Date     date     = null;
70
71 //  - Public services
72
73       public void clear () {
74         super.clear();
75         owner    = null;
76         previous = null;
77         base     = null;
78         title    = null;
79         summary  = null;
80         manager  = null;
81         date     = null;
82       }
83 //  - Protected services
84
85       public Step getBaseStep () {
86         return base;         // May be null
87       }
88       public Scenario getInsertAfter () {
89         return previous;     // May be null
90       }
91           public User getManager () {
92                 return manager;
93           }
94       public Properties setOwnerStudy (Study owner)
95       {
96         this.owner = owner;
97         return this;
98       }
99 //  - Setters of Scenario properties
100
101       public Properties setBaseStep (Step base) throws InvalidPropertyException
102       {
103         if (!(base.getOwner() instanceof Scenario)) throw new InvalidPropertyException("step");
104         this.base = base;
105         return this;
106       }
107       public Properties setDate (Date date)
108       {
109         this.date = date;
110         return this;
111       }
112       public Properties setDescription (String summary)
113       {
114         if (summary.length() > 0) this.summary = summary;
115         return this;
116       }
117       public Properties setInsertAfter (Scenario previous)
118       {
119         this.previous = previous;
120         return this;
121       }
122       public Properties setManager (User user)
123       {
124         this.manager = user;
125         return this;
126       }
127       public Properties setTitle (String title) throws InvalidPropertyException
128       {
129         if (title.length() == 0) throw new InvalidPropertyException("title");
130         this.title = title;
131         return this;
132       }
133 //  - Global validity check
134       
135       public void checkValidity() throws MissedPropertyException, InvalidPropertyException, MultiplyDefinedException
136       {
137         if (owner == null)   throw new MissedPropertyException("owner");
138         if (title == null)   throw new MissedPropertyException("title");
139         if (manager == null) throw new MissedPropertyException("manager");
140       }
141     }
142 //  Database fetch constructor
143     protected Scenario () {
144 //  ---------------------
145       known = null;
146       knowl = null;
147       ucase = null;
148     }
149 //  Internal constructor
150     public Scenario (Properties sprop) throws MissedPropertyException, InvalidPropertyException, MultiplyDefinedException {
151 //  -------------------------------------
152       super(sprop);                // Throws one of the above exception if not valid
153       owner   = sprop.owner;
154       sid     = 0;
155       cuser   = null;
156       title   = sprop.title;       // Inherited attribute
157       known   = null;
158       knowl   = null;              // Initialized when getting all Knowledge Elements
159       ucase   = null;
160       kelms   = new HashSet<KnowledgeElement>();
161
162       manager = sprop.manager;
163 //RKV: The business logic is moved to business services:      if (!owner.isStaffedBy(manager)) throw new InvalidPropertyException("manager");
164
165       credate = sprop.date;        // Inherited attribute
166       if (credate == null) {
167         Calendar current = Calendar.getInstance();
168         credate = current.getTime();  // Today
169       }
170       lasdate = credate;           // Inherited attribute
171
172       if (sprop.summary != null) this.setAttribute( new DescriptionAttribute(this, sprop.summary) );
173
174       Scenario[] scene = owner.getScenarii();
175       for (int i=0; i<scene.length; i++) if (scene[i].sid > this.sid) this.sid = scene[i].sid;
176       sid += 1;
177     }
178
179 //  ==============================================================================================================================
180 //  Public member functions
181 //  ==============================================================================================================================
182
183     public List<KnowledgeElement> getAllKnowledgeElements () {
184 //  --------------------------------------------------------
185       if (knowl == null) {
186         knowl = new Vector<KnowledgeElement>(kelms.size());
187         for (Iterator<KnowledgeElement> i=kelms.iterator(); i.hasNext(); ) {
188           KnowledgeElement  kelm = i.next();
189           if (kelm.getType().equals("usecase")) ucase = kelm;
190           else                                  knowl.add(kelm);
191         }
192       }
193       return  Collections.unmodifiableList(knowl);
194     }
195
196     public KnowledgeElement getKnowledgeElement (long l) {
197 //  -------------------------------------------------------
198       for (Iterator<KnowledgeElement> i=kelms.iterator(); i.hasNext();) {
199             KnowledgeElement mykelm = i.next();
200         if (mykelm.getIndex() == l) return mykelm;
201       }
202       return null;
203     }
204
205     public List<KnowledgeElement> getKnowledgeElementsOf (KnowledgeElementType type) {
206 //  --------------------------------------------------------------------------------
207       if (kelms.isEmpty()) return  new Vector<KnowledgeElement>();   // Smarter than returning null
208       if (known == null)   known = new HashMap<Long, List<KnowledgeElement>>();
209
210       long                    numtype = type.getIndex();
211       List<KnowledgeElement> listype = known.get(numtype);
212       if (listype == null) {
213         listype = new Vector<KnowledgeElement>();
214         for (Iterator<KnowledgeElement> i=kelms.iterator(); i.hasNext();) {
215           KnowledgeElement kelm = i.next();
216           if (kelm.getType().getIndex() == numtype) listype.add(kelm);
217         }
218         known.put(numtype, listype);
219       }
220       return listype;   // No protection against this object corruption as it would not corrupt the database
221     }
222
223     public Study getOwnerStudy () {
224 //  -----------------------------
225       return  owner;
226     }
227 /**
228  * Returns the local reference of this scenario. This reference is unique in the scope of the owner study.
229  */
230     public String getReference () {
231 //  -----------------------------
232       return  String.valueOf(sid);
233     }
234
235     public User getUser () {
236       return  cuser;    // Null if the scenario has not been checked-out
237     }
238
239     public void setUser (User aUser) {
240       cuser = aUser;    // Null if the scenario has not been checked-out
241     }
242
243     public boolean removeKnowledgeElement (KnowledgeElement kelm) {
244 //  -------------------------------------------------------------
245           KnowledgeElement torem = getKnowledgeElement(kelm.getIndex());
246       if (torem == null) return false;
247       boolean done = kelms.remove(torem);
248       if (done) {
249 //      Update of my transient data
250         List<KnowledgeElement> kelms = known.get(kelm.getType().getIndex());
251         kelms.remove(torem);
252         if (knowl != null) knowl.remove(torem);
253         Database.getSession().update(this);
254 //TODO: If the owner study is not private, remove the knowledge from the Lucene index
255         return true;
256       } else {
257         return false;
258       }
259     }
260
261     public boolean isCheckedout () {
262 //  ------------------------------
263       return (cuser != null);
264     }
265
266 //  ==============================================================================================================================
267 //  Private services
268 //  ==============================================================================================================================
269         /**
270          * Get the persistent set of knowledge elements.
271          * @return the persistent set of scenario knowledge elements
272          */
273         public Set<KnowledgeElement> getKnowledgeElements() {
274                 return kelms;
275         }
276         /** 
277          * Get the transient list of knowledge elements.
278          * @return the transient list of knowledge elements
279          */
280         public List<KnowledgeElement> getKnowledgeElementsList() {
281                 return knowl;
282         }
283         /**
284          * Set the scenario transient "use case" knowledge element.
285          * @param kelm the scenario transient "use case" knowledge element
286          */
287         public void setUcase(KnowledgeElement kelm) {
288                 ucase = kelm;
289         }
290         /**
291          * Get the scenario transient "use case" knowledge element.
292          * @return the scenario transient "use case" knowledge element
293          */
294         public KnowledgeElement getUcase() {
295                 return ucase;
296         }
297 }