From 4d778bee3a7e78aa630b389ddc07e45a07108b71 Mon Sep 17 00:00:00 2001 From: kenstir Date: Mon, 4 Nov 2013 00:09:04 -0500 Subject: [PATCH] Improvements surrounding organizations. 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. --- .../src/Android/res/layout/search_result_list.xml | 7 +- Open-ILS/src/Android/res/values/strings.xml | 6 +- .../android/accountAccess/AccountAccess.java | 19 ++- .../evergreen/android/globals/GlobalConfigs.java | 190 +++++++-------------- .../android/searchCatalog/Organisation.java | 2 +- .../searchCatalog/SearchCatalogListView.java | 20 ++- 6 files changed, 98 insertions(+), 146 deletions(-) diff --git a/Open-ILS/src/Android/res/layout/search_result_list.xml b/Open-ILS/src/Android/res/layout/search_result_list.xml index 4d7eb5f1f2..cc1c24efef 100644 --- a/Open-ILS/src/Android/res/layout/search_result_list.xml +++ b/Open-ILS/src/Android/res/layout/search_result_list.xml @@ -72,10 +72,11 @@ + android:layout_gravity="left" + android:layout_weight="1" + android:gravity="center|left" + android:spinnerMode="dialog" /> Please wait - Fetching data... - Fetching more results... + Fetching data + Fetching more results Enter text here Add filter @@ -72,7 +72,7 @@ Record %1$d of %2$d - Show More... + Show More diff --git a/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/AccountAccess.java b/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/AccountAccess.java index 84930c08a1..232fe03e72 100644 --- a/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/AccountAccess.java +++ b/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/AccountAccess.java @@ -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; diff --git a/Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java b/Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java index ea4de75f0e..53f0e806cb 100644 --- a/Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java +++ b/Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java @@ -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(); 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(); - 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 orgs = new ArrayList(); - - 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() { + @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 list = new ArrayList(); + 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 adapter = new ArrayAdapter(this, layout.spinner_layout, list); + choseOrganisation = (Spinner) findViewById(R.id.chose_organisation); choseOrganisation.setAdapter(adapter); - choseOrganisation.setSelection(selectedPos); - choseOrganisation .setOnItemSelectedListener(new OnItemSelectedListener() { @Override -- 2.11.0