Package jetbrains.communicator.p2p

Source Code of jetbrains.communicator.p2p.NetworkUtil

/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* 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 jetbrains.communicator.p2p;

import jetbrains.communicator.core.Pico;
import jetbrains.communicator.util.TimeoutCachedValue;
import jetbrains.communicator.util.XmlRpcTarget;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;
import org.jetbrains.annotations.Nullable;

import java.io.IOException;
import java.net.*;
import java.util.*;

/**
* @author Kir
*/
@SuppressWarnings({"HardCodedStringLiteral"})
public class NetworkUtil {
  private static final Logger LOG = Logger.getLogger(NetworkUtil.class);

  private static final TimeoutCachedValue<List<InetAddress>> ourInterfaces = new TimeoutCachedValue<List<InetAddress>>(30 * 1000) {
    @Override
    protected List<InetAddress> calculate() {
      final List<InetAddress> result = new ArrayList<InetAddress>();
      try {
        final Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
          NetworkInterface ni = networkInterfaces.nextElement();
          final Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
          while (inetAddresses.hasMoreElements()) {
            InetAddress inetAddress = inetAddresses.nextElement();
            if (inetAddress instanceof Inet4Address) {       // Inet6Address is not supported - unable to reference via URL
              if (!inetAddress.isLoopbackAddress() || Pico.isUnitTest()) {
                result.add(inetAddress);
              }
            }
          }
        }
      } catch (SocketException e) {
        LOG.error("Cannot get list of local interfaces", e);
      }
      return result;
    }
  };

  private NetworkUtil() {
  }

  public static Collection<InetAddress> getSelfAddresses() {
    return ourInterfaces.getValue();
  }

  public static Object sendMessage(XmlRpcTarget target, String xmlRpcId, String method, Object... parameters) {
    return sendMessage(target, xmlRpcId, method, Arrays.asList(parameters));
  }

  private static Object sendMessage(XmlRpcTarget target, String xmlRpcId, String method, List<Object> parameters) {
    checkParameters(parameters, method);

    String url = "http://" + target.getAddress().getHostAddress() + ':' + target.getPort() + "/rpc2";
    String fullMethodName = xmlRpcId + '.' + method;

    String logLine = "Call [" + url + "] " + fullMethodName;
    if (LOG.isDebugEnabled()) {
      LOG.info(buildFullLogLine(logLine, parameters));
    }
    for (int i = 0; i < parameters.size(); i++) {
      Object o = parameters.get(i);
      assert o != null : "Null parameter in position " + i;
    }

    try {
      return new XmlRpcClient(url).execute(fullMethodName, new Vector<Object>(parameters));
    }
    catch (MalformedURLException e) {
      LOG.info(buildFullLogLine(logLine, parameters) + ' ' + e.getLocalizedMessage());
    }
    catch (IOException e) {
      LOG.info(buildFullLogLine(logLine, parameters) + ' ' + e.getLocalizedMessage());
    }
    catch (XmlRpcException e) {
      LOG.info(buildFullLogLine(logLine, parameters) + ' ' + e.getLocalizedMessage());
    }
    return null;
  }

  private static String buildFullLogLine(String logLine, List<?> parameters) {
    return logLine + '(' + parameters + ')';
  }

  private static void checkParameters(List<?> parameters, String method) {
    for (int i = 0; i < parameters.size(); i++) {
      assert parameters.get(i) != null : " null parameter " + i + " to " + method;
    }
  }

  public static boolean isOwnAddress(@Nullable InetAddress address) {
    return address != null && (address.isLoopbackAddress() || getSelfAddresses().contains(address));
  }
}
TOP

Related Classes of jetbrains.communicator.p2p.NetworkUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.