Source code: com/telefonicasoluciones/search/server/HLDaemonThread.java
1 package com.telefonicasoluciones.search.server;
2
3 /**
4 * Atiende una conexión entrante.
5 * Creation date: (17/04/2001 9:57:14)
6 *
7 * @author: Ricardo Lorenzo
8 */
9 import java.net.*;
10 import java.io.*;
11 import java.util.*;
12 import com.telefonicasoluciones.search.server.util.*;
13 import com.telefonicasoluciones.search.server.parser.xml.*;
14 import org.apache.lucene.index.*;
15 import org.apache.lucene.store.FSDirectory;
16
17 public class HLDaemonThread extends Thread {
18 private HLHandler hls;
19 private BufferedReader istream;
20 private static final String CR = "\r\n";
21
22 public HLDaemonThread(HLHandler newHls) throws IOException {
23 super(newHls.CTG, "server-session-"+(newHls.CTG.activeCount()+1));
24 hls = newHls;
25 hls.writeConnectionLog("Server session::From["+hls.getConnector().getInetAddress().getHostAddress()+"]::Date["+new Date(System.currentTimeMillis()).toString()+"]");
26 this.start();
27 }
28 public void run() {
29 String command = new String();
30 StringBuffer reply = new StringBuffer();
31 try {
32 istream = new BufferedReader(new InputStreamReader(hls.getConnector().getInputStream()));
33 } catch (IOException ioe) {
34 System.err.println("Server session error ["+ioe.getMessage()+"]");
35 interrupt();
36 destroy();
37 }
38
39 boolean active = hls.isLoaded();
40 while(true) {
41 command = null;
42 try {
43 command = istream.readLine().toLowerCase().trim();
44 } catch (Exception e) {}
45
46 if(command == null) continue;
47
48 Object[] tokens = getTokens(command);
49 TagToken cmd = new TagToken((String) tokens[0]);
50
51 /*
52 * Protocol 2.0 commands
53 */
54 if(!cmd.isEndTag()&&cmd.getName().equals("client:session")) {
55 if(cmd.getAttribute("instance")!=null) {
56 try {
57 hls.load(cmd.getAttribute("instance"));
58 reply.append("<server:session id=\"");
59 reply.append(getName());
60 reply.append("\">");
61 active = true;
62 } catch (NullPointerException e) {
63 reply.append("<sever:error type=\"command\" name=\"session\" id=\"301\">");
64 reply.append(e.getMessage());
65 reply.append("</server:error>");
66 hls.writeErrorLog("301 name=\"session\" [NullPointer]");
67 } catch (Exception e) {
68 reply.append("<sever:error type=\"command\" name=\"session\" id=\"302\">");
69 reply.append(e.getMessage());
70 reply.append("</server:error>");
71 hls.writeErrorLog("302 name=\"session\" ["+e.getMessage()+"]");
72 }
73 } else {
74 reply.append("<sever:error type=\"command\" name=\"session\" id=\"305\">");
75 reply.append("Syntax error");
76 reply.append("</server:error>");
77 hls.writeErrorLog("305 name=\"session\" [Syntax error]");
78 }
79 } else if(active&&cmd.isEndTag()&&cmd.getName().equals("client:session")) {
80 reply.append("</server:session>");
81 break;
82 } else if(active&&cmd.getName().equals("description")) {
83 reply.append("<server:description version=\"1.4\" name=\"");
84 reply.append(hls.getConnector().getLocalAddress().getHostName());
85 reply.append("\" protocol=\"2.0\"/>");
86 } else if (active&&cmd.getName().equals("index")) {
87 try {
88 if(tokens.length>1) {
89 TagToken endTag = new TagToken((String) tokens[2]);
90 if(!endTag.isEndTag()) throw new Exception();
91 } else {
92 throw new Exception();
93 }
94 URL u = new URL((String) tokens[1]);
95 try {
96 HTTPClient session = new HTTPClient(HTTPClient.getServerString((String) tokens[1]));
97 session.load(HTTPClient.getDocumentString((String) tokens[1]));
98 hls.setSession(session);
99 HLIndexThread hilo = new HLIndexThread(hls);
100 if(cmd.getAttribute("overwrite")!=null&&cmd.getAttribute("overwrite").equals("true")) {
101 hilo.deleteOldDocuments(true);
102 }
103 if(cmd.getAttribute("recursive")!=null&&cmd.getAttribute("recursive").equals("true")) {
104 hilo.setRecursive(true);
105 }
106 hilo.start();
107 } catch (NullPointerException e) {
108 reply.append("<sever:error type=\"command\" name=\"index\" id=\"301\">");
109 reply.append(e.getMessage());
110 reply.append("</server:error>");
111 hls.writeErrorLog("301 name=\"index\" [NullPointer]");
112 } catch (HTTPClientException e) {
113 reply.append("<sever:error type=\"command\" name=\"index\" id=\"304\">");
114 reply.append(e.getMessage());
115 reply.append("</server:error>");
116 hls.writeErrorLog("304 name=\"index\" ["+e.getMessage()+"]");
117 } catch (IOException e) {
118 reply.append("<sever:error type=\"command\" name=\"index\" id=\"307\">");
119 reply.append(e.getMessage());
120 reply.append("</server:error>");
121 hls.writeErrorLog("307 name=\"index\" ["+e.getMessage()+"]");
122 } catch (Exception e) {
123 reply.append("<sever:error type=\"command\" name=\"index\" id=\"302\">");
124 reply.append(e.getMessage());
125 reply.append("</server:error>");
126 hls.writeErrorLog("302 name=\"index\" ["+e.getMessage()+"]");
127 }
128 } catch(Exception e) {
129 reply.append("<sever:error type=\"command\" name=\"index\" id=\"305\">");
130 reply.append("Syntax error");
131 reply.append("</server:error>");
132 hls.writeErrorLog("305 name=\"index\" [Syntax error]");
133 }
134 } else if (active&&cmd.getName().equals("find")) {
135 try {
136 if(tokens.length>1) {
137 TagToken endTag = new TagToken((String) tokens[2]);
138 if(!endTag.isEndTag()) throw new Exception();
139 } else {
140 throw new Exception();
141 }
142 if(cmd.getAttribute("page")==null||cmd.getAttribute("lines")==null) {
143 throw new Exception();
144 }
145 try {
146 String query = (String) tokens[1];
147 int pagenumber = Integer.parseInt(cmd.getAttribute("page"));
148 int lines = Integer.parseInt(cmd.getAttribute("lines"));
149
150 /*
151 * Se parsea la query, identificando
152 * términos particulares.
153 */
154 HashMap fields = null;
155 if(query.indexOf(":")!=-1) {
156 fields = new HashMap();
157 int offset = 0;
158 while(true) {
159 String token;
160 if(query.indexOf(" ",offset)!=-1) {
161 token = query.substring(offset,query.indexOf(" ",offset));
162 } else {
163 token = query.substring(offset,query.length());
164 }
165 if(token.indexOf(":")!=-1) {
166 fields.put(token.substring(0,token.indexOf(":")),token.substring(token.indexOf(":")+1,token.length()));
167 } else {
168 if(fields.containsKey("contents")) {
169 fields.put("contents",((String)fields.get("contents"))+" "+token);
170 } else {
171 fields.put("contents",token);
172 }
173 }
174 offset = query.indexOf(" ",offset)+1;
175 if(offset<1) break;
176 }
177 }
178
179 /*
180 * Se realiza la búsqueda, utilizando
181 * el conjunto de términos
182 */
183 HLSearch search = new HLSearch(hls);
184 if(fields==null) {
185 search.search("contents",query);
186 } else {
187 search.search(fields);
188 }
189 int total = search.getTotalMatches();
190 ArrayList totalResults = search.getResults();
191 int cursor = pagenumber*lines;
192 lines = cursor+lines;
193 ArrayList results = new ArrayList();
194 while(cursor<lines&&cursor<total) {
195 results.add(totalResults.get(cursor));
196 cursor++;
197 }
198 ByteArrayOutputStream baos = new ByteArrayOutputStream();
199 ObjectOutputStream oos = new ObjectOutputStream(baos);
200 oos.writeObject(results);
201 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
202 reply.append("<find type=\"results\" total=\""+total+"\">");
203 while(bais.available()>0)
204 reply.append(bais.read());
205 reply.append("</find>");
206 baos.close();
207 bais.close();
208 } catch (NumberFormatException nfe) {
209 reply.append("<sever:error type=\"command\" name=\"find\" id=\"305\">");
210 reply.append("Syntax error");
211 reply.append("</server:error>");
212 hls.writeErrorLog("305 name=\"find\" [Syntax error]");
213 } catch (Exception e) {
214 reply.append("<sever:error type=\"command\" name=\"find\" id=\"305\">");
215 reply.append(e.getMessage());
216 reply.append("</server:error>");
217 hls.writeErrorLog("305 name=\"find\" ["+e.getMessage()+"]");
218 }
219 } catch(Exception e) {
220 reply.append("<sever:error type=\"command\" name=\"find\" id=\"305\">");
221 reply.append("Syntax error");
222 reply.append("</server:error>");
223 hls.writeErrorLog("305 name=\"find\" [Syntax error]");
224 }
225 } else if (active&&cmd.getName().equals("deleteall")) {
226 try {
227 IndexReader reader = IndexReader.open(FSDirectory.getDirectory(hls.getIndexDirectory(), false));
228 for(int i = reader.maxDoc(); --i >= 0; )
229 reader.delete(i);
230 reader.close();
231 reply.append("<server:delete status=\"finished\"/>");
232 } catch (NullPointerException e) {
233 reply.append("<sever:error type=\"command\" name=\"deleteall\" id=\"301\">");
234 reply.append(e.getMessage());
235 reply.append("</server:error>");
236 hls.writeErrorLog("301 name=\"deleteall\" [NullPointer]");
237 } catch(IOException e) {
238 reply.append("<sever:error type=\"command\" name=\"deleteall\" id=\"307\">");
239 reply.append(e.getMessage());
240 reply.append("</server:error>");
241 hls.writeErrorLog("307 name=\"deleteall\" ["+e.getMessage()+"]");
242 }
243 } else if (command.equals("")) {
244 reply.append("\r\n");
245 } else {
246 reply.append("<server:error type=\"protocol\">");
247 reply.append("command ");
248 reply.append(command);
249 reply.append(" not implemented");
250 reply.append("</server:error>");
251 break;
252 }
253 hls.writeSocketResponse(reply.toString());
254 reply.delete(0,reply.length());
255 }
256 finalize();
257 }
258 public Object[] getTokens(String line) {
259 if(line==null||line.length()<=0) return null;
260 ArrayList tokens = new ArrayList();
261 String separator = new String(">");
262 int start = 0;
263 int end = 0;
264 try {
265 while(true) {
266 end = line.indexOf(separator,start);
267 if(end==-1) break;
268 if(separator.equals("<")) {
269 separator = ">";
270 } else {
271 separator = "<";
272 end++;
273 }
274 tokens.add(line.substring(start,end));
275 start = end;
276 }
277 return tokens.toArray();
278 } catch (Exception e) {
279 return null;
280 }
281 }
282 public void finalize() {
283 if(hls!=null) {
284 hls.finalize();
285 }
286 hls = null;
287 interrupt();
288 }
289 }