//$Header: /cvsroot-fuse/mec-as2/39/mendelson/util/clientserver/ClientServer.java,v 1.1 2012/04/18 14:10:41 heller Exp $ package de.mendelson.util.clientserver; import de.mendelson.util.clientserver.messages.ClientServerMessage; import java.net.InetSocketAddress; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.filter.executor.UnorderedThreadPoolExecutor; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; /* * Copyright (C) mendelson-e-commerce GmbH Berlin Germany * * This software is subject to the license agreement set forth in the license. * Please read and agree to all terms before using this software. * Other product and brand names are trademarks of their respective owners. */ /** * Server root for the mendelson client/server architecture * @author S.Heller * @version $Revision: 1.1 $ */ public class ClientServer { private long startTime = 0; private Logger logger; private ClientServerSessionHandler sessionHandler = null; private int port = 0; private String productName = ""; /** Creates a new instance of Server */ public ClientServer(Logger logger, int port) { this.port = port; this.logger = logger; } public void setSessionHandler(ClientServerSessionHandler sessionHandler) { this.sessionHandler = sessionHandler; } public void setClientServerPort(int port) { this.port = port; } /**Returns the start time of the server*/ public long getStartTime() { return startTime; } /**Sends a message object to all connected clients*/ public void broadcastToClients(ClientServerMessage message) { if (this.sessionHandler != null) { sessionHandler.broadcast(message); } } public void setProductName(String productName) { this.productName = productName; } /**Finally starts the server*/ public void start() throws Exception { this.logger.log(Level.INFO, "Starting " + this.productName + " client-server interface, listening on port " + this.port); if (this.sessionHandler != null) { this.sessionHandler.setProductName(this.productName); } else { this.logger.log(Level.WARNING, "No session handler assigned to the client server!"); } NioSocketAcceptor acceptor = new NioSocketAcceptor(); ObjectSerializationCodecFactory codecFactory = new ObjectSerializationCodecFactory(); codecFactory.setDecoderMaxObjectSize(Integer.MAX_VALUE); codecFactory.setEncoderMaxObjectSize(Integer.MAX_VALUE); //add CPU bound tasks first acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(codecFactory)); //log client-server communication //acceptor.getFilterChain().addLast("logger", new LoggingFilter()); //see https://issues.apache.org/jira/browse/DIRMINA-682?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel //..and now set up the thread pool acceptor.getFilterChain().addLast("executor", new ExecutorFilter(new UnorderedThreadPoolExecutor())); if (this.sessionHandler != null) { acceptor.setHandler(this.sessionHandler); } //finally bind the protocol handler to the port acceptor.bind(new InetSocketAddress(this.port)); this.logger.log(Level.INFO, this.productName + " client-server interface started."); this.startTime = new Date().getTime(); } }