This topic describes functions that the java server provides for Jython.

 All of these functions are defined in the Java-class de.planta.server.webservice.WebHqlQueryHandler (name is for historic reasons), used like this:

from de.planta.server.webservice import WebHqlQueryHandler

dbhandler = WebHqlQueryHandler()
dbhandler.setJythonUser('R41')
PY

Pojo Interface

For regular customizing you should use the functions described in the JythonUtilitiesPojoApi  topic, as those wrap the following functions and make them easier to work with.


MethodParameter(s)Return ValueComment
getPojoentity: String, the entity name of the Pojo class that is queried
uuid:  String, the uuid of the queried object
returns a Pojo-Object (subclass of de.planta.server.hibernate.pojo.HibernatePojoClass)Returns the Pojo-object identified by entity name & UUID, or None if not found
createPojoentity: String, the entity name of the Pojo class that is createdreturns a new Pojo-Object (subclass of de.planta.server.hibernate.pojo.HibernatePojoClass)Creates a new Pojo-object of the desired class
savePojopojo:  HibernatePojoClass which is to be modifiedreturns boolean indicating if save-operation was successful
can raise de.planta.server.exception.PlantaEventException  for errors happening inside Events, or general  Exception  for other exceptions in Java/Native code
Updates all properties of the given Pojo that have been changed, and saves it into the database.
deletePojopojo:  HibernatePojoClass which is to be deletedreturns boolean indicating if delete-operation was successful
can raise de.planta.server.exception.PlantaEventException  for errors happening inside Events, or general  Exception  for other exceptions in Java/Native code
Deletes the given Pojo from the database.

Pojo Class

Method

ParametersReturn Value

Comment

pojoOriginalValues


Returns a Java map which contains a string which identifies the DI (entityname) and original values as an object

Identical to DtpRecord.get_changed_dis

  • The functions that refer to a DI have a string parameter which identifies the appropriate DI. This is an entity name from DT412, not the DI number.

hasPropertyBeenUpdated 

String: propertyNamebool: True if DI has changed its value, but not been saved yet, false otherwise

Identical to Dataitem.has_been_updated

pojoOriginalPropertyValue

String: propertyNameOriginal value of the DI (from database, before it was changed), data type differs based on the DIs DB typeIdentical to Dataitem.get_original_value

HQL Interface

For regular customizing you should use the functions described in the  JythonUtilitiesDatabaseApi  topic, as those wrap the following functions and make them easier to work with.


MethodParameter(s)Return ValueComment
hqlQueryhql:  String, a HQL-statementreturns as a list of objects in the form of a list of sublistsIs intended for Select-statements returning data from the database.
hqlModifyhql:  String, a HQL-statementreturns the number of modified records as integerIs intended for Insert/Update/Delete-Statements into the database.


Generic functions

FunctionParameter(s)Return ValueComment
setJythonUseruser: String, User-Name
Remembers this user name for this Jython-session
getJythonUser
String: A User-nameReturns User-name that was remembered by setJythonUser
uiMessageBoxcaption: String, caption of Message Box
message  String, text of Message Box
icon:  String, OLE-id of Message Icon
buttons:  List of Strings which name the buttons in Message Box)
input_no  Int, number of text fields in Message Box
can raise de.planta.server.exception.SessionNotFoundExceptionThis displays a message, identical to  ppms.ui_message_box, with the exception that the parameter blocking does not exist, as message boxes that are displayed by Jython are NEVER blocking.
The first 2 parameters are mandatory, the rest can be omitted.
 This only works if the Jython-session is associated to a client-session. If not, a SessionNotFoundException is raised.
uiMessageBoxIdid:  String, the ID of the dialog messagecan raise de.planta.server.exception.SessionNotFoundExceptionThis displays a message, identical to  ppms.ui_message_id, which is never blocking in this case.
 This only works if the Jython-session is associated to a client-session. If not, a SessionNotFoundException is raised.
getAutoIDdiId:  String, id of a DI with Auto-Ids (e.g. "001400")

String: The next auto-number for this DI (with current license)


can raise ClassNotFoundException, AutoIdOverflowException

Returns the next auto-number for this DI, or None if di_id does not denote a di using auto-numbers
openModulethread:  Long, ID for a currently running session
module:  String, ID of the module to open
dictionary:  Hashmap<String, Object>, a dictionary containing variables for the module

boolean: Indicating if the module could be found and prepared


can raise

de.planta.server.exception.SessionNotFoundException, de.planta.server.exception.ModuleNotFoundException, de.planta.server.exception.ModuleDictionaryException

Prepares the module identified by module-ID to be opened in the Client-session identified by thread-id (if existing).
 Note: This is an asynchronous call, which means the openModule will finish before the module is actually opened. That's why the return value does not indicate whether opening of the module was successful, just whether a module & a thread with requested IDs exist
After the module is opened, the new Python-callback-function on_web_load(Dictionary) is called with the parameters given to openModule.
The parameter-dictionary supports parameters of type Boolean, String, Integer, Float, or lists thereof
 Should be used through the Jython function jython.server.module.open_module

getReturnValueForModulethread:  Long, ID for a currently running session
module:  String, ID of the module to open

Dictionary: The return value of on_web_load of the module which was called in this thread


can raise

de.planta.server.exception.SessionNotFoundException,
de.planta.server.exception.ModuleDictionaryException

The return value is a dictionary of the same type as the dictionary of openModule.
If the module has not been run yet, None is returned
If the module has no method called on_web_load, or on_web_load does not return a value, an empty Dictionary is returned

getServerConfigurationparameterList: String, semicolon separated list of parameter groups or parametersDictionary: Returns the given parameters and their valuesto get the configuration of the server
getServerParameterparameter: String, name of a parameterString: value of the parameterto get a single parameter of the server

Events and Exits Control

With the following functions, you can temporarily disable (& re-enable) any Exit or Data Event in the running server.

This only applies to the current session. In other sessions, these exits & events are still enabled.


Note

This does NOT change the (permanent) enabled-property in the Event Data table. For an event to be executed, this field must be enabled (=1), AND the event must not be disabled by one of the following functions.

This affects all Data Events (excluding Timed Events), with the exception of some hard coded events for license checking, which are always active.

FunctionParameter(s)Return ValueComment
disableAllEvents

Temporarilly disables every Date-Event
enableAllEvents

Re-enables every Data-Event that has been temporarilly disabled by any function
disableEventsForTabletableId: Integer

Temporarilly disables every Data-Event that is assigned to the given table

enableEventsForTabletableId: Integer

Re-enables only those events that have temporarilly disabled for this table

disableEventeventUuid: String, the uuid of the event

Temporarilly disables the event identified by eventUuid

enableEventeventUuid: String, the uuid of the event

Re-enables the event identified by eventUuid

Basically the same functionality, but for old Native-Code-Exits, not for events

FunctionParameter(s)Return ValueComment
disableAllExits

Temporarilly disables every Exit
enableAllExits

Re-enables every Exit that has been temporarilly disabled by any function
disableExitexitId: Integer

Temporarilly disables the exit identified by exitId

enableExitexitId: Integer

Re-enables the exits identified by exitId

Session-Info

Helper functions to get informations about the current Java/Jython-session

FunctionParameter(s)Return ValueComment
getCurrentThreadId
Long: ThreadIdReturns the ThreadID of the current PlantaSession. Intended to use for functions like openModule, getSessionInfo, etc.
getActiveClientSessions
List of Long: ThreadIdsReturns a list with the ThreadIDs of all Client-Sessions that are currently open/active
getSessionUserthreadId: Long, ID of a session
To get the user that started a specific Client Session
getSessionInfo threadId: Long, ID of a session
SessionInfo is a Java-class that holds various information about a session, including:
SessionInfo.getUser()) <- That's identical to WebHqlQueryHandler.getSessionUser
SessionInfo.getTimeStamp() <- Future functionality that's not really implemented yet; currently, always start time
SessionInfo.getSessionUUID() <- A unique UUID for each SessionInfo, used to identify a record in DT 443.
SessionInfo.getStartTime()
SessionInfo.getEndTime() <- Always NULL if the session is still active; is the end-time of a historical session. Can be identified by its UUID.
SessionInfo.getReason()  <- Why a session was terminated: Error or clean shutdown. Can be identified by its UUID

Clientless session

A clientless session is a special session that (like the name suggests) runs without GUI-client or webclient.

It is controlled by Jython-functions and identified /accessed by a unique (random) ID that the server assigns when it is created.


FunctionParameter(s)Return ValueComment

openClientlessSession

user: String, name of the user which starts this session (e.g. P20)

Unique ID of the new clientless session


can raise

de.planta.server.exception.UserNotFoundException

Starts the session.

The session stays open until closeClientlessSession is called.

openModuleByClientlessId

clientlessSessionId: Int. The return value of openClientlessSession, to identify the session in question.
module: String, ID of the module to open
dictionary: Hashmap<String, Object>, a dictionary containing variables for the module

Returns boolean indicating if the module could be found and prepared


can raise

de.planta.server.exception.ClientlessSessionNotFoundException de.planta.server.exception.ModuleNotFoundException
de.planta.server.exception.ModuleDictionaryException

This function is identical to openModule, with the only exception that it is called with clientless Id instead of thread-id.

(see there for description of parameters and functionality).

Therefor, it also executes the special python-event on_web_load.

getReturnValueForModuleByClientlessId

clientlessSessionId: Int. The return value of openClientlessSession, to identify the session in question.
module: String, ID of the module to open

Dictionary: The return value of on_web_load of the module which was called in this thread


can raise

de.planta.server.exception.SessionNotFoundException,
de.planta.server.exception.ModuleDictionaryException

Get the return value of on_web_load of module.
This function is identical to getReturnValueForModule,  with the only exception that it is called with clientless Id instead of thread-id.

(see there for description of parameters and functionality).


closeClientlessSession

clientlessSessionId: Int. The ireturn value of openClientlessSession, to identify the session in question.

void


can raise

de.planta.server.exception.ClientlessSessionNotFoundException

Closes the session

openClientlessSession

user: String, name oft he user which starts this session (e.g. P20),

module: String, ID of the module to open
dictionary: Hashmap<String, Object>, a dictionary containing variables for the module

Unique ID of the new clientless session


can raise

de.planta.server.exception.UserNotFoundException
de.planta.server.exception.ClientlessSessionNotFoundException de.planta.server.exception.ModuleNotFoundException
de.planta.server.exception.ModuleDictionaryException

Opens a new clientless session and executes a module in it.
Basically a convencience function, as calling it is is identical to

new_id = openClientlessSession(user)
openModuleByClientlessId(new_id, module_id, some_dictionary)

getThreadIdOfClientlessSession

int: Clientless Session-Id

Long: ThreadID

can raise

de.planta.server.exception.ClientlessSessionNotFoundException

The input Parameter is the DI of a Clientless session (the value that is returned by openClientlessSession and is used as the first parameter by the functions which handle clientlessSessions).

Returns the threadID (Long-value) of this Clientless Session, which can be used for functions like openModule, getSessionInfo, etc.