Files
MBS/WEBSERVICES/calculator/server/calculatorServer.4gl
T

291 lines
7.1 KiB
Plaintext

#
# FOURJS_START_COPYRIGHT(U,2000)
# Property of Four Js*
# (c) Copyright Four Js 2000, 2021. All Rights Reserved.
# * Trademark of Four Js Development Tools Europe Ltd
# in the United States and elsewhere
#
# Four Js and its suppliers do not warrant or guarantee that these samples
# are accurate and suitable for your purposes. Their inclusion is purely for
# information purposes only.
# FOURJS_END_COPYRIGHT
#
IMPORT com
#
# USER GLOBALS VARIABLES
#
GLOBALS
DEFINE
add_in RECORD
a INTEGER,
b INTEGER
END RECORD,
add_out RECORD
r INTEGER
END RECORD
DEFINE
subtract_in RECORD
a INTEGER,
b INTEGER
END RECORD,
subtract_out RECORD
r INTEGER
END RECORD
DEFINE
multiply_in RECORD
a INTEGER,
b INTEGER
END RECORD,
multiply_out RECORD
r INTEGER
END RECORD
DEFINE
divide_in RECORD
a INTEGER,
b INTEGER
END RECORD,
divide_out RECORD
quotient INTEGER,
remainder INTEGER
END RECORD
DEFINE
divide_by_zero String ATTRIBUTES (XMLName="DividedByZero")
END GLOBALS
DEFINE serverURL STRING
DEFINE screen BOOLEAN
&define display_status(status) \
IF NOT screen THEN \
DISPLAY status \
ELSE \
DISPLAY status TO MSG \
MENU ON idle 1 EXIT MENU ON ACTION close EXIT PROGRAM END MENU \
END IF
#
# MAIN
#
MAIN
DEFINE ret INTEGER
DEFER INTERRUPT
LET screen = false
#
# Check arguments
#
IF num_args() = 2 and arg_val(1) = "-W" THEN
LET serverURL = arg_val(2)
CALL CreateCalculatorService(true)
EXIT PROGRAM
ELSE
IF num_args() = 2 and arg_val(1) = "-S" THEN
LET screen = true
CALL fgl_setenv("FGLAPPSERVER",arg_val(2))
CLOSE WINDOW SCREEN
OPEN WINDOW w WITH FORM "server" ATTRIBUTES(TEXT = "Calculator service", STYLE="naked")
display_status("Calculator service startup")
ELSE
IF num_args() <> 0 THEN
CALL exitHelp()
EXIT PROGRAM
END IF
END IF
END IF
#
# Create Calculator service
#
CALL CreateCalculatorService(false)
#
# Start the server
#
display_status("Starting server...")
#
# Starts the server on the port number specified by the FGLAPPSERVER environment variable
# (EX: FGLAPPSERVER=8090)
#
CALL com.WebServiceEngine.Start()
display_status("The server is listening.")
IF screen THEN
MENU
ON idle 1
LET ret = com.WebServiceEngine.ProcessServices(1)
CASE ret
WHEN 0
DISPLAY "Request processed." TO msg
WHEN -1
DISPLAY "No request..." TO msg
WHEN -2
DISPLAY "Disconnected from application server." TO msg
EXIT PROGRAM # The Application server has closed the connection
WHEN -3
DISPLAY "Client Connection lost." TO msg
WHEN -4
DISPLAY "Server interrupted with Ctrl-C." TO msg
WHEN -9
DISPLAY "Unsupported operation." TO msg
WHEN -10
DISPLAY "Internal server error." TO msg
OTHERWISE
DISPLAY "Unexpected server error " || status || "." TO msg
EXIT MENU
END CASE
ON ACTION close
EXIT program
END MENU
ELSE
WHILE TRUE
LET ret = com.WebServiceEngine.ProcessServices(-1)
CASE ret
WHEN 0
DISPLAY "Request processed."
WHEN -1
DISPLAY "Timeout reached."
WHEN -2
DISPLAY "Disconnected from application server."
EXIT PROGRAM # The Application server has closed the connection
WHEN -3
DISPLAY "Client Connection lost."
WHEN -4
DISPLAY "Server interrupted with Ctrl-C."
WHEN -9
DISPLAY "Unsupported operation."
WHEN -10
DISPLAY "Internal server error."
OTHERWISE
DISPLAY "Unexpected server error " || status || "."
EXIT WHILE
END CASE
IF int_flag<>0 THEN
LET int_flag=0
EXIT WHILE
END IF
END WHILE
DISPLAY "Server stopped"
END IF
END MAIN
#
# Create Calculator RPC/Literal service
#
FUNCTION CreateCalculatorService(generateWSDL)
DEFINE serv com.WebService # WebService
DEFINE op com.WebOperation # Operation of a WebService
DEFINE serviceNS STRING
DEFINE generateWSDL SMALLINT
DEFINE ret INTEGER
LET serviceNS = "http://tempuri.org/"
TRY
#
# Create Calculator Web Service
#
LET serv = com.WebService.CreateWebService("Calculator",serviceNS)
CALL serv.setFeature("Soap1.1",TRUE)
CALL serv.setFeature("Soap1.2",TRUE)
#
# Create a Soap Fault
#
CALL serv.createFault(divide_by_zero,FALSE)
#
# Publish the functions
#
# Add
LET op = com.WebOperation.CreateRPCStyle("add","Add",add_in,add_out)
CALL serv.publishOperation(op,NULL)
# Subtract
LET op = com.WebOperation.CreateRPCStyle("subtract","Subtract",subtract_in,subtract_out)
CALL serv.publishOperation(op,NULL)
# Multiply
LET op = com.WebOperation.CreateRPCStyle("multiply","Multiply",multiply_in,multiply_out)
CALL serv.publishOperation(op,NULL)
# Divide
LET op = com.WebOperation.CreateRPCStyle("divide","Divide",divide_in,divide_out)
CALL op.addFault(divide_by_zero, NULL)
CALL serv.publishOperation(op,NULL)
IF generateWSDL THEN
#
# Generate WSDL
#
LET ret = serv.saveWSDL(serverURL)
IF ret=0 THEN
DISPLAY "WSDL saved"
ELSE
DISPLAY "ERROR: Unable to save WSDL"
END IF
ELSE
#
# Register service
#
CALL com.WebServiceEngine.RegisterService(serv)
display_status("Calculator Service registered")
END IF
CATCH
display_status("Unable to create 'Calculator' Web Service :"||STATUS)
EXIT PROGRAM
END TRY
END FUNCTION
FUNCTION exitHelp()
DISPLAY "Usage: "
DISPLAY " ", arg_val(0)
DISPLAY " Start the server on port defined by FGLAPPSERVER"
DISPLAY " ", arg_val(0), " -W serverurl"
DISPLAY " Generate the WSDL file for the given url"
DISPLAY " ", arg_val(0), " -S port"
DISPLAY " Start service in graphical mode and on given port"
EXIT PROGRAM
END FUNCTION
#
# USER PUBLIC FUNCTIONS
#
FUNCTION add()
LET add_out.r = add_in.a + add_in.b
END FUNCTION
FUNCTION subtract()
LET subtract_out.r = subtract_in.a - subtract_in.b
END FUNCTION
FUNCTION multiply()
LET multiply_out.r = multiply_in.a * multiply_in.b
END FUNCTION
FUNCTION divide()
IF divide_in.b != 0 THEN
LET divide_out.quotient = divide_in.a / divide_in.b
LET divide_out.remainder = divide_in.a MOD divide_in.b
ELSE # Handle divided by zero
LET divide_by_zero = "Cannot divide "||divide_in.a||" by zero"
CALL com.WebServiceEngine.SetFaultDetail(divide_by_zero) # Throw error
END IF
END FUNCTION