Improvements surrounding organizations.
authorkenstir <kenstir@gmail.com>
Mon, 4 Nov 2013 05:09:04 +0000 (00:09 -0500)
committerkenstir <kenstir@gmail.com>
Mon, 4 Nov 2013 05:09:04 +0000 (00:09 -0500)
Make initialization faster by (1) parsing OrgTree.js organization array as
JSON.

Do not include in the library list organizational units that are marked as
not visible in OPAC.  This reduces the list from 338 items to 181 items.
Improved readability of the list by removing space-padding that is done
for the web drop-down list, and putting the spinner in dialog mode.

Sort organizations by name, with (1) home library selected, and (2) root
organization first.  This narrows the results of default searches.

Open-ILS/src/Android/res/layout/search_result_list.xml
Open-ILS/src/Android/res/values/strings.xml
Open-ILS/src/Android/src/org/evergreen/android/accountAccess/AccountAccess.java
Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/Organisation.java
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/SearchCatalogListView.java

index 4d7eb5f..cc1c24e 100644 (file)
         <Spinner
             android:id="@+id/chose_organisation"
             android:layout_width="0dp"
-            android:layout_weight="1"
             android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-               />
+            android:layout_gravity="left"
+            android:layout_weight="1"
+            android:gravity="center|left"
+            android:spinnerMode="dialog" />
 
         <ImageButton
             android:id="@+id/searchButton"
index 6a4dfe1..630dd42 100644 (file)
@@ -45,8 +45,8 @@
     
     <string name="loading_dialog_text"></string>
     <string name="dialog_please_wait">Please wait</string>
-    <string name="dialog_fetching_data_message">Fetching data...</string>
-    <string name="dialog_load_more_message">Fetching more results...</string>
+    <string name="dialog_fetching_data_message">Fetching data</string>
+    <string name="dialog_load_more_message">Fetching more results</string>
     
     <string name="advanced_search_hint">Enter text here</string>
     <string name="advanced_search_add_filter_button">Add filter</string>
@@ -72,7 +72,7 @@
     <string name="record_of">Record %1$d of %2$d</string>
     
     <!-- Search Details View -->
-    <string name="show_more_text">Show More...</string>
+    <string name="show_more_text">Show More</string>
     
     <!-- Place Hold Activity View -->
     
index 84930c0..232fe03 100644 (file)
@@ -179,6 +179,7 @@ public class AccountAccess {
     /**
      * The auth token. Sent with every request that needs authentication
      * */
+    //kcxxx: refactor into Account obj
     public String authToken = null;
 
     /** The cm. */
@@ -188,8 +189,12 @@ public class AccountAccess {
     private Integer authTime = null;
 
     /** The user id. */
+    //kcxxx: refactor into Account obj
     private Integer userID = null;
-    // for demo purpose
+    
+    //kcxxx: refactor into Account obj
+    private Integer homeLibraryID = null;
+
     /** The user name. */
     public static String userName = "daniel";
 
@@ -273,6 +278,14 @@ public class AccountAccess {
         return null;
     }
 
+    public Integer getHomeLibraryID() {
+        return homeLibraryID;
+    }
+
+    public void setHomeLibraryID(Integer homeLibraryID) {
+        this.homeLibraryID = homeLibraryID;
+    }
+
     /*
      * Change the Http conn to a new library address
      */
@@ -378,6 +391,10 @@ public class AccountAccess {
             System.out.println("Sync Response: " + resp);
             OSRFObject au = (OSRFObject) resp;
             userID = au.getInt("id");
+            homeLibraryID = au.getInt("home_ou");
+            String s = au.getString("usrname");
+            //may be interesting: usrname=coxken, email=kenstir@gmail.com
+
             System.out.println("User Id " + userID);
 
             return au;
index ea4de75..53f0e80 100644 (file)
@@ -23,7 +23,11 @@ import java.io.InputStream;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
+import java.util.List;
 import java.util.StringTokenizer;
 
 import org.evergreen.android.accountAccess.AccountAccess;
@@ -32,6 +36,8 @@ import org.evergreen.android.searchCatalog.Organisation;
 import org.evergreen.android.searchCatalog.SearchCatalog;
 import org.evergreen.android.views.ApplicationPreferences;
 import org.open_ils.idl.IDLParser;
+import org.opensrf.util.JSONException;
+import org.opensrf.util.JSONReader;
 
 import android.content.Context;
 import android.content.Intent;
@@ -152,18 +158,18 @@ public class GlobalConfigs {
     public void loadIDLFile(Context context) {
 
         try {
-            Log.d("init", "loadIDLFile start");
+            Log.d(TAG, "loadIDLFile start");
             //@TODO maybe switch back to IDL_FILE_FROM_ROOT?class=circ&class=au&class=mvr&class=acp
             InputStream in_IDL = context.getAssets().open(IDL_FILE_FROM_ASSETS);
             IDLParser parser = new IDLParser(in_IDL);
             parser.setKeepIDLObjects(false);
-            Log.d("init", "loadIDLFile parse");
+            Log.d(TAG, "loadIDLFile parse");
             long start_ms = System.currentTimeMillis();
             parser.parse();
             long duration_ms = System.currentTimeMillis() - start_ms;
-            Log.d("init", "loadIDLFile parse took "+duration_ms+"ms");
+            Log.d(TAG, "loadIDLFile parse took "+duration_ms+"ms");
         } catch (Exception e) {
-            Log.e("init", "Error in parsing IDL file", e);
+            Log.e(TAG, "Error in parsing IDL file", e);
         }
         ;
 
@@ -171,10 +177,7 @@ public class GlobalConfigs {
     }
 
     /**
-     * Gets the organisations get's OrgTree.js from server, parses the input and
-     * recovers the organisations
-     * 
-     * @return the organisations
+     * Fetch the OrgTree.js file, and from it parse the list of organisations.
      */
     public void getOrganisations() {
 
@@ -183,149 +186,78 @@ public class GlobalConfigs {
         organisations = new ArrayList<Organisation>();
 
         try {
-            // using https: address
+            Log.d(TAG, "getOrg fetching "+httpAddress + collectionsRequest);
             orgFile = Utils.getNetPageContent(httpAddress + collectionsRequest);
-            System.out.println("Request org " + httpAddress
-                    + collectionsRequest);
         } catch (Exception e) {
         }
-        ;
 
         if (orgFile != null) {
             long start_ms = System.currentTimeMillis();
-            Log.d("init", "Loading organisations");
+            Log.d(TAG, "getOrg loading");
             organisations = new ArrayList<Organisation>();
 
-            System.out.println("Page content " + orgFile);
             // in case of wrong file
             if (orgFile.indexOf("=") == -1)
                 return;
-
             String orgArray = orgFile.substring(orgFile.indexOf("=") + 1,
                     orgFile.indexOf(";"));
+            Log.d(TAG, "getOrg array=" + orgArray.substring(0, orgArray.length()>50 ? 50 : -1));
+
+            // Parse javascript list
+            // Format: [[id, ou_type, parent_ou, name, opac_visible, shortname],...]
+            // Sample: [[149,3,146,"Agawam",0,"AGAWAM_MA"],
+            //          [150,4,149,"Agawam Public Library",1,"AGAWAM"],...]
+            // ou_type can be treated as hierarchical nesting level
+            List orgList;
+            try {
+                orgList = new JSONReader(orgArray).readArray();
+            } catch (JSONException e) {
+                Log.d(TAG, "getOrg failed parsing array", e);
+                return;
+            }
 
-            String arrayContent = orgArray.substring(orgArray.indexOf("[") + 1,
-                    orgArray.lastIndexOf("]"));
-
-            Log.d(TAG, "Array to pe parsed " + arrayContent);
-
-            // parser for list
-
-            // format [104,2,1,"Curriculum Center",1,"CURRICULUM"] :
-            // [id,level,parent,name,can_have_volumes_bool,short_name]
-
-            int index = 0;
-            while (true) {
-
-                if (index >= arrayContent.length())
-                    break;
-
-                int start = arrayContent.indexOf("[", index) + 1;
-                int stop = arrayContent.indexOf("]", index);
-
-                Log.d(TAG, "start stop length index " + start + " " + stop
-                        + " " + arrayContent.length() + " " + index);
-                if (start == -1 || stop == -1)
-                    break;
-
-                index = stop + 1;
-
-                String content = arrayContent.substring(start, stop);
-                //System.out.println("Content " + content);
-
-                StringTokenizer tokenizer = new StringTokenizer(content, ",");
-
+            // Convert json list into array of Organisation
+            for (int i=0; i<orgList.size(); ++i) {
                 Organisation org = new Organisation();
-
-                // first is ID
-                String element = (String) tokenizer.nextElement();
-                //System.out.println("Id  " + element);
-                try {
-                    org.id = Integer.parseInt(element);
-                } catch (Exception e) {
-                }
-                ;
-
-                // level
-                element = (String) tokenizer.nextElement();
-                //System.out.println("Level   " + element);
-                try {
-                    org.level = Integer.parseInt(element);
-                } catch (Exception e) {
-                }
-                ;
-
-                // parent
-                element = (String) tokenizer.nextElement();
-                //System.out.println("parent  " + element);
-                try {
-                    org.parent = Integer.parseInt(element);
-                } catch (Exception e) {
-                }
-                ;
-
-                // name
-                element = (String) tokenizer.nextToken("\",");
-                //System.out.println("Element  " + element);
-                org.name = element;
-
-                // can_have_volume_boo.
-                element = (String) tokenizer.nextElement();
-                //System.out.println("Element  " + element);
-                try {
-                    org.canHaveVolumesBool = Integer.parseInt(element);
-                } catch (Exception e) {
+                List orgItem = (List) orgList.get(i);
+                org.id= (Integer)orgItem.get(0);
+                org.level = (Integer)orgItem.get(1);
+                org.parent = (Integer)orgItem.get(2);
+                org.name = (String)orgItem.get(3);
+                org.isVisible = (Integer)orgItem.get(4);
+                org.shortName = (String)orgItem.get(5);
+                if (org.isVisible == 0) {
+                    continue;
                 }
-                ;
-
-                // short name
-                element = (String) tokenizer.nextToken("\",");
-                //System.out.println("Element  " + element);
-                org.shortName = element;
-
-                organisations.add(org);
-            }
-
-            ArrayList<Organisation> orgs = new ArrayList<Organisation>();
-
-            for (int i = 0; i < organisations.size(); i++) {
 
+                /*
                 StringBuilder padding = new StringBuilder();
-                for (int j = 0; j < organisations.get(i).level - 1; j++)
+                for (int j = 0; j < org.level - 1; j++)
                     padding.append("   ");
-
-                organisations.get(i).padding = padding.toString();
+                org.padding = padding.toString();
+                */
+                
+                organisations.add(org);
             }
-
-            int size = organisations.size();
-            int level = 0;
-            while (orgs.size() < size) {
-
-                for (int i = 0; i < organisations.size(); i++) {
-                    Organisation org = organisations.get(i);
-                    if (level == org.level) {
-                        boolean add = false;
-                        for (int j = 0; j < orgs.size(); j++) {
-
-                            if (orgs.get(j).id == org.parent) {
-                                orgs.add(j + 1, org);
-                                add = true;
-                                Log.d(TAG, "Added " + org.name + " "
-                                        + org.level);
-                                break;
-                            }
-                        }
-
-                        if (add == false) {
-                            orgs.add(org);
-                            Log.d(TAG, "Added " + org.name + " " + org.level);
-                        }
-                    }
-
+            
+            /*
+            for (int i=0; i<organisations.size(); ++i) {
+                Log.d(TAG, "getOrg presort org["+i+"]= id:"+organisations.get(i).id+" parent:"+organisations.get(i).parent+" name:"+organisations.get(i).name);
+            }
+            */
+            Collections.sort(organisations, new Comparator<Organisation>() {
+                @Override
+                public int compare(Organisation a, Organisation b) {
+                    if (a.parent == null)
+                        return -1; // root is always first
+                    return a.name.compareTo(b.name);
                 }
-                level++;
+            });
+            /*
+            for (int i=0; i<organisations.size(); ++i) {
+                Log.d(TAG, "getOrg postsort org["+i+"]= id:"+organisations.get(i).id+" parent:"+organisations.get(i).parent+" name:"+organisations.get(i).name);
             }
-            organisations = orgs;
+            */
 
             long duration_ms = System.currentTimeMillis() - start_ms;
             Log.d("init", "Loading organisations took "+duration_ms+"ms");
index c40f51e..acbb0cd 100644 (file)
@@ -31,7 +31,7 @@ public class Organisation {
 
     public Integer parent = null;
 
-    public Integer canHaveVolumesBool = null;
+    public Integer isVisible = null;
 
     public Integer hiddenDepth = null;
 
index d5d38ce..53d6b89 100644 (file)
@@ -159,7 +159,7 @@ public class SearchCatalogListView extends Activity {
             }
         });
         // end header portion actions
-
+        
         advancedSearchButton = (Button) findViewById(R.id.menu_advanced_search_button);
 
         advancedSearchButton.setOnClickListener(new OnClickListener() {
@@ -515,10 +515,8 @@ public class SearchCatalogListView extends Activity {
             }
         });
 
-        choseOrganisation = (Spinner) findViewById(R.id.chose_organisation);
 
         searchButton = (ImageButton) findViewById(R.id.searchButton);
-
         searchButton.setOnClickListener(new OnClickListener() {
 
             @Override
@@ -529,22 +527,26 @@ public class SearchCatalogListView extends Activity {
         });
 
         int selectedPos = 0;
+        int homeLibrary = 0;
+        if (AccountAccess.getAccountAccess() != null) {
+            homeLibrary = AccountAccess.getAccountAccess().getHomeLibraryID();
+        }
         ArrayList<String> list = new ArrayList<String>();
+        Log.d("kcxxx", "Org scanning ...");
         if (globalConfigs.organisations != null) {
             for (int i = 0; i < globalConfigs.organisations.size(); i++) {
-                list.add(globalConfigs.organisations.get(i).padding
-                        + globalConfigs.organisations.get(i).name);
-
-                if (globalConfigs.organisations.get(i).level - 1 == 0)
+                Organisation org = globalConfigs.organisations.get(i);
+                list.add(org.padding + org.name);
+                if (org.id == homeLibrary)
                     selectedPos = i;
             }
         }
+        Log.d("kcxxx", "Org scanning ...done");
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                 layout.spinner_layout, list);
+        choseOrganisation = (Spinner) findViewById(R.id.chose_organisation);
         choseOrganisation.setAdapter(adapter);
-
         choseOrganisation.setSelection(selectedPos);
-
         choseOrganisation
                 .setOnItemSelectedListener(new OnItemSelectedListener() {
                     @Override