package org.drools.grid.time.impl;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.drools.grid.timer.impl.UuidJobHandle;
import org.drools.grid.timer.impl.ScheduledJob;
import java.net.InetSocketAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import junit.framework.Assert;
import org.drools.SystemEventListener;
import org.drools.SystemEventListenerFactory;
import org.drools.grid.conf.GridPeerServiceConfiguration;
import org.drools.grid.conf.impl.GridPeerConfiguration;
import org.drools.grid.internal.responsehandlers.BlockingMessageResponseHandler;
import org.drools.grid.io.Acceptor;
import org.drools.grid.io.Connector;
import org.drools.grid.io.Conversation;
import org.drools.grid.io.ConversationManager;
import org.drools.grid.io.Message;
import org.drools.grid.io.MessageReceiverHandler;
import org.drools.grid.io.impl.ConversationManagerImpl;
import org.drools.grid.remote.mina.MinaAcceptor;
import org.drools.grid.remote.mina.MinaConnector;
import org.drools.time.Job;
import org.drools.time.JobContext;
import org.drools.time.JobHandle;
import org.drools.time.TimerService;
import org.drools.time.Trigger;
import junit.framework.TestCase;
import org.drools.grid.CoreServicesLookup;
import org.drools.grid.Grid;
import org.drools.grid.GridServiceDescription;
import org.drools.grid.SocketService;
import org.drools.grid.impl.GridImpl;
import org.drools.grid.impl.MultiplexSocketServerImpl;
import org.drools.grid.io.impl.MultiplexSocketServiceCongifuration;
import org.drools.grid.remote.mina.MinaAcceptorFactoryService;
import org.drools.grid.service.directory.impl.CoreServicesLookupConfiguration;
import org.drools.grid.service.directory.impl.WhitePagesLocalConfiguration;
import org.drools.grid.service.directory.impl.WhitePagesRemoteConfiguration;
import org.drools.grid.service.directory.impl.WhitePagesSocketConfiguration;
import org.drools.grid.timer.impl.CoreServicesSchedulerConfiguration;
import org.drools.grid.timer.impl.RegisterSchedulerConfiguration;
import org.drools.grid.timer.impl.ScheduledJobConfiguration;
import org.drools.grid.timer.impl.SchedulerClient;
import org.drools.grid.timer.impl.SchedulerImpl;
import org.drools.grid.timer.impl.SchedulerLocalConfiguration;
import org.drools.grid.timer.impl.SchedulerRemoteConfiguration;
import org.drools.grid.timer.impl.SchedulerServiceConfiguration;
import org.drools.grid.timer.impl.SchedulerSocketConfiguration;
import org.drools.time.SchedulerService;
public class DistributedSchedulerTest extends TestCase {
private Acceptor acc = new MinaAcceptor();
private SystemEventListener l = SystemEventListenerFactory.getSystemEventListener();
private Map<String, GridServiceDescription> coreServicesMap;
@Override
public void setUp() {
}
@Override
public void tearDown() {
MockJob.counter = 0;
}
public void test1() {
}
// public void test1() throws Exception {
//
// MessageReceiverHandler accHandler = new MessageReceiverHandler() {
//
// private String id;
// private AtomicLong counter = new AtomicLong();
//
// public void messageReceived(Conversation conversation,
// Message msgIn) {
// conversation.respond( "echo: " + msgIn.getBody() );
// }
// };
//
// acc.open( new InetSocketAddress( "127.0.0.1",
// 5012 ),
// accHandler,
// l );
//
// Connector conn = new MinaConnector();
//
// ConversationManager cm = new ConversationManagerImpl( "s1",
// conn,
// l );
//
// Conversation cv = cm.startConversation( new InetSocketAddress( "127.0.0.1",
// 5012 ),
// "r1" );
//
// BlockingMessageResponseHandler blockHandler = new BlockingMessageResponseHandler();
//
// cv.sendMessage( "hello",
// blockHandler );
//
// Message msg = blockHandler.getMessage( 5000 );
// System.out.println( msg.getBody() );
// conn.close();
// acc.close();
// }
//
// public void testDistributedJobSchedullingLocal() {
//
// GridImpl grid = new GridImpl( new ConcurrentHashMap<String, Object>() );
// grid.addService( SchedulerService.class,
// new SchedulerImpl( "myLocalSched",
// grid ) );
//
// SchedulerService scheduler = grid.get( SchedulerService.class );
//
// UuidJobHandle handle = new UuidJobHandle();
// ScheduledJob sj1 = new ScheduledJob( handle,
// new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ),
// new ScheduledJobConfiguration( 1 ) );
// ScheduledJob sj2 = new ScheduledJob( handle,
// new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ),
// new ScheduledJobConfiguration( 1 ) );
//
// scheduler.scheduleJob( new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ) );
// //The Job Will be executed in 1 second
// try {
// Thread.sleep( 1000 );
// } catch ( InterruptedException ex ) {
// Logger.getLogger( DistributedSchedulerTest.class.getName() ).log( Level.SEVERE,
// null,
// ex );
// }
// assertEquals( 1,
// MockJob.counter );
//
// }
//
// /*
// * Test Including:
// * - 1 Core Service White Pages
// * - 1 Core Service Scheduler
// * - 1 MultiplexService
// * - 1 White Pages (Local)
// * - 1 Scheduler (Local)
// *
// */
// public void testDistributedJobSchedulingRemote() {
// //Core services Map Definition
// coreServicesMap = new HashMap<String, GridServiceDescription>();//Hazelcast.newHazelcastInstance( null ).getMap( CoreServicesLookup.class.getName() );
//
// //Grid View
// GridImpl grid1 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// //Configure grid with:
// // core whitepages
// // core scheduler
// // local whitepages
// // local scheduler
// // expose multiplex socket
// configureGrid1( grid1,
// 5012 );
//
// GridImpl grid2 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// Connector conn = new MinaConnector();
// configureGrid2( grid2,
// conn );
//
// //Create a Job
// UuidJobHandle handle = new UuidJobHandle();
// ScheduledJob sj1 = new ScheduledJob( handle,
// new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ),
// new ScheduledJobConfiguration( 1 ) );
//
// //From grid2 I get the Scheduler (that it's a client)
// SchedulerService scheduler = grid2.get( SchedulerService.class );
//
// //Schedule remotely the Job
// scheduler.scheduleJob( new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ) );
// try {
// Thread.sleep( 1000 );
// } catch ( InterruptedException ex ) {
// Logger.getLogger( DistributedSchedulerTest.class.getName() ).log( Level.SEVERE,
// null,
// ex );
// }
//
// assertEquals( 1,
// MockJob.counter );
//
// //Close the peer connection
// conn.close();
//
// //Shutdown the SocketService
// grid1.get( SocketService.class ).close();
//
// }
//
// public void testMultipleSchedulersTest() {
// //Core services Map Definition
// coreServicesMap = new HashMap<String, GridServiceDescription>();//Hazelcast.newHazelcastInstance( null ).getMap( CoreServicesLookup.class.getName() );
//
// //Grid View
// GridImpl grid1 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// configureGrid1( grid1,
// 5012 );
//
// GridImpl grid2 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// configureGrid1( grid2,
// 5013 );
//
// GridImpl grid3 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// Connector conn = new MinaConnector();
// configureGrid3( grid3,
// conn );
//
// CoreServicesLookup corewp = grid3.get( CoreServicesLookup.class );
//
// GridServiceDescription gsd = corewp.lookup( SchedulerService.class );
//
// Assert.assertEquals( 1,
// ((InetSocketAddress[]) gsd.getAddresses().values().iterator().next().getObject()).length );
//
// Assert.assertEquals( 2,
// ((InetSocketAddress[]) ((SchedulerServiceConfiguration) gsd.getData()).getServices( grid3 )).length );
//
// Assert.assertEquals( 0,
// MockJob.counter );
//
// conn.close();
// grid1.get( SocketService.class ).close();
// grid2.get( SocketService.class ).close();
//
// }
//
// public void testGetDataFromCoreServices() {
//
// coreServicesMap = new HashMap<String, GridServiceDescription>();//Hazelcast.newHazelcastInstance( null ).getMap( CoreServicesLookup.class.getName() );
//
// //Grid View
// GridImpl grid1 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// configureGrid1( grid1,
// 5012 );
//
// GridImpl grid2 = new GridImpl( new ConcurrentHashMap<String, Object>() );
// configureGrid1( grid2,
// 5013 );
//
// CoreServicesLookup corewp = grid1.get( CoreServicesLookup.class );
//
// //Get Scheduler Service
// GridServiceDescription gsd = corewp.lookup( SchedulerService.class );
//
// Assert.assertEquals( 1,
// ((InetSocketAddress[]) gsd.getAddresses().values().iterator().next().getObject()).length );
//
// Assert.assertEquals( 2,
// ((InetSocketAddress[]) ((SchedulerServiceConfiguration) gsd.getData()).getServices( grid1 )).length );
//
// Connector conn = new MinaConnector();
//
// ConversationManager cm = new ConversationManagerImpl( "s1",
// conn,
// l );
//
// SchedulerClient schedulerClient = new SchedulerClient( grid1,
// gsd,
// cm );
// ((SchedulerServiceConfiguration) gsd.getData()).setRedundancy( 3 );
//
// JobHandle handle = schedulerClient.scheduleJob( new MockJob(),
// new MockJobContext( "xxx" ),
// new MockTrigger( new Date( 1000 ) ) );
// try {
// Thread.sleep( 1000 );
// } catch ( InterruptedException ex ) {
// Logger.getLogger( DistributedSchedulerTest.class.getName() ).log( Level.SEVERE,
// null,
// ex );
// }
//
// assertEquals( 3,
// MockJob.counter );
//
// conn.close();
// grid1.get( SocketService.class ).close();
// grid2.get( SocketService.class ).close();
//
// }
//
// public static class MockJobContext
// implements
// JobContext,
// Serializable {
//
// private String text;
//
// public MockJobContext() {
// }
//
// public MockJobContext(String text) {
// this.text = text;
// }
//
// public JobHandle getJobHandle() {
// return null;
// }
//
// public void setJobHandle(JobHandle jobHandle) {
// }
//
// public String getText() {
// return this.text;
// }
// }
//
// public static class MockTrigger
// implements
// Trigger,
// Serializable {
//
// private Date date;
//
// public MockTrigger() {
// }
//
// public MockTrigger(Date date) {
// this.date = date;
//
// }
//
// public Date hasNextFireTime() {
// return this.date;
// }
//
// public Date nextFireTime() {
// Date tmp = new Date();
// tmp.setTime( this.date.getTime() );
// this.date = null;
// return tmp;
// }
// }
//
// public static class DisTimerService
// implements
// TimerService {
//
// public long getCurrentTime() {
// // TODO Auto-generated method stub
// return 0;
// }
//
// public long getTimeToNextJob() {
// // TODO Auto-generated method stub
// return 0;
// }
//
// public boolean removeJob(JobHandle jobHandle) {
// // TODO Auto-generated method stub
// return false;
// }
//
// public JobHandle scheduleJob(Job job,
// JobContext ctx,
// Trigger trigger) {
// // TODO Auto-generated method stub
// return null;
// }
//
// public void shutdown() {
// // TODO Auto-generated method stub
// }
// }
//
// public static class TimerServiceClusterManager {
//
// private String[] ids;
// private int redundancyCount;
//
// public void configure(String[] ids,
// int redundancyCount) {
// this.ids = ids;
// this.redundancyCount = redundancyCount;
// if ( redundancyCount >= ids.length ) {
// throw new IllegalArgumentException( "Redundancy must be less than or equal to to total-1" );
// }
// }
//
// private int indexOf(final int hashCode,
// final int dataSize) {
// return hashCode & (dataSize - 1);
// }
// }
//
// public static class RemoteTimerService
// implements
// TimerService {
//
// public long getCurrentTime() {
// throw new UnsupportedOperationException( "not supported" );
// }
//
// public long getTimeToNextJob() {
// throw new UnsupportedOperationException( "not supported" );
// }
//
// public boolean removeJob(JobHandle jobHandle) {
// return false;
// }
//
// public JobHandle scheduleJob(Job job,
// JobContext ctx,
// Trigger trigger) {
// UuidJobHandle jhandle = new UuidJobHandle();
//
// ScheduledJob sj = new ScheduledJob( jhandle,
// job,
// ctx,
// trigger );
// return jhandle;
// }
//
// public void shutdown() {
// throw new UnsupportedOperationException( "not supported" );
// }
// }
//
// private void configureGrid1(Grid grid,
// int port) {
//
// //Local Grid Configuration, for our client
// GridPeerConfiguration conf = new GridPeerConfiguration();
//
// //Configuring the Core Services White Pages
// GridPeerServiceConfiguration coreSeviceWPConf = new CoreServicesLookupConfiguration( coreServicesMap );
// conf.addConfiguration( coreSeviceWPConf );
//
// //Configuring the Core Services Scheduler
// GridPeerServiceConfiguration coreSeviceSchedulerConf = new CoreServicesSchedulerConfiguration();
// conf.addConfiguration( coreSeviceSchedulerConf );
//
// //Configuring the SocketService
// GridPeerServiceConfiguration socketConf = new MultiplexSocketServiceCongifuration( new MultiplexSocketServerImpl( "127.0.0.1",
// new MinaAcceptorFactoryService(),
// l ) );
// conf.addConfiguration( socketConf );
//
// //Configuring the WhitePages
// GridPeerServiceConfiguration wplConf = new WhitePagesLocalConfiguration();
// conf.addConfiguration( wplConf );
//
// //Exposing Local WhitePages
// GridPeerServiceConfiguration wpsc = new WhitePagesSocketConfiguration( port );
// conf.addConfiguration( wpsc );
// GridPeerServiceConfiguration registerwpincore = new RegisterWhitePagesConfiguration();
// conf.addConfiguration( registerwpincore );
//
// //Create a Local Scheduler
// GridPeerServiceConfiguration schlConf = new SchedulerLocalConfiguration( "myLocalSched" );
// conf.addConfiguration( schlConf );
//
// //Expose it to the Grid so it can be accesed by different nodes
// // I need to use the same port to reuse the service multiplexer
// GridPeerServiceConfiguration schlsc = new SchedulerSocketConfiguration( port );
// conf.addConfiguration( schlsc );
//
// GridPeerServiceConfiguration registerschedincore = new RegisterSchedulerConfiguration();
// conf.addConfiguration( registerschedincore );
//
// conf.configure( grid );
//
// }
//
// private void configureGrid2(Grid grid2,
// Connector conn) {
// GridPeerConfiguration conf = new GridPeerConfiguration();
//
// GridPeerServiceConfiguration coreSeviceWPConf = new CoreServicesLookupConfiguration( coreServicesMap );
// conf.addConfiguration( coreSeviceWPConf );
//
// ConversationManager cm = new ConversationManagerImpl( "s1",
// conn,
// l );
//
// GridPeerServiceConfiguration wprConf = new WhitePagesRemoteConfiguration( cm );
// conf.addConfiguration( wprConf );
//
// GridPeerServiceConfiguration schedRemoteClientConf = new SchedulerRemoteConfiguration( cm );
// conf.addConfiguration( schedRemoteClientConf );
//
// conf.configure( grid2 );
// }
//
// private void configureGrid3(Grid grid3,
// Connector conn) {
// GridPeerConfiguration conf = new GridPeerConfiguration();
//
// GridPeerServiceConfiguration coreSeviceWPConf = new CoreServicesLookupConfiguration( coreServicesMap );
// conf.addConfiguration( coreSeviceWPConf );
//
// ConversationManager cm = new ConversationManagerImpl( "s1",
// conn,
// l );
//
// GridPeerServiceConfiguration wprConf = new WhitePagesRemoteConfiguration( cm );
// conf.addConfiguration( wprConf );
//
// GridPeerServiceConfiguration schedRemoteClientConf = new SchedulerRemoteConfiguration( cm );
// conf.addConfiguration( schedRemoteClientConf );
//
// conf.configure( grid3 );
// }
}