4 * License : The MIT License
5 * Copyright(c) 2009 olyutorskii
8 package jp.sourceforge.jindolf;
10 import java.net.InetSocketAddress;
11 import java.net.Proxy;
12 import java.net.SocketAddress;
13 import jp.sourceforge.jovsonz.JsNumber;
14 import jp.sourceforge.jovsonz.JsObject;
15 import jp.sourceforge.jovsonz.JsPair;
16 import jp.sourceforge.jovsonz.JsString;
17 import jp.sourceforge.jovsonz.JsValue;
22 * IP4,IP6以外のアドレスは未サポート。
24 public class ProxyInfo{
27 * アドレス「0.0.0.0」、ポート番号0のソケット端点。
29 public static final InetSocketAddress IP4SOCKET_NOBODY =
30 InetSocketAddress.createUnresolved("0.0.0.0", 0);
32 /** デフォルトのプロクシ(直接接続)。 */
33 public static final ProxyInfo DEFAULT = new ProxyInfo();
35 private static final String HASH_TYPE = "type";
36 private static final String HASH_HOST = "host";
37 private static final String HASH_PORT = "port";
40 private final Proxy proxy;
41 private final InetSocketAddress inetAddr;
57 public ProxyInfo(Proxy proxy){
61 if(this.proxy.type() == Proxy.Type.DIRECT){
62 this.inetAddr = IP4SOCKET_NOBODY;
64 SocketAddress addr = this.proxy.address();
65 if( ! (addr instanceof InetSocketAddress) ){
66 throw new IllegalArgumentException();
68 this.inetAddr = (InetSocketAddress) addr;
77 * @param hostName ホスト名
80 public ProxyInfo(Proxy.Type type, String hostName, int port){
81 this(type, InetSocketAddress.createUnresolved(hostName, port));
90 public ProxyInfo(Proxy.Type type, InetSocketAddress inetAddr){
93 if(type == null || inetAddr == null){
94 throw new NullPointerException();
97 if(type == Proxy.Type.DIRECT){
98 this.proxy = Proxy.NO_PROXY;
100 this.proxy = new Proxy(type, inetAddr);
103 this.inetAddr = inetAddr;
110 * プロクシ設定をJSON形式にエンコードする。
111 * @param proxyInfo プロクシ設定
112 * @return JSON object
114 public static JsObject buildJson(ProxyInfo proxyInfo){
115 JsPair type = new JsPair(HASH_TYPE, proxyInfo.getType().name());
116 JsPair host = new JsPair(HASH_HOST, proxyInfo.getHostName());
117 JsPair port = new JsPair(HASH_PORT, proxyInfo.getPort());
119 JsObject result = new JsObject();
120 result.putPair(type);
121 result.putPair(host);
122 result.putPair(port);
129 * @param obj JSON object
130 * @return 復元されたプロクシ設定。
132 public static ProxyInfo decodeJson(JsObject obj){
135 Proxy.Type type = Proxy.Type.DIRECT;
136 value = obj.getValue(HASH_TYPE);
137 if(value instanceof JsString){
138 JsString string = (JsString) value;
140 type = Enum.valueOf(Proxy.Type.class, string.toRawString());
141 }catch(IllegalArgumentException e){
146 String host = "0.0.0.0";
147 value = obj.getValue(HASH_HOST);
148 if(value instanceof JsString){
149 JsString string = (JsString) value;
150 host = string.toRawString();
154 value = obj.getValue(HASH_PORT);
155 if(value instanceof JsNumber){
156 JsNumber number = (JsNumber) value;
157 port = number.intValue();
160 return new ProxyInfo(type, host, port);
165 * @param obj {@inheritDoc}
166 * @return {@inheritDoc}
169 public boolean equals(Object obj){
170 if(obj == null) return false;
171 if(getClass() != obj.getClass()) return false;
172 ProxyInfo target = (ProxyInfo) obj;
176 result = this.proxy.equals(target.proxy);
178 result = this.inetAddr.equals(target.inetAddr);
186 * @return {@inheritDoc}
189 public int hashCode(){
190 return this.proxy.hashCode() ^ this.inetAddr.hashCode();
195 * 直結プロクシだった場合、ホスト名とポート番号には何が入っているか不明。
198 public Proxy getProxy(){
206 public Proxy.Type getType(){
207 return this.proxy.type();
214 public InetSocketAddress address(){
215 return this.inetAddr;
222 public String getHostName(){
223 return this.inetAddr.getHostName();
230 public int getPort(){
231 return this.inetAddr.getPort();