/*
* Copyright (c) 2009, Paul Merlin. All Rights Reserved.
* Copyright (c) 2010, Fabien Barbero. All Rights Reserved.
*
* 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.swing.on.steroids.messagebus;
import org.swing.on.steroids.messagebus.Subscribtion;
import org.swing.on.steroids.messagebus.VetoOnce;
import org.swing.on.steroids.messagebus.MessageBus;
import org.swing.on.steroids.messagebus.VetoAlways;
import org.swing.on.steroids.messagebus.Subscriber;
import org.swing.on.steroids.messagebus.VetoRegistration;
import org.swing.on.steroids.messagebus.MessageType;
import org.swing.on.steroids.messagebus.DeliveryRefusalException;
import org.swing.on.steroids.messagebus.Message;
import org.codeartisans.java.toolbox.ObjectHolder;
import org.junit.Assert;
/**
* @author Paul Merlin
*/
@SuppressWarnings( "PublicInnerClass" )
public interface UseCase
{
static class Util
{
static void testMessageBus( MessageBus msgBus )
throws InterruptedException
{
TestMessageHandlerImpl sub1 = new TestMessageHandlerImpl();
TestMessageHandlerImpl sub2 = new TestMessageHandlerImpl();
Subscribtion s1 = msgBus.subscribe( TestMessage.TYPE, sub1 );
Assert.assertEquals( 1, msgBus.countSubscribers( TestMessage.TYPE ) );
msgBus.publish( new TestMessage() );
Thread.sleep( 100 );
Subscribtion s2 = msgBus.subscribe( TestMessage.TYPE, sub2 );
Assert.assertEquals( 2, msgBus.countSubscribers( TestMessage.TYPE ) );
msgBus.publish( new TestMessage() );
Thread.sleep( 100 );
Assert.assertEquals( 2, sub1.calls );
Assert.assertEquals( 1, sub2.calls );
s1.unsubscribe();
Assert.assertEquals( 1, msgBus.countSubscribers( TestMessage.TYPE ) );
VetoRegistration vetoRegistration = msgBus.registerVeto( TestMessage.TYPE, new VetoAlways() );
msgBus.publish( new TestMessage() );
msgBus.publish( new TestMessage() );
msgBus.publish( new TestMessage() );
msgBus.publish( new TestMessage() );
Thread.sleep( 100 );
Assert.assertEquals( 1, sub2.calls );
vetoRegistration.unregister();
vetoRegistration = msgBus.registerVeto( TestMessage.TYPE, new VetoOnce() );
msgBus.publish( new TestMessage() );
msgBus.publish( new TestMessage() );
Thread.sleep( 100 );
Assert.assertEquals( 2, sub2.calls );
s2.unsubscribe();
Assert.assertEquals( 0, msgBus.countSubscribers( TestMessage.TYPE ) );
// Test refusals
msgBus.subscribe( TestMessage.TYPE, new TestRefuserMessageHandlerImpl() );
msgBus.publish( new TestMessage() );
}
}
static class TestMessage
extends Message<TestMessageHandler>
{
public static final MessageType<TestMessageHandler> TYPE = new MessageType<TestMessageHandler>();
@Override
public MessageType<TestMessageHandler> getMessageType()
{
return TYPE;
}
@Override
protected void deliver( TestMessageHandler handler )
{
handler.onProut( this );
}
}
interface TestMessageHandler
extends Subscriber
{
void onProut( TestMessage prout );
}
@SuppressWarnings( "PackageVisibleField" )
class TestMessageHandlerImpl
implements TestMessageHandler
{
int calls = 0;
@Override
public void onProut( TestMessage prout )
{
calls++;
}
}
class TestRefuserMessageHandlerImpl
implements TestMessageHandler
{
@Override
public void onProut( TestMessage prout )
{
throw new DeliveryRefusalException();
}
}
}