Project

General

Profile

1 51 jones
/**
2 203 jones
 *  '$RCSfile$'
3
 *    Purpose: A Class that implements a metadata catalog as a java Servlet
4
 *  Copyright: 2000 Regents of the University of California and the
5
 *             National Center for Ecological Analysis and Synthesis
6 361 berkley
 *    Authors: Matt Jones, Dan Higgins, Jivka Bojilova, Chad Berkley
7 348 jones
 *    Release: @release@
8 154 jones
 *
9 203 jones
 *   '$Author$'
10
 *     '$Date$'
11
 * '$Revision$'
12 669 jones
 *
13
 * This program is free software; you can redistribute it and/or modify
14
 * it under the terms of the GNU General Public License as published by
15
 * the Free Software Foundation; either version 2 of the License, or
16
 * (at your option) any later version.
17
 *
18
 * This program is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU General Public License
24
 * along with this program; if not, write to the Free Software
25
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 51 jones
 */
27
28
package edu.ucsb.nceas.metacat;
29
30 733 bojilova
import java.io.File;
31 46 jones
import java.io.PrintWriter;
32
import java.io.IOException;
33 50 jones
import java.io.StringReader;
34 185 jones
import java.io.FileInputStream;
35 731 bojilova
import java.io.BufferedInputStream;
36 46 jones
import java.util.Enumeration;
37
import java.util.Hashtable;
38 341 berkley
import java.util.ResourceBundle;
39 648 berkley
import java.util.Random;
40 82 jones
import java.util.PropertyResourceBundle;
41 50 jones
import java.net.URL;
42
import java.net.MalformedURLException;
43 85 jones
import java.sql.PreparedStatement;
44
import java.sql.ResultSet;
45 50 jones
import java.sql.Connection;
46 55 jones
import java.sql.SQLException;
47 361 berkley
import java.lang.reflect.*;
48 453 berkley
import java.net.*;
49 458 berkley
import java.util.zip.*;
50 46 jones
51
import javax.servlet.ServletConfig;
52
import javax.servlet.ServletContext;
53
import javax.servlet.ServletException;
54 48 jones
import javax.servlet.ServletInputStream;
55 46 jones
import javax.servlet.http.HttpServlet;
56
import javax.servlet.http.HttpServletRequest;
57
import javax.servlet.http.HttpServletResponse;
58 210 bojilova
import javax.servlet.http.HttpSession;
59 47 jones
import javax.servlet.http.HttpUtils;
60 458 berkley
import javax.servlet.ServletOutputStream;
61 46 jones
62 50 jones
import oracle.xml.parser.v2.XSLStylesheet;
63
import oracle.xml.parser.v2.XSLException;
64
import oracle.xml.parser.v2.XMLDocumentFragment;
65
import oracle.xml.parser.v2.XSLProcessor;
66
67 204 jones
import org.xml.sax.SAXException;
68
69 46 jones
/**
70
 * A metadata catalog server implemented as a Java Servlet
71 154 jones
 *
72
 * <p>Valid parameters are:<br>
73
 * action=query -- query the values of all elements and attributes
74
 *                     and return a result set of nodes<br>
75 205 jones
 * action=squery -- structured query (see pathquery.dtd)<br>
76 731 bojilova
 * action=read -- read any metadata/data file from Metacat and from Internet<br>
77 205 jones
 * action=insert -- insert an XML document into the database store<br>
78
 * action=update -- update an XML document that is in the database store<br>
79
 * action=delete --  delete an XML document from the database store<br>
80
 * action=validate -- vallidate the xml contained in valtext<br>
81
 * doctype -- document type list returned by the query (publicID)<br>
82 154 jones
 * qformat=xml -- display resultset from query in XML<br>
83
 * qformat=html -- display resultset from query in HTML<br>
84 731 bojilova
 * qformat=zip -- zip resultset from query<br>
85 154 jones
 * docid=34 -- display the document with the document ID number 34<br>
86 205 jones
 * doctext -- XML text of the document to load into the database<br>
87 598 bojilova
 * acltext -- XML access text for a document to load into the database<br>
88
 * dtdtext -- XML DTD text for a new DTD to load into Metacat XML Catalog<br>
89 183 jones
 * query -- actual query text (to go with 'action=query' or 'action=squery')<br>
90 205 jones
 * valtext -- XML text to be validated<br>
91 731 bojilova
 * abstractpath -- XPath in metadata document to read from<br>
92 688 bojilova
 * action=getaccesscontrol -- retrieve acl info for Metacat document<br>
93
 * action=getdoctypes -- retrieve all doctypes (publicID)<br>
94 699 bojilova
 * action=getdtdschema -- retrieve a DTD or Schema file<br>
95 688 bojilova
 * action=getdataguide -- retrieve a Data Guide<br>
96 725 bojilova
 * action=getprincipals -- retrieve a list of principals in XML<br>
97 205 jones
 * datadoc -- data document name (id)<br>
98
 * <p>
99
 * The particular combination of parameters that are valid for each
100
 * particular action value is quite specific.  This documentation
101
 * will be reorganized to reflect this information.
102 46 jones
 */
103
public class MetaCatServlet extends HttpServlet {
104
105 370 berkley
  private ServletConfig config = null;
106
  private ServletContext context = null;
107
  private Hashtable connectionPool = new Hashtable();
108
  private String resultStyleURL = null;
109
  private String xmlcatalogfile = null;
110
  private String saxparser = null;
111
  private String defaultdatapath = null;
112
  private String servletpath = null;
113 380 jones
  private PropertyResourceBundle options = null;
114
  private MetaCatUtil util = null;
115
116
  // path to directory where data files
117
  // that can be downloaded will be stored
118 370 berkley
  private String htmlpath = null;
119 380 jones
  // script to get data file and put it
120
  // in defaultdocpath dir
121 370 berkley
  private String executescript  = null;
122 46 jones
123 50 jones
  /**
124
   * Initialize the servlet by creating appropriate database connections
125
   */
126 46 jones
  public void init( ServletConfig config ) throws ServletException {
127
    try {
128
      super.init( config );
129
      this.config = config;
130 332 bojilova
      this.context = config.getServletContext();
131 184 jones
      System.out.println("MetaCatServlet Initialize");
132 82 jones
133 184 jones
      util = new MetaCatUtil();
134
135 83 jones
      // Get the configuration file information
136 184 jones
      resultStyleURL = util.getOption("resultStyleURL");
137
      xmlcatalogfile = util.getOption("xmlcatalogfile");
138
      saxparser = util.getOption("saxparser");
139
      defaultdatapath = util.getOption("defaultdatapath");
140 593 berkley
      executescript = util.getOption("executescript");
141 360 bojilova
      servletpath = util.getOption("servletpath");
142
      htmlpath = util.getOption("htmlpath");
143 598 bojilova
144 731 bojilova
// MOVED IT TO doGet() & doPost()
145 598 bojilova
//      try {
146
//        // Open a pool of db connections
147
//        connectionPool = util.getConnectionPool();
148
//      } catch (Exception e) {
149
//        System.err.println("Error creating pool of database connections");
150
//        System.err.println(e.getMessage());
151
//      }
152 46 jones
    } catch ( ServletException ex ) {
153
      throw ex;
154
    }
155
  }
156
157 320 bojilova
  /**
158
   * Close all db connections from the pool
159
   */
160
  public void destroy() {
161
162
    if (util != null) {
163
        util.closeConnections();
164
    }
165
  }
166
167 50 jones
  /** Handle "GET" method requests from HTTP clients */
168 46 jones
  public void doGet (HttpServletRequest request, HttpServletResponse response)
169
    throws ServletException, IOException {
170
171 48 jones
    // Process the data and send back the response
172 59 jones
    handleGetOrPost(request, response);
173 48 jones
  }
174
175 50 jones
  /** Handle "POST" method requests from HTTP clients */
176 48 jones
  public void doPost( HttpServletRequest request, HttpServletResponse response)
177
    throws ServletException, IOException {
178
179
    // Process the data and send back the response
180 59 jones
    handleGetOrPost(request, response);
181 48 jones
  }
182
183 49 jones
  /**
184 50 jones
   * Control servlet response depending on the action parameter specified
185 49 jones
   */
186 382 berkley
  private void handleGetOrPost(HttpServletRequest request,
187 59 jones
    HttpServletResponse response)
188 355 berkley
    throws ServletException, IOException
189
 {
190 48 jones
191 309 bojilova
    if ( util == null ) {
192
        util = new MetaCatUtil();
193
    }
194 598 bojilova
    if ( connectionPool.isEmpty() ) {
195 309 bojilova
      try {
196
        // Open a pool of db connections
197
        connectionPool = util.getConnectionPool();
198
      } catch (Exception e) {
199 675 berkley
        System.err.println("Error creating pool of database connections in " +
200
                            " MetaCatServlet.handleGetOrPost");
201 309 bojilova
        System.err.println(e.getMessage());
202
      }
203
    }
204 49 jones
    // Get a handle to the output stream back to the client
205 566 jones
    //PrintWriter pwout = response.getWriter();
206 102 jones
    //response.setContentType("text/html");
207 49 jones
208 59 jones
    String name = null;
209
    String[] value = null;
210 103 jones
    String[] docid = new String[3];
211 59 jones
    Hashtable params = new Hashtable();
212
    Enumeration paramlist = request.getParameterNames();
213
    while (paramlist.hasMoreElements()) {
214
      name = (String)paramlist.nextElement();
215
      value = request.getParameterValues(name);
216 103 jones
217
      // Decode the docid and mouse click information
218
      if (name.endsWith(".y")) {
219
        docid[0] = name.substring(0,name.length()-2);
220
        params.put("docid", docid);
221
        name = "ypos";
222
      }
223
      if (name.endsWith(".x")) {
224
        name = "xpos";
225 373 berkley
      }
226 103 jones
227 373 berkley
      params.put(name,value);
228
    }
229 355 berkley
230 509 bojilova
    //if the user clicked on the input images, decode which image
231
    //was clicked then set the action.
232 505 jones
    String action = ((String[])params.get("action"))[0];
233
    util.debugMessage("Line 213: Action is: " + action);
234 509 bojilova
235 380 jones
    // This block handles session management for the servlet
236
    // by looking up the current session information for all actions
237 509 bojilova
    // other than "login" and "logout"
238 425 bojilova
    String username = null;
239 725 bojilova
    String password = null;
240 425 bojilova
    String groupname = null;
241 648 berkley
    String sess_id = null;
242 509 bojilova
243
    // handle login action
244
    if (action.equals("login")) {
245
246 458 berkley
      handleLoginAction(response.getWriter(), params, request, response);
247 509 bojilova
248 210 bojilova
    // handle logout action
249 509 bojilova
    } else if (action.equals("logout")) {
250 361 berkley
251 509 bojilova
      handleLogoutAction(response.getWriter(), params, request, response);
252 361 berkley
253 251 bojilova
    // aware of session expiration on every request
254 343 jones
    } else {
255 509 bojilova
256 332 bojilova
      HttpSession sess = request.getSession(true);
257
      if (sess.isNew()) {
258 251 bojilova
        // session expired or has not been stored b/w user requests
259 441 bojilova
        username = "public";
260 673 bojilova
        sess.setAttribute("username", username);
261 425 bojilova
      } else {
262
        username = (String)sess.getAttribute("username");
263 725 bojilova
        password = (String)sess.getAttribute("password");
264 425 bojilova
        groupname = (String)sess.getAttribute("groupname");
265 731 bojilova
        try {
266 648 berkley
          sess_id = (String)sess.getId();
267 731 bojilova
        } catch(IllegalStateException ise) {
268 648 berkley
          System.out.println("error in handleGetOrPost: this shouldn't " +
269
                             "happen: the session should be valid: " +
270
                             ise.getMessage());
271
        }
272 425 bojilova
      }
273 210 bojilova
    }
274 219 jones
275 380 jones
    // Now that we know the session is valid, we can delegate the request
276
    // to a particular action handler
277 731 bojilova
    if(action.equals("query")) {
278 458 berkley
      handleQuery(response.getWriter(), params, response, username, groupname);
279 731 bojilova
    } else if(action.equals("squery")) {
280
      if(params.containsKey("query")) {
281 458 berkley
        handleSQuery(response.getWriter(), params, response, username, groupname);
282 731 bojilova
      } else {
283 458 berkley
        PrintWriter out = response.getWriter();
284 373 berkley
        out.println("Illegal action squery without \"query\" parameter");
285
      }
286 731 bojilova
    } else if (action.equals("read")) {
287
      handleReadAction(params, response, username, groupname);
288
    } else if (action.equals("insert") || action.equals("update")) {
289 458 berkley
      PrintWriter out = response.getWriter();
290 509 bojilova
      if ( (username != null) &&  !username.equals("public") ) {
291 425 bojilova
        handleInsertOrUpdateAction(out, params, response, username, groupname);
292
      } else {
293
        out.println("Permission denied for " + action);
294
      }
295 203 jones
    } else if (action.equals("delete")) {
296 458 berkley
      PrintWriter out = response.getWriter();
297 509 bojilova
      if ( (username != null) &&  !username.equals("public") ) {
298 425 bojilova
        handleDeleteAction(out, params, response, username, groupname);
299
      } else {
300
        out.println("Permission denied for " + action);
301
      }
302 68 higgins
    } else if (action.equals("validate")) {
303 458 berkley
      PrintWriter out = response.getWriter();
304 437 berkley
      handleValidateAction(out, params, response);
305 648 berkley
    } else if (action.equals("getdataport")) {
306
      PrintWriter out = response.getWriter();
307 649 berkley
      if ( (username != null) &&  !username.equals("public") ) {
308 648 berkley
      handleGetDataPortAction(out, params, response, username, groupname,
309
                              sess_id);
310 649 berkley
      } else {
311
        out.println("You must be authenticated to perform the getdataport " +
312
                    "action!");
313
      }
314 731 bojilova
    } else if (action.equals("getaccesscontrol")) {
315
      PrintWriter out = response.getWriter();
316
      handleGetAccessControlAction(out, params, response, username, groupname);
317
    } else if (action.equals("getprincipals")) {
318
      PrintWriter out = response.getWriter();
319
      handleGetPrincipalsAction(out, username, password);
320
    } else if (action.equals("getdoctypes")) {
321
      PrintWriter out = response.getWriter();
322
      handleGetDoctypesAction(out, params, response);
323 699 bojilova
    } else if (action.equals("getdtdschema")) {
324
      PrintWriter out = response.getWriter();
325
      handleGetDTDSchemaAction(out, params, response);
326 302 bojilova
    } else if (action.equals("getdataguide")) {
327 458 berkley
      PrintWriter out = response.getWriter();
328 302 bojilova
      handleGetDataGuideAction(out, params, response);
329 509 bojilova
    } else if (action.equals("login") || action.equals("logout")) {
330 566 jones
    } else if (action.equals("protocoltest")) {
331
      String testURL = "metacat://dev.nceas.ucsb.edu/NCEAS.897766.9";
332
      try {
333
        testURL = ((String[])params.get("url"))[0];
334
      } catch (Throwable t) {
335
      }
336
      String phandler = System.getProperty("java.protocol.handler.pkgs");
337
      response.setContentType("text/html");
338
      PrintWriter out = response.getWriter();
339
      out.println("<body bgcolor=\"white\">");
340
      out.println("<p>Handler property: <code>" + phandler + "</code></p>");
341
      out.println("<p>Starting test for:<br>");
342
      out.println("    " + testURL + "</p>");
343
      try {
344
        URL u = new URL(testURL);
345
        out.println("<pre>");
346
        out.println("Protocol: " + u.getProtocol());
347
        out.println("    Host: " + u.getHost());
348
        out.println("    Port: " + u.getPort());
349
        out.println("    Path: " + u.getPath());
350
        out.println("     Ref: " + u.getRef());
351
        String pquery = u.getQuery();
352
        out.println("   Query: " + pquery);
353
        out.println("  Params: ");
354
        if (pquery != null) {
355
          Hashtable qparams = util.parseQuery(u.getQuery());
356
          for (Enumeration en = qparams.keys(); en.hasMoreElements(); ) {
357
            String pname = (String)en.nextElement();
358
            String pvalue = (String)qparams.get(pname);
359
            out.println("    " + pname + ": " + pvalue);
360
          }
361
        }
362
        out.println("</pre>");
363
        out.println("</body>");
364
        out.close();
365
      } catch (MalformedURLException mue) {
366 675 berkley
        System.out.println("bad url from MetacatServlet.handleGetOrPost");
367 566 jones
        out.println(mue.getMessage());
368
        mue.printStackTrace(out);
369
        out.close();
370
      }
371 50 jones
    } else {
372 458 berkley
      PrintWriter out = response.getWriter();
373 50 jones
      out.println("Error: action not registered.  Please report this error.");
374 46 jones
    }
375 731 bojilova
376 465 berkley
    util.closeConnections();
377 49 jones
    // Close the stream to the client
378 731 bojilova
    // out.close();
379 46 jones
  }
380 355 berkley
381 731 bojilova
  // LOGIN & LOGOUT SECTION
382 50 jones
  /**
383 509 bojilova
   * Handle the login request. Create a new session object.
384 503 bojilova
   * Do user authentication through the session.
385 210 bojilova
   */
386
  private void handleLoginAction(PrintWriter out, Hashtable params,
387
               HttpServletRequest request, HttpServletResponse response) {
388 251 bojilova
389 503 bojilova
    AuthSession sess = null;
390 228 bojilova
    String un = ((String[])params.get("username"))[0];
391
    String pw = ((String[])params.get("password"))[0];
392 297 bojilova
    String action = ((String[])params.get("action"))[0];
393 509 bojilova
    String qformat = ((String[])params.get("qformat"))[0];
394 332 bojilova
395 297 bojilova
    try {
396 509 bojilova
      sess = new AuthSession();
397 297 bojilova
    } catch (Exception e) {
398 675 berkley
      System.out.println("error in MetacatServlet.handleLoginAction: " +
399
                          e.getMessage());
400 297 bojilova
      out.println(e.getMessage());
401 509 bojilova
      return;
402 297 bojilova
    }
403 411 bojilova
404 509 bojilova
    boolean isValid = sess.authenticate(request, un, pw);
405
406
    // format and transform the output
407
    if (qformat.equals("html")) {
408
      Connection conn = null;
409 503 bojilova
      try {
410 509 bojilova
        conn = util.getConnection();
411
        DBTransform trans = new DBTransform(conn);
412
        response.setContentType("text/html");
413 510 bojilova
        trans.transformXMLDocument(sess.getMessage(), "-//NCEAS//login//EN",
414
                                   "-//W3C//HTML//EN", out);
415 509 bojilova
        util.returnConnection(conn);
416
      } catch(Exception e) {
417
        util.returnConnection(conn);
418
      }
419
420
    // any output is returned
421
    } else {
422
      response.setContentType("text/xml");
423
      out.println(sess.getMessage());
424 503 bojilova
    }
425 370 berkley
  }
426 509 bojilova
427
  /**
428
   * Handle the logout request. Close the connection.
429
   */
430
  private void handleLogoutAction(PrintWriter out, Hashtable params,
431
               HttpServletRequest request, HttpServletResponse response) {
432
433
    String qformat = ((String[])params.get("qformat"))[0];
434
435
    // close the connection
436
    HttpSession sess = request.getSession(false);
437
    if (sess != null) { sess.invalidate();  }
438
439
    // produce output
440
    StringBuffer output = new StringBuffer();
441
    output.append("<?xml version=\"1.0\"?>");
442 510 bojilova
    output.append("<logout>");
443
    output.append("User logged out");
444
    output.append("</logout>");
445 509 bojilova
446
    //format and transform the output
447
    if (qformat.equals("html")) {
448
      Connection conn = null;
449
      try {
450
        conn = util.getConnection();
451
        DBTransform trans = new DBTransform(conn);
452
        response.setContentType("text/html");
453 510 bojilova
        trans.transformXMLDocument(output.toString(), "-//NCEAS//login//EN",
454
                                   "-//W3C//HTML//EN", out);
455 509 bojilova
        util.returnConnection(conn);
456
      } catch(Exception e) {
457
        util.returnConnection(conn);
458
      }
459
    // any output is returned
460
    } else {
461
      response.setContentType("text/xml");
462
      out.println(output.toString());
463
    }
464
  }
465 731 bojilova
  // END OF LOGIN & LOGOUT SECTION
466 370 berkley
467 731 bojilova
  // SQUERY & QUERY SECTION
468 373 berkley
  /**
469 380 jones
   * Retreive the squery xml, execute it and display it
470
   *
471
   * @param out the output stream to the client
472
   * @param params the Hashtable of parameters that should be included
473
   * in the squery.
474
   * @param response the response object linked to the client
475
   * @param conn the database connection
476
   */
477
  protected void handleSQuery(PrintWriter out, Hashtable params,
478 441 bojilova
                 HttpServletResponse response, String user, String group)
479 373 berkley
  {
480 380 jones
    String xmlquery = ((String[])params.get("query"))[0];
481
    String qformat = ((String[])params.get("qformat"))[0];
482 465 berkley
    String resultdoc = null;
483
484 745 jones
    Hashtable doclist = runQuery(xmlquery, user, group);
485 444 berkley
486 465 berkley
    resultdoc = createResultDocument(doclist, transformQuery(xmlquery));
487
488 380 jones
    //format and transform the results
489
    if(qformat.equals("html")) {
490
      transformResultset(resultdoc, response, out);
491
    } else if(qformat.equals("xml")) {
492
      response.setContentType("text/xml");
493
      out.println(resultdoc);
494
    } else {
495
      out.println("invalid qformat: " + qformat);
496
    }
497 341 berkley
  }
498
499
   /**
500 380 jones
    * Create the xml query, execute it and display the results.
501
    *
502
    * @param out the output stream to the client
503
    * @param params the Hashtable of parameters that should be included
504 370 berkley
    * in the squery.
505 380 jones
    * @param response the response object linked to the client
506 370 berkley
    */
507 375 berkley
  protected void handleQuery(PrintWriter out, Hashtable params,
508 441 bojilova
                 HttpServletResponse response, String user, String group)
509 341 berkley
  {
510 370 berkley
    //create the query and run it
511 373 berkley
    String xmlquery = DBQuery.createSQuery(params);
512 745 jones
    Hashtable doclist = runQuery(xmlquery, user, group);
513 465 berkley
    String qformat = ((String[])params.get("qformat"))[0];
514
    String resultdoc = null;
515
516
    resultdoc = createResultDocument(doclist, transformQuery(params));
517 425 bojilova
518 370 berkley
    //format and transform the results
519 380 jones
    if(qformat.equals("html")) {
520 370 berkley
      transformResultset(resultdoc, response, out);
521 380 jones
    } else if(qformat.equals("xml")) {
522 370 berkley
      response.setContentType("text/xml");
523
      out.println(resultdoc);
524 443 berkley
    } else {
525 370 berkley
      out.println("invalid qformat: " + qformat);
526
    }
527 341 berkley
  }
528
529
  /**
530 384 berkley
   * Removes the <?xml version="x"?> tag from the beginning of xmlquery
531
   * so it can properly be placed in the <query> tag of the resultset.
532
   * This method is overwritable so that other applications can customize
533
   * the structure of what is in the <query> tag.
534
   *
535
   * @param xmlquery is the query to remove the <?xml version="x"?> tag from.
536
   */
537
  protected String transformQuery(Hashtable params)
538
  {
539
    //DBQuery.createSQuery is a re-calling of a previously called
540
    //function but it is necessary
541
    //so that overriding methods have access to the params hashtable
542
    String xmlquery = DBQuery.createSQuery(params);
543
    //the <?xml version="1.0"?> tag is the first 22 characters of the
544
    xmlquery = xmlquery.trim();
545
    int index = xmlquery.indexOf("?>");
546
    return xmlquery.substring(index + 2, xmlquery.length());
547
  }
548
549
  /**
550 443 berkley
   * removes the <?xml version="1.0"?> tag from the beginning.  This takes a
551
   * string as a param instead of a hashtable.
552
   *
553
   * @param xmlquery a string representing a query.
554
   */
555
  protected String transformQuery(String xmlquery)
556
  {
557
    xmlquery = xmlquery.trim();
558
    int index = xmlquery.indexOf("?>");
559
    return xmlquery.substring(index + 2, xmlquery.length());
560
  }
561
562
  /**
563 380 jones
   * Run the query and return a hashtable of results.
564
   *
565
   * @param xmlquery the query to run
566
   */
567 745 jones
  private Hashtable runQuery(String xmlquery, String user, String group)
568 341 berkley
  {
569
    Hashtable doclist=null;
570
    Connection conn = null;
571
    try
572
    {
573 441 bojilova
      conn = util.getConnection();
574
      DBQuery queryobj = new DBQuery(conn, saxparser);
575 745 jones
      doclist = queryobj.findDocuments(new StringReader(xmlquery),user,group);
576 441 bojilova
      util.returnConnection(conn);
577
      return doclist;
578 341 berkley
    }
579
    catch (Exception e)
580
    {
581 441 bojilova
      util.returnConnection(conn);
582 675 berkley
      util.debugMessage("Error in MetacatServlet.runQuery: " + e.getMessage());
583 341 berkley
      doclist = null;
584
      return doclist;
585
    }
586
  }
587
588 380 jones
  /**
589 370 berkley
   * Transorms an xml resultset document to html and sends it to the browser
590 380 jones
   *
591 370 berkley
   * @param resultdoc the string representation of the document that needs
592
   * to be transformed.
593
   * @param response the HttpServletResponse object bound to the client.
594
   * @param out the output stream to the client
595 375 berkley
   */
596
  protected void transformResultset(String resultdoc,
597 380 jones
                                    HttpServletResponse response,
598
                                    PrintWriter out)
599 370 berkley
  {
600
    Connection conn = null;
601 380 jones
    try {
602 370 berkley
      conn = util.getConnection();
603
      DBTransform trans = new DBTransform(conn);
604
      response.setContentType("text/html");
605
      trans.transformXMLDocument(resultdoc, "-//NCEAS//resultset//EN",
606
                                 "-//W3C//HTML//EN", out);
607 382 berkley
      util.returnConnection(conn);
608
    }
609
    catch(Exception e)
610
    {
611 441 bojilova
      util.returnConnection(conn);
612 370 berkley
    }
613
  }
614
615 355 berkley
  /**
616
   * Transforms a hashtable of documents to an xml or html result.
617 380 jones
   *
618 355 berkley
   * @param doclist- the hashtable to transform
619 744 jones
   * @param xmlquery- the query that returned the doclist result
620 355 berkley
   */
621 375 berkley
  protected String createResultDocument(Hashtable doclist, String xmlquery)
622 341 berkley
  {
623
    // Create a buffer to hold the xml result
624
    StringBuffer resultset = new StringBuffer();
625
626 382 berkley
    // Print the resulting root nodes
627 341 berkley
    String docid = null;
628
    String document = null;
629
    resultset.append("<?xml version=\"1.0\"?>\n");
630
    resultset.append("<resultset>\n");
631 465 berkley
632 384 berkley
    resultset.append("  <query>" + xmlquery + "</query>");
633 478 berkley
634
    if(doclist != null)
635 341 berkley
    {
636 478 berkley
      Enumeration doclistkeys = doclist.keys();
637
      while (doclistkeys.hasMoreElements())
638
      {
639
        docid = (String)doclistkeys.nextElement();
640
        document = (String)doclist.get(docid);
641
        resultset.append("  <document>" + document + "</document>");
642
      }
643
    }
644
645 341 berkley
    resultset.append("</resultset>");
646 370 berkley
    return resultset.toString();
647 341 berkley
  }
648 731 bojilova
  // END OF SQUERY & QUERY SECTION
649 437 berkley
650 731 bojilova
  // READ SECTION
651
  /**
652
   * Handle the "read" request of metadata/data files from Metacat
653
   * or any files from Internet;
654
   * transformed metadata XML document into HTML presentation if requested;
655
   * zip files when more than one were requested.
656
   *
657
   * @param params the Hashtable of HTTP request parameters
658
   * @param response the HTTP response object linked to the client
659
   * @param user the username sent the request
660
   * @param group the user's groupname
661 437 berkley
   */
662 731 bojilova
  private void handleReadAction(Hashtable params, HttpServletResponse response,
663
                                String user, String group)
664 437 berkley
  {
665 731 bojilova
    ServletOutputStream out = null;
666
    ZipOutputStream zout = null;
667
668
    try {
669
      String[] docs = new String[0];
670
      String docid = "";
671
      String qformat = "";
672
      String abstrpath = null;
673
      boolean zip = false;
674
      // read the params
675
      if (params.containsKey("docid")) {
676
        docs = (String[])params.get("docid");
677 437 berkley
      }
678 731 bojilova
      if (params.containsKey("qformat")) {
679
        qformat = ((String[])params.get("qformat"))[0];
680 437 berkley
      }
681 731 bojilova
      if (params.containsKey("abstractpath")) {
682
        abstrpath = ((String[])params.get("abstractpath"))[0];
683 738 bojilova
        if ( !abstrpath.equals("") && (abstrpath != null) ) {
684
          viewAbstract(response, abstrpath, docs[0]);
685
          return;
686
        }
687 437 berkley
      }
688 731 bojilova
      if ( (docs.length > 1) || qformat.equals("zip") ) {
689
        zip = true;
690
        out = response.getOutputStream();
691
        response.setContentType("application/zip"); //MIME type
692
        zout = new ZipOutputStream(out);
693
      }
694
      // go through the list of docs to read
695
      for (int i=0; i < docs.length; i++ ) {
696
        try {
697
698
          URL murl = new URL(docs[i]);
699
          Hashtable murlQueryStr = util.parseQuery(murl.getQuery());
700
          // case docid="http://.../?docid=aaa"
701
          // or docid="metacat://.../?docid=bbb"
702
          if (murlQueryStr.containsKey("docid")) {
703
            // get only docid, eliminate the rest
704
            docid = (String)murlQueryStr.get("docid");
705
            if ( zip ) {
706
              addDocToZip(docid, zout);
707
            } else {
708
              readFromMetacat(response, docid, qformat, abstrpath,
709
                              user, group, zip, zout);
710
            }
711
712
          // case docid="http://.../filename"
713
          } else {
714
            docid = docs[i];
715
            if ( zip ) {
716
              addDocToZip(docid, zout);
717
            } else {
718
              readFromURLConnection(response, docid);
719
            }
720
          }
721
722
        // case docid="ccc"
723
        } catch (MalformedURLException mue) {
724
          docid = docs[i];
725
          if ( zip ) {
726
            addDocToZip(docid, zout);
727
          } else {
728
            readFromMetacat(response, docid, qformat, abstrpath,
729
                            user, group, zip, zout);
730
          }
731
        }
732
733
      } /* end for */
734
735
      if ( zip ) {
736
        zout.finish(); //terminate the zip file
737
        zout.close();  //close the zip stream
738
      }
739
740
    } catch (Exception e) {
741
      try {
742
        if ( out != null ) { out.close(); }
743
        if ( zout != null ) { zout.close(); }
744
        response.setContentType("text/xml"); //MIME type
745
        PrintWriter pw = response.getWriter();
746
        pw.println(e.getMessage());
747
      } catch (IOException ioe) {
748
        System.out.println("Problem with the servlet output " +
749
                           "in MetacatServlet.handleReadAction: " +
750
                           ioe.getMessage());
751
        ioe.printStackTrace(System.out);
752
753
      }
754
755
      System.out.println("Error in MetacatServlet.handleReadAction: " +
756 675 berkley
                         e.getMessage());
757 731 bojilova
      e.printStackTrace(System.out);
758 437 berkley
    }
759
760
  }
761 731 bojilova
762
  // read metadata or data from Metacat
763
  private void readFromMetacat(HttpServletResponse response, String docid,
764
                               String qformat, String abstrpath, String user,
765
                               String group, boolean zip, ZipOutputStream zout)
766
               throws ClassNotFoundException, IOException, SQLException,
767
                      McdbException, Exception
768 453 berkley
  {
769
    Connection conn = null;
770 731 bojilova
    try {
771
      conn = util.getConnection();
772
      DocumentImpl doc = new DocumentImpl(conn, docid);
773 453 berkley
774 731 bojilova
      if ( doc.getRootNodeID() == 0 ) {
775
        // this is data file
776
        ServletOutputStream out = response.getOutputStream();
777
        String filepath = util.getOption("datafilepath");
778
        if(!filepath.endsWith("/")) {
779
          filepath += "/";
780
        }
781
        String filename = filepath + doc.getDocname();      //MIME type
782
        String contentType = getServletContext().getMimeType(filename);
783
        if (contentType == null) {
784
          if (filename.endsWith(".xml")) {
785
            contentType="text/xml";
786
          } else if (filename.endsWith(".css")) {
787
            contentType="text/css";
788
          } else if (filename.endsWith(".dtd")) {
789
            contentType="text/plain";
790
          } else if (filename.endsWith(".xsd")) {
791 733 bojilova
            contentType="text/xml";
792 731 bojilova
          } else if (filename.endsWith("/")) {
793 733 bojilova
            contentType="text/html";
794 731 bojilova
          } else {
795 733 bojilova
            File f = new File(filename);
796
            if ( f.isDirectory() ) {
797
              contentType="text/html";
798
            } else {
799
              contentType="application/octet-stream";
800
            }
801 453 berkley
          }
802
        }
803 731 bojilova
        response.setContentType(contentType);
804 733 bojilova
        // if we decide to use "application/octet-stream" for all data returns
805
        // response.setContentType("application/octet-stream");
806 731 bojilova
        FileInputStream fin = null;
807
        try {
808
          fin = new FileInputStream(filename);
809
          byte[] buf = new byte[4 * 1024]; // 4K buffer
810
          int b = fin.read(buf);
811
          while (b != -1) {
812
            out.write(buf, 0, b);
813
            b = fin.read(buf);
814 453 berkley
          }
815 731 bojilova
        } finally {
816
          if (fin != null) fin.close();
817 453 berkley
        }
818 731 bojilova
819
      } else {
820
        // this is metadata doc
821
        if ( qformat.equals("html") ) {
822
          response.setContentType("text/html");  //MIME type
823
          PrintWriter out = response.getWriter();
824
825
          // Look up the document type
826
          String doctype = doc.getDoctype();
827
          // Transform the document to the new doctype
828
          DBTransform dbt = new DBTransform(conn);
829
          dbt.transformXMLDocument(doc.toString(),
830
                                   doctype,"-//W3C//HTML//EN",out);
831
        } else {
832
          // set content type first
833
          response.setContentType("text/xml");   //MIME type
834
          PrintWriter out = response.getWriter();
835
          doc.toXml(out);
836
        }
837
838 453 berkley
      }
839 731 bojilova
    } finally {
840
      util.returnConnection(conn);
841
    }
842
843
  }
844 453 berkley
845 731 bojilova
  // read data from URLConnection
846
  private void readFromURLConnection(HttpServletResponse response, String docid)
847
               throws IOException, MalformedURLException
848 566 jones
  {
849 731 bojilova
    ServletOutputStream out = response.getOutputStream();
850
    String contentType = getServletContext().getMimeType(docid); //MIME type
851
    if (contentType == null) {
852
      if (docid.endsWith(".xml")) {
853
        contentType="text/xml";
854
      } else if (docid.endsWith(".css")) {
855
        contentType="text/css";
856
      } else if (docid.endsWith(".dtd")) {
857
        contentType="text/plain";
858
      } else if (docid.endsWith(".xsd")) {
859 733 bojilova
        contentType="text/xml";
860 731 bojilova
      } else if (docid.endsWith("/")) {
861 733 bojilova
        contentType="text/html";
862 731 bojilova
      } else {
863 733 bojilova
        File f = new File(docid);
864
        if ( f.isDirectory() ) {
865
          contentType="text/html";
866
        } else {
867
          contentType="application/octet-stream";
868
        }
869 731 bojilova
      }
870
    }
871
    response.setContentType(contentType);
872 733 bojilova
    // if we decide to use "application/octet-stream" for all data returns
873
    // response.setContentType("application/octet-stream");
874 731 bojilova
875
    // this is http url
876
    URL url = new URL(docid);
877
    BufferedInputStream bis = null;
878 566 jones
    try {
879 731 bojilova
      bis = new BufferedInputStream(url.openStream());
880
      byte[] buf = new byte[4 * 1024]; // 4K buffer
881
      int b = bis.read(buf);
882
      while (b != -1) {
883
        out.write(buf, 0, b);
884
        b = bis.read(buf);
885 636 berkley
      }
886 731 bojilova
    } finally {
887
      if (bis != null) bis.close();
888 566 jones
    }
889 731 bojilova
890 566 jones
  }
891 636 berkley
892 731 bojilova
  // read file/doc and write to ZipOutputStream
893
  private void addDocToZip(String docid, ZipOutputStream zout)
894
               throws ClassNotFoundException, IOException, SQLException,
895
                      McdbException, Exception
896 636 berkley
  {
897 731 bojilova
    byte[] bytestring = null;
898
    ZipEntry zentry = null;
899
900
    try {
901
      URL url = new URL(docid);
902
903
      // this http url; read from URLConnection; add to zip
904
      zentry = new ZipEntry(docid);
905
      zout.putNextEntry(zentry);
906
      BufferedInputStream bis = null;
907
      try {
908
        bis = new BufferedInputStream(url.openStream());
909
        byte[] buf = new byte[4 * 1024]; // 4K buffer
910
        int b = bis.read(buf);
911
        while(b != -1) {
912
          zout.write(buf, 0, b);
913
          b = bis.read(buf);
914
        }
915
      } finally {
916
        if (bis != null) bis.close();
917 636 berkley
      }
918 731 bojilova
      zout.closeEntry();
919
920
    } catch (MalformedURLException mue) {
921 661 berkley
922 731 bojilova
      // this is metacat doc (data file or metadata doc)
923
      Connection conn = null;
924
      try {
925
        conn = util.getConnection();
926
        DocumentImpl doc = new DocumentImpl(conn, docid);
927 661 berkley
928 731 bojilova
        if ( doc.getRootNodeID() == 0 ) {
929
          // this is data file; add file to zip
930
          String filepath = util.getOption("datafilepath");
931
          if(!filepath.endsWith("/")) {
932
            filepath += "/";
933
          }
934
          String filename = filepath + doc.getDocname();
935
          zentry = new ZipEntry(filename);
936
          zout.putNextEntry(zentry);
937
          FileInputStream fin = null;
938
          try {
939
            fin = new FileInputStream(filename);
940
            byte[] buf = new byte[4 * 1024]; // 4K buffer
941
            int b = fin.read(buf);
942
            while (b != -1) {
943
              zout.write(buf, 0, b);
944
              b = fin.read(buf);
945
            }
946
          } finally {
947
            if (fin != null) fin.close();
948
          }
949
          zout.closeEntry();
950
951
        } else {
952
          // this is metadata doc; add doc to zip
953
          bytestring = doc.toString().getBytes();
954
          zentry = new ZipEntry(docid + ".xml");
955
          zentry.setSize(bytestring.length);
956
          zout.putNextEntry(zentry);
957
          zout.write(bytestring, 0, bytestring.length);
958
          zout.closeEntry();
959 636 berkley
        }
960 731 bojilova
      } finally {
961
        util.returnConnection(conn);
962 636 berkley
      }
963
964
    }
965 731 bojilova
966 636 berkley
  }
967 731 bojilova
968
  // view abstract within document
969
  private void viewAbstract(HttpServletResponse response,
970
                            String abstractpath, String docid)
971
               throws ClassNotFoundException, IOException, SQLException,
972
                      McdbException, Exception
973
  {
974 309 bojilova
    Connection conn = null;
975 102 jones
    try {
976 309 bojilova
      conn = util.getConnection();
977 731 bojilova
978
      Object[] abstracts = DBQuery.getNodeContent(abstractpath, docid, conn);
979
980
      response.setContentType("text/html");  //MIME type
981
      PrintWriter out = response.getWriter();
982
      out.println("<html><head><title>Abstract</title></head>");
983
      out.println("<body bgcolor=\"white\"><h1>Abstract</h1>");
984
      for (int i=0; i<abstracts.length; i++) {
985
        out.println("<p>" + (String)abstracts[i] + "</p>");
986
      }
987
      out.println("</body></html>");
988 85 jones
989 309 bojilova
    } finally {
990 320 bojilova
      util.returnConnection(conn);
991 731 bojilova
    }
992 49 jones
  }
993 731 bojilova
  // END OF READ SECTION
994
995
  // INSERT/UPDATE SECTION
996 55 jones
  /**
997
   * Handle the database putdocument request and write an XML document
998
   * to the database connection
999
   */
1000 382 berkley
  private void handleInsertOrUpdateAction(PrintWriter out, Hashtable params,
1001 425 bojilova
               HttpServletResponse response, String user, String group) {
1002 59 jones
1003 309 bojilova
    Connection conn = null;
1004
1005 204 jones
    try {
1006
      // Get the document indicated
1007
      String[] doctext = (String[])params.get("doctext");
1008 557 bojilova
1009 680 bojilova
      String pub = null;
1010
      if (params.containsKey("public")) {
1011
        pub = ((String[])params.get("public"))[0];
1012 557 bojilova
      }
1013 680 bojilova
1014 598 bojilova
      StringReader dtd = null;
1015 680 bojilova
      if (params.containsKey("dtdtext")) {
1016 598 bojilova
        String[] dtdtext = (String[])params.get("dtdtext");
1017
        try {
1018 619 bojilova
          if ( !dtdtext[0].equals("") ) {
1019
            dtd = new StringReader(dtdtext[0]);
1020
          }
1021 598 bojilova
        } catch (NullPointerException npe) {}
1022
      }
1023 557 bojilova
1024 204 jones
      StringReader xml = null;
1025 695 bojilova
      boolean validate = false;
1026 204 jones
      try {
1027 695 bojilova
        // look inside XML Document for <!DOCTYPE ... PUBLIC/SYSTEM ... >
1028
        // in order to decide whether to use validation parser
1029
        validate = validateXML(doctext[0]);
1030 204 jones
        xml = new StringReader(doctext[0]);
1031 59 jones
1032 204 jones
        String[] action = (String[])params.get("action");
1033
        String[] docid = (String[])params.get("docid");
1034
        String newdocid = null;
1035 203 jones
1036 204 jones
        String doAction = null;
1037
        if (action[0].equals("insert")) {
1038
          doAction = "INSERT";
1039
        } else if (action[0].equals("update")) {
1040
          doAction = "UPDATE";
1041
        }
1042 203 jones
1043 204 jones
        try {
1044 680 bojilova
          // get a connection from the pool
1045
          conn = util.getConnection();
1046 408 jones
1047 680 bojilova
          // write the document to the database
1048
          try {
1049
            String accNumber = docid[0];
1050
            if (accNumber.equals("")) {
1051
              accNumber = null;
1052 309 bojilova
            }
1053 680 bojilova
            newdocid = DocumentImpl.write(conn, xml, pub, dtd, doAction,
1054 695 bojilova
                                          accNumber, user, group, validate);
1055 680 bojilova
          } catch (NullPointerException npe) {
1056
            newdocid = DocumentImpl.write(conn, xml, pub, dtd, doAction,
1057 695 bojilova
                                          null, user, group, validate);
1058 680 bojilova
          }
1059 309 bojilova
        } finally {
1060 320 bojilova
          util.returnConnection(conn);
1061 309 bojilova
        }
1062
1063 204 jones
        // set content type and other response header fields first
1064
        response.setContentType("text/xml");
1065
        out.println("<?xml version=\"1.0\"?>");
1066
        out.println("<success>");
1067
        out.println("<docid>" + newdocid + "</docid>");
1068
        out.println("</success>");
1069
1070 203 jones
      } catch (NullPointerException npe) {
1071 204 jones
        response.setContentType("text/xml");
1072
        out.println("<?xml version=\"1.0\"?>");
1073
        out.println("<error>");
1074
        out.println(npe.getMessage());
1075
        out.println("</error>");
1076 55 jones
      }
1077 204 jones
    } catch (Exception e) {
1078
      response.setContentType("text/xml");
1079
      out.println("<?xml version=\"1.0\"?>");
1080
      out.println("<error>");
1081
      out.println(e.getMessage());
1082
      if (e instanceof SAXException) {
1083
        Exception e2 = ((SAXException)e).getException();
1084
        out.println("<error>");
1085
        out.println(e2.getMessage());
1086
        out.println("</error>");
1087
      }
1088
      //e.printStackTrace(out);
1089
      out.println("</error>");
1090 203 jones
    }
1091 55 jones
  }
1092 203 jones
1093
  /**
1094 695 bojilova
   * Parse XML Document to look for <!DOCTYPE ... PUBLIC/SYSTEM ... >
1095
   * in order to decide whether to use validation parser
1096
   */
1097
  private static boolean validateXML(String xmltext) throws IOException {
1098
1099
    StringReader xmlreader = new StringReader(xmltext);
1100
    StringBuffer cbuff = new StringBuffer();
1101
    java.util.Stack st = new java.util.Stack();
1102
    boolean validate = false;
1103
    int c;
1104
    int inx;
1105
1106
    // read from the stream until find the keywords
1107
    while ( (st.empty() || st.size()<4) && ((c = xmlreader.read()) != -1) ) {
1108
      cbuff.append((char)c);
1109
1110
      // "<!DOCTYPE" keyword is found; put it in the stack
1111
      if ( (inx = cbuff.toString().indexOf("<!DOCTYPE")) != -1 ) {
1112
        cbuff = new StringBuffer();
1113
        st.push("<!DOCTYPE");
1114
      }
1115
      // "PUBLIC" keyword is found; put it in the stack
1116
      if ( (inx = cbuff.toString().indexOf("PUBLIC")) != -1 ) {
1117
        cbuff = new StringBuffer();
1118
        st.push("PUBLIC");
1119
      }
1120
      // "SYSTEM" keyword is found; put it in the stack
1121
      if ( (inx = cbuff.toString().indexOf("SYSTEM")) != -1 ) {
1122
        cbuff = new StringBuffer();
1123
        st.push("SYSTEM");
1124
      }
1125
      // ">" character is found; put it in the stack
1126
      // ">" is found twice: fisrt from <?xml ...?>
1127
      // and second from <!DOCTYPE ... >
1128
      if ( (inx = cbuff.toString().indexOf(">")) != -1 ) {
1129
        cbuff = new StringBuffer();
1130
        st.push(">");
1131
      }
1132
    }
1133
1134
    // close the stream
1135
    xmlreader.close();
1136
1137
    // check the stack whether it contains the keywords:
1138
    // "<!DOCTYPE", "PUBLIC" or "SYSTEM", and ">" in this order
1139
    if ( st.size() == 4 ) {
1140
      if ( ((String)st.pop()).equals(">") &&
1141
           ( ((String)st.peek()).equals("PUBLIC") |
1142
             ((String)st.pop()).equals("SYSTEM") ) &&
1143
           ((String)st.pop()).equals("<!DOCTYPE") )  {
1144
        validate = true;
1145
      }
1146
    }
1147
1148
System.out.println("Validation is " + validate);
1149
    return validate;
1150
  }
1151 731 bojilova
  // END OF INSERT/UPDATE SECTION
1152 695 bojilova
1153 731 bojilova
  // DELETE SECTION
1154 695 bojilova
  /**
1155 203 jones
   * Handle the database delete request and delete an XML document
1156
   * from the database connection
1157
   */
1158
  private void handleDeleteAction(PrintWriter out, Hashtable params,
1159 425 bojilova
               HttpServletResponse response, String user, String group) {
1160 203 jones
1161
    String[] docid = (String[])params.get("docid");
1162 309 bojilova
    Connection conn = null;
1163 203 jones
1164
    // delete the document from the database
1165
    try {
1166 309 bojilova
      // get a connection from the pool
1167
      conn = util.getConnection();
1168 203 jones
                                      // NOTE -- NEED TO TEST HERE
1169 408 jones
                                      // FOR EXISTENCE OF DOCID PARAM
1170 203 jones
                                      // BEFORE ACCESSING ARRAY
1171 375 berkley
      try {
1172 425 bojilova
        DocumentImpl.delete(conn, docid[0], user, group);
1173 204 jones
        response.setContentType("text/xml");
1174
        out.println("<?xml version=\"1.0\"?>");
1175
        out.println("<success>");
1176 203 jones
        out.println("Document deleted.");
1177 204 jones
        out.println("</success>");
1178 203 jones
      } catch (AccessionNumberException ane) {
1179 204 jones
        response.setContentType("text/xml");
1180
        out.println("<?xml version=\"1.0\"?>");
1181
        out.println("<error>");
1182
        out.println("Error deleting document!!!");
1183 203 jones
        out.println(ane.getMessage());
1184 204 jones
        out.println("</error>");
1185 203 jones
      }
1186 204 jones
    } catch (Exception e) {
1187
      response.setContentType("text/xml");
1188
      out.println("<?xml version=\"1.0\"?>");
1189
      out.println("<error>");
1190
      out.println(e.getMessage());
1191
      out.println("</error>");
1192 309 bojilova
    } finally {
1193 320 bojilova
      util.returnConnection(conn);
1194 309 bojilova
    }
1195 203 jones
  }
1196 731 bojilova
  // END OF DELETE SECTION
1197 68 higgins
1198 731 bojilova
  // VALIDATE SECTION
1199 68 higgins
  /**
1200 380 jones
   * Handle the validation request and return the results to the requestor
1201 68 higgins
   */
1202 185 jones
  private void handleValidateAction(PrintWriter out, Hashtable params,
1203
               HttpServletResponse response) {
1204 68 higgins
1205 103 jones
    // Get the document indicated
1206
    String valtext = null;
1207 309 bojilova
1208 103 jones
    try {
1209
      valtext = ((String[])params.get("valtext"))[0];
1210
    } catch (Exception nullpe) {
1211 68 higgins
1212 309 bojilova
      Connection conn = null;
1213 162 bojilova
      String docid = null;
1214 103 jones
      try {
1215
        // Find the document id number
1216 185 jones
        docid = ((String[])params.get("docid"))[0];
1217 309 bojilova
1218
        // get a connection from the pool
1219
        conn = util.getConnection();
1220 393 jones
1221 309 bojilova
        // Get the document indicated from the db
1222 393 jones
        DocumentImpl xmldoc = new DocumentImpl(conn, docid);
1223
        valtext = xmldoc.toString();
1224 185 jones
1225 103 jones
      } catch (NullPointerException npe) {
1226 253 jones
        response.setContentType("text/xml");
1227
        out.println("<error>Error getting document ID: " + docid + "</error>");
1228 320 bojilova
        if ( conn != null ) { util.returnConnection(conn); }
1229 380 jones
        return;
1230 309 bojilova
      } catch (Exception e) {
1231
        response.setContentType("text/html");
1232
        out.println(e.getMessage());
1233
      } finally {
1234 320 bojilova
        util.returnConnection(conn);
1235 309 bojilova
      }
1236 103 jones
    }
1237 68 higgins
1238 309 bojilova
    Connection conn = null;
1239 103 jones
    try {
1240 309 bojilova
      // get a connection from the pool
1241
      conn = util.getConnection();
1242 253 jones
      DBValidate valobj = new DBValidate(saxparser,conn);
1243 185 jones
      boolean valid = valobj.validateString(valtext);
1244 68 higgins
1245
      // set content type and other response header fields first
1246 253 jones
      response.setContentType("text/xml");
1247
      out.println(valobj.returnErrors());
1248
1249 103 jones
    } catch (NullPointerException npe2) {
1250
      // set content type and other response header fields first
1251 253 jones
      response.setContentType("text/xml");
1252
      out.println("<error>Error validating document.</error>");
1253 309 bojilova
    } catch (Exception e) {
1254
      response.setContentType("text/html");
1255
      out.println(e.getMessage());
1256
    } finally {
1257 320 bojilova
      util.returnConnection(conn);
1258 309 bojilova
    }
1259 103 jones
  }
1260 731 bojilova
  // END OF VALIDATE SECTION
1261
1262
  // OTHER ACTION HANDLERS
1263
  /**
1264
   * sends the port number that the data socket is running on.
1265
   * This is a parameter set in the metacat.properties file.
1266 91 higgins
   */
1267 731 bojilova
  private void handleGetDataPortAction(PrintWriter out, Hashtable params,
1268
                                       HttpServletResponse response,
1269
                                       String username, String groupname,
1270
                                       String sess_id)
1271 458 berkley
  {
1272 731 bojilova
    int port;
1273
    String filedir = null;
1274
    try
1275 458 berkley
    {
1276 731 bojilova
      filedir = util.getOption("datafilepath");
1277
1278
      Random r = new Random();
1279
      port = r.nextInt(65000);  //pick a random port between 0-65000
1280
      //System.out.println("random port is: " + port);
1281
      while(!DataFileServer.portIsAvailable(port))
1282 458 berkley
      {
1283 731 bojilova
        port = r.nextInt(65000);
1284
        //System.out.println("next port used: " + port);
1285 458 berkley
      }
1286 731 bojilova
      DataFileServer dfs = new DataFileServer(port, username, sess_id);
1287
      dfs.start();
1288
1289
      //System.out.println("filedir: " + filedir);
1290
      //System.out.println("port: " + port);
1291
      response.setContentType("text/xml");
1292
      out.println("<?xml version=\"1.0\"?>");
1293
      out.println("<port>");
1294
      out.print(port);
1295
      out.print("</port>");
1296
1297 458 berkley
    }
1298 731 bojilova
	  catch (Exception e)
1299
    {
1300
      System.out.println("error in MetacatServlet.handleGetDataPortAction: " +
1301
                          e.getMessage());
1302
    }
1303 458 berkley
  }
1304 302 bojilova
1305
  /**
1306 688 bojilova
   * Handle "getaccesscontrol" action.
1307
   * Read Access Control List from db connection in XML format
1308
   */
1309
  private void handleGetAccessControlAction(PrintWriter out, Hashtable params,
1310
                                       HttpServletResponse response,
1311
                                       String username, String groupname) {
1312
1313
    Connection conn = null;
1314
    String docid = ((String[])params.get("docid"))[0];
1315
1316
    try {
1317
1318
        // get connection from the pool
1319
        conn = util.getConnection();
1320
        AccessControlList aclobj = new AccessControlList(conn);
1321
        String acltext = aclobj.getACL(docid, username, groupname);
1322
        out.println(acltext);
1323
1324
    } catch (Exception e) {
1325
      out.println("<?xml version=\"1.0\"?>");
1326
      out.println("<error>");
1327
      out.println(e.getMessage());
1328
      out.println("</error>");
1329
    } finally {
1330
      util.returnConnection(conn);
1331
    }
1332
1333
  }
1334
1335
  /**
1336 731 bojilova
   * Handle the "getprincipals" action.
1337
   * Read all principals from authentication scheme in XML format
1338
   */
1339
  private void handleGetPrincipalsAction(PrintWriter out, String user,
1340
                                         String password) {
1341
1342
    Connection conn = null;
1343
1344
    try {
1345
1346
        // get connection from the pool
1347
        AuthSession auth = new AuthSession();
1348
        String principals = auth.getPrincipals(user, password);
1349
        out.println(principals);
1350
1351
    } catch (Exception e) {
1352
      out.println("<?xml version=\"1.0\"?>");
1353
      out.println("<error>");
1354
      out.println(e.getMessage());
1355
      out.println("</error>");
1356
    } finally {
1357
      util.returnConnection(conn);
1358
    }
1359
1360
  }
1361
1362
  /**
1363 688 bojilova
   * Handle "getdoctypes" action.
1364 302 bojilova
   * Read all doctypes from db connection in XML format
1365
   */
1366
  private void handleGetDoctypesAction(PrintWriter out, Hashtable params,
1367
                                       HttpServletResponse response) {
1368
1369 309 bojilova
    Connection conn = null;
1370
1371 302 bojilova
    try {
1372
1373 309 bojilova
        // get connection from the pool
1374
        conn = util.getConnection();
1375
        DBUtil dbutil = new DBUtil(conn);
1376 302 bojilova
        String doctypes = dbutil.readDoctypes();
1377
        out.println(doctypes);
1378
1379
    } catch (Exception e) {
1380
      out.println("<?xml version=\"1.0\"?>");
1381
      out.println("<error>");
1382
      out.println(e.getMessage());
1383
      out.println("</error>");
1384 309 bojilova
    } finally {
1385 320 bojilova
      util.returnConnection(conn);
1386 309 bojilova
    }
1387 302 bojilova
1388
  }
1389
1390
  /**
1391 699 bojilova
   * Handle the "getdtdschema" action.
1392
   * Read DTD or Schema file for a given doctype from Metacat catalog system
1393
   */
1394
  private void handleGetDTDSchemaAction(PrintWriter out, Hashtable params,
1395
                                        HttpServletResponse response) {
1396
1397
    Connection conn = null;
1398
    String doctype = null;
1399
    String[] doctypeArr = (String[])params.get("doctype");
1400
1401
    // get only the first doctype specified in the list of doctypes
1402
    // it could be done for all doctypes in that list
1403
    if (doctypeArr != null) {
1404
        doctype = ((String[])params.get("doctype"))[0];
1405
    }
1406
1407
    try {
1408
1409
        // get connection from the pool
1410
        conn = util.getConnection();
1411
        DBUtil dbutil = new DBUtil(conn);
1412
        String dtdschema = dbutil.readDTDSchema(doctype);
1413
        out.println(dtdschema);
1414
1415
    } catch (Exception e) {
1416
      out.println("<?xml version=\"1.0\"?>");
1417
      out.println("<error>");
1418
      out.println(e.getMessage());
1419
      out.println("</error>");
1420
    } finally {
1421
      util.returnConnection(conn);
1422
    }
1423
1424
  }
1425
1426
  /**
1427 688 bojilova
   * Handle the "getdataguide" action.
1428 302 bojilova
   * Read Data Guide for a given doctype from db connection in XML format
1429
   */
1430
  private void handleGetDataGuideAction(PrintWriter out, Hashtable params,
1431
                                        HttpServletResponse response) {
1432
1433 309 bojilova
    Connection conn = null;
1434 316 bojilova
    String doctype = null;
1435
    String[] doctypeArr = (String[])params.get("doctype");
1436 309 bojilova
1437 316 bojilova
    // get only the first doctype specified in the list of doctypes
1438
    // it could be done for all doctypes in that list
1439
    if (doctypeArr != null) {
1440
        doctype = ((String[])params.get("doctype"))[0];
1441
    }
1442
1443 302 bojilova
    try {
1444
1445 309 bojilova
        // get connection from the pool
1446
        conn = util.getConnection();
1447
        DBUtil dbutil = new DBUtil(conn);
1448 316 bojilova
        String dataguide = dbutil.readDataGuide(doctype);
1449 302 bojilova
        out.println(dataguide);
1450
1451
    } catch (Exception e) {
1452
      out.println("<?xml version=\"1.0\"?>");
1453
      out.println("<error>");
1454
      out.println(e.getMessage());
1455
      out.println("</error>");
1456 309 bojilova
    } finally {
1457 320 bojilova
      util.returnConnection(conn);
1458 309 bojilova
    }
1459 302 bojilova
1460
  }
1461
1462 46 jones
}