/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.net.swarm.bzz;
import com.google.common.base.Joiner;
import org.apache.commons.codec.binary.StringUtils;
import org.ethereum.net.p2p.Peer;
import org.ethereum.net.rlpx.Node;
import org.ethereum.net.swarm.Key;
import org.ethereum.net.swarm.Util;
import org.ethereum.util.ByteUtil;
import org.ethereum.util.RLP;
import org.ethereum.util.RLPList;
import org.spongycastle.util.encoders.Hex;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import static org.ethereum.crypto.HashUtil.sha3;
/**
* Class similar for {@link Node} used in the swarm
*
* Created by Admin on 25.06.2015.
*/
public class PeerAddress {
private byte[] ip;
private int port;
private byte[] id;
private Key addrKeyCached = null;
private PeerAddress() {
}
public PeerAddress(Node discoverNode) {
try {
port = discoverNode.getPort();
id = discoverNode.getId();
ip = InetAddress.getByName(discoverNode.getHost()).getAddress();
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
public PeerAddress(byte[] ip, int port, byte[] id) {
this.ip = ip;
this.port = port;
this.id = id;
}
public Node toNode() {
try {
return new Node(id, InetAddress.getByAddress(ip).getHostAddress(), port);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
/**
* Gets the SHA3 hash if this node ID
*/
public Key getAddrKey() {
if (addrKeyCached == null) {
addrKeyCached = new Key(sha3(id));
}
return addrKeyCached;
}
public byte[] getIp() {
return ip;
}
public int getPort() {
return port;
}
public byte[] getId() {
return id;
}
static PeerAddress parse(RLPList l) {
PeerAddress ret = new PeerAddress();
ret.ip = l.get(0).getRLPData();
ret.port = ByteUtil.byteArrayToInt(l.get(1).getRLPData());
ret.id = l.get(2).getRLPData();
return ret;
}
byte[] encodeRlp() {
return RLP.encodeList(RLP.encodeElement(ip),
RLP.encodeInt(port),
RLP.encodeElement(id));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PeerAddress that = (PeerAddress) o;
if (port != that.port) return false;
return Arrays.equals(ip, that.ip);
}
@Override
public int hashCode() {
int result = ip != null ? Arrays.hashCode(ip) : 0;
result = 31 * result + port;
return result;
}
@Override
public String toString() {
return "PeerAddress{" +
"ip=" + Util.ipBytesToString(ip) +
", port=" + port +
", id=" + Hex.toHexString(id) +
'}';
}
}