Project

General

Profile

1 298 berkley
/**
2
 *  '$RCSfile$'
3
 *    Purpose: class that implements the MARINE interface to the
4
 *             metadata database.
5
 *  Copyright: 2000 Regents of the University of California and the
6
 *             National Center for Ecological Analysis and Synthesis
7
 *    Authors: Chad Berkley
8
 *
9
 *   '$Author$'
10
 *     '$Date$'
11
 * '$Revision$'
12
 */
13
14 295 berkley
package edu.ucsb.nceas.metacat.marine;
15
16 318 berkley
17 295 berkley
import java.io.*;
18
import java.util.*;
19
import javax.servlet.*;
20
import javax.servlet.http.*;
21
import java.net.*;
22
import java.sql.*;
23
import org.xml.sax.*;
24
import org.xml.sax.helpers.*;
25 298 berkley
import edu.ucsb.nceas.metacat.*;
26 295 berkley
import oracle.jdbc.driver.*;
27
import oracle.xml.parser.v2.*;
28
import oracle.xml.parser.v2.XMLParser;
29
30 298 berkley
public class marineServlet extends edu.ucsb.nceas.metacat.MetaCatServlet
31 295 berkley
{
32
	private marineUtil util;
33
	private String resultStyleURL;
34 318 berkley
	private String docStyleURL;
35 295 berkley
	private String xmlcatalogfile;
36
	private String saxparser;
37
	private String defaultdatapath;
38
	private String executescript;
39
	private DBQuery queryobj;
40
	private DBReader docreader;
41
	private DBTransform dbt;
42
	private Connection conn;
43
	private PropertyResourceBundle options;
44 318 berkley
	private String msg=null;
45 295 berkley
	private String queryname;
46 318 berkley
	private ServletConfig		config = null;
47
        private ServletContext	context = null;
48 295 berkley
49 318 berkley
	/**
50
	  Initializes the servlet and creates a connection to
51
	  the database
52
 	**/
53
54 295 berkley
	public void init(PrintWriter out)
55
	{
56
		util = new marineUtil();
57 318 berkley
		docStyleURL = util.getOption("docStyleURL");
58 295 berkley
		resultStyleURL = util.getOption("resultStyleURL");
59
		xmlcatalogfile = util.getOption("xmlcatalogfile");
60
      		saxparser = util.getOption("saxparser");
61
      		defaultdatapath = util.getOption("defaultdatapath");
62
      		executescript = util.getOption("executescript");
63 318 berkley
64 295 berkley
      		try
65
      		{
66 318 berkley
      		    conn = util.openDBConnection();
67 295 berkley
      			queryobj = new DBQuery(conn,saxparser);
68
        		docreader = new DBReader(conn);
69
        		dbt = new DBTransform(conn);
70
      		}
71
      		catch(Exception e)
72
      		{
73 323 berkley
      			System.err.println("marineServlet: Error in init:");
74 318 berkley
      		    e.printStackTrace(System.err);
75 295 berkley
      		}
76
	}
77
78 318 berkley
	/**
79
	  Handles any GET requests
80
	**/
81 295 berkley
	public void doGet (HttpServletRequest request,
82
	                   HttpServletResponse response)
83
    			throws ServletException, IOException
84
    	{
85
    		handleGetOrPost(request, response);
86
    	}
87
88 318 berkley
    	/**
89
    	  Handles and POST requests
90
    	**/
91 295 berkley
    	public void doPost (HttpServletRequest request,
92
    	                    HttpServletResponse response)
93
    			throws ServletException, IOException
94
    	{
95
    		handleGetOrPost(request, response);
96
    	}
97
98 318 berkley
    	/**
99
    	  This method is called from doGet and doPost.  It handles
100
    	  each request and sends back the response. It also handles
101
    	  the XSL tranformations
102
    	**/
103 295 berkley
    	private void handleGetOrPost(HttpServletRequest request,
104
    			HttpServletResponse response)
105
    			throws ServletException, IOException
106
    	{
107
108
    		response.setContentType("text/html");
109
    		PrintWriter out = response.getWriter();
110
111
    		try
112
    		{
113 304 berkley
    			init(out);
114 295 berkley
		}
115
    		catch(Exception e)
116
      		{
117 323 berkley
      			System.err.println("marineServlet: Exception in init in handleGetOrPost (try1): ");
118 318 berkley
      			e.printStackTrace(System.err);
119 295 berkley
      		}
120
121
    		String name = null;
122
    		String[] value = null;
123
    		String[] docid = new String[3];
124
    		Hashtable params = new Hashtable();
125
    		Enumeration paramlist = request.getParameterNames();
126
    		while (paramlist.hasMoreElements())
127
    		{
128
      			name = (String)paramlist.nextElement();
129
      			value = request.getParameterValues(name);
130
131
      			// Decode the docid and mouse click information
132
      			if (name.endsWith(".y"))
133
      			{
134
        			docid[0] = name.substring(0,name.length()-2);
135
        			//out.println("docid => " + docid[0]);
136
        			params.put("docid", docid);
137
        			name = "ypos";
138
      			}
139
      			if (name.endsWith(".x"))
140
      			{
141
        			name = "xpos";
142
      			}
143
144
      			//out.println(name + " => " + value[0]);
145
      			params.put(name,value);
146
    		}
147
148
		// Determine what type of request the user made
149
    		// if the action parameter is set, use it as a default
150
    		// but if the ypos param is set, calculate the action
151
    		// needed
152
    		String action = ((String[])params.get("action"))[0];
153
    		long ypos = 0;
154
    		try
155
    		{
156
      			ypos = (new Long(
157
      			((String[])params.get("ypos"))[0]).longValue());
158
159
      			//out.println("<P>YPOS IS " + ypos);
160 318 berkley
      			if (ypos <= 20)
161 295 berkley
      			{
162 318 berkley
        			action = "viewabstract";
163 295 berkley
      			}
164 318 berkley
      			else if (ypos > 20 && ypos <= 45)
165 295 berkley
      			{
166 318 berkley
        			action = "viewdocumentation";
167 295 berkley
      			}
168 318 berkley
      			else if (ypos > 45)
169 295 berkley
      			{
170 318 berkley
        			action = "download";
171 295 berkley
      			}
172
    		}
173
    		catch (Exception npe)
174
    		{
175 323 berkley
    			System.err.println("marineServlet: Error in handleGetOrPost (try2): ");
176 318 berkley
      			npe.printStackTrace(System.err);
177 295 berkley
    		}
178
179
    		//Jivka's login code should go here!
180
181 304 berkley
    		try{
182 323 berkley
    		   if(action.equals("query") || action.equals("squery"))
183
    		   {
184
    		      //send any type of query action to handleQueryAction
185
      			   handleQueryAction(out, params, response);
186
    		   }
187
    		   else if(action.equals("init"))
188
    		   {
189
    		   	   handleInitAction(out);
190
    		   }
191
    		   else if(action.equals("viewabstract"))
192
    		   {
193
    		       //when the user clicks the view abstract graphic
194
    			   handleViewAbstractAction(out, params, response);
195
    		   }
196
    		   else if(action.equals("viewdocumentation"))
197
    		   {
198
    		       //when the user clicks the view documentation graphic
199
    		 	   handleViewDocumentationAction(out, params, response);
200
    		   }
201
    		   else if(action.equals("download"))
202
    		   {
203
    		       //when the user clicks the download graphic
204
    			   handleDownloadAction(out, params, response);
205
    		   }
206
    		   else
207
    		   {
208
      			   out.println("Error: action " + action + " not registered" +
209
      			               "Please report this error.");
210
    		   }
211
212
    		   conn.close();
213 318 berkley
    		}
214 304 berkley
		catch(Exception e)
215
		{
216 323 berkley
			System.err.println("marineServlet: Error in handleGetOrPost (try3)");
217 318 berkley
			e.printStackTrace(System.err);
218 304 berkley
		}
219 318 berkley
		System.err.println("msg: " + msg);
220
		out.close();
221 295 berkley
    	}
222 318 berkley
223
        /**
224
          Handles when the user clicks the View Abstract graphic.
225
        **/
226
	private void handleViewAbstractAction(PrintWriter out, Hashtable params,
227
               HttpServletResponse response)
228
        {
229
         	PreparedStatement pstatement;
230
         	ResultSet rs = null;
231
        	String markup = null;
232
        	String docid = ((String[])params.get("docid"))[0];
233
234
        	//this query is based on the eml-resource datatype
235
        	//it will NOT work with eml-dataset documents because
236
        	//eml-dataset removes the abstract data an extra level
237
        	//from the <abstract> tag.
238
        	String querysql = "select nodedata from xml_nodes" +
239
                             " where parentnodeid in" +
240
                             " (select nodeid from xml_nodes where" +
241
                             " nodename like 'abstract') and docid like '" +
242
                             docid + "'";
243
                try{
244
                   //create the query, execute it, get the result
245
                   pstatement = conn.prepareStatement(querysql);
246
                   pstatement.execute();
247
                   rs = pstatement.getResultSet();
248
249
                   boolean moreRows = rs.next();
250
                   //print out the html.  This does not use any XSL
251
                   markup = "<html><body bgcolor=\"white\"><h1>Abstract</h1>";
252
                   while(moreRows)
253
                   {
254
                	   markup += "<p>" + rs.getString(1) + "</p>";
255
                	   moreRows = rs.next();
256
                   }
257
                   markup += "</body></html>";
258
                   }
259
                catch(SQLException sqle)
260
                {
261 323 berkley
262
                	System.err.println("marineServlet: SQLError " +
263
                	                   "in handleViewAbstractAction");
264
                	sqle.printStackTrace(System.err);
265 318 berkley
                }
266
                catch(Exception e)
267
                {
268 323 berkley
                	System.err.println("marineServlet: Error " +
269
                	                   "in handleViewAbstractAction");
270
                	e.printStackTrace(System.err);
271 318 berkley
                }
272
                out.println(markup); //send the output to the browser
273
        }
274
275
        /**
276
          Handles when the user clicks the View Documentation graphic.
277
        **/
278
        private void handleViewDocumentationAction(PrintWriter out, Hashtable params,
279
               HttpServletResponse response)
280
        {
281
        	String doc = null;
282
        	String docid = ((String[])params.get("docid"))[0];
283 323 berkley
        	out.println("view documentation not yet implemented");
284 318 berkley
		try{
285
        	    doc = docreader.readXMLDocument(docid);
286 323 berkley
287 318 berkley
        	    XMLDocumentFragment htmldoc = null;
288
        	    XSLStylesheet style = new XSLStylesheet(
289
                                    new URL(docStyleURL), null);
290
          	    htmldoc = (new XSLProcessor()).processXSL(style,
291
                                   (Reader)(new StringReader
292
                                   (doc)),null);
293
          	    htmldoc.print(out);
294
          	}
295
          	catch(Exception e)
296
          	{
297 323 berkley
          		System.err.println("marineServlet: error in " +
298
          		                   "handleViewDocumentationAction");
299
          		e.printStackTrace(System.err);
300 318 berkley
          	}
301
        }
302
303 323 berkley
        private void handleInitAction(PrintWriter out)
304
        {
305
        	try{
306
      			StringBuffer temp = new StringBuffer();
307
      			XMLDocumentFragment html = null;
308
309
      			temp.append("<?xml version=\"1.0\"?>\n");
310
      		    temp.append("<resultset></resultset>\n");
311
312
      		    //create a null query and run it through the
313
      		    //xsl processor to create the opening page
314
315
      			XSLStylesheet style = new XSLStylesheet(
316
                                 new URL(resultStyleURL), null);
317
           	    html = (new XSLProcessor()).processXSL(style,
318
                                   (Reader)(new StringReader(temp.toString())), null);
319
          		html.print(out);
320
                }
321
                catch(Exception e)
322
          	{
323
          		System.err.println("marineServlet: error in handleQueryAction (try1)");
324
          		e.printStackTrace(System.err);
325
          	}
326
        }
327 318 berkley
328
        /**
329
          Handles when the user clicks the Download graphic.
330
        **/
331
        private void handleDownloadAction(PrintWriter out, Hashtable params,
332
               HttpServletResponse response)
333
	{
334
		out.println("download not yet implemented");
335
	}
336
337
	/**
338
	  This method handles any and all query requests including the
339
	  init request.  It separates the queries into 3 classes.
340
	  1) query-This executes a free text search.
341
	  2) squery-This executes a structured query.
342
	  3) init-This executes a null query.
343
	  After executing the query, the xml results are sent through
344
	  the XSL processor and returned to the browser as HTML (if
345
	  qformat="html").  If qformat="xml" the xml document is returned
346
	  without transformation.
347
	**/
348 295 berkley
  	private void handleQueryAction(PrintWriter out, Hashtable params,
349
               HttpServletResponse response)
350
        {
351
        	String query = ((String[])params.get("query"))[0];
352
      		String action = ((String[])params.get("action"))[0];
353
      		Hashtable doclist = null;
354
      		String[] doctypeArr = null;
355
      		String doctype = null;
356
      		Reader xmlquery = null;
357 318 berkley
      		Hashtable extendedQuery = new Hashtable();
358 295 berkley
359 298 berkley
      		if(action.equals("query"))
360 295 berkley
      		{
361
362
       	 		doctypeArr = (String[])params.get("doctype");
363
        		doctype = null;
364
        		if (doctypeArr != null)
365
        		{
366
          			doctype = ((String[])params.get("doctype"))[0];
367
        		}
368
369
        		if (doctype != null)
370
        		{
371
          			xmlquery = new StringReader(DBQuery.createQuery(query,doctype));
372
        		}
373
        		else
374
        		{
375
          			xmlquery = new StringReader(DBQuery.createQuery(query));
376
        		}
377
      		}
378 298 berkley
      		else if(action.equals("squery"))
379 295 berkley
      		{
380
      			doctypeArr = (String[])params.get("doctype");
381
        		doctype = null;
382
        		if (doctypeArr != null)
383
        		{
384
          			doctype = ((String[])params.get("doctype"))[0];
385
        		}
386
        		// for some reason the doctype="ANY" wildcard is not working
387
        		//correctly. For this reason, I have ommited the doctype
388
        		//here for the time being (7/20).
389
        		xmlquery = new StringReader(createSQuery(params));
390
      		}
391 298 berkley
      		else if(action.equals("init"))
392
      		{
393 318 berkley
      			try{
394
      			   StringBuffer temp = new StringBuffer();
395
      			   XMLDocumentFragment html = null;
396
397
      			   temp.append("<?xml version=\"1.0\"?>\n");
398
      		       temp.append("<resultset></resultset>\n");
399
400
      		       //create a null query and run it through the
401
      		       //xsl processor to create the opening page
402
403
      			   XSLStylesheet style = new XSLStylesheet(
404
                                    new URL(resultStyleURL), null);
405
          		   html = (new XSLProcessor()).processXSL(style,
406
                                   (Reader)(new StringReader(temp.toString())), null);
407
          		   html.print(out);
408
          		   }
409
          		catch(Exception e)
410
          		{
411 323 berkley
          			System.err.println("marineServlet: error in handleQueryAction (try1)");
412
          			e.printStackTrace(System.err);
413 318 berkley
          		}
414 298 berkley
      		}
415 295 berkley
      		else
416
      		{
417 318 berkley
        		msg += "marineServlet: Error handling query -- illegal action value";
418 295 berkley
      		}
419
420
      		if (queryobj != null)
421
      		{
422
      			doclist = queryobj.findDocuments(xmlquery);
423 304 berkley
      			//msg += "\n\n" + doclist.toString();
424 295 berkley
      		}
425
      		else
426
      		{
427 304 berkley
        		out.println("marineServlet: Query Object Init failed.");
428 295 berkley
        		return;
429
      		}
430
431 318 berkley
 		//get the date_created, date_updated, organization
432
 		//and owner information for the query request
433
 		extendedQuery = createExtendedQuery(doclist);
434 307 berkley
435 295 berkley
      		// Create a buffer to hold the xml result
436
      		StringBuffer resultset = new StringBuffer();
437
438
      		// Print the resulting root nodes
439
      		String docid;
440
      		String document = null;
441
      		resultset.append("<?xml version=\"1.0\"?>\n");
442
      		resultset.append("<resultset>\n");
443 318 berkley
      		//queryname contains the xmlquery.  This sends the query
444
      		//itself back to the page to refresh the text boxes
445
      		//Without the queryname, the text boxes do not retain their
446
      		//values between queries.
447 295 berkley
      		resultset.append("  <query>" + queryname + "</query>");
448
      		Enumeration doclistkeys = doclist.keys();
449 318 berkley
      		//add the returned documents to the xml result
450 295 berkley
      		while(doclistkeys.hasMoreElements())
451
      		{
452
        		docid = (String)doclistkeys.nextElement();
453
        		document = (String)doclist.get(docid);
454 318 berkley
        		if(extendedQuery.containsKey(docid))
455
        		{
456
        			resultset.append("  <document>" + document +
457
        			          extendedQuery.get(docid).toString() +
458
        			          "</document>");
459
        		}
460
        		else
461
        		{
462
        			resultset.append("  <document>" + document +
463 295 berkley
        		                 "</document>");
464 318 berkley
        		}
465 295 berkley
      		}
466
      		resultset.append("</resultset>");
467
468
      		String qformat = ((String[])params.get("qformat"))[0];
469
      		if (qformat.equals("xml"))
470
      		{
471
        		// set content type and other response
472
        		// header fields first
473
        		response.setContentType("text/xml");
474
        		out.println(resultset.toString());
475
      		}
476
      		else if(qformat.equals("html"))
477
      		{
478
        		// set content type and other response header
479
        		// fields first
480
        		response.setContentType("text/html");
481 318 berkley
482
			//transform the xml to html with XSL
483 295 berkley
        		XMLDocumentFragment htmldoc = null;
484
485 304 berkley
        		try
486 295 berkley
        		{
487
          			XSLStylesheet style = new XSLStylesheet(
488
                                    new URL(resultStyleURL), null);
489
          			htmldoc = (new XSLProcessor()).processXSL(style,
490
                                   (Reader)(new StringReader
491
                                   (resultset.toString())),null);
492
          			htmldoc.print(out);
493
        		}
494
        		catch (Exception e)
495
        		{
496 323 berkley
          			System.err.println("marineServlet: error in handleQueryAction (try2)");
497
          	        e.printStackTrace(System.err);
498 295 berkley
        		}
499
      		}
500
      	}
501
502 307 berkley
      	/**
503
      	   creates the sql query for the extended information
504
      	   displayed upon successful query
505
      	**/
506 318 berkley
      	private Hashtable createExtendedQuery(Hashtable docs)
507 307 berkley
      	{
508
      		Hashtable result = new Hashtable();
509 318 berkley
      		ResultSet givenNameResults = null;
510
      		ResultSet surNameResults = null;
511
      		ResultSet organizationNameResults = null;
512
      		ResultSet dateResults = null;
513
      		String docid = null;
514
      		String data = null;
515
      		Object docidObj = null;
516 307 berkley
      		PreparedStatement pstatement;
517
518
      		Enumeration docids = docs.keys();
519
520
      		//find all of the owners first names
521
		String givenNameQuery = "select docid, nodedata from xml_nodes" +
522
		   " where parentnodeid in" +
523
		   " (select nodeid from xml_index where path like 'givenName')" +
524
		   " and parentnodeid in" +
525
 		   " (select nodeid from xml_nodes where nodename like 'givenName'" +
526
  		   " and parentnodeid in" +
527
                   " (select nodeid from xml_nodes where nodename like 'individualName'" +
528
                   " and parentnodeid in" +
529
                   " (select parentnodeid from xml_nodes where nodename like 'roleCode'" +
530
                   " and nodeid in" +
531
                   " (select parentnodeid from xml_nodes where" +
532
                   " nodedata = 'Owner'" +
533
                   " and parentnodeid in" +
534
                   " (select nodeid from xml_index where path like 'roleCode')))))";
535
536
                //find all of the owners last names
537
		String surNameQuery = "select docid, nodedata from xml_nodes" +
538
		   " where parentnodeid in" +
539
		   " (select nodeid from xml_index where path like 'surName')" +
540
		   " and parentnodeid in" +
541
 		   " (select nodeid from xml_nodes where nodename like 'surName'" +
542
  		   " and parentnodeid in" +
543
                   " (select nodeid from xml_nodes where nodename like 'individualName'" +
544
                   " and parentnodeid in" +
545
                   " (select parentnodeid from xml_nodes where nodename like 'roleCode'" +
546
                   " and nodeid in" +
547
                   " (select parentnodeid from xml_nodes where" +
548
                   " nodedata = 'Owner'" +
549
                   " and parentnodeid in" +
550
                   " (select nodeid from xml_index where path like 'roleCode')))))";
551
552
		//find all of the organizations
553
		String organizationNameQuery = "select docid, nodedata from xml_nodes" +
554
		   " where parentnodeid in" +
555
		   " (select nodeid from xml_index where path like 'organizationName')";
556
557
                //find all of the creation and update dates
558
                String dateQuery = "select docid, date_created, date_updated" +
559
                   " from xml_documents";
560 318 berkley
561
            //execute the queries
562 307 berkley
            try{
563
                pstatement = conn.prepareStatement(givenNameQuery);
564
                pstatement.execute();
565
                givenNameResults = pstatement.getResultSet();
566
567
                pstatement = conn.prepareStatement(surNameQuery);
568
                pstatement.execute();
569
                surNameResults = pstatement.getResultSet();
570
571
		pstatement = conn.prepareStatement(organizationNameQuery);
572
                pstatement.execute();
573
                organizationNameResults = pstatement.getResultSet();
574
575
      		pstatement = conn.prepareStatement(dateQuery);
576
                pstatement.execute();
577
                dateResults = pstatement.getResultSet();
578
                }
579 323 berkley
             catch(Exception e)
580 307 berkley
             {
581 323 berkley
                System.err.println("marineServlet: error in createExtendedQuery(try1)");
582
                e.printStackTrace(System.err);
583 307 berkley
             }
584
585 318 berkley
             try{
586
                 boolean moreRows = givenNameResults.next();
587
                 //add the givenName information to the xml.
588
                 while(moreRows)
589
                 {
590
                 	docid = givenNameResults.getString(1);
591
             	    data = givenNameResults.getString(2);
592
             	    //check if the original result set contains this docid
593
             	    if(docs.containsKey(docid))
594
             	    {
595
             		    String markup = "<givenName>" + data + "</givenName>";
596
             		    result.put(docid, markup);
597
             	    }
598
             	    moreRows = givenNameResults.next();
599
                 }
600
601
                 moreRows = surNameResults.next();
602
                 //add the surName information to the xml.
603
                 while(moreRows)
604
                 {
605
             	    docid = surNameResults.getString(1);
606
             	    data = surNameResults.getString(2);
607
             	    //check if the original result set contains this docid
608
             	    if(docs.containsKey(docid))
609
             	    {
610
             		    //check if this key is already in the result hashtable
611
             		    //i.e. there was a givenName for that docid.
612
             		    if(result.containsKey(docid))
613
             		    {
614
             			    String markup = result.get(docid).toString();
615
             			    markup += "<surName>" + data + "</surName>";
616
             			    result.remove(docid);
617
             			    result.put(docid, markup);
618
             		    }
619
             		    else
620
             	 	    {
621
             			    String markup = "<surName>" + data + "</surName>";
622
             			    result.put(docid, markup);
623
             		    }
624
             	    }
625
             	    moreRows = surNameResults.next();
626
                 }
627
628
                 //add the organizationName information to the xml.
629
                 moreRows = organizationNameResults.next();
630
                 while(moreRows)
631
                 {
632
             	    docid = organizationNameResults.getString(1);
633
             	    data = organizationNameResults.getString(2);
634
             	    //check if the original result set contains this docid
635
             	    if(docs.containsKey(docid))
636
             	    {
637
             		    //check if this key is already in the result hashtable
638
             		    //i.e. there was a givenName for that docid.
639
             		    if(result.containsKey(docid))
640
             		    {
641
             			    String markup = result.get(docid).toString();
642
             			    markup += "<organizationName>" + data + "</organizationName>";
643
             			    result.remove(docid);
644
             			    result.put(docid, markup);
645
             		    }
646
             		    else
647
             	 	    {
648
             			    String markup = "<organizationName>" + data + "</organizationName>";
649
             			    result.put(docid, markup);
650
             		    }
651
             	    }
652
             	    moreRows = organizationNameResults.next();
653
                 }
654
655
                 moreRows = dateResults.next();
656
                 //add the date information to the xml.
657
                 while(moreRows)
658
                 {
659
             	    docid = dateResults.getString(1);
660
             	    data = dateResults.getString(2); //date_created
661
             	    String data2 = dateResults.getString(3); //date_updated
662
             	    //check if the original result set contains this docid
663
             	    if(docs.containsKey(docid))
664
             	    {
665
             		    //check if this key is already in the result hashtable
666
             		    //i.e. there was a givenName for that docid.
667
             		    if(result.containsKey(docid))
668
             		    {
669
             			    String markup = result.get(docid).toString();
670
             			    markup += "<date_created>" + data + "</date_created>";
671
             			    markup += "<date_updated>" + data2 + "</date_updated>";
672
             			    result.remove(docid);
673
             			    result.put(docid, markup);
674
             		    }
675
             		    else
676
             	 	    {
677
             			    String markup = "<date_created>" + data + "</date_created>";
678
             			    markup += "<date_updated>" + data2 + "</date_updated>";
679
             			    result.put(docid, markup);
680
             		    }
681
             	    }
682
             	    moreRows = dateResults.next();
683
                 }
684
             }
685 323 berkley
             catch(Exception e)
686 318 berkley
             {
687 323 berkley
             	System.err.println("marineServlet: error in createExtendedQuery(try2)");
688
                e.printStackTrace(System.err);
689 318 berkley
             }
690
691
             return result;
692 307 berkley
      	}
693
694
      	/**
695
      	   creates the xml query for the browse list
696
      	**/
697 304 berkley
      	private String createBrowseList()
698
      	{
699
      		String query;
700
      		query = "<?xml version=\"1.0\"?>";
701
		query += "<!DOCTYPE pathquery PUBLIC \"-//NCEAS//pathquery-1.0//EN\" " +
702 307 berkley
          		    "\"http://alpha.nceas.ucsb.edu/xmltodb/lib/pathquery.dtd\" >";
703 304 berkley
    		query += "<pathquery version=\"1.0\">";
704
    		query += "<meta_file_id>unspecified</meta_file_id>";
705
    		query += "<querytitle>unspecified</querytitle>";
706
    		query += "<querygroup operator=\"union\">";
707
    		query += "<queryterm casesensitive=\"false\" " +
708
    				         "searchmode=\"contains\">";
709
    		query += "<value>";
710 318 berkley
    		query += "%";           //return everything
711 304 berkley
    		query += "</value>";
712
    		query += "</queryterm>";
713
    		query += "</querygroup></pathquery>";
714
715
    		return query;
716
      	}
717
718 295 berkley
      	/** takes in the parameter list from the input source and
719
      	    a doctype and returns a structured xml query based
720
      	    on the parameters.
721
      	**/
722
      	private String createSQuery(Hashtable params, String doctype)
723
	{
724
    		String query;
725
    		Enumeration elements;
726
    		Enumeration keys;
727
    		Object nextkey;
728
    		Object nextelement;
729 318 berkley
    		queryname = " ";
730 295 berkley
    		query = "<?xml version=\"1.0\"?>";
731
		query += "<!DOCTYPE pathquery PUBLIC \"-//NCEAS//pathquery-1.0//EN\" " +
732 307 berkley
          		    "\"http://alpha.nceas.ucsb.edu/xmltodb/lib/pathquery.dtd\" >";
733 295 berkley
    		query += "<pathquery version=\"1.0\"><meta_file_id>";
734
    		if(params.containsKey("meta_file_id"))
735
    		{
736
    			query += ((String[])params.get("meta_file_id"))[0];
737
    			query += "</meta_file_id>";
738
    		}
739
    		else
740
    		{
741
    			query += "unspecified</meta_file_id>";
742
    		}
743
    		query += "<querytitle>";
744
    		if(params.containsKey("querytitle"))
745
    		{
746
    			query += ((String[])params.get("querytitle"))[0];
747
    			query += "</querytitle>";
748
    		}
749
    		else
750
    		{
751
    			query += "unspecified</querytitle>";
752
    		}
753
    		if(!doctype.equals(""))
754
    		{
755
    			query += "<returndoctype>" + doctype + "</returndoctype>";
756
    		}
757 304 berkley
    		query += "<querygroup operator=\"" +
758
    		         ((String[])params.get("operator"))[0] + "\">";
759 318 berkley
760
761
    		//anyfield is a special case because it does a
762
    		//free text search.  It does not have a <pathexpr>
763
    		//tag.
764 304 berkley
    		if(params.containsKey("anyfield") &&
765
    		   !((String[])params.get("anyfield"))[0].equals(""))
766
    		{
767
    			query += "<queryterm casesensitive=\"false\" " +
768
    			         "searchmode=\"contains\"><value>" +
769
    			         ((String[])params.get("anyfield"))[0] +
770
    			         "</value></queryterm>";
771 318 berkley
    			         queryname += "<anyfield>";
772
    			         queryname += ((String[])params.get("anyfield"))[0];
773
    			         queryname += "</anyfield>";
774 304 berkley
    		}
775 295 berkley
776 318 berkley
    		//this while loop finds the rest of the parameters
777
    		//and attempts to query for the field specified
778
    		//by the parameter.
779 295 berkley
    		elements = params.elements();
780
    		keys = params.keys();
781
    		while(keys.hasMoreElements() && elements.hasMoreElements())
782
    		{
783
    			nextkey = keys.nextElement();
784
    			nextelement = elements.nextElement();
785 318 berkley
786
    			//make sure we aren't querying for any of these
787
    			//parameters.
788 295 berkley
    			if(!nextkey.toString().equals("doctype") &&
789
    			   !nextkey.toString().equals("action")  &&
790
    			   !nextkey.toString().equals("qformat") &&
791 304 berkley
    			   !nextkey.toString().equals("anyfield") &&
792
    			   !nextkey.toString().equals("operator") &&
793 295 berkley
    			   !(((String[])nextelement)[0].equals("")) )
794
    			{
795
    				query += "<queryterm casesensitive=\"false\" " +
796
    				         "searchmode=\"contains\">";
797
    				query += "<value>";
798 318 berkley
    				//add the query value
799 295 berkley
    				query += ((String[])nextelement)[0];
800 318 berkley
    				query += "</value><pathexpr>" +
801
    				//add the path to query by
802 295 berkley
    				         nextkey.toString() +
803
    				         "</pathexpr></queryterm>";
804
805 318 berkley
    				//add the query back into the xml to fill in
806
    				//the text boxes.
807
    				queryname += "<" + nextkey.toString() + ">";
808
    				queryname += ((String[])nextelement)[0];
809
    				queryname += "</" + nextkey.toString() + ">";
810 295 berkley
    			}
811
    		}
812
    		query += "</querygroup></pathquery>";
813
    		return query;
814
        }
815
816
        /**same as createSQuery(Hashtable, String) except
817 304 berkley
           no doctype is required.
818 295 berkley
        **/
819
        private String createSQuery(Hashtable params)
820
        {
821
        	return createSQuery(params, "");
822
        }
823
824
}