Skip to content

Commit

Permalink
Kie server for workbench dataset (kiegroup#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.
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
@@ -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);
}
});
}

}
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");
}

}
}
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
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
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

0 comments on commit f636ae0

Please sign in to comment.