Project

General

Profile

1
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2000-2011 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *
6
 *   '$Author:  $'
7
 *     '$Date:  $'
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

    
24
package edu.ucsb.nceas.metacat.dataone;
25

    
26
import java.io.InputStream;
27
import java.util.Date;
28

    
29
import org.apache.log4j.Logger;
30
import org.dataone.service.exceptions.IdentifierNotUnique;
31
import org.dataone.service.exceptions.InsufficientResources;
32
import org.dataone.service.exceptions.InvalidRequest;
33
import org.dataone.service.exceptions.InvalidSystemMetadata;
34
import org.dataone.service.exceptions.InvalidToken;
35
import org.dataone.service.exceptions.NotAuthorized;
36
import org.dataone.service.exceptions.NotFound;
37
import org.dataone.service.exceptions.NotImplemented;
38
import org.dataone.service.exceptions.ServiceFailure;
39
import org.dataone.service.exceptions.UnsupportedType;
40
import org.dataone.service.mn.tier1.MNCore;
41
import org.dataone.service.mn.tier1.MNRead;
42
import org.dataone.service.mn.tier2.MNAuthorization;
43
import org.dataone.service.mn.tier3.MNStorage;
44
import org.dataone.service.mn.tier4.MNReplication;
45
import org.dataone.service.types.AccessPolicy;
46
import org.dataone.service.types.Checksum;
47
import org.dataone.service.types.DescribeResponse;
48
import org.dataone.service.types.Event;
49
import org.dataone.service.types.Identifier;
50
import org.dataone.service.types.Log;
51
import org.dataone.service.types.MonitorList;
52
import org.dataone.service.types.Node;
53
import org.dataone.service.types.NodeReference;
54
import org.dataone.service.types.ObjectFormat;
55
import org.dataone.service.types.ObjectList;
56
import org.dataone.service.types.Permission;
57
import org.dataone.service.types.Session;
58
import org.dataone.service.types.Subject;
59
import org.dataone.service.types.SystemMetadata;
60

    
61
/**
62
 * Represents Metacat's implementation of the DataONE Member Node 
63
 * service API. Methods implement the various MN* interfaces, and methods common
64
 * to both Member Node and Coordinating Node interfaces are found in the
65
 * D1NodeService base class.
66
 */
67
public class MNodeService extends D1NodeService implements MNAuthorization,
68
  MNCore, MNRead, MNReplication, MNStorage {
69

    
70
	/* the instance of the MNodeService object */
71
  private static MNodeService instance = null;
72
  
73
  /* the logger instance */
74
  private Logger logMetacat = null;
75

    
76
  /**
77
   * singleton accessor
78
   */
79
  public static MNodeService getInstance() 
80
  {
81
    if (instance == null) {
82
      instance = new MNodeService();
83
    }
84
    
85
    return instance;
86
  }
87
  
88
  /**
89
   * Constructor, private for singleton access
90
   */
91
  private MNodeService() {
92
  	super();
93
    logMetacat = Logger.getLogger(MNodeService.class);
94
        
95
  }
96
    
97
	/**
98
	 * Adds a new object to the Member Node, where the object is either a data 
99
	 * object or a science metadata object. This method is called by clients 
100
	 * to create new data objects on Member Nodes
101
	 * 
102
	 * @param session - the Session object containing the credentials for the Subject
103
	 * @param pid - The object identifier to be created
104
	 * @param object - the object bytes
105
	 * @param sysmeta - the system metadata that describes the object  
106
	 * 
107
	 * @return pid - the object identifier created
108
	 * 
109
	 * @throws InvalidToken
110
	 * @throws ServiceFailure
111
	 * @throws NotAuthorized
112
	 * @throws IdentifierNotUnique
113
	 * @throws UnsupportedType
114
	 * @throws InsufficientResources
115
	 * @throws InvalidSystemMetadata
116
	 * @throws NotImplemented
117
	 * @throws InvalidRequest
118
	 */
119
  @Override
120
	public Identifier create(Session session, Identifier pid, InputStream object,
121
	  SystemMetadata sysmeta) 
122
    throws InvalidToken, ServiceFailure, NotAuthorized, IdentifierNotUnique, 
123
    UnsupportedType, InsufficientResources, InvalidSystemMetadata, 
124
    NotImplemented, InvalidRequest {
125

    
126
		return null;
127
	}
128

    
129
	/**
130
	 * Deletes an object from the Member Node, where the object is either a 
131
	 * data object or a science metadata object.
132
	 * 
133
	 * @param session - the Session object containing the credentials for the Subject
134
	 * @param pid - The object identifier to be deleted
135
	 * 
136
	 * @return pid - the identifier of the object used for the deletion
137
	 * 
138
	 * @throws InvalidToken
139
	 * @throws ServiceFailure
140
	 * @throws NotAuthorized
141
	 * @throws NotFound
142
	 * @throws NotImplemented
143
	 * @throws InvalidRequest
144
	 */
145
  @Override
146
	public Identifier delete(Session session, Identifier pid) 
147
    throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, 
148
    NotImplemented, InvalidRequest {
149

    
150
		return null;
151
	}
152

    
153
  /**
154
   * Updates an existing object by creating a new object identified by 
155
   * newPid on the Member Node which explicitly obsoletes the object 
156
   * identified by pid through appropriate changes to the SystemMetadata 
157
   * of pid and newPid
158
   * 
159
	 * @param session - the Session object containing the credentials for the Subject
160
	 * @param pid - The identifier of the object to be updated
161
	 * @param object - the new object bytes
162
	 * @param sysmeta - the new system metadata describing the object
163
	 * 
164
	 * @return newPid - the identifier of the new object
165
	 * 
166
	 * @throws InvalidToken
167
	 * @throws ServiceFailure
168
	 * @throws NotAuthorized
169
	 * @throws NotFound
170
	 * @throws NotImplemented
171
	 * @throws IdentifierNotUnique
172
	 * @throws UnsupportedType
173
	 * @throws InsufficientResources
174
	 * @throws InvalidSystemMetadata
175
	 * @throws InvalidRequest
176
   */
177
  @Override
178
	public Identifier update(Session session, Identifier pid, InputStream object,
179
	  Identifier newPid, SystemMetadata sysmeta) 
180
    throws InvalidToken, ServiceFailure, NotAuthorized, IdentifierNotUnique, 
181
    UnsupportedType, InsufficientResources, NotFound, InvalidSystemMetadata, 
182
    NotImplemented, InvalidRequest {
183

    
184
		return null;
185
	}
186

    
187
  /**
188
   * Called by a Coordinating Node to request that the Member Node create a 
189
   * copy of the specified object by retrieving it from another Member 
190
   * Node and storing it locally so that it can be made accessible to 
191
   * the DataONE system.
192
   * 
193
	 * @param session - the Session object containing the credentials for the Subject
194
	 * @param sysmeta - Copy of the CN held system metadata for the object
195
	 * @param sourceNode - A reference to node from which the content should be 
196
	 *                     retrieved. The reference should be resolved by 
197
	 *                     checking the CN node registry.
198
	 * 
199
	 * @return true if the replication succeeds
200
	 * 
201
	 * @throws ServiceFailure
202
	 * @throws NotAuthorized
203
	 * @throws NotImplemented
204
	 * @throws UnsupportedType
205
	 * @throws InsufficientResources
206
	 * @throws InvalidRequest
207
   */
208
  @Override
209
	public boolean replicate(Session session, SystemMetadata sysmeta, 
210
	  NodeReference sourceNode)
211
	  throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest,
212
	  InsufficientResources, UnsupportedType {
213

    
214
		return false;
215
	}
216

    
217
  /**
218
   * This method provides a lighter weight mechanism than 
219
   * MN_read.getSystemMetadata() for a client to determine basic 
220
   * properties of the referenced object.
221
   * 
222
	 * @param session - the Session object containing the credentials for the Subject
223
	 * @param pid - the identifier of the object to be described
224
	 * 
225
	 * @return describeResponse - A set of values providing a basic description 
226
	 *                            of the object.
227
	 * 
228
	 * @throws InvalidToken
229
	 * @throws ServiceFailure
230
	 * @throws NotAuthorized
231
	 * @throws NotFound
232
	 * @throws NotImplemented
233
	 * @throws InvalidRequest
234
   */
235
  @Override
236
	public DescribeResponse describe(Session session, Identifier pid)
237
	  throws InvalidToken, ServiceFailure, NotAuthorized, NotFound,
238
	  NotImplemented, InvalidRequest {
239

    
240
		return null;
241
	}
242

    
243
	/**
244
	 * Return the object identified by the given object identifier
245
	 * 
246
	 * @param session - the Session object containing the credentials for the Subject
247
	 * @param pid - the object identifier for the given object
248
	 * 
249
	 * @return inputStream - the input stream of the given object
250
	 * 
251
	 * @throws InvalidToken
252
	 * @throws ServiceFailure
253
	 * @throws NotAuthorized
254
	 * @throws InvalidRequest
255
	 * @throws NotImplemented
256
	 */
257
  @Override
258
	public InputStream get(Session session, Identifier pid) 
259
	  throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, 
260
	  NotImplemented, InvalidRequest {
261
  	
262
		return super.get(session, pid);
263
		
264
	}
265

    
266
	/**
267
	 * Returns a Checksum for the specified object using an accepted hashing algorithm
268
	 * 
269
	 * @param session - the Session object containing the credentials for the Subject
270
	 * @param pid - the object identifier for the given object
271
	 * @param algorithm -  the name of an algorithm that will be used to compute 
272
	 *                     a checksum of the bytes of the object
273
	 * 
274
	 * @return inputStream - the input stream of the given object
275
	 * 
276
	 * @throws InvalidToken
277
	 * @throws ServiceFailure
278
	 * @throws NotAuthorized
279
	 * @throws NotFound
280
	 * @throws InvalidRequest
281
	 * @throws NotImplemented
282
	 */
283
  @Override
284
	public Checksum getChecksum(Session session, Identifier pid, String algorithm)
285
	  throws InvalidToken, ServiceFailure, NotAuthorized, NotFound,
286
	  InvalidRequest, NotImplemented {
287

    
288
		return null;
289
	}
290

    
291
	/**
292
	 * Return the system metadata for a given object
293
	 * 
294
	 * @param session - the Session object containing the credentials for the Subject
295
	 * @param pid - the object identifier for the given object
296
	 * 
297
	 * @return inputStream - the input stream of the given system metadata object
298
	 * 
299
	 * @throws InvalidToken
300
	 * @throws ServiceFailure
301
	 * @throws NotAuthorized
302
	 * @throws NotFound
303
	 * @throws InvalidRequest
304
	 * @throws NotImplemented
305
	 */
306
  @Override
307
	public SystemMetadata getSystemMetadata(Session session, Identifier pid)
308
	    throws InvalidToken, ServiceFailure, NotAuthorized, NotFound,
309
	    InvalidRequest, NotImplemented {
310

    
311
		return super.getSystemMetadata(session, pid);
312
	}
313

    
314
	/**
315
	 * Retrieve the list of objects present on the MN that match the calling parameters
316
	 * 
317
	 * @param session - the Session object containing the credentials for the Subject
318
	 * @param startTime - Specifies the beginning of the time range from which 
319
	 *                    to return object (>=)
320
	 * @param endTime - Specifies the beginning of the time range from which 
321
	 *                  to return object (>=)
322
	 * @param objectFormat - Restrict results to the specified object format
323
	 * @param replicaStatus - Indicates if replicated objects should be returned in the list
324
	 * @param start - The zero-based index of the first value, relative to the 
325
	 *                first record of the resultset that matches the parameters.
326
	 * @param count - The maximum number of entries that should be returned in 
327
	 *                the response. The Member Node may return less entries 
328
	 *                than specified in this value.
329
	 * 
330
	 * @return objectList - the list of objects matching the criteria
331
	 * 
332
	 * @throws InvalidToken
333
	 * @throws ServiceFailure
334
	 * @throws NotAuthorized
335
	 * @throws InvalidRequest
336
	 * @throws NotImplemented
337
	 */
338
  @Override
339
	public ObjectList listObjects(Session session, Date startTime, Date endTime,
340
	  ObjectFormat objectFormat, Boolean replicaStatus, Integer start, Integer count)
341
	  throws NotAuthorized, InvalidRequest, NotImplemented, ServiceFailure,
342
	  InvalidToken {
343

    
344
		return null;
345
	}
346

    
347
	/**
348
	 * Retrieve the list of objects present on the MN that match the calling parameters
349
	 * 
350
	 * @return node - the technical capabilities of the Member Node
351
	 * 
352
	 * @throws ServiceFailure
353
	 * @throws NotAuthorized
354
	 * @throws InvalidRequest
355
	 * @throws NotImplemented
356
	 */
357
  @Override
358
	public Node getCapabilities() throws NotImplemented, NotAuthorized,
359
	    ServiceFailure, InvalidRequest {
360
		// TODO Auto-generated method stub
361
		return null;
362
	}
363

    
364
	/**
365
	 * Return the log records associated with a given event between the start and 
366
	 * end dates listed given a particular Subject listed in the Session
367
	 * 
368
	 * @param session - the Session object containing the credentials for the Subject
369
	 * @param fromDate - the start date of the desired log records
370
	 * @param event - Return only log records for the specified type of event. Default is all.
371
	 * @param start - zero based offset from the first record in the 
372
	 *                set of matching log records. Used to assist with 
373
	 *                paging the response.
374
	 * @param count - maximum number of log records to return in the response. 
375
	 *                Used to assist with paging the response.
376
	 *                
377
	 * @return log - the log records requested
378
	 * 
379
	 * @throws InvalidToken
380
	 * @throws ServiceFailure
381
	 * @throws NotAuthorized
382
	 * @throws InvalidRequest
383
	 * @throws NotImplemented
384
	 */
385
  @Override
386
	public Log getLogRecords(Session session, Date fromDate, Date toDate, Event event,
387
	  Integer start, Integer count)
388
    throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, 
389
    NotImplemented {
390

    
391
		return null;
392
	}
393

    
394
	/**
395
	 * Returns the number of operations that have been serviced by the node 
396
	 * over time periods of one and 24 hours.
397
	 * 
398
	 * @param session - the Session object containing the credentials for the Subject
399
	 * @param period - An ISO8601 compatible DateTime range specifying the time 
400
	 *                 range for which to return operation statistics.
401
	 * @param requestor - Limit to operations performed by given requestor identity.
402
	 * @param event -  Enumerated value indicating the type of event being examined
403
	 * @param format - Limit to events involving objects of the specified format
404
	 * 
405
	 * @return the desired log records
406
	 * 
407
	 * @throws InvalidToken
408
	 * @throws ServiceFailure
409
	 * @throws NotAuthorized
410
	 * @throws InvalidRequest
411
	 * @throws NotImplemented
412
	 */
413
  @Override
414
	public MonitorList getOperationStatistics(Session session, Integer period,
415
	  Subject requestor, Event event, ObjectFormat format) 
416
    throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest, 
417
    InsufficientResources, UnsupportedType {
418

    
419
		return null;
420
	}
421

    
422
  /**
423
   * Low level “are you alive” operation. A valid ping response is 
424
   * indicated by a HTTP status of 200.
425
   * 
426
   * @return true if the service is alive
427
   * 
428
	 * @throws InvalidToken
429
	 * @throws ServiceFailure
430
	 * @throws NotAuthorized
431
	 * @throws InvalidRequest
432
	 * @throws NotImplemented
433
   */
434
	@Override
435
	public boolean ping() 
436
	  throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest, 
437
	  InsufficientResources, UnsupportedType {
438

    
439
		return false;
440
	}
441

    
442
	/**
443
   * Test if the user identified by the provided token has authorization 
444
   * for operation on the specified object.
445
 	 * 
446
	 * @param session - the Session object containing the credentials for the Subject
447
	 * @param pid - The identifier of the resource for which access is being checked
448
	 * @param action - The type of permission which is being requested for the given pid
449
	 *
450
	 * @return true if the action is allowed
451
	 * 
452
	 * @throws ServiceFailure
453
	 * @throws InvalidToken
454
	 * @throws NotFound
455
	 * @throws NotAuthorized
456
	 * @throws NotImplemented
457
	 * @throws InvalidRequest
458
	 */	
459
	@Override
460
	public boolean isAuthorized(Session session, Identifier pid, Permission operation)
461
	  throws ServiceFailure, InvalidRequest, InvalidToken, NotFound,
462
	  NotAuthorized, NotImplemented {
463

    
464
		return false;
465
	}
466

    
467
	/**
468
	 * Set access for a given object using the object identifier and a Subject
469
	 * under a given Session.
470
	 * 
471
	 * @param session - the Session object containing the credentials for the Subject
472
	 * @param pid - the object identifier for the given object to apply the policy
473
	 * @param policy - the access policy to be applied
474
	 * 
475
	 * @return true if the application of the policy succeeds
476
	 * 
477
	 * @throws InvalidToken
478
	 * @throws ServiceFailure
479
	 * @throws NotFound
480
	 * @throws NotAuthorized
481
	 * @throws NotImplemented
482
	 * @throws InvalidRequest
483
	 */
484
	@Override
485
	public boolean setAccessPolicy(Session session, Identifier pid,
486
	  AccessPolicy accessPolicy) 
487
	  throws InvalidToken, ServiceFailure, NotFound, NotAuthorized, 
488
	  NotImplemented, InvalidRequest {
489

    
490
		return false;
491
	}
492

    
493
}
(6-6/8)