/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.ofbiz.base.util;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.rmi.server.RMISocketFactory;

/**
 * A <code>RMISocketFactory</code> implementation that creates <code>ServerSocket</code>s bound 
 * on a specified network interface.  
 */
public class RMIExtendedSocketFactory extends RMISocketFactory {
    
    /**
     * The network interface to bind the <code>ServerSocket</code> to. If null than bind to all interfaces.
     */
    private InetAddress hostInetAddress;
    
    /**
     * Default constructor. Bind the server sockets on all interfaces.
     */
    public RMIExtendedSocketFactory() {
        // leave hostInetAddress null
    }
    
    /**
     * Creates a new <code>RMIExtendedSocketFactory</code> which will create <code>ServerSocket</code>s 
     * bound on the specified network interface. 
     * 
     * @param inetAddress The <code>InetAddress</code> of the network interface. 
     */
    public RMIExtendedSocketFactory( InetAddress inetAddress ) {
        this.hostInetAddress = inetAddress;
    }

    /**
     * Creates a new <code>RMIExtendedSocketFactory</code> which will create <code>ServerSocket</code>s 
     * bound on the specified network interface. 
     * 
     * @param hostIpAddress The IP address of the interface to bind the server sockets to.
     * @throws UnknownHostException If an invalid IP address is provided. 
     */
    public RMIExtendedSocketFactory( String hostIpAddress ) throws UnknownHostException {
        
        // check if host length is at least equal to "0.0.0.0"
        if ( hostIpAddress != null && hostIpAddress.length() >= 7 ) {
            String[] octets = hostIpAddress.split( "\\." );
            
            if ( octets == null || octets.length != 4 ) {
                throw new UnknownHostException( "Invalid IP address: " + hostIpAddress );
            }
            
            byte[] ipAddr = new byte[4];
            for ( int i = 0; i < octets.length; i++ ) {
                try {
                    ipAddr[i] = ( byte ) Integer.parseInt( octets[i] );
                } catch ( NumberFormatException nfEx ) {
                    throw new UnknownHostException( "Invalid IP address: " + hostIpAddress );
                }
            }
            
            hostInetAddress = InetAddress.getByAddress( ipAddr );
            
        }
        
        
    }
    
    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        if ( hostInetAddress !=  null ) {
            return new ServerSocket( port, 0, hostInetAddress );
        } else {
            return new ServerSocket( port );
        }
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        
        return new Socket( host, port );
    }

}
