Skyve 8.1.2 Released
Skyve 8.1.2 rolls up dozens of fixes and enhancements to the platform. It also introduces the ability to use expressions for dynamic evaluation.
Expressions
Skyve has had basic expression evalution built in for a long time, but Skyve 8.1.1 introduces the ability to provide Java EL expressions to perform dynamic evaluation. Different expression engines can now be prefixed to activate them, e.g. {i18n:
to read a key from a langauge resource file.
The different available expression evaluators and some examples have been added to the Skyve Developer Guide.
Flutter
React Native has been on our roadmap as our planned mobile platform, but earlier this year the developer team decided to pivot to Flutter as the next Skyve renderer. This should allow the existing Responsive renderer to be replaced as well as the ability to generate native Android and iOS Skyve applications. It is still early days so nothing to show yet, but the roadmap has been updated.
Admin
- Update
SelfRegistrationActivationExtension
to make sure the query has appropriate permissions to retrieve the user activation code and save changes - Add tablet routing to Responsive Reports menu in admin module
- Reenable editing of bindings during Quick ImportExport
- Update
ReportTemplate
generate report helper to use the localised display name to evaluate i18n attribute display names - Correct display name i18n reference for
Communication
actionType
- Unescape output XML from Document Creator view
- Ensure dynamic domain values for document selection are sorted alpha by description for
Communication
,Tag
andReport
- Update
Startup
pageenvironmentIdentifier
description to provide more details - Add
admin.DataMaintenance
CollectionContentGarbage
action - Ensure Report Manager does not remove previous report versions when validate only option is selected
Framework
- Add UserAgent emulation and standardise usage of
UserAgent.getType()
andUserAgent.getUxUi()
- Add
ELExpressionEvaluator.newSkyveValidationProcessor()
andELExpressionEvaluator
newSkyveEvaluationProcessor()
for project use- Improve exception handling in
BindUtil.set()
- Ensure
BindUtil.set()
doesn't try to coerce string values to Object.class property types - Fix module bug in
RDBMSDynamicPersistence
- Make
FluentEnumeratedValue.description()
public - Split out
BindUtil.fromString()
intofromString()
andfromSerialised()
variants - Add null check on content manager when shutting down Skyve
- Fix
AbstractHibernatePersistence.prepareMergedBean
to handle parent references - Handle dynamic enums
- Allow evaluation of implicit conditions (persisted, created etc) in
BindUtil
when not overridden - Add Unique Constraint checking optimisation based on constraint field dirtiness
- Add
LoggingIteratorAdapter
- Add Flutter POC project
- Add
SerializableMetaData
for non Java MetaData and remove serialVersionUIDs - Add Skyve
NumberGenerator
interface and 2 implementations - Fix EL validation to return terminating mocks for built-ins and java method calls
- Move
EJBRemoteContentManager
classes to skyve-ext so they are accessible outside of the content plugin - Upgrade to hibernate 5.4.33.Final
- Implement reindex in
AbstractEJBRemoteContentManagerClient
- Create class instances throughout Skyve the >= Java 9 way
- Update freemarker
SQLFormatDirective
to try to output timestamps and date times based on the returned jdbc driver type - Made
UploadException
non-final and added Javadoc - Update
BasicAuthFilter
to use SQL instead of a document query to get the hashed password to test as a user may not have access to admin.User - Fix SkyveDataSource class usage in
JasperReportRenderer
- Evict all first level cache each iteration of
ReindexBeansJob
- Add unique constraint optimisation around null values
- Update freemarker
DescriptionDirective
to support escaping - Fix
ClassCastException
inQuartzJobSchduler.getCustomerRunningJobs()
- Add helper method to
Time
utility class for converting a Date to a LocalDate - Validate
FilterParameter.filterBinding
against its driving document - Delete Entities and relations in batches of 100 in
RDBMSDynamicPersistence
- Catch
Throwable
in Text extraction and content sniffing so reindex jobs don't stop - Log start and end of Content Garbage Collection
- Add
noTimeout()
convenience method to queries - Remove query timeout from
ReindexBeansJob
- Add
NoOpDynamicPersistence
and dynamic persistence factory class to JSON - Guard against running out of sentences of input in
TestUtil.randomText()
- Add logging to EJB remote
ContentManager
classes - Add DynamicPersistence.postConstruct() so we always know we have the correct Persistence instance
- Secure
LuceneContentManager.google()
- No longer remove attachment content associated with removed/cleared content fields immediately. Let ContentGC collect it once it is committed to the RDBMS
- Trace removal of content in
ContentGarbageCollectionJob
with bizId/contentId - Add
Model.hasDynamic()
and use it to short circuit dynamic persistence inAbstractHibernatePersistence
- Ensure view components within vanilla views are resolved with the current uxui
- Validate parent binding in
BindUtil.getMetaDataForBinding()
- Allow parent bindings in widgets which have no domain values but allow associations
- Treat null values correctly when feeding list models from SC and PF
- Add helper methods for
addMinutes
andaddSeconds
to SkyveTime
utility classes - Check content meta data is correct in
ContentChecker
, not just that the content is present - Protect malformed content garbage collection by checking every RDBMS content field for a reference
- Remove
HomeServlet
- Add
ContentManager.update()
- Make
AttachmentContent
mutable for use withContentManager.update()
- Copy the contentId on AttachmentContent copy constructor
- Add documentation to
LuceneContentManager.truncateBeans()
- Remove
Model.getAllAttributes()
andDocument.getAllUniqueConstraints()
- Add support for Japanese date formats
- DomainValue::getDescription -> DomainValue::getLocalisedDescription, Enumeration::toDescription -> Enumeration::toLocalisedDescription, Enumeration::fromDescription -> Enumeration.fromLocalisedDescription
- Defend content garbage collector against documents that have uploaded content and were persistent but are now not
- Add font awesome 6.1.1 to skyve-web resources
- Redo device selection in device.xhtml with primevue speeddial
- Rename
MapBean
toDynamicBean
and add Hierarchical and Child variant - Adding charset=UTF-8 for email encoding
- Add some null treatment annotations
- Add the customer name to the URL parameters after a password has been reset
- Move expression validation to
LocalDesignRepository.validateDocumentForGenerateDomain()
where the customer is always defined - Add Bean.addDynamic()
- Add first level caching to DynamicPersistence
- Rename Binder
addElement()
toaddElementToCollection
and removeElement()
toremoveElementFromCollection
for consistency - Cater for compound binding in
BindUtil.addElementToCollection()
andBindUtil.removeElementFromCollection()
- Introduce and use
Model.isPersistable()
- Introduce
Model.getPolymorphicAttribute()
- Add the ability to add a new Freemarker template to the list of templates from an arbitrary string, to be used by dynamic documents
- Fix memory usage on File Downloads
- Update
TemporalBucket
to support bucketing dates by quarter in charts
Responsive Renderer
- Add remaining
h:form
attributes tos:csrfForm
- Revert to setting the request attributes for ux/ui and user agent type when the corresponding setter is called in
FacesView
to enable direct hits on XHTML pages without going through the router - Split out
preRender()
intocoldHit()
andpostBack()
methods to allow for easier overriding - Fix multiple zoom in bindings to work through
RouteCriteria.canonicalise()
andEditAction.setupViewForZoomIn()
- Use
#{item.localisedDescription}
instead of#{item.description}
in lookupDescription widget implementation - Bug Fix: DataGrid (and ListGrid) where left alignment is specified, data now aligns left
- Process signature string value in FacesView
- Handle domain values in lists correctly
Desktop Renderer
- Fix state bug in Comparison editor
- Make Text Search resistant to session expiry
- Show Data URL in search results if the bean exists
Notes for Upgrading
To upgrade your Skyve project to this version, change the Skyve version in your pom.xml to 8.1.2 and perform an assemble.
If you are upgrading from a version older than 8.0.0, please see the previous release notes and also apply those changes.
A new dynamicPersistenceClass
can be added to your factories
stanza in your project json (this can be set to null
, or will default if not set):
// Factory settings
"factories": {
// Skyve persistence class
"persistenceClass": null,
// Skyve dynamic persistence class
"dynamicPersistenceClass": "org.skyve.impl.persistence.NoOpDynamicPersistence",
Any calls to document.getAllAttributes()
now requires a Customer to be provided, e.g.:
// update
for (Attribute a : document.getAllAttributes()) {
// to
for (Attribute a : document.getAllAttributes(CORE.getCustomer())) {
Any calls to a domain value to return the description need to be updated to use the localised description, which checks for any i18n provided resources:
// update
return domainValue.getDescription();
// to
return domainValue.getLocalisedDescription();
ModulesUtil.getNextDocumentNumber
has been replaced with CORE.getNumberGenerator()
or there is a NumberGenererator
interface which can be injected.
See the complete upgrade instructions on GitHub.