UserTrack
shared record provided by the Standard Library. Note that the feature is disabled by default: set USER_ACTIVITY_TRACKING in the LSPS_SETTINGS table to true to enable the feature. LSPS-7051 addPersonToRole()
and removePersonFromRole()
have been added to the Standard Library. LSPS-8684 getCount()
call does not correspond with the output of the getData()
call on a component have been improved. LSPS-9025 getCustomErrorMessage()
and setCustomErrorMessage()
methods. Note that the validation decoration, the red exclamation point icon, of the error is displayed even if the Tab is closed. LSPS-9031 isProxy()
function, which checks whether a record is a proxy object, has been added to the Standard Library. LSPS-9153 callHttp()
function that performs a synchronous HTTP call has been added to the Standard Library. LSPS-9280 TypeValue.getType()
, TypeValue.getCompiledType()
methods returned incorrect types. The method implementation has been fixed. LSPS-9344 When adding a custom widget set to your LSPS Application, compilation failed with the error `Unable to find <CustomWidgetSet.xml>' on your classpath' since it was performed in an incorrect build phase. On LSPS 3.3, this issue also increases maximum JVM heap and adds legacy Vaadin resources to the build dependencies.
These changes require modifications to <YOUR_APP>-vaadin-war/pom.xml in previously generated LSPS Applications:
<phase>generate-sources</phase>
from update-widgetset
If you are migrating your application from 3.2 to 3.3, additionally, add the vaadin-compatibility-server and vaadin-compatibility-client dependencies to the pom.xml and set the -Xmx to 1024M in <extraJvmArgs>
.
updatePerson
command that allows you to change your password has been added. LSPS-9316 date()
and formatDate()
that take the locale argument have been added. LSPS-9323 +=
, -=
, *=
, /=
, %=
have been added. LSPS-9243 @Disabled
annotation into a method definition file before the record name to exclude all the methods from validation. LSPS-9182 distinct
in its select, the query failed with a com.whitestein.lsps.lang.exception.ValidationException error. LSPS-9271 with
clause and the query failed with an org.hibernate.hql.internal.ast.ErrorCounter error. LSPS-9274 \n
into the evaluated expression. The key combination now send the expression for evaluation as is as expected. LSPS-9302 toInteger(String string, Integer radix)
that allows the user to parse numbers with different bases has been added. LSPS-9255 null
again. Such a call is no longer performed and the call fails with an exception as expected. LSPS-9239 old()
call, the update could have failed with a NullPointerException on the call. LSPS-9191 super
. LSPS-9234 ConcurrentModificationException
due to a bug in context handling. LSPS-9237 groupBy()
function, which aggregates a collection of items into groups with particular classifiers, has been added. LSPS-9224 <YOUR_APP>-embedded
project so they can be easily shared and version-controlled as part of the application. LSPS-9223 notifyModelInstance()
function that allows you to invoke a model instance has been added to the Standard Library. LSPS-9095 callWebservice()
function that allows you to perform a call to a SOAP webservice has been added. LSPS-9125 getProperty()
has been added: it takes a Record and a String name parameters and returns the property of the Record with the name or null
if such a property does not exist. LSPS-9211 sortByKey()
has been added: it takes a collection of objects to be sorted, the keyExtractor closure that retrieves the keys to use for sorting and returns a list of elements sorted by the keys produced by the given keyExtractor. LSPS-9214 In tables and tree tables, the vertical scrollbar covered the last row rendering it illegible. This occured because the Valo theme turned off the vertical scroll bar and the bar was added by the browser. The table now explicitly adds a vertical scrollbar so you can scroll until under the last row.
To update the Valo theme of your custom Process Application, do the following:
v-has-height
to the html-class presentation hint in your tables and tree tables. LSPS-8862 redraw()
method of charts have been renamed to refresh()
for consistency reasons.l-tree-has-value
CSS class.getCount()
method included table filters in the component count. Now, the method returns returns all loaded rows as defined by its size and displayed pages excluding filters. LSPS-9092 makeCopy()
method of model instances and the synchronize(ModelInstance original, ModelInstance toBeSynchronized)
of EvaluationLevelUtils. The calls now return objects with correct context. LSPS-9174 logout.jsp
in the <app>-vaadin-war
project of your application. LSPS-9116 checkActivePersonWithLoginExists()
method has been added to PersonService
: The method can be executed by any user and allows to check whether the person for the user exists in LSPS. This call is intended for SSO integration when the user only exists in the SSO server. LSPS-9175 LSPS required that all users have the security role user
so the login module assigned the role to each authenticated user. Consequently, in SSO environments, the SSO server was obliged to assign this role to users as well, which hampered the SSO integration. To simplify the integration, the role is no longer required.
To apply the change on an existing server, modify your web.xml
as follows:
<LSPS_APP>\lsps-app-ear\src\main\application\META-INF\ibm-application-bnd.xml
so that *
resolves to any role: role-name
value to *
in the <LSPS_APP>\lsps-app-ear\src\main\application\META-INF\weblogic-application.xml
file: The refresh()
call did not behave consistently on all components. Now on refresh, all child components are refreshed. As part of the refresh process, their binding is reloaded, the data source reset, and component validation triggered.
Note that FormComponent now realizes the Refreshable interface with the abstract refresh()
method: This change might require that you add the implementation of the refresh method to your custom form components that extend the FormComponent or its children in your LSPS Application. LSPS-9058
executionContext field
and the listener was executed in the top level context. LSPS-9136 Authentication failed for processAgent
. This occurred because the password for the user processAgent in the system database did not match the password in the configuration of the Websphere. The database initialization now updates the password to match the Websphere password as expected. LSPS-9114 getAllSubGoals(Goal goal)
and getSubGoals(Goal goal)
functions and their extension methods that return the immediate and all sub-goals of a goal have been added. LSPS-9103 executionContext field
and the listener was executed in the top level context. LSPS-9136 closeIdleSessions
init parameter to the lspsVaadinApp servlet in the application web.xml
: The styles of Grid and Table filters have been improved as follows:
popupRows
property.In addition, the setColumnResizeListener()
method of Tables and Grids now takes a closure input argument so you can set such listeners dynamically. LSPS-9068
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.whitestein.lsps.modulemanager.entity.ProcessRelationship.source
. The removal is now performed correctly and the upload fails gracefully. LSPS-8984 thisModelInstanceProperties() : Map<String, String>
and thisModelInstanceProperty(String propertyName) : String
has been improved. LSPS-9064 def List<String> strings := []; strings.add("new item"); // creates a new list with the added item which is not used
LSPS-8986 setNoDataMessage(<String>)
method. LSPS-8730 setSplitPositionChangedListener()
method. LSPS-8918 scrollToTop()
and scrollToBottom()
methods. LSPS-9015 When navigating away from a document, the action could fail with an exception due to possible race conditions of navigation and transaction commit. Now the transaction is committed, then the navigation expression, and then navigation takes place.
The fix requires changes of the Custom Process Application:
AppFormConnector.java
class, make sure the following is removed: ui.getAppConnector().getTransactionAccessor().closeTransaction();
LspsUI.java
class as follows:LspsUIBase
.connector
field of type LspsAppConnectorImpl
.connector = new LspsAppConnectorImpl(this);
with setAppConnector(new LspsAppConnectorImpl(this));
.getAppConnector()
and navigateTo()
methods. LSPS-9005 A connector should not be marked as dirty while a response is being written.
due to premature handling of notify()
calls from data sources of the combo-box components. LSPS-9007 Multiple improvements related to exception handling have been implemented:
Make sure to adapt your Custom Process Application accordingly: add the following override to the LspsUI class of your Application User Interface: ~~~~~ @Override public void error(Throwable error) { hub.handleError(error); } ~~~~~ LSPS-9010
def List<String> strings := []; strings.add("new item"); // creates a new list with the added item which is not used
LSPS-8986 cast()
function calls to the as
statements. LSPS-9014 core::error(String code, String message)
has been added so you can now define an error message for the errors. LSPS-9001 getFirst()
and getLast()
functions by defining a condition as their input argument. LSPS-9039 select()
function by defining the type argument, for example, select([1.1 , 2, 3, 3.1, null], Integer)
. Note that null
items are excluded from the returned List. LSPS-9040 getDuplicates(Collection<E>)
that returns a set of elements which occur more than once in a given collection. LSPS-9056 When navigating away from a document, the action could fail with an exception due to possible race conditions of navigation and transaction commit. Now the transaction is committed, then the navigation expression, and then navigation takes place.
The fix requires changes of the Custom Process Application:
AppFormConnector.java
class, make sure the following is removed: ui.getAppConnector().getTransactionAccessor().closeTransaction();
LspsUI.java
class as follows:LspsUIBase
.connector
field of type LspsAppConnectorImpl
.connector = new LspsAppConnectorImpl(this);
with setAppConnector(new LspsAppConnectorImpl(this));
.getAppConnector()
and navigateTo()
methods. LSPS-9005 in
is used to check if an object of type T is present in a collection of objects of type E, validation checks if the T is related to E. If it is not, an error is reported. LSPS-8937 instanceof
operator that checks if the object is of a type has been added to the Expression Language. LSPS-8981 core::isInstance("string", type(Boolean));
results in the error "Incompatible type String and Boolean". LSPS-8982 type
keyword. LSPS-8980 The getAllErrorMessages()
and getAllErrorMessagesRecursive()
methods for form components have been added: The methods return all error messages including the ones that are not displayed.
QueryDataSource
that acquires the data based on a query call has been implemented. LSPS-8939 Tab::getIndex()
method that returns index of the Tab in the TabSheetTabSheet::setSelectedTab(Integer tabIndex)
that selects the tab with the index LSPS-8949 getContextClickHanlder()
method has been renamed to getContextClickHandler()
. LSPS-8951 closeTransaction()
call to the navigate()
method of your AppFormConnector class (generate the LSPS Custom Application to see an example). LSPS-8988 If an implementation Java class of a task was not available on the server, the system failed to detect the problem. The system now logs the full stack trace in such cases so it is easier to identify the problem.
In addition, you can now upload models created in LSPS 3.0 and older and check whether a task implementations is missing. This was previously not possible because the HumanInteractionTask
was removed in LSPS 3.1. On execution, the task throws an exception. LSPS-8929
new TodoListCriteria(person -> getCurrentPerson(), null, null)
failed. LSPS-8941 countAll(<RECORD_TYPE>)
function that returns the number of shared records has been added. If you use findAll(<RECORD_TYPE>).size()
calls on shared records, consider substituting them with the countAll() calls. LSPS-8928 toEnumeration(<String>)
function that converts the String argument with the fully qualified name of an Enumeration to the respective Enumeration has been added. LSPS-8933 toType(<String>)
that parses the String and returns the Type defined by the String has been added; for example, the call toType("List<String>")
will return the type List<String>. LSPS-8938 createModelInstance()
function now takes a shared Record parameter: the model instance is created with the createModelInstance(Boolean synchronous, Model model, Record sharedRecord, Map<String,String> properties)
call. The shared Record parameter can be then accessed via getProcessEntity(<Record>)
function. LSPS-8959 thisModelInstanceProperties()
and thisModelInstanceProperty(String)
that enable the user to work with model-instance properties more efficiently have been added. LSPS-8960 Forms.submit()
call is now handled gracefully in Form Preview. LSPS-8935 The following functions have been added:
date (Integer)
that returns the date for the given milliseconds since Unix EpochgetEpochMillis(Date)
that returns milliseconds since Unix EpochgetLabel()
function. LSPS-8784 setRowStyleGenerator()
method. LSPS-8733 null
value is illegal and results in an exception. LSPS-8653 getLabel()
function. LSPS-8784 null
, they are disabled. LSPS-8707 setMinimizeWindowTooltip()
and setMaximizeWindowTooltip()
. LSPS-8597 setHint()
and getHint()
methods so you can now work with the text displayed if no option is selected. LSPS-8762 Error: Unable to locate current JTA transaction
. LSPS-8681 html-class="tokentextfield"
presentation hint on the ui::TokenField and calling addStyleName("tokentextfield")
on the forms::TokenField. LSPS-8705 log()
), other than H2 databases reported an error about that the model instance ID cannot be null. LSPS-8764 Error: Unable to locate current JTA transaction
. LSPS-8681 html-class="tokentextfield"
presentation hint on the ui::TokenField and calling addStyleName("tokentextfield")
on the forms::TokenField. LSPS-8705 setExcludeSelectedTokens(Boolean excludeSelectedTokens)
method and check the current setting with the isExcludeSelectedTokens()
method. LSPS-8709 setRows(Integer rows*)
method. To get the current value of the visible lines, use the getRows()
method. LSPS-8714 setSelectionMode(SelectionMode)
method. LSPS-8700 Parameter component: invalid value : no component instance for this Vaadin component
. LSPS-8702 getColumnStates
and restoreColumnStates
functions have been added to the ui module of the Standard Library. The functions work with a new record TableColumnState which holds the state of the table column. The record contains also the columnId
attribute which represents the column identifier as obtained from the UITableColumn.getColumnId()
method. LSPS-8676 no-data-message
presentation hint. LSPS-7504 showConstraintViolations(List<ConstraintViolation> constraintViolations*, FormComponent component)
clearErrorMessages(FormComponent component)
LSPS-8672 databaseUrl:jdbc:sqlserver://localhost/lsps;instance=whitestein
is now correctly handled as an instance name. LSPS-8663 containsAny(Collection<Object>, Collection<Object>)
function has been implemented: it returns true, if the collection contains any of the specified elements. LSPS-8664 size
hint, which determines the size of the menu with options. LSPS-8632 =
now result in a warning since the operator is deprecated and will be removed to prevent its erroneous usage as assignment operator. LSPS-8609 def MyParent p1 := new MyParent();
def MyChild c1 := new MyChild(id -> 1, parent -> p1);
LSPS-8603 false
, it is no longer refreshed. LSPS-8547 <session-bean>
<stateless>
<bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
</stateless>
LSPS-8532 begin
and end
directives. LSPS-7831 break
and continue
directive have been added to the Expression Language to allow better control in the while
, for
and foreach
loops. LSPS-7862 for
loop has been added to the Expression Language. LSPS-8099 ==
(equals), !
(not), &&
(and), ||
(or) LSPS-8214 3..1
is equivalent to [3, 2, 1]
. LSPS-8227 void
type, which in these cases replaces the Null return type and allows better validation at compile time. Note that it is to be used as return type for functions, methods and closures with no return value. LSPS-8268 PropertyPath
has been added as the built-in data type of the Expression Language. LSPS-8302 argument -> value
, PDS did not detect if the same argument was defined multiple times. LSPS-7796 message -> "Task executed.", level -> 200
. LSPS-7752 SEVERE QuartzScheduler Error while notifying SchedulerListener of scheduled job.
LSPS-8012 ERROR [org.infinispan.interceptors.InvocationContextInterceptor] (http-/0.0.0.0:8080-1) ISPN000136: Execution error: java.util.ConcurrentModificationException
caused by a race condition. The race condition has been fixed. LSPS-7844 dataEjbTransactionUtil.handleSystemException: Unable to lookup JNDI name [jdbc/DATASOURCE_NAME]
LSPS-8013 embeddedJasperReportUrl()
, jasperReportExport()
, and jasperReportUrl()
, can now pass their parameter values as adequate Expression Language data types (previously these were always defined as Strings). LSPS-8205 getIndexType()
, getItemType()
, and getReferencedType()
. LSPS-8390 height-by-row
presentation hint. LSPS-8496 new core::Duration(days -> 1)
, which was previously invalid, is now valid). LSPS-8516 notify()
function takes the forms::Alignment enumeration instead of the forms::Position enumeration and the latter has been removed since it was redundant. LSPS-8504