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 and Report
  • Update Startup page environmentIdentifier 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() and UserAgent.getUxUi()
  • Add ELExpressionEvaluator.newSkyveValidationProcessor() and ELExpressionEvaluator
  • 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() into fromString() and fromSerialised() 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 in QuartzJobSchduler.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 in AbstractHibernatePersistence
  • 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 and addSeconds to Skyve Time 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 with ContentManager.update()
  • Copy the contentId on AttachmentContent copy constructor
  • Add documentation to LuceneContentManager.truncateBeans()
  • Remove Model.getAllAttributes() and Document.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 to DynamicBean 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() to addElementToCollection and removeElement() to removeElementFromCollection for consistency
  • Cater for compound binding in BindUtil.addElementToCollection() and BindUtil.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 to s: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() into coldHit() and postBack() methods to allow for easier overriding
  • Fix multiple zoom in bindings to work through RouteCriteria.canonicalise() and EditAction.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.