Salome HOME
SIMAN Eclipse workspace first version
[tools/siman.git] / Workspace / Siman / src / org / splat / simer / SearchStudyAction.java
diff --git a/Workspace/Siman/src/org/splat/simer/SearchStudyAction.java b/Workspace/Siman/src/org/splat/simer/SearchStudyAction.java
new file mode 100644 (file)
index 0000000..68bf1de
--- /dev/null
@@ -0,0 +1,218 @@
+package org.splat.simer;
+
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.splat.kernel.InvalidPropertyException;
+import org.splat.kernel.User;
+import org.splat.kernel.UserDirectory;
+import org.splat.som.Database;
+import org.splat.som.ProgressState;
+import org.splat.som.ProjectSettings;
+import org.splat.som.SimulationContext;
+import org.splat.som.SimulationContextType;
+import org.splat.som.Study;
+import org.splat.som.Visibility;
+import org.splat.wapp.Item;
+import org.splat.wapp.TabBar;
+
+
+public class SearchStudyAction extends SearchBaseAction {
+
+    private TabBar                       area    = null;   // Active repository area
+    private String                       state   = null;   // "inPROGRESS", "inCHECK" or "END"
+    private String                       among   = null;   // "all", "mine" or "ref"
+    private String                       refid   = null;   // Study reference when among ref
+    private String                       words   = null;   // Full text search words
+
+       private static final long serialVersionUID = -1910481357051393077L;
+
+    enum UserAction { refreshResult, selectContextType, selectContextValue, cancelSelect, removeContext }
+
+//  ==============================================================================================================================
+//  Action methods
+//  ==============================================================================================================================
+
+       public String doInitialize () {
+//  -----------------------------
+      Session      connex  = Database.getSession();
+      Transaction  transax = connex.beginTransaction();
+      try {
+        loadFilter();
+        if (newarea != null) {                        // New selected repository area
+          area.selects(newarea);
+        }
+        doSearch();
+
+//      Final initialization of the form
+        setCandidates();
+        setContextTypeOptions(getInvolvedContexts());
+
+        transax.commit();
+        return SUCCESS;
+      }
+      catch (Exception error) {
+//      No need to roll back the transaction as it is read only
+       logger.error("Reason: ", error);
+        return ERROR;
+      }
+    }
+
+       protected String doSearch () throws InvalidPropertyException {
+//  ----------------------------
+      Map<String, Object> session = getSession();
+      User                user    = getConnectedUser();
+
+      Study.Properties  sprop = new Study.Properties();
+      Study.Properties  other = null;
+
+//    Set of the selected repository area
+      String     selectab = area.getSelection().toUpperCase();
+      Visibility reparea  = Visibility.valueOf(selectab);
+      sprop.setVisibility(reparea);
+
+//    Search from a given reference
+      if (among.equals("ref")) {
+       if (refid.length() == 0) {
+          getSession().remove("search.result");                      // The current result is obsolete
+          return "wait";
+       }
+        sprop.setReference(refid);
+        if (reparea == Visibility.PRIVATE) {                         // Restriction to studies in which the connected user is involved
+          other = sprop.copy().setActor(user);
+          sprop.setManager(user);
+        }
+      } else {
+//    Search from other available criteria
+        if (this.state != null) {
+          ProgressState  state = ProgressState.APPROVED;             // Trick for the Public and Reference areas to not share the APPROVED state 
+          if (!this.state.equals("ARCHIVED")) state = ProgressState.valueOf(this.state);
+          sprop.setState(state);
+        }
+        if (words.length() > 0)        sprop.setTitle(words);
+        if (context.size() > 0)        sprop.setSimulationContexts(context);
+        if      (among.equals("mine")) sprop.setManager(user);
+        else if (among.equals("his")) {
+          User him = UserDirectory.selectUser(Integer.valueOf(author));
+          sprop.setManager(him);
+          if (reparea == Visibility.PRIVATE) sprop.setActor(user);
+        } else //among.equals("all")
+          if (reparea == Visibility.PRIVATE) {
+               other = sprop.copy().setActor(user);
+               sprop.setManager(user);
+          }
+      }
+      if (other == null) result = Database.selectStudiesWhere(sprop);
+      else               result = Database.selectStudiesWhere(sprop, other);
+
+      session.put("search.result", result);                          // For redisplaying the page without re-executing the search
+      return "refresh";
+    }
+
+//  ==============================================================================================================================
+//  Getters
+//  ==============================================================================================================================
+
+    public String getArea () {
+//  ------------------------
+      return area.getSelection();
+    }
+    public String getOwner () {
+//  -------------------------
+      return among;
+    }
+    public String getReference () {
+//  -----------------------------
+      return refid;
+    }
+    public String getState () {
+//  -------------------------
+      return state;
+    }
+    public List<Item> getTabs () {
+//  ----------------------------
+      return area.asList();
+    }
+    public String getWords () {
+//  -------------------------
+      return words;
+    }
+
+//  ==============================================================================================================================
+//  Setters
+//  ==============================================================================================================================
+
+    public void setOwner (String value) {
+//  -----------------------------------
+      this.among = value;
+    }
+    public void setReference (String value) {
+//  ---------------------------------------
+      this.refid = value;
+    }
+    public void setState (String value) {
+//  -----------------------------------
+      this.state = value;
+    }
+    public void setWords (String value) {
+//  -----------------------------------
+      this.words = value;
+    }
+
+//  ==============================================================================================================================
+//  Implementation of abstract services
+//  ==============================================================================================================================
+
+       protected List<SimulationContextType> getInvolvedContexts () {
+//  ------------------------------------------------------------
+      List<ProjectSettings.Step>  steps  = ProjectSettings.getStepsOf(Study.class);
+      ProjectSettings.Step[]      number = steps.toArray(new ProjectSettings.Step[steps.size()]);
+      
+      return SimulationContext.selectTypesOf(number);
+       }
+
+    @SuppressWarnings("unchecked")
+       protected void loadFilter () {
+//  ----------------------------
+      Map<String,Object> session = getSession();
+      User                user    = getConnectedUser();
+      Map<String,Object> filter  = (Map<String, Object>)session.get("study.filter");   // A default filter is supposed being set at start
+
+      area    = (TabBar)filter.get("area");
+      state   = (String)filter.get("state");
+      among   = (String)filter.get("owner");
+      author  = (String)filter.get("author");
+      refid   = (String)filter.get("reference");
+      words   = (String)filter.get("title");
+      context = (List<SimulationContext>)filter.get("context");
+
+      if (user == null) {
+       area.disables("private");
+       if (area.getSelection().equals("private")) area.selects("public");
+       if (among.equals("mine")) among = "all";
+      }
+    }
+    
+    @SuppressWarnings("unchecked")
+       protected void saveFilter () {
+//  ----------------------------
+      Map<String, Object> session = getSession();
+      Map<String, Object> filter  = (Map<String, Object>)session.get("study.filter");   // A default filter is supposed being set at start
+
+      area = (TabBar)filter.get("area");   // The area being not an input, it is null when submitting the form
+      if (among.equals("ref")) {
+        filter.put("owner", "ref");
+        filter.put("reference", this.refid);
+      } else {
+        filter.put("state",  this.state);
+        filter.put("owner",  this.among);
+        filter.put("author", this.author);
+        filter.put("reference", "");
+        filter.put("title",  this.words);
+        
+        context = (List<SimulationContext>)filter.get("context");  // Only criteria not part of the form
+      }
+    }
+}
\ No newline at end of file