XOBWD ;ALB/MJK - HWSC :: Private Deployment APIs ; 09/13/10 4:00pm
;;1.0;HwscWebServiceClient;;September 13, 2010;Build 31
;
QUIT
;
GENPORT(XOBY) ; -- generate http port class from WSDL during install
NEW XOBSTAT,XOBWSDL
SET XOBWSDL=$GET(XOBY("WSDL FILE"))
;
IF ##class(%File).Exists(XOBWSDL) DO
. SET XOBSTAT=$$ADDPROXY(.XOBY)
ELSE DO
. SET XOBSTAT="0^File does not exist ["_XOBWSDL_"]"
QUIT XOBSTAT
;
ADDPROXY(XOBY) ; -- create client proxy class
NEW XOBREADR,XOBSTAT,XOBINFO,XOBCLASS,XOBCXT,I,X,XOBLERR,XOBWSDL,XOBPKG,XOBWSN,XOBTYPE,XOBWAV
;
SET XOBWSDL=$GET(XOBY("WSDL FILE"))
SET XOBPKG=$GET(XOBY("CACHE PACKAGE NAME"))
SET XOBWSN=$GET(XOBY("WEB SERVICE NAME"))
SET XOBWAV=$GET(XOBY("AVAILABILITY RESOURCE"))
;
SET XOBINFO=##class(xobw.WsdlHandler).getInfoFromFile(XOBWSDL)
IF XOBINFO="" QUIT "0^Unable to parse WSDL file ["_XOBWSDL_"]"
IF $GET(XOBPKG)="" NEW XOBPKG SET XOBPKG=$LISTGET(XOBINFO,1)
SET XOBCLASS=XOBPKG_"."_$LISTGET(XOBINFO,2)
SET XOBCXT=$LISTGET(XOBINFO,3)
;
SET XOBREADR=##class(%SOAP.WSDL.Reader).%New()
SET XOBREADR.OutputTypeAttribute=1
SET XOBSTAT=XOBREADR.Process(XOBWSDL,XOBPKG)
IF XOBSTAT DO
. DO REGSOAP^XOBWLIB(XOBWSN,XOBCXT,XOBCLASS,XOBWSDL,XOBWAV)
ELSE DO
. DO $system.Status.DecomposeStatus(%objlasterror,.XOBLERR)
. SET X="" FOR I=1:1:XOBLERR SET X=X_XOBLERR(I)
. SET XOBSTAT="0^"_X
;
QUIT XOBSTAT
;
REGISTER(XOBWSN,XOBTYPE,XOBCXT,XOBCLASS,XOBWSDL,XOBCAURL) ; -- register SOAP and REST service
; Input:
; XOBWSN - web service name
; XOBTYPE - type of web service [ 1 - SOAP | 2 - REST ]
; XOBCXT - web service context root
; XOBCLASS - full class name, including package
; XOBWSDL - file path containing WSDL document
; XOBCAURL - 'check availability' url portion to follow context root [optional]
;
NEW XOBCDEF,XOBOK,XOBCHK
SET XOBCHK=$$CHKTYPE(XOBWSN,XOBTYPE) IF '+XOBCHK DO QUIT
. DO BMES^XPDUTL(" o Type mismatch: attempted "_$SELECT(XOBTYPE=1:"SOAP",XOBTYPE=2:"REST",1:"unknown")_" update of "_$SELECT($P(XOBCHK,"^",2)=1:"SOAP",$P(XOBCHK,"^",2)=2:"REST",1:"unknown")_"-type service '"_XOBWSN_"' failed.")
IF XOBTYPE=1 DO QUIT:XOBCDEF=""
. SET XOBCDEF=##class(%Dictionary.ClassDefinition).%OpenId(XOBCLASS)
. ; -- perform check to see if port class creation matches what was expected
. IF XOBCDEF="" DO BMES^XPDUTL(" o Creating the class definition for '"_XOBCLASS_"' failed.")
;
; -- add entry into table
SET XOBOK=$$FILE(XOBWSN,XOBTYPE,XOBCXT,.XOBCLASS,.XOBWSDL,.XOBCAURL)
DO MES^XPDUTL(" o WEB SERVICE '"_XOBWSN_"' addition/update "_$SELECT(XOBOK:"succeeded.",1:"failed."))
DO MES^XPDUTL(" ")
QUIT
;
UNREG(XOBWSN) ; -- unregister and delete web service
NEW DIK,XOBSRVDA,XOBMULDA,XOBDA,XOBSRVNM,DA
SET XOBDA=$ORDER(^XOB(18.02,"B",XOBWSN,0)) IF '+XOBDA DO QUIT
. DO MES^XPDUTL(" o WEB SERVICE '"_XOBWSN_"' not found for deletion.")
; delete from web servers' authorized multiple
SET XOBSRVDA=0,XOBMULDA=0
FOR SET XOBSRVDA=$ORDER(^XOB(18.12,"AB",XOBDA,XOBSRVDA)) Q:'+XOBSRVDA DO
. FOR SET XOBMULDA=$ORDER(^XOB(18.12,"AB",XOBDA,XOBSRVDA,XOBMULDA)) Q:'+XOBMULDA DO
. . SET XOBSRVNM=$P($G(^XOB(18.12,XOBSRVDA,0)),U)
. . KILL DIK,DA SET DA=XOBMULDA,DA(1)=XOBSRVDA,DIK="^XOB(18.12,"_DA(1)_",100,"
. . DO ^DIK
. . DO MES^XPDUTL(" o WEB SERVICE '"_XOBWSN_"' unauthorized from '"_XOBSRVNM_"'.")
; delete web service
KILL DIK,DA SET DA=XOBDA,DIK="^XOB(18.02," DO ^DIK
DO MES^XPDUTL(" o WEB SERVICE '"_XOBWSN_"' unregistered/deleted.")
QUIT
;
CHKTYPE(XOBWSN,XOBTYPE) ; return 1 if no svc, or right type; 0^existing type if mismatch
NEW XOBIEN
SET XOBIEN=+$$FIND1^DIC(18.02,"","BX",XOBWSN,"","","")
IF XOBIEN,XOBTYPE'=$P(^XOB(18.02,XOBIEN,0),"^",2) QUIT 0_"^"_$P(^XOB(18.02,XOBIEN,0),"^",2)
QUIT 1
;
FILE(XOBWSN,XOBTYPE,XOBCXT,XOBCLASS,XOBWSDL,XOBCAURL) ;-- File a new record in file #18.02 or edit existing
; Input:
; XOBWSN - web service name
; XOBTYPE - type of web service [ 1 - SOAP | 2 -REST ]
; XOBCXT - web service context root
; XOBCLASS - full class name, including package
; XOBWSDL - file path containing WSDL document
; XOBCAURL - 'check availability' url portion to follow context root [optional]
;
; Output:
; Function Value - Returns IEN of record on success, 0 on failure
;
NEW XOBFDA,XOBFDAI,XOBERR,XOBIENS,XOBIEN,DIERR
;
SET XOBIEN=+$$FIND1^DIC(18.02,"","BX",XOBWSN,"","","")
;
; -- If record doesn't already exist, create new
IF XOBIEN SET XOBIENS=XOBIEN_","
ELSE SET XOBIENS="+1,"
;
; -- validate values ; quit if not valid
IF '$$VALIDATE() QUIT 0
;
; -- Set up array with field values
SET XOBFDA(18.02,XOBIENS,.01)=$GET(XOBWSN)
SET XOBFDA(18.02,XOBIENS,.02)=$GET(XOBTYPE)
SET XOBFDA(18.02,XOBIENS,.03)=$$NOW^XLFDT
SET XOBFDA(18.02,XOBIENS,100)=$GET(XOBCLASS)
SET XOBFDA(18.02,XOBIENS,200)=$GET(XOBCXT)
SET XOBFDA(18.02,XOBIENS,201)=$GET(XOBCAURL)
;
IF XOBIEN DO
. DO FILE^DIE("","XOBFDA","XOBERR")
. IF $DATA(DIERR) DO
. . DO DISPERR($NAME(XOBERR))
. . SET XOBIEN=0
ELSE DO
. DO UPDATE^DIE("","XOBFDA","XOBFDAI","XOBERR")
. IF $DATA(DIERR) DO
. . DO DISPERR($NAME(XOBERR))
. . SET XOBIEN=0
. ELSE DO
. . SET XOBIEN=$GET(XOBFDAI(1))
;
; -- add copy of WSDL to a SOAP-type entry
IF XOBIEN,$GET(XOBWSDL)]"" DO WSDL(.XOBWSDL,.XOBIEN)
;
QUIT $SELECT($GET(XOBIEN)>0:XOBIEN,1:0)
;
VALIDATE() ; -- validate values of input variables
NEW XOBY,XOBERR,XOBOK
SET XOBOK=1
DO VAL^DIE(18.02,XOBIENS,.01,"",$GET(XOBWSN),.XOBY,"","XOBERR"),CHK
DO VAL^DIE(18.02,XOBIENS,.02,"",$GET(XOBTYPE),.XOBY,"","XOBERR"),CHK
DO VAL^DIE(18.02,XOBIENS,100,"",$GET(XOBCLASS),.XOBY,"","XOBERR"),CHK
DO VAL^DIE(18.02,XOBIENS,200,"",$GET(XOBCXT),.XOBY,"","XOBERR"),CHK
; -- work around for FM DBS bug that does not allow input to start with ?
IF $EXTRACT($GET(XOBCAURL))'="?" DO
. DO VAL^DIE(18.02,XOBIENS,201,"",$GET(XOBCAURL),.XOBY,"","XOBERR"),CHK
QUIT XOBOK
;
CHK ;
IF $GET(XOBY)="^" DO
. SET XOBOK=0
. DO DISPERR("XOBERR")
QUIT
;
DISPERR(XOBINARR) ; -- display error message
NEW XOBOUT,XOBI,XOBX
DO MES^XPDUTL("FM Database Server Error Information:")
DO MSG^DIALOG("AE",.XOBOUT,70,"",XOBINARR)
FOR XOBI=1:1 QUIT:$D(XOBOUT(XOBI))=0 DO MES^XPDUTL($GET(XOBOUT(XOBI)))
QUIT
;
WSDL(XOBWSDL,XOBIEN) ; -- file copy of WSDL
NEW XOBSTRM,XOBROOT,XOBI,XOBERR,DIERR
SET XOBROOT=$NAME(^TMP("XOBW WSDL FILING",$JOB))
SET XOBI=0
SET XOBSTRM=##class(%FileCharacterStream).%New()
SET XOBSTRM.Filename=$GET(XOBWSDL)
FOR QUIT:XOBSTRM.AtEnd DO
. SET XOBI=XOBI+1
. SET @XOBROOT@(XOBI)=XOBSTRM.ReadLine()
DO WP^DIE(18.02,XOBIEN_",",300,"K",XOBROOT,$NAME(XOBERR))
; -- if error occurs, just display
IF $DATA(DIERR) DO DISPERR($NAME(XOBERR))
QUIT
;