Project

General

Profile

« Previous | Next » 

Revision 3040

Added by perry over 18 years ago

Added javadoc comments for all new spatial classes. Optimized the title query in SpatialDocument.

View differences:

src/edu/ucsb/nceas/metacat/spatial/SpatialQueryProcessor.java
1
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2003 Regents of the University of California.
4
 *
5
 * Author: John Harris
6
 * '$Date$'
7
 * '$Revision$'
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 */
23
package edu.ucsb.nceas.metacat.spatial;
24

  
25
import java.io.File;
26
import java.io.FileReader;
27
import java.io.PrintWriter;
28
import java.io.IOException;
29
import java.io.StringReader;
30
import java.io.BufferedReader;
31
import java.io.Reader;
32
import java.io.FileInputStream;
33
import java.io.BufferedInputStream;
34
import java.util.Enumeration;
35
import java.util.Hashtable;
36
import java.util.ResourceBundle;
37
import java.util.Random;
38
import java.util.StringTokenizer;
39
import java.util.Properties;
40
import java.util.PropertyResourceBundle;
41
import java.util.Vector;
42
import java.util.Map;
43

  
44
import edu.ucsb.nceas.metacat.client.Metacat;
45
import edu.ucsb.nceas.metacat.DBConnection;
46
import edu.ucsb.nceas.metacat.client.MetacatFactory;
47
import edu.ucsb.nceas.metacat.client.MetacatAuthException;
48
import edu.ucsb.nceas.metacat.client.MetacatException;
49
import edu.ucsb.nceas.metacat.client.MetacatInaccessibleException;
50
import edu.ucsb.nceas.metacat.client.InsufficientKarmaException;
51
import edu.ucsb.nceas.utilities.IOUtil;
52

  
53
import java.sql.ResultSet;
54
import java.sql.PreparedStatement;
55

  
56
import org.apache.log4j.Logger;
57
import org.apache.log4j.BasicConfigurator;
58
import org.apache.log4j.PropertyConfigurator;
59

  
60
public class SpatialQueryProcessor {
61

  
62
  private String METACATURL =
63
      "http://nebulous.msi.ucsb.edu:9999/knp/metacat";
64
  private File QUERYFILE = null;
65
  private String MCUSER = "uid=harris,o=NCEAS,dc=ecoinformatics,dc=org";
66
  private String MCPASS = "yeahRight";
67

  
68

  
69

  
70

  
71
  private DBConnection dbconn;
72

  
73
  private static Logger log =
74
      Logger.getLogger(SpatialQueryProcessor.class.getName());
75

  
76
        /** constructor that uses the defaults **/
77
  public SpatialQueryProcessor() {
78
    try {
79
      dbconn = new DBConnection();
80
    } catch(java.sql.SQLException se) {
81
      log.fatal("Error connecting to the database ...");
82
      se.getMessage();
83
    }
84
  }
85

  
86
  /** call this after the processor is done **/
87
  protected void close() {
88
    try {
89
      dbconn.close();
90
    } catch(java.sql.SQLException se) {
91
      log.fatal("Error closing connecting to the database ...");
92
      se.getMessage();
93
    }
94
  }
95

  
96
  public SpatialQueryProcessor(String mcUser, String mcPass,
97
                               String metacatUrl, File queryFile) {
98
    log.debug("constructor called");
99
    this.METACATURL = metacatUrl;
100
    this.MCPASS = mcPass;
101
    this.MCUSER = mcUser;
102
    this.QUERYFILE = queryFile;
103

  
104

  
105
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
106
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
107
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
108
    log.warn("METACATURL: " + METACATURL 
109
            +"\nMCPASS: " + MCPASS
110
            +"\nMCUSER: " + MCUSER
111
            +"\nQUERYFILE: " + QUERYFILE);
112
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
113
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
114
    log.warn("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
115
  }
116

  
117
  public String execute() throws IOException {
118
    FileReader queryFileReader = new FileReader(QUERYFILE);
119
    String res = runQuery((Reader) queryFileReader);
120
     return res;
121
  } 
122
  
123
  
124
  /**
125
   * returns the dataset constained by the input cartesian boundaries 
126
   *
127
   * param _xmin -- the minimum x cartesian boundary
128
   * param _ymin -- the minimum y cartesian boundary
129
   * param _xmax -- the maximum x cartesian boundary
130
   * param _ymax -- the maximum y cartesian boundary
131
   *
132
   * returns data -- a Metacat spatial dataset, containing all the documents 
133
   * within the input bounding box
134
   */
135
  protected MetacatSpatialDataset queryDatasetByCartesianBounds(float
136
                                                                  _xmin,
137
                                                                  float
138
                                                                  _ymin,
139
                                                                  float
140
                                                                  _xmax,
141
                                                                  float
142
                                                                  _ymax) {
143

  
144
    MetacatSpatialDataset _data = new MetacatSpatialDataset();
145

  
146
    // get all docid's 
147
    Vector _docs = queryAllDocids();
148

  
149
    // for each, see if they fall w/in bounds
150
    for (int i = 0; i < _docs.size(); i++) {
151

  
152
    MetacatSpatialExtents _extents = new MetacatSpatialExtents();
153
      float _docMaxY =
154
          queryNorthBoundingCoordinate((String) _docs.elementAt(i));
155
      float _docMinY =
156
          querySouthBoundingCoordinate((String) _docs.elementAt(i));
157
      float _docMaxX =
158
          queryEastBoundingCoordinate((String) _docs.elementAt(i));
159
      float _docMinX =
160
          queryWestBoundingCoordinate((String) _docs.elementAt(i));
161

  
162
      //String _title = getTitle((String) _docs.elementAt(i));
163

  
164
      // check if inside the bounding box
165
      if (_docMaxX <= _xmax && _docMinX >= _xmin && _docMaxY <= _ymax && _docMinY >= _ymin ) {
166
        MetacatSpatialDocument _doc =
167
            new MetacatSpatialDocument((String) _docs.elementAt(i));
168
        
169
        log.warn("----------------------------------------------------------");
170
        log.warn("----------------------------------------------------------");
171
        log.warn("-----Spatially Selected Document: "
172
                +(String) _docs.elementAt(i)+"-----");
173
        log.warn(_docMinX+ " "+  _docMinY + " " +_docMaxX+ " " + _docMaxY);
174
        log.warn("----------------------------------------------------------");
175
        log.warn("----------------------------------------------------------");
176

  
177
        
178
        _doc.setDocid((String) _docs.elementAt(i));
179
        _extents.setXMin(_docMinX);
180
        _extents.setYMin(_docMinY);
181
        _extents.setXMax(_docMaxX);
182
        _extents.setYMax(_docMaxY);
183
        
184
        
185
        // set it as a point -- if it is one
186
        if ( _xmax==_xmin && _ymax==_ymin ) {
187
          _extents.setIsPoint(true);
188
        } else {
189
          _extents.setIsPoint(false);
190
        }
191
                
192
        // set the extents
193
        _doc.setExtents(_extents);
194
        _data.add(_doc);
195
      }
196
    }
197
    return _data;
198
  }
199

  
200
  
201
  
202
  /**
203
   * Returns a Vector of all the docids in the xml_nodes tables
204
   */
205
  protected Vector queryAllDocids() {
206
    Vector _docs = new Vector();
207
    PreparedStatement pstmt = null;
208
    ResultSet rs = null;
209
    String query = "select distinct docid from xml_nodes";
210

  
211
    try {
212
      pstmt = dbconn.prepareStatement(query);
213
      pstmt.execute();
214
      rs = pstmt.getResultSet();
215
      while (rs.next()) {
216
        String docid = rs.getString(1);
217
        log.fatal("adding docid: " + docid);
218
        _docs.add(docid);
219
      }
220
      rs.close();
221
      pstmt.close();
222
    }
223
    catch(Exception e) {
224
      log.error("Error getting docids from queryAllDocids");
225
      e.printStackTrace();
226
    }
227
    return _docs;
228
  }
229

  
230
  /**
231
   * returns the north bounding coordinate -- this is a single point
232
   */
233
  private String getTitle(String docid) {
234
    String title = null;
235
    PreparedStatement pstmt = null;
236
    ResultSet rs = null;
237
    String query = "select docid, nodedata, nodeid from xml_nodes where "
238
        + "nodeid =(select  nodeid from  xml_nodes where docid  like '"
239
        + docid.trim() + "' and nodename like 'title%');";
240
    try {
241
      pstmt = dbconn.prepareStatement(query);
242
      pstmt.execute();
243
      rs = pstmt.getResultSet();
244
      if (rs.next())
245
        title = rs.getString(2);
246
      rs.close();
247
      pstmt.close();
248
    }
249
    catch(Exception e) {
250
      log.error("Error getting docids from queryExtentsByDocid");
251
      e.printStackTrace();
252
    }
253
    return title;
254
  }
255

  
256
  /**
257
   * returns the north bounding coordinate -- this is a single point
258
   */
259
  private float queryNorthBoundingCoordinate(String docid) {
260
    float _coord = MetacatSpatialConstants.FLOAT_NULL;
261
    PreparedStatement pstmt = null;
262
    ResultSet rs = null;
263
    String query = "select max(nodedata) from xml_nodes where "
264
        + "parentnodeid in (select  nodeid from  xml_nodes where docid  like '"
265
        + docid.trim() + "' and nodename like 'northBoundingCoordinate');";
266

  
267
    try {
268
      pstmt = dbconn.prepareStatement(query);
269
      pstmt.execute();
270
      rs = pstmt.getResultSet();
271
      if (rs.next())
272
        _coord = rs.getFloat(1);
273
      rs.close();
274
      pstmt.close();
275
    }
276
    catch(Exception e) {
277
      log.error("Error getting docids from queryExtentsByDocid");
278
      e.printStackTrace();
279
    }
280
    return _coord;
281
  }
282

  
283

  
284
  /**
285
   * returns the east bounding coordinate -- this is a single point
286
   */
287
  private float queryEastBoundingCoordinate(String docid) {
288
    float _coord = MetacatSpatialConstants.FLOAT_NULL;
289
    PreparedStatement pstmt = null;
290
    ResultSet rs = null;
291
    String query = "select max(nodedata) from xml_nodes where "
292
        + "parentnodeid in (select  nodeid from  xml_nodes where docid  like '"
293
        + docid.trim() + "' and nodename like 'eastBoundingCoordinate');";
294

  
295
    try {
296
      pstmt = dbconn.prepareStatement(query);
297
      pstmt.execute();
298
      rs = pstmt.getResultSet();
299
      if (rs.next())
300
        _coord = rs.getFloat(1);
301
      rs.close();
302
      pstmt.close();
303
    }
304
    catch(Exception e) {
305
      log.error("Error getting docids from queryExtentsByDocid");
306
      e.printStackTrace();
307
    }
308
    return _coord;
309
  }
310

  
311

  
312
  /**
313
   * returns the south bounding coordinate -- this is a single point
314
   */
315
  private float querySouthBoundingCoordinate(String docid) {
316
    float _coord = MetacatSpatialConstants.FLOAT_NULL;
317
    PreparedStatement pstmt = null;
318
    ResultSet rs = null;
319
    String query = "select max(nodedata) from xml_nodes where "
320
        + "parentnodeid in (select  nodeid from  xml_nodes where docid  like '"
321
        + docid.trim() + "' and nodename like 'southBoundingCoordinate');";
322

  
323
    try {
324
      pstmt = dbconn.prepareStatement(query);
325
      pstmt.execute();
326
      rs = pstmt.getResultSet();
327
      if (rs.next())
328
        _coord = rs.getFloat(1);
329
      rs.close();
330
      pstmt.close();
331
    }
332
    catch(Exception e) {
333
      log.error("Error getting docids from queryExtentsByDocid");
334
      e.printStackTrace();
335
    }
336
    return _coord;
337
  }
338

  
339

  
340

  
341
  /**
342
   * returns the west bounding coordinate -- this is a single point
343
   */
344
  private float queryWestBoundingCoordinate(String docid) {
345
    float _coord = MetacatSpatialConstants.FLOAT_NULL;
346
    PreparedStatement pstmt = null;
347
    ResultSet rs = null;
348
    String query = "select max(nodedata) from xml_nodes where "
349
        + "parentnodeid in (select  nodeid from  xml_nodes where docid  like '"
350
        + docid.trim() + "' and nodename like 'westBoundingCoordinate');";
351
        
352
     log.warn("issuing query: " + query);
353

  
354
    try {
355
      pstmt = dbconn.prepareStatement(query);
356
      pstmt.execute();
357
      rs = pstmt.getResultSet();
358
      if (rs.next())
359
        _coord = rs.getFloat(1);
360
      rs.close();
361
      pstmt.close();
362
    }
363
    catch(Exception e) {
364
      log.error("Error getting docids from queryWestBoundingCoordinate");
365
      e.getMessage();
366
    }
367
    return _coord;
368
  }
369

  
370

  
371

  
372

  
373
  /**
374
   * Performs a spatial query given the docid as an input
375
   * 
376
   * @param docid -- the docid for which the extents are to be queried
377
   * @returns spatialextents -- the MetcataSpatialExtents object for this query
378
   */
379
  protected MetacatSpatialExtents queryExtentsByDocid(String docid) {
380
    MetacatSpatialExtents _extents = new MetacatSpatialExtents();
381

  
382
    float _northbc = queryNorthBoundingCoordinate(docid);
383
    float _eastbc = queryEastBoundingCoordinate(docid);
384
    float _southbc = querySouthBoundingCoordinate(docid);
385
    float _westbc = queryWestBoundingCoordinate(docid);
386

  
387
    if ((_northbc == _southbc) && (_eastbc == _westbc)) {
388
      _extents.setIsPoint(true);
389
    } else {
390
      _extents.setIsPoint(false);
391
    }
392

  
393
    _extents.setYMin((_southbc < _northbc ? _southbc : _northbc));
394
    _extents.setYMax((_southbc > _northbc ? _southbc : _northbc));
395
    _extents.setXMin((_westbc < _eastbc ? _westbc : _eastbc));
396
    _extents.setXMax((_westbc > _eastbc ? _westbc : _eastbc));
397

  
398
    _extents.setDocid(docid);
399

  
400
    return _extents;
401
  }
402

  
403

  
404
        /**
405
		* Query the Metacat Server to get a list of documents, 
406
		* if it doesn't exist there, from the backend storage server.
407
		* 
408
		* @param query the xml description of the query to run
409
		* @return String the XML document string of the result set
410
		* @throws QueryFailedException when any thing happens to prevent a query
411
		*  returns
412
		*/
413
  private String runQuery(Reader query) {
414
    String document = null;
415

  
416
    Reader xdoc = null;
417
    String error = null;
418
    try {
419
      log.debug("creating metacat instance with: " + METACATURL);
420
      Metacat m = MetacatFactory.createMetacatConnection(METACATURL);
421
      m.login(MCUSER, MCPASS);
422
      log.debug("metacat instance: " + m);
423
      xdoc = m.query(query);
424
      document = IOUtil.getAsString(xdoc, true);
425
      m.logout();
426
      if (document == null) {
427
        throw new QueryFailedException("Document String Was null");
428
      }
429
    }
430
    catch(Exception e) {
431
      e.printStackTrace();
432
    }
433
    return document;
434
  }
435

  
436

  
437
}
438 0

  
src/edu/ucsb/nceas/metacat/spatial/SpatialQueryManager.java
1
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2003 Regents of the University of California.
4
 *
5
 *   '$Author$'
6
 *     '$Date$'
7
 * '$Revision$'
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 */
23
package edu.ucsb.nceas.metacat.spatial;
24

  
25
import java.io.File;
26
import java.io.FileReader;
27
import java.io.PrintWriter;
28
import java.io.IOException;
29
import java.io.StringReader;
30
import java.io.BufferedReader;
31
import java.io.Reader;
32
import java.io.FileInputStream;
33
import java.io.BufferedInputStream;
34
import java.util.Enumeration;
35
import java.util.Hashtable;
36
import java.util.ResourceBundle;
37
import java.util.Random;
38
import java.util.StringTokenizer;
39
import java.util.Properties;
40
import java.util.PropertyResourceBundle;
41
import java.util.Vector;
42
import java.util.Map;
43

  
44
import java.net.MalformedURLException;
45
import java.sql.PreparedStatement;
46
import java.sql.ResultSet;
47
import java.sql.Connection;
48
import java.sql.SQLException;
49
import java.lang.reflect.*;
50
import java.net.*;
51
import java.util.zip.*;
52

  
53
import javax.servlet.ServletConfig;
54
import javax.servlet.ServletContext;
55
import javax.servlet.ServletException;
56
import javax.servlet.ServletInputStream;
57
import javax.servlet.http.HttpServlet;
58
import javax.servlet.http.HttpServletRequest;
59
import javax.servlet.http.HttpServletResponse;
60
import javax.servlet.http.HttpSession;
61
import javax.servlet.http.HttpUtils;
62
import javax.servlet.ServletOutputStream;
63

  
64
import edu.ucsb.nceas.metacat.client.Metacat;
65
import edu.ucsb.nceas.metacat.client.MetacatFactory;
66
import edu.ucsb.nceas.metacat.client.MetacatAuthException;
67
import edu.ucsb.nceas.metacat.client.MetacatException;
68
import edu.ucsb.nceas.metacat.client.MetacatInaccessibleException;
69
import edu.ucsb.nceas.metacat.client.InsufficientKarmaException;
70
import edu.ucsb.nceas.utilities.IOUtil;
71

  
72
import org.apache.log4j.Logger;
73
import org.apache.log4j.BasicConfigurator;
74
import org.apache.log4j.PropertyConfigurator;
75

  
76

  
77

  
78
/**
79
 * An application that manages the registration of ecological networks using the
80
 * metacat technology
81
 */
82
public class SpatialQueryManager extends HttpServlet
83
{
84

  
85
  private ServletConfig config = null;
86
  private ServletContext context = null;
87
  private Properties appConfig = null;
88
  private static final String CONFIG_DIR = "WEB-INF";
89
  private static final String CONFIG_NAME = "econet.properties";
90
  private static final String STYLE_DIR = "WEB-INF/";
91
  private String defaultStyle = null;
92
  private String metacatUrl = null;
93
  private String queryName = null;
94
  private String invalidRegistrationErrorPage = null;
95

  
96
// private EcoNetwork network;
97

  
98
  private String mcUser = "uid=jones,o=NCEAS,dc=ecoinformatics,dc=org";
99
  private String mcPass = "@mcpass@";
100

  
101
//	private  EconetCache cache;
102
	
103
  protected SpatialQueryProcessor queryProcessor;
104
	// this is the key val for the econet summary to be in the cache and 
105
	// it must be the same value as the value in the manager
106
//	private static String ECONET_SUMMARY_KEY = "econet_summary"; 
107

  
108
  private static Logger log = Logger.getLogger(SpatialQueryManager.class.getName());
109

  
110
  /**
111
   * Initialize the servlet during container startup
112
   */
113
  public void init(ServletConfig config) throws ServletException
114
  {
115
    try
116
    {
117
      super.init(config);
118
      this.config = config;
119
      this.context = config.getServletContext();
120

  
121
      //BasicConfigurator.configure();
122
      String prefix = getServletContext().getRealPath("/");
123
      System.out.println("SpatialQueryManager servlet context path  ####################### >>> " + prefix);
124
      String file = getInitParameter("log4j-init-file");
125
      System.out.println("SpatialQueryManager log4j-init-file  ####################### >>> " + file);
126
      System.out.println("SpatialQueryManager econet - metacat acct:  ####################### >>> " + mcUser);
127
      
128
      // if the log4j-init-file is not set, then no point in trying
129
      if (file != null)
130
      {
131
        PropertyConfigurator.configure(prefix + file);
132
      }
133

  
134
      try
135
      {
136
        // locate, open, and read the properties
137
        appConfig = new Properties();
138
        String dirPath = context.getRealPath(CONFIG_DIR);
139
        File propertyFile = new File(dirPath, CONFIG_NAME);
140
        FileInputStream fis = new FileInputStream(propertyFile);
141
				appConfig.load(fis);
142
				fis.close();
143
				defaultStyle = (String) appConfig.get("defaultStyle");
144
				metacatUrl = (String) appConfig.get("metacatUrl");
145
				System.out.println("SpatialQueryManager using metacat at url:  ####################### >>> " + metacatUrl);
146
				queryName = (String)appConfig.get("queryName");
147
				System.out.println("SpatialQueryManager query name :  ####################### >>> " + queryName);
148
				invalidRegistrationErrorPage = (String) appConfig.get("invalidRegistrationErrorPage");
149

  
150
      }
151
      catch(Throwable t)
152
      {
153
        throw new ServletException(t.getMessage());
154
      }
155
    }
156
    catch(ServletException ex) {
157
      throw ex;
158
    }
159
  }
160

  
161
  /** Handle "GET" method requests from HTTP clients */
162
  public void doGet(HttpServletRequest request, HttpServletResponse response)
163
  throws ServletException, IOException
164
  {
165
    handleGetOrPost(request, response);
166
  }
167

  
168
  /** Handle "POST" method requests from HTTP clients */
169
  public void doPost(HttpServletRequest request, HttpServletResponse response)
170
  throws ServletException, IOException
171
  {
172
    handleGetOrPost(request, response);
173
  }
174

  
175
  /**
176
   * Control servlet response depending on the action parameter specified
177
   */
178
  private void handleGetOrPost(HttpServletRequest request, HttpServletResponse response)
179
  throws ServletException, IOException
180
  {
181
    Hashtable params = getParamHash(request);
182
    String action = getAction(request);
183
      log.debug(">> action " + action);
184

  
185
    if (action.equals("list")) {
186
      handleListAction(request, response);
187
    } else if (action.equals("register")) {
188
      //handleRegisterAction(request, response);
189
    } else if (action.equals("delete")) {
190
      handleDeleteAction(request, response);
191
    } else if (action.equals("displaydoc")) {
192
      handleDisplayDocAction(request, response);
193
    } else {
194
      handleListAction(request, response);
195
    }
196
  }
197

  
198
  /**
199
    * Reads a document from metacat and displays the information to the browser
200
    * @param request -- the HTTP request object
201
    * @param response -- the HTTP response object
202
    */
203
  private void handleDisplayDocAction(HttpServletRequest request, HttpServletResponse response)
204
  throws IOException
205
  {
206
    Hashtable params = getParamHash(request);
207
    String contextPath = request.getContextPath();
208
    String action = getAction(request);
209
    String styleSystemId = getStyleSystemId(action, defaultStyle);
210
    String docid = (String) getParamHash(request).get("docId");
211
    PrintWriter out = response.getWriter();
212
    ServletContext servletContext = getServletContext();
213
    response.setContentType ("text/html");
214
    if (docid != null && !docid.trim().equals(""))
215
    {
216
      try {
217
				String doc = null;
218
	//			if ( cache.recover(docid) == null ) {
219
					log.debug("docid in the cache is null ... going to the db");
220
					Metacat m = MetacatFactory.createMetacatConnection(metacatUrl);
221
					m.login(mcUser, mcPass);
222
					Reader r = m.read(docid);
223
					doc = IOUtil.getAsString(r, true);
224
					r.close();
225
					m.logout();
226
					// adding this was giving a concurrent modification exception
227
					//cache.admit(docid, doc);
228
	//			} else {
229
//					log.debug("docid in the cache is valid");
230
//					doc = (String)cache.recover(docid);
231
//				}
232
        String dirPath = context.getRealPath(CONFIG_DIR);
233
				XSLTransform.transform(doc, styleSystemId, out, params);
234
				out.close();	
235
      }
236
      catch(Exception e) { e.printStackTrace(); }
237
    } else {
238
      out.println("no such docid!");
239
    }
240
    out.close();
241
  }
242

  
243
  /**
244
    * Deletes a network from the registration system.  This is called by the 
245
    * administrator to delete a registry from metacat. There is no response to 
246
    * the calling device - instead details are written to the logger 
247
    * @param request -- the HTTP request object
248
    * @param response -- the HTTP response object
249
    */
250
  private void handleDeleteAction(HttpServletRequest request, HttpServletResponse response) throws IOException
251
  {
252
    Hashtable params = getParamHash(request);
253
    String docId = (String)params.get("docId");
254
    // for the Metacat.delete request to be called the password needs to be the 
255
    // same as the mcpass var.
256
    String pass = (String)params.get("password");
257
    if ( params.containsKey("password") ) {
258
      if ( pass.equals(mcPass) ) {
259
        log.info(">> deleting docid: " + docId);
260
        // add a lookup for an issued password.
261
        try
262
        {
263
         Metacat m = MetacatFactory.createMetacatConnection(metacatUrl);
264
         log.info(mcUser + " " + mcPass);
265
         m.login(mcUser, mcPass);
266
         String resp = m.delete(docId);
267
         log.info(">>deletion success is: " + resp);
268
        }
269
        catch(Exception e) { e.printStackTrace(); }
270
      }
271
    else { log.fatal("attempt to delete a registry with invalid pass"); }
272
    }
273
    else { log.fatal("attempt to delete a registry with NO pass"); }
274
  }
275

  
276
  /**
277
    *  Display the registered networks.  This is called when a list of 
278
    * regestered networks is requested for display and a transformation
279
    * is needed.  It queries the registered networks and then transforms the 
280
    * network docs using XSLT and displays the networks.
281
    * @param request -- the HTTP request object
282
    * @param response -- the HTTP response object
283
    */
284
  private void handleListAction(HttpServletRequest request, HttpServletResponse response) throws IOException
285
  {
286
    Hashtable params = getParamHash(request);
287
    String contextPath = request.getContextPath();
288
    String action = getAction(request);
289
    String styleSystemId = getStyleSystemId(action, defaultStyle);
290

  
291
    //String style = (String)pathData.get(1);
292
    PrintWriter out = response.getWriter();
293
    ServletContext servletContext = getServletContext();
294
    response.setContentType ("text/html");
295

  
296
    // get the query document
297
    String dirPath = context.getRealPath(CONFIG_DIR);
298
    File queryFile = new File(dirPath, queryName);
299
    // Query for the documents from the server
300
    String queryResult = null;
301
    try {
302
      // if the cache doesnt have the summary then get it from the database
303
//		if ( cache.recover(ECONET_SUMMARY_KEY) == null ) {
304
//			log.debug("summary in the cache is null ... going to the db");
305
				queryResult = queryProcessor.execute();
306
//				cache.admit(ECONET_SUMMARY_KEY, queryResult);
307
//			} else {
308
//				log.debug("summary in the cache is valid");
309
//				queryResult = (String)cache.recover(ECONET_SUMMARY_KEY);
310
//			}
311
    } catch(Exception e) { e.printStackTrace(); }
312
    
313
    log.debug("query result >> " + queryResult);
314
    XSLTransform.transform(queryResult, styleSystemId, out, params);
315
    out.close();
316
  }
317

  
318

  
319

  
320
  /**
321
    *  Register the network.  This is called when the attributes of a network 
322
    *  are submitted to the system.
323
    *
324
    * @param request -- the HTTP request object
325
    * @param response -- the HTTP response object
326
    */
327
/**  private void handleRegisterAction(HttpServletRequest request, HttpServletResponse response) throws IOException
328
  {
329
    Map params = getParamHash(request);
330
    String contextPath = request.getContextPath();
331
    String action = getAction(request);
332
    
333
    network = new EcoNetwork((Map) params);
334
    // add a validation step here 
335
    if (network.isValid() == true)
336
    {
337
      PrintWriter out = response.getWriter();
338
      response.setContentType ("text/html");
339
        log.info("about to insert: " + network.toXML());
340
      String metacatResponse = insertEcoNetwork(network.toXML());
341
        log.info("metacat response: " + metacatResponse);
342

  
343
      String styleSystemId = getStyleSystemId(action, defaultStyle);
344
        log.info("registration system id  " + styleSystemId);
345
        XSLTransform.transform(metacatResponse, styleSystemId, out, (Hashtable) params);
346
				
347
        // clear the summary from the cache which will be recovered either next
348
        // time the show all docs function is called or the ttl in the cache is
349
        // achived.
350
				cache.clear();
351
        
352
        out.close();
353
    } else
354
    {
355
      //redirect somewhere
356
      response.sendRedirect(invalidRegistrationErrorPage);
357
    }
358
  }
359
**/
360

  
361

  
362
    /**
363
      * Inserts the registration document to metacat.  After the registration
364
      * has been processed and validated the XML representation is submitted
365
      * to the metacat system
366
      *  @param networkXML -- the xml document containing the econetwork 
367
      *     data represented as a java string. 
368
      *  @return metacatResponse -- the response from metacat
369
      */
370
/**  private String insertEcoNetwork(String networkXML)
371
  {
372
    String error = null;
373
    String response = null;
374
    try {
375
      Metacat m = MetacatFactory.createMetacatConnection(metacatUrl);
376
      log.info(mcUser + " " + mcPass);
377
      m.login(mcUser, mcPass);
378
      int i = (int) (java.lang.Math.random() * 1000);
379
      log.info(" inserting document: " + "econet." + i + ".1");
380
      response = m.insert("econet." + i + ".1", new StringReader(networkXML), null);
381
      log.info(" metacat response: " + response);
382
    }
383
    catch(Exception e) {
384
      e.printStackTrace();
385
    }
386
    return response;
387
  }
388
**/
389

  
390

  
391
  /**
392
    * Gets the "action" parameter from the http request object
393
    * @param request -- the http request object
394
    * @return action -- the action requested of this servlet 
395
    */
396
  private String getAction(HttpServletRequest request)
397
  throws NullPointerException
398
  {
399
    String action = (String) getParamHash(request).get("action");
400
      return action;
401
  }
402

  
403
  /**
404
     * Get the stylesheet systemid from the properties file for a given
405
     * action and style set.
406
     *
407
     * @param action the servlet request action
408
     * @param style the name of the style to be used
409
     * @return a String containing the system id of the stylesheet to be used
410
     */
411
  private String getStyleSystemId(String action, String style)
412
  throws IOException
413
  {
414
    String key = action + "." + style;
415
    //log.info("key >>" + key);
416
    String filename = (String) appConfig.get(key);
417
    //log.info("filename >>" + filename);
418
    String stylePath = context.getRealPath(STYLE_DIR);
419
    //log.info("stylePath>>" + stylePath);
420
    File xslFile = new File(stylePath, filename);
421
    String systemId = xslFile.getCanonicalPath();
422
      systemId = "file://" + systemId;
423
      log.info("returning systemId >> " + systemId + " for action.style: " + key);
424
      return systemId;
425
  }
426

  
427
  /**
428
    * utility function to convert the request object into a hashtable 
429
    * @param request -- the http request object
430
    * @return paramHash -- hashtable containing the name-value pairs
431
    */
432
  private Hashtable getParamHash(HttpServletRequest request)
433
  {
434
    Hashtable params = new Hashtable();
435
    try {
436
      Enumeration _enum = request.getParameterNames();
437
      while (_enum.hasMoreElements()) {
438
        String name = (String) _enum.nextElement();
439
        String values[] = request.getParameterValues(name);
440
        if (values != null) {
441
          for (int i = 0; i < values.length; i++) {
442
            params.put(name, values[i]);
443
          }
444
        }
445
      }
446
    }
447
    catch(Exception e) {
448
      e.printStackTrace();
449
    }
450
    return (params);
451
  }
452

  
453
}
454 0

  
src/edu/ucsb/nceas/metacat/spatial/SpatialHarvester.java
35 35
import edu.ucsb.nceas.metacat.DBConnection;
36 36
import org.geotools.feature.Feature;
37 37

  
38
/* 
39
 * Harvests spatial data from metacat and saves to persistent cache
38
/** 
39
 * Harvests spatial data from metacat database
40
 * and saves to persistent cache
40 41
 */
41 42
public class SpatialHarvester {
42 43
 
......
44 45
 
45 46
  private DBConnection dbconn;
46 47
 
47
  /** constructor to initialize db connection **/
48
  /** 
49
   * constructor to initialize db connection 
50
   */
48 51
  public SpatialHarvester() {
49 52
      try {
50 53
          dbconn = new DBConnection();
......
54 57
      }
55 58
  }
56 59
 
57
  /*
58
   * Closes the database connection
59
   * MUST be called after you're done with
60
   * the SpatialHarvester
60
  /**
61
   * Closes the database connection. 
62
   * Should be called after you're done with the SpatialHarvester
61 63
   */
62 64
  public void destroy() {
63 65
      try {
64 66
          dbconn.close();
65 67
      } catch( Exception e ) {
66
          log.error("Error closing out dbconn");
68
          log.error("Error closing out dbconn in spatial harvester");
67 69
          e.printStackTrace();
68 70
      }
69 71
  }
......
97 99
    return _docs;
98 100
  }
99 101

  
100
  /*
101
   * Currently just a wrapper around the harvester
102
  /**
103
   * Currently just a wrapper around the harvestDocument method.
102 104
   * Eventually we can use this method as a
103
   * timed que like the indexing process
105
   * timed que like the indexing process.
106
   *
107
   * @param docid The docid to be added to the spatial cache.
104 108
   */                   
105 109
  public void addToUpdateQue( String docid ) {
106 110
      harvestDocument(docid);
107 111
  }
108 112

  
109
  /*
110
   * Delete from spatial cache
111
   * Just a wrapper around delete for now
113
  /**
114
   * Delete a given document from spatial cache.
115
   * Just a wrapper around deleteDocument method for now.
116
   *
117
   * @param docid The docid to be deleted from the spatial cache.
112 118
   */
113 119
  public void addToDeleteQue( String docid ) {
114 120
      deleteDocument(docid);
115 121
  }
116 122

  
117
  /*
118
   * Given a docid, will attempt to delete
119
   * from spatial cache
123
  /**
124
   * Given a docid, will attempt to delete it from spatial cache
125
   *
126
   * @param docid The docid to be deleted from the spatial cache.
120 127
   */
121 128
  public void deleteDocument( String docid ) {
122 129

  
......
135 142
  }      
136 143

  
137 144

  
138
  /*
139
   * Given a docid, will update the spatial cache accordingly
145
  /**
146
   * Given a new or updated docid, 
147
   * will update the spatial cache accordingly.
148
   *
149
   * @param docid The docid to be updated or inserted into the spatial cache.
140 150
   */
141 151
  public void harvestDocument( String docid ) {
142 152

  
......
161 171
     }
162 172
  }
163 173

  
164
  /*
165
   * Completely regenerates the spatial cache
174
  /**
175
   * Completely regenerates the spatial cache. 
176
   * This can take a long time, especially with lots of documents.
166 177
   */
167 178
  public void regenerate() {
168 179
      
src/edu/ucsb/nceas/metacat/spatial/SpatialDataset.java
47 47

  
48 48
import edu.ucsb.nceas.metacat.MetaCatUtil;
49 49

  
50

  
50
/**
51
 * Class providing direct read/write access to the
52
 * persistent spatial cache.
53
 */
51 54
public class SpatialDataset {
52 55

  
53 56
  SpatialFeatureSchema featureSchema = new SpatialFeatureSchema();
......
61 64
  private static Logger log =
62 65
      Logger.getLogger(SpatialDataset.class.getName());
63 66

  
64
  /** empty constructor **/
67
  /**
68
   *  empty constructor for SpatialDataset
69
   */
65 70
  public SpatialDataset() {
66 71
    
67 72
  }
68 73

  
69
  /*
74
  /**
70 75
   * Adds a new feature (from a SpatialDocument)
71 76
   * This is faster than insertOrUpdate but 
72 77
   * relying on this method might cause duplication
73 78
   * of docids in the spatial cache. Therefore, its really only useful when 
74 79
   * regenerating the entire cache.
80
   *
81
   * @param geomType The kind of feature to be added. Currently "polygon" and "point" supported.
82
   * @param feature The geotools feature to be added to the spatial cache.
75 83
   */ 
76 84
  public void add( String geomType, Feature feature ) {
77 85
     if( geomType.equals("polygon") ) {
......
86 94
     }
87 95
  }
88 96

  
89
  /*
97
  /**
90 98
   * Deletes given docid from the spatial cache.
99
   *
100
   * @param geomType The kind of feature to be added. Currently "polygon" and "point" supported.
101
   * @param docid The document to be deleted from the spatial cache.
91 102
   */
92 103
  public void delete( String geomType, String docid ) throws IOException {
93 104

  
......
150 161

  
151 162
  }
152 163

  
153
  /*
164
  /**
154 165
   * Either inserts or updates the spatial cache with the new
155 166
   * spatial document depending on if it currently exists.
156 167
   * Docid is also passed in for quicker searching.
168
   *
169
   * @param geomType The kind of feature to be added. Currently "polygon" and "point" supported.
170
   * @param feature The geotools feature to be added to the spatial cache.
171
   * @param docid The document id to be inserted or updated. Used to filter for existing features.
157 172
   */
158 173
  public void insertOrUpdate( String geomType, Feature feature, String docid ) throws IOException {
159 174
    
......
227 242

  
228 243
  }
229 244

  
230
  /*
231
   * Saves the SpatialDataset object to the spatial cache
245
  /**
246
   * Saves the SpatialDataset object to the spatial cache.
232 247
   */
233 248
  public void save() {
234 249
         // Save Polygons 
src/edu/ucsb/nceas/metacat/spatial/SldFactory.java
32 32

  
33 33
import org.w3c.dom.*;
34 34

  
35
/**
36
 * Class to generate Styled Layer Descriptors allowing geoserver to 
37
 * filter the feature rendering based on various contraints 
38
 * such as permissions, non-spatial queries and skin configuration.
39
 */
35 40
public class SldFactory extends HttpServlet {
36 41
  
37 42
  static Document document;
38 43
  static String sld;
39 44
  
40
  /** Handle "GET" method requests from HTTP clients */
45
  /** 
46
   * Handle "GET" method requests from HTTP clients 
47
   *
48
   * @param request Incoming servlet request.
49
   * @param response Servlet response.
50
   */
41 51
  public void doGet(HttpServletRequest request, HttpServletResponse response)
42 52
  throws ServletException, IOException
43 53
  {
44 54
    handleGetOrPost(request, response);
45 55
  }
46 56

  
47
  /** Handle "POST" method requests from HTTP clients */
57
  /** 
58
   * Handle "POST" method requests from HTTP clients 
59
   *
60
   * @param request Incoming servlet request.
61
   * @param response Servlet response.
62
   */
48 63
  public void doPost(HttpServletRequest request, HttpServletResponse response)
49 64
  throws ServletException, IOException
50 65
  {
......
53 68

  
54 69
  /**
55 70
   * Control servlet response depending on the action parameter specified
71
   * Modifies the original SLD according to various access contraints
72
   * and sends it as the servlet response.
73
   *
74
   * @param request Incoming servlet request.
75
   * @param response Servlet response.
76
   * @todo Determine filename from variables in metacat.properties.
56 77
   */
57 78
  private void handleGetOrPost(HttpServletRequest request, HttpServletResponse response)
58 79
  throws ServletException, IOException
......
76 97
   * returns SLD document as a String.
77 98
   * 
78 99
   * @param filename	Filename of the base sld.
79
   * 
100
   * @todo Implement the doc id list queries for contraints.
80 101
   */
81 102
  private String getSld(String filename)
82 103
  {
src/edu/ucsb/nceas/metacat/spatial/SpatialFeatureSchema.java
34 34

  
35 35
import org.apache.log4j.Logger;
36 36

  
37

  
37
/**
38
 * Class representing the geotools feature schemas and file paths
39
 * for the spatial data cache.
40
 */
38 41
public class SpatialFeatureSchema {
39 42

  
40 43
  private static Logger log =
......
51 54
         
52 55
  }
53 56

  
54
  /*
57
  /**
55 58
   * Creates the featuretype schema for polygon bounds
56 59
   */
57 60
  public static FeatureType getPolygonFeatureType() {
......
69 72
    }
70 73
  }
71 74

  
72
  /*
75
  /**
73 76
   * Creates the featuretype schema for point centroids
74 77
   */
75 78
  public static FeatureType getPointFeatureType() {
src/edu/ucsb/nceas/metacat/spatial/SpatialDocument.java
48 48

  
49 49
import org.apache.log4j.Logger;
50 50

  
51
/**
52
 * Class representing the spatial portions of an xml document
53
 * as a geotools Feature.
54
 */
51 55
public class SpatialDocument {
52 56

  
53 57
  private DBConnection dbconn;
......
65 69
  String title = null;
66 70
  String docid = null;
67 71

  
68
  /** constructor that queries the db **/
72
  /** 
73
   * Constructor that queries the db 
74
   *
75
   * @param docid The document id to be represented spatially
76
   * @param dbconn The database connection shared from the refering method.
77
   * @todo Rewrite the title query to use xml_path_index
78
   */
69 79
  public SpatialDocument( String docid , DBConnection dbconn ) {
70 80

  
71 81
    this.docid = docid;
......
108 118
      e.printStackTrace();
109 119
    }      
110 120

  
111
    // Get the Title
112
    query = "select docid, nodedata, nodeid "
113
          + "from xml_nodes "
114
          + "where parentnodeid = "
115
          + "  ( select  nodeid "
116
          + "    from  xml_nodes "
117
          + "    where docid like '" + docid.trim() +"' "
118
          + "    and nodename like 'title%' "
119
          + "    and parentnodeid = "
120
          + "      ( select nodeid "
121
          + "        from xml_nodes "
122
          + "        where docid like '" + docid.trim() + "' "
123
          + "        and nodename = 'dataset' "
124
          + "        limit 1) "
125
          + "    limit 1)" ;
121
    /*
122
     * Get the title
123
     */
124
    String docTitlePath = MetaCatUtil.getOption("docTitle");
125
    query = "select nodedata from xml_path_index where path = '" 
126
          + docTitlePath + "' and docid = '" + docid.trim() + "'";
126 127

  
127 128
    try {
128 129
      pstmt = dbconn.prepareStatement(query);
129 130
      pstmt.execute();
130 131
      rs = pstmt.getResultSet();
131 132
      if (rs.next())
132
        this.title = rs.getString(2);
133
        this.title = rs.getString(1);
133 134
      rs.close();
134 135
      pstmt.close();
135 136
    }
......
149 150

  
150 151
  }
151 152

  
152
  /* 
153
   * Returns a jts (multi)polygon feature with geometry plus attributes
153
  /** 
154
   * Returns a geotools (multi)polygon feature with geometry plus attributes
154 155
   * ready to be inserted into our spatial dataset cache
155 156
   */
156 157
  public Feature getPolygonFeature() {
......
175 176
      }
176 177
  }
177 178

  
178
  /* 
179
   * Returns a jts (multi)point feature with geometry plus attributes
179
  /**
180
   * Returns a geotools (multi)point feature with geometry plus attributes
180 181
   * ready to be inserted into our spatial dataset cache
182
   *
181 183
   */
182 184
  public Feature getPointFeature() {
183 185
      // Get polygon feature type
......
201 203
      }
202 204
  }
203 205

  
204
  /*
206
  /**
205 207
   * Given a valid docid, return an appropriate URL
206 208
   * for viewing the metadata document
209
   *
210
   * @param docid The document id for which to construct the access url.
207 211
   */
208 212
  private String getUrl( String docid ) {
209 213
     String docUrl = MetaCatUtil.getOption("metacatUrl")  
......
214 218
     return docUrl;
215 219
  }
216 220

  
221

  
217 222
  /**
218
   * returns the title of the docid
219
   */
220
  private String getTitle(String docid) {
221
    String title = null;
222
    PreparedStatement pstmt = null;
223
    ResultSet rs = null;
224
    String query = "select docid, nodedata, nodeid "
225
                 + "from xml_nodes "
226
                 + "where parentnodeid = "
227
                 + "  ( select  nodeid "
228
                 + "    from  xml_nodes "
229
                 + "    where docid like '" + docid.trim() +"' "
230
                 + "    and nodename like 'title%' "
231
                 + "    and parentnodeid = "
232
                 + "      ( select nodeid "
233
                 + "        from xml_nodes "
234
                 + "        where docid like '" + docid.trim() + "' "
235
                 + "        and nodename = 'dataset' "
236
                 + "        limit 1) "
237
                 + "    limit 1)" ;
238

  
239
    /*
240
     * String query = "select docid, nodedata, nodeid from xml_nodes where "
241
     *   + "nodeid =(select  nodeid from  xml_nodes where docid  like '"
242
     *   + docid.trim() + "' and nodename like 'title%');";
243
     */
244

  
245
    try {
246
      dbconn = new DBConnection();
247
      pstmt = dbconn.prepareStatement(query);
248
      pstmt.execute();
249
      rs = pstmt.getResultSet();
250
      if (rs.next())
251
        title = rs.getString(2);
252
      rs.close();
253
      pstmt.close();
254
      dbconn.close();
255
    }
256
    catch(Exception e) {
257
      log.error(" **** Error getting docids from getTitle for docid = "+docid);
258
      e.printStackTrace();
259
      log.error(" query ============== \n " + query);
260
      title = docid;
261
    }
262
    
263
    return title;
264
  }
265

  
266

  
267
  /*
268 223
   * Returns a mutlipolygon geometry representing the geographic coverage(s) of the document
224
   *
269 225
   */
270 226
  private MultiPolygon getPolygonGeometry() {
271 227

  
......
337 293
  }
338 294
   
339 295

  
340
  /*
341
   * returns a polygon given the four bounding box coordinates
296
  /**
297
   * Returns a polygon given the four bounding box coordinates
342 298
   */
343 299
  private Polygon createPolygonFromBbox( GeometryFactory geomFac, Float w, Float s, Float e, Float n ) {
344 300

  
......
354 310
  }
355 311

  
356 312

  
357
  /*
358
   * returns a point geometry
313
  /**
314
   * Returns a multipoint geometry represnting the geographic coverage(s) of the document
315
   *
316
   * @todo Handle the case of crossing the dateline and poles
359 317
   */
360 318
  private MultiPoint getPointGeometry() {
361 319

  

Also available in: Unified diff