diff --git a/kie-server-extensions/.gitignore b/kie-server-extensions/.gitignore new file mode 100644 index 0000000..67f7295 --- /dev/null +++ b/kie-server-extensions/.gitignore @@ -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 diff --git a/kie-server-extensions/kie-server-drools-mina/.gitignore b/kie-server-extensions/kie-server-drools-mina/.gitignore new file mode 100644 index 0000000..67f7295 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/.gitignore @@ -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 diff --git a/kie-server-extensions/kie-server-drools-mina/pom.xml b/kie-server-extensions/kie-server-drools-mina/pom.xml new file mode 100644 index 0000000..1d035dc --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/pom.xml @@ -0,0 +1,67 @@ + + 4.0.0 + + org.kie.server.ext + kie-server-extensions + 1.0.0 + + kie-server-drools-mina + KIE Server Extensions with Apache Mina + + + 6.4.0-SNAPSHOT + + + + + org.kie + kie-api + ${version.org.kie} + + + org.kie + kie-internal + ${version.org.kie} + + + + org.kie.server + kie-server-api + ${version.org.kie} + + + org.kie.server + kie-server-services-common + ${version.org.kie} + + + org.kie.server + kie-server-services-drools + ${version.org.kie} + + + + org.drools + drools-core + ${version.org.kie} + + + org.drools + drools-compiler + ${version.org.kie} + + + org.slf4j + slf4j-api + 1.7.2 + + + + org.apache.mina + mina-core + 2.0.9 + + + + \ No newline at end of file diff --git a/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/MinaDroolsKieServerExtension.java b/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/MinaDroolsKieServerExtension.java new file mode 100644 index 0000000..48a55e4 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/MinaDroolsKieServerExtension.java @@ -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 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 parameters) { + // no op - it's already handled by Drools extension + + } + + public void disposeContainer(String id, KieContainerInstance kieContainerInstance, Map parameters) { + // no op - it's already handled by Drools extension + + } + + public List getAppComponents(SupportedTransports type) { + // nothing for supported transports (REST or JMS) + return Collections.emptyList(); + } + + public T getAppComponents(Class serviceType) { + + return null; + } + + public String getImplementedCapability() { + return "BRM-Mina"; + } + + public List 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"; + } +} diff --git a/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/TextBasedIoHandlerAdapter.java b/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/TextBasedIoHandlerAdapter.java new file mode 100644 index 0000000..91806c5 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/src/main/java/org/kie/server/ext/mina/TextBasedIoHandlerAdapter.java @@ -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 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) { + + } + } +} diff --git a/kie-server-extensions/kie-server-drools-mina/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerExtension b/kie-server-extensions/kie-server-drools-mina/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerExtension new file mode 100644 index 0000000..60c0788 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerExtension @@ -0,0 +1 @@ +org.kie.server.ext.mina.MinaDroolsKieServerExtension \ No newline at end of file diff --git a/kie-server-extensions/kie-server-drools-mina/src/test/java/org/kie/server/ext/mina/MinaKieServerTest.java b/kie-server-extensions/kie-server-drools-mina/src/test/java/org/kie/server/ext/mina/MinaKieServerTest.java new file mode 100644 index 0000000..5e5e79b --- /dev/null +++ b/kie-server-extensions/kie-server-drools-mina/src/test/java/org/kie/server/ext/mina/MinaKieServerTest.java @@ -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(); + + } +} diff --git a/kie-server-extensions/kie-server-drools-rest-ext/.gitignore b/kie-server-extensions/kie-server-drools-rest-ext/.gitignore new file mode 100644 index 0000000..67f7295 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-rest-ext/.gitignore @@ -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 diff --git a/kie-server-extensions/kie-server-drools-rest-ext/pom.xml b/kie-server-extensions/kie-server-drools-rest-ext/pom.xml new file mode 100644 index 0000000..8ad5dec --- /dev/null +++ b/kie-server-extensions/kie-server-drools-rest-ext/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + + org.kie.server.ext + kie-server-extensions + 1.0.0 + + kie-server-drools-rest-ext + KIE Server Drools Custom REST extension + + + 6.4.0-SNAPSHOT + + + + + org.kie + kie-api + ${version.org.kie} + + + org.kie + kie-internal + ${version.org.kie} + + + + org.kie.server + kie-server-api + ${version.org.kie} + + + org.kie.server + kie-server-services-common + ${version.org.kie} + + + org.kie.server + kie-server-services-drools + ${version.org.kie} + + + + org.kie.server + kie-server-rest-common + ${version.org.kie} + + + + org.drools + drools-core + ${version.org.kie} + + + org.drools + drools-compiler + ${version.org.kie} + + + org.slf4j + slf4j-api + 1.7.2 + + + + \ No newline at end of file diff --git a/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CusomtDroolsKieServerApplicationComponentsService.java b/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CusomtDroolsKieServerApplicationComponentsService.java new file mode 100644 index 0000000..f9a8ab9 --- /dev/null +++ b/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CusomtDroolsKieServerApplicationComponentsService.java @@ -0,0 +1,45 @@ +package org.kie.server.ext.drools.rest; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.kie.server.services.api.KieServerApplicationComponentsService; +import org.kie.server.services.api.KieServerRegistry; +import org.kie.server.services.api.SupportedTransports; +import org.kie.server.services.drools.RulesExecutionService; + + +public class CusomtDroolsKieServerApplicationComponentsService implements KieServerApplicationComponentsService { + + private static final String OWNER_EXTENSION = "Drools"; + + public Collection getAppComponents(String extension, SupportedTransports type, Object... services) { + // skip calls from other than owning extension + if ( !OWNER_EXTENSION.equals(extension) ) { + return Collections.emptyList(); + } + + RulesExecutionService rulesExecutionService = null; + KieServerRegistry context = null; + + for( Object object : services ) { + if( RulesExecutionService.class.isAssignableFrom(object.getClass()) ) { + rulesExecutionService = (RulesExecutionService) object; + continue; + } else if( KieServerRegistry.class.isAssignableFrom(object.getClass()) ) { + context = (KieServerRegistry) object; + continue; + } + } + + List components = new ArrayList(1); + if( SupportedTransports.REST.equals(type) ) { + components.add(new CustomResource(rulesExecutionService, context)); + } + + return components; + } + +} diff --git a/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CustomResource.java b/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CustomResource.java new file mode 100644 index 0000000..f7db4db --- /dev/null +++ b/kie-server-extensions/kie-server-drools-rest-ext/src/main/java/org/kie/server/ext/drools/rest/CustomResource.java @@ -0,0 +1,100 @@ +package org.kie.server.ext.drools.rest; + +import static org.kie.server.remote.rest.common.util.RestUtils.createResponse; +import static org.kie.server.remote.rest.common.util.RestUtils.getContentType; +import static org.kie.server.remote.rest.common.util.RestUtils.getVariant; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Variant; + +import org.kie.api.KieServices; +import org.kie.api.command.BatchExecutionCommand; +import org.kie.api.command.Command; +import org.kie.api.command.KieCommands; +import org.kie.api.runtime.ExecutionResults; +import org.kie.server.api.marshalling.Marshaller; +import org.kie.server.api.marshalling.MarshallingFormat; +import org.kie.server.services.api.KieContainerInstance; +import org.kie.server.services.api.KieServerRegistry; +import org.kie.server.services.drools.RulesExecutionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Path("server/containers/instances/{id}/ksession") +public class CustomResource { + + private static final Logger logger = LoggerFactory.getLogger(CustomResource.class); + + private KieCommands commandsFactory = KieServices.Factory.get().getCommands(); + + private RulesExecutionService rulesExecutionService; + private KieServerRegistry registry; + + public CustomResource() { + + } + + public CustomResource(RulesExecutionService rulesExecutionService, KieServerRegistry registry) { + this.rulesExecutionService = rulesExecutionService; + this.registry = registry; + } + + @POST + @Path("/{ksessionId}") + @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + public Response insertFireReturn(@Context HttpHeaders headers, + @PathParam("id") String id, + @PathParam("ksessionId") String ksessionId, + String cmdPayload) { + + Variant v = getVariant(headers); + String contentType = getContentType(headers); + + MarshallingFormat format = MarshallingFormat.fromType(contentType); + if (format == null) { + format = MarshallingFormat.valueOf(contentType); + } + try { + KieContainerInstance kci = registry.getContainer(id); + + Marshaller marshaller = kci.getMarshaller(format); + + List listOfFacts = marshaller.unmarshall(cmdPayload, List.class); + + List> commands = new ArrayList>(); + BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands, ksessionId); + + for (Object fact : listOfFacts) { + commands.add(commandsFactory.newInsert(fact, fact.toString())); + } + commands.add(commandsFactory.newFireAllRules()); + commands.add(commandsFactory.newGetObjects()); + + ExecutionResults results = rulesExecutionService.call(kci, executionCommand); + + String result = marshaller.marshall(results); + + + logger.debug("Returning OK response with content '{}'", result); + return createResponse(result, v, Response.Status.OK); + } catch (Exception e) { + // in case marshalling failed return the call container response to keep backward compatibility + String response = "Execution failed with error : " + e.getMessage(); + logger.debug("Returning Failure response with content '{}'", response); + return createResponse(response, v, Response.Status.INTERNAL_SERVER_ERROR); + } + + } +} diff --git a/kie-server-extensions/kie-server-drools-rest-ext/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerApplicationComponentsService b/kie-server-extensions/kie-server-drools-rest-ext/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerApplicationComponentsService new file mode 100644 index 0000000..88e1c8d --- /dev/null +++ b/kie-server-extensions/kie-server-drools-rest-ext/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerApplicationComponentsService @@ -0,0 +1 @@ +org.kie.server.ext.drools.rest.CusomtDroolsKieServerApplicationComponentsService \ No newline at end of file diff --git a/kie-server-extensions/kie-server-mina-client/.gitignore b/kie-server-extensions/kie-server-mina-client/.gitignore new file mode 100644 index 0000000..67f7295 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/.gitignore @@ -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 diff --git a/kie-server-extensions/kie-server-mina-client/pom.xml b/kie-server-extensions/kie-server-mina-client/pom.xml new file mode 100644 index 0000000..d808ee5 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + + org.kie.server.ext + kie-server-extensions + 1.0.0 + + kie-server-mina-client + KIE Server Mina Client + + + 6.4.0-SNAPSHOT + + + + + org.kie.server + kie-server-api + ${version.org.kie} + + + + org.kie.server + kie-server-client + ${version.org.kie} + + + + org.drools + drools-compiler + ${version.org.kie} + + + \ No newline at end of file diff --git a/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/MinaClientBuilderImpl.java b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/MinaClientBuilderImpl.java new file mode 100644 index 0000000..2a8f726 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/MinaClientBuilderImpl.java @@ -0,0 +1,24 @@ +package org.kie.server.ext.mina.client; + +import java.util.HashMap; +import java.util.Map; + +import org.kie.server.client.KieServicesConfiguration; +import org.kie.server.client.helper.KieServicesClientBuilder; + + +public class MinaClientBuilderImpl implements KieServicesClientBuilder { + + public String getImplementedCapability() { + return "BRM-Mina"; + } + + public Map, Object> build(KieServicesConfiguration configuration, ClassLoader classLoader) { + Map, Object> services = new HashMap, Object>(); + + services.put(RulesMinaServicesClient.class, new RulesMinaServicesClientImpl(configuration, classLoader)); + + return services; + } + +} diff --git a/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClient.java b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClient.java new file mode 100644 index 0000000..188f199 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClient.java @@ -0,0 +1,8 @@ +package org.kie.server.ext.mina.client; + +import org.kie.server.client.RuleServicesClient; + + +public interface RulesMinaServicesClient extends RuleServicesClient { + +} diff --git a/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClientImpl.java b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClientImpl.java new file mode 100644 index 0000000..13b4e57 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/main/java/org/kie/server/ext/mina/client/RulesMinaServicesClientImpl.java @@ -0,0 +1,92 @@ +package org.kie.server.ext.mina.client; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; + +import org.kie.api.command.Command; +import org.kie.server.api.marshalling.Marshaller; +import org.kie.server.api.marshalling.MarshallerFactory; +import org.kie.server.api.marshalling.MarshallingFormat; +import org.kie.server.api.model.ServiceResponse; +import org.kie.server.api.model.ServiceResponse.ResponseType; +import org.kie.server.client.KieServicesConfiguration; +import org.kie.server.client.KieServicesException; + + +public class RulesMinaServicesClientImpl implements RulesMinaServicesClient { + + private String host; + private Integer port; + + private Marshaller marshaller; + + public RulesMinaServicesClientImpl(KieServicesConfiguration configuration, ClassLoader classloader) { + String[] serverDetails = configuration.getServerUrl().split(":"); + + this.host = serverDetails[0]; + this.port = Integer.parseInt(serverDetails[1]); + + this.marshaller = MarshallerFactory.getMarshaller(configuration.getExtraJaxbClasses(), MarshallingFormat.JSON, classloader); + } + + public ServiceResponse executeCommands(String id, String payload) { + + try { + String response = sendReceive(id, payload); + if (response.startsWith("{")) { + return new ServiceResponse(ResponseType.SUCCESS, null, response); + } else { + return new ServiceResponse(ResponseType.FAILURE, response); + } + } catch (Exception e) { + throw new KieServicesException("Unable to send request to KIE Server", e); + } + } + + public ServiceResponse executeCommands(String id, Command cmd) { + try { + String response = sendReceive(id, marshaller.marshall(cmd)); + if (response.startsWith("{")) { + return new ServiceResponse(ResponseType.SUCCESS, null, response); + } else { + return new ServiceResponse(ResponseType.FAILURE, response); + } + } catch (Exception e) { + throw new KieServicesException("Unable to send request to KIE Server", e); + } + } + + protected String sendReceive(String containerId, String content) throws Exception { + + // content - flatten the content to be single line + content = content.replaceAll("\\n", ""); + + Socket minaSocket = null; + PrintWriter out = null; + BufferedReader in = null; + + StringBuffer data = new StringBuffer(); + try { + minaSocket = new Socket(host, port); + out = new PrintWriter(minaSocket.getOutputStream(), true); + in = new BufferedReader(new InputStreamReader(minaSocket.getInputStream())); + + // prepare and send data + out.println(containerId + "|" + content); + // wait for the first line + data.append(in.readLine()); + // and then continue as long as it's available + while (in.ready()) { + data.append(in.readLine()); + } + + return data.toString(); + } finally { + out.close(); + in.close(); + minaSocket.close(); + } + } +} diff --git a/kie-server-extensions/kie-server-mina-client/src/main/resources/META-INF/services/org.kie.server.client.helper.KieServicesClientBuilder b/kie-server-extensions/kie-server-mina-client/src/main/resources/META-INF/services/org.kie.server.client.helper.KieServicesClientBuilder new file mode 100644 index 0000000..bace73b --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/main/resources/META-INF/services/org.kie.server.client.helper.KieServicesClientBuilder @@ -0,0 +1 @@ +org.kie.server.ext.mina.client.MinaClientBuilderImpl \ No newline at end of file diff --git a/kie-server-extensions/kie-server-mina-client/src/test/java/org/jbpm/test/Person.java b/kie-server-extensions/kie-server-mina-client/src/test/java/org/jbpm/test/Person.java new file mode 100644 index 0000000..4b6fbf7 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/test/java/org/jbpm/test/Person.java @@ -0,0 +1,54 @@ +package org.jbpm.test; + +/** + * This class was automatically generated by the data modeler tool. + */ + +public class Person implements java.io.Serializable { + + static final long serialVersionUID = 1L; + + private String name; + private String address; + private int age; + private boolean registered; + + public Person() { + } + + public void setName(String name) { + this.name = name; + } + + public void setAddress(String address) { + this.address = address; + } + + public void setAge(int age) { + this.age = age; + } + + public void setRegistered(boolean registered) { + this.registered = registered; + } + + public String getName() { + return this.name; + } + + public String getAddress() { + return this.address; + } + + public int getAge() { + return this.age; + } + + public boolean isRegistered() { + return this.registered; + } + + public String toString() { + return "Person {Name="+name+", addess=" + address+", age="+age+",registered="+registered+"}"; + } +} \ No newline at end of file diff --git a/kie-server-extensions/kie-server-mina-client/src/test/java/org/kie/server/ext/mina/client/RulesMinaServicesClientTest.java b/kie-server-extensions/kie-server-mina-client/src/test/java/org/kie/server/ext/mina/client/RulesMinaServicesClientTest.java new file mode 100644 index 0000000..e26ca82 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/test/java/org/kie/server/ext/mina/client/RulesMinaServicesClientTest.java @@ -0,0 +1,118 @@ +package org.kie.server.ext.mina.client; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.drools.core.runtime.impl.ExecutionResultImpl; +import org.jbpm.test.Person; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.kie.api.KieServices; +import org.kie.api.command.BatchExecutionCommand; +import org.kie.api.command.Command; +import org.kie.api.command.KieCommands; +import org.kie.server.api.marshalling.Marshaller; +import org.kie.server.api.marshalling.MarshallerFactory; +import org.kie.server.api.marshalling.MarshallingFormat; +import org.kie.server.api.model.ServiceResponse; +import org.kie.server.api.model.ServiceResponse.ResponseType; +import org.kie.server.client.KieServicesClient; +import org.kie.server.client.KieServicesConfiguration; +import org.kie.server.client.KieServicesFactory; +/** + * 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 RulesMinaServicesClientTest { + + protected static KieCommands commandsFactory; + protected static Set> extraClasses = new HashSet>(); + private String containerId = "demo"; + private String jsonContent = "{\"lookup\":\"defaultKieSession\",\"commands\":[{\"insert\":{\"out-identifier\" : \"person\", \"object\":{\"org.jbpm.test.Person\":{\"name\":\"mary\",\"age\":25}}}},{\"fire-all-rules\":\"\"}]}"; + + @BeforeClass + public static void setupFactory() throws Exception { + commandsFactory = KieServices.Factory.get().getCommands(); + extraClasses.add(Person.class); + } + + protected RulesMinaServicesClient buildClient() { + KieServicesConfiguration configuration = KieServicesFactory.newRestConfiguration("localhost:9123", null, null); + List capabilities = new ArrayList(); + // we need to add explicitly capabilities as the mina client does not respond to get server info requests. + capabilities.add("BRM-Mina"); + + configuration.setCapabilities(capabilities); + configuration.setMarshallingFormat(MarshallingFormat.JSON); + + configuration.addJaxbClasses(extraClasses); + + KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(configuration); + + RulesMinaServicesClient rulesClient = kieServicesClient.getServicesClient(RulesMinaServicesClient.class); + + return rulesClient; + } + @Test + public void testClientCallContainerString() { + RulesMinaServicesClient rulesClient = buildClient(); + + ServiceResponse response = rulesClient.executeCommands(containerId, jsonContent); + Assert.assertNotNull(response); + + Assert.assertEquals(ResponseType.SUCCESS, response.getType()); + + String data = response.getResult(); + + Marshaller marshaller = MarshallerFactory.getMarshaller(extraClasses, MarshallingFormat.JSON, this.getClass().getClassLoader()); + + ExecutionResultImpl results = marshaller.unmarshall(data, ExecutionResultImpl.class); + Assert.assertNotNull(results); + + Object personResult = results.getValue("person"); + Assert.assertTrue(personResult instanceof Person); + + Assert.assertEquals("mary", ((Person) personResult).getName()); + Assert.assertEquals("JBoss Community", ((Person) personResult).getAddress()); + Assert.assertEquals(true, ((Person) personResult).isRegistered()); + } + + @Test + public void testClientCallContainerObject() { + + RulesMinaServicesClient rulesClient = buildClient(); + + List> commands = new ArrayList>(); + BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands, "defaultKieSession"); + + Person person = new Person(); + person.setName("mary"); + commands.add(commandsFactory.newInsert(person, "person")); + commands.add(commandsFactory.newFireAllRules("fired")); + + ServiceResponse response = rulesClient.executeCommands(containerId, executionCommand); + Assert.assertNotNull(response); + + Assert.assertEquals(ResponseType.SUCCESS, response.getType()); + + String data = response.getResult(); + + Marshaller marshaller = MarshallerFactory.getMarshaller(extraClasses, MarshallingFormat.JSON, this.getClass().getClassLoader()); + + ExecutionResultImpl results = marshaller.unmarshall(data, ExecutionResultImpl.class); + Assert.assertNotNull(results); + + Object personResult = results.getValue("person"); + Assert.assertTrue(personResult instanceof Person); + + Assert.assertEquals("mary", ((Person) personResult).getName()); + Assert.assertEquals("JBoss Community", ((Person) personResult).getAddress()); + Assert.assertEquals(true, ((Person) personResult).isRegistered()); + + } +} diff --git a/kie-server-extensions/kie-server-mina-client/src/test/resources/logback-test.xml b/kie-server-extensions/kie-server-mina-client/src/test/resources/logback-test.xml new file mode 100644 index 0000000..937b6a9 --- /dev/null +++ b/kie-server-extensions/kie-server-mina-client/src/test/resources/logback-test.xml @@ -0,0 +1,18 @@ + + + + + + + + %d [%t|%C] %-5p %m%n + + + + + + + + + + diff --git a/kie-server-extensions/pom.xml b/kie-server-extensions/pom.xml new file mode 100644 index 0000000..ea6b1f1 --- /dev/null +++ b/kie-server-extensions/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + org.kie.server.ext + kie-server-extensions + 1.0.0 + pom + KIE Server extension modules + + kie-server-drools-mina + kie-server-mina-client + kie-server-drools-rest-ext + + \ No newline at end of file