Changeset 1330 for ccr/branches/ohum/p/C0CSOAP.m
- Timestamp:
- Jan 3, 2012, 11:45:29 PM (14 years ago)
- File:
-
- 1 edited
-
ccr/branches/ohum/p/C0CSOAP.m (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
ccr/branches/ohum/p/C0CSOAP.m
r1329 r1330 1 C0CSOAP ; CCDCCR/GPL - SOAP WEB SERVICE utilities; 8/25/092 ;;1.0;C0C;;May 19, 2009;Build 38 3 ;Copyright 2008 George Lilly. Licensed under the terms of the GNU4 ;General Public License See attached copy of the License.5 ;6 ;This program is free software; you can redistribute it and/or modify7 ;it under the terms of the GNU General Public License as published by8 ;the Free Software Foundation; either version 2 of the License, or9 ;(at your option) any later version.10 ;11 ;This program is distributed in the hope that it will be useful,12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 ;GNU General Public License for more details.15 ;16 ;You should have received a copy of the GNU General Public License along17 ;with this program; if not, write to the Free Software Foundation, Inc.,18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.19 ;20 W "This is an SOAP utility library",!21 W !22 Q23 ;24 TEST1 25 S url="https://ec2-75-101-247-83.compute-1.amazonaws.com:8181/ccr/CCRService?wsdl"26 D GET1URL^C0CEWD2(url)27 Q28 ;29 INITFARY(ARY) ;initialize the Fileman Field array for SOAP processing30 ; ARY is passed by name31 S @ARY@("XML FILE NUMBER")="178.301"32 S @ARY@("BINDING SUBFILE NUMBER")="178.3014"33 S @ARY@("MIME TYPE")="2.3"34 S @ARY@("PROXY SERVER")="2.4"35 S @ARY@("REPLY TEMPLATE")=".03"36 S @ARY@("TEMPLATE NAME")=".01"37 S @ARY@("TEMPLATE XML")="3"38 S @ARY@("URL")="1"39 S @ARY@("WSDL URL")="2"40 S @ARY@("XML")="2.1"41 S @ARY@("XML HEADER")="2.2"42 S @ARY@("XPATH REDUCTION STRING")="2.5"43 S @ARY@("CCR VARIABLE")="4"44 S @ARY@("FILEMAN FIELD NAME")="1"45 S @ARY@("FILEMAN FIELD NUMBER")="1.2"46 S @ARY@("FILEMAN FILE POINTER")="1.1"47 S @ARY@("INDEXED BY")=".05"48 S @ARY@("SQLI FIELD NAME")="3"49 S @ARY@("VARIABLE NAME")="2"50 Q51 ;52 RESTID(INNAM,INFARY) ;EXTRINSIC TO RESOLVE TEMPLATE PASSED BY NAME53 ; FILE IS IDENTIFIED IN FARY, PASSED BY NAME54 I '$D(INFARY) D ; NO FILE ARRAY PASSED55 . S INFARY="FARY"56 . D INITFARY(INFARY)57 N ZN,ZREF,ZR58 S ZN=@INFARY@("XML FILE NUMBER")59 S ZREF=$$FILEREF^C0CRNF(ZN)60 S ZR=$O(@ZREF@("B",INNAM,""))61 Q ZR62 ;63 TESTSOAP ;64 ; USING ICD9 WEB SERVICE TO TEST SOAP65 S G("CODE")="E*"66 S G("CODELN")=367 D SOAP("GPL","ICD9","G")68 Q69 ;70 SOAP(C0CRTN,C0CTID,C0CVA,C0CVOR,ALTXML,IFARY) ; MAKES A SOAP CALL FOR71 ; TEMPLATE ID C0CTID72 ; RETURNS THE XML RESULT IN C0CRTN, PASSED BY NAME73 ; C0CVA IS PASSED BY NAME AND IS THE VARIABLE ARRAY TO PASS TO BIND74 ; C0CVOR IS THE NAME OF A VARIABLE OVERRIDE ARRAY, WHICH IS APPLIED75 ; BEFORE MAPPING76 ; IF ALTXML IS PASSED, BIND AND MAP WILL BE SKIPPED AND77 ; ALTXML WILL BE USED INSTEAD78 ;79 ; ARTIFACTS SECTION80 ; THE FOLLOWING WILL SET UP DEBUGGING ARTIFACTS FOR A POSSIBLE FUTURE81 ; ONLINE DEBUGGER. IF DEBUG=1, VARIABLES CONTAINING INTERMEDIATE RESULTS82 ; WILL NOT BE NEWED.83 I $G(WSDEBUG)="" N C0CV ; CATALOG OF ARTIFACT VARIABLES AND ARRAYS84 S C0CV(100,"C0CXF","XML TEMPLATE FILE NUMBER")=""85 S C0CV(200,"C0CHEAD","SOAP HEADER VARIABLE NAME")=""86 S C0CV(300,"HEADER","SOAP HEADER")=""87 S C0CV(400,"C0CMIME","MIME TYPE")=""88 S C0CV(500,"C0CURL","WS URL")=""89 S C0CV(550,"C0CPURL","PROXY URL")=""90 S C0CV(600,"C0CXML","XML VARIABLE NAME")=""91 S C0CV(700,"XML","OUTBOUND XML")=""92 S C0CV(800,"C0CRSLT","RAW XML RESULT RETURNED FROM WEB SERVICE")=""93 S C0CV(900,"C0CRHDR","RETURNED HEADER")=""94 S C0CV(1000,"C0CRXML","XML RESULT NORMALIZED")=""95 S C0CV(1100,"C0CR","REPLY TEMPLATE")=""96 S C0CV(1200,"C0CREDUX","REDUX STRING")=""97 S C0CV(1300,"C0CIDX","RESULT XPATH INDEX")=""98 S C0CV(1400,"C0CARY","RESULT XPATH ARRAY")=""99 S C0CV(1500,"C0CNOM","RESULT DOM DOCUMENT NAME")=""100 S C0CV(1600,"C0CID","RESULT DOM ID")=""101 I $G(DEBUG)'="" G NOTNEW ; SKIP NEWING THE VARIABLES IF IN DEBUG102 N ZI,ZJ S ZI=""103 NEW 104 S ZI=$O(C0CV(ZI))105 S ZJ=$O(C0CV(ZI,"")) ; SET UP NEW COMMAND106 ;W ZJ,!107 N @ZJ ; NEW THE VARIABLE108 I $O(C0CV(ZI))'="" G NEW ;LOOP TO GET NEW IN CONTEXT109 NOTNEW 110 ; END ARTIFACTS111 ;112 I '$D(IFARY) D INITFARY("C0CF") ; SET FILE NUMBER AND PARAMATERS113 E D ;114 . K C0CF115 . M C0CF=@IFARY116 S C0CXF=C0CF("XML FILE NUMBER") ; FILE NUMBER FOR THE XML TEMPLATE FILE117 I +C0CTID=0 D ; A STRING WAS PASSED FOR THE TEMPLATE NAME118 . S C0CUTID=$$RESTID(C0CTID,"C0CF") ;RESOLVE TEMPLATE IEN FROM NAME119 E S C0CUTID=C0CTID ; AN IEN WAS PASSED120 N XML,TEMPLATE,HEADER121 N C0CFH S C0CFH=C0CF("XML HEADER")122 S C0CHEAD=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFH,,"HEADER")123 N C0CFM S C0CFM=C0CF("MIME TYPE")124 S C0CMIME=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFM)125 N C0CFP S C0CFP=C0CF("PROXY SERVER")126 S C0CPURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFP)127 N C0CFU S C0CFU=C0CF("URL")128 S C0CURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFU)129 N C0CFX S C0CFX=C0CF("XML")130 S C0CXML=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFX,,"XML")131 N C0CFT S C0CFT=C0CF("TEMPLATE XML")132 S C0CTMPL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFT,,"TEMPLATE")133 I C0CTMPL="TEMPLATE" D ; there is a template to process134 . K XML ; going to replace the xml array135 . N VARS136 . I $D(C0CVOR) M @C0CVA=@C0CVOR ; merge in varible overrides137 . I '$D(ALTXML) D ; if ALTXML is passed in, don't bind138 . . D BIND("VARS",C0CVA,C0CUTID,"C0CF")139 . . D MAP("XML","VARS",TPTR,"C0CF")140 . . K XML(0)141 . E M XML=@ALTXML ; use ALTXML instead142 I $G(C0CPROXY) S C0CURL=C0CPURL143 K C0CRSLT,C0CRHDR144 B145 S ok=$$httpPOST^%zewdGTM(C0CURL,.XML,C0CMIME,.C0CRSLT,.HEADER,"",.gpl5,.C0CRHDR)146 K C0CRXML147 D NORMAL("C0CRXML","C0CRSLT(1)") ;RETURN XML IN AN ARRAY148 N C0CFR S C0CFR=$G(C0CF("REPLY TEMPLATE"))149 S C0CR=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFR,"I") ; REPLY TEMPLATE150 ; reply templates are optional and are specified by populating a151 ; template pointer in field 2.5 of the request template152 ; if specified, the reply template is the source of the REDUX string153 ; used for XPath on the reply, and for UNBIND processing154 ; if no reply template is specified, REDUX is obtained from the request155 ; template and no UNBIND processing is performed. The XPath array is156 ; returned without variable bindings157 I C0CR'="" D ; REPLY TEMPLATE EXISTS158 . I +$G(DEBUG)'=0 W "REPLY TEMPLATE:",C0CR,!159 . S C0CTID=C0CR ;160 N C0CFRDX S C0CFRDX=C0CF("XPATH REDUCTION STRING")161 S C0CREDUX=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFRDX) ;XPATH REDUCTION STRING162 K C0CIDX,C0CARY ; XPATH INDEX AND ARRAY VARS163 S C0CNOM="C0CWS"_$J ; DOCUMENT NAME FOR THE DOM164 S C0CID=$$PARSE^C0CXEWD("C0CRXML",C0CNOM) ;CALL THE PARSER165 S C0CID=$$FIRST^C0CXEWD($$ID^C0CXEWD(C0CNOM)) ;ID OF FIRST NODE166 D XPATH^C0CXEWD(C0CID,"/","C0CIDX","C0CARY","",C0CREDUX) ;XPATH GENERATOR167 ; Next, call UNBIND to map the reply XPath array to variables168 ; This is only done if a Reply Template is provided169 D DEMUXARY(C0CRTN,"C0CARY")170 ; M @C0CRTN=C0CARY171 Q172 ;173 DEMUXARY(OARY,IARY) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO174 ; FORMAT @OARY@(x,xpath) where x is the first multiple175 N ZI,ZJ,ZK,ZL S ZI=""176 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ;177 . D DEMUX^C0CMXP("ZJ",ZI)178 . S ZK=$P(ZJ,"^",3)179 . S ZK=$RE($P($RE(ZK),"/",1))180 . S ZL=$P(ZJ,"^",1)181 . I ZL="" S ZL=1182 . S @OARY@(ZL,ZK)=@IARY@(ZI)183 Q184 ;185 NORMAL(OUTXML,INXML) ;NORMALIZES AN XML STRING PASSED BY NAME IN INXML186 ; INTO AN XML ARRAY RETURNED IN OUTXML, ALSO PASSED BY NAME187 ;188 N ZI,ZN,ZTMP189 S ZN=1190 S @OUTXML@(ZN)=$P(@INXML,"><",ZN)_">"191 S ZN=ZN+1192 F S @OUTXML@(ZN)="<"_$P(@INXML,"><",ZN) Q:$P(@INXML,"><",ZN+1)="" D ;193 . S @OUTXML@(ZN)=@OUTXML@(ZN)_">"194 . S ZN=ZN+1195 Q196 ;197 MAP(RARY,IVARS,TPTR,INFARY) ;RETURNS MAPPED XML IN RARY PASSED BY NAME198 ; IVARS IS AN XPATH ARRAY PASSED BY NAME199 ; TPTR IS A POINT TO THE C0C XML TEMPLATE FILE USED TO RETRIEVE THE TEMPLATE200 ;201 N ZT ;THE TEMPLATE202 K ZT,@RARY203 I '$D(INFARY) D ;204 . S INFARY="FARY"205 . D INITFARY(INFARY)206 N ZF,ZFT207 S ZF=@INFARY@("XML FILE NUMBER")208 S ZFT=@INFARY@("TEMPLATE XML")209 I $$GET1^DIQ(ZF,TPTR_",",ZFT,,"ZT")'="ZT" D Q ; ERROR GETTING TEMPLATE210 . W "ERROR RETRIEVING TEMPLATE",!211 D MAP^C0CXPATH("ZT",IVARS,RARY) ;DO THE MAPPING212 Q213 ;214 TESTBIND ;215 S G1("TESTONE")=1216 S G1("TESTTWO")=2217 D BIND("G","G1","TEST")218 W !219 ZWR G220 Q221 ;222 BIND(RARY,IVARS,INTPTR,INFARY) ;RETURNS AN XPATH ARRAY IN RARY FOR USE WITH MAP223 ; TO BUILD AN INSTANTIATED TEMPLATE224 ; TPTR IS THE IEN OF THE XML TEMPATE IN THE C0C XML TEMPLATE FILE225 ; LOOPS THROUGHT THE BINDING SUBFILE TO PULL OUT XPATHS AND226 ; EITHER ASSIGNS VARIABLES OR DOES A FILEMAN CALL TO GET VALUES227 ; VARIABLES ARE IN IVARS WHICH IS PASSED BY NAME228 I '$D(INFARY) D ;229 . S INFARY="FARY"230 . D INITFARY(INFARY) ;INITIALIZE FILE ARRAY IF NOT PASSED231 I +INTPTR>0 S TPTR=INTPTR232 E S TPTR=$$RESTID(INTPTR,INFARY)233 N C0CFF,C0CBF,C0CXI,C0CFREF,C0CXREF234 S C0CFF=@INFARY@("XML FILE NUMBER") ;fileman file number of XML file235 S C0CFREF=$$FILEREF^C0CRNF(C0CFF) ; closed file reference to the file236 S C0CBF=@INFARY@("BINDING SUBFILE NUMBER") ; BINDING SUBFILE NUMBER237 S C0CXI=$G(@INFARY@("XPATH INDEX")) ; index to the XPath bindings238 I C0CXI="" S C0CXI="XPATH" ; default is the XPATH index239 ; this needs to be a whole file index on the XPath subfile with240 ; the Template IEN perceding the XPath in the index241 N ZI242 S ZI=""243 S C0CXREF=$NA(@C0CFREF@(C0CXI,TPTR)) ; where the xref is244 ;F S ZI=$O(^C0CX(TPTR,5,"B",ZI)) Q:ZI="" D ; FOR EACH XPATH245 F S ZI=$O(@C0CXREF@(ZI)) Q:ZI="" D ; for each XPath in this template246 . ;W !,ZI," ",$O(@C0CXREF@(ZI,TPTR,""))247 . N ZIEN,ZFILE,ZFIELD,ZVAR,ZIDX,ZINDEX ;248 . S ZIEN=$O(@C0CXREF@(ZI,TPTR,"")) ; IEN OF THE BINDING RECORD249 . N ZFF S ZFF=@INFARY@("FILEMAN FILE POINTER")250 . S ZFILE=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFF,"I")251 . N ZFFLD S ZFFLD=@INFARY@("FILEMAN FIELD NUMBER")252 . S ZFIELD=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFFLD,"I")253 . N ZFV S ZFV=@INFARY@("VARIABLE NAME")254 . S ZVAR=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFV,"E")255 . N ZFX S ZFX=("INDEXED BY")256 . S ZIDX=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFX,"I")257 . S ZINDEX=""258 . I ZIDX="DUZ" S ZINDEX=$G(DUZ) ; FILE IS INDEXED BY DUZ259 . I ZIDX="DFN" S ZINDEX=$G(DFN) ; BY DFN260 . E I ZIDX'="" S ZINDEX=$G(@ZIDX) ; index variable261 . ;I ZIDX="ACCT" S ZINDEX=C0CACCT ; BY ACCOUNT RECORD POINT TO C0C WS ACCT262 . ;I ZIDX="LOC" S ZINDEX=C0CLOC ; BY LOCATION263 . I ZVAR'="" D ; VARIABLES TAKE PRESCIDENCE OVER FILEMAN FIELDS264 . . S @RARY@(ZI)=@IVARS@(ZVAR) ;265 . E D ; IF NO VARIABLE, TRY ACCESSING FROM FILEMAN266 . . I (ZFILE="")!(ZFIELD="") Q ;QUIT IF FILE OR FIELD NOT THERE267 . . D CLEAN^DILF268 . . S @RARY@(ZI)=$$GET1^DIQ(ZFILE,ZINDEX_",",ZFIELD) ;GET THE VALUE269 . . I $D(^TMP("DIERR",$J,1)) D B ;270 . . . W "ERROR!",!271 . . . ZWR ^TMP("DIERR",$J,*)272 Q273 ;1 C0CSOAP ; CCDCCR/GPL - SOAP WEB SERVICE utilities; 8/25/09 2 ;;1.0;C0C;;May 19, 2009;Build 1 3 ;Copyright 2008 George Lilly. Licensed under the terms of the GNU 4 ;General Public License See attached copy of the License. 5 ; 6 ;This program is free software; you can redistribute it and/or modify 7 ;it under the terms of the GNU General Public License as published by 8 ;the Free Software Foundation; either version 2 of the License, or 9 ;(at your option) any later version. 10 ; 11 ;This program is distributed in the hope that it will be useful, 12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of 13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 ;GNU General Public License for more details. 15 ; 16 ;You should have received a copy of the GNU General Public License along 17 ;with this program; if not, write to the Free Software Foundation, Inc., 18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 ; 20 W "This is an SOAP utility library",! 21 W ! 22 Q 23 ; 24 TEST1 25 S url="https://ec2-75-101-247-83.compute-1.amazonaws.com:8181/ccr/CCRService?wsdl" 26 D GET1URL^C0CEWD2(url) 27 Q 28 ; 29 INITFARY(ARY) ;initialize the Fileman Field array for SOAP processing 30 ; ARY is passed by name 31 S @ARY@("XML FILE NUMBER")="178.301" 32 S @ARY@("BINDING SUBFILE NUMBER")="178.3014" 33 S @ARY@("MIME TYPE")="2.3" 34 S @ARY@("PROXY SERVER")="2.4" 35 S @ARY@("REPLY TEMPLATE")=".03" 36 S @ARY@("TEMPLATE NAME")=".01" 37 S @ARY@("TEMPLATE XML")="3" 38 S @ARY@("URL")="1" 39 S @ARY@("WSDL URL")="2" 40 S @ARY@("XML")="2.1" 41 S @ARY@("XML HEADER")="2.2" 42 S @ARY@("XPATH REDUCTION STRING")="2.5" 43 S @ARY@("CCR VARIABLE")="4" 44 S @ARY@("FILEMAN FIELD NAME")="1" 45 S @ARY@("FILEMAN FIELD NUMBER")="1.2" 46 S @ARY@("FILEMAN FILE POINTER")="1.1" 47 S @ARY@("INDEXED BY")=".05" 48 S @ARY@("SQLI FIELD NAME")="3" 49 S @ARY@("VARIABLE NAME")="2" 50 Q 51 ; 52 RESTID(INNAM,INFARY) ;EXTRINSIC TO RESOLVE TEMPLATE PASSED BY NAME 53 ; FILE IS IDENTIFIED IN FARY, PASSED BY NAME 54 I '$D(INFARY) D ; NO FILE ARRAY PASSED 55 . S INFARY="FARY" 56 . D INITFARY(INFARY) 57 N ZN,ZREF,ZR 58 S ZN=@INFARY@("XML FILE NUMBER") 59 S ZREF=$$FILEREF^C0CRNF(ZN) 60 S ZR=$O(@ZREF@("B",INNAM,"")) 61 Q ZR 62 ; 63 TESTSOAP ; 64 ; USING ICD9 WEB SERVICE TO TEST SOAP 65 S G("CODE")="E*" 66 S G("CODELN")=3 67 D SOAP("GPL","ICD9","G") 68 Q 69 ; 70 SOAP(C0CRTN,C0CTID,C0CVA,C0CVOR,ALTXML,IFARY) ; MAKES A SOAP CALL FOR 71 ; TEMPLATE ID C0CTID 72 ; RETURNS THE XML RESULT IN C0CRTN, PASSED BY NAME 73 ; C0CVA IS PASSED BY NAME AND IS THE VARIABLE ARRAY TO PASS TO BIND 74 ; C0CVOR IS THE NAME OF A VARIABLE OVERRIDE ARRAY, WHICH IS APPLIED 75 ; BEFORE MAPPING 76 ; IF ALTXML IS PASSED, BIND AND MAP WILL BE SKIPPED AND 77 ; ALTXML WILL BE USED INSTEAD 78 ; 79 ; ARTIFACTS SECTION 80 ; THE FOLLOWING WILL SET UP DEBUGGING ARTIFACTS FOR A POSSIBLE FUTURE 81 ; ONLINE DEBUGGER. IF DEBUG=1, VARIABLES CONTAINING INTERMEDIATE RESULTS 82 ; WILL NOT BE NEWED. 83 I $G(WSDEBUG)="" N C0CV ; CATALOG OF ARTIFACT VARIABLES AND ARRAYS 84 S C0CV(100,"C0CXF","XML TEMPLATE FILE NUMBER")="" 85 S C0CV(200,"C0CHEAD","SOAP HEADER VARIABLE NAME")="" 86 S C0CV(300,"HEADER","SOAP HEADER")="" 87 S C0CV(400,"C0CMIME","MIME TYPE")="" 88 S C0CV(500,"C0CURL","WS URL")="" 89 S C0CV(550,"C0CPURL","PROXY URL")="" 90 S C0CV(600,"C0CXML","XML VARIABLE NAME")="" 91 S C0CV(700,"XML","OUTBOUND XML")="" 92 S C0CV(800,"C0CRSLT","RAW XML RESULT RETURNED FROM WEB SERVICE")="" 93 S C0CV(900,"C0CRHDR","RETURNED HEADER")="" 94 S C0CV(1000,"C0CRXML","XML RESULT NORMALIZED")="" 95 S C0CV(1100,"C0CR","REPLY TEMPLATE")="" 96 S C0CV(1200,"C0CREDUX","REDUX STRING")="" 97 S C0CV(1300,"C0CIDX","RESULT XPATH INDEX")="" 98 S C0CV(1400,"C0CARY","RESULT XPATH ARRAY")="" 99 S C0CV(1500,"C0CNOM","RESULT DOM DOCUMENT NAME")="" 100 S C0CV(1600,"C0CID","RESULT DOM ID")="" 101 I $G(DEBUG)'="" G NOTNEW ; SKIP NEWING THE VARIABLES IF IN DEBUG 102 N ZI,ZJ S ZI="" 103 NEW 104 S ZI=$O(C0CV(ZI)) 105 S ZJ=$O(C0CV(ZI,"")) ; SET UP NEW COMMAND 106 ;W ZJ,! 107 N @ZJ ; NEW THE VARIABLE 108 I $O(C0CV(ZI))'="" G NEW ;LOOP TO GET NEW IN CONTEXT 109 NOTNEW 110 ; END ARTIFACTS 111 ; 112 I '$D(IFARY) D INITFARY("C0CF") ; SET FILE NUMBER AND PARAMATERS 113 E D ; 114 . K C0CF 115 . M C0CF=@IFARY 116 S C0CXF=C0CF("XML FILE NUMBER") ; FILE NUMBER FOR THE XML TEMPLATE FILE 117 I +C0CTID=0 D ; A STRING WAS PASSED FOR THE TEMPLATE NAME 118 . S C0CUTID=$$RESTID(C0CTID,"C0CF") ;RESOLVE TEMPLATE IEN FROM NAME 119 E S C0CUTID=C0CTID ; AN IEN WAS PASSED 120 N XML,TEMPLATE,HEADER 121 N C0CFH S C0CFH=C0CF("XML HEADER") 122 S C0CHEAD=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFH,,"HEADER") 123 N C0CFM S C0CFM=C0CF("MIME TYPE") 124 S C0CMIME=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFM) 125 N C0CFP S C0CFP=C0CF("PROXY SERVER") 126 S C0CPURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFP) 127 N C0CFU S C0CFU=C0CF("URL") 128 S C0CURL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFU) 129 N C0CFX S C0CFX=C0CF("XML") 130 S C0CXML=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFX,,"XML") 131 N C0CFT S C0CFT=C0CF("TEMPLATE XML") 132 S C0CTMPL=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFT,,"TEMPLATE") 133 I C0CTMPL="TEMPLATE" D ; there is a template to process 134 . K XML ; going to replace the xml array 135 . N VARS 136 . I $D(C0CVOR) M @C0CVA=@C0CVOR ; merge in varible overrides 137 . I '$D(ALTXML) D ; if ALTXML is passed in, don't bind 138 . . D BIND("VARS",C0CVA,C0CUTID,"C0CF") 139 . . D MAP("XML","VARS",TPTR,"C0CF") 140 . . K XML(0) 141 . E M XML=@ALTXML ; use ALTXML instead 142 I $G(C0CPROXY) S C0CURL=C0CPURL 143 K C0CRSLT,C0CRHDR 144 B 145 S ok=$$httpPOST^%zewdGTM(C0CURL,.XML,C0CMIME,.C0CRSLT,.HEADER,"",.gpl5,.C0CRHDR) 146 K C0CRXML 147 D NORMAL("C0CRXML","C0CRSLT(1)") ;RETURN XML IN AN ARRAY 148 N C0CFR S C0CFR=$G(C0CF("REPLY TEMPLATE")) 149 S C0CR=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFR,"I") ; REPLY TEMPLATE 150 ; reply templates are optional and are specified by populating a 151 ; template pointer in field 2.5 of the request template 152 ; if specified, the reply template is the source of the REDUX string 153 ; used for XPath on the reply, and for UNBIND processing 154 ; if no reply template is specified, REDUX is obtained from the request 155 ; template and no UNBIND processing is performed. The XPath array is 156 ; returned without variable bindings 157 I C0CR'="" D ; REPLY TEMPLATE EXISTS 158 . I +$G(DEBUG)'=0 W "REPLY TEMPLATE:",C0CR,! 159 . S C0CTID=C0CR ; 160 N C0CFRDX S C0CFRDX=C0CF("XPATH REDUCTION STRING") 161 S C0CREDUX=$$GET1^DIQ(C0CXF,C0CUTID_",",C0CFRDX) ;XPATH REDUCTION STRING 162 K C0CIDX,C0CARY ; XPATH INDEX AND ARRAY VARS 163 S C0CNOM="C0CWS"_$J ; DOCUMENT NAME FOR THE DOM 164 S C0CID=$$PARSE^C0CXEWD("C0CRXML",C0CNOM) ;CALL THE PARSER 165 S C0CID=$$FIRST^C0CXEWD($$ID^C0CXEWD(C0CNOM)) ;ID OF FIRST NODE 166 D XPATH^C0CXEWD(C0CID,"/","C0CIDX","C0CARY","",C0CREDUX) ;XPATH GENERATOR 167 ; Next, call UNBIND to map the reply XPath array to variables 168 ; This is only done if a Reply Template is provided 169 D DEMUXARY(C0CRTN,"C0CARY") 170 ; M @C0CRTN=C0CARY 171 Q 172 ; 173 DEMUXARY(OARY,IARY) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO 174 ; FORMAT @OARY@(x,xpath) where x is the first multiple 175 N ZI,ZJ,ZK,ZL S ZI="" 176 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; 177 . D DEMUX^C0CMXP("ZJ",ZI) 178 . S ZK=$P(ZJ,"^",3) 179 . S ZK=$RE($P($RE(ZK),"/",1)) 180 . S ZL=$P(ZJ,"^",1) 181 . I ZL="" S ZL=1 182 . S @OARY@(ZL,ZK)=@IARY@(ZI) 183 Q 184 ; 185 NORMAL(OUTXML,INXML) ;NORMALIZES AN XML STRING PASSED BY NAME IN INXML 186 ; INTO AN XML ARRAY RETURNED IN OUTXML, ALSO PASSED BY NAME 187 ; 188 N ZI,ZN,ZTMP 189 S ZN=1 190 S @OUTXML@(ZN)=$P(@INXML,"><",ZN)_">" 191 S ZN=ZN+1 192 F S @OUTXML@(ZN)="<"_$P(@INXML,"><",ZN) Q:$P(@INXML,"><",ZN+1)="" D ; 193 . S @OUTXML@(ZN)=@OUTXML@(ZN)_">" 194 . S ZN=ZN+1 195 Q 196 ; 197 MAP(RARY,IVARS,TPTR,INFARY) ;RETURNS MAPPED XML IN RARY PASSED BY NAME 198 ; IVARS IS AN XPATH ARRAY PASSED BY NAME 199 ; TPTR IS A POINT TO THE C0C XML TEMPLATE FILE USED TO RETRIEVE THE TEMPLATE 200 ; 201 N ZT ;THE TEMPLATE 202 K ZT,@RARY 203 I '$D(INFARY) D ; 204 . S INFARY="FARY" 205 . D INITFARY(INFARY) 206 N ZF,ZFT 207 S ZF=@INFARY@("XML FILE NUMBER") 208 S ZFT=@INFARY@("TEMPLATE XML") 209 I $$GET1^DIQ(ZF,TPTR_",",ZFT,,"ZT")'="ZT" D Q ; ERROR GETTING TEMPLATE 210 . W "ERROR RETRIEVING TEMPLATE",! 211 D MAP^C0CXPATH("ZT",IVARS,RARY) ;DO THE MAPPING 212 Q 213 ; 214 TESTBIND ; 215 S G1("TESTONE")=1 216 S G1("TESTTWO")=2 217 D BIND("G","G1","TEST") 218 W ! 219 ZWR G 220 Q 221 ; 222 BIND(RARY,IVARS,INTPTR,INFARY) ;RETURNS AN XPATH ARRAY IN RARY FOR USE WITH MAP 223 ; TO BUILD AN INSTANTIATED TEMPLATE 224 ; TPTR IS THE IEN OF THE XML TEMPATE IN THE C0C XML TEMPLATE FILE 225 ; LOOPS THROUGHT THE BINDING SUBFILE TO PULL OUT XPATHS AND 226 ; EITHER ASSIGNS VARIABLES OR DOES A FILEMAN CALL TO GET VALUES 227 ; VARIABLES ARE IN IVARS WHICH IS PASSED BY NAME 228 I '$D(INFARY) D ; 229 . S INFARY="FARY" 230 . D INITFARY(INFARY) ;INITIALIZE FILE ARRAY IF NOT PASSED 231 I +INTPTR>0 S TPTR=INTPTR 232 E S TPTR=$$RESTID(INTPTR,INFARY) 233 N C0CFF,C0CBF,C0CXI,C0CFREF,C0CXREF 234 S C0CFF=@INFARY@("XML FILE NUMBER") ;fileman file number of XML file 235 S C0CFREF=$$FILEREF^C0CRNF(C0CFF) ; closed file reference to the file 236 S C0CBF=@INFARY@("BINDING SUBFILE NUMBER") ; BINDING SUBFILE NUMBER 237 S C0CXI=$G(@INFARY@("XPATH INDEX")) ; index to the XPath bindings 238 I C0CXI="" S C0CXI="XPATH" ; default is the XPATH index 239 ; this needs to be a whole file index on the XPath subfile with 240 ; the Template IEN perceding the XPath in the index 241 N ZI 242 S ZI="" 243 S C0CXREF=$NA(@C0CFREF@(C0CXI,TPTR)) ; where the xref is 244 ;F S ZI=$O(^C0CX(TPTR,5,"B",ZI)) Q:ZI="" D ; FOR EACH XPATH 245 F S ZI=$O(@C0CXREF@(ZI)) Q:ZI="" D ; for each XPath in this template 246 . ;W !,ZI," ",$O(@C0CXREF@(ZI,TPTR,"")) 247 . N ZIEN,ZFILE,ZFIELD,ZVAR,ZIDX,ZINDEX ; 248 . S ZIEN=$O(@C0CXREF@(ZI,TPTR,"")) ; IEN OF THE BINDING RECORD 249 . N ZFF S ZFF=@INFARY@("FILEMAN FILE POINTER") 250 . S ZFILE=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFF,"I") 251 . N ZFFLD S ZFFLD=@INFARY@("FILEMAN FIELD NUMBER") 252 . S ZFIELD=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFFLD,"I") 253 . N ZFV S ZFV=@INFARY@("VARIABLE NAME") 254 . S ZVAR=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFV,"E") 255 . N ZFX S ZFX=("INDEXED BY") 256 . S ZIDX=$$GET1^DIQ(C0CBF,ZIEN_","_TPTR_",",ZFX,"I") 257 . S ZINDEX="" 258 . I ZIDX="DUZ" S ZINDEX=$G(DUZ) ; FILE IS INDEXED BY DUZ 259 . I ZIDX="DFN" S ZINDEX=$G(DFN) ; BY DFN 260 . E I ZIDX'="" S ZINDEX=$G(@ZIDX) ; index variable 261 . ;I ZIDX="ACCT" S ZINDEX=C0CACCT ; BY ACCOUNT RECORD POINT TO C0C WS ACCT 262 . ;I ZIDX="LOC" S ZINDEX=C0CLOC ; BY LOCATION 263 . I ZVAR'="" D ; VARIABLES TAKE PRESCIDENCE OVER FILEMAN FIELDS 264 . . S @RARY@(ZI)=@IVARS@(ZVAR) ; 265 . E D ; IF NO VARIABLE, TRY ACCESSING FROM FILEMAN 266 . . I (ZFILE="")!(ZFIELD="") Q ;QUIT IF FILE OR FIELD NOT THERE 267 . . D CLEAN^DILF 268 . . S @RARY@(ZI)=$$GET1^DIQ(ZFILE,ZINDEX_",",ZFIELD) ;GET THE VALUE 269 . . I $D(^TMP("DIERR",$J,1)) D B ; 270 . . . W "ERROR!",! 271 . . . ZWR ^TMP("DIERR",$J,*) 272 Q 273 ;
Note:
See TracChangeset
for help on using the changeset viewer.
