ResponseBuilder
Groovy (beta)
code posted
by
raistlin77
created at 13 Jan 21:18
Edit
|
Back
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
package de.intex.xml; import groovy.xml.MarkupBuilder; import it.sauronsoftware.base64.Base64; /** * XML-Builder Class für den XML-Server der EEi. * * <li>TODO: getBLOB/putBLOB bei Massenim/-exports (Protokollbelastung) * */ public class RequestBuilder { private String user private String password private String head = '<?xml version="1.0" encoding="UTF-8" ?>' private String lastRequest = ""; private Integer reqID = 1; /** * Konstruktur für das XMLRequestBuild-Object mit User und Passwort. */ RequestBuilder(String user, String password){ this.user = user; this.password = Base64.encode(password); } /** * Eine eintrag im Easy Logbuch. XML-Build muß übergeben werden. * Ist für interes logging des Builders gedacht * type: INFO || ERROR * logclass: EASY || SYSTEM || DEBUG */ private getLogEntry(xml, type, logclass, message){ xml.LOG( message, REQUESTID:newReqID(), TYPE:type, CLASS:logclass ) } /** * Helper Funktion für das Bilden eines Requestes. * Wird von der Request Funktion aufgerufen und bildet den kompletten Request. * Ruft den übergeben Closure auf und den Request spezifischen Code in das XML * ein zubinden. */ private String buildRequest(closure){ def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.REQUEST( XMLID:"SYSTEM_"+newReqID() ){ loginRequest( xml ) closure( xml ) logutRequest( xml ) } lastRequest = head + "\n" + writer.toString() return lastRequest; } /** * XML-Teilrequest für das einloggen */ private void logutRequest(xml){ //xml.LOGOUT( REQUESTID:newReqID() ) } /** * XML-Teilrequest für das ausloggen */ private void loginRequest(xml){ xml.LOGIN( REQUESTID:newReqID() ){ USERNAME( user ) PASSWORD( password ) } } /** * build note method called from varius methods */ private String buildNote( argprops ){ def props = [ REQUESTID:newReqID() ] props.putAll( argprops ) return buildRequest( ){ it.NOTE( props ) } } /** * Fortlaufende RequestID innerhalb einer Instance */ private newReqID(){ try{ reqID += 1; } catch( ArithmeticException e){ reqID = 1; } return reqID; } /** * bilde Easy-Documentenschreibweise aus Lagerort und Archiv oder EasyArchivReferenz und Mappe+Version */ public String buildEasyDocRef(location, archiv=null, mappe=null, version=null){ if(!mappe || !version){ throw new RuntimeException("Keine Mappe oder Version angegeben ${mappe},${version}") } else { return buildEasyArchivRef(location, archiv) + ',' + mappe + ',' + version; } } /** * bilde Easy-Archivschreibweise aus Lagerort und Archiv */ public String buildEasyArchivRef(location, archive=null){ def locarc if( archive ){ locarc = "\$(#${location})\\${archive}" } else { locarc = location; } return locarc } /** * Request für die Liste aller Lagerorte */ public String getLocations(category="ALL"){ return buildRequest(){ it.LOCATIONS(REQUESTID:newReqID()){ CATEGORY(category) } } } /** * Request für die Archive eines Lagerortes */ public String getArchives(location){ return buildRequest(){ it.ARCHIVES(REQUESTID:newReqID(), LOCATION:location) } } /** * Eine eintrag im Easy Logbuch. XML-Build muß übergeben werden. * type: INFO || ERROR * logclass: EASY || SYSTEM || DEBUG */ public String getLog( type, logclass, message ){ return buildRequest(){ xml -> getLogEntry(xml, type, logclass, message) } } /** * Request für die Beschreibung eines Archives * section kann folgende (auch mehrere) Wert enthalten: * FIELDLIST, HITLISTS, SEARCHMASKS, STATISTICS, RIGHTS, BITMAPS, SELLISTS */ public String getArchiveDescription(section, location, archive=null){ def locarc = buildEasyArchivRef( location, archive ) return buildRequest(){ it.ARCDESCRIPTION( REQUESTID:newReqID(), ARCHIVE:locarc, SECTION:section ) } } /** * Liste die Notizen eine Mappe auf */ public String getNoteList( easydocref ){ return buildNote( MODE:'LIST', EASYDOCREF:easydocref ) } /** * Liest eine Notiz einer Mappe */ public String getNoteRead( easydocref, noteid ){ return buildNote( MODE:'READ', EASYDOCREF:easydocref, NOTEID:noteid ) } /** * Abfrage des Gossars eines Archives */ public String getGlossary(locarc, query, cnt){ return buildRequest(){ it.GLOSSARY( REQUESTID:newReqID(), ARCHIVE:locarc, QUERY:query, COUNT:cnt ) } } /** * Importtiert eine Mappe inklusive BLOBs in das Archiv */ public String getUpdate(archivref, mappe, version, fields, blobs){ int cnt = fields.size() + blobs.size() int id = -1; int blobid=2000; return buildRequest(){ xml-> xml.IMPORT( REQUESTID:newReqID(), ARCHIVE:archivref, MODE:'SYNC', FOLDER:''){ DOCUMENT( ID:'DOCID_1', FIELDCOUNT:cnt, EASYDOCREF:buildEasyDocRef(archivref, null, mappe, version ) ){ fields.each(){ field -> FIELD( CODE:'ANSI', TYPE:'STRING', NAME:field.key, ID:(id+=1), USE:'USER' ){ DATA(){ xml.yieldUnescaped( '<![CDATA[' + field.value + ']]>' ) } } } blobs.each(){ blob -> FIELD( TYPE:'BLOB', NAME:(blobid+=1), ID:(id+=1), USE:'USER'){ blob.each(){ fl -> "${fl.key}"(fl.value) } DATA('no data requested.') } } } } } } /** * Importtiert eine Mappe inklusive BLOBs in das Archiv */ public String getImport(archivref, fields, blobs){ int cnt = fields.size() + blobs.size() int id = -1; return buildRequest(){ xml-> xml.IMPORT( REQUESTID:newReqID(), ARCHIVE:archivref, MODE:'SYNC', FOLDER:''){ DOCUMENT( ID:'DOCID_1', FIELDCOUNT:cnt ){ fields.each(){ field -> FIELD( CODE:'ANSI', TYPE:'STRING', NAME:field.key, ID:(id+=1), USE:'USER' ){ DATA(){ xml.yieldUnescaped( '<![CDATA[' + field.value + ']]>' ) } } } } } } } /** * Holt ganzes Dokument aus dem Archiv mit/ohne BLOBs oder einzelne Felder/BLOBs */ public String getDocument(docref, blobdata, blobid, fieldid, intfields ){ return buildRequest(){ it.DOCUMENT( REQUESTID:newReqID(), EASYDOCREF:docref, BLOBID:blobid, BLOBDATA:blobdata, FIELDID:fieldid, INTFIELDS:intfields, RENDERER:'0', IFRCCODEB64:'1' ) } } /** * Löscht eine mappe anhand Ihrer Easy Referenz */ public String getDelete(easyref){ return buildRequest(){ it.DELETE( REQUESTID:newReqID(), EASYDOCREF:easyref ) } } /** * gibt den letzen Request zurück. Nützlich für die Fehler analyse. * Da so der Fehlerhafte Request genauer betrachtet werden kann. */ public String getLastRequest(){ return lastRequest; } /** * Request für einen oder mehreren Suchbegriffen aus einem oder mehreren Archiven. * * <li>Suche in meheren archiven mit mehereren Feldern * getQueryArchives(["arch1", "arch2"], ['.Mappe'="00001083", '.Version'="001"], "SYSTEM", 20, 0) * * <li>Volltextsuche in einem Archiv * getQueryArchives("arch1", "00001083", "SYSTEM", 20, 0) * */ public String getQuery(archives, queries, hitlist="SYSTEM", maxcount="20", hitpos="0"){ def querystring if( archives.getClass() == String ){ archives = [ archives ]; } switch( queries.getClass() ){ case LinkedHashMap: querystring = queries.collect(){ "(.${it.key}=${it.value})" }.join('&') break default: querystring = queries break } def ret = buildRequest(){ it.QUERY(REQUESTID:newReqID(), HITLIST:hitlist, MAXHITCOUNT:maxcount, HITPOSITION:hitpos, ARCHIVE:archives.pop()){ archives.each(){ arc -> ARCHIVE(arc) } QUERYSTRING(querystring) } } } } |
8.26 KB in 10 ms with coderay