/src/org/ishafoundation/archives/transcript/db/DatabaseManagerUsingEXist.as

http://transcriptstudio4isha.googlecode.com/ · ActionScript · 180 lines · 138 code · 14 blank · 28 comment · 22 complexity · 7c295bbd6f3f149a2e7bd52dc900f091 MD5 · raw file

  1. /*
  2. Transcript Studio for Isha Foundation: An XML based application that allows users to define
  3. and store contextual metadata for contiguous sections within a text document.
  4. Copyright 2008 Mark Carter, Swami Kevala
  5. This file is part of Transcript Studio for Isha Foundation.
  6. Transcript Studio for Isha Foundation is free software: you can redistribute it and/or modify it
  7. under the terms of the GNU General Public License as published by the Free Software
  8. Foundation, either version 3 of the License, or (at your option) any later version.
  9. Transcript Studio for Isha Foundation is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License along with
  13. Transcript Studio for Isha Foundation. If not, see http://www.gnu.org/licenses/.
  14. */
  15. package org.ishafoundation.archives.transcript.db
  16. {
  17. import mx.controls.Alert;
  18. import mx.rpc.http.HTTPService;
  19. import name.carter.mark.flex.exist.EXistRESTClient;
  20. import name.carter.mark.flex.exist.EXistXMLRPCClient;
  21. import name.carter.mark.flex.util.Utils;
  22. import name.carter.mark.flex.util.XMLUtils;
  23. import name.carter.mark.flex.util.remote.ClientManager;
  24. import org.ishafoundation.archives.transcript.util.ApplicationUtils;
  25. import org.ishafoundation.archives.transcript.util.PreferencesSharedObject;
  26. public class DatabaseManagerUsingEXist implements DatabaseManager
  27. {
  28. [Bindable]
  29. public var user:User;
  30. private var remoteMgr:ClientManager;
  31. private var loggedIn:Boolean = false;
  32. public function DatabaseManagerUsingEXist(username:String, password:String, successFunc:Function, failureFunc:Function) {
  33. trace("Using eXist URL: " + DatabaseConstants.EXIST_URL);
  34. this.remoteMgr = new ClientManager(DatabaseConstants.EXIST_URL, username, password);
  35. remoteMgr.testConnection(function(response:Object):void {
  36. loggedIn = true;
  37. // write db config to the shared object
  38. PreferencesSharedObject.writeDbURL(DatabaseConstants.EXIST_URL);
  39. PreferencesSharedObject.writeDbUsername(username);
  40. checkClientVersionAllowed(function():void {
  41. getUserGroupNames(function(groupNames:Array):void {
  42. user = new User(username, groupNames);
  43. successFunc();
  44. });
  45. }, failureFunc);
  46. },
  47. function(msg:String):void {
  48. loggedIn = false;
  49. failureFunc("Login failed because: " + msg);
  50. });
  51. }
  52. public function testConnection(successFunction:Function, failureFunction:Function):void {
  53. remoteMgr.testConnection(function(response:Object):void {
  54. loggedIn = true;
  55. successFunction();
  56. },
  57. function(msg:String):void {
  58. loggedIn = false;
  59. failureFunction("Login failed because: " + msg);
  60. });
  61. }
  62. public function retrieveXML(successFunc:Function, failureFunc:Function, tagName:String = null, id:String = null, collectionPath:String = null):void {
  63. var params:Object = {}
  64. if (tagName != null) {
  65. params.tagName = tagName;
  66. }
  67. if (id != null) {
  68. params.id = id;
  69. }
  70. if (collectionPath != null) {
  71. params.collectionPath = collectionPath;
  72. }
  73. executeStoredXQuery("retrieve-xml-doc.xql", params, function(returnVal:Object):void {
  74. var returnXML:XML = XMLUtils.convertToXML(returnVal, true);
  75. if (returnXML == null) {
  76. successFunc(null);
  77. return;
  78. }
  79. var items:XMLList;
  80. if (returnXML.localName() == "result") {
  81. items = returnXML.*;
  82. }
  83. else {
  84. items = new XMLList(returnXML);
  85. }
  86. switch (items.length()) {
  87. case 1:
  88. successFunc(items[0]);
  89. break;
  90. default:
  91. var msg:String = (items.length() == 0) ? "Could not find" : "More than one";
  92. msg += (tagName == null) ? "" : " " + tagName;
  93. msg += " xml doc";
  94. msg += (id == null) ? "" : " with id: " + id;
  95. if (items.length() > 0) {
  96. msg + ": ";
  97. msg += items.attribute('_document-uri').toXMLString();
  98. }
  99. failureFunc(msg);
  100. break;
  101. }
  102. }, failureFunc, HTTPService.RESULT_FORMAT_E4X);
  103. }
  104. /*public function storeXML(xml:XML, successFunc:Function, failureFunc:Function):void {
  105. //new EXistXMLRPCClient(remoteMgr.getXMLRPCClient()).storeXML(xmlPath, xml, successFunction, failureFunction);
  106. var params:Object = {xmlStr:xml.toXMLString()};
  107. executeStoredXQuery("store-xml-doc.xql", params, function(id:String):void {
  108. trace("Successfully stored xml doc: " + id);
  109. successFunc(id);
  110. }, failureFunc);
  111. }*/
  112. public function query(xQuery:String, args:Array, successFunc:Function, failureFunc:Function):void {
  113. if (!this.loggedIn) {
  114. testConnection(function():void {
  115. query(xQuery, args, successFunc, failureFunc);
  116. }, function(msg:String):void {
  117. failureFunc("Tried to execute query but not connected to database");
  118. });
  119. return;
  120. }
  121. new EXistXMLRPCClient(remoteMgr.getXMLRPCClient()).query(xQuery, args, successFunc, failureFunc);
  122. }
  123. public function executeStoredXQuery(xQueryFilename:String, params:Object, successFunc:Function, failureFunc:Function, resultFormat:String = null):void {
  124. if (!this.loggedIn) {
  125. testConnection(function():void {
  126. executeStoredXQuery(xQueryFilename, params, successFunc, failureFunc);
  127. }, function(msg:String):void {
  128. failureFunc("Tried to execute stored query but not connected to database");
  129. });
  130. return;
  131. }
  132. new EXistRESTClient(remoteMgr.getRESTClient()).executeStoredXQuery(DatabaseConstants.XQUERY_COLLECTION_PATH + "/" + xQueryFilename, params, successFunc, failureFunc, resultFormat);
  133. }
  134. private function checkClientVersionAllowed(successFunc:Function, failureFunc:Function):void {
  135. var clientVersion:String = ApplicationUtils.getApplicationVersion();
  136. executeStoredXQuery("check-client-version.xql", {clientVersion:clientVersion}, function(minClientVersion:String):void {
  137. if (minClientVersion == "") {
  138. trace("Client version allowed: " + clientVersion);
  139. successFunc();
  140. }
  141. else {
  142. failureFunc("Client version '" + clientVersion + "' is out of date. Min version required: " + minClientVersion);
  143. }
  144. }, failureFunc);
  145. }
  146. private function getUserGroupNames(successFunc:Function):void {
  147. var thisObj:DatabaseManagerUsingEXist = this;
  148. query("xmldb:get-user-groups(xmldb:get-current-user())", [], function(xml:XML):void {
  149. var arr:Array = []
  150. for each (var groupName:String in xml.*) {
  151. arr.push(groupName);
  152. }
  153. arr = Utils.condenseWhitespaceForArray(arr);
  154. successFunc(arr);
  155. }, function(msg:String):void {
  156. Alert.show(msg, "Failed getting user's group names");
  157. successFunc([]);
  158. });
  159. }
  160. }
  161. }