// ...
@Inject
public DataProviderVerticle dataProvider;
@Override
public void start() {
vertx.deployVerticle((1)
dataProvider,
new DeploymentOptions().setWorker(true),
deploymentHandler);(1)
}
The DataProviderVerticle
can periodically load data from Gentics Mesh or any HTTP resource which is then available
for handlers of the portal and during rendering of a page.
This feature is not active automatically, but must be added in the implementation of the BootstrapInitializer.
DataProviderVerticle
// ...
@Inject
public DataProviderVerticle dataProvider;
@Override
public void start() {
vertx.deployVerticle((1)
dataProvider,
new DeploymentOptions().setWorker(true),
deploymentHandler);(1)
}
1 | The reference to vertx as well as the deploymentHandler are available from the abstract base class. |
The intervall in seconds between refreshing the Mesh and web data can be configured via the
dataProvider.refreshTime
setting.
Whenever the portal loads the configured datasources, it will add the field dpvmeta
to the loaded JSON data. This
field contains the timestamp
and fresh
fields, which contain the timestamp of the last successful refresh and
a boolean value indicating whether the data is fresh or stale respectively.
When a data source (either Mesh or web) cannot be loaded, and the
setting dataProvider.retryOnError
is false
, the respective entry
will be removed from the list, and not be tried again. Additionaly when this happens during the startup process of
the portal and dataProvider.preventStartupOnError
is true
, the portal will refuse to start with an appropriate
error message.[1]
Already loaded data for a data key will not be removed when refreshing fails, but will instead be marked as stale
.
What data to load from Mesh is configured in the dataProvider.meshData setting. Each entry is a mapping from a data key to a list of paths. Since the portal can load data from different branches from Mesh, and the actual path may depend on the selected branch, a data key is mapped to a list of paths.
The dataprovider will use the first path it can successfully load data from those lists, and store it under the respective data key. A single path as value, will be wrapped in a list automatically.
The following example will load /masterSettings/config.html
or /branchSettings/config.html
depending on the
branch the portal serves and make it available under the data key settings
(see accessing
data). Additionaly the single path /misc/stuff.html
will be wrapped in a list containing only this path, and make
the loaded data available under otherStuff
.
dataProvider:
meshData:
settings:
- /masterSettings/config.html
- /branchSettings/config.html
otherStuff: /misc/stuff.html
The configuration for loading web data is a mapping from data keys
to web data options. Each entries options must have a URL specified from where to load the data. Addiopnally the
format can be set to JSON
or RAW
(which is the default). Loaded JSON
data is assumed to be a string
representing a valid JSON object, which can be used as is. For RAW
data the loaded string will be put in a new JSON
object with the field data
.
Since Mesh data and web data are configured in different settings, it is syntactically possible to define
a Mesh data source and a web data source with the same data key. When dataProvider.preventStartupOnError is
enabled, this will prevent the portal from even starting. Otherwise a warning is logged, to inform that the web data
source will just be ignored.
|
dataProvider:
webData:
systemStatus:
url: https://some.other.site/system/status
format: JSON
postProcessor: com.gentics.mesh.portal.custom.StatusHelper
options:
verboseInfo: true
In both cases (JSON
or RAW
) the loaded data can be passed through the configured DataProviderPostProcessor
which process()
method gets a generic Object
and is expected to return a JsonObject
which should be made
available by the DataProviderVerticle
.
The post processor to use is specified by setting dataProvider.webData.*.postProcessor
to the fully qualified name
of the class implementing DataProviderPostProcessor
. Upon initialization the post processors init()
method will
be passed the entries of dataProvider.webData.*.options
.
For each request to the portal, the DataProviderVerticle
will insert the loaded data into the RoutingContext
. The
respective handler is called during the API_ROUTES
route order, so any custom handlers only have access to it, when
they run during the BEFORE_CONTENT_ROUTES
route order or later.
The data can be retrieved from the routing context via RoutingContext#get()
by specifying the data key of the data
source. In Handlebars templates and custom Handlebars
helpers the data is available in the context under the same name.
Both of the following examples access data loaded for the data key config
.
// ...
@Override
public void handle(RoutingContext rc) {
JsonObject config = rc.get("config");
// ...
}
<img src="{{{ config.fields.logo_url }}}" title="{{{ config.fields.logo_title }}}"/>