- Loop iteration variables are now properly scoped. Attempting to reference one outside the body of the loop will produce a compilation error (previously the result was a runtime error).
- Correctly reject invocation of a private procedure via ResourceAPI.executeOp.
- Added the String Procedure isReal.
- Added the DateTime Procedure truncateTo.
- Improved debug tracing for for statements and try/catch/finally (especially in cases with empty blocks).
- Services may now have an explicitly defined interface. When present the system will validate the definition of procedures declared as part of the service with the definitions found in the interface. All services defined by the new Service Builder declare an explicit interface.
- Event Generators now support generating events on Inbound Service Event Types.
- Services can be named as a resource in a Debug Configuration. This enables controlling logging levels and enabling debug tracing for the service as a whole.
- Services have an “activation state” and can be marked as “inactive”. Doing so prevents the handling of any inbound event types. However, it does not prevent execution of the service’s procedures.
- The status operation for stateful services now returns:
- Whether or not the service state has been initialized.
- The current status of the scheduled procedures.
- Assemblies now allow you to include local Namespace data when publishing the Assembly to the Catalog
- Configuration Properties may now be typed as Schema Types and Secrets in addition to the previous options
- Integration Tests for Assemblies allow the Author to specify a configuration for the Assembly which will be tested
- The following resources are now configurable:
- Scheduled Procedure Interval
- An Assembly may contain another Assembly and configure the child Assembly
- Sources may define additional configuration properties besides those the server can infer
- Procedures and Rules may access Assembly Configuration Properties in VAIL
Management and Deployment
- Vantiq has added external lifecycle support for Kubernetes version 1.22. The Vantiq interface and API are unchanged for this support; the primary difference is that the Ingress resource type has changed for later versions of Kubernetes.
- Kubernetes Secrets can now be mounted as files in a K8s Installation. See the Resource Guide for details.
- K8s Installations now support the fetchLogs operation. Please see the Resource Guide for details.
- There are some new “resource specific” operations which have been added to the “context menus” in the Project Contents browser:
- Procedures: Execute Procedure
- Tests: Run Test
- Test Suites: Run Test Suite
- Types: Find Records, Add Records
- Client: Run in Client Launcher
- When selecting topics, Services or Assemblies, allow the subscription or installation and use of Catalog-hosted resources.
- Added two IDE keyboard shortcuts:
- Shift-Ctrl-S & Shift-Cmd-S: save Project changes
- Shift-Ctrl-E & Shift-Cmd-E: display the IDE search dialog
The Service Builder is now the central server development tool in Vantiq. The Service Builder allows users to:
- Define Inbound and Outbound Event Types and their schemas
- Publish Inbound Event Types and Subscribe to Outbound Event Types
- Define Service Procedure Signatures
- Implement Public and Private Service Procedures
- Implement Visual Event Handlers (Apps) and VAIL Event Handlers (Rules) for inbound Event Types
- Schedule Service Procedures
- Define and Run Service Integration Tests, Service Unit Tests, and Service Test Suites
- View all Compilation and Runtime errors for the Service and any of its implementing resources
- Since Apps, Rules, and Procedures can now be defined in the Service Builder, Add App, Rule, and Procedure have been moved to the Advanced sub-menu of the Add menu.
The Project Contents browser (at the left edge of the Modelo window) can now display the resource tree in a new “package-centric” flavor. Rather than dividing all the resource packages inside the resource type (Service, Client, App, etc.) you can now select “Tree of Resources by Package”. In this flavor the packages come first, and the resource types are inside. This is now the default for new Projects and Views, because this flavor better represents the new importance of packages in Modelo.
For example, suppose your Project resources looked like this (shown in the “list” flavor):
In previous releases you would usually show this as a “resource-centric” tree where all the resources are grouped by resource type with the packages shown inside:
In R1.33 you can now use the menu to display the resources as a “package-centric” tree. The new menu now looks like this:
Selecting “Tree of Resources by Package” makes the tree look like this:
If you prefer the old “Tree of Resources by Type” there is an IDE Setting to change the default.
- You can now add an optional icon to each page title in a TabbedLayout.
- There is a new flavor of DataStream which listens for an “outbound event” generated by a Service.
- In previous releases you could not open more than one “popup” Page a time. This restriction has been lifted so you can now call one popup Page from inside another. Note that these popups are still modal, so only the “topmost” popup page is active. The user must close a popup to reveal the older one beneath it.
- The standard for GeoJSON coordinates is to contain a 2-element array which contains [latitude, longitude]. This is the opposite order of how most humans think about positions, and some people would prefer that these coordinates be delivered as [longitude, latitude]. There is now a property on the FloorplanViewer and FixedLayout widgets which will cause the coordinates to be swapped from the GeoJSON standard ([latitude, longitude]) to the “human standard” (longitude, latitude).
- The Client Builder has a “search” field in the “Add” Widget palette; in previous releases that would only allow you to filter out Widgets based the short name that was shown in the palette. In R1.33 this search is more forgiving and will do a case-insensitive match against the actual Widget class name (“AccordionLayout”), the short visible label (“Accordion”) and the longer tooltip (“Accordion Layout”). Note that Widget class name is always in English but the visible label and tooltip are always localized versions of the text.
- The NumberViewer Widget now allows you to enter “color rules” for the background and foreground colors the Widget uses at runtime. The rules will be evaluated in order and the first one to match the current value will be applied. If no rules match the default colors will be used.
- The DataTable Widget now supports an optional icon in the header for each column.
- The DataTable Widget now allows you to optionally specify a “CSS width” for a column. (Any valid CSS width is accepted, such as “250px”.) It’s important to note that there are situations in which HTML won’t allow this to work as you would expect. In general, the table must be wider than the minimum before these width settings will be respected, and if your specifications are conflicting or inconsistent, they will not work. You will need to experiment to discover what HTML will allow in your situation.
- The DropList Widget now supports the “On Validation” event which you can use to force the user to pick some particular subset of the supported values. The ‘On Validation’ Event is fired as a part of the “Validation” process which is described here.
App and Collaboration Builders
These changes also apply to the embedded version of the App Builder used to construct Service Event Handlers.
- The Filter Activity Pattern may be defined either as a VAIL condition or as a Visual Filter.
- It is now possible to save various “non-functional” changes to an App/Collaboration Type, such as:
- Graph layout
- Expand/contract Service group(s) in the palette.
- Expand/contract Activity Pattern group(s) in the palette.
- Regeneration of the App/Collaboration Type resources only occurs when functional changes have been made to the App/CT definition. Note that a simple “toggle” of the activation state (without an intervening save) will no longer trigger regeneration.