BBjEnterpriseNamespace

Description

In BBj 13.00 and higher, BBjEnterpriseNamespace is used to share information between separate BBjServices processes. It provides a way for BBj programs on the same network to both share data and be notified when shared data is modified by another program.

Usage

A BBjEnterpriseNamespace reference may be obtained by any BBj program through a call to the following method:

BBjAPI::getBBjEnterpriseNamespace(string host, int port, string name, string user, string password)

The BBjEnterpriseNamespace will be created the first time a reference is requested and will exist until the host BBjServices terminates or it is explicitly removed.

The methods of a BBjEnterpriseNamespace are the same as a regular BBjNamespace, with the exception that only BBjStrings and BBjNumbers can be set as values.

The name of any BBjEnterpriseNamespace may be obtained by calling the method:

BBjEnterpriseNamespace::getName()


The NamedVariables within a BBjEnterpriseNamespace may be set and retrieved by calling the methods:

BBjEnterpriseNamespace::getValue(string varName)

BBjEnterpriseNamespace::getValue(string varName, long timeoutMillis)

BBjEnterpriseNamespace::setValue(string varName, Object value)

BBjEnterpriseNamespace::setValue(string varName, Object value, long timeoutMillis)

BBjEnterpriseNamespace::setValue(string varName, BBjNumber value)

BBjEnterpriseNamespace::setValue(string varName, BBjNumber value, long timeoutMillis)


The value of a NamedVariable within a BBjEnterpriseNamespace may be locked/unlocked through calls to setLock and removeLock.

A BBj program may register or unregister to be notified when the value of a NamedVariable within a BBjEnterpriseNamespace has changed through calls to the methods setCallbackForVariable, setCallbackForVariableChange, setCallbackForNamespace, setCallbackForNamespaceChange, removeCallbackForVariable, removeCallbackForVariableChange, removeCallbackForNamespace, and removeCallbackForNamespaceChange.

Creation

BBjAPI > BBjEnterpriseNamespace

The BBjEnterpriseNamespace object is created through the following BBjAPI object methods:

Return Value

Method

BBjEnterpriseNamespace

getBBjEnterpriseNamespace(string host, int port, string name, string user, string password)

Methods of BBjEnterpriseNamespace

Return Value

Method

void

clear()

java.util.HashMap

cloneMap()

void

enableCallbacks(int enable)

BBjVector

getKeys()

string

getName()

BBjObject

getValue(string name)

getValue(string name, long timeoutMillis)

void

removeCallbackForNamespace()

void

removeCallbackForNamespaceChange()

void

removeCallbackForVariable(string varName)

void

removeCallbackForVariableChange(string varName)

void

removeLock()

removeLock(string varName)

void

setCallbackForNamespace(string callback)

setCallbackForNamespace(CustomObject custObj, string methodName)

void

setCallbackForNamespaceChange(string callback)

setCallbackForNamespaceChange(CustomObject custObj, string methodName)

void

setCallbackForVariable(string varName, string callback)

setCallbackForVariable(string varName, CustomObject custObj, string methodName)

void

setCallbackForVariableChange(string varName, string callback)

setCallbackForVariableChange(string varName, CustomObject custObj, string methodName)

void

setLock(string name, long timeoutMillis)

void

setValue(string name, object value)

setValue(string name, object value, long timeoutMillis)

void

removeValue(string name)

removeValue(string name, long timeoutMillis)

Example

rem ' BBjEnterpriseNamespace Example

rem 'namespace.bbj
rem 'This is exactly the same as the normal namespace example except using a BBjEnterpriseNamespace for a shared namespace.

sysgui=unt
open (sysgui)"X0"
api! = BBjAPI()
sysgui!=api!.getSysGui()

rem 'host and login information for the BBjEnterpriseNamespace
host$="server"
port=2552
user$="user"
password$="password"

rem 'retrieve a namespace, get value of count

if api!.isInMDI()
    sharedNS! = api!.getGroupNamespace()
    prefix$ = "basis.eng.test.namespace"
else
    if argc < 2
        rem 'run from command line with no namespace name
        prefix$ = "basis.eng.test.namespace"
        sharedNSName$ = prefix$+".test"
        sharedNS! = api!.getBBjEnterpriseNamespace(host$, port, sharedNSName$, user$, password$)

    else
        rem 'run from command line with a namespace name
        prefix$ = argv(1)
        sharedNSName$ = prefix$+".test"
        sharedNS! = api!.getBBjEnterpriseNamespace(host$, port, sharedNSName$, user$, password$)
    endif
endif

rem 'retrieve count from sharedNS! and use it to create our name
count = sharedNS!.getValue("count", err=setCount)
privateNS! = api!.getNewNamespace(prefix$)
privateNS!.setValue("count",0)
name$ = "client-" + privateNS!.getName()

rem 'retrieve position from sharedNS! and increment it
sharedNS!.setLock("x", 500, err = onLocked)
x = sharedNS!.getValue("x", err = setXY)
sharedNS!.setValue("x", x+50)
sharedNS!.removeLock("x")

sharedNS!.setLock("y", 500, err = onLocked)
y = sharedNS!.getValue("y", err = setXY)
sharedNS!.setValue("y", y+50)
sharedNS!.removeLock("y")

rem 'create window
window! = sysgui!.addWindow(x,y,300,200,name$)

rem 'add some static text fields
window!.addStaticText(101,5,50,290,30,"sharedCount: ")
window!.addStaticText(102,5,70,290,30,"privateCount: ")

rem 'add buttons and callbacks
plus! = window!.addButton(1,5,10,90,30,"Increment")
minus! = window!.addButton(2,105,10,90,30,"Decrement")
break! = window!.addButton(3,5,110,90,30,"Break")

sharedCount! = window!.addStaticText(103,200,50,290,15,str(count))
privateCount! = window!.addStaticText(104,200,70,290,15,str(0))
break!.setCallback(break!.ON_BUTTON_PUSH,"onBreak")

rem 'set callback for controls
plus!.setCallback(plus!.ON_BUTTON_PUSH, "onPlus")
minus!.setCallback(plus!.ON_BUTTON_PUSH, "onMinus")
window!.setCallback(window!.ON_ACTIVATE, "onActivate")

rem 'set callback that is to be called when count changes
sharedNS!.setCallbackForVariable("count", "showCount")
privateNS!.setCallbackForVariable("count", "showCount")

rem 'call onActivate to set tell others we have activated
gosub onActivate

callback(ON_CLOSE,done,sysgui!.getContext())

rem 'if running in MDI, register a callback for MDI closing

if api!.isInMDI()
    mdi! = api!.getMDI()
    mdi!.registerMDIClosingCallback("mdiClosingCallback")
endif

process_events

rem 'our callbacks
onPlus:
    sharedNS!.setLock("count",1500,err = onLocked)
    sharedNS!.setValue("count", 1 + sharedNS!.getValue("count"))
    sharedNS!.removeLock("count")

    privateNS!.setLock("count",1500,err = onLocked)
    privateNS!.setValue("count", 1 + privateNS!.getValue("count"))
    privateNS!.removeLock("count")
return

onMinus:
    sharedNS!.setLock("count",1500,err = onLocked)
    sharedNS!.setValue("count", -1 + sharedNS!.getValue("count"))
    sharedNS!.removeLock("count")

    privateNS!.setLock("count",1500,err = onLocked)
    privateNS!.setValue("count", -1 + privateNS!.getValue("count"))
    privateNS!.removeLock("count")
return

onActivate:
    sharedNS!.setValue("activeClientNS", privateNS!.getName())
    sharedNS!.setValue("activeClientName",name$)
return

showCount:
    sharedcount!.setText(str(sharedNS!.getValue("count")))
    privatecount!.setText(str(privateNS!.getValue("count")))
return

onBreak:
    escape
return

done:
release

setXY:
    x = 100
    y = 100
    sharedNS!.setValue("x", x)
    sharedNS!.setValue("y", y)
retry

setCount:
    count = 0
    sharedNS!.setValue("count", count)
retry

onLocked:
    print "lock error"
    escape
retry
m

rem 'callback to be run when MDI attempts to close
mdiClosingCallback:
    print 'EE', 'ask'("MDI is attempting to close",3,"What do you want to do?","Veto close:1","Accept close:2","release:3")

    print 'BE'

    read(0,siz=1,err=askCancelled)response
    print "answer is " , response
    print 'BE'

    switch response
        case 1
            mdi!.vetoMDIClose()
            break
        case 2
            mdi!.approveMDIClose()
            break
        case 3
            gosub done
            break
    swend
return

askCancelled:
    print "ask was cancelled or else closeAll() timed out"
    mdi!.approveMDIClose(err=*next)
return
Example Type: BBj

See Also

BBjAPI

BBj Object Variables

BBj Object Creation and Assignment

BBj Object Error Handling

BBj Object Operators

Accessing Objects From Different Interpreters

BBjNamespace

BBjNamespaceEvent

See the BBj Object Diagram for an illustration of the relationship between BBj Objects.