/** * Copyright (c) 2002-2012 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.cluster; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.neo4j.cluster.com.message.Message; import org.neo4j.cluster.com.message.MessageProcessor; import org.neo4j.cluster.com.message.MessageSource; import org.neo4j.cluster.com.message.MessageType; import org.neo4j.cluster.protocol.atomicbroadcast.multipaxos.AcceptorInstanceStore; import org.neo4j.cluster.protocol.election.ElectionCredentialsProvider; import org.neo4j.cluster.statemachine.StateTransitionListener; import org.neo4j.cluster.timeout.TimeoutStrategy; import org.neo4j.cluster.timeout.Timeouts; import org.neo4j.helpers.Listeners; /** * TODO */ public class TestProtocolServer implements MessageProcessor { protected final TestMessageSource receiver; protected final TestMessageSender sender; protected ProtocolServer server; public TestProtocolServer( TimeoutStrategy timeoutStrategy, ProtocolServerFactory factory, URI serverId, AcceptorInstanceStore acceptorInstanceStore, ElectionCredentialsProvider electionCredentialsProvider ) { this.receiver = new TestMessageSource(); this.sender = new TestMessageSender(); server = factory.newProtocolServer( timeoutStrategy, receiver, sender, acceptorInstanceStore, electionCredentialsProvider ); server.listeningAt( serverId ); } public ProtocolServer getServer() { return server; } public Timeouts getTimeouts() { return server.getTimeouts(); } @Override public void process( Message message ) { receiver.process( message ); } public void sendMessages( List<Message> output ) { sender.sendMessages( output ); } public <T> T newClient( Class<T> clientProxyInterface ) { return server.newClient( clientProxyInterface ); } public TestProtocolServer addStateTransitionListener( StateTransitionListener listener ) { server.addStateTransitionListener( listener ); return this; } public void tick( long now ) { // Time passes - check timeouts server.getTimeouts().tick( now ); } @Override public String toString() { return server.getServerId() + ": " + sender.getMessages().size() + server.toString(); } public class TestMessageSender implements MessageProcessor { List<Message> messages = new ArrayList<Message>(); @Override public void process( Message<? extends MessageType> message ) { messages.add( message ); } public List<Message> getMessages() { return messages; } public void sendMessages( List<Message> output ) { output.addAll( messages ); messages.clear(); } } public class TestMessageSource implements MessageSource, MessageProcessor { Iterable<MessageProcessor> listeners = Listeners.newListeners(); @Override public void addMessageProcessor( MessageProcessor listener ) { listeners = Listeners.addListener( listener, listeners ); } @Override public void process( Message<? extends MessageType> message ) { for ( MessageProcessor listener : listeners ) { listener.process( message ); } } } }