Project

General

Profile

« Previous | Next » 

Revision 5025

Added by daigle almost 15 years ago

Move document specific utilities to DocumentUtil from MetacatUtil. This makes it easier to define a layer between the core metacat services and the rest of the code.

View differences:

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

  
26
import edu.ucsb.nceas.metacat.service.PropertyService;
27
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
28

  
29
/**
30
 * @author jones
31
 *
32
 * Version represents the current version information for this Metacat instance.
33
 */
34
public class MetaCatVersion extends Version {
35
    public MetaCatVersion(String versionID) {
36
    	super(versionID);
37
    }
38
	
39
	/**
40
	 * Get the current version string for this metacat instance. It is currently
41
	 * stored in the metacat.properties file.
42
	 * 
43
	 * @return a string indicating the version of Metacat running
44
	 */
45
	public static String getVersionID() throws PropertyNotFoundException {
46
		String version = PropertyService.getProperty("application.metacatVersion");
47
		return version;
48
	}
49
    
50
    /**
51
	 * Get the version number in an XML document.
52
	 * 
53
	 * @return the version wrapped in an XML document
54
	 */
55
    public static String getVersionAsXml() throws PropertyNotFoundException {
56
        StringBuffer sb = new StringBuffer();
57
        sb.append("<?xml version=\"1.0\"?>");
58
        sb.append("<version>");
59
        sb.append(getVersionID());
60
        sb.append("</version>");
61
        return sb.toString();
62
    }
63
}
64 0

  
src/edu/ucsb/nceas/metacat/MetaCatServlet.java
86 86
import edu.ucsb.nceas.metacat.service.SessionService;
87 87
import edu.ucsb.nceas.metacat.service.SkinPropertyService;
88 88
import edu.ucsb.nceas.metacat.service.XMLSchemaService;
89
import edu.ucsb.nceas.metacat.shared.BaseException;
90 89
import edu.ucsb.nceas.metacat.shared.HandlerException;
91 90
import edu.ucsb.nceas.metacat.shared.MetacatUtilException;
92 91
import edu.ucsb.nceas.metacat.shared.ServiceException;
93 92
import edu.ucsb.nceas.metacat.spatial.SpatialHarvester;
94 93
import edu.ucsb.nceas.metacat.spatial.SpatialQuery;
95 94
import edu.ucsb.nceas.metacat.util.AuthUtil;
95
import edu.ucsb.nceas.metacat.util.ConfigurationUtil;
96 96
import edu.ucsb.nceas.metacat.util.ErrorSendingErrorException;
97
import edu.ucsb.nceas.metacat.util.DocumentUtil;
97 98
import edu.ucsb.nceas.metacat.util.MetacatUtil;
98 99
import edu.ucsb.nceas.metacat.util.RequestUtil;
99
import edu.ucsb.nceas.metacat.util.ResponseUtil;
100 100
import edu.ucsb.nceas.metacat.util.SystemUtil;
101 101
import edu.ucsb.nceas.metacat.util.SessionData;
102
import edu.ucsb.nceas.metacat.workflow.WorkflowScheduler;
103 102
import edu.ucsb.nceas.utilities.FileUtil;
104 103
import edu.ucsb.nceas.utilities.GeneralPropertyException;
105 104
import edu.ucsb.nceas.utilities.LSIDUtil;
......
129 128
 *     searchmode --
130 129
 *     anyfield --
131 130
 * action=spatial_query -- run a spatial query.  these queries may include any of the
132
 *     queries supported by the WFS / WMS standards
131
 *                         queries supported by the WFS / WMS standards
133 132
 *     xmax --
134 133
 *     ymax --
135 134
 *     xmin --
......
204 203
 *     event -- filter on event type (e.g., read, insert, update, delete)
205 204
 *     start -- filter out events before the start date-time
206 205
 *     end -- filter out events before the end date-time
207
 * action=shrink --
206
 * action=shrink -- Shrink the database connection pool size if it has grown and 
207
 *                  extra connections are no longer being used.
208 208
 * action=buildindex --
209 209
 *     docid --
210
 * action=gohome --
211 210
 * action=refreshServices --
212
 * action=scheduleWorkflow --
213
 *     delay --
214
 *     starttime --
215
 *     endtime --
216
 *     intervalvalue -- 
217
 *     intervalunit --
218
 *     workflowid --
219
 *     karid --
220
 *     workflowname --
221
 *     forwardto --
222
 *     qformat --
223
 * action=unscheduleWorkflow --
224
 *     workflowjobid --
225
 *     forwardto --
226
 *     qformat --
227
 * action=rescheduleWorkflow --
228
 *     workflowjobid --
229
 *     forwardto --
230
 *     qformat --
231
 * action=deleteScheduledWorkflow --
232
 *     workflowjobid --
233
 *     forwardto --
234
 *     qformat --
211
 * action=scheduleWorkflow -- Schedule a workflow to be run.  Scheduling a workflow 
212
 *                            registers it with the scheduling engine and creates a row
213
 *                            in the scheduled_job table.  Note that this may be 
214
 *                            extracted into a separate servlet.
215
 *     delay -- The amount of time from now before the workflow should be run.  The 
216
 *              delay can be expressed in number of seconds, minutes, hours and days, 
217
 *              for instance 30s, 2h, etc.
218
 *     starttime -- The time that the workflow should first run.  If both are provided
219
 *                  this takes precedence over delay.  The time should be expressed as: 
220
 *                  MM/dd/yyyy HH:mm:ss with the timezone assumed to be that of the OS.
221
 *     endtime -- The time when the workflow should end. The time should be expressed as: 
222
 *                  MM/dd/yyyy HH:mm:ss with the timezone assumed to be that of the OS.
223
 *     intervalvalue -- The numeric value of the interval between runs
224
 *     intervalunit -- The unit of the interval between runs.  Can be s, m, h, d for 
225
 *                     seconds, minutes, hours and days respectively
226
 *     workflowid -- The lsid of the workflow that we want to schedule.  This workflow
227
 *                   must already exist in the database.
228
 *     karid -- The karid for the workflow that we want to schedule.
229
 *     workflowname -- The name of the workflow.
230
 *     forwardto -- If provided, forward to this page when processing is done.
231
 *     qformat -- If provided, render results using the stylesheets associated with
232
 *                this skin.  Default is xml.
233
 * action=unscheduleWorkflow -- Unschedule a workflow.  Unscheduling a workflow 
234
 *                            removes it from the scheduling engine and changes the 
235
 *                            status in the scheduled_job table to " unscheduled.  Note 
236
 *                            that this may be extracted into a separate servlet.
237
 *     workflowjobid -- The job ID for the workflow run that we want to unschedule.  This
238
 *                      is held in the database as scheduled_job.name
239
 *     forwardto -- If provided, forward to this page when processing is done.
240
 *     qformat -- If provided, render results using the stylesheets associated with
241
 *                this skin.  Default is xml.
242
 * action=rescheduleWorkflow -- Unschedule a workflow.  Rescheduling a workflow 
243
 *                            registers it with the scheduling engine and changes the 
244
 *                            status in the scheduled_job table to " scheduled.  Note 
245
 *                            that this may be extracted into a separate servlet.
246
 *     workflowjobid -- The job ID for the workflow run that we want to reschedule.  This
247
 *                      is held in the database as scheduled_job.name
248
 *     forwardto -- If provided, forward to this page when processing is done.
249
 *     qformat -- If provided, render results using the stylesheets associated with
250
 *                this skin.  Default is xml.
251
 * action=deleteScheduledWorkflow -- Delete a workflow.  Deleting a workflow 
252
 *                            removes it from the scheduling engine and changes the 
253
 *                            status in the scheduled_job table to " deleted.  Note 
254
 *                            that this may be extracted into a separate servlet.
255
 *     workflowjobid -- The job ID for the workflow run that we want to delete.  This
256
 *                      is held in the database as scheduled_job.name
257
 *     forwardto -- If provided, forward to this page when processing is done.
258
 *     qformat -- If provided, render results using the stylesheets associated with
259
 *                this skin.  Default is xml.
235 260
 *     
236 261
 *     
237 262
 * Here are some of the common parameters for actions
......
266 291
    public static final String SCHEMALOCATIONKEYWORD = ":schemaLocation";
267 292
    public static final String NONAMESPACELOCATION = ":noNamespaceSchemaLocation";
268 293
    public static final String EML2KEYWORD = ":eml";
269
    public static final String XMLFORMAT = "xml";
270 294
    private static final String FALSE = "false";
271 295
    private static final String TRUE  = "true";
272 296
    private static String LOG_CONFIG_NAME = null;
......
302 326
    		// Check to see if the user has requested to bypass configuration 
303 327
            // (dev option) and check see if metacat has been configured.
304 328
    		// If both are false then stop the initialization
305
            if (!MetacatUtil.bypassConfiguration() && !MetacatUtil.isMetacatConfigured()) {
329
            if (!ConfigurationUtil.bypassConfiguration() && !ConfigurationUtil.isMetacatConfigured()) {
306 330
            	return;
307 331
            }  
308 332
            
......
430 454

  
431 455
			fullyInitialized = true;
432 456
			
433
			logMetacat.warn("Metacat (" + MetaCatVersion.getVersionID()
457
			logMetacat.warn("Metacat (" + MetacatVersion.getVersionID()
434 458
					+ ") initialized.");
435 459
			
436 460
		} catch (SQLException e) {
......
641 665
		
642 666
		// Each time metacat is called, check to see if metacat has been 
643 667
		// configured. If not then forward to the administration servlet
644
		if (!MetacatUtil.isMetacatConfigured()) {
645
			RequestUtil.forwardRequest(request, response, "/admin?action=configure");
668
		if (!ConfigurationUtil.isMetacatConfigured()) {
669
			RequestUtil.forwardRequest(request, response, "/admin?action=configure", null);
646 670
			return;
647 671
		}
648 672

  
......
927 951
				} else if (action.equals("getversion")) {
928 952
					response.setContentType("text/xml");
929 953
					PrintWriter out = response.getWriter();
930
					out.println(MetaCatVersion.getVersionAsXml());
954
					out.println(MetacatVersion.getVersionAsXml());
931 955
					out.close();
932 956
				} else if (action.equals("getlog")) {
933 957
					handleGetLogAction(params, request, response, userName, groupNames);
......
985 1009
					 * out.println(mue.getMessage()); mue.printStackTrace(out);
986 1010
					 * out.close(); }
987 1011
					 */
988
				} else if (action.equals("gohome")) {
989
					// forward to the default page
990
					RequestUtil.forwardRequest(request, response, "/");
991 1012
				} else if (action.equals("refreshServices")) {
992 1013
					// TODO MCD this interface is for testing.  It should go through a 
993 1014
					// ServiceService class and only work for an admin user.  Move to the
994 1015
					// MetacatAdminServlet
995 1016
					ServiceService.refreshService("XMLSchemaService");
996 1017
					return;
997
				} else if (action.equals("scheduleWorkflow")) {
998
					try {
999
						WorkflowScheduler.getInstance().scheduleJob(request, response, params, 
1000
							userName, groupNames);
1001
						return;
1002
					} catch (BaseException be) {
1003
						ResponseUtil.sendErrorXML(response, ResponseUtil.SCHEDULE_WORKFLOW_ERROR, be);
1004
						return;						
1005
					}
1006
				} else if (action.equals("unscheduleWorkflow")) {
1007
					try {
1008
						WorkflowScheduler.getInstance().unScheduleJob(request, response, params, 
1009
							userName, groupNames);
1010
						return;
1011
					} catch (BaseException be) {
1012
						ResponseUtil.sendErrorXML(response, ResponseUtil.UNSCHEDULE_WORKFLOW_ERROR, be);
1013
						return;						
1014
					}
1015
				} else if (action.equals("rescheduleWorkflow")) {
1016
					try {
1017
						WorkflowScheduler.getInstance().reScheduleJob(request, response, params, 
1018
							userName, groupNames);
1019
						return;
1020
					} catch (BaseException be) {
1021
						ResponseUtil.sendErrorXML(response, ResponseUtil.RESCHEDULE_WORKFLOW_ERROR, be);
1022
						return;						
1023
					}
1024
				} else if (action.equals("getScheduledWorkflow")) {
1025
					try {
1026
						WorkflowScheduler.getInstance().getJobs(request, response, params, 
1027
								userName, groupNames);				
1028
						return;
1029
					} catch (BaseException be) {
1030
						ResponseUtil.sendErrorXML(response, ResponseUtil.GET_SCHEDULED_WORKFLOW_ERROR, be);
1031
						return;						
1032
					}
1033
				} else if (action.equals("deleteScheduledWorkflow")) {
1034
					try {
1035
						WorkflowScheduler.getInstance().deleteJob(request, response, params, 
1036
								userName, groupNames);				
1037
						return;
1038
					} catch (BaseException be) {
1039
						ResponseUtil.sendErrorXML(response, ResponseUtil.DELETE_SCHEDULED_WORKFLOW_ERROR, be);
1040
						return;						
1041
					}
1018
//				} else if (action.equals("scheduleWorkflow")) {
1019
//					try {
1020
//						WorkflowScheduler.getInstance().scheduleJob(request, response, params, 
1021
//							userName, groupNames);
1022
//						return;
1023
//					} catch (BaseException be) {
1024
//						ResponseUtil.sendErrorXML(response, ResponseUtil.SCHEDULE_WORKFLOW_ERROR, be);
1025
//						return;						
1026
//					}
1027
//				} else if (action.equals("unscheduleWorkflow")) {
1028
//					try {
1029
//						WorkflowScheduler.getInstance().unScheduleJob(request, response, params, 
1030
//							userName, groupNames);
1031
//						return;
1032
//					} catch (BaseException be) {
1033
//						ResponseUtil.sendErrorXML(response, ResponseUtil.UNSCHEDULE_WORKFLOW_ERROR, be);
1034
//						return;						
1035
//					}
1036
//				} else if (action.equals("rescheduleWorkflow")) {
1037
//					try {
1038
//						WorkflowScheduler.getInstance().reScheduleJob(request, response, params, 
1039
//							userName, groupNames);
1040
//						return;
1041
//					} catch (BaseException be) {
1042
//						ResponseUtil.sendErrorXML(response, ResponseUtil.RESCHEDULE_WORKFLOW_ERROR, be);
1043
//						return;						
1044
//					}
1045
//				} else if (action.equals("getScheduledWorkflow")) {
1046
//					try {
1047
//						WorkflowScheduler.getInstance().getJobs(request, response, params, 
1048
//								userName, groupNames);				
1049
//						return;
1050
//					} catch (BaseException be) {
1051
//						ResponseUtil.sendErrorXML(response, ResponseUtil.GET_SCHEDULED_WORKFLOW_ERROR, be);
1052
//						return;						
1053
//					}
1054
//				} else if (action.equals("deleteScheduledWorkflow")) {
1055
//					try {
1056
//						WorkflowScheduler.getInstance().deleteJob(request, response, params, 
1057
//								userName, groupNames);				
1058
//						return;
1059
//					} catch (BaseException be) {
1060
//						ResponseUtil.sendErrorXML(response, ResponseUtil.DELETE_SCHEDULED_WORKFLOW_ERROR, be);
1061
//						return;						
1062
//					}
1042 1063
				} else {
1043 1064
					PrintWriter out = response.getWriter();
1044 1065
					out.println("<?xml version=\"1.0\"?>");
......
1336 1357
                response.setContentType("text/html");
1337 1358
                trans.transformXMLDocument(sess.getMessage(),
1338 1359
                        "-//NCEAS//login//EN", "-//W3C//HTML//EN", qformat,
1339
                        out, null);
1360
                        out, null, null);
1340 1361
            } catch (Exception e) {               
1341 1362
                logMetacat.error("Error in MetaCatServlet.handleLoginAction: "
1342 1363
                        + e.getMessage());
......
1385 1406
                response.setContentType("text/html");
1386 1407
                trans.transformXMLDocument(output.toString(),
1387 1408
                        "-//NCEAS//login//EN", "-//W3C//HTML//EN", qformat,
1388
                        out, null);
1409
                        out, null, null);
1389 1410
            } catch (Exception e) {
1390 1411
                logMetacat.error(
1391 1412
                        "Error in MetaCatServlet.handleLogoutAction"
......
1578 1599
                throw new Exception("You didn't specify requested inlinedataid"); }
1579 1600
            
1580 1601
            // check for permission
1581
            docId = MetacatUtil
1582
                    .getDocIdWithoutRevFromInlineDataID(inlineDataId);
1602
            docId = 
1603
            	DocumentUtil.getDocIdWithoutRevFromInlineDataID(inlineDataId);
1583 1604
            PermissionController controller = new PermissionController(docId);
1584 1605
            // check top level read permission
1585 1606
            if (!controller.hasPermission(user, groups,
......
1593 1614
                    Hashtable<String,String> unReadableInlineDataList =
1594 1615
                            PermissionController.getUnReadableInlineDataIdList(docId,
1595 1616
                            user, groups, false);
1596
                    String inlineDataIdWithoutRev = MetacatUtil.getInlineDataIdWithoutRev(inlineDataId);
1617
                    String inlineDataIdWithoutRev = DocumentUtil.getInlineDataIdWithoutRev(inlineDataId);
1597 1618
                    if (unReadableInlineDataList.containsValue(inlineDataIdWithoutRev)) {
1598 1619
                        throw new Exception("User " + user
1599 1620
                                + " doesn't have permission " + " to read inlinedata "
......
2011 2032
                    DBTransform dbt = new DBTransform();
2012 2033
                    dbt.transformXMLDocument(doc.toString(user, groups,
2013 2034
                            withInlineData), doctype, "-//W3C//HTML//EN",
2014
                            qformat, out, params);
2035
                            qformat, out, params, null);
2015 2036
                }
2016 2037
                
2017 2038
            }
......
2405 2426
                response.setContentType("text/html");
2406 2427
                trans.transformXMLDocument(output,
2407 2428
                        "message", "-//W3C//HTML//EN", qformat,
2408
                        out, null);
2429
                        out, null, null);
2409 2430
            } catch (Exception e) {
2410 2431
                
2411 2432
                logMetacat.error(
......
2517 2538
                    // Delete from spatial cache if runningSpatialOption
2518 2539
                    if ( PropertyService.getProperty("spatial.runSpatialOption").equals("true") ) {
2519 2540
                        SpatialHarvester sh = new SpatialHarvester();
2520
                        sh.addToDeleteQue( MetacatUtil.getSmartDocId( docid[0] ) );
2541
                        sh.addToDeleteQue( DocumentUtil.getSmartDocId( docid[0] ) );
2521 2542
                        sh.destroy();
2522 2543
                    }
2523 2544
                    
......
3418 3439
                response.setContentType("text/html");
3419 3440
                trans.transformXMLDocument(output,
3420 3441
                        "message", "-//W3C//HTML//EN", qformat,
3421
                        out, null);
3442
                        out, null, null);
3422 3443
            } catch (Exception e) {
3423 3444
                
3424 3445
                logMetacat.error(
......
3610 3631
        int serialNumber = -1;
3611 3632
        
3612 3633
        // get rid of revision if access number has
3613
        docId = MetacatUtil.getDocIdFromString(accessionNumber);
3634
        docId = DocumentUtil.getDocIdFromString(accessionNumber);
3614 3635
        try {
3615 3636
            //check out DBConnection
3616 3637
            conn = DBConnectionPool
src/edu/ucsb/nceas/metacat/ContentTypeProvider.java
59 59
import edu.ucsb.nceas.metacat.database.DBConnection;
60 60
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
61 61
import edu.ucsb.nceas.metacat.service.PropertyService;
62
import edu.ucsb.nceas.metacat.util.DocumentUtil;
62 63
import edu.ucsb.nceas.metacat.util.MetacatUtil;
63 64
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
64 65
/**
......
123 124
   */
124 125
  public ContentTypeProvider(String docIdWithRevision)
125 126
  {
126
    dataFileId = MetacatUtil.getDocIdFromString(docIdWithRevision);
127
    dataFileId = DocumentUtil.getDocIdFromString(docIdWithRevision);
127 128
    //get relative doclist for data file and package type
128 129
    Vector docLists = null;
129 130
    docLists = getRelativeDocIdList(dataFileId);
......
344 345
          if (URLData.indexOf(DBSAXHandler.ECOGRID) != -1 )
345 346
          {
346 347
            // Get docid from url
347
            String docId = MetacatUtil.
348
                               getAccessionNumberFromEcogridIdentifier(URLData);
348
            String docId = 
349
            	DocumentUtil.getAccessionNumberFromEcogridIdentifier(URLData);
349 350
            // Get rid of revision
350
            docId = MetacatUtil.getDocIdFromAccessionNumber(docId);
351
            docId = DocumentUtil.getDocIdFromAccessionNumber(docId);
351 352
            logMetacat.info("docid from url element in xml is: " +
352 353
                                     docId);
353 354
            //if this docid equals target one, we find it
src/edu/ucsb/nceas/metacat/PermissionController.java
39 39
import edu.ucsb.nceas.metacat.database.DBConnection;
40 40
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
41 41
import edu.ucsb.nceas.metacat.service.PropertyService;
42
import edu.ucsb.nceas.metacat.util.DocumentUtil;
42 43
import edu.ucsb.nceas.metacat.util.MetacatUtil;
43 44
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
44 45

  
......
61 62
   public PermissionController(String myDocid) throws McdbException
62 63
   {
63 64
     // Get rid of rev number
64
     docId = MetacatUtil.getSmartDocId(myDocid);
65
     docId = DocumentUtil.getSmartDocId(myDocid);
65 66
     //hasSubTreeAccessControl = checkSubTreeAccessControl();
66 67
   }
67 68

  
......
78 79
     }
79 80
     else
80 81
     {
81
         docId = MetacatUtil.getDocIdFromAccessionNumber(myDocid);
82
         docId = DocumentUtil.getDocIdFromAccessionNumber(myDocid);
82 83
     }
83 84
   }
84 85

  
......
433 434
	 */
434 435
	private boolean isAccessDocument(String docId) throws SQLException {
435 436
		// detele the rev number if docid contains it
436
		docId = MetacatUtil.getDocIdFromString(docId);
437
		docId = DocumentUtil.getDocIdFromString(docId);
437 438
		PreparedStatement pStmt = null;
438 439
		DBConnection conn = null;
439 440
		int serialNumber = -1;
......
1112 1113
            {
1113 1114
                logMetacat.info("Put subtree id " + subTreeId +
1114 1115
                                         " and " + "inline data file name " +
1115
                                         MetacatUtil.
1116
                                         getInlineDataIdWithoutRev(fileId) +
1116
                                         DocumentUtil.getInlineDataIdWithoutRev(fileId) +
1117 1117
                                         " into " + "un" + permission +
1118 1118
                                         " hash");
1119
                unAccessibleIdList.put(subTreeId, MetacatUtil.
1120
                                      getInlineDataIdWithoutRev(fileId));
1119
                unAccessibleIdList.put(subTreeId, 
1120
                		DocumentUtil.getInlineDataIdWithoutRev(fileId));
1121 1121
            }
1122 1122
        }
1123 1123
      }
src/edu/ucsb/nceas/metacat/DocumentImpl.java
64 64
import edu.ucsb.nceas.metacat.shared.MetacatUtilException;
65 65
import edu.ucsb.nceas.metacat.spatial.SpatialHarvester;
66 66
import edu.ucsb.nceas.metacat.util.AuthUtil;
67
import edu.ucsb.nceas.metacat.util.DocumentUtil;
67 68
import edu.ucsb.nceas.metacat.util.MetacatUtil;
68 69
import edu.ucsb.nceas.metacat.util.SystemUtil;
69 70
import edu.ucsb.nceas.utilities.FileUtil;
......
190 191
    {
191 192
        try {
192 193
            //this.conn = conn;
193
            this.docid = MetacatUtil.getDocIdFromAccessionNumber(accNum);
194
            this.rev   = MetacatUtil.getRevisionFromAccessionNumber(accNum);
194
            this.docid = DocumentUtil.getDocIdFromAccessionNumber(accNum);
195
            this.rev   = DocumentUtil.getRevisionFromAccessionNumber(accNum);
195 196

  
196 197
            // Look up the document information
197 198
            getDocumentInfo(docid, rev);
......
341 342
            serialNumber = conn.getCheckOutSerialNumber();
342 343
            conn.setAutoCommit(false);
343 344
            String action = null;
344
            String docIdWithoutRev = MetacatUtil.getDocIdFromAccessionNumber(accnum);
345
            int userSpecifyRev = MetacatUtil.getRevisionFromAccessionNumber(accnum);
345
            String docIdWithoutRev = DocumentUtil.getDocIdFromAccessionNumber(accnum);
346
            int userSpecifyRev = DocumentUtil.getRevisionFromAccessionNumber(accnum);
346 347
            action = checkRevInXMLDocuments(docIdWithoutRev, userSpecifyRev);
347 348
            logMetacat.warn("after check rev, the action is "+action);
348 349
            if (action.equals("UPDATE"))
......
421 422
            serialNumber = conn.getCheckOutSerialNumber();
422 423
            conn.setAutoCommit(false);
423 424
            String action = null;
424
            String docIdWithoutRev = MetacatUtil.getDocIdFromAccessionNumber(accnum);
425
            int userSpecifyRev = MetacatUtil.getRevisionFromAccessionNumber(accnum);
425
            String docIdWithoutRev = DocumentUtil.getDocIdFromAccessionNumber(accnum);
426
            int userSpecifyRev = DocumentUtil.getRevisionFromAccessionNumber(accnum);
426 427
            if (tableName.equals(DOCUMENTTABLE))
427 428
            {
428 429
                action = checkRevInXMLDocuments(docIdWithoutRev, userSpecifyRev);
......
750 751
            throws Exception
751 752
    {
752 753
        boolean flag = true;
753
        String docid = MetacatUtil.getDocIdFromString(accnum);
754
        int rev = MetacatUtil.getVersionFromString(accnum);
754
        String docid = DocumentUtil.getDocIdFromString(accnum);
755
        int rev = DocumentUtil.getVersionFromString(accnum);
755 756

  
756 757
        if (serverCode == 1) {
757 758
            flag = true;
......
1207 1208
                    // if it is inline data first to get the inline data
1208 1209
                    // internal id
1209 1210
                    String fileName = currentNode.getNodeData();
1210
                    String accessfileName = MetacatUtil
1211
                            .getDocIdWithoutRevFromInlineDataID(fileName);
1211
                    String accessfileName = 
1212
                    	DocumentUtil.getDocIdWithoutRevFromInlineDataID(fileName);
1212 1213
                    // check if user has read permision for this inline data
1213 1214
                    boolean readInlinedata = false;
1214 1215
                    try {
......
2569 2570
            }
2570 2571

  
2571 2572
            //DocumentIdentifier id = new DocumentIdentifier(accnum);
2572
            int revision = MetacatUtil.getRevisionFromAccessionNumber(accnum);
2573
            int revision = DocumentUtil.getRevisionFromAccessionNumber(accnum);
2573 2574
            String updaterev = (new Integer(revision)).toString();
2574 2575
            String server = ReplicationService
2575 2576
                    .getServerNameForServerCode(serverCode);
......
2800 2801
        String catalogId = null;
2801 2802
        logMetacat.info("user in replication" + user);
2802 2803
        // Docid without revision
2803
        String docid = MetacatUtil.getDocIdFromAccessionNumber(accnum);
2804
        String docid = DocumentUtil.getDocIdFromAccessionNumber(accnum);
2804 2805
        logMetacat.warn("The docid without rev is " + docid);
2805 2806
        // Revision specified by user (int)
2806
        int userSpecifyRev = MetacatUtil.getRevisionFromAccessionNumber(accnum);
2807
        int userSpecifyRev = DocumentUtil.getRevisionFromAccessionNumber(accnum);
2807 2808
        logMetacat.warn("The user specifyRev: " + userSpecifyRev);
2808 2809
        // Revision for this docid in current database
2809 2810
        int revInDataBase = DBUtil.getLatestRevisionInDocumentTable(docid);
......
2953 2954
            String packagedoctype = PropertyService.getProperty("xml.packagedoctype");
2954 2955
            Vector<String> packagedoctypes = new Vector<String>();
2955 2956
            packagedoctypes = MetacatUtil.getOptionList(packagedoctype);
2956
            String docIdWithoutRev = MetacatUtil.getDocIdFromAccessionNumber(accnumber);
2957
            int revision = MetacatUtil.getRevisionFromAccessionNumber(accnumber);
2957
            String docIdWithoutRev = DocumentUtil.getDocIdFromAccessionNumber(accnumber);
2958
            int revision = DocumentUtil.getRevisionFromAccessionNumber(accnumber);
2958 2959
            if (documenttype != null &&
2959 2960
                    packagedoctypes.contains(documenttype)) {
2960 2961
                dbconn = DBConnectionPool.getDBConnection(
......
2965 2966
                String aclidWithRev = RelationHandler.getAccessFileIDWithRevision(docIdWithoutRev);
2966 2967
                if (aclidWithRev != null)
2967 2968
                {
2968
                  String aclid = MetacatUtil.getDocIdFromAccessionNumber(aclidWithRev);
2969
                  revision = MetacatUtil.getRevisionFromAccessionNumber(aclidWithRev);
2969
                  String aclid = DocumentUtil.getDocIdFromAccessionNumber(aclidWithRev);
2970
                  revision = DocumentUtil.getRevisionFromAccessionNumber(aclidWithRev);
2970 2971
                 
2971 2972
                  // if there are access file, write ACL for that package
2972 2973
                  if (aclid != null) {
......
3034 3035
        int serialNumber = -1;
3035 3036
        try {
3036 3037
            //get rid of revision number
3037
            docid = MetacatUtil.getDocIdFromString(accnumber);
3038
            docid = DocumentUtil.getDocIdFromString(accnumber);
3038 3039
            dbConnection = DBConnectionPool.getDBConnection(
3039 3040
                    "DocumentImpl.getDocTypeFromDBForCurrentDoc");
3040 3041
            serialNumber = dbConnection.getCheckOutSerialNumber();
......
3088 3089
            // NEW - WHEN CLIENT ALWAYS PROVIDE ACCESSION NUMBER INCLUDING REV
3089 3090
            // IN IT
3090 3091
            //AccessionNumber ac = new AccessionNumber(accnum, "DELETE");
3091
            String docid = MetacatUtil.getDocIdFromAccessionNumber(accnum);
3092
            String docid = DocumentUtil.getDocIdFromAccessionNumber(accnum);
3092 3093
            //String rev = ac.getRev();
3093 3094

  
3094 3095
            // Check if the document exists.
......
3686 3687
            throws SQLException
3687 3688
    {
3688 3689
        //get rid of revNum part
3689
        String docId = MetacatUtil.getDocIdFromString(accNum);
3690
        String docId = DocumentUtil.getDocIdFromString(accNum);
3690 3691
        PreparedStatement pStmt = null;
3691 3692
        int serverLocation = 1;
3692 3693
        DBConnection conn = null;
......
4170 4171
            dbconn = DBConnectionPool.getDBConnection(
4171 4172
                    "DeletedDocumentImpl.registerDeletedDataFile");
4172 4173
            serialNumber = dbconn.getCheckOutSerialNumber();
4173
            String docIdWithoutRev = MetacatUtil
4174
                    .getDocIdFromAccessionNumber(accnum);
4175
            String rev = MetacatUtil.getRevisionStringFromString(accnum);
4174
            String docIdWithoutRev = 
4175
            	DocumentUtil.getDocIdFromAccessionNumber(accnum);
4176
            String rev = DocumentUtil.getRevisionStringFromString(accnum);
4176 4177
            writeDocumentToRevisionTable(dbconn, docIdWithoutRev, 
4177 4178
                    rev, doctype, docname, user,
4178 4179
                    null, serverCode, -1, createDate, updateDate); 
src/edu/ucsb/nceas/metacat/RelationHandler.java
24 24
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
25 25
import edu.ucsb.nceas.metacat.service.PropertyService;
26 26
import edu.ucsb.nceas.metacat.util.MetacatUtil;
27
import edu.ucsb.nceas.metacat.util.DocumentUtil;
27 28
import edu.ucsb.nceas.morpho.datapackage.Triple;
28 29
import edu.ucsb.nceas.morpho.datapackage.TripleCollection;
29 30
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
......
114 115
        logMetacat.info("relationship from triple:"+triple.getRelationship());
115 116
        logMetacat.info("object from triple: "+triple.getObject());
116 117
        //subject = (new DocumentIdentifier(triple.getSubject())).getIdentifier();
117
        subject = MetacatUtil.getDocIdFromString(triple.getSubject());
118
        subject = DocumentUtil.getDocIdFromString(triple.getSubject());
118 119
        relationship = triple.getRelationship();
119 120
        //object = (new DocumentIdentifier(triple.getObject())).getIdentifier();
120
        object = MetacatUtil.getDocIdFromString(triple.getObject());
121
        object = DocumentUtil.getDocIdFromString(triple.getObject());
121 122
        
122 123
        if (subject != null && relationship != null && object != null)
123 124
        {
src/edu/ucsb/nceas/metacat/DBUtil.java
50 50
import edu.ucsb.nceas.metacat.database.DBConnection;
51 51
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
52 52
import edu.ucsb.nceas.metacat.service.PropertyService;
53
import edu.ucsb.nceas.metacat.util.MetacatUtil;
53
import edu.ucsb.nceas.metacat.util.DocumentUtil;
54 54
import edu.ucsb.nceas.metacat.util.SystemUtil;
55 55
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
56 56

  
......
632 632
    String docType = null;
633 633
    
634 634
    // Get docid without rev
635
    docIdWithoutRevision = MetacatUtil.getDocIdFromString(givenDocId);
635
    docIdWithoutRevision = DocumentUtil.getDocIdFromString(givenDocId);
636 636
    // SQL comand is:
637 637
    sqlCommand = "select rev, doctype from xml_documents where docid like ?";
638 638
    
src/edu/ucsb/nceas/metacat/util/MetacatUtil.java
33 33
import java.io.PrintWriter;
34 34
import java.net.MalformedURLException;
35 35
import java.util.Hashtable;
36
import java.util.Stack;
37 36
import java.util.Vector;
38 37

  
39 38
import org.apache.log4j.Logger;
......
41 40
import com.oreilly.servlet.multipart.FilePart;
42 41

  
43 42
import edu.ucsb.nceas.dbadapter.AbstractDatabase;
44
import edu.ucsb.nceas.metacat.DBSAXHandler;
45
import edu.ucsb.nceas.metacat.NodeRecord;
46 43
import edu.ucsb.nceas.metacat.service.PropertyService;
47
import edu.ucsb.nceas.metacat.service.ServiceService;
48
import edu.ucsb.nceas.metacat.service.SkinPropertyService;
49
import edu.ucsb.nceas.metacat.shared.MetacatUtilException;
50
import edu.ucsb.nceas.metacat.shared.ServiceException;
51
import edu.ucsb.nceas.utilities.GeneralPropertyException;
52 44
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
53 45
import edu.ucsb.nceas.utilities.FileUtil;
54
import edu.ucsb.nceas.utilities.UtilException;
55 46

  
56 47
/**
57 48
 * A suite of utility classes for the metadata catalog server
......
59 50
public class MetacatUtil
60 51
{
61 52

  
53
    public static final String XMLFORMAT = "xml";	
62 54
    public static AbstractDatabase dbAdapter;
63 55
    
64 56
    private static boolean debugErrorDisplayed = false;
65 57
    
66 58
    private static Logger logMetacat = Logger.getLogger(MetacatUtil.class);
67
    private static char separator = '.';
68 59

  
69
    static {
70
        try {
71
        	separator = PropertyService.getProperty("document.accNumSeparator").charAt(0);
72
        } catch (PropertyNotFoundException pnfe) {
73
        	logMetacat.error("Could not retrieve account number separator. " 
74
        			+ "Separator set to '.' : " + pnfe.getMessage());
75
        }
76
    }
77

  
78 60
    /**
79 61
     * Utility method to parse the query part of a URL into parameters. This
80
     * method assumes the format of the query par tof the url is an ampersand
62
     * method assumes the format of the query part of the url is an ampersand
81 63
     * separated list of name/value pairs, with equal signs separating the name
82 64
     * from the value (e.g., name=tom&zip=99801 ). Returns a has of the name
83 65
     * value pairs, hashed on name.
......
290 272
    }
291 273

  
292 274
    /**
293
     * Get docid from online/url string
294
     */
295
    public static String getDocIdWithRevFromOnlineURL(String url)
296
    {
297
        String docid = null;
298
        String DOCID = "docid";
299
        boolean find = false;
300
        char limited = '&';
301
        int count = 0; //keep track how many & was found
302
        Vector list = new Vector();// keep index number for &
303
        if (url == null) {
304
            logMetacat.info("url is null and null will be returned");
305
            return docid;
306
        }
307
        // the first element in list is 0
308
        list.add(new Integer(0));
309
        for (int i = 0; i < url.length(); i++) {
310
            if (url.charAt(i) == limited) {
311
                // count plus 1
312
                count++;
313
                list.add(new Integer(i));
314
                // get substring beween two &
315
                String str = url.substring(
316
                        ((Integer) list.elementAt(count - 1)).intValue(), i);
317
                logMetacat.info("substring between two & is: " + str);
318
                //if the subString contains docid, we got it
319
                if (str.indexOf(DOCID) != -1) {
320
                    //get index of '="
321
                    int start = getIndexForGivenChar(str, '=') + 1;
322
                    int end = str.length();
323
                    docid = str.substring(start, end);
324
                    find = true;
325
                }//if
326
            }//if
327
        }//for
328
        //if not find, we need check the subtring between the index of last &
329
        // and
330
        // the end of string
331
        if (!find) {
332
            logMetacat.info("Checking the last substring");
333
            String str = url.substring(((Integer) list.elementAt(count))
334
                    .intValue() + 1, url.length());
335
            logMetacat.info("Last substring is: " + str);
336
            if (str.indexOf(DOCID) != -1) {
337
                //get index of '="
338
                int start = getIndexForGivenChar(str, '=') + 1;
339
                int end = str.length();
340
                docid = str.substring(start, end);
341
                find = true;
342
            }//if
343
        }//if
344
        logMetacat.info("The docid from online url is:" + docid);
345
        return docid.trim();
346
    }
347

  
348

  
349
    /**
350
     * Eocgorid identifier will look like: ecogrid://knb/tao.1.1
351
     * The AccessionNumber tao.1.1 will be returned. If the given doesn't
352
     * contains ecogrid, null will be returned.
353
     * @param identifier String
354
     * @return String
355
     */
356
    public static String getAccessionNumberFromEcogridIdentifier(String identifier)
357
    {
358
      String accessionNumber = null;
359
      if (identifier != null && identifier.startsWith(DBSAXHandler.ECOGRID))
360
      {
361
        // find the last "/" in identifier
362
        int indexOfLastSlash = identifier.lastIndexOf("/");
363
        int start = indexOfLastSlash+1;
364
        int end   = identifier.length();
365
        accessionNumber = identifier.substring(start, end);
366
      }
367
      logMetacat.warn("The accession number from url is " +
368
                                 accessionNumber);
369
      return accessionNumber;
370
    }
371

  
372
    private static int getIndexForGivenChar(String str, char character)
373
    {
374
        int index = -1;
375
        // make sure str is not null
376
        if (str == null) {
377
            logMetacat.info(
378
                    "The given str is null and -1 will be returned");
379
            return index;
380
        }
381
        // got though the string
382
        for (int i = 0; i < str.length(); i++) {
383
            // find the first one then break the loop
384
            if (str.charAt(i) == character) {
385
                index = i;
386
                break;
387
            }//if
388
        }//for
389
        logMetacat.info("the index for char " + character + " is: "
390
                + index);
391
        return index;
392
    }
393

  
394
    /**
395
     * Utility method to get docid from a given string
396
     *
397
     * @param string, the given string should be these two format: 1) str1.str2
398
     *            in this case docid= str1.str2 2) str1.str2.str3, in this case
399
     *            docid =str1.str2
400
     * @param the sperator char
401
     */
402
    public static String getDocIdFromString(String str)
403
    {
404
        String docId = null;
405
        if (str == null) {
406
            logMetacat.info(
407
                    "The given str is null and null will be returned"
408
                            + " in getDocIdfromString");
409
            return docId;
410
        } //make sure docid is not null
411
        int dotNumber = 0;//count how many dots in given string
412
        int indexOfLastDot = 0;
413

  
414
        for (int i = 0; i < str.length(); i++) {
415
            if (str.charAt(i) == separator) {
416
                dotNumber++;//count how many dots
417
                indexOfLastDot = i;//keep the last dot postion
418
            }
419
        }//for
420

  
421
        //The string formatt is wrong, because it has more than two or less
422
        // than
423
        //one seperator
424
        if (dotNumber > 2 || dotNumber < 1) {
425
            docId = null;
426
        } else if (dotNumber == 2) //the case for str1.str2.str3
427
        {
428
            docId = str.substring(0, indexOfLastDot);
429
        } else if (dotNumber == 1) //the case for str1.str2
430
        {
431
            docId = str;
432
        }
433

  
434
        return docId;
435
    }//getDocIdFromString
436

  
437
    /**
438
     * Utility method to get version number from a given string
439
     *
440
     * @param string, the given string should be these two format: 1)
441
     *            str1.str2(no version) version =-1; 2) str1.str2.str3, in this
442
     *            case version = str3; 3) other, vresion =-2
443
     */
444
    public static int getVersionFromString(String str)
445
            throws NumberFormatException
446
    {
447
        int version = -1;
448
        String versionString = null;
449
        int dotNumber = 0;//count how many dots in given string
450
        int indexOfLastDot = 0;
451

  
452
        for (int i = 0; i < str.length(); i++) {
453
            if (str.charAt(i) == separator) {
454
                dotNumber++;//count how many dots
455
                indexOfLastDot = i;//keep the last dot postion
456
            }
457
        }//for
458

  
459
        //The string formatt is wrong, because it has more than two or less
460
        // than
461
        //one seperator
462
        if (dotNumber > 2 || dotNumber < 1) {
463
            version = -2;
464
        } else if (dotNumber == 2 && (indexOfLastDot != (str.length() - 1)))
465
        //the case for str1.str2.str3
466
        {
467
            versionString = str.substring((indexOfLastDot + 1), str.length());
468
            version = Integer.parseInt(versionString);
469
        } else if (dotNumber == 1) //the case for str1.str2
470
        {
471
            version = -1;
472
        }
473

  
474
        return version;
475
    }//getVersionFromString
476

  
477
    /**
478
     * Utility method to get version string from a given string
479
     *
480
     * @param string, the given string should be these two format: 1)
481
     *            str1.str2(no version) version=null; 2) str1.str2.str3, in
482
     *            this case version = str3; 3) other, vresion =null;
483
     */
484
    public static String getRevisionStringFromString(String str)
485
            throws NumberFormatException
486
    {
487
        // String to store the version
488
        String versionString = null;
489
        int dotNumber = 0;//count how many dots in given string
490
        int indexOfLastDot = 0;
491

  
492
        for (int i = 0; i < str.length(); i++) {
493
            if (str.charAt(i) == separator) {
494
                dotNumber++;//count how many dots
495
                indexOfLastDot = i;//keep the last dot postion
496
            }
497
        }//for
498

  
499
        //The string formatt is wrong, because it has more than two or less
500
        // than
501
        //one seperator
502
        if (dotNumber > 2 || dotNumber < 1) {
503
            versionString = null;
504
        } else if (dotNumber == 2 && (indexOfLastDot != (str.length() - 1))) {
505
            //the case for str1.str2.str3
506
            // indexOfLastDot != (str.length() -1) means get rid of str1.str2.
507
            versionString = str.substring((indexOfLastDot + 1), str.length());
508
        } else if (dotNumber == 1) //the case for str1.str2 or str1.str2.
509
        {
510
            versionString = null;
511
        }
512

  
513
        return versionString;
514
    }//getVersionFromString
515

  
516
    /**
517
     * This method will get docid from an AccessionNumber. There is no
518
     * assumption the accessnumber will be str1.str2.str3. It can be more. So
519
     * we think the docid will be get rid of last part
520
     */
521
    public static String getDocIdFromAccessionNumber(String accessionNumber)
522
    {
523
        String docid = null;
524
        if (accessionNumber == null) { return docid; }
525
        int indexOfLastSeperator = accessionNumber.lastIndexOf(separator);
526
        docid = accessionNumber.substring(0, indexOfLastSeperator);
527
        logMetacat.info("after parsing accessionnumber, docid is "
528
                + docid);
529
        return docid;
530
    }
531

  
532
    /**
533
     * This method will get inline data id without the revision number.
534
     * So if inlineData.1.2 is passed as input, inlineData.2 is returned.
535
     */
536
    public static String getInlineDataIdWithoutRev(String accessionNumber)
537
    {
538
        String docid = null;
539
        if (accessionNumber == null) { return docid; }
540
        int indexOfLastSeperator = accessionNumber.lastIndexOf(separator);
541
        String version = accessionNumber.substring(indexOfLastSeperator,
542
                                                   accessionNumber.length());
543
        accessionNumber = accessionNumber.substring(0, indexOfLastSeperator);
544
        indexOfLastSeperator = accessionNumber.lastIndexOf(separator);
545
        docid = accessionNumber.substring(0, indexOfLastSeperator) + version;
546
        logMetacat.info("after parsing accessionnumber, docid is "
547
                                 + docid);
548

  
549
        return docid;
550
    }
551

  
552
    /**
553
     * This method will call both getDocIdFromString and
554
     * getDocIdFromAccessionNumber. So first, if the string looks str1.str2,
555
     * the docid will be str1.str2. If the string is str1.str2.str3, the docid
556
     * will be str1.str2. If the string is str1.str2.str3.str4 or more, the
557
     * docid will be str1.str2.str3. If the string look like str1, null will be
558
     * returned
559
     *
560
     */
561
    public static String getSmartDocId(String str)
562
    {
563
        String docid = null;
564
        //call geDocIdFromString first.
565
        docid = getDocIdFromString(str);
566
        // If docid is null, try to call getDocIdFromAccessionNumber
567
        // it will handle the seperator more than2
568
        if (docid == null) {
569
            docid = getDocIdFromAccessionNumber(str);
570
        }
571
        logMetacat.info("The docid get from smart docid getor is "
572
                + docid);
573
        return docid;
574
    }
575

  
576
    /**
577
     * This method will get revision from an AccessionNumber. There is no
578
     * assumption the accessnumber will be str1.str2.str3. It can be more. So
579
     * we think the docid will be get rid of last part
580
     */
581
    public static int getRevisionFromAccessionNumber(String accessionNumber)
582
            throws NumberFormatException
583
    {
584
        String rev = null;
585
        int revNumber = -1;
586
        if (accessionNumber == null) { return revNumber; }
587
        int indexOfLastSeperator = accessionNumber.lastIndexOf(separator);
588
        rev = accessionNumber.substring(indexOfLastSeperator + 1,
589
                accessionNumber.length());
590
        revNumber = Integer.parseInt(rev);
591
        logMetacat.info("after parsing accessionnumber, rev is "
592
                + revNumber);
593
        return revNumber;
594
    }
595

  
596
    /**
597 275
     * Method to get the name of local replication server
598 276
     */
599 277
    public static String getLocalReplicationServerName()
......
616 294

  
617 295
    }
618 296

  
619
    /**
620
     * Method to get docidwithrev from eml2 inline data id The eml inline data
621
     * id would look like eml.200.2.3
622
     */
623
    public static String getDocIdWithoutRevFromInlineDataID(String inlineDataID)
624
    {
625
        String docidWithoutRev = null;
626
        if (inlineDataID == null) { return docidWithoutRev; }
627
        char charSeperator = separator;
628
        int targetNumberOfSeperator = 2;// we want to know his index
629
        int numberOfSeperator = 0;
630
        for (int i = 0; i < inlineDataID.length(); i++) {
631
            // meet seperator, increase number of seperator
632
            if (inlineDataID.charAt(i) == charSeperator) {
633
                numberOfSeperator++;
634
            }
635
            // if number of seperator reach the target one, record the index(i)
636
            // and get substring and terminate the loop
637
            if (numberOfSeperator == targetNumberOfSeperator) {
638
                docidWithoutRev = inlineDataID.substring(0, i);
639
                break;
640
            }
641
        }
642

  
643
        logMetacat.info("Docid without rev from inlinedata id: "
644
                + docidWithoutRev);
645
        return docidWithoutRev;
646

  
647
    }
648

  
649
    /**
650
     * Revise stack change a stack to opposite order
651
     */
652
    public static Stack<NodeRecord> reviseStack(Stack<NodeRecord> stack)
653
    {
654
        Stack result = new Stack();
655
        // make sure the parameter is correct
656
        if (stack == null || stack.isEmpty()) {
657
            result = stack;
658
            return result;
659
        }
660

  
661
        while (!stack.isEmpty()) {
662
            Object obj = stack.pop();
663
            result.push(obj);
664
        }
665
        return result;
666
    }
667

  
668 297
    /** A method to replace whitespace in url */
669 298
    public static String replaceWhiteSpaceForURL(String urlHasWhiteSpace)
670 299
    {
......
909 538
        }
910 539
        return new File(dirname);
911 540
    }
912

  
913
	/**
914
	 * Reports whether metacat is fully configured.
915
	 * 
916
	 * @return a boolean that is true if all sections are configured and 
917
	 * false otherwise
918
	 */
919
	public static boolean isMetacatConfigured() {
920
		boolean metacatConfigured = false;
921
		try {			
922
			metacatConfigured = PropertyService.arePropertiesConfigured()
923
					&& AuthUtil.isAuthConfigured()
924
					&& SkinUtil.areSkinsConfigured()
925
					&& DatabaseUtil.isDatabaseConfigured()
926
					&& GeoserverUtil.isGeoserverConfigured()
927
					&& isBackupDirConfigured();
928
		} catch (MetacatUtilException ue) {
929
			logMetacat.error("Could not determine if metacat is configured due to utility exception: "
930
					+ ue.getMessage());
931
		} catch (PropertyNotFoundException pnfe) {
932
			logMetacat.error("Could not determine if metacat is configured due to property exception: "
933
					+ pnfe.getMessage());
934
		}
935

  
936
		return metacatConfigured;
937
	}
938

  
939
	/**
940
	 * Check if the application.backupDir property is populated in
941
	 * metacat.properties and that it points to a writable directory.
942
	 * 
943
	 * @return false if the application.backupDir property does not point to a
944
	 *         writable directory.
945
	 */
946
	public static boolean isBackupDirConfigured() throws MetacatUtilException, PropertyNotFoundException {
947
		String backupDir = PropertyService.getProperty("application.backupDir");
948
		if (backupDir == null || backupDir.equals("")) {
949
			return false;
950
		}		
951
		if (FileUtil.getFileStatus(backupDir) < FileUtil.EXISTS_READ_WRITABLE) {
952
			return false;
953
		}	
954
		return true;
955
	}
956
		
957
	/**
958
	 * Reports whether the metacat configuration utility should be run. Returns
959
	 * false if 
960
	 *   -- dev.runConfiguration=false and 
961
	 *   -- backup properties file exists 
962
	 * Note that dev.runConfiguration should only be set to false when reinstalling the 
963
	 * same version of the application in development.
964
	 * 
965
	 * @return a boolean that is false if dev.runConfiguration is false and the
966
	 *         backup properties file exists.
967
	 */
968
	public static boolean bypassConfiguration() throws MetacatUtilException, ServiceException {
969
		try {
970
			// If the system is not configured to do bypass, return false.
971
			if (!PropertyService.doBypass()) {
972
				return false;
973
			}
974

  
975
			// Get the most likely backup files.  If these cannot be found, we 
976
			// cannot do the configuration bypass.
977
			String ExternalBaseDir = SystemUtil.discoverExternalDir();
978
			if (ExternalBaseDir == null) {
979
				logMetacat.error("bypassConfiguration: Could not find backup directory.");
980
				// could not find backup files ... force the configuration
981
				return false;
982
			}
983
			String realContext = ServiceService.getRealApplicationContext();
984
			PropertyService.setRecommendedExternalDir(ExternalBaseDir);
985
			PropertyService.setProperty("application.backupDir", 
986
					ExternalBaseDir + FileUtil.getFS() + "." + realContext);
987

  
988
			// Refresh the property service and skin property service.  This will pick up 
989
			// the backup directory and populate backup properties in caches.
990
			ServiceService.refreshService("PropertyService");
991
			ServiceService.refreshService("SkinPropertyService");
992

  
993
			// Call bypassConfiguration to make sure backup properties get persisted 
994
			// to active properties for both main and skin properties.
995
			PropertyService.bypassConfiguration();
996
			SkinPropertyService.bypassConfiguration();
997

  
998
			return true;
999
		} catch (GeneralPropertyException gpe) {
1000
			throw new MetacatUtilException("Property error while discovering backup directory: "
1001
					+ gpe.getMessage());
1002
		} catch (MetacatUtilException mue) {
1003
			throw new MetacatUtilException("Utility error while discovering backup directory: "
1004
					+ mue.getMessage());
1005
		}
1006

  
1007
	}
1008
		
1009 541
}
src/edu/ucsb/nceas/metacat/util/DocumentUtil.java
1
/**
2
 *  '$RCSfile$'
3
 *    Purpose: A Class that implements utility methods for a metadata catalog
4
 *  Copyright: 2009 Regents of the University of California and the
5
 *             National Center for Ecological Analysis and Synthesis
6
 *    Authors: Michael Daigle
7
 *
8
 *   '$Author: daigle $'
9
 *     '$Date: 2009-08-04 14:32:58 -0700 (Tue, 04 Aug 2009) $'
10
 * '$Revision: 5015 $'
11
 *
12
 * This program is free software; you can redistribute it and/or modify
13
 * it under the terms of the GNU General Public License as published by
14
 * the Free Software Foundation; either version 2 of the License, or
15
 * (at your option) any later version.
16
 *
17
 * This program is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
 * GNU General Public License for more details.
21
 *
22
 * You should have received a copy of the GNU General Public License
23
 * along with this program; if not, write to the Free Software
24
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25
 */
26

  
27
package edu.ucsb.nceas.metacat.util;
28

  
29
import java.util.Stack;
30
import java.util.Vector;
31

  
32
import org.apache.log4j.Logger;
33

  
34
import edu.ucsb.nceas.dbadapter.AbstractDatabase;
35
import edu.ucsb.nceas.metacat.DBSAXHandler;
36
import edu.ucsb.nceas.metacat.NodeRecord;
37
import edu.ucsb.nceas.metacat.service.PropertyService;
38
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
39

  
40
/**
41
 * A suite of utility classes for the metadata catalog server
42
 */
43
public class DocumentUtil
44
{
45
	
46
    public static AbstractDatabase dbAdapter;
47
    
48
    private static Logger logMetacat = Logger.getLogger(DocumentUtil.class);
49
    private static char separator = '.';
50

  
51
    static {
52
        try {
53
        	separator = PropertyService.getProperty("document.accNumSeparator").charAt(0);
54
        } catch (PropertyNotFoundException pnfe) {
55
        	logMetacat.error("Could not retrieve account number separator. " 
56
        			+ "Separator set to '.' : " + pnfe.getMessage());
57
        }
58
    }
59

  
60
    /**
61
     * Get docid from online/url string
62
     */
63
    public static String getDocIdWithRevFromOnlineURL(String url)
64
    {
65
        String docid = null;
66
        String DOCID = "docid";
67
        boolean find = false;
68
        char limited = '&';
69
        int count = 0; //keep track how many & was found
70
        Vector list = new Vector();// keep index number for &
71
        if (url == null) {
72
            logMetacat.info("url is null and null will be returned");
73
            return docid;
74
        }
75
        // the first element in list is 0
76
        list.add(new Integer(0));
77
        for (int i = 0; i < url.length(); i++) {
78
            if (url.charAt(i) == limited) {
79
                // count plus 1
80
                count++;
81
                list.add(new Integer(i));
82
                // get substring beween two &
83
                String str = url.substring(
84
                        ((Integer) list.elementAt(count - 1)).intValue(), i);
85
                logMetacat.info("substring between two & is: " + str);
86
                //if the subString contains docid, we got it
87
                if (str.indexOf(DOCID) != -1) {
88
                    //get index of '="
89
                    int start = getIndexForGivenChar(str, '=') + 1;
90
                    int end = str.length();
91
                    docid = str.substring(start, end);
92
                    find = true;
93
                }//if
94
            }//if
95
        }//for
96
        //if not find, we need check the subtring between the index of last &
97
        // and
98
        // the end of string
99
        if (!find) {
100
            logMetacat.info("Checking the last substring");
101
            String str = url.substring(((Integer) list.elementAt(count))
102
                    .intValue() + 1, url.length());
103
            logMetacat.info("Last substring is: " + str);
104
            if (str.indexOf(DOCID) != -1) {
105
                //get index of '="
106
                int start = getIndexForGivenChar(str, '=') + 1;
107
                int end = str.length();
108
                docid = str.substring(start, end);
109
                find = true;
110
            }//if
111
        }//if
112
        logMetacat.info("The docid from online url is:" + docid);
113
        return docid.trim();
114
    }
115

  
116

  
117
    /**
118
     * Eocgorid identifier will look like: ecogrid://knb/tao.1.1
119
     * The AccessionNumber tao.1.1 will be returned. If the given doesn't
120
     * contains ecogrid, null will be returned.
121
     * @param identifier String
122
     * @return String
123
     */
124
    public static String getAccessionNumberFromEcogridIdentifier(String identifier)
125
    {
126
      String accessionNumber = null;
127
      if (identifier != null && identifier.startsWith(DBSAXHandler.ECOGRID))
128
      {
129
        // find the last "/" in identifier
130
        int indexOfLastSlash = identifier.lastIndexOf("/");
131
        int start = indexOfLastSlash+1;
132
        int end   = identifier.length();
133
        accessionNumber = identifier.substring(start, end);
134
      }
135
      logMetacat.warn("The accession number from url is " +
136
                                 accessionNumber);
137
      return accessionNumber;
138
    }
139

  
140
    private static int getIndexForGivenChar(String str, char character)
141
    {
142
        int index = -1;
143
        // make sure str is not null
144
        if (str == null) {
145
            logMetacat.info(
146
                    "The given str is null and -1 will be returned");
147
            return index;
148
        }
149
        // got though the string
150
        for (int i = 0; i < str.length(); i++) {
151
            // find the first one then break the loop
152
            if (str.charAt(i) == character) {
153
                index = i;
154
                break;
155
            }//if
156
        }//for
157
        logMetacat.info("the index for char " + character + " is: "
158
                + index);
159
        return index;
160
    }
161

  
162
    /**
163
     * Utility method to get docid from a given string
164
     *
165
     * @param string, the given string should be these two format: 1) str1.str2
166
     *            in this case docid= str1.str2 2) str1.str2.str3, in this case
167
     *            docid =str1.str2
168
     * @param the sperator char
169
     */
170
    public static String getDocIdFromString(String str)
171
    {
172
        String docId = null;
173
        if (str == null) {
174
            logMetacat.info(
175
                    "The given str is null and null will be returned"
176
                            + " in getDocIdfromString");
177
            return docId;
178
        } //make sure docid is not null
179
        int dotNumber = 0;//count how many dots in given string
180
        int indexOfLastDot = 0;
181

  
182
        for (int i = 0; i < str.length(); i++) {
183
            if (str.charAt(i) == separator) {
184
                dotNumber++;//count how many dots
185
                indexOfLastDot = i;//keep the last dot postion
186
            }
187
        }//for
188

  
189
        //The string formatt is wrong, because it has more than two or less
190
        // than
191
        //one seperator
192
        if (dotNumber > 2 || dotNumber < 1) {
193
            docId = null;
194
        } else if (dotNumber == 2) //the case for str1.str2.str3
195
        {
196
            docId = str.substring(0, indexOfLastDot);
197
        } else if (dotNumber == 1) //the case for str1.str2
198
        {
199
            docId = str;
200
        }
201

  
202
        return docId;
203
    }//getDocIdFromString
204

  
205
    /**
206
     * Utility method to get version number from a given string
207
     *
208
     * @param string, the given string should be these two format: 1)
209
     *            str1.str2(no version) version =-1; 2) str1.str2.str3, in this
210
     *            case version = str3; 3) other, vresion =-2
211
     */
212
    public static int getVersionFromString(String str)
213
            throws NumberFormatException
214
    {
215
        int version = -1;
216
        String versionString = null;
217
        int dotNumber = 0;//count how many dots in given string
218
        int indexOfLastDot = 0;
219

  
220
        for (int i = 0; i < str.length(); i++) {
221
            if (str.charAt(i) == separator) {
222
                dotNumber++;//count how many dots
223
                indexOfLastDot = i;//keep the last dot postion
224
            }
225
        }//for
226

  
227
        //The string formatt is wrong, because it has more than two or less
228
        // than
229
        //one seperator
230
        if (dotNumber > 2 || dotNumber < 1) {
231
            version = -2;
232
        } else if (dotNumber == 2 && (indexOfLastDot != (str.length() - 1)))
233
        //the case for str1.str2.str3
234
        {
235
            versionString = str.substring((indexOfLastDot + 1), str.length());
236
            version = Integer.parseInt(versionString);
237
        } else if (dotNumber == 1) //the case for str1.str2
238
        {
239
            version = -1;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff