/**
* Copyright 2010 JBoss Inc
*
* 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.drools.grid.task;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import junit.framework.Assert;
import org.apache.commons.collections.map.HashedMap;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactoryService;
import org.drools.SystemEventListenerFactory;
import org.drools.grid.GenericNodeConnector;
import org.drools.grid.internal.GenericMessageHandlerImpl;
import org.drools.grid.internal.NodeData;
import org.drools.grid.remote.mina.MinaAcceptor;
import org.drools.grid.remote.mina.MinaIoHandler;
import org.drools.grid.remote.mina.RemoteMinaNodeConnector;
import org.drools.grid.strategies.ReturnAlwaysTheFirstSelectionStrategy;
import org.drools.io.impl.ClassPathResource;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.task.Group;
import org.drools.task.MockUserInfo;
import org.drools.task.User;
import org.drools.task.service.SendIcal;
import org.drools.task.service.TaskService;
import org.drools.task.service.TaskServiceSession;
import org.junit.After;
import org.junit.Before;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.compiler.ExpressionCompiler;
public class CommandBasedServicesWSHumanTaskHandlerTest extends BaseTaskServiceTest {
private MinaAcceptor server;
private MinaAcceptor humanTaskServer;
//private NodeConnector nodeConnection;
protected EntityManagerFactory emf;
protected static TaskService taskService;
protected TaskServiceSession taskSession;
protected GenericNodeConnector htMinaClient;
protected GenericNodeConnector minaClient;
@Before
public void setUpTaskService() throws Exception {
Properties conf = new Properties();
conf.setProperty( "mail.smtp.host",
"localhost" );
conf.setProperty( "mail.smtp.port",
"2345" );
conf.setProperty( "from",
"from@domain.com" );
conf.setProperty( "replyTo",
"replyTo@domain.com" );
conf.setProperty( "defaultLanguage",
"en-UK" );
SendIcal.initInstance( conf );
// Use persistence.xml configuration
this.emf = Persistence.createEntityManagerFactory( "org.drools.task" );
taskService = new TaskService( this.emf,
SystemEventListenerFactory.getSystemEventListener() );
this.taskSession = taskService.createSession();
MockUserInfo userInfo = new MockUserInfo();
taskService.setUserinfo( userInfo );
Map vars = new HashedMap();
Reader reader = null;
try {
reader = new InputStreamReader( new ClassPathResource( "org/drools/task/LoadUsers.mvel" ).getInputStream() );
this.users = (Map<String, User>) eval( reader,
vars );
for ( User user : this.users.values() ) {
this.taskSession.addUser( user );
}
} finally {
if ( reader != null ) {
reader.close();
}
reader = null;
}
try {
reader = new InputStreamReader( new ClassPathResource( "org/drools/task/LoadGroups.mvel" ).getInputStream() );
this.groups = (Map<String, Group>) eval( reader,
vars );
for ( Group group : this.groups.values() ) {
this.taskSession.addGroup( group );
}
} finally {
if ( reader != null ) {
reader.close();
}
}
SocketAddress address = new InetSocketAddress( "127.0.0.1",
9123 );
NodeData nodeData = new NodeData();
// Setup Execution Node Server
SocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener(),
new GenericMessageHandlerImpl( nodeData,
SystemEventListenerFactory.getSystemEventListener() ) ) );
this.server = new MinaAcceptor( acceptor,
address );
this.server.start();
Thread.sleep( 5000 );
// End Execution Server
// Human task Server configuration
SocketAddress htAddress = new InetSocketAddress( "127.0.0.1",
9124 );
SocketAcceptor htAcceptor = new NioSocketAcceptor();
htAcceptor.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener(),
new TaskServerMessageHandlerImpl( taskService,
SystemEventListenerFactory.getSystemEventListener() ) ) );
this.humanTaskServer = new MinaAcceptor( htAcceptor,
htAddress );
this.humanTaskServer.start();
Thread.sleep( 5000 );
// End Human task Server configuration
// setup the ht client
NioSocketConnector htclientConnector = new NioSocketConnector();
htclientConnector.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener() ) );
this.htMinaClient = new RemoteMinaHumanTaskConnector( "client ht",
"127.0.0.1",
9124,
SystemEventListenerFactory.getSystemEventListener() );
// setup RemoteService client
NioSocketConnector clientConnector = new NioSocketConnector();
clientConnector.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener() ) );
this.minaClient = new RemoteMinaNodeConnector( "client SM",
"127.0.0.1",
9123,
SystemEventListenerFactory.getSystemEventListener() );
this.connection.addExecutionNode( this.minaClient );
this.connection.addHumanTaskNode( this.htMinaClient );
this.node = this.connection.getExecutionNode( new ReturnAlwaysTheFirstSelectionStrategy() );
KnowledgeBase kbase = this.node.get( KnowledgeBaseFactoryService.class ).newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
this.humanTaskClient = this.connection.getHumanTaskNode().get( HumanTaskService.class );
this.handler = new CommandBasedServicesWSHumanTaskHandler( ksession );
}
@After
public void tearDown() throws Exception {
Thread.sleep( 3000 );
this.connection.dispose();
this.humanTaskClient.disconnect();
Assert.assertEquals( 0,
this.server.getCurrentSessions() );
this.handler.dispose();
this.server.stop();
Assert.assertEquals( 0,
this.humanTaskServer.getCurrentSessions() );
this.humanTaskServer.stop();
this.taskSession.dispose();
this.emf.close();
}
public Object eval(Reader reader,
Map vars) {
try {
return eval( toString( reader ),
vars );
} catch ( IOException e ) {
throw new RuntimeException( "Exception Thrown",
e );
}
}
public String toString(Reader reader) throws IOException {
StringBuilder sb = new StringBuilder( 1024 );
int charValue;
while ( (charValue = reader.read()) != -1 ) {
sb.append( (char) charValue );
}
return sb.toString();
}
public Object eval(String str,
Map vars) {
ExpressionCompiler compiler = new ExpressionCompiler( str.trim() );
ParserContext context = new ParserContext();
context.addPackageImport( "org.drools.task" );
context.addPackageImport( "org.drools.task.service" );
context.addPackageImport( "org.drools.task.query" );
context.addPackageImport( "java.util" );
vars.put( "now",
new Date() );
return MVEL.executeExpression( compiler.compile( context ),
vars );
}
}