Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }