From 60d179801c28d6c1c46b11cee969aad93fc154d5 Mon Sep 17 00:00:00 2001 From: kenstir Date: Sat, 2 Nov 2013 18:59:36 -0400 Subject: [PATCH] Step 1 in IDL speedup: Use the fm_IDL.xml from assets instead of downloading; shrink fm_IDL.xml by removing unused elements. Under the emulator parsing the IDL is ridiculously slow (35s). Still loads of work to do; it's only slightly faster on the emulator (30s) and still noticeably slow on hardware (~5s). Removed openils_idl.jar and instead put the modified sources under Android/src/java/org/open_ils/. Nat at least it's obvious that it's modified version of the code in Open-ILS/src/java. It's modified because the javax.xml.stream parser is not available on Android and was replaced with an xmlpull parser. --- Open-ILS/src/Android/.classpath | 1 - Open-ILS/src/Android/assets/fm_IDL.xml | 3007 +------------------- Open-ILS/src/Android/libs/org.openils_idl.jar | Bin 20448 -> 0 bytes .../evergreen/android/globals/GlobalConfigs.java | 38 +- .../android/views/ApplicationPreferences.java | 2 +- Open-ILS/src/Android/src/org/open_ils/Event.java | 33 + Open-ILS/src/Android/src/org/open_ils/Sys.java | 70 + .../Android/src/org/open_ils/idl/IDLException.java | 10 + .../src/Android/src/org/open_ils/idl/IDLField.java | 46 + .../src/Android/src/org/open_ils/idl/IDLLink.java | 46 + .../Android/src/org/open_ils/idl/IDLObject.java | 96 + .../Android/src/org/open_ils/idl/IDLParser.java | 225 ++ .../src/Android/src/org/open_ils/test/TestIDL.java | 24 + .../Android/src/org/open_ils/test/TestLogin.java | 29 + .../src/Android/src/org/open_ils/util/Utils.java | 76 + 15 files changed, 680 insertions(+), 3023 deletions(-) delete mode 100644 Open-ILS/src/Android/libs/org.openils_idl.jar create mode 100644 Open-ILS/src/Android/src/org/open_ils/Event.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/Sys.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/idl/IDLException.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/idl/IDLField.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/idl/IDLLink.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/idl/IDLObject.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/idl/IDLParser.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/test/TestIDL.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/test/TestLogin.java create mode 100644 Open-ILS/src/Android/src/org/open_ils/util/Utils.java diff --git a/Open-ILS/src/Android/.classpath b/Open-ILS/src/Android/.classpath index fa0f7bc8b2..35ddea799b 100644 --- a/Open-ILS/src/Android/.classpath +++ b/Open-ILS/src/Android/.classpath @@ -3,7 +3,6 @@ - diff --git a/Open-ILS/src/Android/assets/fm_IDL.xml b/Open-ILS/src/Android/assets/fm_IDL.xml index 88b1b71310..aa984f2fae 100644 --- a/Open-ILS/src/Android/assets/fm_IDL.xml +++ b/Open-ILS/src/Android/assets/fm_IDL.xml @@ -20,10 +20,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA --> - - + @@ -153,14 +153,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -172,14 +164,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -217,22 +201,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -265,14 +233,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -290,14 +250,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -310,11 +262,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - @@ -343,14 +290,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -362,14 +301,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -383,14 +314,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -405,14 +328,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -428,14 +343,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -460,14 +367,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -479,14 +378,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -500,14 +391,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -521,14 +404,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -541,14 +416,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -570,22 +437,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -601,22 +452,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -643,14 +478,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -661,14 +488,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -683,14 +502,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -715,14 +526,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -734,14 +537,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -752,11 +547,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - @@ -771,14 +561,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -795,14 +577,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -820,14 +594,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -847,14 +613,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -885,12 +643,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - @@ -901,14 +653,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -925,14 +669,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -941,14 +677,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -957,14 +685,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -979,22 +699,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -1030,14 +734,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1075,22 +771,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -1118,14 +798,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1135,14 +807,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1151,14 +815,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1167,14 +823,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1183,14 +831,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1199,14 +839,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1221,20 +853,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - @@ -1243,14 +861,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1259,14 +869,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1275,14 +877,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1306,14 +900,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1338,14 +924,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1361,14 +939,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1413,14 +983,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1470,14 +1032,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1487,14 +1041,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1510,14 +1056,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1532,20 +1070,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - @@ -1558,20 +1082,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - @@ -1585,20 +1095,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - @@ -1607,14 +1103,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1630,21 +1118,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - + @@ -1790,16 +1266,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - @@ -1818,20 +1284,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - @@ -1871,14 +1323,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1904,14 +1348,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1923,14 +1359,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1943,14 +1371,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1967,14 +1387,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -1987,14 +1399,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2024,14 +1428,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2063,14 +1459,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2109,14 +1497,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2129,14 +1509,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2150,14 +1522,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2179,14 +1543,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2197,14 +1553,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2213,14 +1561,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2228,14 +1568,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2244,11 +1576,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - @@ -2260,14 +1587,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2279,14 +1598,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2321,14 +1632,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2373,13 +1676,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - @@ -2394,13 +1690,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - @@ -2459,13 +1748,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - @@ -2489,14 +1771,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2508,14 +1782,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2527,14 +1793,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2547,14 +1805,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2567,14 +1817,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2588,14 +1830,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2608,14 +1842,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2747,11 +1973,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - @@ -2764,14 +1985,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2784,13 +1997,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - @@ -2806,26 +2012,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - - - - - @@ -2833,14 +2019,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2856,14 +2034,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2882,14 +2052,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2917,22 +2079,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -2967,14 +2113,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -2983,14 +2121,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3039,19 +2169,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - SELECT * FROM metabib.author_field_entry - UNION ALL - SELECT * FROM metabib.keyword_field_entry - UNION ALL - SELECT * FROM metabib.identifier_field_entry - UNION ALL - SELECT * FROM metabib.title_field_entry - UNION ALL - SELECT * FROM metabib.subject_field_entry - UNION ALL - SELECT * FROM metabib.series_field_entry - @@ -3154,14 +2271,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3176,14 +2285,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3195,14 +2296,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3221,14 +2314,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3272,14 +2357,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - @@ -3311,22 +2388,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - - - - - - - - @@ -3341,45 +2402,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - - - - - - -SELECT usr, - SUM( - CASE - WHEN ( - ((fine_interval >= '1 day' AND due_date >= 'today') OR (fine_interval < '1 day' AND due_date > 'now')) - AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) - ) THEN 1 - ELSE 0 - END - ) AS out, - - SUM( - CASE - WHEN ( - ((fine_interval >= '1 day' AND due_date < 'today') OR (fine_interval < '1 day' AND due_date < 'now')) - AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) - ) THEN 1 - ELSE 0 - END - ) AS overdue, - - SUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LOST') THEN 1 ELSE 0 END) AS lost, - SUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'CLAIMSRETURNED') THEN 1 ELSE 0 END) AS claims_returned, - SUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LONGOVERDUE') THEN 1 ELSE 0 END) AS long_overdue - FROM action.circulation - WHERE checkin_time IS NULL - GROUP BY 1 - @@ -3393,35 +2417,6 @@ SELECT usr, - -SELECT usr, - ARRAY_TO_STRING(ARRAY_ACCUM( - CASE - WHEN ( - ((fine_interval >= '1 day' AND due_date >= 'today') OR (fine_interval < '1 day' AND due_date > 'now')) - AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) - ) THEN id - ELSE 0 - END - ),',') AS out, - - ARRAY_TO_STRING(ARRAY_ACCUM( - CASE - WHEN ( - ((fine_interval >= '1 day' AND due_date < 'today') OR (fine_interval < '1 day' AND due_date < 'now')) - AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) - ) THEN id - ELSE 0 - END - ),',') AS overdue, - - ARRAY_TO_STRING(ARRAY_ACCUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LOST') THEN id ELSE 0 END),',') AS lost, - ARRAY_TO_STRING(ARRAY_ACCUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'CLAIMSRETURNED') THEN id ELSE 0 END),',') AS claims_returned, - ARRAY_TO_STRING(ARRAY_ACCUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LONGOVERDUE') THEN id ELSE 0 END),',') AS long_overdue - FROM action.circulation - WHERE checkin_time IS NULL - GROUP BY 1 - @@ -3672,14 +2667,6 @@ SELECT usr, - - - - - - - - @@ -3704,14 +2691,6 @@ SELECT usr, - - - - - - - - @@ -3730,14 +2709,6 @@ SELECT usr, - - - - - - - - @@ -3755,14 +2726,6 @@ SELECT usr, - - - - - - - - @@ -3777,22 +2740,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -3842,14 +2789,6 @@ SELECT usr, - - - - - - - - @@ -3862,14 +2801,6 @@ SELECT usr, - - - - - - - - @@ -3969,14 +2900,6 @@ SELECT usr, - - - - - - - - @@ -3992,14 +2915,6 @@ SELECT usr, - - - - - - - - @@ -4011,20 +2926,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4038,14 +2939,6 @@ SELECT usr, - - - - - - - - @@ -4086,14 +2979,6 @@ SELECT usr, - - - - - - - - @@ -4121,20 +3006,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4158,14 +3029,6 @@ SELECT usr, - - - - - - - - @@ -4219,14 +3082,6 @@ SELECT usr, - - - - - - - - @@ -4243,22 +3098,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -4274,20 +3113,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4303,22 +3128,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -4344,20 +3153,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4421,14 +3216,6 @@ SELECT usr, - - - - - - - - @@ -4457,22 +3244,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -4528,20 +3299,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4555,20 +3312,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4582,20 +3325,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4617,14 +3346,6 @@ SELECT usr, - - - - - - - - @@ -4632,14 +3353,6 @@ SELECT usr, - - - - - - - - @@ -4652,14 +3365,6 @@ SELECT usr, - - - - - - - - @@ -4667,14 +3372,6 @@ SELECT usr, - - - - - - - - @@ -4686,14 +3383,6 @@ SELECT usr, - - - - - - - - @@ -4740,14 +3429,6 @@ SELECT usr, - - - - - - - - @@ -4767,14 +3448,6 @@ SELECT usr, - - - - - - - - @@ -4782,11 +3455,6 @@ SELECT usr, - - - - - @@ -4802,14 +3470,6 @@ SELECT usr, - - - - - - - - @@ -4822,20 +3482,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -4902,43 +3548,6 @@ SELECT usr, - ahr.requestor) AS is_staff_hold - FROM action.hold_request ahr - JOIN asset.copy acp ON (acp.id = ahr.current_copy) - JOIN asset.call_number acn ON (acp.call_number = acn.id) - JOIN asset.call_number_prefix acnp ON (acn.prefix = acnp.id) - JOIN asset.call_number_suffix acns ON (acn.suffix = acns.id) - JOIN actor.usr au ON (au.id = ahr.usr) - LEFT JOIN serial.issuance siss - ON (ahr.hold_type = 'I' AND siss.id = ahr.target) - LEFT JOIN asset.copy_location_order acplo - ON (acp.location = acplo.location AND - acp.circ_lib = acplo.org) - WHERE - ahr.capture_time IS NULL AND - ahr.cancel_time IS NULL AND - (ahr.expire_time is NULL OR ahr.expire_time > NOW()) - ]]> @@ -5004,16 +3613,8 @@ SELECT usr, - - - - - - - SELECT ahr.* FROM action.hold_request ahr JOIN (SELECT current_copy, MAX(capture_time) AS capture_time FROM action.hold_request WHERE capture_time IS NOT NULL GROUP BY current_copy)x USING (current_copy, capture_time) - @@ -5086,14 +3687,6 @@ SELECT usr, - - - - - - - - @@ -5156,17 +3749,6 @@ SELECT usr, - - - - - - - - - - - @@ -5174,14 +3756,6 @@ SELECT usr, - - - - - - - - @@ -5198,14 +3772,6 @@ SELECT usr, - - - - - - - - @@ -5261,13 +3827,6 @@ SELECT usr, - - - - - - - @@ -5276,14 +3835,6 @@ SELECT usr, - - - - - - - - @@ -5306,14 +3857,6 @@ SELECT usr, - - - - - - - - @@ -5414,14 +3957,6 @@ SELECT usr, - - - - - - - - @@ -5484,14 +4019,6 @@ SELECT usr, - - - - - - - - @@ -5589,14 +4116,6 @@ SELECT usr, - - - - - - - - @@ -5693,14 +4212,6 @@ SELECT usr, - - - - - - - - @@ -5791,20 +4302,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -5844,14 +4341,6 @@ SELECT usr, - - - - - - - - @@ -5862,14 +4351,6 @@ SELECT usr, - - - - - - - - @@ -5879,14 +4360,6 @@ SELECT usr, - - - - - - - - @@ -5904,14 +4377,6 @@ SELECT usr, - - - - - - - - @@ -5924,20 +4389,6 @@ SELECT usr, - - - - - - - - - - - - - - @@ -6029,14 +4480,6 @@ SELECT usr, - - - - - - - - @@ -6248,14 +4691,6 @@ SELECT usr, - - - - - - - - @@ -6263,14 +4698,6 @@ SELECT usr, - - - - - - - - @@ -6298,16 +4725,6 @@ SELECT usr, - - - - - - - - - - @@ -6333,16 +4750,6 @@ SELECT usr, - - - - - - - - - - @@ -6385,14 +4792,6 @@ SELECT usr, - - - - - - - - @@ -6405,14 +4804,6 @@ SELECT usr, - - - - - - - - @@ -6422,14 +4813,6 @@ SELECT usr, - - - - - - - - @@ -6441,14 +4824,6 @@ SELECT usr, - - - - - - - - @@ -6457,14 +4832,6 @@ SELECT usr, - - - - - - - - @@ -6503,22 +4870,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6527,14 +4878,6 @@ SELECT usr, - - - - - - - - @@ -6548,14 +4891,6 @@ SELECT usr, - - - - - - - - @@ -6584,14 +4919,6 @@ SELECT usr, - - - - - - - - @@ -6616,14 +4943,6 @@ SELECT usr, - - - - - - - - @@ -6652,14 +4971,6 @@ SELECT usr, - - - - - - - - @@ -6681,22 +4992,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6724,22 +5019,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6760,22 +5039,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6790,22 +5053,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6825,22 +5072,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6876,14 +5107,6 @@ SELECT usr, For now, we don't have pcrud as one of the controllers, so the permacrud section is moot. But here's what it should look like if we ever do use pcrud. --> - - - - - - - - @@ -6901,14 +5124,6 @@ SELECT usr, For now, we don't have pcrud as one of the controllers, so the permacrud section is moot. But here's what it should look like if we ever do use pcrud. --> - - - - - - - - @@ -6930,14 +5145,6 @@ SELECT usr, - - - - - - - - @@ -6952,22 +5159,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -6999,22 +5190,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7054,14 +5229,6 @@ SELECT usr, - - - - - - - - @@ -7072,13 +5239,6 @@ SELECT usr, - - - - - - - @@ -7089,13 +5249,6 @@ SELECT usr, - - - - - - - @@ -7106,13 +5259,6 @@ SELECT usr, - - - - - - - @@ -7123,13 +5269,6 @@ SELECT usr, - - - - - - - @@ -7140,13 +5279,6 @@ SELECT usr, - - - - - - - @@ -7237,13 +5369,6 @@ SELECT usr, - - - - - - - @@ -7261,22 +5386,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7295,14 +5404,6 @@ SELECT usr, - - - - - - - - @@ -7325,11 +5426,6 @@ SELECT usr, - - - - - @@ -7343,14 +5439,6 @@ SELECT usr, - - - - - - - - @@ -7387,14 +5475,6 @@ SELECT usr, - - - - - - - - @@ -7425,11 +5505,6 @@ SELECT usr, - - - - - @@ -7448,22 +5523,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7485,22 +5544,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7549,14 +5592,6 @@ SELECT usr, - - - - - - - - @@ -7596,14 +5631,6 @@ SELECT usr, - - - - - - - - @@ -7616,14 +5643,6 @@ SELECT usr, - - - - - - - - @@ -7702,11 +5721,6 @@ SELECT usr, - - - - - @@ -7719,14 +5733,6 @@ SELECT usr, - - - - - - - - @@ -7766,22 +5772,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7794,22 +5784,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7842,22 +5816,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -7880,19 +5838,6 @@ SELECT usr, - - - - - - - - - - - - - @@ -8037,11 +5982,6 @@ SELECT usr, - - - - - @@ -8178,14 +6118,6 @@ SELECT usr, - - - - - - - - @@ -8201,22 +6133,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -8232,22 +6148,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -8274,14 +6174,6 @@ SELECT usr, - - - - - - - - @@ -8295,14 +6187,6 @@ SELECT usr, - - - - - - - - @@ -8371,14 +6255,6 @@ SELECT usr, - - - - - - - - @@ -8392,22 +6268,6 @@ SELECT usr, - - - - - - - - - - - - - - - - @@ -8559,14 +6419,6 @@ SELECT usr, - - - SELECT DISTINCT l.* - FROM action.unfulfilled_hold_loops l - JOIN action.unfulfilled_hold_max_loop m USING (hold) - WHERE l.count = m.max - - @@ -9048,11 +6900,6 @@ SELECT usr, - - - - - @@ -9061,11 +6908,6 @@ SELECT usr, - - - - - @@ -9080,11 +6922,6 @@ SELECT usr, - - - - - @@ -9097,11 +6934,6 @@ SELECT usr, - - - - - @@ -9111,26 +6943,9 @@ SELECT usr, - - - - - - - - SELECT b.id, - MAX(dcp.edit_date) AS last_delete_date - FROM biblio.record_entry b - JOIN asset.call_number cn ON (cn.record = b.id) - JOIN asset.copy dcp ON (cn.id = dcp.call_number) - WHERE NOT b.deleted - GROUP BY b.id - HAVING SUM( CASE WHEN NOT dcp.deleted THEN 1 ELSE 0 END) = 0 - - @@ -9138,62 +6953,9 @@ SELECT usr, - - - - - - - - -- -- If we uncomment the RIGHT JOIN against biblio.record_entry, then we'll get a row for every non-deleted bib, whether it has active holds or not. - -- -- If we expect to use pcrud to query against specific bibs, we probably want to do this. However, if we're using this to populate a report, we - -- -- may not. - -- SELECT - -- bre.id AS "bib_id", - -- COALESCE( z.copy_count, 0 ) AS "copy_count", - -- COALESCE( z.hold_count, 0 ) AS "hold_count", - -- COALESCE( z.copy_hold_ratio, 0 ) AS "hold_copy_ratio" - -- FROM ( - SELECT - y.bre AS "id", - COALESCE( x.copy_count, 0 ) AS "copy_count", - y.hold_count AS "hold_count", - (y.hold_count::REAL / (CASE WHEN x.copy_count = 0 OR x.copy_count IS NULL THEN 0.1 ELSE x.copy_count::REAL END)) AS "hold_copy_ratio" - FROM ( - SELECT - (SELECT bib_record FROM reporter.hold_request_record r WHERE r.id = h.id LIMIT 1) AS "bre", - COUNT(*) AS "hold_count" - FROM action.hold_request h - WHERE - cancel_time IS NULL - AND fulfillment_time IS NULL - -- AND NOT frozen -- a frozen hold is still a desired hold, eh? - GROUP BY 1 - )y LEFT JOIN ( - SELECT - (SELECT id - FROM biblio.record_entry - WHERE id = (SELECT record FROM asset.call_number WHERE id = call_number) - ) AS "bre", - COUNT(*) AS "copy_count" - FROM asset.copy - JOIN asset.copy_location loc ON (copy.location = loc.id AND loc.holdable) - WHERE copy.holdable - AND NOT copy.deleted - AND copy.status IN ( SELECT id FROM config.copy_status WHERE holdable ) - GROUP BY 1 - )x ON x.bre = y.bre - -- )z RIGHT JOIN ( - -- SELECT id - -- FROM biblio.record_entry - -- WHERE NOT deleted - -- )bre ON (z.bib_id = bre.id) - - - @@ -9203,43 +6965,9 @@ SELECT usr, - - - - - - - SELECT *, - CASE WHEN copy_count_at_pickup_library = 0 THEN 'Infinity'::FLOAT ELSE holds_at_pickup_library::FLOAT/copy_count_at_pickup_library END AS pickup_library_ratio, - CASE WHEN copy_count_everywhere = 0 THEN 'Infinity'::FLOAT ELSE holds_everywhere::FLOAT/copy_count_everywhere END AS everywhere_ratio - FROM - (SELECT bib_record as id, pickup_lib, count(DISTINCT ahr.id) AS holds_at_pickup_library, COALESCE(count(DISTINCT ac.id),0) as copy_count_at_pickup_library - FROM - action.hold_request ahr - JOIN reporter.hold_request_record rhrr USING (id) - LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) - LEFT JOIN asset.copy ac ON (ahcm.target_copy = ac.id AND ahr.pickup_lib = ac.circ_lib) - WHERE - ahr.cancel_time IS NULL - AND ahr.fulfillment_time IS NULL - GROUP BY bib_record, pickup_lib - )x - JOIN - (SELECT bib_record as id, count(DISTINCT ahr.id) AS holds_everywhere, COALESCE(count(DISTINCT target_copy),0) as copy_count_everywhere - FROM - action.hold_request ahr - JOIN reporter.hold_request_record rhrr USING (id) - LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) - WHERE - ahr.cancel_time IS NULL - AND ahr.fulfillment_time IS NULL - GROUP BY bib_record - )y - USING (id) - @@ -9254,33 +6982,9 @@ SELECT usr, - - - - - - - SELECT - ac.id, - COALESCE(MAX(actac.xact_start), ac.create_date) AS last_circ_or_create, - MAX(actac.xact_start) AS last_circ - FROM asset.copy ac - LEFT JOIN action.all_circulation actac ON ac.id = actac.target_copy - GROUP BY ac.id - - -- Alternate version, say if you have migrated last checkout information in extend_reporter.legacy_circ_timestamp: - --SELECT - -- ac.id, - -- GREATEST(MAX(actac.xact_start), erlct.last_cko_ts, ac.create_date) AS last_circ_or_create, - -- GREATEST(MAX(actac.xact_start), erlct.last_cko_ts) AS last_circ - --FROM asset.copy ac - -- LEFT JOIN action.all_circulation actac ON ac.id = actac.target_copy - -- LEFT JOIN extend_reporter.legacy_circ_timestamp erlct ON ac.id = erlct.id - --GROUP BY ac.id, ac.create_date, erlct.last_cko_ts - @@ -9289,708 +6993,5 @@ SELECT usr, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SELECT - po.ordering_agency AS ordering_agency, - po.id AS purchase_order, - li.id AS lineitem, - lid.id AS lineitem_detail, - cpa.id AS claim_policy_action - FROM - acq.lineitem_detail lid - JOIN acq.lineitem li ON (li.id = lid.lineitem) - JOIN acq.purchase_order po ON (po.id = li.purchase_order) - JOIN acq.claim_policy cp ON (li.claim_policy = cp.id) - JOIN acq.claim_policy_action cpa ON ( - cpa.claim_policy = cp.id - - -- we only care about claim policy actions whose claim - -- interval we'd reached or exceeded - AND (NOW() - cpa.action_interval) > po.order_date - - -- filter out all claim policy actions where claim events - -- have occurred on or after the action's action_interval - AND NOT EXISTS ( - SELECT 1 - FROM - acq.claim_event evt - JOIN acq.claim claim ON ( - claim.id = evt.claim - AND claim.lineitem_detail = lid.id - ) - WHERE - evt.event_date >= (po.order_date + cpa.action_interval) - ) - ) - WHERE - lid.cancel_reason IS NULL - AND li.cancel_reason IS NULL -- belt/suspenders - AND po.cancel_reason IS NULL -- belt/suspenders - AND lid.recv_time IS NULL - AND po.state = 'on-order' - ORDER BY 1, 2, 3, 4, 5 - - - - - - - - - - - - - - - - - - - - - - SELECT - li.id AS lineitem, - ( - SELECT COUNT(lid.id) - FROM acq.lineitem_detail lid - WHERE lineitem = li.id - ) AS item_count, - ( - SELECT COUNT(lid.id) - FROM acq.lineitem_detail lid - WHERE recv_time IS NOT NULL AND lineitem = li.id - ) AS recv_count, - ( - SELECT COUNT(lid.id) - FROM acq.lineitem_detail lid - WHERE cancel_reason IS NOT NULL AND lineitem = li.id - ) AS cancel_count, - ( - SELECT COUNT(lid.id) - FROM acq.lineitem_detail lid - JOIN acq.fund_debit debit ON (lid.fund_debit = debit.id) - WHERE NOT debit.encumbrance AND lineitem = li.id - ) AS invoice_count, - ( - SELECT COUNT(DISTINCT(lid.id)) - FROM acq.lineitem_detail lid - JOIN acq.claim claim ON (claim.lineitem_detail = lid.id) - WHERE lineitem = li.id - ) AS claim_count, - ( - SELECT (COUNT(lid.id) * li.estimated_unit_price)::NUMERIC(8,2) - FROM acq.lineitem_detail lid - WHERE lid.cancel_reason IS NULL AND lineitem = li.id - ) AS estimated_amount, - ( - SELECT SUM(debit.amount)::NUMERIC(8,2) - FROM acq.lineitem_detail lid - JOIN acq.fund_debit debit ON (lid.fund_debit = debit.id) - WHERE debit.encumbrance AND lineitem = li.id - ) AS encumbrance_amount, - ( - SELECT SUM(debit.amount)::NUMERIC(8,2) - FROM acq.lineitem_detail lid - JOIN acq.fund_debit debit ON (lid.fund_debit = debit.id) - WHERE NOT debit.encumbrance AND lineitem = li.id - ) AS paid_amount - - FROM acq.lineitem AS li - - - - - - - - - - - - - - - - - - - - - - SELECT t.* - FROM action.transit_copy t - JOIN actor.org_unit AS s ON (t.source = s.id) - JOIN actor.org_unit AS d ON (t.dest = d.id) - WHERE s.parent_ou <> d.parent_ou - - - - - - - - - - - - - - - - - - - - - - - - - - - - SELECT copy, SUM(count) AS count, year, is_renewal FROM ( - SELECT - cp.id as copy, - COUNT(circ.id), - EXTRACT(YEAR FROM circ.xact_start) AS year, - (phone_renewal OR desk_renewal OR opac_renewal) as is_renewal - FROM - asset.copy cp - JOIN action.circulation circ ON (cp.id = circ.target_copy) - GROUP BY 1, 3, 4 - UNION - SELECT - cp.id as copy, - COUNT(circ.id), - EXTRACT(YEAR FROM circ.xact_start) AS year, - (phone_renewal OR desk_renewal OR opac_renewal) as is_renewal - FROM - asset.copy cp - JOIN action.aged_circulation circ ON (cp.id = circ.target_copy) - GROUP BY 1, 3, 4 - UNION - SELECT - id as copy, - circ_count, - -1 AS year, - false as is_renewal - FROM - extend_reporter.legacy_circ_count - )x GROUP BY 1, 3, 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Open-ILS/src/Android/libs/org.openils_idl.jar b/Open-ILS/src/Android/libs/org.openils_idl.jar deleted file mode 100644 index f3f0d6b822e40d425556b8057b7ad967fe439b75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20448 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 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 06cebce908..f5a6925d5b 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 @@ -42,7 +42,8 @@ import android.util.Log; public class GlobalConfigs { - public static String IDL_FILE_FROM_ROOT = "/reports/fm_IDL.xml"; + public static String IDL_FILE_FROM_ASSETS = "fm_IDL.xml"; + public static String IDL_FILE_FROM_WEB_ROOT = "/reports/fm_IDL.xml"; public static String httpAddress = ""; @@ -119,7 +120,7 @@ public class GlobalConfigs { } if (!noNetworkAccess) { - loadIDLFile(); + loadIDLFile(context); getOrganisations(); getCopyStatusesAvailable((ConnectivityManager) context @@ -139,16 +140,18 @@ public class GlobalConfigs { return false; } - public void loadIDLFile() { + public void loadIDLFile(Context context) { try { Log.d("debug", "loadIDLFile start"); - InputStream in_IDL = Utils.getNetInputStream(httpAddress - + IDL_FILE_FROM_ROOT); + InputStream in_IDL = context.getAssets().open(IDL_FILE_FROM_ASSETS); IDLParser parser = new IDLParser(in_IDL); + parser.setKeepIDLObjects(false); Log.d("debug", "loadIDLFile parse"); + long start = System.currentTimeMillis(); parser.parse(); - Log.d("debug", "loadIDLFile done"); + long duration_ms = System.currentTimeMillis() - start; + Log.d("debug", "loadIDLFile finished in "+duration_ms+"ms"); } catch (Exception e) { System.err.println("Error in parsing IDL file " + IDL_FILE_FROM_ROOT + " " + e.getMessage()); @@ -209,7 +212,7 @@ public class GlobalConfigs { int start = arrayContent.indexOf("[", index) + 1; int stop = arrayContent.indexOf("]", index); - Log.d(TAG, " start stop length index" + start + " " + stop + Log.d(TAG, "start stop length index " + start + " " + stop + " " + arrayContent.length() + " " + index); if (start == -1 || stop == -1) break; @@ -217,8 +220,7 @@ public class GlobalConfigs { index = stop + 1; String content = arrayContent.substring(start, stop); - - System.out.println("Content " + content); + //System.out.println("Content " + content); StringTokenizer tokenizer = new StringTokenizer(content, ","); @@ -226,7 +228,7 @@ public class GlobalConfigs { // first is ID String element = (String) tokenizer.nextElement(); - System.out.println("Id " + element); + //System.out.println("Id " + element); try { org.id = Integer.parseInt(element); } catch (Exception e) { @@ -235,7 +237,7 @@ public class GlobalConfigs { // level element = (String) tokenizer.nextElement(); - System.out.println("Level " + element); + //System.out.println("Level " + element); try { org.level = Integer.parseInt(element); } catch (Exception e) { @@ -244,7 +246,7 @@ public class GlobalConfigs { // parent element = (String) tokenizer.nextElement(); - System.out.println("parent " + element); + //System.out.println("parent " + element); try { org.parent = Integer.parseInt(element); } catch (Exception e) { @@ -253,12 +255,12 @@ public class GlobalConfigs { // name element = (String) tokenizer.nextToken("\","); - System.out.println("Element " + element); + //System.out.println("Element " + element); org.name = element; // can_have_volume_boo. element = (String) tokenizer.nextElement(); - System.out.println("Element " + element); + //System.out.println("Element " + element); try { org.canHaveVolumesBool = Integer.parseInt(element); } catch (Exception e) { @@ -267,7 +269,7 @@ public class GlobalConfigs { // short name element = (String) tokenizer.nextToken("\","); - System.out.println("Element " + element); + //System.out.println("Element " + element); org.shortName = element; organisations.add(org); @@ -369,7 +371,7 @@ public class GlobalConfigs { try { date = sdf.parse(dateString); - System.out.println(date); + //System.out.println(date); } catch (ParseException e) { e.printStackTrace(); } @@ -385,12 +387,12 @@ public class GlobalConfigs { public String getOrganizationName(int id) { for (int i = 0; i < organisations.size(); i++) { - System.out.println("Id " + organisations.get(i).id + " " + i); + //System.out.println("Id " + organisations.get(i).id + " " + i); if (organisations.get(i).id == id) return organisations.get(i).name; } - System.out.println("out here"); + //System.out.println("out here"); return null; } } diff --git a/Open-ILS/src/Android/src/org/evergreen/android/views/ApplicationPreferences.java b/Open-ILS/src/Android/src/org/evergreen/android/views/ApplicationPreferences.java index 900e8e7b82..4273e31de9 100644 --- a/Open-ILS/src/Android/src/org/evergreen/android/views/ApplicationPreferences.java +++ b/Open-ILS/src/Android/src/org/evergreen/android/views/ApplicationPreferences.java @@ -241,7 +241,7 @@ public class ApplicationPreferences extends PreferenceActivity implements public void run() { System.out.println("FM idl download"); GlobalConfigs sg = GlobalConfigs.getGlobalConfigs(context); - sg.loadIDLFile(); + sg.loadIDLFile(context); sg.getOrganisations(); sg.getCopyStatusesAvailable((ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE)); diff --git a/Open-ILS/src/Android/src/org/open_ils/Event.java b/Open-ILS/src/Android/src/org/open_ils/Event.java new file mode 100644 index 0000000000..69a73a1aec --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/Event.java @@ -0,0 +1,33 @@ +package org.open_ils; + +import java.util.Map; +import java.util.HashMap; + +public class Event extends HashMap { + + public Event() { + } + + public Event(Map map) { + super(map); + } + + public static Event parseEvent(Object map) { + if( map != null && map instanceof Map) { + Map m = (Map) map; + if( m.containsKey("ilsevent") && m.containsKey("textcode")) + return new Event(m); + } + + return null; + } + + public String getTextCode() { + return (String) get("textcode"); + } + + public int getCode() { + return Integer.parseInt((String) get("ilsevent")); + } +} + diff --git a/Open-ILS/src/Android/src/org/open_ils/Sys.java b/Open-ILS/src/Android/src/org/open_ils/Sys.java new file mode 100644 index 0000000000..0d66edca88 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/Sys.java @@ -0,0 +1,70 @@ +package org.open_ils; + +import org.opensrf.*; +import org.opensrf.util.*; +import org.open_ils.*; +import org.open_ils.idl.*; +import org.opensrf.util.*; + +import java.util.Map; +import java.util.HashMap; +import java.io.IOException; + + +public class Sys { + + private static IDLParser idlParser = null; + + /** + * Initializes the connection to the OpenSRF network and parses the IDL file. + * @param attrs A map of configuration attributes. Options include:
+ *
    + *
  • configFile - The OpenSRF core config file
  • + *
  • configContext - The path to the config chunk in the config XML, typically "opensrf"
  • + *
  • logProtocol - Currently supported option is "file".
  • + *
  • logLevel - The log level. Options are 1,2,3, or 4 (error, warn, info, debug)
  • + *
  • syslogFacility - For future use, when syslog is a supported log option
  • + *
  • idlFile - The path to the IDL file. May be relative or absolute. If this option is + * not provided, the system will ask the OpenSRF Settings server for the IDL file path.
  • + *
+ */ + public static void init(Map attrs) throws ConfigException, SessionException, IOException, IDLException { + + String configFile = attrs.get("configFile"); + String configContext = attrs.get("configContext"); + String logProto = attrs.get("logProtocol"); + String logFile = attrs.get("logFile"); + String logLevel = attrs.get("logLevel"); + String syslogFacility = attrs.get("syslogFacility"); + String idlFile = attrs.get("idlFile"); + + + if(idlParser != null) { + /** if we've parsed the IDL file, then all of the global setup has been done. + * We just need to verify this thread is connected to the OpenSRF network. */ + org.opensrf.Sys.bootstrapClient(configFile, configContext); + return; + } + + /** initialize the logging infrastructure */ + if("file".equals(logProto)) + Logger.init(Short.parseShort(logLevel), new FileLogger(logFile)); + + if("syslog".equals(logProto)) + throw new ConfigException("syslog not yet implemented"); + + /** connect to the opensrf network. */ + org.opensrf.Sys.bootstrapClient(configFile, configContext); + + /** Grab the IDL file setting if not explicitly provided */ + if(idlFile == null) { + SettingsClient client = SettingsClient.instance(); + idlFile = client.getString("/IDL"); + } + + /** Parse the IDL if necessary */ + idlParser = new IDLParser(idlFile); + idlParser.parse(); + } +} + diff --git a/Open-ILS/src/Android/src/org/open_ils/idl/IDLException.java b/Open-ILS/src/Android/src/org/open_ils/idl/IDLException.java new file mode 100644 index 0000000000..1b84d2481b --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/idl/IDLException.java @@ -0,0 +1,10 @@ +package org.open_ils.idl; + +public class IDLException extends Exception { + public IDLException(String info) { + super(info); + } + public IDLException(String info, Throwable cause) { + super(info, cause); + } +} diff --git a/Open-ILS/src/Android/src/org/open_ils/idl/IDLField.java b/Open-ILS/src/Android/src/org/open_ils/idl/IDLField.java new file mode 100644 index 0000000000..6955bc5794 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/idl/IDLField.java @@ -0,0 +1,46 @@ +package org.open_ils.idl; + +public class IDLField { + + /** Field name */ + private String name; + + /** Where this field resides in the array when serilized */ + private int arrayPos; + + /** True if this field does not belong in the database */ + private boolean isVirtual; + + public void setName(String name) { + this.name = name; + } + public void setArrayPos(int arrayPos) { + this.arrayPos = arrayPos; + } + public void setIsVirtual(boolean isVirtual) { + this.isVirtual = isVirtual; + } + public String getName() { + return this.name; + } + public int getArrayPos() { + return this.arrayPos; + } + public boolean getIsVirtual() { + return this.isVirtual; + } + + public void toXML(StringBuffer sb) { + sb.append("\t\t\t\n"); + } +} diff --git a/Open-ILS/src/Android/src/org/open_ils/idl/IDLLink.java b/Open-ILS/src/Android/src/org/open_ils/idl/IDLLink.java new file mode 100644 index 0000000000..69a5772c75 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/idl/IDLLink.java @@ -0,0 +1,46 @@ +package org.open_ils.idl; + + +public class IDLLink { + + /**The field on the IDLObject this link extends from */ + private String field; + private String reltype; + private String key; + private String map; + /**The IDL class linked to */ + private String IDLClass; + + + public void setField(String field) { + this.field = field; + } + public void setReltype(String reltype) { + this.reltype = reltype; + } + public void setKey(String key) { + this.key = key; + } + public void setMap(String map) { + this.map = map; + } + public void setIDLClass(String IDLClass) { + this.IDLClass = IDLClass; + } + public String getField() { + return this.field; + } + public String getReltype() { + return this.reltype; + } + public String getKey() { + return this.key; + } + public String getMap() { + return this.map; + } + public String getIDLClass() { + return this.IDLClass; + } +} + diff --git a/Open-ILS/src/Android/src/org/open_ils/idl/IDLObject.java b/Open-ILS/src/Android/src/org/open_ils/idl/IDLObject.java new file mode 100644 index 0000000000..aafde6e031 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/idl/IDLObject.java @@ -0,0 +1,96 @@ +package org.open_ils.idl; +import java.util.HashMap; +import java.util.Iterator; + + +public class IDLObject { + + private String IDLClass; + private String fieldMapper; + private String controller; + private String rptLabel; + private HashMap fields; + private HashMap links; + + /** true if this is a virtual object (does not live in the database) */ + private boolean isVirtual; + + public IDLObject() { + fields = new HashMap(); + links = new HashMap(); + } + + public String getIDLClass() { + return IDLClass; + } + + public void addLink(IDLLink link) { + links.put(link.getField(), link); + } + + public void addField(IDLField field) { + fields.put(field.getName(), field); + } + + public IDLField getField(String name) { + return (IDLField) fields.get(name); + } + + public HashMap getFields() { + return fields; + } + + + /** + * Returns the link object found at the given field on + * this IDLObject. + */ + public IDLLink getLink(String fieldName) { + return (IDLLink) links.get(fieldName); + } + + public String getFieldMapper() { + return fieldMapper; + } + + public String getController() { + return controller; + } + + public String getRptLabel() { + return rptLabel; + } + public boolean isVirtual() { + return isVirtual; + } + + public void setIDLClass(String IDLClass) { + this.IDLClass = IDLClass; + } + + public void setFieldMapper(String fm) { + this.fieldMapper = fm; + } + public void setController(String controller) { + this.controller = controller; + } + public void setRptLabel(String label) { + this.rptLabel = label; + } + public void setIsVirtual(boolean isVirtual) { + this.isVirtual = isVirtual; + } + + + public void toXML(StringBuffer sb) { + + sb.append("\t\t"); + Iterator itr = fields.keySet().iterator(); + IDLField field; + while(itr.hasNext()) { + field = fields.get((String) itr.next()); + field.toXML(sb); + } + sb.append("\t\t"); + } +} diff --git a/Open-ILS/src/Android/src/org/open_ils/idl/IDLParser.java b/Open-ILS/src/Android/src/org/open_ils/idl/IDLParser.java new file mode 100644 index 0000000000..370ffcc68d --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/idl/IDLParser.java @@ -0,0 +1,225 @@ +package org.open_ils.idl; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; + +import org.opensrf.util.OSRFRegistry; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + + +public class IDLParser { + + public static final String OILS_NS_BASE="http://opensrf.org/spec/IDL/base/v1"; + public static final String OILS_NS_OBJ="http://open-ils.org/spec/opensrf/IDL/objects/v1"; + public static final String OILS_NS_OBJ_PREFIX="oils_obj"; + public static final String OILS_NS_PERSIST="http://open-ils.org/spec/opensrf/IDL/persistence/v1"; + public static final String OILS_NS_PERSIST_PREFIX="oils_persist"; + public static final String OILS_NS_REPORTER="http://open-ils.org/spec/opensrf/IDL/reporter/v1"; + public static final String OILS_NS_REPORTER_PREFIX="reporter"; + + /** The source for the IDL XML */ + InputStream inStream; + HashMap IDLObjects; + IDLObject current; + private int fieldIndex; + + /** If true, we retain the full set of IDL objects in memory. This is true by default. */ + private boolean keepIDLObjects; + + private int parsedObjectCount; + + public IDLParser() { + IDLObjects = new HashMap(); + this.keepIDLObjects = true; + parsedObjectCount = 0; + fieldIndex = 0; + } + + public IDLParser(String fileName) throws IOException { + this(new FileInputStream(fileName)); + } + + public IDLParser(InputStream inStream) { + this(); + this.inStream = inStream; + } + + public boolean isKeepIDLObjects() { + return keepIDLObjects; + } + + public void setKeepIDLObjects(boolean keepIDLObjects) { + this.keepIDLObjects = keepIDLObjects; + } + + /** + * Parses the IDL XML + */ + public void parse() throws IOException, IDLException { + + try { + //XMLInputFactory factory = XMLInputFactory.newInstance(); + + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + XmlPullParser xpp = factory.newPullParser(); + + xpp.setInput(this.inStream,null ); + int eventType = xpp.getEventType(); + + /** disable as many unused features as possible to speed up the parsing */ + /* + factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE); + factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); + factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE); + factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE); + factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); + */ + + /** create the stream reader */ + + while(eventType != XmlPullParser.END_DOCUMENT) { + /** cycle through the XML events */ + + // eventType = reader.next(); + + switch(eventType) { + + case XmlPullParser.START_TAG: + handleStartElement(xpp); + break; + + case XmlPullParser.END_TAG: + handleEndElement(xpp); + break; + } + eventType = xpp.next(); + } + + } catch(XmlPullParserException se) { + throw new IDLException("Error parsing IDL XML", se); + } + } + + /** + * Returns the IDLObject with the given IDLClass + */ + public IDLObject getObject(String IDLClass) { + return (IDLObject) IDLObjects.get(IDLClass); + } + + /** + * Returns the full set of IDL objects as a hash from classname to object. + * If keepIDLObjects is false, the map will be empty. + */ + public HashMap getIDLObjects() { + return IDLObjects; + } + + /** + * Returns the number of parsed objects, regardless of the keepIDLObjects setting. + */ + public int getObjectCount() { + return parsedObjectCount; + } + + + public void handleStartElement(XmlPullParser reader) { + + if(!OILS_NS_BASE.equals(reader.getNamespace())) return; + String localpart = reader.getName(); + + if( "class".equals(localpart) ) { + fieldIndex = 0; + current = new IDLObject(); + current.setIDLClass(reader.getAttributeValue(null, "id")); + current.setController(reader.getAttributeValue(null, "controller")); + String persist = reader.getAttributeValue(OILS_NS_PERSIST, "virtual"); + current.setIsVirtual("persist".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual"))); + return; + } + + if( "field".equals(localpart) ) { + IDLField field = new IDLField(); + field.setName(reader.getAttributeValue(null, "name")); + field.setArrayPos(fieldIndex++); + field.setIsVirtual("true".equals(reader.getAttributeValue(OILS_NS_PERSIST, "virtual"))); + current.addField(field); + //Log.d("parser","Field " + localpart + " " + field ); + } + + if( "link".equals(localpart) ) { + IDLLink link = new IDLLink(); + link.setField(reader.getAttributeValue(null, "field")); + link.setReltype(reader.getAttributeValue(null, "reltype")); + link.setKey(reader.getAttributeValue(null, "key")); + link.setMap(reader.getAttributeValue(null, "map")); + link.setIDLClass(reader.getAttributeValue(null, "class")); + current.addLink(link); + } + } + + public void handleEndElement(XmlPullParser reader) throws IDLException { + + if(!OILS_NS_BASE.equals(reader.getNamespace())) return; + String localpart = reader.getName(); + + if("class".equals(localpart)) { + + if(keepIDLObjects) + IDLObjects.put(current.getIDLClass(), current); + + HashMap fields = current.getFields(); + String fieldNames[] = new String[fields.size()]; + + if (current.getIDLClass().equals("payments_combined_detail") || current.getIDLClass().equals("ahr")) { + System.out.println("kcxxx"); + } + for(Iterator itr = fields.keySet().iterator(); itr.hasNext(); ) { + String key = (String) itr.next(); + IDLField field = (IDLField) fields.get(key); + try { + fieldNames[ field.getArrayPos() ] = field.getName(); + } catch(ArrayIndexOutOfBoundsException E) { + String msg = "class="+current.getIDLClass()+";field="+key+ + ";fieldcount="+fields.size()+";currentpos="+field.getArrayPos(); + throw new IDLException(msg, E); + } + } + + OSRFRegistry.registerObject( + current.getIDLClass(), OSRFRegistry.WireProtocol.ARRAY, fieldNames); + + parsedObjectCount++; + + current = null; + } + } + + + public String toXML() { + StringBuffer sb = new StringBuffer(); + Set keys = IDLObjects.keySet(); + Iterator itr = IDLObjects.keySet().iterator(); + String IDLClass; + IDLObject obj; + while(itr.hasNext()) { + IDLClass = (String) itr.next(); + obj = IDLObjects.get(IDLClass); + obj.toXML(sb); + } + return sb.toString(); + } +} + + + + + + diff --git a/Open-ILS/src/Android/src/org/open_ils/test/TestIDL.java b/Open-ILS/src/Android/src/org/open_ils/test/TestIDL.java new file mode 100644 index 0000000000..632c28e82b --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/test/TestIDL.java @@ -0,0 +1,24 @@ +package org.open_ils.test; +import org.open_ils.idl.*; +import org.opensrf.*; +import org.opensrf.util.*; + +public class TestIDL { + public static void main(String args[]) throws Exception { + String idlFile = "fm_IDL.xml"; + IDLParser parser = new IDLParser(idlFile); + parser.parse(); + //System.out.print(parser.toXML()); + + OSRFObject bre = new OSRFObject("bre"); + bre.put("id", new Integer(1)); + bre.put("isnew", new Boolean(false)); + bre.put("isdeleted", new Boolean(true)); + + + System.out.println(bre); + System.out.println(new JSONWriter(bre).write()); + + + } +} diff --git a/Open-ILS/src/Android/src/org/open_ils/test/TestLogin.java b/Open-ILS/src/Android/src/org/open_ils/test/TestLogin.java new file mode 100644 index 0000000000..265fa37e02 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/test/TestLogin.java @@ -0,0 +1,29 @@ +package org.open_ils.test; +import org.open_ils.util.Utils; +import org.open_ils.Event; +import org.opensrf.*; +import java.util.Map; +import java.util.HashMap; + + +public class TestLogin { + public static void main(String args[]) { + try { + + if(args.length < 3) { + System.err.println("usage: java org.open_ils.test.TestLogin "); + return; + } + + Sys.bootstrapClient(args[0], "/config/opensrf"); + Map params = new HashMap(); + params.put("username", args[1]); + params.put("password", args[2]); + Event evt = Utils.login(params); + System.out.println(evt); + } catch(Exception e) { + System.err.println(e); + } + } +} + diff --git a/Open-ILS/src/Android/src/org/open_ils/util/Utils.java b/Open-ILS/src/Android/src/org/open_ils/util/Utils.java new file mode 100644 index 0000000000..c91745c704 --- /dev/null +++ b/Open-ILS/src/Android/src/org/open_ils/util/Utils.java @@ -0,0 +1,76 @@ +package org.open_ils.util; +import org.open_ils.*; +import org.opensrf.*; +import org.opensrf.util.*; +import java.util.Map; +import java.util.HashMap; +import java.security.MessageDigest; + +public class Utils { + + /** + * Logs in. + * @param params Login arguments, which may consist of
+ * username
+ * barcode - if username is provided, barcode will be ignored
+ * password
+ * workstation - name of the workstation where the login is occuring
+ * type - type of login, currently "opac", "staff", and "temp"
+ * org - optional org ID to provide login context when no workstation is used. + * @return An Event object. On success, the event 'payload' will contain + * 'authtoken' and 'authtime' fields, which represent the session key and + * session inactivity timeout, respectively. + */ + public static Event login(Map params) throws MethodException { + + Map initMap = new HashMap(); + String init = (params.get("username") != null) ? + params.get("username").toString() : params.get("barcode").toString(); + System.out.println("login1"); + + Object resp = ClientSession.atomicRequest( + "open-ils.auth", + "open-ils.auth.authenticate.init", new Object [] {initMap}); + + System.out.println("login2"); + /** see if the server responded with some type of unexpected event */ + Event evt = Event.parseEvent(resp); + if(evt != null) return evt; + + params.put("password", md5Hex(resp + md5Hex(params.get("password").toString()))); + + resp = ClientSession.atomicRequest( + "open-ils.auth", + "open-ils.auth.authenticate.complete", new Object[]{params}); + + return Event.parseEvent(resp); + } + + /** + * Generates the hex md5sum of a string. + * @param s The string to md5sum + * @return The 32-character hex md5sum + */ + public static String md5Hex(String s) { + StringBuffer sb = new StringBuffer(); + MessageDigest md; + try { + md = MessageDigest.getInstance("MD5"); + } catch(Exception e) { + return null; + } + + md.update(s.getBytes()); + byte[] digest = md.digest(); + for (int i = 0; i < digest.length; i++) { + int b = digest[i] & 0xff; + String hex = Integer.toHexString(b); + if (hex.length() == 1) sb.append("0"); + sb.append(hex); + } + return sb.toString(); + } +} + + + -- 2.11.0