File: eaf_n_cst_gateway.sru
Size: 11307
Date: Tue, 22 Jan 2008 23:40:25 +0100
$PBExportHeader$eaf_n_cst_gateway.sru
forward
global type eaf_n_cst_gateway from n_cst_baseservice
end type
end forward

global type eaf_n_cst_gateway from n_cst_baseservice descriptor "PB_ObjectCodeAssistants" = "{BB0DD54A-B36E-11D1-BB47-000086095DDA}"  descriptor "PS_JaguarProject" = "" 
event activate pbm_component_activate
event deactivate pbm_component_deactivate
end type
global eaf_n_cst_gateway eaf_n_cst_gateway

type variables
datasetdata datasetdata

Protected:  
n_cst_argumentservice               inv_argument

end variables

forward prototypes
protected function string addcdata (string content)
protected function s_mimerequest convertrequest (request request)
protected function boolean isbinary (string mimetype)
public function response generate (request request)
protected function string removecdata (string content)
public function s_mimeresponse interfaceservice (s_mimerequest astr_mimerequest)
protected function integer initialize (s_mimerequest astr_mimerequest)
protected function response convertresponse (s_mimeresponse astr_mimeresponse)
end prototypes

event deactivate;//Reset the argument service instance
inv_argument.reset()

sqlca.transactiondisconnect( )


end event

protected function string addcdata (string content);String CDATA_BEGIN = "<![CDATA["
String CDATA_END = "]]>"

return CDATA_BEGIN + content + CDATA_END

end function

protected function s_mimerequest convertrequest (request request);s_mimerequest mimeRequest
Long dataSetIndex, ll_rowcount

mimeRequest.messages = request.arguments

ll_rowcount = UpperBound(request.datasets)

for dataSetIndex = 1 to ll_rowcount
   mimeRequest.datasets[dataSetIndex].name = request.datasets[dataSetIndex].name
   mimeRequest.datasets[dataSetIndex].arguments = request.datasets[dataSetIndex].arguments
   mimeRequest.datasets[dataSetIndex].mimetype = request.datasets[dataSetIndex].mimeType
   mimeRequest.datasets[dataSetIndex].data.binary = Blob(request.datasets[dataSetIndex].binarydata)
next

return mimeRequest
end function

protected function boolean isbinary (string mimetype);String METHOD_NAME = "isBinary( String mimeType )"
Long ll_row

String mimeTypeList[13]= {"application/octet-stream", "text/plain", "text/html", "application/pdf" ,&
                                    "application/vnd.ms-excel", "image/gif", "image/jpeg", "application/rtf" ,&
                                    "application/zip", "application/msword", "application/mspowerpoint", "text/xml", "application/datawindow"}
boolean mimeTypeisbinary[13] = {true, false, false, true, &
                                true, true,  true, false, &
                                true, true,  true, false, true}

for ll_row = 1 to UpperBound(mimeTypeList)
   if mimetype = mimeTypeList[ll_row] then
      return mimeTypeisbinary[ll_row]
   end if
next

return false
end function

public function response generate (request request);constant string METHOD_NAME = "generate (request )"

response lstr_response
s_mimerequest mimeRequestHolder
s_mimeresponse mimeResponseHolder

//Conver request object
mimeRequestHolder = convertRequest(request)

mimeResponseHolder = InterfaceService(mimeRequestHolder)

//Convert response
lstr_response = convertResponse(mimeResponseHolder)

return lstr_response
end function

protected function string removecdata (string content);String CDATA_BEGIN = "<![CDATA["
String CDATA_END = "]]>"
String newContent

newContent = Trim(content)

newContent = Mid(newContent, 10)
newContent = Left(newContent, Len(newContent) - 3)

return newContent
end function

public function s_mimeresponse interfaceservice (s_mimerequest astr_mimerequest);constant string METHOD_NAME = "InterfaceService (s_mimerequest )"

Long ll_ret, ll_row
String ls_runtimeerror, ls_characterset, ls_requesttype, ls_str, ls_InterfaceManagerClasName
s_mimeresponse lstr_ret
n_svc_zlib lnv_z
Blob lb_compressed, lb_expand, lb_source, lb_ret
Boolean lb_enablecompress
n_cst_InterfaceManager lnvo_interfaceManager
n_cst_updatemanager    lnvo_update

try
   
   ll_ret = 1
   
   if initialize(astr_mimerequest) = -1 then ll_ret = -2
   
   if ll_ret = 1 then
      
      //Get compress Parameters
      inv_argument.getArgument( inv_constants.EAF_ENABLE_COMPRESS_ARGUMENT_NAME, ls_str)
      if Lower(ls_str) = "true" or Lower(ls_str) = "y" then
         lb_enablecompress = true
      else
         lb_enablecompress = false
      end if
      
      // Uncompress
      if lb_enablecompress then
         
         lnv_z = create n_svc_zlib
         
         for ll_row = 1 to UpperBound(astr_mimerequest.datasets)
            
            lb_compressed = astr_mimerequest.datasets[ll_row].data.binary
            lnv_z.of_uncompress(lb_expand, lb_compressed)
            astr_mimerequest.datasets[ll_row].data.binary = lb_expand
            
         next
         
         destroy lnv_z
         
      end if
      
      //Get interfacemanager class name
      ls_str = ""
      inv_argument.getArgument( inv_constants.EAF_INTERFACEMANAGER_CLASS_ARGUMENT_NAME, ls_InterfaceManagerClasName)
      if ls_InterfaceManagerClasName = "" then
         ls_InterfaceManagerClasName = "n_cst_InterfaceManager"
      end if
         
      lnvo_interfaceManager = create using ls_InterfaceManagerClasName
      
      //Get requesttype Parameters
      inv_argument.getArgument( inv_constants.REQUESTTYPE_ARGUMENT_NAME, ls_requesttype)
      
      choose case Upper(ls_requesttype)
         case "RETRIEVE"
            ll_ret = lnvo_interfaceManager.retrieve(astr_mimerequest)
         case "UPDATE"
            ll_ret = lnvo_interfaceManager.update(astr_mimerequest)
         case "ITEMCHANGED"
            ll_ret = lnvo_interfaceManager.itemchanged(astr_mimerequest)
         case "MASTERCONFIRM"
            ll_ret = lnvo_interfaceManager.masterconfirm(astr_mimerequest)
         case "COMMIT", "ROLLBACK", "CLOSE", "CLOSEROLLBACK", "EXECUTESERVICE", "EXECUTEFUNCTION"
            ll_ret = lnvo_interfaceManager.executeservice(astr_mimerequest)
         case else
            addError(METHOD_NAME, "Invalid request type: " + ls_requesttype )
            ll_ret = -2
      end choose
      
      lstr_ret.messages = astr_mimerequest.messages
      
   end if

   
catch ( RuntimeError re )
   
   ls_runtimeerror = "Runtime Error:" + inv_constants.CRLF + inv_constants.CRLF
   ls_runtimeerror += "Error Code: " + string(re.number) + inv_constants.CRLF
   ls_runtimeerror += "Object: " + re.objectName + inv_constants.CRLF
   ls_runtimeerror += "Class: " + re.class + inv_constants.CRLF
   ls_runtimeerror += "Function/Event: " + re.routineName + inv_constants.CRLF
   ls_runtimeerror += "Line: " + string(re.line) + inv_constants.CRLF
   ls_runtimeerror += "Message: " + re.getMessage() + inv_constants.CRLF
   
   addError(METHOD_NAME, ls_runtimeerror)
   
   ll_ret = -2
      
finally
   
   if SQLCA.dbms <> "" then
      if ll_ret = 1 then
         commit ;
      elseif ll_ret = -1 then
         rollback ;
      end if
   end if
         
   for ll_row = 1 to UpperBound(astr_mimerequest.datasets)

      lstr_ret.datasets[ll_row].name        = astr_mimerequest.datasets[ll_row].name
      lstr_ret.datasets[ll_row].mimeType    = astr_mimerequest.datasets[ll_row].mimetype
      lstr_ret.datasets[ll_row].messages    = astr_mimerequest.datasets[ll_row].messages
      
      if ll_ret = 1 then
         // Compress
         if lb_enablecompress then
            lnv_z = create n_svc_zlib
            for ll_row = 1 to UpperBound(astr_mimerequest.datasets)
               // for webservice deploy bug
               astr_mimerequest.datasets[ll_row].data.binary = Blob(String(astr_mimerequest.datasets[ll_row].data.binary))
               
               lb_source = astr_mimerequest.datasets[ll_row].data.binary
               lnv_z.of_compress(lb_ret, lb_source)
               astr_mimerequest.datasets[ll_row].data.binary = lb_ret
            next
            destroy lnv_z
         end if
         lstr_ret.datasets[ll_row].data.binary = astr_mimerequest.datasets[ll_row].data.binary
         lstr_ret.datasets[ll_row].data.text   = astr_mimerequest.datasets[ll_row].data.text
      end if
      
   next
   
   if ll_ret = -2 then
      //Get the Character Set
      inv_argument.getArgument( inv_constants.EAF_CHARACTER_SET_ARGUMENT_NAME, ls_characterset )
      
      //Put the InterfaceManager messages into the messages holder on the structure
      inv_messaging.toXML( ls_characterset, lstr_ret.messages )
      
      ll_ret = -1
   end if
   
   lstr_ret.returncode = ll_ret
   
   if IsValid(lnvo_interfaceManager) then
      destroy lnvo_interfaceManager
   end if
   
end try

return lstr_ret
end function

protected function integer initialize (s_mimerequest astr_mimerequest);constant string METHOD_NAME = "initialize "

string                              ls_str, ls_datasource[]
Boolean                             lb_autocommit
n_cst_stringservice                 lnv_string

// Validate arguments
If IsNull(astr_mimerequest) Then
   addError( METHOD_NAME, "Invalid astr_mimerequest object" )
   Return -1   
End If      

//Initialize the ArgumentService with the XML Arguments
inv_argument.reset()
if inv_argument.initialize( astr_mimerequest.messages ) = -1 then
   addError( METHOD_NAME, "Error initializing argument service" )
   return -1
end if

//Get DataSource Parameters
inv_argument.getArgument( inv_constants.EAF_DATASOURCEPARAMETERS_ARGUMENT_NAME, ls_str)
if ls_str <> "" then
   lnv_string = create n_cst_stringservice
   lnv_string.Parsestringtoarray( ls_str, "|", ls_datasource)
   destroy lnv_string
   if UpperBound(ls_datasource) <> 10 then
      addError( METHOD_NAME, "Invalid DataSource Parameters setting format" )
      Return -1   
   end if
   if Upper(ls_datasource[10]) = "TRUE" then
      lb_autocommit = true
   else
      lb_autocommit = false
   end if
   SQLCA.initialize (ls_datasource[1], ls_datasource[2], ls_datasource[3], ls_datasource[4], ls_datasource[5], ls_datasource[6], ls_datasource[7], ls_datasource[8], ls_datasource[9], lb_autocommit)
end if

return 1

end function

protected function response convertresponse (s_mimeresponse astr_mimeresponse);constant string METHOD_NAME = "convertResponse (s_mimeresponse) "

Response lstr_response
Long dataSetIndex

lstr_response.messages   = astr_mimeresponse.messages
lstr_response.returncode = astr_mimeresponse.returncode

for dataSetIndex = 1 to UpperBound(astr_mimeresponse.datasets)

   lstr_response.datasets[dataSetIndex].name = astr_mimeresponse.datasets[dataSetIndex].name
   lstr_response.datasets[dataSetIndex].messages = astr_mimeresponse.datasets[dataSetIndex].messages
   lstr_response.datasets[dataSetIndex].mimeType = astr_mimeresponse.datasets[dataSetIndex].mimetype
   
   //Determine the type of data
   if isBinary(lstr_response.datasets[dataSetIndex].mimeType) then

      lstr_response.datasets[dataSetIndex].binarydata = GetByteArray(astr_mimeresponse.datasets[dataSetIndex].data.binary)
      lstr_response.datasets[dataSetIndex].isBinary = true

   else

      lstr_response.datasets[dataSetIndex].textdata = astr_mimeresponse.datasets[dataSetIndex].data.text
      
   end if

next

return lstr_response
end function

on eaf_n_cst_gateway.create
call super::create
end on

on eaf_n_cst_gateway.destroy
call super::destroy
end on

event destructor;constant string METHOD_NAME = "destructor"

if isValid( inv_argument ) then
   destroy inv_argument
end if

if IsValid(sqlca) then
   sqlca.transactiondisconnect( )
end if
end event

event constructor;call super::constructor;constant string METHOD_NAME = "constructor "

//Create the instance services
inv_argument = create n_cst_argumentservice

//Propagate log settings to services
inv_log.propagateSettings( inv_argument )

end event