Project

General

Profile

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

    
26
package edu.ucsb.nceas.metacat.dataone;
27

    
28

    
29

    
30

    
31
import edu.ucsb.nceas.metacat.IdentifierManager;
32
import edu.ucsb.nceas.metacat.dataone.CNodeService;
33
import edu.ucsb.nceas.metacat.dataone.MNodeService;
34
import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
35
import edu.ucsb.nceas.metacat.service.ServiceService;
36
import edu.ucsb.nceas.utilities.IOUtil;
37
import gov.loc.repository.bagit.Bag;
38
import gov.loc.repository.bagit.BagFactory;
39
import gov.loc.repository.bagit.BagFile;
40
import gov.loc.repository.bagit.Manifest;
41

    
42
import java.io.ByteArrayInputStream;
43
import java.io.ByteArrayOutputStream;
44
import java.io.File;
45
import java.io.FileInputStream;
46
import java.io.FileOutputStream;
47
import java.io.IOException;
48
import java.io.InputStream;
49
import java.io.UnsupportedEncodingException;
50
import java.math.BigInteger;
51
import java.net.URL;
52
import java.text.SimpleDateFormat;
53
import java.util.ArrayList;
54
import java.util.Calendar;
55
import java.util.Date;
56
import java.util.HashMap;
57
import java.util.Iterator;
58
import java.util.List;
59
import java.util.Map;
60
import java.util.Vector;
61

    
62
import junit.framework.Test;
63
import junit.framework.TestSuite;
64

    
65
import org.apache.commons.io.FileUtils;
66
import org.apache.commons.io.IOUtils;
67
import org.dataone.client.v2.formats.ObjectFormatCache;
68
import org.dataone.exceptions.MarshallingException;
69
import org.dataone.configuration.Settings;
70
import org.dataone.ore.ResourceMapFactory;
71
import org.dataone.service.util.Constants;
72
import org.dataone.service.util.TypeMarshaller;
73
import org.dataone.service.exceptions.IdentifierNotUnique;
74
import org.dataone.service.exceptions.InsufficientResources;
75
import org.dataone.service.exceptions.InvalidRequest;
76
import org.dataone.service.exceptions.InvalidSystemMetadata;
77
import org.dataone.service.exceptions.InvalidToken;
78
import org.dataone.service.exceptions.NotAuthorized;
79
import org.dataone.service.exceptions.NotFound;
80
import org.dataone.service.exceptions.NotImplemented;
81
import org.dataone.service.exceptions.ServiceFailure;
82
import org.dataone.service.exceptions.SynchronizationFailed;
83
import org.dataone.service.exceptions.UnsupportedType;
84
import org.dataone.service.types.v1.AccessPolicy;
85
import org.dataone.service.types.v1.AccessRule;
86
import org.dataone.service.types.v1.Checksum;
87
import org.dataone.service.types.v1.DescribeResponse;
88
import org.dataone.service.types.v1.Event;
89
import org.dataone.service.types.v1.ObjectFormatIdentifier;
90
import org.dataone.service.types.v1.Identifier;
91
import org.dataone.service.types.v2.Log;
92
import org.dataone.service.types.v2.Node;
93
import org.dataone.service.types.v2.OptionList;
94
import org.dataone.service.types.v1.NodeReference;
95
import org.dataone.service.types.v1.ObjectFormatIdentifier;
96
import org.dataone.service.types.v1.ObjectList;
97
import org.dataone.service.types.v1.Permission;
98
import org.dataone.service.types.v1.Person;
99
import org.dataone.service.types.v1.ReplicationPolicy;
100
import org.dataone.service.types.v1.Session;
101
import org.dataone.service.types.v1.Subject;
102
import org.dataone.service.types.v1.SubjectInfo;
103
import org.dataone.service.types.v1.util.ChecksumUtil;
104
import org.dataone.service.types.v2.SystemMetadata;
105
import org.dspace.foresite.ResourceMap;
106
import org.junit.After;
107
import org.junit.Before;
108

    
109
/**
110
 * A JUnit test to exercise the Metacat Member Node service implementation.
111
 * This also tests a few of the D1NodeService superclass methods
112
 * 
113
 * @author cjones
114
 *
115
 */
116
public class MNodeServiceTest extends D1NodeServiceTest {
117

    
118
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
119
  /**
120
   * Set up the test fixtures
121
   * 
122
   * @throws Exception
123
   */
124
  @Before
125
  public void setUp() throws Exception {
126
    super.setUp();
127
    // set up the configuration for d1client
128
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
129
  }
130

    
131
  /**
132
   * Remove the test fixtures
133
   */
134
  @After
135
  public void tearDown() {
136
  }
137
  
138
  /**
139
   * Build the test suite
140
   * @return
141
   */
142
  public static Test suite() {
143
    
144
    TestSuite suite = new TestSuite();
145
    suite.addTest(new MNodeServiceTest("initialize"));
146
    // MNStorage tests
147
    suite.addTest(new MNodeServiceTest("testMissMatchMetadataCreate"));
148
    suite.addTest(new MNodeServiceTest("testMissMatchChecksumInCreate"));
149
    suite.addTest(new MNodeServiceTest("testCreate"));
150
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
151
    suite.addTest(new MNodeServiceTest("testUpdate"));
152
    suite.addTest(new MNodeServiceTest("testMissMatchedCheckSumUpdate"));
153
    suite.addTest(new MNodeServiceTest("testMissMatchedChecksumUpdateSciMetadata"));
154
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadata"));
155
    suite.addTest(new MNodeServiceTest("testUpdateObsoletesAndObsoletedBy"));
156
    suite.addTest(new MNodeServiceTest("testArchive"));
157
    suite.addTest(new MNodeServiceTest("testUpdateSciMetadata"));
158
    // this requires MN certificate
159
    suite.addTest(new MNodeServiceTest("testDelete"));
160
    
161
    // MNRead tests
162
    suite.addTest(new MNodeServiceTest("testGet"));
163
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
164
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
165
    suite.addTest(new MNodeServiceTest("testDescribe"));
166
    suite.addTest(new MNodeServiceTest("testListObjects"));
167
    suite.addTest(new MNodeServiceTest("testGetSID"));
168
    // this requires CN certificate
169
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
170
    
171
    // MNCore tests
172
    suite.addTest(new MNodeServiceTest("testPing"));
173
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
174
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
175
    
176
    // MNAuthorization tests
177
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
178
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
179
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
180
    // MNreplication tests
181
    suite.addTest(new MNodeServiceTest("testReplicate"));
182
    // MN packaging tests
183
    suite.addTest(new MNodeServiceTest("testGetPackage"));
184
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
185
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
186
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
187
    suite.addTest(new MNodeServiceTest("testListViews"));
188
    suite.addTest(new MNodeServiceTest("testCreateNOAAObject"));
189
    
190
    suite.addTest(new MNodeServiceTest("testPermissionOfUpdateSystemmeta"));
191
    
192
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletesChain"));
193
    
194
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletedByChain"));
195
    
196
    return suite;
197
    
198
  }
199
  
200
  /**
201
   * Constructor for the tests
202
   * 
203
   * @param name - the name of the test
204
   */
205
  public MNodeServiceTest(String name) {
206
    super(name);
207
    
208
  }
209

    
210
  /**
211
   * Initial blank test
212
   */
213
  public void initialize() {
214
    assertTrue(1 == 1);
215
    
216
  }
217
  
218
  /**
219
   * Test getting a known object
220
   */
221
  public void testGet() {
222
    printTestHeader("testGet");
223

    
224
    try {
225
      Session session = getTestSession();
226
      Identifier guid = new Identifier();
227
      guid.setValue("testGet." + System.currentTimeMillis());
228
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
229
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
230
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
231
      InputStream result = MNodeService.getInstance(request).get(session, guid);
232
      // go back to beginning of original stream
233
      object.reset();
234
      // check
235
      assertTrue(object.available() > 0);
236
      assertTrue(result.available() > 0);
237
      assertTrue(IOUtils.contentEquals(result, object));
238
      
239
    } catch (UnsupportedEncodingException e) {
240
      e.printStackTrace();
241
      fail("Unexpected error: " + e.getMessage());
242

    
243
    } catch (InvalidToken e) {
244
      e.printStackTrace();
245
      fail("Unexpected error: " + e.getMessage());
246
      
247
    } catch (ServiceFailure e) {
248
      e.printStackTrace();
249
      fail("Unexpected error: " + e.getMessage());
250
      
251
    } catch (NotAuthorized e) {
252
      e.printStackTrace();
253
      fail("Unexpected error: " + e.getMessage());
254
      
255
    } catch (IdentifierNotUnique e) {
256
      e.printStackTrace();
257
      fail("Unexpected error: " + e.getMessage());
258
      
259
    } catch (UnsupportedType e) {
260
      e.printStackTrace();
261
      fail("Unexpected error: " + e.getMessage());
262
      
263
    } catch (InsufficientResources e) {
264
      e.printStackTrace();
265
      fail("Unexpected error: " + e.getMessage());
266
      
267
    } catch (InvalidSystemMetadata e) {
268
      e.printStackTrace();
269
      fail("Unexpected error: " + e.getMessage());
270
      
271
    } catch (NotImplemented e) {
272
      e.printStackTrace();
273
      fail("Unexpected error: " + e.getMessage());
274
      
275
    } catch (InvalidRequest e) {
276
      e.printStackTrace();
277
      fail("Unexpected error: " + e.getMessage());
278
      
279
    } catch (NotFound e) {
280
      e.printStackTrace();
281
      fail("Unexpected error: " + e.getMessage());
282
      
283
    } catch (Exception e) {
284
      e.printStackTrace();
285
      fail("Unexpected error: " + e.getMessage());
286
      
287
    }
288

    
289
  }
290

    
291
  /**
292
   * Test getting the system metadata of an object
293
   */
294
  public void testGetSystemMetadata() {    
295
    printTestHeader("testGetSystemMetadata");
296

    
297
    try {
298
      Session session = getTestSession();
299
      Identifier guid = new Identifier();
300
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
301
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
302
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
303
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
304
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
305
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
306
      assertEquals(newsysmeta.getSeriesId(), null);
307
      
308
    } catch (UnsupportedEncodingException e) {
309
      e.printStackTrace();
310
      fail("Unexpected error: " + e.getMessage());
311

    
312
    } catch (InvalidToken e) {
313
      e.printStackTrace();      
314
      fail("Unexpected error: " + e.getMessage());
315

    
316
    } catch (ServiceFailure e) {
317
      e.printStackTrace();
318
      fail("Unexpected error: " + e.getMessage());
319

    
320
    } catch (NotAuthorized e) {
321
      e.printStackTrace();
322
      fail("Unexpected error: " + e.getMessage());
323

    
324
    } catch (IdentifierNotUnique e) {
325
      e.printStackTrace();
326
      fail("Unexpected error: " + e.getMessage());
327
      
328
    } catch (UnsupportedType e) {
329
      e.printStackTrace();
330
      fail("Unexpected error: " + e.getMessage());
331

    
332
    } catch (InsufficientResources e) {
333
      e.printStackTrace();
334
      fail("Unexpected error: " + e.getMessage());
335

    
336
    } catch (InvalidSystemMetadata e) {
337
      e.printStackTrace();
338
      fail("Unexpected error: " + e.getMessage());
339

    
340
    } catch (NotImplemented e) {
341
      e.printStackTrace();
342
      fail("Unexpected error: " + e.getMessage());
343

    
344
    } catch (InvalidRequest e) {
345
      e.printStackTrace();
346
      fail("Unexpected error: " + e.getMessage());
347

    
348
    } catch (NotFound e) {
349
      e.printStackTrace();
350
      fail("Unexpected error: " + e.getMessage());
351

    
352
    } catch (Exception e) {
353
      e.printStackTrace();
354
      fail("Unexpected error: " + e.getMessage());
355

    
356
    }
357
    
358
  }
359

    
360
  /**
361
   * Test object creation
362
   */
363
  public void testCreate() {
364
    printTestHeader("testCreate");
365
    
366
    try {
367
      Session session = getTestSession();
368
      Identifier guid = new Identifier();
369
      guid.setValue("testCreate." + System.currentTimeMillis());
370
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
371
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
372
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
373
      assertEquals(guid.getValue(), pid.getValue());
374
      
375
      Thread.sleep(1000);
376
      try {
377
          Identifier guid2 = new Identifier();
378
          guid2.setValue("testCreate." + System.currentTimeMillis());
379
          SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object);
380
          sysmeta2.setSeriesId(guid);
381
          MNodeService.getInstance(request).create(session, guid2, object, sysmeta2);
382
          fail("It should fail since the system metadata using an existing id as the sid");
383
      } catch (InvalidSystemMetadata ee) {
384
          
385
      }
386
      
387
      Thread.sleep(1000);
388
      try {
389
          Identifier guid3 = new Identifier();
390
          guid3.setValue("testCreate." + System.currentTimeMillis());
391
          SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object);
392
          sysmeta3.setSeriesId(guid3);
393
          MNodeService.getInstance(request).create(session, guid3, object, sysmeta3);
394
          fail("It should fail since the system metadata using the pid as the sid");
395
      } catch (InvalidSystemMetadata ee) {
396
          
397
      }
398
    } catch (UnsupportedEncodingException e) {
399
      e.printStackTrace();
400
      fail("Unexpected error: " + e.getMessage());
401

    
402
    } catch (InvalidToken e) {
403
      e.printStackTrace();
404
      fail("Unexpected error: " + e.getMessage());
405

    
406
    } catch (ServiceFailure e) {
407
      e.printStackTrace();
408
      fail("Unexpected error: " + e.getMessage());
409

    
410
    } catch (NotAuthorized e) {
411
      e.printStackTrace();
412
      fail("Unexpected error: " + e.getMessage());
413

    
414
    } catch (IdentifierNotUnique e) {
415
      e.printStackTrace();
416
      fail("Unexpected error: " + e.getMessage());
417

    
418
    } catch (UnsupportedType e) {
419
      e.printStackTrace();
420
      fail("Unexpected error: " + e.getMessage());
421

    
422
    } catch (InsufficientResources e) {
423
      e.printStackTrace();
424
      fail("Unexpected error: " + e.getMessage());
425

    
426
    } catch (InvalidSystemMetadata e) {
427
      e.printStackTrace();
428
      fail("Unexpected error: " + e.getMessage());
429

    
430
    } catch (NotImplemented e) {
431
      e.printStackTrace();
432
      fail("Unexpected error: " + e.getMessage());
433

    
434
    } catch (InvalidRequest e) {
435
      e.printStackTrace();
436
      fail("Unexpected error: " + e.getMessage());
437

    
438
    } catch (Exception e) {
439
      e.printStackTrace();
440
      fail("Unexpected error: " + e.getMessage());
441

    
442
    }
443
      
444
  }
445
  
446
  /**
447
   * Test object creation
448
   */
449
  public void testMissMatchChecksumInCreate() {
450
    printTestHeader("testMissMatchChecksumInCreate");
451
    Identifier guid = new Identifier();
452
    guid.setValue("testCreate." + System.currentTimeMillis());
453
    Session session = null;
454
    try {
455
      session = getTestSession();
456
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
457
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
458
      Node localNode = MNodeService.getInstance(request).getCapabilities();
459
      ReplicationPolicy rePolicy = new ReplicationPolicy();
460
      rePolicy.setReplicationAllowed(true);
461
      rePolicy.setNumberReplicas(new Integer(3));
462
      rePolicy.addPreferredMemberNode(localNode.getIdentifier());
463
      sysmeta.setReplicationPolicy(rePolicy);
464
      Checksum checksum = new Checksum();
465
      checksum.setAlgorithm("md5");
466
      checksum.setValue("098F6BCD4621D373CADE4E832627B4F9");
467
      sysmeta.setChecksum(checksum);
468
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
469
      fail("It should fail since the checksum doesn't match.");
470
    } catch (InvalidSystemMetadata ee) {
471
      //ee.printStackTrace();
472
      try {
473
          Thread.sleep(5000);
474
          MNodeService.getInstance(request).getSystemMetadata(session, guid);
475
          fail("We shouldn't get here since the guid "+guid.getValue()+" was deleted.");
476
      } catch (NotFound e) {
477
         //here is okay.
478
      } catch (Exception e) {
479
          fail("Unexpected error: " + e.getMessage());
480
      }
481
      try {
482
          assertTrue(!IdentifierManager.getInstance().identifierExists(guid.getValue()));
483
      } catch (Exception e) {
484
          fail("Unexpected error: " + e.getMessage());
485
      }
486
      
487
    } catch (Exception e) {
488
        fail("Unexpected error: " + e.getMessage());
489
    }
490
  }
491
  
492
  
493
  /**
494
   * Test miss-match checksum for metacat object.
495
   */
496
  public void testMissMatchMetadataCreate() {
497
      printTestHeader("testMissMatchMetadataCreate");
498
      Identifier guid = new Identifier();
499
      guid.setValue("testCreate." + System.currentTimeMillis());
500
      Session session = null;
501
      try {
502
        session = getTestSession();
503
        InputStream object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
504
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
505
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
506
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
507
        sysmeta.setFormatId(formatId);
508
        Node localNode = MNodeService.getInstance(request).getCapabilities();
509
        ReplicationPolicy rePolicy = new ReplicationPolicy();
510
        rePolicy.setReplicationAllowed(true);
511
        rePolicy.setNumberReplicas(new Integer(3));
512
        rePolicy.addPreferredMemberNode(localNode.getIdentifier());
513
        sysmeta.setReplicationPolicy(rePolicy);
514
        Checksum checksum = new Checksum();
515
        checksum.setAlgorithm("md5");
516
        checksum.setValue("098F6BCD4621D373CADE4E832627B4F9");
517
        sysmeta.setChecksum(checksum);
518
        object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
519
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
520
        fail("It should fail since the checksum doesn't match.");
521
      } catch (ServiceFailure ee) {
522
        //ee.printStackTrace();
523
        try {
524
            Thread.sleep(5000);
525
            MNodeService.getInstance(request).getSystemMetadata(session, guid);
526
            fail("We shouldn't get here since the guid "+guid.getValue()+" was deleted.");
527
        } catch (NotFound e) {
528
           //here is okay.
529
        } catch (Exception e) {
530
            fail("Unexpected error: " + e.getMessage());
531
        }
532
        try {
533
            assertTrue(!IdentifierManager.getInstance().identifierExists(guid.getValue()));
534
        } catch (Exception e) {
535
            fail("Unexpected error: " + e.getMessage());
536
        }
537
        
538
      } catch (Exception e) {
539
          fail("Unexpected error: " + e.getMessage());
540
      }
541
  }
542

    
543
  /**
544
   * test object deletion
545
   */
546
  public void testDelete() {
547
    printTestHeader("testDelete");
548

    
549
    try {
550
      Session session = getTestSession();
551
      Identifier guid = new Identifier();
552
      guid.setValue("testDelete." + System.currentTimeMillis());
553
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
554
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
555
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
556
      
557
      // use MN admin to delete
558
      session = getMNSession();
559
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
560
      assertEquals(pid.getValue(), deletedPid.getValue());
561
      // check that we cannot get the object
562
      session = getTestSession();
563
      InputStream deletedObject = null;
564
      try {
565
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
566
      } catch (NotFound nf) {
567
    	  // this is expected
568
      }
569
	  assertNull(deletedObject);
570
      
571
    } catch (UnsupportedEncodingException e) {
572
      e.printStackTrace();
573
      
574
    } catch (Exception e) {
575
      e.printStackTrace();
576
      fail("Unexpected error: " + e.getMessage());
577

    
578
    } 
579

    
580
  }
581
  
582
  public void testArchive() throws Exception {
583
          Session session = getTestSession();
584
          Identifier guid = new Identifier();
585
          guid.setValue("testUpdate." + System.currentTimeMillis());
586
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
587
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
588
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
589
          MNodeService.getInstance(request).archive(session, guid);
590
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
591
          assertTrue(result.getArchived());
592
          System.out.println("the identifier is ==================="+pid.getValue());
593
  }
594

    
595
  /**
596
   * Test object updating
597
   */
598
  public void testUpdate() {
599
    printTestHeader("testUpdate");
600
    
601
    try {
602
      Session session = getTestSession();
603
      Identifier guid = new Identifier();
604
      guid.setValue("testUpdate." + System.currentTimeMillis());
605
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
606
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
607
      Identifier newPid = new Identifier();
608
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
609
      Identifier pid = 
610
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
611
      
612
      object = new ByteArrayInputStream("test".getBytes("UTF-8"));
613
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
614
      newSysMeta.setArchived(true);
615
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
616
      // do the update
617
      Identifier updatedPid = 
618
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
619
      
620
      // get the updated system metadata
621
      SystemMetadata updatedSysMeta = 
622
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
623

    
624
      assertEquals(updatedPid.getValue(), newPid.getValue());
625
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
626
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue())); 
627
      
628
      //try to update an archived object and need to get an exception
629
      Identifier newPid2 = new Identifier();
630
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
631
      object = new ByteArrayInputStream("test".getBytes("UTF-8"));
632
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
633
      try {
634
           updatedPid = 
635
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
636
           fail("update an archived object should get an invalid request exception");
637
      } catch (Exception ee) {
638
          assertTrue( ee instanceof InvalidRequest);
639
      }
640
      
641
      //update the authoritative node on the existing pid (newPid)
642
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
643
      BigInteger version = meta.getSerialVersion();
644
      version = version.add(BigInteger.ONE);
645
      newSysMeta.setSerialVersion(version);
646
      NodeReference newMN = new NodeReference();
647
      newMN.setValue("urn:node:river1");
648
      newSysMeta.setAuthoritativeMemberNode(newMN);
649
      newSysMeta.setArchived(false);
650
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
651
      try {
652
          updatedPid = 
653
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
654
          fail("update an object on non-authoritatvie node should get anexception");
655
     } catch (Exception ee) {
656
         assertTrue( ee instanceof NotAuthorized);
657
     }
658
     //cn can succeed even though it updates an object on the non-authoritative node.
659
     Session cnSession = getCNSession();
660
     updatedPid = 
661
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
662
     assertEquals(updatedPid.getValue(), newPid2.getValue());
663
    } catch (UnsupportedEncodingException e) {
664
      e.printStackTrace();
665
      fail("Unexpected error: " + e.getMessage());
666

    
667
    } catch (InvalidToken e) {
668
      e.printStackTrace();
669
      fail("Unexpected error: " + e.getMessage());
670

    
671
    } catch (ServiceFailure e) {
672
      e.printStackTrace();
673
      fail("Unexpected error: " + e.getMessage());
674

    
675
    } catch (NotAuthorized e) {
676
      e.printStackTrace();
677
      fail("Unexpected error: " + e.getMessage());
678

    
679
    } catch (IdentifierNotUnique e) {
680
      e.printStackTrace();
681
      fail("Unexpected error: " + e.getMessage());
682

    
683
    } catch (UnsupportedType e) {
684
      e.printStackTrace();
685
      fail("Unexpected error: " + e.getMessage());
686

    
687
    } catch (InsufficientResources e) {
688
      e.printStackTrace();
689
      fail("Unexpected error: " + e.getMessage());
690

    
691
    } catch (InvalidSystemMetadata e) {
692
      e.printStackTrace();
693
      fail("Unexpected error: " + e.getMessage());
694

    
695
    } catch (NotImplemented e) {
696
      e.printStackTrace();
697
      fail("Unexpected error: " + e.getMessage());
698

    
699
    } catch (InvalidRequest e) {
700
      e.printStackTrace();
701
      fail("Unexpected error: " + e.getMessage());
702

    
703
    } catch (Exception e) {
704
      e.printStackTrace();
705
      fail("Unexpected error: " + e.getMessage());
706

    
707
    }
708
  }
709
  
710
  /**
711
   * Test object updating
712
   */
713
  public void testMissMatchedCheckSumUpdate() {
714
    printTestHeader("testMissMatchedCheckSumUpdate");
715
    
716
    try {
717
      Session session = getTestSession();
718
      Identifier guid = new Identifier();
719
      guid.setValue("testUpdate." + System.currentTimeMillis());
720
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
721
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
722
      System.out.println("========= the old pid is "+guid.getValue());
723
      Identifier newPid = new Identifier();
724
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
725
      Identifier pid = 
726
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
727
      
728
      object = new ByteArrayInputStream("test".getBytes("UTF-8"));
729
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
730
      Checksum checksum = newSysMeta.getChecksum();
731
      checksum.setValue("foo-checksum");
732
      newSysMeta.setChecksum(checksum);
733
      System.out.println("========= the new pid is "+newPid.getValue());
734
      // do the update and it should fail
735
      try {
736
          MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
737
          fail("we shouldn't get here since the checksum is wrong");
738
      } catch (InvalidSystemMetadata ee) {
739
          try {
740
              MNodeService.getInstance(request).getSystemMetadata(session, newPid);
741
              fail("we shouldn't get here since the newPid "+newPid+" shouldn't be create.");
742
          } catch (NotFound eeee) {
743
              
744
          }
745
          
746
      }catch (Exception eee) {
747
          eee.printStackTrace();
748
          fail("Unexpected error in the update: " + eee.getMessage());
749
      }
750
        
751
    } catch (Exception e) {
752
      e.printStackTrace();
753
      fail("Unexpected error: " + e.getMessage());
754

    
755
    }
756
  }
757
  
758
  
759
  /**
760
   * Test object updating
761
   */
762
  public void testMissMatchedChecksumUpdateSciMetadata() {
763
    printTestHeader("testMissMatchedChecksumUpdateSciMetadata");
764
    
765
    try {
766
      String st1="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
767
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
768
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
769
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
770
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
771
      Session session = getTestSession();
772
      Identifier guid = new Identifier();
773
      guid.setValue("testUpdate." + System.currentTimeMillis());
774
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
775
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
776
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
777
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
778
      System.out.println("=================the old pid is "+guid.getValue());
779
      
780
      String st2="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
781
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
782
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
783
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
784
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
785
      Identifier newPid = new Identifier();
786
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
787
      System.out.println("=================the new pid is "+newPid.getValue());
788
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
789
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
790
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
791
      sysmeta2.setObsoletes(guid);
792
      Checksum sum1= sysmeta2.getChecksum();
793
      sum1.setValue("foo checksum");
794
      sysmeta2.setChecksum(sum1);
795
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
796
      // do the update and it should fail
797
      try {
798
          MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
799
          fail("we shouldn't get here since the checksum is wrong");
800
      } catch (ServiceFailure ee) {
801
          try {
802
              MNodeService.getInstance(request).getSystemMetadata(session, newPid);
803
              fail("we shouldn't get here since the newPid "+newPid+" shouldn't be create.");
804
          } catch (NotFound eeee) {
805
              
806
          }
807
          
808
      }catch (Exception eee) {
809
          eee.printStackTrace();
810
          fail("Unexpected error in the update: " + eee.getMessage());
811
      }
812
    
813

    
814
    } catch (Exception e) {
815
      e.printStackTrace();
816
      fail("Unexpected error: " + e.getMessage());
817

    
818
    }
819
  }
820

    
821
  
822
  /**
823
   * Test object updating
824
   */
825
  public void testUpdateSciMetadata() {
826
    printTestHeader("testUpdate");
827
    
828
    try {
829
      String st1="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
830
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
831
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
832
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
833
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
834
      Session session = getTestSession();
835
      Identifier guid = new Identifier();
836
      guid.setValue("testUpdate." + System.currentTimeMillis());
837
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
838
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
839
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
840
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
841
      
842
      String st2="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
843
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
844
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
845
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
846
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
847
      Identifier newPid = new Identifier();
848
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
849
      System.out.println("=================the pid is "+newPid.getValue());
850
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
851
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
852
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
853
      sysmeta2.setObsoletes(guid);
854
      Checksum sum1= sysmeta2.getChecksum();
855
      System.out.println("the checksum before sending is "+sum1.getValue());
856
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
857
      MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
858
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
859
      System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue());
860
      assertTrue(meta.getChecksum().getValue().equals(sum1.getValue()));
861
    } catch (UnsupportedEncodingException e) {
862
      e.printStackTrace();
863
      fail("Unexpected error: " + e.getMessage());
864

    
865
    } catch (InvalidToken e) {
866
      e.printStackTrace();
867
      fail("Unexpected error: " + e.getMessage());
868

    
869
    } catch (ServiceFailure e) {
870
      e.printStackTrace();
871
      fail("Unexpected error: " + e.getMessage());
872

    
873
    } catch (NotAuthorized e) {
874
      e.printStackTrace();
875
      fail("Unexpected error: " + e.getMessage());
876

    
877
    } catch (IdentifierNotUnique e) {
878
      e.printStackTrace();
879
      fail("Unexpected error: " + e.getMessage());
880

    
881
    } catch (UnsupportedType e) {
882
      e.printStackTrace();
883
      fail("Unexpected error: " + e.getMessage());
884

    
885
    } catch (InsufficientResources e) {
886
      e.printStackTrace();
887
      fail("Unexpected error: " + e.getMessage());
888

    
889
    } catch (InvalidSystemMetadata e) {
890
      e.printStackTrace();
891
      fail("Unexpected error: " + e.getMessage());
892

    
893
    } catch (NotImplemented e) {
894
      e.printStackTrace();
895
      fail("Unexpected error: " + e.getMessage());
896

    
897
    } catch (InvalidRequest e) {
898
      e.printStackTrace();
899
      fail("Unexpected error: " + e.getMessage());
900

    
901
    } catch (Exception e) {
902
      e.printStackTrace();
903
      fail("Unexpected error: " + e.getMessage());
904

    
905
    }
906
  }
907

    
908
  /**
909
   * Test the replicate method. The getReplica method is from a MockMN.
910
   */
911
  public void testReplicate() {
912
      printTestHeader("testReplicate");
913
      try {
914
        Session session = getTestSession();
915
        Identifier guid = new Identifier();
916
        guid.setValue("testReplicate." + System.currentTimeMillis());
917
        System.out.println("======================the id need to be replicated is "+guid.getValue());
918
        InputStream object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
919
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
920
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
921
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
922
        sysmeta.setFormatId(formatId);
923
        NodeReference sourceNode = new NodeReference();
924
        sourceNode.setValue(MockReplicationMNode.NODE_ID);
925
        sysmeta.setAuthoritativeMemberNode(sourceNode);
926
        sysmeta.setOriginMemberNode(sourceNode);
927
        boolean result = false;
928
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
929
        assertTrue(result);
930
        SystemMetadata sys =  MNodeService.getInstance(request).getSystemMetadata(session, guid);
931
        assertTrue(sys.getIdentifier().equals(guid));
932
      } catch (Exception e) {
933
        e.printStackTrace();
934
      fail("Probably not yet implemented: " + e.getMessage());
935
    }
936
  }
937

    
938
  /**
939
   * Test describing an object
940
   */
941
  public void testDescribe() {
942
    printTestHeader("testDescribe");
943

    
944
    try {
945
      Session session = getTestSession();
946
      Identifier guid = new Identifier();
947
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
948
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
949
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
950
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
951
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
952
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
953
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
954
      
955
    } catch (UnsupportedEncodingException e) {
956
      e.printStackTrace();
957
      fail("Unexpected error: " + e.getMessage());
958

    
959
    } catch (InvalidToken e) {
960
      e.printStackTrace();      
961
      fail("Unexpected error: " + e.getMessage());
962

    
963
    } catch (ServiceFailure e) {
964
      e.printStackTrace();
965
      fail("Unexpected error: " + e.getMessage());
966

    
967
    } catch (NotAuthorized e) {
968
      e.printStackTrace();
969
      fail("Unexpected error: " + e.getMessage());
970

    
971
    } catch (IdentifierNotUnique e) {
972
      e.printStackTrace();
973
      fail("Unexpected error: " + e.getMessage());
974
      
975
    } catch (UnsupportedType e) {
976
      e.printStackTrace();
977
      fail("Unexpected error: " + e.getMessage());
978

    
979
    } catch (InsufficientResources e) {
980
      e.printStackTrace();
981
      fail("Unexpected error: " + e.getMessage());
982

    
983
    } catch (InvalidSystemMetadata e) {
984
      e.printStackTrace();
985
      fail("Unexpected error: " + e.getMessage());
986

    
987
    } catch (NotImplemented e) {
988
      e.printStackTrace();
989
      fail("Unexpected error: " + e.getMessage());
990

    
991
    } catch (InvalidRequest e) {
992
      e.printStackTrace();
993
      fail("Unexpected error: " + e.getMessage());
994

    
995
    } catch (NotFound e) {
996
      e.printStackTrace();
997
      fail("Unexpected error: " + e.getMessage());
998

    
999
    } catch (Exception e) {
1000
      e.printStackTrace();
1001
      fail("Unexpected error: " + e.getMessage());
1002

    
1003
    }
1004
  }
1005

    
1006
  /**
1007
   * Test getting the checksum of an object
1008
   */
1009
  public void testGetChecksum() {
1010
    printTestHeader("testGetChecksum");
1011

    
1012
    try {
1013
      Session session = getTestSession();
1014
      Identifier guid = new Identifier();
1015
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
1016
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1017
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1018
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1019
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1020
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
1021
    
1022
    } catch (UnsupportedEncodingException e) {
1023
      e.printStackTrace();
1024
      fail("Unexpected error: " + e.getMessage());
1025

    
1026
    } catch (InvalidToken e) {
1027
      e.printStackTrace();
1028
      fail("Unexpected error: " + e.getMessage());
1029

    
1030
    } catch (ServiceFailure e) {
1031
      e.printStackTrace();
1032
      fail("Unexpected error: " + e.getMessage());
1033

    
1034
    } catch (NotAuthorized e) {
1035
      e.printStackTrace();
1036
      fail("Unexpected error: " + e.getMessage());
1037

    
1038
    } catch (IdentifierNotUnique e) {
1039
      e.printStackTrace();
1040
      fail("Unexpected error: " + e.getMessage());
1041

    
1042
    } catch (UnsupportedType e) {
1043
      e.printStackTrace();
1044
      fail("Unexpected error: " + e.getMessage());
1045

    
1046
    } catch (InsufficientResources e) {
1047
      e.printStackTrace();
1048
      fail("Unexpected error: " + e.getMessage());
1049

    
1050
    } catch (InvalidSystemMetadata e) {
1051
      e.printStackTrace();
1052
      fail("Unexpected error: " + e.getMessage());
1053

    
1054
    } catch (NotImplemented e) {
1055
      e.printStackTrace();
1056
      fail("Unexpected error: " + e.getMessage());
1057

    
1058
    } catch (InvalidRequest e) {
1059
      e.printStackTrace();
1060
      fail("Unexpected error: " + e.getMessage());
1061

    
1062
    } catch (NotFound e) {
1063
      e.printStackTrace();
1064
      fail("Unexpected error: " + e.getMessage());
1065

    
1066
    } catch (Exception e) {
1067
      e.printStackTrace();
1068
      fail("Unexpected error: " + e.getMessage());
1069

    
1070
    }
1071
    
1072
  }
1073

    
1074
  /**
1075
   * Testing listing objects on the Member Node
1076
   */
1077
  public void testListObjects() {
1078
      printTestHeader("testListObjects");
1079
  
1080
      try {
1081
  
1082
        Session session = getTestSession();
1083
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
1084
        Date startTime = sdf.parse("2010-01-01");
1085
        Date endTime = new Date();
1086
        ObjectFormatIdentifier objectFormatId = null;
1087
        boolean replicaStatus = false;
1088
        int start = 0;
1089
        int count = 1;
1090
      
1091
        // insert at least one object 
1092
        testCreate();
1093
        // now check that we have at least one
1094
        ObjectList objectList = 
1095
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
1096
              objectFormatId, null, replicaStatus, start, count);
1097
        assertNotNull(objectList);
1098
        assertTrue(objectList.getCount() == count);
1099
        assertTrue(objectList.getStart() == 0);
1100
        assertTrue(objectList.getTotal() >= 1);
1101
        
1102
      } catch (Exception e) {
1103
        e.printStackTrace();
1104
        fail("Unexpected error: " + e.getMessage());
1105
  
1106
      }
1107
  }
1108

    
1109
  public void testGetCapabilities() {
1110
      printTestHeader("testGetCapabilities");
1111
    try {
1112
      Node node = MNodeService.getInstance(request).getCapabilities();
1113
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
1114
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
1115
      assertNotNull(node);
1116
      // TODO: should probably test other parts of the node information
1117
      
1118
    } catch (MarshallingException e) {
1119
        e.printStackTrace();
1120
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
1121
        
1122
    } catch (IOException e) {
1123
        e.printStackTrace();
1124
        fail("The node instance couldn't be read correctly:" + e.getMessage());
1125
        
1126
    } catch (Exception e) {
1127
        e.printStackTrace();
1128
        fail("Probably not yet implemented: " + e.getMessage());
1129
        
1130
    }
1131
    
1132
  }
1133

    
1134
  public void testPing() {
1135

    
1136
    try {
1137
      Date mnDate = MNodeService.getInstance(request).ping();
1138
      assertTrue(mnDate != null);
1139
      
1140
    } catch (NotImplemented e) {
1141
      e.printStackTrace();
1142
      fail("Unexpected error: " + e.getMessage());
1143

    
1144
    } catch (ServiceFailure e) {
1145
      e.printStackTrace();
1146
      fail("Unexpected error: " + e.getMessage());
1147

    
1148
    }  catch (InsufficientResources e) {
1149
      e.printStackTrace();
1150
      fail("Unexpected error: " + e.getMessage());
1151

    
1152
    }
1153
    
1154
  }
1155

    
1156
  public void testSynchronizationFailed() {
1157
    printTestHeader("testSynchronizationFailed");
1158
    try {
1159
        Session session = getTestSession();
1160
        
1161
        // create the object
1162
        Identifier pid = new Identifier();
1163
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
1164
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1165
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1166
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1167
        assertEquals(retPid.getValue(), pid.getValue());
1168
        
1169
        // pretend the sync failed, act as CN
1170
      SynchronizationFailed syncFailed = 
1171
        new SynchronizationFailed("0000", "Testing Synch Failure");
1172
      syncFailed.setPid(pid.getValue());
1173
      session = getCNSession();
1174
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
1175
    } catch (Exception e) {
1176
      e.printStackTrace();
1177
        fail("Unexpected error: " + e.getMessage());
1178
    }
1179

    
1180
  }
1181

    
1182
  public void testSystemMetadataChanged() {
1183
      printTestHeader("testSystemMetadataChanged");
1184
      try {
1185
          Session session = getTestSession();
1186
          
1187
          // create the object
1188
          Identifier pid = new Identifier();
1189
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
1190
          Identifier sid = new Identifier();
1191
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
1192
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1193
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1194
          sysmeta.setSeriesId(sid);
1195
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1196
          assertEquals(retPid.getValue(), pid.getValue());
1197
          
1198
          // pretend the system metadata changed on the CN
1199
          MNodeService.getInstance(request).systemMetadataChanged(session, 
1200
                  retPid, 5000L, Calendar.getInstance().getTime());
1201
          MNodeService.getInstance(request).systemMetadataChanged(session, 
1202
                  sid, 5000L, Calendar.getInstance().getTime());
1203
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
1204
                  retPid, 5000L, Calendar.getInstance().getTime());
1205
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
1206
                  sid, 5000L, Calendar.getInstance().getTime());
1207
          
1208
      } catch (Exception e) {
1209
          if (e instanceof NotAuthorized) {
1210
              // only CN subjects can call this
1211
              // TODO: use a CN certificate in the tests
1212
          } else {
1213
              fail("Unexpected error: " + e.getMessage());
1214
              
1215
          }
1216
      }
1217

    
1218
    }
1219

    
1220
  public void testGetLogRecords() {
1221
    printTestHeader("testLogRecords");
1222

    
1223
    try {
1224
	    Log log = null;
1225
	    Session session = getCNSession();
1226
	    Date fromDate = new Date();
1227
	    Calendar calendar = Calendar.getInstance();
1228
	    calendar.setTime(fromDate);
1229
	    calendar.roll(Calendar.YEAR, false);
1230
	    fromDate = calendar.getTime();
1231
	    Date toDate = new Date();
1232
	    Event event = Event.CREATE;
1233
	    int start = 0;
1234
	    int count = 1;
1235
    
1236
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
1237
        event.xmlValue(), null, start, count);
1238
      
1239
      assertNotNull(log);      
1240
      assertTrue(log.getCount() == count);
1241
      assertTrue(log.getStart() == start);
1242
      assertTrue(log.getTotal() >= 1);
1243
        
1244
    } catch (Exception e) {
1245
      e.printStackTrace();
1246
      fail("Unexpected error: " + e.getMessage());
1247

    
1248
    }
1249
  }
1250

    
1251
  /**
1252
   * Testing setting access on a known object
1253
   */
1254
  public void testSetAccessPolicy() {
1255
    printTestHeader("testSetAccess");
1256
    
1257
    //boolean accessWasSet = false;
1258
    //
1259
    //try {
1260
    //  // create an object to set access on
1261
    //  Session session = getTestSession();
1262
    //  Identifier guid = new Identifier();
1263
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1264
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1265
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1266
    //  Identifier pid = 
1267
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1268
    //  // set the access
1269
    //  AccessPolicy accessPolicy = new AccessPolicy();
1270
    //  AccessRule allow = new AccessRule();
1271
    //  allow.addPermission(Permission.WRITE);
1272
    //  Subject publicSubject = new Subject();
1273
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1274
    //  allow.addSubject(publicSubject);
1275
    //  accessPolicy.addAllow(allow);
1276
    //  
1277
    //  accessWasSet = 
1278
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1279
    //  assertTrue(accessWasSet);
1280
    //  // test that it is enforced
1281
    //  session.setSubject(publicSubject);
1282
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1283
    //  assertTrue(isAuthorized);
1284
    //
1285
    //} catch (UnsupportedEncodingException e) {
1286
    //  e.printStackTrace();
1287
    //  
1288
    //} catch (InvalidToken e) {
1289
    //  e.printStackTrace();
1290
    //  fail("Unexpected error: " + e.getMessage());
1291
    //  
1292
    //} catch (ServiceFailure e) {
1293
    //  e.printStackTrace();
1294
    //  fail("Unexpected error: " + e.getMessage());
1295
    //  
1296
    //} catch (NotAuthorized e) {
1297
    //  e.printStackTrace();
1298
    //  fail("Unexpected error: " + e.getMessage());
1299
    //  
1300
    //} catch (IdentifierNotUnique e) {
1301
    //  e.printStackTrace();
1302
    //  fail("Unexpected error: " + e.getMessage());
1303
    //  
1304
    //} catch (UnsupportedType e) {
1305
    //  e.printStackTrace();
1306
    //  fail("Unexpected error: " + e.getMessage());
1307
    //  
1308
    //} catch (InsufficientResources e) {
1309
    //  e.printStackTrace();
1310
    //  fail("Unexpected error: " + e.getMessage());
1311
    //  
1312
    //} catch (InvalidSystemMetadata e) {
1313
    //  e.printStackTrace();
1314
    //  fail("Unexpected error: " + e.getMessage());
1315
    //  
1316
    //} catch (NotImplemented e) {
1317
    //  e.printStackTrace();
1318
    //  fail("Unexpected error: " + e.getMessage());
1319
    //  
1320
    //} catch (InvalidRequest e) {
1321
    //  e.printStackTrace();
1322
    //  fail("Unexpected error: " + e.getMessage());
1323
    //  
1324
    //} catch (NotFound e) {
1325
    //  e.printStackTrace();
1326
    //  fail("Unexpected error: " + e.getMessage());
1327
    //  
1328
    //} catch (Exception e) {
1329
    //  e.printStackTrace();
1330
    //  fail("Unexpected error: " + e.getMessage());
1331
    //  
1332
    //}
1333
      
1334
  }
1335

    
1336
  /**
1337
   * Test if a subject is authorized to read a known object
1338
   */
1339
  public void testIsAuthorized() {
1340
    printTestHeader("testIsAuthorized");
1341
    
1342
    try {
1343
      Session session = getTestSession();
1344
      Identifier guid = new Identifier();
1345
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1346
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1347
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1348
      //non-public readable
1349
      AccessPolicy accessPolicy = new AccessPolicy();
1350
      AccessRule allow = new AccessRule();
1351
      allow.addPermission(Permission.READ);
1352
      Subject subject = new Subject();
1353
      subject.setValue("cn=test2,dc=dataone,dc=org");
1354
      allow.addSubject(subject);
1355
      accessPolicy.addAllow(allow);
1356
      sysmeta.setAccessPolicy(accessPolicy);
1357
      Identifier pid = 
1358
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1359
      boolean isAuthorized = 
1360
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1361
      assertEquals(isAuthorized, true);
1362
      isAuthorized = 
1363
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1364
      assertEquals(isAuthorized, true);
1365
      try {
1366
          isAuthorized = 
1367
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1368
          fail("we can reach here");
1369
      } catch(NotAuthorized ee) {
1370
          
1371
      }
1372
      
1373
     
1374
      Session session2= getAnotherSession();
1375
      isAuthorized = 
1376
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1377
      assertEquals(isAuthorized, true);
1378
     
1379
      try {
1380
          isAuthorized = 
1381
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1382
          fail("we can reach here");
1383
      } catch(NotAuthorized ee) {
1384
          
1385
      }
1386
      
1387
    
1388
      try {
1389
          isAuthorized = 
1390
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1391
          fail("we can reach here");
1392
      } catch(NotAuthorized ee) {
1393
          
1394
      }
1395
     
1396
      
1397
    } catch (UnsupportedEncodingException e) {
1398
      e.printStackTrace();
1399
      fail("Unexpected error: " + e.getMessage());
1400

    
1401
    } catch (InvalidToken e) {
1402
      e.printStackTrace();
1403
      fail("Unexpected error: " + e.getMessage());
1404

    
1405
    } catch (ServiceFailure e) {
1406
      e.printStackTrace();
1407
      fail("Unexpected error: " + e.getMessage());
1408

    
1409
    } catch (NotAuthorized e) {
1410
      e.printStackTrace();
1411
      fail("Unexpected error: " + e.getMessage());
1412

    
1413
    } catch (IdentifierNotUnique e) {
1414
      e.printStackTrace();
1415
      fail("Unexpected error: " + e.getMessage());
1416

    
1417
    } catch (UnsupportedType e) {
1418
      e.printStackTrace();
1419
      fail("Unexpected error: " + e.getMessage());
1420

    
1421
    } catch (InsufficientResources e) {
1422
      e.printStackTrace();
1423
      fail("Unexpected error: " + e.getMessage());
1424

    
1425
    } catch (InvalidSystemMetadata e) {
1426
      e.printStackTrace();
1427
      fail("Unexpected error: " + e.getMessage());
1428

    
1429
    } catch (NotImplemented e) {
1430
      e.printStackTrace();
1431
      fail("Unexpected error: " + e.getMessage());
1432

    
1433
    } catch (InvalidRequest e) {
1434
      e.printStackTrace();
1435
      fail("Unexpected error: " + e.getMessage());
1436

    
1437
    } catch (Exception e) {
1438
      e.printStackTrace();
1439
      fail("Unexpected error: " + e.getMessage());
1440

    
1441
    }
1442
  }
1443
  
1444
  /**
1445
   * Test if node admin is authorized to read a known object
1446
   */
1447
  public void testIsAdminAuthorized() {
1448
    printTestHeader("testIsAdminAuthorized");
1449
    
1450
    try {
1451
      Session session = getTestSession();
1452
      Identifier guid = new Identifier();
1453
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1454
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1455
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1456
      Identifier pid = 
1457
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1458
      
1459
      // test as public - read
1460
      boolean isAuthorized = 
1461
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1462
      assertEquals(isAuthorized, true);
1463
      
1464
      // test as public - change perm
1465
      isAuthorized = 
1466
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1467
      assertEquals(isAuthorized, false);
1468
      
1469
      //test write by another session
1470
      Session session2 = getAnotherSession();
1471
      isAuthorized = 
1472
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1473
            assertEquals(isAuthorized, false);
1474
      
1475
      // test as admin
1476
      isAuthorized = 
1477
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1478
    	      assertEquals(isAuthorized, true);
1479
     // test as cn
1480
    	isAuthorized = 
1481
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1482
    	              assertEquals(isAuthorized, true);      
1483
      
1484
    } catch (Exception e) {
1485
      e.printStackTrace();
1486
      fail("Unexpected error: " + e.getMessage());
1487

    
1488
    } 
1489
  }
1490

    
1491
  
1492
  public void testIsEquivIdentityAuthorized() {
1493
      printTestHeader("testIsEquivIdentityAuthorized");
1494

    
1495
      try {
1496
          Session session = new Session();
1497
          Subject s = new Subject();
1498
          s.setValue("cn=test,dc=dataone,dc=org");
1499
          session.setSubject(s);
1500
          
1501
          Identifier pid = new Identifier();
1502
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1503
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1504
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1505
          
1506
          // reset the access policy to only allow 'self' read (no public)
1507
          AccessPolicy ap = new AccessPolicy();
1508
          AccessRule ar = new AccessRule();
1509
          List<Subject> sList = new ArrayList<Subject>();
1510
          sList.add(session.getSubject());
1511
          ar.setSubjectList(sList);
1512
          List<Permission> permList = new ArrayList<Permission>();
1513
          permList.add(Permission.CHANGE_PERMISSION);
1514
          ar.setPermissionList(permList);
1515
          ap.addAllow(ar);
1516
          sysmeta.setAccessPolicy(ap);
1517
          
1518
          // save it
1519
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1520
          assertEquals(pid.getValue(), retPid.getValue());
1521
          
1522
          //check it against an equivalent identity not listed in the access policy
1523
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1524
          SubjectInfo subjectInfo = new SubjectInfo();
1525
          Person person = new Person();
1526
          person.setSubject(session.getSubject());
1527
          List<String> givenNames = new ArrayList<String>();
1528
          givenNames.add("New");
1529
          person.setGivenNameList(givenNames);
1530
          person.setFamilyName("Subject");
1531
          
1532
          // add equivalent identities
1533
          List<Subject> equivIdentities = new ArrayList<Subject>();
1534
          Subject mappedSubject2 = new Subject();
1535
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1536
          equivIdentities.add(mappedSubject2);
1537
          
1538
          Subject mappedSubject = new Subject();
1539
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1540
          equivIdentities.add(mappedSubject);          
1541
          
1542
          person.setEquivalentIdentityList(equivIdentities);
1543
          
1544
          List<Person> personList = new ArrayList<Person>();
1545
          personList.add(person);
1546
          subjectInfo.setPersonList(personList);
1547
          
1548
          // update the session to include subject info with a mapped identity
1549
          session.setSubjectInfo(subjectInfo);
1550
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1551
          assertTrue(result);
1552
        
1553
    } catch (Exception e) {
1554
        e.printStackTrace();
1555
        
1556
    }
1557
    
1558
  }
1559

    
1560
/**
1561
   * Test object creation failure when there is a space in the identifier
1562
   */
1563
  public void testCreateInvalidIdentifier() {
1564
    printTestHeader("testCreateInvalidIdentifier");
1565
    
1566
    try {
1567
      Session session = getTestSession();
1568
      Identifier guid = new Identifier();
1569
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1570
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1571
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1572
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1573
      fail("Should not be able to create with whitespace in indentifier");
1574
    } catch (InvalidRequest e) {
1575
    	// expect that this request fails
1576
        assertTrue(true);
1577
    } catch (Exception e) {
1578
      e.printStackTrace();
1579
      fail("Unexpected error: " + e.getMessage());
1580
    }
1581
      
1582
  }
1583
  
1584
	/**
1585
	 * Test getting a known object
1586
	 */
1587
	public void testGetPackage() {
1588
		printTestHeader("testGetPackage");
1589

    
1590
		try {
1591
			Session session = getTestSession();
1592
			Identifier guid = new Identifier();
1593
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1594
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1595
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1596
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1597
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1598
			format.setValue("application/bagit-097");
1599
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1600
			/*File bagFile = File.createTempFile("bagit.", ".zip");
1601
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1602
			BagFactory bagFactory = new BagFactory();
1603
			Bag bag = bagFactory.createBag(bagFile);
1604
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1605
			
1606
			// go back to beginning of original stream
1607
			object.reset();
1608
			// check
1609
			assertTrue(object.available() > 0);
1610
			assertTrue(result.available() > 0);
1611
			assertTrue(IOUtils.contentEquals(result, object));
1612
			
1613
			// clean up
1614
			bagFile.delete();*/
1615

    
1616
		} catch(InvalidRequest e) {
1617
		    
1618
		} catch (Exception e) {
1619
			e.printStackTrace();
1620
			fail("Unexpected error: " + e.getMessage());
1621
		}
1622
	}
1623
	
1624
	
1625
	/**
1626
	 * Test getting a known object
1627
	 */
1628
	public void testGetOREPackage() {
1629
		printTestHeader("testGetOREPackage");
1630

    
1631
		try {
1632
			
1633
			// construct the ORE package
1634
			Identifier resourceMapId = new Identifier();
1635
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1636
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1637
			Identifier metadataId = new Identifier();
1638
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1639
			List<Identifier> dataIds = new ArrayList<Identifier>();
1640
			Identifier dataId = new Identifier();
1641
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1642
			Identifier dataId2 = new Identifier();
1643
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1644
			dataIds.add(dataId);
1645
			dataIds.add(dataId2);
1646
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1647
			idMap.put(metadataId, dataIds);
1648
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1649
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1650
			assertNotNull(resourceMap);
1651
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1652
			assertNotNull(rdfXml);
1653
			
1654
			Session session = getTestSession();
1655
			InputStream object = null;
1656
			SystemMetadata sysmeta = null;
1657
			
1658
			// save the data objects (data just contains their ID)
1659
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1660
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1661
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1662
			// second data file
1663
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1664
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1665
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1666
			// metadata file
1667
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1668
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1669
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1670
						
1671
			// save the ORE object
1672
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1673
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1674
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1675
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1676
			
1677
			// get the package we uploaded
1678
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1679
            format.setValue("application/bagit-097");
1680
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1681
			File bagFile = File.createTempFile("bagit.", ".zip");
1682
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1683
			BagFactory bagFactory = new BagFactory();
1684
			Bag bag = bagFactory.createBag(bagFile);
1685
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1686
			while (manifestIter.hasNext()) {
1687
				String filepath = manifestIter.next().getFilepath();
1688
				BagFile entryFile = bag.getBagFile(filepath);
1689
				InputStream result = entryFile.newInputStream();
1690
				// check ORE
1691
				if (filepath.contains(resourceMapId.getValue())) {
1692
					object.reset();
1693
					assertTrue(object.available() > 0);
1694
					assertTrue(result.available() > 0);
1695
					assertTrue(IOUtils.contentEquals(result, object));
1696
				}
1697
				// check metadata
1698
				if (filepath.contains(metadataId.getValue())) {
1699
					metadataObject.reset();
1700
					assertTrue(metadataObject.available() > 0);
1701
					assertTrue(result.available() > 0);
1702
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1703
				}
1704
				if (filepath.contains(dataId.getValue())) {
1705
					dataObject1.reset();
1706
					assertTrue(dataObject1.available() > 0);
1707
					assertTrue(result.available() > 0);
1708
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1709
				}
1710
				if (filepath.contains(dataId2.getValue())) {
1711
					dataObject2.reset();
1712
					assertTrue(dataObject2.available() > 0);
1713
					assertTrue(result.available() > 0);
1714
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1715
				}
1716
				
1717
				
1718
			}
1719
			
1720
			// clean up
1721
			bagFile.delete();
1722
			
1723
			// test the ORE lookup
1724
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1725
			assertTrue(oreIds.contains(resourceMapId));
1726

    
1727
		} catch (Exception e) {
1728
			e.printStackTrace();
1729
			fail("Unexpected error: " + e.getMessage());
1730
		}
1731
	}
1732
	
1733
	/**
1734
     * Test the extra "delete information" was added to the NotFoundException
1735
     * if the object was delete in the following methods:
1736
     * MN.get
1737
     * MN.getSystemmetadata
1738
     * MN.describe
1739
     * MN.getChecksum
1740
     * MN.getRelica
1741
     */
1742
    public void testReadDeletedObject() {
1743
        printTestHeader("testDelete");
1744

    
1745
        try {
1746
          Session session = getTestSession();
1747
          Identifier guid = new Identifier();
1748
          guid.setValue("testDelete." + System.currentTimeMillis());
1749
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1750
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1751
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1752
          Thread.sleep(3000);
1753
          // use MN admin to delete
1754
          session = getMNSession();
1755
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1756
          System.out.println("after deleting");
1757
          assertEquals(pid.getValue(), deletedPid.getValue());
1758
          // check that we cannot get the object
1759
          session = getTestSession();
1760
          InputStream deletedObject = null;
1761
          try {
1762
              //System.out.println("before read ===============");
1763
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1764
              //System.out.println("after read ===============");
1765
          } catch (NotFound nf) {
1766
              assertTrue(nf.getMessage().contains("deleted"));
1767
          }
1768
          try {
1769
              //System.out.println("before read ===============");
1770
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1771
              //System.out.println("after read ===============");
1772
          } catch (NotFound nf) {
1773
              //System.out.println("the exception is "+nf.getMessage());
1774
              assertTrue(nf.getMessage().contains("deleted"));
1775
          }
1776
          
1777
          try {
1778
              //System.out.println("before read ===============");
1779
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1780
              //System.out.println("after read ===============");
1781
          } catch (NotFound nf) {
1782
              //System.out.println("the exception is "+nf.getMessage());
1783
              assertTrue(nf.getMessage().contains("deleted"));
1784
          }
1785
          
1786
          try {
1787
              //System.out.println("before read ===============");
1788
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1789
              //System.out.println("after read ===============");
1790
          } catch (NotFound nf) {
1791
              //System.out.println("the exception 3 is "+nf.getMessage());
1792
              assertTrue(nf.getMessage().contains("deleted"));
1793
          }
1794
          
1795
          try {
1796
              //System.out.println("before read ===============");
1797
              boolean isAuthorized = 
1798
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1799
              //System.out.println("after read ===============");
1800
          } catch (NotFound nf) {
1801
              System.out.println("the exception 4 is "+nf.getMessage());
1802
              assertTrue(nf.getMessage().contains("deleted"));
1803
          }
1804
          
1805
          assertNull(deletedObject);
1806
          
1807
        } catch (UnsupportedEncodingException e) {
1808
          e.printStackTrace();
1809
          
1810
        } catch (Exception e) {
1811
          e.printStackTrace();
1812
          fail("Unexpected error: " + e.getMessage());
1813

    
1814
        } 
1815
    }
1816
    
1817
    /**
1818
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1819
     * has some special charaters. The saved document should has the same bytes as the origianl.
1820
     */
1821
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1822
          String algorithm = "md5";
1823
          Session session = getTestSession();
1824
          Identifier guid = new Identifier();
1825
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1826
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1827
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1828
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1829
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1830
          Identifier pid = 
1831
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1832
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1833
          byte[] readBytes = IOUtils.toByteArray(readResult);
1834
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1835
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1836
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1837
          
1838
          Identifier newPid = new Identifier();
1839
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1840
          object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1841
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1842
                
1843
          // do the update
1844
          Identifier updatedPid = 
1845
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1846
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1847
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1848
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1849
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1850
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1851

    
1852
          
1853
    }
1854
  
1855
    /**
1856
     * Test the method - get api  for a speicified SID
1857
     */
1858
    public void testGetSID() {
1859
        String str1 = "object1";
1860
        String str2 = "object2";
1861
        String str3 = "object3";
1862
        Date fromDate = new Date();
1863
        Calendar calendar = Calendar.getInstance();
1864
        calendar.setTime(fromDate);
1865
        calendar.roll(Calendar.YEAR, false);
1866
        fromDate = calendar.getTime();
1867
        try {
1868
            //insert test documents with a series id
1869
            Session session = getTestSession();
1870
            Identifier guid = new Identifier();
1871
            guid.setValue(generateDocumentId());
1872
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1873
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1874
            String sid1= "sid."+System.nanoTime();
1875
            Identifier seriesId = new Identifier();
1876
            seriesId.setValue(sid1);
1877
            System.out.println("the first sid is "+seriesId.getValue());
1878
            sysmeta.setSeriesId(seriesId);
1879
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1880
            System.out.println("the first pid is "+guid.getValue());
1881
            //test the get(pid) for v2
1882
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1883
            // go back to beginning of original stream
1884
            object1.reset();
1885
            // check
1886
            assertTrue(object1.available() > 0);
1887
            assertTrue(result.available() > 0);
1888
            assertTrue(IOUtils.contentEquals(result, object1));
1889
            // test the get(id) for v2
1890
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1891
            object1.reset();
1892
            // check
1893
            assertTrue(object1.available() > 0);
1894
            assertTrue(result1.available() > 0);
1895
            assertTrue(IOUtils.contentEquals(result1, object1));
1896
            //test the get(pid) for v1
1897
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1898
            object1.reset();
1899
            // check
1900
            assertTrue(object1.available() > 0);
1901
            assertTrue(result2.available() > 0);
1902
            assertTrue(IOUtils.contentEquals(result2, object1));
1903
            //test the get(sid) for v1
1904
            try {
1905
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1906
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1907
            } catch (NotFound ee) {
1908
                
1909
            }
1910
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1911
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1912
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1913
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1914
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1915
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1916
            
1917
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1918
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1919
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1920
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1921
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1922
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1923
            
1924
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1925
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1926
            
1927
            try {
1928
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1929
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1930
            } catch(NotFound nf2) {
1931
                
1932
            }
1933
            
1934
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1935
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1936
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1937
            try {
1938
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1939
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1940
            } catch(NotFound nf2) {
1941
                
1942
            }
1943
            
1944
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1945
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1946
            
1947
            try {
1948
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1949
                fail("the getCheckSum shouldn't work for sid");
1950
            } catch(NotFound nf3) {
1951
                
1952
            }
1953
            
1954
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1955
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1956
            
1957
            try {
1958
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1959
                fail("the getCheckSum shouldn't work for sid");
1960
            } catch(NotFound nf3) {
1961
                
1962
            }
1963
            
1964
            boolean isAuthorized = 
1965
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1966
            assertEquals(isAuthorized, true);
1967
            
1968
            isAuthorized = 
1969
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1970
            assertEquals(isAuthorized, true);
1971
            
1972
            isAuthorized = 
1973
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1974
            assertEquals(isAuthorized, true);
1975
            
1976
            try {
1977
                isAuthorized = 
1978
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1979
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1980
            } catch (NotFound e) {
1981
                
1982
            }
1983
            
1984
            Session cnsession = getCNSession();
1985
            Date toDate = new Date();
1986
            Event event = Event.READ;
1987
            int start = 0;
1988
            int count = 1;
1989
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1990
            event.xmlValue(), seriesId.getValue(), start, count);
1991
          
1992
          assertNotNull(log);      
1993
          assertTrue(log.getCount() == count);
1994
          assertTrue(log.getStart() == start);
1995
          assertTrue(log.getTotal() >= 1);
1996
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1997

    
1998
            //do a update with the same series id
1999
            Thread.sleep(1000);
2000
            Identifier newPid = new Identifier();
2001
            newPid.setValue(generateDocumentId()+"1");
2002
            System.out.println("the second pid is "+newPid.getValue());
2003
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
2004
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
2005
            newSysMeta.setObsoletes(guid);
2006
            newSysMeta.setSeriesId(seriesId);
2007
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
2008
           
2009
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
2010
            // go back to beginning of original stream
2011
            object1.reset();
2012
            // check
2013
            assertTrue(object1.available() > 0);
2014
            assertTrue(result4.available() > 0);
2015
            assertTrue(IOUtils.contentEquals(result4, object1));
2016
            
2017
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
2018
            // go back to beginning of original stream
2019
            object2.reset();
2020
            // check
2021
            assertTrue(object2.available() > 0);
2022
            assertTrue(result5.available() > 0);
2023
            assertTrue(IOUtils.contentEquals(result5, object2));
2024
            
2025

    
2026
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
2027
            object2.reset();
2028
            // check
2029
            assertTrue(object2.available() > 0);
2030
            assertTrue(result6.available() > 0);
2031
            assertTrue(IOUtils.contentEquals(result6, object2));
2032
            //test the get(pid) for v1
2033
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
2034
            object1.reset();
2035
            // check
2036
            assertTrue(object1.available() > 0);
2037
            assertTrue(result7.available() > 0);
2038
            assertTrue(IOUtils.contentEquals(result7, object1));
2039
            
2040
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
2041
            object2.reset();
2042
            // check
2043
            assertTrue(object2.available() > 0);
2044
            assertTrue(result8.available() > 0);
2045
            assertTrue(IOUtils.contentEquals(result8, object2));
2046
            //test the get(sid) for v1
2047
            try {
2048
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
2049
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2050
            } catch (NotFound ee) {
2051
                
2052
            }
2053
            
2054
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2055
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
2056
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
2057
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
2058
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
2059
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
2060
            
2061
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2062
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
2063
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
2064
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
2065
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
2066
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
2067
            
2068
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2069
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
2070
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
2071
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
2072
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
2073
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
2074
            
2075
            //do another update with different series id
2076
            Thread.sleep(1000);
2077
            String sid2 = "sid."+System.nanoTime();
2078
            Identifier seriesId2= new Identifier();
2079
            seriesId2.setValue(sid2);
2080
            System.out.println("the second sid is "+seriesId2.getValue());
2081
            Identifier newPid2 = new Identifier();
2082
            newPid2.setValue(generateDocumentId()+"2");
2083
            System.out.println("the third pid is "+newPid2.getValue());
2084
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
2085
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
2086
            sysmeta3.setObsoletes(newPid);
2087
            sysmeta3.setSeriesId(seriesId2);
2088
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
2089
            
2090
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
2091
            // go back to beginning of original stream
2092
            object1.reset();
2093
            // check
2094
            assertTrue(object1.available() > 0);
2095
            assertTrue(result9.available() > 0);
2096
            assertTrue(IOUtils.contentEquals(result9, object1));
2097
            
2098
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
2099
            // go back to beginning of original stream
2100
            object2.reset();
2101
            // check
2102
            assertTrue(object2.available() > 0);
2103
            assertTrue(result10.available() > 0);
2104
            assertTrue(IOUtils.contentEquals(result10, object2));
2105
            
2106
            
2107
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
2108
            // go back to beginning of original stream
2109
            object3.reset();
2110
            // check
2111
            assertTrue(object3.available() > 0);
2112
            assertTrue(result11.available() > 0);
2113
            assertTrue(IOUtils.contentEquals(result11, object3));
2114
            
2115
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
2116
            object3.reset();
2117
            // check
2118
            assertTrue(object3.available() > 0);
2119
            assertTrue(result12.available() > 0);
2120
            assertTrue(IOUtils.contentEquals(result12, object3));
2121
            
2122
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
2123
            object2.reset();
2124
            // check
2125
            assertTrue(object2.available() > 0);
2126
            assertTrue(result16.available() > 0);
2127
            assertTrue(IOUtils.contentEquals(result16, object2));
2128
           
2129
            //test the get(pid) for v1
2130
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
2131
            object1.reset();
2132
            // check
2133
            assertTrue(object1.available() > 0);
2134
            assertTrue(result13.available() > 0);
2135
            assertTrue(IOUtils.contentEquals(result13, object1));
2136
            
2137
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
2138
            object2.reset();
2139
            // check
2140
            assertTrue(object2.available() > 0);
2141
            assertTrue(result14.available() > 0);
2142
            assertTrue(IOUtils.contentEquals(result14, object2));
2143
            
2144
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2145
            object3.reset();
2146
            // check
2147
            assertTrue(object3.available() > 0);
2148
            assertTrue(result15.available() > 0);
2149
            assertTrue(IOUtils.contentEquals(result15, object3));
2150
            
2151
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2152
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
2153
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
2154
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
2155
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
2156
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
2157
            
2158
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2159
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
2160
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
2161
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
2162
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
2163
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
2164
            
2165
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2166
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
2167
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
2168
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
2169
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
2170
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
2171
            
2172
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2173
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
2174
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
2175
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
2176
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
2177
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
2178
            
2179
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2180
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
2181
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
2182
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
2183
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
2184
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
2185
            
2186
            
2187
            
2188
            
2189
            //test the get(sid) for v1
2190
            try {
2191
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
2192
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2193
            } catch (NotFound ee) {
2194
                
2195
            }
2196
            
2197
            //test the get(sid) for v1
2198
            try {
2199
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
2200
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2201
            } catch (NotFound ee) {
2202
                
2203
            }
2204
            
2205
            //test to get non-existing id for v2
2206
            try {
2207
             // the pid should be null when we try to get a no-exist sid
2208
                Identifier non_exist_sid = new Identifier();
2209
                non_exist_sid.setValue("no-sid-exist-123qwe");
2210
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
2211
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2212
            } catch (NotFound ee) {
2213
                
2214
            }
2215
            
2216
            try {
2217
                // the pid should be null when we try to get a no-exist sid
2218
                   Identifier non_exist_sid = new Identifier();
2219
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2220
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
2221
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2222
            } catch (NotFound ee) {
2223
                   
2224
            }
2225
            
2226
            try {
2227
                // the pid should be null when we try to get a no-exist sid
2228
                   Identifier non_exist_sid = new Identifier();
2229
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2230
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
2231
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2232
               } catch (NotFound ee) {
2233
                   
2234
               }
2235
            
2236
            toDate = new Date();
2237
            event = Event.READ;
2238
            start = 0;
2239
            count = 1;
2240
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
2241
            event.xmlValue(), seriesId.getValue(), start, count);
2242
          
2243
            assertNotNull(log);      
2244
            assertTrue(log.getCount() == count);
2245
            assertTrue(log.getStart() == start);
2246
            assertTrue(log.getTotal() >= 1);
2247
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
2248
            
2249
            //do another update with invalid series ids
2250
            Thread.sleep(1000);
2251
            Identifier newPid3 = new Identifier();
2252
            newPid3.setValue(generateDocumentId()+"3");
2253
            System.out.println("the third pid is "+newPid3.getValue());
2254
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
2255
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
2256
            sysmeta4.setObsoletes(newPid2);
2257
            sysmeta4.setSeriesId(seriesId);
2258
            try {
2259
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2260
                fail("we can't reach here since the sid is using an old one ");
2261
            } catch (InvalidSystemMetadata eee) {
2262
                
2263
            } 
2264
            
2265
            sysmeta4.setSeriesId(newPid3);
2266
            try {
2267
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2268
                fail("we can't reach here since the sid is using the pid ");
2269
            } catch (InvalidSystemMetadata eee) {
2270
                
2271
            } 
2272
            
2273
            //test archive a series id by v1
2274
            try {
2275
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
2276
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
2277
            } catch (NotFound nf2) {
2278
                
2279
            }
2280
            
2281
            // test delete a series id by v1
2282
            Session mnSession = getMNSession();
2283
            try {
2284
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
2285
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
2286
            } catch (NotFound nf2) {
2287
                
2288
            }
2289
            
2290
            // test archive a series id by v2
2291
            MNodeService.getInstance(request).archive(session, seriesId2);
2292
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2293
            assertTrue(archived.getArchived());
2294
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2295
            assertTrue(archived.getArchived());
2296
            
2297
            // test delete a series id by v2
2298
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
2299
            try {
2300
                MNodeService.getInstance(request).get(session, seriesId2);
2301
                fail("we can't reach here since the series id was deleted ");
2302
            } catch (NotFound nf3) {
2303
                System.out.println("the message is ============="+nf3.getMessage());
2304
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
2305
            }
2306
            
2307
            try {
2308
                MNodeService.getInstance(request).get(session, newPid2);
2309
                fail("we can't reach here since the series id was deleted ");
2310
            } catch (NotFound nf3) {
2311
                //System.out.println("the message is ============="+nf3.getMessage());
2312
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2313
            }
2314
            
2315
            try {
2316
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2317
                fail("we can't reach here since the series id was deleted ");
2318
            } catch (NotFound nf3) {
2319
                System.out.println("the message is ============="+nf3.getMessage());
2320
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2321
            }
2322
            
2323
            //archive seriesId
2324
            MNodeService.getInstance(request).archive(mnSession, seriesId);
2325
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2326
            assertTrue(archived.getArchived());
2327
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2328
            assertTrue(archived.getArchived());
2329
            
2330
            
2331
            //delete seriesId
2332
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2333
            try {
2334
                MNodeService.getInstance(request).get(session, newPid);
2335
                fail("we can't reach here since the series id was deleted ");
2336
            } catch (NotFound nf3) {
2337
                //System.out.println("the message is ============="+nf3.getMessage());
2338
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2339
            }
2340
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2341
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2342
            
2343
        } catch (Exception e) {
2344
            fail(e.getMessage());
2345
        }
2346
        
2347
        
2348
        
2349
        
2350
    }
2351
    
2352
    /**
2353
     * Test the listView methods.
2354
     * @throws Excpetion
2355
     */
2356
    public void testListViews() throws Exception {
2357
        Session session = null;
2358
        OptionList list = MNodeService.getInstance(request).listViews(session);
2359
        assertTrue(list.sizeOptionList() >0);
2360
        List<String> names = list.getOptionList();
2361
        for(String name : names) {
2362
            System.out.println("It has the view named "+name);
2363
        }
2364
    }
2365
    
2366
    public void testUpdateSystemMetadata() throws Exception {
2367
        String str1 = "object1";
2368
        String str2 = "object2";
2369
        String str3 = "object3";
2370
        
2371
        Date date = new Date();
2372
        Thread.sleep(2000);
2373
        //insert test documents with a series id
2374
        Session session = getTestSession();
2375
        Identifier guid = new Identifier();
2376
        guid.setValue(generateDocumentId());
2377
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2378
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2379
        String sid1= "sid."+System.nanoTime();
2380
        Identifier seriesId = new Identifier();
2381
        seriesId.setValue(sid1);
2382
        System.out.println("the first sid is "+seriesId.getValue());
2383
        sysmeta.setSeriesId(seriesId);
2384
        sysmeta.setArchived(false);
2385
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2386
        //Test the generating object succeeded. 
2387
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2388
        assertTrue(metadata.getIdentifier().equals(guid));
2389
        assertTrue(metadata.getArchived().equals(false));
2390
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2391
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2392
        System.out.println("the identifier is "+guid.getValue());
2393
        
2394
        Date current = sysmeta.getDateSysMetadataModified();
2395
        //updating system metadata failed since the date doesn't match
2396
        sysmeta.setArchived(true);
2397
        sysmeta.setDateSysMetadataModified(date);
2398
        try {
2399
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2400
            fail("We shouldn't get there");
2401
        } catch (Exception e) {
2402
            assertTrue(e instanceof InvalidRequest);
2403
        }
2404
        //update system metadata sucessfully
2405
        sysmeta.setDateSysMetadataModified(current);
2406
        BigInteger serialVersion = metadata.getSerialVersion();
2407
        //System.out.println("the current version is "+serialVersion.toString());
2408
        //serialVersion = serialVersion.add(BigInteger.ONE);
2409
        //System.out.println("the new version is "+serialVersion.toString());
2410
        //sysmeta.setSerialVersion(serialVersion);
2411
        System.out.println("the identifier is ----------------------- "+guid.getValue());
2412
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2413
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2414
        assertTrue(metadata2.getIdentifier().equals(guid));
2415
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2416
        assertTrue(metadata2.getArchived().equals(true));
2417
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2418
        assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime());
2419
        
2420
        Identifier newId = new Identifier();
2421
        newId.setValue("newValue");
2422
        sysmeta.setIdentifier(newId);
2423
        serialVersion = metadata.getSerialVersion();
2424
        serialVersion = serialVersion.add(BigInteger.ONE);
2425
        sysmeta.setSerialVersion(serialVersion);
2426
        try {
2427
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2428
            fail("We shouldn't get there");
2429
        } catch (Exception e) {
2430
            assertTrue(e instanceof InvalidRequest);
2431
        }
2432
        
2433
        newId.setValue("newValue");
2434
        sysmeta.setSeriesId(newId);
2435
        try {
2436
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2437
            fail("We shouldn't get there");
2438
        } catch (Exception e) {
2439
            assertTrue(e instanceof InvalidRequest);
2440
        }
2441
        
2442
        Date newDate = new Date();
2443
        sysmeta.setDateUploaded(newDate);
2444
        try {
2445
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2446
            fail("We shouldn't get there");
2447
        } catch (Exception e) {
2448
            assertTrue(e instanceof InvalidRequest);
2449
        }
2450
        
2451
        Checksum checkSum = new Checksum();
2452
        checkSum.setValue("12345");
2453
        sysmeta.setChecksum(checkSum);
2454
        try {
2455
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2456
            fail("We shouldn't get there");
2457
        } catch (Exception e) {
2458
            assertTrue(e instanceof InvalidRequest);
2459
        }
2460
        
2461
        BigInteger size = new BigInteger("4000");
2462
        sysmeta.setSize(size);
2463
        try {
2464
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2465
            fail("We shouldn't get there");
2466
        } catch (Exception e) {
2467
            assertTrue(e instanceof InvalidRequest);
2468
        }
2469
    }
2470
    
2471
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2472
        String str1 = "object1";
2473
        String str2 = "object2";
2474
        String str3 = "object3";
2475

    
2476
        //insert two documents 
2477
        Session session = getTestSession();
2478
        Identifier guid1 = new Identifier();
2479
        guid1.setValue(generateDocumentId());
2480
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2481
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2482
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2483
        //Test the generating object succeeded. 
2484
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2485
        assertTrue(metadata.getIdentifier().equals(guid1));
2486
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2487
        
2488
        Identifier guid2 = new Identifier();
2489
        guid2.setValue(generateDocumentId());
2490
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2491
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2492
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2493
        //Test the generating object succeeded. 
2494
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2495
        assertTrue(metadata.getIdentifier().equals(guid2));
2496
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2497
        
2498
        
2499
        
2500
        //update the system metadata without touching the obsoletes and obsoletdBy
2501
        AccessPolicy accessPolicy = new AccessPolicy();
2502
        AccessRule allow = new AccessRule();
2503
        allow.addPermission(Permission.WRITE);
2504
        Subject subject = new Subject();
2505
        subject.setValue("user_foo");
2506
        allow.addSubject(subject);
2507
        accessPolicy.addAllow(allow);
2508
        sysmeta1.setAccessPolicy(accessPolicy);
2509
        BigInteger serialVersion = metadata.getSerialVersion();
2510
        serialVersion = serialVersion.add(BigInteger.ONE);
2511
        sysmeta1.setSerialVersion(serialVersion);
2512
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2513
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2514
        assertTrue(metadata.getIdentifier().equals(guid1));
2515
        assertTrue(metadata.getObsoletedBy() == null);
2516
        assertTrue(metadata.getObsoletes() == null);
2517
        Session newSession = new Session();
2518
        newSession.setSubject(subject);
2519
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2520
        assertTrue(isAuthorized);
2521
        
2522
        sysmeta2.setAccessPolicy(accessPolicy);
2523
        serialVersion = metadata.getSerialVersion();
2524
        serialVersion = serialVersion.add(BigInteger.ONE);
2525
        sysmeta2.setSerialVersion(serialVersion);
2526
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2527
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2528
        assertTrue(metadata.getIdentifier().equals(guid2));
2529
        assertTrue(metadata.getObsoletes() == null);
2530
        assertTrue(metadata.getObsoletedBy() == null);
2531
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2532
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2533
        assertTrue(isAuthorized);
2534
        
2535
        
2536
        
2537
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2538
        sysmeta1.setObsoletedBy(guid2);
2539
        serialVersion = metadata.getSerialVersion();
2540
        serialVersion = serialVersion.add(BigInteger.ONE);
2541
        sysmeta1.setSerialVersion(serialVersion);
2542
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2543
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2544
        assertTrue(metadata.getIdentifier().equals(guid1));
2545
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2546
        assertTrue(metadata.getObsoletes() == null);
2547
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2548
        
2549
        sysmeta2.setObsoletes(guid1);
2550
        serialVersion = metadata.getSerialVersion();
2551
        serialVersion = serialVersion.add(BigInteger.ONE);
2552
        sysmeta2.setSerialVersion(serialVersion);
2553
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2554
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2555
        assertTrue(metadata.getIdentifier().equals(guid2));
2556
        assertTrue(metadata.getObsoletes().equals(guid1));
2557
        assertTrue(metadata.getObsoletedBy() == null);
2558
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2559
        
2560
        
2561
        
2562
        
2563
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2564
        sysmeta1.setObsoletedBy(guid2);
2565
        serialVersion = metadata.getSerialVersion();
2566
        serialVersion = serialVersion.add(BigInteger.ONE);
2567
        sysmeta1.setSerialVersion(serialVersion);
2568
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2569
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2570
        assertTrue(metadata.getIdentifier().equals(guid1));
2571
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2572
        assertTrue(metadata.getObsoletes() == null);
2573
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2574
        
2575
        sysmeta2.setObsoletes(guid1);
2576
        serialVersion = metadata.getSerialVersion();
2577
        serialVersion = serialVersion.add(BigInteger.ONE);
2578
        sysmeta2.setSerialVersion(serialVersion);
2579
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2580
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2581
        assertTrue(metadata.getIdentifier().equals(guid2));
2582
        assertTrue(metadata.getObsoletes().equals(guid1));
2583
        assertTrue(metadata.getObsoletedBy() == null);
2584
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2585
        
2586

    
2587
        
2588
        
2589
        
2590
        //resetting the obsoletes and obsoletedBy fails
2591
        Identifier newId = new Identifier();
2592
        newId.setValue("newValue");
2593
        sysmeta1.setObsoletedBy(newId);
2594
        serialVersion = metadata.getSerialVersion();
2595
        serialVersion = serialVersion.add(BigInteger.ONE);
2596
        sysmeta1.setSerialVersion(serialVersion);
2597
        try {
2598
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2599
            fail("We shouldn't get there");
2600
        } catch (Exception e) {
2601
            e.printStackTrace();
2602
            assertTrue(e instanceof InvalidRequest);
2603
        }
2604
       
2605
        sysmeta2.setObsoletes(newId);
2606
        serialVersion = metadata.getSerialVersion();
2607
        serialVersion = serialVersion.add(BigInteger.ONE);
2608
        sysmeta2.setSerialVersion(serialVersion);
2609
        try {
2610
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2611
            fail("We shouldn't get there");
2612
        } catch (Exception e) {
2613
            e.printStackTrace();
2614
            assertTrue(e instanceof InvalidRequest);
2615
        }
2616
        
2617
        
2618
        
2619
        
2620
        //insert another object
2621
        Identifier guid5 = new Identifier();
2622
        guid5.setValue(generateDocumentId());
2623
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2624
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2625
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2626
        //Test the generating object succeeded. 
2627
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2628
        assertTrue(metadata.getIdentifier().equals(guid5));
2629
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2630
        
2631
        
2632
        
2633
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2634
        sysmeta5.setObsoletes(guid1);
2635
        serialVersion = metadata.getSerialVersion();
2636
        serialVersion = serialVersion.add(BigInteger.ONE);
2637
        sysmeta5.setSerialVersion(serialVersion);
2638
        try {
2639
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2640
            fail("We shouldn't get there");
2641
        } catch (Exception e) {
2642
            e.printStackTrace();
2643
            
2644
        }
2645
        
2646
        
2647
       
2648
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2649
        sysmeta5.setObsoletes(null);
2650
        sysmeta5.setObsoletedBy(guid2);
2651
        try {
2652
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2653
            fail("We shouldn't get there");
2654
        } catch (Exception e) {
2655
            e.printStackTrace();
2656
            
2657
        }
2658
        
2659
        
2660
        
2661
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2662
        sysmeta5.setObsoletedBy(null);
2663
        sysmeta5.setObsoletes(guid2);
2664
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2665
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2666
        assertTrue(metadata.getIdentifier().equals(guid5));
2667
        assertTrue(metadata.getObsoletes().equals(guid2));
2668
        assertTrue(metadata.getObsoletedBy() == null);
2669
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2670
        
2671
        
2672
        
2673
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2674
        sysmeta2.setObsoletes(guid1);
2675
        sysmeta2.setObsoletedBy(guid5);
2676
        serialVersion = sysmeta2.getSerialVersion();
2677
        serialVersion = serialVersion.add(BigInteger.ONE);
2678
        sysmeta2.setSerialVersion(serialVersion);
2679
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2680
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2681
        assertTrue(metadata.getIdentifier().equals(guid2));
2682
        assertTrue(metadata.getObsoletes().equals(guid1));
2683
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2684
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2685
    }
2686
    
2687
    /**
2688
     * Test to create a metacat object which uses the isotc211 noaa variant.
2689
     * @throws Exception
2690
     */
2691
    public void testCreateNOAAObject() throws Exception {
2692
        Session session = getTestSession();
2693
        Identifier guid = new Identifier();
2694
        guid.setValue("testNoaa." + System.currentTimeMillis());
2695
        InputStream object = new FileInputStream("test/sciencemetadata-noaa.xml");
2696
        InputStream sysmetaInput = new FileInputStream("test/sysmeta-noaa.xml");
2697
        SystemMetadata sysmeta = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmetaInput);
2698
        sysmeta.setIdentifier(guid);
2699
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
2700
        assertTrue(pid.getValue().equals(guid.getValue()));
2701
    }
2702
    
2703
    
2704
    /**
2705
     * Test the permission control on the updateSystemMetadata method
2706
     * @throws Exception
2707
     */
2708
    public void testPermissionOfUpdateSystemmeta() throws Exception {
2709
        String str = "object1";
2710
       
2711
        Date date = new Date();
2712
        Thread.sleep(2000);
2713
        //insert a test document
2714
        Session session = getTestSession();
2715
        Identifier guid = new Identifier();
2716
        guid.setValue(generateDocumentId());
2717
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2718
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2719
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2720
        //Test the generating object succeeded. 
2721
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2722
        
2723
        //Test cn session -success
2724
        Session cnSession= getCNSession();
2725
        MNodeService.getInstance(request).updateSystemMetadata(cnSession, guid, metadata);
2726
        
2727
        //Test mn session - success
2728
        Session mnSession = getMNSession();
2729
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2730
        MNodeService.getInstance(request).updateSystemMetadata(mnSession, guid, metadata);
2731
        
2732
        //Test the owner session -success
2733
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2734
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2735
        
2736
        //Test another session -failed
2737
        Session anotherSession = getAnotherSession();
2738
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2739
        try {
2740
             MNodeService.getInstance(request).updateSystemMetadata(anotherSession, guid, metadata);
2741
            fail("Another user can't update the system metadata");
2742
        } catch (NotAuthorized e)  {
2743
            
2744
        }
2745
       
2746
    }
2747
    
2748
    
2749
    /**
2750
     * Test if the updateSystemmetadata method can catch the circular obsoletes fields chain
2751
     */
2752
    public void testUpdateSystemMetadataWithCircularObsoletesChain() throws Exception{
2753
        
2754
        Date date = new Date();
2755
        Thread.sleep(1000);
2756
        String str = "object1";
2757
        //insert a test document
2758
        Session session = getTestSession();
2759
        Identifier guid = new Identifier();
2760
        guid.setValue(generateDocumentId());
2761
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2762
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2763
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2764
        
2765
        //Test the generating object succeeded. 
2766
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2767
        Thread.sleep(1000);
2768
        Identifier guid1 = new Identifier();
2769
        guid1.setValue(generateDocumentId());
2770
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2771
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2772
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2773
        //Test the generating object succeeded. 
2774
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2775
        
2776
        Thread.sleep(1000);
2777
        Identifier guid2 = new Identifier();
2778
        guid2.setValue(generateDocumentId());
2779
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2780
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2781
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2782
        //Test the generating object succeeded. 
2783
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2784
        
2785
        // test to create a circular obsoletes chain: guid obsoletes guid
2786
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2787
        metadata.setObsoletes(guid);
2788
        try {
2789
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2790
             fail("We can't update the system metadata which the obsoletes field is itself");
2791
       } catch (InvalidRequest e)  {
2792
           assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2793
       }
2794
       
2795
       // guid obsolete guid1
2796
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2797
       metadata.setObsoletes(guid1);
2798
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2799
       
2800
       // guid1 obsoletedBy guid
2801
       // guid1  obsoletes  guid2
2802
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2803
       metadata.setObsoletes(guid2);
2804
       metadata.setObsoletedBy(guid);
2805
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2806
       
2807
       // crete a circular obsolete chain:
2808
       // guid2 obsoletes guid
2809
       //guid2 obsoletedBy guid1
2810
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2811
       metadata.setObsoletes(guid);
2812
       metadata.setObsoletedBy(guid1);
2813
       
2814
       try {
2815
           MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2816
           fail("We can't update the system metadata which has a circular obsoletes chain");
2817
      } catch (InvalidRequest e)  {
2818
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2819
      }
2820
       
2821
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2822
       metadata.setObsoletedBy(guid1);
2823
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2824
    }
2825
    
2826
    
2827
    
2828
    
2829
    /**
2830
     * Test if the updateSystemmetadata method can catch the circular obsoletedBy chain
2831
     */
2832
    public void testUpdateSystemMetadataWithCircularObsoletedByChain() throws Exception{
2833
        
2834
        Date date = new Date();
2835
        Thread.sleep(1000);
2836
        String str = "object1";
2837
        //insert a test document
2838
        Session session = getTestSession();
2839
        Identifier guid = new Identifier();
2840
        guid.setValue(generateDocumentId());
2841
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2842
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2843
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2844
        
2845
        //Test the generating object succeeded. 
2846
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2847
        Thread.sleep(1000);
2848
        Identifier guid1 = new Identifier();
2849
        guid1.setValue(generateDocumentId());
2850
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2851
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2852
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2853
        //Test the generating object succeeded. 
2854
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2855
        
2856
        Thread.sleep(1000);
2857
        Identifier guid2 = new Identifier();
2858
        guid2.setValue(generateDocumentId());
2859
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2860
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2861
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2862
        //Test the generating object succeeded. 
2863
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2864
        
2865
      
2866
       // guid obsolete guid1
2867
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2868
       metadata.setObsoletes(guid1);
2869
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2870
       
2871
       // guid1  obsoletes  guid2
2872
       // guid1 obsoletedBy guid1 (a circular chain)
2873
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2874
       metadata.setObsoletes(guid2);
2875
       metadata.setObsoletedBy(guid1);
2876
       try {
2877
           MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2878
            fail("We can't update the system metadata which the obsoletes field is itself");
2879
      } catch (InvalidRequest e)  {
2880
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2881
      }
2882
       
2883
       
2884
       // guid1  obsoletes  guid2
2885
       // guid1 obsoletedBy guid 
2886
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2887
       metadata.setObsoletes(guid2);
2888
       metadata.setObsoletedBy(guid);
2889
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2890
      
2891
       
2892
       //guid2 obsoletedBy guid1
2893
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2894
       metadata.setObsoletedBy(guid1);
2895
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2896
       
2897
       
2898
       //guid2 obsoletedBy guid1
2899
       //guid1 obsoletedBy guid
2900
       //guid  obsoletedBy guid2 (created a circle)
2901
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2902
       metadata.setObsoletedBy(guid2);
2903
       try {
2904
           MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2905
           fail("We can't update the system metadata which has a circular obsoletes chain");
2906
      } catch (InvalidRequest e)  {
2907
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2908
      }
2909
       
2910
   
2911
    }
2912
}
(5-5/11)