Changeset 1336 for ccr/trunk/p/C0CSOAP.m


Ignore:
Timestamp:
Jan 4, 2012, 9:39:08 PM (12 years ago)
Author:
George Lilly
Message:

removed tabs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ccr/trunk/p/C0CSOAP.m

    r1331 r1336  
    1 C0CSOAP  ; CCDCCR/GPL - SOAP WEB SERVICE utilities; 8/25/09
    2         ;;1.0;C0C;;May 19, 2009;Build 38
    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         ;
     1C0CSOAP  ; CCDCCR/GPL - SOAP WEB SERVICE utilities; 8/25/09
     2 ;;1.0;C0C;;May 19, 2009;Build 38
     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 ;
     24TEST1 
     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 ;
     29INITFARY(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 ;
     52RESTID(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 ;
     63TESTSOAP ;
     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 ;
     70SOAP(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=""
     103NEW 
     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
     109NOTNEW 
     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 ;
     173DEMUXARY(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 ;
     185NORMAL(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 ;
     197MAP(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 ;
     214TESTBIND ;
     215 S G1("TESTONE")=1
     216 S G1("TESTTWO")=2
     217 D BIND("G","G1","TEST")
     218 W !
     219 ZWR G
     220 Q
     221 ;
     222BIND(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.