001    /*--------------------------------------------------------------------------+
002    $Id: SmartRMISocketFactory.java 28668 2010-06-23 14:46:45Z heineman $
003    |                                                                          |
004    | Copyright 2005-2010 Technische Universitaet Muenchen                     |
005    |                                                                          |
006    | Licensed under the Apache License, Version 2.0 (the "License");          |
007    | you may not use this file except in compliance with the License.         |
008    | You may obtain a copy of the License at                                  |
009    |                                                                          |
010    |    http://www.apache.org/licenses/LICENSE-2.0                            |
011    |                                                                          |
012    | Unless required by applicable law or agreed to in writing, software      |
013    | distributed under the License is distributed on an "AS IS" BASIS,        |
014    | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015    | See the License for the specific language governing permissions and      |
016    | limitations under the License.                                           |
017    +--------------------------------------------------------------------------*/
018    package edu.tum.cs.commons.net;
019    
020    import java.io.IOException;
021    import java.net.ServerSocket;
022    import java.net.Socket;
023    import java.rmi.server.RMISocketFactory;
024    
025    /**
026     * A {@link RMISocketFactory} that adjusts flags on the sockets used. One is
027     * that for the server socket the reuse flag is set, which allows fast
028     * reopening. Second, an optional timeout can be set.
029     * 
030     * @author hummelb
031     * @author $Author: heineman $
032     * @version $Rev: 28668 $
033     * @levd.rating GREEN Hash: 676BF40E769C33456EE7029EE0E3949A
034     */
035    public class SmartRMISocketFactory extends RMISocketFactory {
036    
037            /** Timeout in seconds. */
038            private final int timeoutSeconds;
039    
040            /** Constructor. No timeout is set. */
041            public SmartRMISocketFactory() {
042                    this(-1);
043            }
044    
045            /** Constructor */
046            public SmartRMISocketFactory(int timeoutSeconds) {
047                    this.timeoutSeconds = timeoutSeconds;
048            }
049    
050            /** {@inheritDoc} */
051            @Override
052            public Socket createSocket(String host, int port) throws IOException {
053                    Socket socket = getDefaultSocketFactory().createSocket(host, port);
054                    if (timeoutSeconds > 0) {
055                            socket.setSoTimeout(timeoutSeconds * 1000);
056                    }
057                    return socket;
058            }
059    
060            /** {@inheritDoc} */
061            @Override
062            public ServerSocket createServerSocket(int port) throws IOException {
063                    ServerSocket socket = getDefaultSocketFactory()
064                                    .createServerSocket(port);
065                    socket.setReuseAddress(true);
066                    return socket;
067            }
068    }