Title: Release Notes For Version 10.2.4
To run Calpendo version 10.3, you should use:
If you are upgrading from version 9.0.x or earlier, then:
If you are upgrading from version 10.0.x or 10.1.x to 10.2.x, then:
Upgrading from any version to the latest (including applying bug fix updates) should be done with the following procedure:
Stop tomcat
For major upgrades, you must create a backup of your database before proceeding. For minor upgrades, it is recommended to create a backup, but it is less important. After having stopped tomcat, the typical command required is:
mysqldump -u USERNAME -p calpendo > calpendo.sql
or, depending on your system:
sudo mysqldump calpendo > calpendo.sql
Save the hibernate.cfg.xml and log4j.properties files from your existing webapps/Calpendo/WEB-INF/classes directory
Take the Calpendo directory from the tar.gz download, and replace your existing webapps/Calpendo with it.
Put the saved hibernate.cfg.xml and log4j.properties files into the new directory.
Modify your saved hibernate.cfg.xml. If you are using MariaDB, then there are three changes you must make. If you are using MySQL, then there is a single change.
For both MariaDB and MySQL, change the line that reads:
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
so that it reads:
<property name="hibernate.cache.region.factory_class">ehcache</property>
If you are using MariaDB then edit hibernate.cfg.xml and change the line that looks like this:
<property name="hibernate.dialect">com.springsolutions.exprodo.core.server.persistence.ExprodoMySQL5InnoDBDialect</property>
and change it so it says this:
<property name="hibernate.dialect">com.springsolutions.exprodo.core.server.persistence.ExprodoMariaDBDialect</property>
This is needed to handle some small differences between MariaDB and MySQL.
If you are using MariaDB, then you should also look for the line that starts like this:
<property name="hibernate.connection.url">jdbc:mysql://
and change the “mysql” to “mariadb” so that it reads:
<property name="hibernate.connection.url">jdbc:mariadb://
Make sure you do not have both old and new versions in the webapps directory at the same time, unless they point to a different database. Booting multiple versions of Calpendo that point to the same database will cause problems and is best avoided.
Restart tomcat
Downgrading between major releases is not normally supported, and downgrading from 10.2 to 10.1 is not supported by keeping your database and just downgrading the program. The general procedure for downgrading is:
Do not merely load an old database on top of an upgraded or partially upgraded database and run an old Calpendo. It will break things, but possibly not until you come to do another upgrade, by which time it may be too late to fix things easily.
CTMS, Calpendo’s module that provides a Clinical Trials Management System, has had many improvements, fixes and optimisations.
Changes
Avoid sending CTMS messages about breaking old changes rules when not changed
Hide tentative bookings by default in the bookings calendar
Hide tentative appointments from CTMS reception page
Provide better information if editing CTMS subject makes automatic changes
It would previously say that it had added an event (for example), without saying which appointment this related to.
Since each task can occur in multiple visits, this means you wouldn’t necessarily know which appointment had been assigned the extra events.
Issue: 3390
Validate visit/task cohort configuration and provide pop-up warnings if bad
When a visit has its start date defined relative to another visit, then the prior visit must include all the cohorts of the second one.
Without this, the previous visit is not well defined if a subject should happen to be set to use one of the missing cohorts.
The same applies to tasks, when a task’s start time is set relative to another task.
We now give a pop-up that says which are configured incorrectly, both when saving a subject and when viewing or saving a project.
Issue: 3392
Automatically notice and fix problems with server cache
There have been some issues lately where a server cache that holds frequently accessed data, has been poisoned.
This happens when something that is correct at the time it was created is added to the cache, but later becomes inaccessible thereby making the cache broken.
While we have fixed errors that cause this problem, we now have a self-healing process in place that notices this situation, and causes the cache to be rebuilt.
The behaviour of the self-healing process can be modified using two flags.
In both cases, you would need to search for instances of Verbose (either in the general Search->Search page, or in the special
To allow problems found to be fixed, find and enable the Verbose instance with the name:
com.springsolutions.exprodo.core.server.persistence.LiveCacheHealth:autoFix
This is enabled by default.
Normally, the server cache is checked every 30 minutes and, if there’s a problem, it will then fix it. Alternatively, you can modify the the period of the check to every minute by enabling the Verbose instance with the name:
com.springsolutions.exprodo.core.server.persistence.LiveCacheHealth:highFrequencyChecks
Issue: 3414
Send user warning message when attempt to update CTMS appointment ignored
Auto deselect old & approved CTMS bookings when calc change consequences
Add filter for consequential changes to CTMS bookings appointment calendar
When you make a change to an appointment or event in the subject editor, then it shows a pop-up to ask whether implied changes to other appointments and events ought to be applied.
We now display the same pop-up for changes made on the bookings calendar as well.
Issue: 3446
Remove “Email sending is disabled” message
When a user does anything that triggers a workflow that tries to send an email, and global preferences are configured to prevent all outgoing emails, then the user gets a popup that says “Email sending is disabled”.
On systems configured this way, the constant pop-up is irritating.
Issue: 3451
Force “Confirm” button rather than drop-downs for CTMS appointment/event
The process of confirming a booking is complicated in CTMS.
An appointment has many events, each of which may have ancillary bookings for other things.
Confirming an appointment requires that they all be confirmed, and there’s a set process for that which is triggered by the “Confirm” button.
This is now the only option.
When an appointment or event does not have an approval status of Approved, then the drop-down for appointment status and event status are both missing those options which would imply an approval status of “approved”.
The process is to click the button first.
Issue: 3453
Optimisations
When you edit a booking, some biskit-valued drop-down boxes can be filtered.
The effort of doing that filtering was done even when the bookings was displayed read-only, which is a waste of time.
Issue: 3373
When using CTMS, you can see a table with many appointments or events in a few places.
In all such cases, there is no need for drop-down filtering, but it was still done. Given there can be many appointments or events in the table, this had a large impact on performance.
Issue: 3374
When displaying bookings, either in a pop-up or in a search page, or in CTMS in tables that show many appointments and events, there are sometimes messages in the browser log that say:
"LAZY no more!"
This happens when a widget that was marked to be lazily created is finally created.
These messages could cause performance issues, particularly in CTMS when you could display a table with many bookings.
They are now disabled in production, and can optionally be turned on in debug mode.
Issue: 3375
When you click on a CTMS Subject, just like all other biskit types, it performs a check to see whether it is referenced.
It uses this to work out whether it should enable the “References” and “Delete” buttons.
The way this check works is that it not only checks for direct references, but it also check indirect references.
That is, if you have a one-to-many property, then it would look for references to the children of that one-to-many as well.
And if they had a one-to-many, then it would continue recursing until it found what it was looking for.
This is a problem in CTMS because you might have, for example, over 100 visits per project, and they may well have a total of 1400 tasks. (These are actual numbers from production).
So then Calpendo would have to look for references to all the appointments and events related to the subject.
This could mean many thousands of database queries.
So this has now been cut short. Specifically, when using the CTMS module, any one-to-many property that has a subject, appointment or event as its child type does not look for indirect references to the children of that one-to-many property.
This has a drastic effect on runtime performance at the expense of not knowing for certain whether it is referenced. This is used to help work out whether the “Delete” and “References” buttons should be enabled.
Issue: 3377
When data is loaded from the database, it now delays loading associated data until needed. This helps improve performance.
This affects Appointment.events, Appointment.unexpectedTasks and Subject.appointments.
Issue: 3378
When we edit subjects, we always save the appointments and events separately so that they have their own audit log entry.
It’s not necessary to have the subject entry include appointments.
This is important to avoid because trying to include them means including appointments and events that may not have been loaded from the database, thereby slowing down the save of the audit log.
Issue: 3381
When we save a subject, we already have in place code that makes sure the appointments and events are written to the database.
So it’s not necessary to have the database layer do that for us.
This is important because we may know that some appointments or events have not changed, and so we don’t write changes to the database.
But when the cascading of the save event is done for us, it doesn’t know that and forces all the data to be loaded from the database before saving.
So when there are many appointments for a subject, and many events for an appointment, this slows down things quite a bit.
Issue: 3382
When something is saved to the database, we go through the data to look for anything that might be a new tag we need to save.
If the data was not entirely loaded from the database (that is, it’s marked for being lazily loaded, and it hasn’t been needed yet), then looking for tags would force them to be loaded.
But if they haven’t been loaded, that probably means there’s nothing interesting in there.
This has a marked effect on performance for CTMS when saving a subject.
Issue: 3383
The browser was sending all appointments and events to the server when updating a subject. But this could be a lot of data, most of which was unnecessary.
Issue: 3389
We normally load the booking rules from the database every time we need them rather than storing a cache in memory.
We do this because rules are fairly simple, and not expensive to load from the database.
However, there can be situations (such as enrolling somebody into a CTMS study) that means there can be a large number of bookings created at the same time.
A large number of bookings multiplied by a short time to load rules from the database can still be a significant amount of time.
A cache means we can avoid the cost of loading the booking rules too often. (The cost here is both cpu and memory requirements)
Issue: 3415
When enrolling somebody into a study, or when adding new appointments or events to an existing study, then for every new appointment and event we would fetch the project’s data and the user’s data from the database.
This can be slow, and repeating for every appointment and event makes it much slower for large studies.
Issue: 3416
Validating whether appointments all look good or not is not essential to the operation of CTMS. So there’s now an option to turn it off in cases where server load and performance are an issue.
Look for the verbose setting with the name:
"com.exprodo.ctms.server.requestHandlers.ValidateAppointmentHandler:enabled"
and set it to false to disable validation.
Issue: 3417
When you update a CTMS event, then it fetches all other events from the database for that appointment.
However, it then uses only a tiny proportion of the data it loads.
This has been made faster by loading only the data actually required.
Issue: 3427
Bug Fixes
BUGFIX: CTMS Reception page gives exceptions when subject has no person
A subject should always have a person associated. Some problem with an import has produced such subjects, and this prevents the reception page from being able to display anything on days when such a subject is scheduled.
Issue: 3385
BUGFIX: CTMS tries to cancel already-cancelled appointment when not needed
If a subject has a cohort that means it does not need an appointment, then when you edit the subject, you get a message telling you it’s going to cancel the appoint as the cohort indicates it’s not needed, even if the appointment is already cancelled.
Issue: 3391
BUGFIX: Booking search page misses instances in middle of a repeating range
If you have a repeat booking and search for it on the booking search page, and the range of dates you use for the search does NOT include the first repeating instance, then the search will not find any of the repeating instances.
Issue: 3393
BUGFIX: Disabled CTMS Visit/Task auto cancelled when edit the subject
Suppose you have a visit that is disabled, or a task that is disabled.
Then when you edit a subject, you can manually choose to add an appointment for the disabled visit, or manually add an event for the disabled task.
After saving, if you then edit the subject again, then you get a message to say the manually added item has been removed because of a “cohort change”. Whereas, it should leave it alone because it was manually added.
Issue: 3397
BUGFIX: Optimised bookings calendar gives exception on empty refresh
If you have CTMS loaded or if you set the verbose flag “optimiseBookingCalendarFetch”
and you deselect all resources in the bookings calendar
then when it fetches bookings from the server, it gives an exception
Issue: 3408
BUGFIX: Confirm CTMS appointment not update subject appointments tree
If you view a subject, and from there you select a tentative appointment, and then click the Confirm button, then the appointment is updated as it should be, but the list of appointments still shows the selected one as tentative.
Issue: 3411
BUGFIX: CustomTreePage miscounts items when using multiple nesting levels
If you add a menu item to show a custom tree page, and you configure it to show dynamic nodes using two or more property paths to group biskits by, then the count displayed of the number of items would be wrong.
Issue: 2980
BUGFIX: Create copy of biskit with one-to-many properties can give exception
BUGFIX: Exceptions follow after workflow generated linked bookings
This bug would not affect most customers. It would be most likely to occur when there are many custom biskit types that have been created that reference users or projects or resources, or groups thereof, and when there are workflows that update anything referencing any of the above.
When the problem occurs, the actions it takes work without problem, but it “poisons” a cache held on the server so that it will generate errors at some later time when the poisoned part is used.
The poisoning happens through a deep data traversal and modification process of historical origin whose original purpose no longer exists.
Consequently, it has now been removed.
Issue: 3398,3412
BUGFIX: Exception when hover over booking in calendar to show tooltip
Displaying tooltip by hovering over booking in calendar can cause server data to get corrupted, resulting in exceptions.
As a bonus, fixing this has been done in such a way that makes it run much faster.
Depending on configuration, it could take a few seconds for the server to generate tooltip. Now it takes a fraction of a second in the cases tested.
Issue: 3412
BUGFIX: Select bookings calendar bookmark from menu shows exception
If you have a menu item that shows calendars by location, and from the template page, you select one of those calendars from the menu, then it takes you to the right page, but also showed an error in the corner of the screen briefly to say something went wrong on the server.
Issue: 3355
BUGFIX: Error if view old repeat booking where old changes not allowed
If you have a booking that is in the past, and which has repeat information set on it, and editing old bookings is disallowed, then viewing this booking in the search page pauses for some time and then gives an exception like “Maximum call stack size exceeded”.
Issue: 3371
BUGFIX: View user after creating bookings can give error
It was found when a user created a booking that also caused a linked booking to be created, and then if you go to a list of users and look at any user, it would give an error.
But this depended on the user performing these actions having limited permissions.
This bug is a consequence of a fix to an earlier bug (issue 3306) in 10.1.21.
Issue: 3398
BUGFIX: Timed events creating biskit with auto-creator fail on update
Suppose:
Then the update fails with an exception.
This was caused by an earlier optimisation in 10.1.21 (issue 3259) that made loading a user’s projects happen lazily.
Issue: 3400
BUGFIX: Sort biskits by a string value and you can’t save default weight
If you create a Sort Workflow Action, and select a randomisation type of “Sorted”, and then choose a weight path that leads to a string property, then you should be able to set a default weight that is used whenever the weight found at the given path is null.
However, for string-valued properties, when you save the action, the default weight always defaults back to null.
Issue: 3401
BUGFIX: Sort biskits by a string value that’s sometimes null gives exception
If you set up a workflow and have it sort a list of biskits, where the sorting is by a string valued property that is null for at least one of the biskits, then the action fails with an exception.
Issue: 3402
BUGFIX: Iterate over double-map with FreeMarker gives an exception
If you have a workflow that includes a Map action, and it includes at least two keys, and then you feed that into a Templated Text action that uses FreeMarker to iterate over the the entries in the resulting map, then you get an exception.
Issue: 3403
BUGFIX: Repeat bookings that slip into the past not being handled
Whenever a repeat booking’s time goes into the past, then something should come along (by default every hour) and create a non-repeat instance to represent what happened, and then modify the repeating instance to reset its start time to the next repeating instance.
This had stopped working, generating an exception with the message:
"illegally attempted to associate a proxy with two open Sessions"
Issue: 3406,3359
BUGFIX: Confirming booking when no changes are required gives exception
If you confirm a booking, and then (perhaps in another tab where you already had the booking displayed) you ask to confirm it again, then you get an exception the second time.
Issue: 3409
BUGFIX: Generate calendar invitation from workflow produces no invitation
If you use the workflow function createCalendarInvite to generate an iCal file, and add it into an email, then the email contains a message like:
"Could not load data: Uploaded file cannot be found: JhGuja_RbdAfg-9v-444879784121345"
instead of the appropriate content.
Issue: 3372
BUGFIX: Updated appointment not saved on updating CTMS subject
BUGFIX: Appointments disappear when new ones auto-added due to study edit
BUGFIX: Switch between CTMS subjects gives “cancelled appointments” popup
BUGFIX: Create copy of CTMS project and then enroll person gives exception
Suppose:
then at that point, you get an exception.
Issue: 3419
BUGFIX: Change CTMS subject cohort and appointments/events not updated
If you edit a subject’s cohort, then Calpendo should check to see which appointments and events are no longer suitable, and which ones are not currently scheduled and should be.
Issue: 3422
BUGFIX: Update CTMS subject always refuses past changes even if allowed
If you have a subject with appointments in the past, and you edit the subject and change a past appointment, then you get a pop-up telling you that it’s ignoring that because it breaks rules about no changes to past bookings.
But this still happens even if you configure the appointments resource to allow changes to past bookings.
Issue: 3423
BUGFIX: Calendar optimisation did not provide all required data
BUGFIX: Drag & drop booking when using optimised calendar gives error
The recent optimisation that (optionally) allows for the calendar to be populated more efficiently did not allow drag-and-drop of bookings to work.
Issue: 3426
BUGFIX: Pre-update check failure message thrown by CTMS helper masked
When there’s an exception thrown during a CTMS helper that does a pre-update check for subjects, appointments or events, then the exception thrown becomes swallowed.
Instead, a different exception complaining about version numbers is shown instead.
Issue: 3429
BUGFIX: Reschedule appointment from CTMS reception page gives exception
Go to reception page, select an appointment, and then select status of
"Needs rescheduling-->Enter Date"
and it gives an exception.
Issue: 3431
BUGFIX: When add replacement CTMS appointment, old one displays same
If you edit a subject and add an appointment for a visit it already has an appointment for, then the old appointment is cancelled automatically.
However, in the list of all the appointments, it still shows the appointment as having the same status it did before (even if clicking on it would correctly display its status as cancelled).
Issue: 3432
BUGFIX: Reception page reschedule with “Enter date” gives version error
BUGFIX: Cancel appointment from reception page does not cancel approval
An appointment has an “approval status” (which is the regular Calpendo booking status) and an “appointment status”.
On the reception page, if you view an appointment and then mark it as “Needs rescheduling” or “Cancel permanently”, then the appointment status was changed appropriately, but not the approval status.
Issue: 3434
BUGFIX: Can drag appointment to other resource, mutating to non-appointment
BUGFIX: Disabled task’s CTMS Event silently cancelled on subject change
If you have an event for a disabled task, then editing the subject will cancel the event without any warning.
Issue: 3438
BUGFIX: CTMS Appointments with cancelled events cannot be confirmed
If you click the Confirm button for an appointment that has a cancelled event, then the appointment status will not be set to Approved, as the cancelled event is interpreted as a blocker.
Issue: 3439
BUGFIX: Auto-cancel of CTMS event and the tree display not change status
If you set up a study and subject so that by changing the subject’s cohort, it means one or more events should be cancelled, then the tree of appointments and events should be updated to indicate the event is cancelled.
However, it still shows the previous status in the display.
When you click on the event, it does show its status as cancelled however.
Issue: 3440
BUGFIX: Cancel appointment from reception page does not cancel events
The appointment was cancelled properly, but not the events within it.
Issue: 3441
BUGFIX: Cohort change indicating appointment unwanted marked as reschedule
When a cohort mean means an appointment is no longer wanted, its appointment status was set to NEEDS_RESCHEDULING instead of CANCELLED_PERMANENTLY.
Issue: 3442
BUGFIX: CTMS Events cancelled due to cohort change not always cancelled
Suppose you have a study with multiple cohorts, and a visit that contains two tasks - one for one cohort, and the other task for the other cohort.
Suppose you thenenroll somebody and set their cohort to one value, save it, and then edit the subject, click on the appointment, change the cohort so that it cancels the existing event, and then save.
Then the cancelled event shows as being tentative instead of cancelled.
Issue: 3443,3448
BUGFIX: Change CTMS appointment date on calendar & subject editor shows old
If you go to the calendar, edit an appointment’s date, and then go to the subject editor to view that same subject, then you will see the old date, from before the calendar was updated.
Note: if the subject editor is still showing the subject you edited elsewhere, then it will show the old dates until you click onto another subject and back again.
Issue: 3444
BUGFIX: Unticked implied CTMS appointment/event changes still updated
If you make a change to an appointment or an event, then it shows a pop-up to let you choose which of the implied changes should be applied.
However, when you untick something, it may still be changed.
Issue: 3445
BUGFIX: CTMS event cancellation by cohort does not change event status
On changing a subject’s cohort, if it means an event should be cancelled, then the event’s approval status was cancelled, but the event status was not.
Issue: 3449
BUGFIX: Appointment size calculations include cancelled & denied events
Appointments recalculate their start and finish times based on the events within them.
It was including cancelled and denied events in that calculation, but now ignores them.
Issue: 3450
BUGFIX: CTMS reception page errors on change appointment status (and slow)
The reception page had some problems with changing values on the appointment.
It was also extremely slow when used with real-world data.
Issue: 3452
Bug Fixes
Changes
This is a workflow function that can convert conditions into something human readable.
This is being introduced primarily to allow permissions to be documented.
Issue: 3487
Bug Fixes
If you create a report from a custom search page (such as the booking search page) and add some conditions, and save it, then editing the report in the report manager generates this message:
You have changed the conditions beyond the point where they will
be recognised by the page that originally created them. This
report will now be loaded by the general search page.
Loading the report no longer loads it into the custom search page it was created from, but the general search page, and the conditions show as much more complicated than the originals.
Issue: 3334
Security Fixes
If you view the bookings calendar, and leave your browser like that, then it will automatically refresh every now and then.
These automatic refreshes do not cause your session to be extended - that requires manual intervention so that your login session period is extended only when you are actually doing things.
However, if one of these automatic refreshes were to generate an exception, then that exception would be registered with the server, and that registration message could extend your session.
This has now been changed so that an exception generated from an automated request is itself treated as automated.
Issue: 3512
Bug Fixes
Occasionally, a subject cannot be enrolled into a study because it gives an error.
This particular error comes from a sequencing problem, of the order in which items in the request from the browser being parsed, and using some of that data before it has been parsed.
The relevant code has been tweaked so it still does something sensible when the data it expects is missing (because it just hasn’t been read yet from the data stream).
Issue: 3661
Bug Fixes
In a CTMS system, editing a subject will automatically cancel events where the task is marked as not required for the subject’s cohort.
This automatic cancel should not happen for events that are in the past, since they have already happened, and so we should not attempt to modify history.
Issue: 3973