Skip to content

Commit

Permalink
added kie-server-extensions examples
Browse files Browse the repository at this point in the history
  • Loading branch information
mswiderski committed Dec 3, 2015
1 parent 3dae76b commit 864ca76
Show file tree
Hide file tree
Showing 22 changed files with 1,004 additions and 0 deletions.
33 changes: 33 additions & 0 deletions kie-server-extensions/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
bin/
/target
/local

# Eclipse, Netbeans and IntelliJ files
/.*
!.gitignore
/nbproject
/*.ipr
/*.iws
/*.iml

# Repository wide ignore mac DS_Store files
.DS_Store

# Original jbpm ignores
*~

# Test info
/settings*.xml
/lib-jdbc/
bitronix-default-config.properties
*.db
*.tlog

# modules that don't exist in this branch
/jbpm-human-task-war/
/jbpm-bam/
/jbpm-gwt/

# files used for external db testing
jdbc_driver.jar
db-settings.xml
33 changes: 33 additions & 0 deletions kie-server-extensions/kie-server-drools-mina/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
bin/
/target
/local

# Eclipse, Netbeans and IntelliJ files
/.*
!.gitignore
/nbproject
/*.ipr
/*.iws
/*.iml

# Repository wide ignore mac DS_Store files
.DS_Store

# Original jbpm ignores
*~

# Test info
/settings*.xml
/lib-jdbc/
bitronix-default-config.properties
*.db
*.tlog

# modules that don't exist in this branch
/jbpm-human-task-war/
/jbpm-bam/
/jbpm-gwt/

# files used for external db testing
jdbc_driver.jar
db-settings.xml
67 changes: 67 additions & 0 deletions kie-server-extensions/kie-server-drools-mina/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.kie.server.ext</groupId>
<artifactId>kie-server-extensions</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>kie-server-drools-mina</artifactId>
<name>KIE Server Extensions with Apache Mina</name>

<properties>
<version.org.kie>6.4.0-SNAPSHOT</version.org.kie>
</properties>

<dependencies>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${version.org.kie}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-internal</artifactId>
<version>${version.org.kie}</version>
</dependency>

<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server-api</artifactId>
<version>${version.org.kie}</version>
</dependency>
<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server-services-common</artifactId>
<version>${version.org.kie}</version>
</dependency>
<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server-services-drools</artifactId>
<version>${version.org.kie}</version>
</dependency>

<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${version.org.kie}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${version.org.kie}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>

<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.9</version>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package org.kie.server.ext.mina;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.kie.server.services.api.KieContainerCommandService;
import org.kie.server.services.api.KieContainerInstance;
import org.kie.server.services.api.KieServerExtension;
import org.kie.server.services.api.KieServerRegistry;
import org.kie.server.services.api.SupportedTransports;
import org.kie.server.services.impl.KieServerImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MinaDroolsKieServerExtension implements KieServerExtension {

private static final Logger logger = LoggerFactory.getLogger(MinaDroolsKieServerExtension.class);

public static final String EXTENSION_NAME = "Drools-Mina";

private static final Boolean disabled = Boolean.parseBoolean(System.getProperty("org.kie.server.drools-mina.ext.disabled", "false"));
private static final String MINA_HOST = System.getProperty("org.kie.server.drools-mina.ext.port", "localhost");
private static final int MINA_PORT = Integer.parseInt(System.getProperty("org.kie.server.drools-mina.ext.port", "9123"));

// taken from dependency - Drools extension
private KieContainerCommandService batchCommandService;

// mina specific
private IoAcceptor acceptor;

public boolean isActive() {
return disabled == false;
}

public void init(KieServerImpl kieServer, KieServerRegistry registry) {

KieServerExtension droolsExtension = registry.getServerExtension("Drools");
if (droolsExtension == null) {
logger.warn("No Drools extension available, quiting...");
return;
}

List<Object> droolsServices = droolsExtension.getServices();
for( Object object : droolsServices ) {
// in case given service is null (meaning was not configured) continue with next one
if (object == null) {
continue;
}
if( KieContainerCommandService.class.isAssignableFrom(object.getClass()) ) {
batchCommandService = (KieContainerCommandService) object;
continue;
}
}
if (batchCommandService != null) {
acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

acceptor.setHandler( new TextBasedIoHandlerAdapter(batchCommandService) );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
try {
acceptor.bind( new InetSocketAddress(MINA_HOST, MINA_PORT) );

logger.info("{} -- Mina server started at {} and port {}", toString(), MINA_HOST, MINA_PORT);
} catch (IOException e) {
logger.error("Unable to start Mina acceptor due to {}", e.getMessage(), e);
}

}
}

public void destroy(KieServerImpl kieServer, KieServerRegistry registry) {
if (acceptor != null) {
acceptor.dispose();
acceptor = null;
}
logger.info("{} -- Mina server stopped", toString());
}

public void createContainer(String id, KieContainerInstance kieContainerInstance, Map<String, Object> parameters) {
// no op - it's already handled by Drools extension

}

public void disposeContainer(String id, KieContainerInstance kieContainerInstance, Map<String, Object> parameters) {
// no op - it's already handled by Drools extension

}

public List<Object> getAppComponents(SupportedTransports type) {
// nothing for supported transports (REST or JMS)
return Collections.emptyList();
}

public <T> T getAppComponents(Class<T> serviceType) {

return null;
}

public String getImplementedCapability() {
return "BRM-Mina";
}

public List<Object> getServices() {
return Collections.emptyList();
}

public String getExtensionName() {
return EXTENSION_NAME;
}

public Integer getStartOrder() {
return 20;
}

@Override
public String toString() {
return EXTENSION_NAME + " KIE Server extension";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.kie.server.ext.mina;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.services.api.KieContainerCommandService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class TextBasedIoHandlerAdapter extends IoHandlerAdapter {

private static final Logger logger = LoggerFactory.getLogger(TextBasedIoHandlerAdapter.class);

private KieContainerCommandService batchCommandService;

public TextBasedIoHandlerAdapter(KieContainerCommandService batchCommandService) {
this.batchCommandService = batchCommandService;
}

@Override
public void messageReceived( IoSession session, Object message ) throws Exception {
String completeMessage = message.toString();
logger.debug("Received message '{}'", completeMessage);
if( completeMessage.trim().equalsIgnoreCase("quit") || completeMessage.trim().equalsIgnoreCase("exit") ) {
session.close(false);
return;
}

String[] elements = completeMessage.split("\\|");
logger.debug("Container id {}", elements[0]);
try {
ServiceResponse<String> result = batchCommandService.callContainer(elements[0], elements[1], MarshallingFormat.JSON, null);

if (result.getType().equals(ServiceResponse.ResponseType.SUCCESS)) {
session.write(result.getResult());
logger.debug("Successful message written with content '{}'", result.getResult());
} else {
session.write(result.getMsg());
logger.debug("Failure message written with content '{}'", result.getMsg());
}
} catch (Exception e) {

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.kie.server.ext.mina.MinaDroolsKieServerExtension
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.kie.server.ext.mina;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import org.junit.Ignore;
import org.junit.Test;

/**
* make sure your KIE Server has deployed container named 'demo' that is
* built from https://github.com/mswiderski/bpm-projects/tree/master/kie-server-demo
*/
@Ignore("Requires running server")
public class MinaKieServerTest {

private static final String MINA_HOST = System.getProperty("org.kie.server.drools-mina.ext.port", "localhost");
private static final int MINA_PORT = Integer.parseInt(System.getProperty("org.kie.server.drools-mina.ext.port", "9123"));

@Test
public void testSimpleKieServiceInteractionOverMina() throws Exception {

String containerId = "demo";
String jsonContent = "{\"lookup\":\"defaultKieSession\",\"commands\":[{\"fire-all-rules\":\"\"}]}";

Socket minaSocket = null;
PrintWriter out = null;
BufferedReader in = null;

try {
minaSocket = new Socket(MINA_HOST, MINA_PORT);
out = new PrintWriter(minaSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(minaSocket.getInputStream()));
} catch (IOException e) {
return;
}

out.println(containerId + "|" + jsonContent);
// wait for the first line
System.out.println(in.readLine());
// and then continue as long as it's available
while (in.ready()) {
System.out.println(in.readLine());
}

out.close();
in.close();
minaSocket.close();

}
}
Loading

0 comments on commit 864ca76

Please sign in to comment.