1 |
/************************************************************************************************* |
2 |
* Java interface of Hyper Estraier |
3 |
* Copyright (C) 2004-2005 Mikio Hirabayashi |
4 |
* All rights reserved. |
5 |
* This file is part of Hyper Estraier. |
6 |
* Redistribution and use in source and binary forms, with or without modification, are |
7 |
* permitted provided that the following conditions are met: |
8 |
* |
9 |
* * Redistributions of source code must retain the above copyright notice, this list of |
10 |
* conditions and the following disclaimer. |
11 |
* * Redistributions in binary form must reproduce the above copyright notice, this list of |
12 |
* conditions and the following disclaimer in the documentation and/or other materials |
13 |
* provided with the distribution. |
14 |
* * Neither the name of Mikio Hirabayashi nor the names of its contributors may be used to |
15 |
* endorse or promote products derived from this software without specific prior written |
16 |
* permission. |
17 |
* |
18 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS |
19 |
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
20 |
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
21 |
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
22 |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
23 |
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
24 |
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
25 |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
26 |
* OF THE POSSIBILITY OF SUCH DAMAGE. |
27 |
*************************************************************************************************/ |
28 |
|
29 |
|
30 |
package estraier; |
31 |
|
32 |
import java.util.*; |
33 |
import java.io.*; |
34 |
import java.net.*; |
35 |
|
36 |
|
37 |
|
38 |
/** |
39 |
* Implementation of connection to P2P node. |
40 |
*/ |
41 |
public class NodeImpl implements Node { |
42 |
//---------------------------------------------------------------- |
43 |
// private fields |
44 |
//---------------------------------------------------------------- |
45 |
private int status; |
46 |
private String url; |
47 |
private String pxhost; |
48 |
private int pxport; |
49 |
private int timeout; |
50 |
private String auth; |
51 |
private String name; |
52 |
private String label; |
53 |
private int dnum; |
54 |
private int wnum; |
55 |
private double size; |
56 |
//---------------------------------------------------------------- |
57 |
// public methods |
58 |
//---------------------------------------------------------------- |
59 |
public NodeImpl(){ |
60 |
status = -1; |
61 |
url = null; |
62 |
pxhost = null; |
63 |
pxport = -1; |
64 |
timeout = -1; |
65 |
auth = null; |
66 |
name = null; |
67 |
label = null; |
68 |
dnum = -1; |
69 |
wnum = -1; |
70 |
size = -1.0; |
71 |
} |
72 |
public int status(){ |
73 |
return status; |
74 |
} |
75 |
public void set_url(String url){ |
76 |
this.url = url; |
77 |
} |
78 |
public void set_proxy(String host, int port){ |
79 |
pxhost = host; |
80 |
pxport = port; |
81 |
} |
82 |
public void set_timeout(int msec){ |
83 |
timeout = msec; |
84 |
} |
85 |
public void set_auth(String name, String password){ |
86 |
auth = name + ":" + password; |
87 |
} |
88 |
public boolean put_doc(Document doc){ |
89 |
status = -1; |
90 |
if(url == null) return false; |
91 |
try { |
92 |
URL purl = new URL(url); |
93 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
94 |
purl.getPath() + "/put_doc"); |
95 |
List reqheads = new ArrayList(2); |
96 |
if(auth != null) |
97 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
98 |
reqheads.add("Content-Type: text/x-estraier-draft"); |
99 |
byte[] reqbody = doc.dump_draft().getBytes("UTF-8"); |
100 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
101 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
102 |
null, resbody); |
103 |
if(status != 200) return false; |
104 |
return true; |
105 |
} catch(Exception e){ |
106 |
return false; |
107 |
} |
108 |
} |
109 |
public boolean out_doc(int id){ |
110 |
status = -1; |
111 |
if(url == null) return false; |
112 |
try { |
113 |
URL purl = new URL(url); |
114 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
115 |
purl.getPath() + "/out_doc"); |
116 |
List reqheads = new ArrayList(2); |
117 |
if(auth != null) |
118 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
119 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
120 |
byte[] reqbody = ("id=" + id).getBytes("ISO-8859-1"); |
121 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
122 |
null, null); |
123 |
if(status != 200) return false; |
124 |
return true; |
125 |
} catch(Exception e){ |
126 |
return false; |
127 |
} |
128 |
} |
129 |
public boolean out_doc_by_uri(String uri){ |
130 |
status = -1; |
131 |
if(url == null) return false; |
132 |
try { |
133 |
URL purl = new URL(url); |
134 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
135 |
purl.getPath() + "/out_doc"); |
136 |
List reqheads = new ArrayList(2); |
137 |
if(auth != null) |
138 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
139 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
140 |
byte[] reqbody = ("uri=" + URLEncoder.encode(uri, "UTF-8")).getBytes("ISO-8859-1"); |
141 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
142 |
null, null); |
143 |
if(status != 200) return false; |
144 |
return true; |
145 |
} catch(Exception e){ |
146 |
return false; |
147 |
} |
148 |
} |
149 |
public Document get_doc(int id){ |
150 |
status = -1; |
151 |
if(url == null) return null; |
152 |
try { |
153 |
URL purl = new URL(url); |
154 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
155 |
purl.getPath() + "/get_doc"); |
156 |
List reqheads = new ArrayList(2); |
157 |
if(auth != null) |
158 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
159 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
160 |
byte[] reqbody = ("id=" + id).getBytes("ISO-8859-1"); |
161 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
162 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
163 |
null, resbody); |
164 |
if(status != 200) return null; |
165 |
return new DocumentImpl(resbody.toString("UTF-8")); |
166 |
} catch(Exception e){ |
167 |
return null; |
168 |
} |
169 |
} |
170 |
public Document get_doc_by_uri(String uri){ |
171 |
status = -1; |
172 |
if(url == null) return null; |
173 |
try { |
174 |
URL purl = new URL(url); |
175 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
176 |
purl.getPath() + "/get_doc"); |
177 |
List reqheads = new ArrayList(2); |
178 |
if(auth != null) |
179 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
180 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
181 |
byte[] reqbody = ("uri=" + URLEncoder.encode(uri, "UTF-8")).getBytes("ISO-8859-1"); |
182 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
183 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
184 |
null, resbody); |
185 |
if(status != 200) return null; |
186 |
return new DocumentImpl(resbody.toString("UTF-8")); |
187 |
} catch(Exception e){ |
188 |
return null; |
189 |
} |
190 |
} |
191 |
public String get_doc_attr(int id, String name){ |
192 |
status = -1; |
193 |
if(url == null) return null; |
194 |
try { |
195 |
URL purl = new URL(url); |
196 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
197 |
purl.getPath() + "/get_doc_attr"); |
198 |
List reqheads = new ArrayList(2); |
199 |
if(auth != null) |
200 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
201 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
202 |
String qstr = "id=" + id + "&attr=" + URLEncoder.encode(name, "UTF-8"); |
203 |
byte[] reqbody = qstr.getBytes("ISO-8859-1"); |
204 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
205 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
206 |
null, resbody); |
207 |
if(status != 200) return null; |
208 |
return resbody.toString("UTF-8").trim(); |
209 |
} catch(Exception e){ |
210 |
return null; |
211 |
} |
212 |
} |
213 |
public String get_doc_attr_by_uri(String uri, String name){ |
214 |
status = -1; |
215 |
if(url == null) return null; |
216 |
try { |
217 |
URL purl = new URL(url); |
218 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
219 |
purl.getPath() + "/get_doc_attr"); |
220 |
List reqheads = new ArrayList(2); |
221 |
if(auth != null) |
222 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
223 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
224 |
String qstr = "uri=" + URLEncoder.encode(uri, "UTF-8") + |
225 |
"&attr=" + URLEncoder.encode(name, "UTF-8"); |
226 |
byte[] reqbody = qstr.getBytes("ISO-8859-1"); |
227 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
228 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
229 |
null, resbody); |
230 |
if(status != 200) return null; |
231 |
return resbody.toString("UTF-8").trim(); |
232 |
} catch(Exception e){ |
233 |
return null; |
234 |
} |
235 |
} |
236 |
public int uri_to_id(String uri){ |
237 |
status = -1; |
238 |
if(url == null) return -1; |
239 |
try { |
240 |
URL purl = new URL(url); |
241 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
242 |
purl.getPath() + "/uri_to_id"); |
243 |
List reqheads = new ArrayList(2); |
244 |
if(auth != null) |
245 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
246 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
247 |
byte[] reqbody = ("uri=" + URLEncoder.encode(uri, "UTF-8")).getBytes("ISO-8859-1"); |
248 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
249 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
250 |
null, resbody); |
251 |
if(status != 200) return -1; |
252 |
return Integer.parseInt(resbody.toString("ISO-8859-1").trim()); |
253 |
} catch(Exception e){ |
254 |
return -1; |
255 |
} |
256 |
} |
257 |
public String name(){ |
258 |
if(name == null) set_info(); |
259 |
return name; |
260 |
} |
261 |
public String label(){ |
262 |
if(label == null) set_info(); |
263 |
return label; |
264 |
} |
265 |
public int doc_num(){ |
266 |
if(dnum < 0) set_info(); |
267 |
return dnum; |
268 |
} |
269 |
public int word_num(){ |
270 |
if(wnum < 0) set_info(); |
271 |
return wnum; |
272 |
} |
273 |
public double size(){ |
274 |
if(size < 0.0) set_info(); |
275 |
return size; |
276 |
} |
277 |
public NodeResult search(Condition cond, int depth){ |
278 |
status = -1; |
279 |
if(url == null) return null; |
280 |
try { |
281 |
URL purl = new URL(url); |
282 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
283 |
purl.getPath() + "/search"); |
284 |
List reqheads = new ArrayList(2); |
285 |
if(auth != null) |
286 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
287 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
288 |
byte[] reqbody = cond_to_query(cond, depth).getBytes("ISO-8859-1"); |
289 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
290 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
291 |
null, resbody); |
292 |
if(status != 200) return null; |
293 |
String[] lines = Utility.splitLines(resbody.toString("UTF-8")); |
294 |
if(lines.length < 1) return null; |
295 |
List docs = new ArrayList(31); |
296 |
Map hints = new HashMap(31); |
297 |
NodeResultImpl nres = new NodeResultImpl(docs, hints); |
298 |
String border = lines[0]; |
299 |
int lnum = 1; |
300 |
while(lnum < lines.length){ |
301 |
String line = lines[lnum++]; |
302 |
if(line.equals(border)) break; |
303 |
int lidx = line.indexOf('\t'); |
304 |
if(lidx != -1){ |
305 |
String key = line.substring(0, lidx); |
306 |
String value = line.substring(lidx + 1, line.length()); |
307 |
hints.put(key, value); |
308 |
} |
309 |
} |
310 |
int snum = lnum; |
311 |
boolean end = false; |
312 |
while(lnum < lines.length){ |
313 |
String line = lines[lnum++]; |
314 |
if(line.startsWith(border)){ |
315 |
if(lnum > snum){ |
316 |
Map rdattrs = new HashMap(31); |
317 |
StringBuffer sb = new StringBuffer(); |
318 |
int rlnum = snum; |
319 |
while(rlnum < lnum - 1){ |
320 |
String rdline = lines[rlnum++]; |
321 |
if(rdline.length() < 1) break; |
322 |
int lidx = rdline.indexOf('='); |
323 |
if(lidx != -1){ |
324 |
String key = rdline.substring(0, lidx); |
325 |
String value = rdline.substring(lidx + 1, rdline.length()); |
326 |
rdattrs.put(key, value); |
327 |
} |
328 |
} |
329 |
while(rlnum < lnum - 1){ |
330 |
String rdline = lines[rlnum++]; |
331 |
sb.append(rdline); |
332 |
sb.append("\n"); |
333 |
} |
334 |
String rduri = (String)rdattrs.get("@uri"); |
335 |
String rdsnippet = sb.toString(); |
336 |
if(rduri != null){ |
337 |
ResultDocument doc = new ResultDocumentImpl(rduri, rdattrs, rdsnippet); |
338 |
docs.add(doc); |
339 |
} |
340 |
} |
341 |
snum = lnum; |
342 |
if(line.substring(border.length(), line.length()).equals(":END")) end = true; |
343 |
} |
344 |
if(end) break; |
345 |
} |
346 |
return nres; |
347 |
} catch(Exception e){ |
348 |
return null; |
349 |
} |
350 |
} |
351 |
public boolean set_user(String name, int mode){ |
352 |
status = -1; |
353 |
if(url == null) return false; |
354 |
try { |
355 |
URL purl = new URL(url); |
356 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
357 |
purl.getPath() + "/_set_user"); |
358 |
List reqheads = new ArrayList(2); |
359 |
if(auth != null) |
360 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
361 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
362 |
String qstr = "name=" + URLEncoder.encode(name, "UTF-8") + "&mode=" + mode; |
363 |
byte[] reqbody = qstr.getBytes("ISO-8859-1"); |
364 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
365 |
null, null); |
366 |
if(status != 200) return false; |
367 |
return true; |
368 |
} catch(Exception e){ |
369 |
return false; |
370 |
} |
371 |
} |
372 |
public boolean set_link(String url, String label, int credit){ |
373 |
status = -1; |
374 |
if(this.url == null) return false; |
375 |
try { |
376 |
URL purl = new URL(this.url); |
377 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
378 |
purl.getPath() + "/_set_link"); |
379 |
List reqheads = new ArrayList(2); |
380 |
if(auth != null) |
381 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
382 |
reqheads.add("Content-Type: application/x-www-form-urlencoded"); |
383 |
String qstr = "url=" + URLEncoder.encode(url, "UTF-8") + |
384 |
"&label=" + URLEncoder.encode(label, "UTF-8"); |
385 |
if(credit >= 0) qstr = qstr + "&credit=" + credit; |
386 |
byte[] reqbody = qstr.getBytes("ISO-8859-1"); |
387 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, reqbody, |
388 |
null, null); |
389 |
if(status != 200) return false; |
390 |
return true; |
391 |
} catch(Exception e){ |
392 |
return false; |
393 |
} |
394 |
} |
395 |
//---------------------------------------------------------------- |
396 |
// private methods |
397 |
//---------------------------------------------------------------- |
398 |
private void set_info(){ |
399 |
status = -1; |
400 |
if(url == null) return; |
401 |
try { |
402 |
URL purl = new URL(url); |
403 |
URL eurl = new URL("http://" + purl.getHost() + ":" + purl.getPort() + |
404 |
purl.getPath() + "/inform"); |
405 |
List reqheads = new ArrayList(2); |
406 |
if(auth != null) |
407 |
reqheads.add("Authorization: Basic " + Utility.baseEncode(auth.getBytes())); |
408 |
ByteArrayOutputStream resbody = new ByteArrayOutputStream(); |
409 |
status = Utility.shuttleURL(eurl.toString(), pxhost, pxport, reqheads, null, |
410 |
null, resbody); |
411 |
if(status != 200) return; |
412 |
String resstr = resbody.toString("UTF-8"); |
413 |
String[] lines = Utility.splitLines(resstr); |
414 |
if(lines.length < 1) return; |
415 |
String[] fields = Utility.splitFields(lines[0]); |
416 |
if(fields.length != 5) return; |
417 |
name = fields[0]; |
418 |
label = fields[1]; |
419 |
dnum = Integer.parseInt(fields[2]); |
420 |
wnum = Integer.parseInt(fields[3]); |
421 |
size = Double.parseDouble(fields[4]); |
422 |
if(dnum < 0 || wnum < 0 || size < 0.0){ |
423 |
dnum = -1; |
424 |
wnum = -1; |
425 |
size = -1.0; |
426 |
} |
427 |
} catch(Exception e){ |
428 |
name = null; |
429 |
label = null; |
430 |
dnum = -1; |
431 |
wnum = -1; |
432 |
size = -1.0; |
433 |
} |
434 |
} |
435 |
private String cond_to_query(Condition cond, int depth){ |
436 |
StringBuffer sb = new StringBuffer(); |
437 |
try { |
438 |
String phrase = cond.phrase(); |
439 |
sb.append("phrase="); |
440 |
if(phrase != null) sb.append(URLEncoder.encode(phrase, "UTF-8")); |
441 |
List attrs = cond.attrs(); |
442 |
Iterator it = cond.attrs().iterator(); |
443 |
for(int i = 1; it.hasNext(); i++){ |
444 |
sb.append("&attr="); |
445 |
sb.append(i); |
446 |
sb.append(URLEncoder.encode((String)it.next(), "UTF-8")); |
447 |
} |
448 |
String order = cond.order(); |
449 |
if(order != null){ |
450 |
sb.append("&order="); |
451 |
sb.append(URLEncoder.encode(order, "UTF-8")); |
452 |
} |
453 |
int max = cond.max(); |
454 |
if(max >= 0){ |
455 |
sb.append("&max="); |
456 |
sb.append(max); |
457 |
} |
458 |
int options = cond.options(); |
459 |
if(options > 0){ |
460 |
sb.append("&options="); |
461 |
sb.append(options); |
462 |
} |
463 |
if(depth > 0){ |
464 |
sb.append("&depth="); |
465 |
sb.append(depth); |
466 |
} |
467 |
} catch(UnsupportedEncodingException e){ |
468 |
throw new RuntimeException(e); |
469 |
} |
470 |
return sb.toString(); |
471 |
} |
472 |
} |
473 |
|
474 |
|
475 |
|
476 |
/* END OF FILE */ |