Skip to content

Commit

Permalink
Kie server for workbench dataset (#28)
Browse files Browse the repository at this point in the history
* Refactor DataSetDefsBootstrap

 Removed dataset registration into Kie Server
 Created KieServerDataSetManager to handle registering all dataset into Kie Server

* DataSet registration update

Add specif event fired after all dataset are registered, allowing the UI to refresh at the correct time.
  • Loading branch information
cristianonicolai authored and mswiderski committed Jun 30, 2016
1 parent f3af0b7 commit f636ae0
Show file tree
Hide file tree
Showing 14 changed files with 247 additions and 359 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@
<artifactId>uberfire-servlet-security</artifactId>
</dependency>

<dependency>
<groupId>org.dashbuilder</groupId>
<artifactId>dashbuilder-dataset-api</artifactId>
</dependency>

<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-console-ng-business-domain-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.console.ng.bd.integration;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.def.DataSetDefRegistry;
import org.dashbuilder.dataset.def.SQLDataSetDef;
import org.jbpm.console.ng.ga.events.KieServerDataSetRegistered;
import org.kie.server.api.model.definition.QueryDefinition;
import org.kie.server.client.KieServicesException;
import org.kie.server.client.QueryServicesClient;
import org.kie.server.controller.api.model.events.ServerInstanceConnected;
import org.kie.server.controller.api.model.runtime.ServerInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.commons.async.SimpleAsyncExecutorService;

@ApplicationScoped
public class KieServerDataSetManager {

private static final Logger LOGGER = LoggerFactory.getLogger(KieServerDataSetManager.class);

@Inject
private DataSetDefRegistry dataSetDefRegistry;

@Inject
private KieServerIntegration kieServerIntegration;

@Inject
private Event<KieServerDataSetRegistered> event;

public void registerInKieServer(@Observes final ServerInstanceConnected serverInstanceConnected) {
final ServerInstance serverInstance = serverInstanceConnected.getServerInstance();
final String serverInstanceId = serverInstance.getServerInstanceId();
final String serverTemplateId = serverInstance.getServerTemplateId();
LOGGER.debug("Server instance '{}' connected, registering data sets", serverInstanceId);

final List<DataSetDef> dataSetDefs = dataSetDefRegistry.getDataSetDefs(false);

LOGGER.debug("Found {} data sets to register", dataSetDefs.size());

if( dataSetDefs.size() == 0 ){
return;
}

SimpleAsyncExecutorService.getDefaultInstance().execute(() -> {
try {
long waitLimit = 5 * 60 * 1000; // default 5 min
long elapsed = 0;

LOGGER.info("Registering data set definitions on connected server instance '{}'", serverInstanceId);
final QueryServicesClient queryClient = kieServerIntegration.getAdminServerClient(serverTemplateId).getServicesClient(QueryServicesClient.class);

final Set<QueryDefinition> queryDefinitions = dataSetDefs.stream().map(
dataSetDef ->
QueryDefinition.builder()
.name(dataSetDef.getUUID())
.expression(((SQLDataSetDef) dataSetDef).getDbSQL())
.source(((SQLDataSetDef) dataSetDef).getDataSource())
.target("CUSTOM")
.build()
).collect(Collectors.toSet());

while (elapsed < waitLimit) {
try {
queryDefinitions.forEach(definition -> {
queryClient.replaceQuery(definition);
LOGGER.info("Query definition {} successfully registered on kie server '{}'", definition.getName(), serverInstanceId);
});

event.fire(new KieServerDataSetRegistered(serverInstanceId, serverTemplateId));
return;
} catch (KieServicesException e) {
// unable to register, might still be booting
Thread.sleep(500);
elapsed += 500;
LOGGER.debug("Cannot reach KIE Server, elapsed time while waiting '{}', max time '{}'", elapsed, waitLimit);
}
}
LOGGER.warn("Timeout while trying to register query definition on '{}'", serverInstanceId);
} catch (Exception e) {
LOGGER.warn("Unable to register query definition on '{}' due to {}", serverInstanceId, e.getMessage(), e);
}
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,16 @@

import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.def.DataSetDefFactory;
import org.dashbuilder.dataset.def.DataSetDefRegistry;
import org.dashbuilder.dataset.def.SQLDataSetDef;
import org.jbpm.console.ng.bd.integration.KieServerIntegration;
import org.jbpm.console.ng.bd.model.ProcessInstanceDataSetConstants;
import org.jbpm.dashboard.dataset.integration.KieServerDataSetProvider;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.model.definition.QueryDefinition;
import org.kie.server.client.KieServicesException;
import org.kie.server.client.QueryServicesClient;
import org.kie.server.controller.api.model.events.ServerInstanceConnected;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.commons.async.SimpleAsyncExecutorService;
import org.uberfire.commons.services.cdi.Startup;

import static org.jbpm.dashboard.renderer.model.DashboardData.*;
Expand All @@ -43,28 +35,21 @@
@ApplicationScoped
public class DataSetDefsBootstrap {

private static final Logger logger = LoggerFactory.getLogger(DataSetDefsBootstrap.class);
private static final Logger LOGGER = LoggerFactory.getLogger(DataSetDefsBootstrap.class);
private static final String JBPM_DATA_SOURCE = "${"+ KieServerConstants.CFG_PERSISTANCE_DS + "}";

public static final String TASKS_MONITORING_DATASET = "tasksMonitoring";
public static final String PROCESSES_MONITORING_DATASET = "processesMonitoring";

@Inject
DataSetDefRegistry dataSetDefRegistry;

@Inject
private KieServerIntegration kieServerIntegration;

private DataSetDef processMonitoringDef;
private DataSetDef taskMonitoringDef;

@PostConstruct
protected void registerDataSetDefinitions() {
final String jbpmDataSource = "${"+ KieServerConstants.CFG_PERSISTANCE_DS + "}";

processMonitoringDef = DataSetDefFactory.newSQLDataSetDef()
DataSetDef processMonitoringDef = DataSetDefFactory.newSQLDataSetDef()
.uuid(PROCESSES_MONITORING_DATASET)
.name("Processes monitoring")
.dataSource(jbpmDataSource)
.dataSource(JBPM_DATA_SOURCE)
.dbSQL("select " +
"log.processInstanceId, " +
"log.processId, " +
Expand All @@ -90,10 +75,10 @@ protected void registerDataSetDefinitions() {
.label(COLUMN_PROCESS_EXTERNAL_ID)
.buildDef();

taskMonitoringDef = DataSetDefFactory.newSQLDataSetDef()
DataSetDef taskMonitoringDef = DataSetDefFactory.newSQLDataSetDef()
.uuid(TASKS_MONITORING_DATASET)
.name("Tasks monitoring")
.dataSource(jbpmDataSource)
.dataSource(JBPM_DATA_SOURCE)
.dbSQL("select " +
"p.processName, " +
"p.externalId, " +
Expand Down Expand Up @@ -132,61 +117,7 @@ protected void registerDataSetDefinitions() {
// Register the data set definitions
dataSetDefRegistry.registerDataSetDef(processMonitoringDef);
dataSetDefRegistry.registerDataSetDef(taskMonitoringDef);
logger.info("Process dashboard datasets registered");

}

public void registerInKieServer(@Observes final ServerInstanceConnected serverInstanceConnected) {
SimpleAsyncExecutorService.getDefaultInstance().execute(new Runnable() {
@Override
public void run() {

String serverTemplateId = serverInstanceConnected.getServerInstance().getServerTemplateId();
String serverInstanceId = serverInstanceConnected.getServerInstance().getServerInstanceId();
try {
long waitLimit = 5 * 60 * 1000; // default 5 min
long elapsed = 0;

logger.info("Registering process instance data set definitions on connected server instance '{}'", serverInstanceId);
QueryServicesClient queryClient = kieServerIntegration.getAdminServerClient(serverTemplateId).getServicesClient(QueryServicesClient.class);
QueryDefinition processMonitoringDefDefinition = QueryDefinition.builder()
.name(processMonitoringDef.getUUID())
.expression(((SQLDataSetDef) processMonitoringDef).getDbSQL())
.source(((SQLDataSetDef) processMonitoringDef).getDataSource())
.target("CUSTOM")
.build();

QueryDefinition taskMonitoringDefDefinition = QueryDefinition.builder()
.name(taskMonitoringDef.getUUID())
.expression(((SQLDataSetDef) taskMonitoringDef).getDbSQL())
.source(((SQLDataSetDef) taskMonitoringDef).getDataSource())
.target("CUSTOM")
.build();

while (elapsed < waitLimit) {
try {

queryClient.replaceQuery(processMonitoringDefDefinition);
logger.info("Query {} definition successfully registered on kie server '{}'", PROCESSES_MONITORING_DATASET, serverInstanceId);

queryClient.replaceQuery(taskMonitoringDefDefinition);
logger.info("Query {} definition successfully registered on kie server '{}'", TASKS_MONITORING_DATASET, serverInstanceId);
return;
} catch (KieServicesException e) {
// unable to register, might still be booting
Thread.sleep(500);
elapsed += 500;
logger.debug("Cannot reach KIE Server, elapsed time while waiting '{}', max time '{}'", elapsed, waitLimit);

}
}
logger.warn("Timeout while trying to register process instance query definition on '{}'", serverInstanceId);
} catch (Exception e) {
logger.warn("Unable to register process instance queries on '{}' due to {}", serverInstanceId, e.getMessage(), e);

}
}
});
LOGGER.info("Process dashboard datasets registered");
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

package org.jbpm.dashboard.renderer.client.panel;

import javax.enterprise.event.Observes;

import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import org.dashbuilder.dataset.client.DataSetClientServices;
Expand All @@ -29,7 +27,6 @@
import org.dashbuilder.renderer.client.metric.MetricDisplayer;
import org.dashbuilder.renderer.client.table.TableDisplayer;
import org.jbpm.console.ng.ga.model.dataset.ConsoleDataSetLookup;
import org.jbpm.console.ng.gc.client.menu.ServerTemplateSelected;
import org.jbpm.dashboard.renderer.client.panel.formatter.DurationFormatter;
import org.jbpm.dashboard.renderer.client.panel.i18n.DashboardI18n;
import org.jbpm.dashboard.renderer.client.panel.widgets.ProcessBreadCrumb;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import org.dashbuilder.displayer.client.DisplayerLocator;
import org.dashbuilder.renderer.client.metric.MetricDisplayer;
import org.dashbuilder.renderer.client.table.TableDisplayer;
import org.jbpm.console.ng.gc.client.menu.ServerTemplateSelected;
import org.jbpm.console.ng.ga.events.ServerTemplateSelected;
import org.jbpm.console.ng.pr.model.events.ProcessInstanceSelectionEvent;
import org.jbpm.dashboard.renderer.client.panel.events.ProcessDashboardFocusEvent;
import org.jbpm.dashboard.renderer.client.panel.events.TaskDashboardFocusEvent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import org.dashbuilder.displayer.client.DisplayerLocator;
import org.dashbuilder.renderer.client.metric.MetricDisplayer;
import org.dashbuilder.renderer.client.table.TableDisplayer;
import org.jbpm.console.ng.gc.client.menu.ServerTemplateSelected;
import org.jbpm.console.ng.ga.events.ServerTemplateSelected;
import org.jbpm.console.ng.ht.model.events.TaskSelectionEvent;
import org.jbpm.dashboard.renderer.client.panel.events.ProcessDashboardFocusEvent;
import org.jbpm.dashboard.renderer.client.panel.events.TaskDashboardFocusEvent;
Expand Down
Loading

0 comments on commit f636ae0

Please sign in to comment.