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