--- /dev/null
+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