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
    
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("testUpdateSystemMetadata"));
153
    suite.addTest(new MNodeServiceTest("testUpdateObsoletesAndObsoletedBy"));
154
    suite.addTest(new MNodeServiceTest("testArchive"));
155
    suite.addTest(new MNodeServiceTest("testUpdateSciMetadata"));
156
    // this requires MN certificate
157
    suite.addTest(new MNodeServiceTest("testDelete"));
158
    
159
    // MNRead tests
160
    suite.addTest(new MNodeServiceTest("testGet"));
161
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
162
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
163
    suite.addTest(new MNodeServiceTest("testDescribe"));
164
    suite.addTest(new MNodeServiceTest("testListObjects"));
165
    suite.addTest(new MNodeServiceTest("testGetSID"));
166
    // this requires CN certificate
167
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
168
    
169
    // MNCore tests
170
    suite.addTest(new MNodeServiceTest("testPing"));
171
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
172
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
173
    
174
    // MNAuthorization tests
175
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
176
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
177
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
178
    // MNreplication tests
179
    suite.addTest(new MNodeServiceTest("testReplicate"));
180
    // MN packaging tests
181
    suite.addTest(new MNodeServiceTest("testGetPackage"));
182
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
183
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
184
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
185
    suite.addTest(new MNodeServiceTest("testListViews"));
186
    suite.addTest(new MNodeServiceTest("testCreateNOAAObject"));
187
    
188
    suite.addTest(new MNodeServiceTest("testPermissionOfUpdateSystemmeta"));
189
    
190
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletesChain"));
191
    
192
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletedByChain"));
193
    
194
    return suite;
195
    
196
  }
197
  
198
  /**
199
   * Constructor for the tests
200
   * 
201
   * @param name - the name of the test
202
   */
203
  public MNodeServiceTest(String name) {
204
    super(name);
205
    
206
  }
207

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

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

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

    
287
  }
288

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

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

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

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

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

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

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

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

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

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

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

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

    
354
    }
355
    
356
  }
357

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

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

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

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

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

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

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

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

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

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

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

    
440
    }
441
      
442
  }
443
  
444
  /**
445
   * Test object creation
446
   */
447
  public void testMissMatchChecksumInCreate() {
448
    printTestHeader("testMissMatchChecksumInCreate");
449
    Identifier guid = new Identifier();
450
    guid.setValue("testCreate." + System.currentTimeMillis());
451
    Session session = null;
452
    try {
453
      session = getTestSession();
454
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
455
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
456
      Node localNode = MNodeService.getInstance(request).getCapabilities();
457
      ReplicationPolicy rePolicy = new ReplicationPolicy();
458
      rePolicy.setReplicationAllowed(true);
459
      rePolicy.setNumberReplicas(new Integer(3));
460
      rePolicy.addPreferredMemberNode(localNode.getIdentifier());
461
      sysmeta.setReplicationPolicy(rePolicy);
462
      Checksum checksum = new Checksum();
463
      checksum.setAlgorithm("md5");
464
      checksum.setValue("098F6BCD4621D373CADE4E832627B4F9");
465
      sysmeta.setChecksum(checksum);
466
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
467
      fail("It should fail since the checksum doesn't match.");
468
    } catch (InvalidSystemMetadata ee) {
469
      //ee.printStackTrace();
470
      try {
471
          Thread.sleep(5000);
472
          MNodeService.getInstance(request).getSystemMetadata(session, guid);
473
          fail("We shouldn't get here since the guid "+guid.getValue()+" was deleted.");
474
      } catch (NotFound e) {
475
         //here is okay.
476
      } catch (Exception e) {
477
          fail("Unexpected error: " + e.getMessage());
478
      }
479
      try {
480
          assertTrue(!IdentifierManager.getInstance().identifierExists(guid.getValue()));
481
      } catch (Exception e) {
482
          fail("Unexpected error: " + e.getMessage());
483
      }
484
      
485
    } catch (Exception e) {
486
        fail("Unexpected error: " + e.getMessage());
487
    }
488
  }
489

    
490
  /**
491
   * test object deletion
492
   */
493
  public void testDelete() {
494
    printTestHeader("testDelete");
495

    
496
    try {
497
      Session session = getTestSession();
498
      Identifier guid = new Identifier();
499
      guid.setValue("testDelete." + System.currentTimeMillis());
500
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
501
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
502
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
503
      
504
      // use MN admin to delete
505
      session = getMNSession();
506
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
507
      assertEquals(pid.getValue(), deletedPid.getValue());
508
      // check that we cannot get the object
509
      session = getTestSession();
510
      InputStream deletedObject = null;
511
      try {
512
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
513
      } catch (NotFound nf) {
514
    	  // this is expected
515
      }
516
	  assertNull(deletedObject);
517
      
518
    } catch (UnsupportedEncodingException e) {
519
      e.printStackTrace();
520
      
521
    } catch (Exception e) {
522
      e.printStackTrace();
523
      fail("Unexpected error: " + e.getMessage());
524

    
525
    } 
526

    
527
  }
528
  
529
  public void testArchive() throws Exception {
530
          Session session = getTestSession();
531
          Identifier guid = new Identifier();
532
          guid.setValue("testUpdate." + System.currentTimeMillis());
533
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
534
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
535
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
536
          MNodeService.getInstance(request).archive(session, guid);
537
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
538
          assertTrue(result.getArchived());
539
          System.out.println("the identifier is ==================="+pid.getValue());
540
  }
541

    
542
  /**
543
   * Test object updating
544
   */
545
  public void testUpdate() {
546
    printTestHeader("testUpdate");
547
    
548
    try {
549
      Session session = getTestSession();
550
      Identifier guid = new Identifier();
551
      guid.setValue("testUpdate." + System.currentTimeMillis());
552
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
553
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
554
      Identifier newPid = new Identifier();
555
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
556
      Identifier pid = 
557
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
558
      
559
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
560
      newSysMeta.setArchived(true);
561
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
562
      // do the update
563
      Identifier updatedPid = 
564
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
565
      
566
      // get the updated system metadata
567
      SystemMetadata updatedSysMeta = 
568
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
569

    
570
      assertEquals(updatedPid.getValue(), newPid.getValue());
571
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
572
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue())); 
573
      
574
      //try to update an archived object and need to get an exception
575
      Identifier newPid2 = new Identifier();
576
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
577
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
578
      try {
579
           updatedPid = 
580
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
581
           fail("update an archived object should get an invalid request exception");
582
      } catch (Exception ee) {
583
          assertTrue( ee instanceof InvalidRequest);
584
      }
585
      
586
      //update the authoritative node on the existing pid (newPid)
587
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
588
      BigInteger version = meta.getSerialVersion();
589
      version = version.add(BigInteger.ONE);
590
      newSysMeta.setSerialVersion(version);
591
      NodeReference newMN = new NodeReference();
592
      newMN.setValue("urn:node:river1");
593
      newSysMeta.setAuthoritativeMemberNode(newMN);
594
      newSysMeta.setArchived(false);
595
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
596
      try {
597
          updatedPid = 
598
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
599
          fail("update an object on non-authoritatvie node should get anexception");
600
     } catch (Exception ee) {
601
         assertTrue( ee instanceof NotAuthorized);
602
     }
603
     //cn can succeed even though it updates an object on the non-authoritative node.
604
     Session cnSession = getCNSession();
605
     updatedPid = 
606
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
607
     assertEquals(updatedPid.getValue(), newPid2.getValue());
608
    } catch (UnsupportedEncodingException e) {
609
      e.printStackTrace();
610
      fail("Unexpected error: " + e.getMessage());
611

    
612
    } catch (InvalidToken e) {
613
      e.printStackTrace();
614
      fail("Unexpected error: " + e.getMessage());
615

    
616
    } catch (ServiceFailure e) {
617
      e.printStackTrace();
618
      fail("Unexpected error: " + e.getMessage());
619

    
620
    } catch (NotAuthorized e) {
621
      e.printStackTrace();
622
      fail("Unexpected error: " + e.getMessage());
623

    
624
    } catch (IdentifierNotUnique e) {
625
      e.printStackTrace();
626
      fail("Unexpected error: " + e.getMessage());
627

    
628
    } catch (UnsupportedType e) {
629
      e.printStackTrace();
630
      fail("Unexpected error: " + e.getMessage());
631

    
632
    } catch (InsufficientResources e) {
633
      e.printStackTrace();
634
      fail("Unexpected error: " + e.getMessage());
635

    
636
    } catch (InvalidSystemMetadata e) {
637
      e.printStackTrace();
638
      fail("Unexpected error: " + e.getMessage());
639

    
640
    } catch (NotImplemented e) {
641
      e.printStackTrace();
642
      fail("Unexpected error: " + e.getMessage());
643

    
644
    } catch (InvalidRequest e) {
645
      e.printStackTrace();
646
      fail("Unexpected error: " + e.getMessage());
647

    
648
    } catch (Exception e) {
649
      e.printStackTrace();
650
      fail("Unexpected error: " + e.getMessage());
651

    
652
    }
653
  }
654
  
655
  
656
  /**
657
   * Test object updating
658
   */
659
  public void testUpdateSciMetadata() {
660
    printTestHeader("testUpdate");
661
    
662
    try {
663
      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\">"
664
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
665
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
666
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
667
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
668
      Session session = getTestSession();
669
      Identifier guid = new Identifier();
670
      guid.setValue("testUpdate." + System.currentTimeMillis());
671
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
672
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
673
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
674
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
675
      
676
      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\">"
677
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
678
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
679
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
680
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
681
      Identifier newPid = new Identifier();
682
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
683
      System.out.println("=================the pid is "+newPid.getValue());
684
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
685
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
686
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
687
      sysmeta2.setObsoletes(guid);
688
      Checksum sum1= sysmeta2.getChecksum();
689
      System.out.println("the checksum before sending is "+sum1.getValue());
690
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
691
      MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
692
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
693
      System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue());
694
      assertTrue(meta.getChecksum().getValue().equals(sum1.getValue()));
695
    } catch (UnsupportedEncodingException e) {
696
      e.printStackTrace();
697
      fail("Unexpected error: " + e.getMessage());
698

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

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

    
707
    } catch (NotAuthorized e) {
708
      e.printStackTrace();
709
      fail("Unexpected error: " + e.getMessage());
710

    
711
    } catch (IdentifierNotUnique e) {
712
      e.printStackTrace();
713
      fail("Unexpected error: " + e.getMessage());
714

    
715
    } catch (UnsupportedType e) {
716
      e.printStackTrace();
717
      fail("Unexpected error: " + e.getMessage());
718

    
719
    } catch (InsufficientResources e) {
720
      e.printStackTrace();
721
      fail("Unexpected error: " + e.getMessage());
722

    
723
    } catch (InvalidSystemMetadata e) {
724
      e.printStackTrace();
725
      fail("Unexpected error: " + e.getMessage());
726

    
727
    } catch (NotImplemented e) {
728
      e.printStackTrace();
729
      fail("Unexpected error: " + e.getMessage());
730

    
731
    } catch (InvalidRequest e) {
732
      e.printStackTrace();
733
      fail("Unexpected error: " + e.getMessage());
734

    
735
    } catch (Exception e) {
736
      e.printStackTrace();
737
      fail("Unexpected error: " + e.getMessage());
738

    
739
    }
740
  }
741

    
742
  /**
743
   * We currently expect this unit test to fail because it should rely on a different member node
744
   * to retrieve the object from. Currently it gets the object from itself and throws 
745
   * and expected error for duplicate entry.
746
   * 
747
   */
748
  public void testReplicate() {
749
      printTestHeader("testReplicate");
750
      try {
751
        Session session = getTestSession();
752
        Identifier guid = new Identifier();
753
        guid.setValue("testReplicate." + System.currentTimeMillis());
754
        System.out.println("======================the id need to be replicated is "+guid.getValue());
755
        InputStream object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
756
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
757
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
758
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
759
        sysmeta.setFormatId(formatId);
760
        NodeReference sourceNode = new NodeReference();
761
        sourceNode.setValue(MockReplicationMNode.NODE_ID);
762
        sysmeta.setAuthoritativeMemberNode(sourceNode);
763
        sysmeta.setOriginMemberNode(sourceNode);
764
        boolean result = false;
765
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
766
        assertTrue(result);
767
        SystemMetadata sys =  MNodeService.getInstance(request).getSystemMetadata(session, guid);
768
        assertTrue(sys.getIdentifier().equals(guid));
769
      } catch (Exception e) {
770
        e.printStackTrace();
771
      fail("Probably not yet implemented: " + e.getMessage());
772
    }
773
  }
774

    
775
  /**
776
   * Test describing an object
777
   */
778
  public void testDescribe() {
779
    printTestHeader("testDescribe");
780

    
781
    try {
782
      Session session = getTestSession();
783
      Identifier guid = new Identifier();
784
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
785
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
786
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
787
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
788
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
789
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
790
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
791
      
792
    } catch (UnsupportedEncodingException e) {
793
      e.printStackTrace();
794
      fail("Unexpected error: " + e.getMessage());
795

    
796
    } catch (InvalidToken e) {
797
      e.printStackTrace();      
798
      fail("Unexpected error: " + e.getMessage());
799

    
800
    } catch (ServiceFailure e) {
801
      e.printStackTrace();
802
      fail("Unexpected error: " + e.getMessage());
803

    
804
    } catch (NotAuthorized e) {
805
      e.printStackTrace();
806
      fail("Unexpected error: " + e.getMessage());
807

    
808
    } catch (IdentifierNotUnique e) {
809
      e.printStackTrace();
810
      fail("Unexpected error: " + e.getMessage());
811
      
812
    } catch (UnsupportedType e) {
813
      e.printStackTrace();
814
      fail("Unexpected error: " + e.getMessage());
815

    
816
    } catch (InsufficientResources e) {
817
      e.printStackTrace();
818
      fail("Unexpected error: " + e.getMessage());
819

    
820
    } catch (InvalidSystemMetadata e) {
821
      e.printStackTrace();
822
      fail("Unexpected error: " + e.getMessage());
823

    
824
    } catch (NotImplemented e) {
825
      e.printStackTrace();
826
      fail("Unexpected error: " + e.getMessage());
827

    
828
    } catch (InvalidRequest e) {
829
      e.printStackTrace();
830
      fail("Unexpected error: " + e.getMessage());
831

    
832
    } catch (NotFound e) {
833
      e.printStackTrace();
834
      fail("Unexpected error: " + e.getMessage());
835

    
836
    } catch (Exception e) {
837
      e.printStackTrace();
838
      fail("Unexpected error: " + e.getMessage());
839

    
840
    }
841
  }
842

    
843
  /**
844
   * Test getting the checksum of an object
845
   */
846
  public void testGetChecksum() {
847
    printTestHeader("testGetChecksum");
848

    
849
    try {
850
      Session session = getTestSession();
851
      Identifier guid = new Identifier();
852
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
853
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
854
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
855
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
856
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
857
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
858
    
859
    } catch (UnsupportedEncodingException e) {
860
      e.printStackTrace();
861
      fail("Unexpected error: " + e.getMessage());
862

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

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

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

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

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

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

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

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

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

    
899
    } catch (NotFound e) {
900
      e.printStackTrace();
901
      fail("Unexpected error: " + e.getMessage());
902

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

    
907
    }
908
    
909
  }
910

    
911
  /**
912
   * Testing listing objects on the Member Node
913
   */
914
  public void testListObjects() {
915
      printTestHeader("testListObjects");
916
  
917
      try {
918
  
919
        Session session = getTestSession();
920
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
921
        Date startTime = sdf.parse("2010-01-01");
922
        Date endTime = new Date();
923
        ObjectFormatIdentifier objectFormatId = null;
924
        boolean replicaStatus = false;
925
        int start = 0;
926
        int count = 1;
927
      
928
        // insert at least one object 
929
        testCreate();
930
        // now check that we have at least one
931
        ObjectList objectList = 
932
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
933
              objectFormatId, null, replicaStatus, start, count);
934
        assertNotNull(objectList);
935
        assertTrue(objectList.getCount() == count);
936
        assertTrue(objectList.getStart() == 0);
937
        assertTrue(objectList.getTotal() >= 1);
938
        
939
      } catch (Exception e) {
940
        e.printStackTrace();
941
        fail("Unexpected error: " + e.getMessage());
942
  
943
      }
944
  }
945

    
946
  public void testGetCapabilities() {
947
      printTestHeader("testGetCapabilities");
948
    try {
949
      Node node = MNodeService.getInstance(request).getCapabilities();
950
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
951
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
952
      assertNotNull(node);
953
      // TODO: should probably test other parts of the node information
954
      
955
    } catch (MarshallingException e) {
956
        e.printStackTrace();
957
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
958
        
959
    } catch (IOException e) {
960
        e.printStackTrace();
961
        fail("The node instance couldn't be read correctly:" + e.getMessage());
962
        
963
    } catch (Exception e) {
964
        e.printStackTrace();
965
        fail("Probably not yet implemented: " + e.getMessage());
966
        
967
    }
968
    
969
  }
970

    
971
  public void testPing() {
972

    
973
    try {
974
      Date mnDate = MNodeService.getInstance(request).ping();
975
      assertTrue(mnDate != null);
976
      
977
    } catch (NotImplemented e) {
978
      e.printStackTrace();
979
      fail("Unexpected error: " + e.getMessage());
980

    
981
    } catch (ServiceFailure e) {
982
      e.printStackTrace();
983
      fail("Unexpected error: " + e.getMessage());
984

    
985
    }  catch (InsufficientResources e) {
986
      e.printStackTrace();
987
      fail("Unexpected error: " + e.getMessage());
988

    
989
    }
990
    
991
  }
992

    
993
  public void testSynchronizationFailed() {
994
    printTestHeader("testSynchronizationFailed");
995
    try {
996
        Session session = getTestSession();
997
        
998
        // create the object
999
        Identifier pid = new Identifier();
1000
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
1001
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1002
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1003
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1004
        assertEquals(retPid.getValue(), pid.getValue());
1005
        
1006
        // pretend the sync failed, act as CN
1007
      SynchronizationFailed syncFailed = 
1008
        new SynchronizationFailed("0000", "Testing Synch Failure");
1009
      syncFailed.setPid(pid.getValue());
1010
      session = getCNSession();
1011
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
1012
    } catch (Exception e) {
1013
      e.printStackTrace();
1014
        fail("Unexpected error: " + e.getMessage());
1015
    }
1016

    
1017
  }
1018

    
1019
  public void testSystemMetadataChanged() {
1020
      printTestHeader("testSystemMetadataChanged");
1021
      try {
1022
          Session session = getTestSession();
1023
          
1024
          // create the object
1025
          Identifier pid = new Identifier();
1026
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
1027
          Identifier sid = new Identifier();
1028
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
1029
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1030
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1031
          sysmeta.setSeriesId(sid);
1032
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1033
          assertEquals(retPid.getValue(), pid.getValue());
1034
          
1035
          // pretend the system metadata changed on the CN
1036
          MNodeService.getInstance(request).systemMetadataChanged(session, 
1037
                  retPid, 5000L, Calendar.getInstance().getTime());
1038
          MNodeService.getInstance(request).systemMetadataChanged(session, 
1039
                  sid, 5000L, Calendar.getInstance().getTime());
1040
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
1041
                  retPid, 5000L, Calendar.getInstance().getTime());
1042
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
1043
                  sid, 5000L, Calendar.getInstance().getTime());
1044
          
1045
      } catch (Exception e) {
1046
          if (e instanceof NotAuthorized) {
1047
              // only CN subjects can call this
1048
              // TODO: use a CN certificate in the tests
1049
          } else {
1050
              fail("Unexpected error: " + e.getMessage());
1051
              
1052
          }
1053
      }
1054

    
1055
    }
1056

    
1057
  public void testGetLogRecords() {
1058
    printTestHeader("testLogRecords");
1059

    
1060
    try {
1061
	    Log log = null;
1062
	    Session session = getCNSession();
1063
	    Date fromDate = new Date();
1064
	    Calendar calendar = Calendar.getInstance();
1065
	    calendar.setTime(fromDate);
1066
	    calendar.roll(Calendar.YEAR, false);
1067
	    fromDate = calendar.getTime();
1068
	    Date toDate = new Date();
1069
	    Event event = Event.CREATE;
1070
	    int start = 0;
1071
	    int count = 1;
1072
    
1073
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
1074
        event.xmlValue(), null, start, count);
1075
      
1076
      assertNotNull(log);      
1077
      assertTrue(log.getCount() == count);
1078
      assertTrue(log.getStart() == start);
1079
      assertTrue(log.getTotal() >= 1);
1080
        
1081
    } catch (Exception e) {
1082
      e.printStackTrace();
1083
      fail("Unexpected error: " + e.getMessage());
1084

    
1085
    }
1086
  }
1087

    
1088
  /**
1089
   * Testing setting access on a known object
1090
   */
1091
  public void testSetAccessPolicy() {
1092
    printTestHeader("testSetAccess");
1093
    
1094
    //boolean accessWasSet = false;
1095
    //
1096
    //try {
1097
    //  // create an object to set access on
1098
    //  Session session = getTestSession();
1099
    //  Identifier guid = new Identifier();
1100
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1101
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1102
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1103
    //  Identifier pid = 
1104
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1105
    //  // set the access
1106
    //  AccessPolicy accessPolicy = new AccessPolicy();
1107
    //  AccessRule allow = new AccessRule();
1108
    //  allow.addPermission(Permission.WRITE);
1109
    //  Subject publicSubject = new Subject();
1110
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1111
    //  allow.addSubject(publicSubject);
1112
    //  accessPolicy.addAllow(allow);
1113
    //  
1114
    //  accessWasSet = 
1115
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1116
    //  assertTrue(accessWasSet);
1117
    //  // test that it is enforced
1118
    //  session.setSubject(publicSubject);
1119
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1120
    //  assertTrue(isAuthorized);
1121
    //
1122
    //} catch (UnsupportedEncodingException e) {
1123
    //  e.printStackTrace();
1124
    //  
1125
    //} catch (InvalidToken e) {
1126
    //  e.printStackTrace();
1127
    //  fail("Unexpected error: " + e.getMessage());
1128
    //  
1129
    //} catch (ServiceFailure e) {
1130
    //  e.printStackTrace();
1131
    //  fail("Unexpected error: " + e.getMessage());
1132
    //  
1133
    //} catch (NotAuthorized e) {
1134
    //  e.printStackTrace();
1135
    //  fail("Unexpected error: " + e.getMessage());
1136
    //  
1137
    //} catch (IdentifierNotUnique e) {
1138
    //  e.printStackTrace();
1139
    //  fail("Unexpected error: " + e.getMessage());
1140
    //  
1141
    //} catch (UnsupportedType e) {
1142
    //  e.printStackTrace();
1143
    //  fail("Unexpected error: " + e.getMessage());
1144
    //  
1145
    //} catch (InsufficientResources e) {
1146
    //  e.printStackTrace();
1147
    //  fail("Unexpected error: " + e.getMessage());
1148
    //  
1149
    //} catch (InvalidSystemMetadata e) {
1150
    //  e.printStackTrace();
1151
    //  fail("Unexpected error: " + e.getMessage());
1152
    //  
1153
    //} catch (NotImplemented e) {
1154
    //  e.printStackTrace();
1155
    //  fail("Unexpected error: " + e.getMessage());
1156
    //  
1157
    //} catch (InvalidRequest e) {
1158
    //  e.printStackTrace();
1159
    //  fail("Unexpected error: " + e.getMessage());
1160
    //  
1161
    //} catch (NotFound e) {
1162
    //  e.printStackTrace();
1163
    //  fail("Unexpected error: " + e.getMessage());
1164
    //  
1165
    //} catch (Exception e) {
1166
    //  e.printStackTrace();
1167
    //  fail("Unexpected error: " + e.getMessage());
1168
    //  
1169
    //}
1170
      
1171
  }
1172

    
1173
  /**
1174
   * Test if a subject is authorized to read a known object
1175
   */
1176
  public void testIsAuthorized() {
1177
    printTestHeader("testIsAuthorized");
1178
    
1179
    try {
1180
      Session session = getTestSession();
1181
      Identifier guid = new Identifier();
1182
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1183
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1184
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1185
      //non-public readable
1186
      AccessPolicy accessPolicy = new AccessPolicy();
1187
      AccessRule allow = new AccessRule();
1188
      allow.addPermission(Permission.READ);
1189
      Subject subject = new Subject();
1190
      subject.setValue("cn=test2,dc=dataone,dc=org");
1191
      allow.addSubject(subject);
1192
      accessPolicy.addAllow(allow);
1193
      sysmeta.setAccessPolicy(accessPolicy);
1194
      Identifier pid = 
1195
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1196
      boolean isAuthorized = 
1197
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1198
      assertEquals(isAuthorized, true);
1199
      isAuthorized = 
1200
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1201
      assertEquals(isAuthorized, true);
1202
      try {
1203
          isAuthorized = 
1204
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1205
          fail("we can reach here");
1206
      } catch(NotAuthorized ee) {
1207
          
1208
      }
1209
      
1210
     
1211
      Session session2= getAnotherSession();
1212
      isAuthorized = 
1213
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1214
      assertEquals(isAuthorized, true);
1215
     
1216
      try {
1217
          isAuthorized = 
1218
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1219
          fail("we can reach here");
1220
      } catch(NotAuthorized ee) {
1221
          
1222
      }
1223
      
1224
    
1225
      try {
1226
          isAuthorized = 
1227
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1228
          fail("we can reach here");
1229
      } catch(NotAuthorized ee) {
1230
          
1231
      }
1232
     
1233
      
1234
    } catch (UnsupportedEncodingException e) {
1235
      e.printStackTrace();
1236
      fail("Unexpected error: " + e.getMessage());
1237

    
1238
    } catch (InvalidToken e) {
1239
      e.printStackTrace();
1240
      fail("Unexpected error: " + e.getMessage());
1241

    
1242
    } catch (ServiceFailure e) {
1243
      e.printStackTrace();
1244
      fail("Unexpected error: " + e.getMessage());
1245

    
1246
    } catch (NotAuthorized e) {
1247
      e.printStackTrace();
1248
      fail("Unexpected error: " + e.getMessage());
1249

    
1250
    } catch (IdentifierNotUnique e) {
1251
      e.printStackTrace();
1252
      fail("Unexpected error: " + e.getMessage());
1253

    
1254
    } catch (UnsupportedType e) {
1255
      e.printStackTrace();
1256
      fail("Unexpected error: " + e.getMessage());
1257

    
1258
    } catch (InsufficientResources e) {
1259
      e.printStackTrace();
1260
      fail("Unexpected error: " + e.getMessage());
1261

    
1262
    } catch (InvalidSystemMetadata e) {
1263
      e.printStackTrace();
1264
      fail("Unexpected error: " + e.getMessage());
1265

    
1266
    } catch (NotImplemented e) {
1267
      e.printStackTrace();
1268
      fail("Unexpected error: " + e.getMessage());
1269

    
1270
    } catch (InvalidRequest e) {
1271
      e.printStackTrace();
1272
      fail("Unexpected error: " + e.getMessage());
1273

    
1274
    } catch (Exception e) {
1275
      e.printStackTrace();
1276
      fail("Unexpected error: " + e.getMessage());
1277

    
1278
    }
1279
  }
1280
  
1281
  /**
1282
   * Test if node admin is authorized to read a known object
1283
   */
1284
  public void testIsAdminAuthorized() {
1285
    printTestHeader("testIsAdminAuthorized");
1286
    
1287
    try {
1288
      Session session = getTestSession();
1289
      Identifier guid = new Identifier();
1290
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1291
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1292
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1293
      Identifier pid = 
1294
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1295
      
1296
      // test as public - read
1297
      boolean isAuthorized = 
1298
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1299
      assertEquals(isAuthorized, true);
1300
      
1301
      // test as public - change perm
1302
      isAuthorized = 
1303
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1304
      assertEquals(isAuthorized, false);
1305
      
1306
      //test write by another session
1307
      Session session2 = getAnotherSession();
1308
      isAuthorized = 
1309
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1310
            assertEquals(isAuthorized, false);
1311
      
1312
      // test as admin
1313
      isAuthorized = 
1314
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1315
    	      assertEquals(isAuthorized, true);
1316
     // test as cn
1317
    	isAuthorized = 
1318
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1319
    	              assertEquals(isAuthorized, true);      
1320
      
1321
    } catch (Exception e) {
1322
      e.printStackTrace();
1323
      fail("Unexpected error: " + e.getMessage());
1324

    
1325
    } 
1326
  }
1327

    
1328
  
1329
  public void testIsEquivIdentityAuthorized() {
1330
      printTestHeader("testIsEquivIdentityAuthorized");
1331

    
1332
      try {
1333
          Session session = new Session();
1334
          Subject s = new Subject();
1335
          s.setValue("cn=test,dc=dataone,dc=org");
1336
          session.setSubject(s);
1337
          
1338
          Identifier pid = new Identifier();
1339
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1340
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1341
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1342
          
1343
          // reset the access policy to only allow 'self' read (no public)
1344
          AccessPolicy ap = new AccessPolicy();
1345
          AccessRule ar = new AccessRule();
1346
          List<Subject> sList = new ArrayList<Subject>();
1347
          sList.add(session.getSubject());
1348
          ar.setSubjectList(sList);
1349
          List<Permission> permList = new ArrayList<Permission>();
1350
          permList.add(Permission.CHANGE_PERMISSION);
1351
          ar.setPermissionList(permList);
1352
          ap.addAllow(ar);
1353
          sysmeta.setAccessPolicy(ap);
1354
          
1355
          // save it
1356
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1357
          assertEquals(pid.getValue(), retPid.getValue());
1358
          
1359
          //check it against an equivalent identity not listed in the access policy
1360
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1361
          SubjectInfo subjectInfo = new SubjectInfo();
1362
          Person person = new Person();
1363
          person.setSubject(session.getSubject());
1364
          List<String> givenNames = new ArrayList<String>();
1365
          givenNames.add("New");
1366
          person.setGivenNameList(givenNames);
1367
          person.setFamilyName("Subject");
1368
          
1369
          // add equivalent identities
1370
          List<Subject> equivIdentities = new ArrayList<Subject>();
1371
          Subject mappedSubject2 = new Subject();
1372
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1373
          equivIdentities.add(mappedSubject2);
1374
          
1375
          Subject mappedSubject = new Subject();
1376
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1377
          equivIdentities.add(mappedSubject);          
1378
          
1379
          person.setEquivalentIdentityList(equivIdentities);
1380
          
1381
          List<Person> personList = new ArrayList<Person>();
1382
          personList.add(person);
1383
          subjectInfo.setPersonList(personList);
1384
          
1385
          // update the session to include subject info with a mapped identity
1386
          session.setSubjectInfo(subjectInfo);
1387
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1388
          assertTrue(result);
1389
        
1390
    } catch (Exception e) {
1391
        e.printStackTrace();
1392
        
1393
    }
1394
    
1395
  }
1396

    
1397
/**
1398
   * Test object creation failure when there is a space in the identifier
1399
   */
1400
  public void testCreateInvalidIdentifier() {
1401
    printTestHeader("testCreateInvalidIdentifier");
1402
    
1403
    try {
1404
      Session session = getTestSession();
1405
      Identifier guid = new Identifier();
1406
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1407
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1408
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1409
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1410
      fail("Should not be able to create with whitespace in indentifier");
1411
    } catch (InvalidRequest e) {
1412
    	// expect that this request fails
1413
        assertTrue(true);
1414
    } catch (Exception e) {
1415
      e.printStackTrace();
1416
      fail("Unexpected error: " + e.getMessage());
1417
    }
1418
      
1419
  }
1420
  
1421
	/**
1422
	 * Test getting a known object
1423
	 */
1424
	public void testGetPackage() {
1425
		printTestHeader("testGetPackage");
1426

    
1427
		try {
1428
			Session session = getTestSession();
1429
			Identifier guid = new Identifier();
1430
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1431
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1432
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1433
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1434
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1435
			format.setValue("application/bagit-097");
1436
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1437
			/*File bagFile = File.createTempFile("bagit.", ".zip");
1438
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1439
			BagFactory bagFactory = new BagFactory();
1440
			Bag bag = bagFactory.createBag(bagFile);
1441
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1442
			
1443
			// go back to beginning of original stream
1444
			object.reset();
1445
			// check
1446
			assertTrue(object.available() > 0);
1447
			assertTrue(result.available() > 0);
1448
			assertTrue(IOUtils.contentEquals(result, object));
1449
			
1450
			// clean up
1451
			bagFile.delete();*/
1452

    
1453
		} catch(InvalidRequest e) {
1454
		    
1455
		} catch (Exception e) {
1456
			e.printStackTrace();
1457
			fail("Unexpected error: " + e.getMessage());
1458
		}
1459
	}
1460
	
1461
	
1462
	/**
1463
	 * Test getting a known object
1464
	 */
1465
	public void testGetOREPackage() {
1466
		printTestHeader("testGetOREPackage");
1467

    
1468
		try {
1469
			
1470
			// construct the ORE package
1471
			Identifier resourceMapId = new Identifier();
1472
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1473
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1474
			Identifier metadataId = new Identifier();
1475
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1476
			List<Identifier> dataIds = new ArrayList<Identifier>();
1477
			Identifier dataId = new Identifier();
1478
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1479
			Identifier dataId2 = new Identifier();
1480
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1481
			dataIds.add(dataId);
1482
			dataIds.add(dataId2);
1483
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1484
			idMap.put(metadataId, dataIds);
1485
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1486
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1487
			assertNotNull(resourceMap);
1488
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1489
			assertNotNull(rdfXml);
1490
			
1491
			Session session = getTestSession();
1492
			InputStream object = null;
1493
			SystemMetadata sysmeta = null;
1494
			
1495
			// save the data objects (data just contains their ID)
1496
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1497
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1498
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1499
			// second data file
1500
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1501
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1502
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1503
			// metadata file
1504
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1505
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1506
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1507
						
1508
			// save the ORE object
1509
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1510
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1511
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1512
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1513
			
1514
			// get the package we uploaded
1515
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1516
            format.setValue("application/bagit-097");
1517
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1518
			File bagFile = File.createTempFile("bagit.", ".zip");
1519
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1520
			BagFactory bagFactory = new BagFactory();
1521
			Bag bag = bagFactory.createBag(bagFile);
1522
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1523
			while (manifestIter.hasNext()) {
1524
				String filepath = manifestIter.next().getFilepath();
1525
				BagFile entryFile = bag.getBagFile(filepath);
1526
				InputStream result = entryFile.newInputStream();
1527
				// check ORE
1528
				if (filepath.contains(resourceMapId.getValue())) {
1529
					object.reset();
1530
					assertTrue(object.available() > 0);
1531
					assertTrue(result.available() > 0);
1532
					assertTrue(IOUtils.contentEquals(result, object));
1533
				}
1534
				// check metadata
1535
				if (filepath.contains(metadataId.getValue())) {
1536
					metadataObject.reset();
1537
					assertTrue(metadataObject.available() > 0);
1538
					assertTrue(result.available() > 0);
1539
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1540
				}
1541
				if (filepath.contains(dataId.getValue())) {
1542
					dataObject1.reset();
1543
					assertTrue(dataObject1.available() > 0);
1544
					assertTrue(result.available() > 0);
1545
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1546
				}
1547
				if (filepath.contains(dataId2.getValue())) {
1548
					dataObject2.reset();
1549
					assertTrue(dataObject2.available() > 0);
1550
					assertTrue(result.available() > 0);
1551
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1552
				}
1553
				
1554
				
1555
			}
1556
			
1557
			// clean up
1558
			bagFile.delete();
1559
			
1560
			// test the ORE lookup
1561
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1562
			assertTrue(oreIds.contains(resourceMapId));
1563

    
1564
		} catch (Exception e) {
1565
			e.printStackTrace();
1566
			fail("Unexpected error: " + e.getMessage());
1567
		}
1568
	}
1569
	
1570
	/**
1571
     * Test the extra "delete information" was added to the NotFoundException
1572
     * if the object was delete in the following methods:
1573
     * MN.get
1574
     * MN.getSystemmetadata
1575
     * MN.describe
1576
     * MN.getChecksum
1577
     * MN.getRelica
1578
     */
1579
    public void testReadDeletedObject() {
1580
        printTestHeader("testDelete");
1581

    
1582
        try {
1583
          Session session = getTestSession();
1584
          Identifier guid = new Identifier();
1585
          guid.setValue("testDelete." + System.currentTimeMillis());
1586
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1587
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1588
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1589
          Thread.sleep(3000);
1590
          // use MN admin to delete
1591
          session = getMNSession();
1592
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1593
          System.out.println("after deleting");
1594
          assertEquals(pid.getValue(), deletedPid.getValue());
1595
          // check that we cannot get the object
1596
          session = getTestSession();
1597
          InputStream deletedObject = null;
1598
          try {
1599
              //System.out.println("before read ===============");
1600
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1601
              //System.out.println("after read ===============");
1602
          } catch (NotFound nf) {
1603
              assertTrue(nf.getMessage().contains("deleted"));
1604
          }
1605
          try {
1606
              //System.out.println("before read ===============");
1607
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1608
              //System.out.println("after read ===============");
1609
          } catch (NotFound nf) {
1610
              //System.out.println("the exception is "+nf.getMessage());
1611
              assertTrue(nf.getMessage().contains("deleted"));
1612
          }
1613
          
1614
          try {
1615
              //System.out.println("before read ===============");
1616
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1617
              //System.out.println("after read ===============");
1618
          } catch (NotFound nf) {
1619
              //System.out.println("the exception is "+nf.getMessage());
1620
              assertTrue(nf.getMessage().contains("deleted"));
1621
          }
1622
          
1623
          try {
1624
              //System.out.println("before read ===============");
1625
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1626
              //System.out.println("after read ===============");
1627
          } catch (NotFound nf) {
1628
              //System.out.println("the exception 3 is "+nf.getMessage());
1629
              assertTrue(nf.getMessage().contains("deleted"));
1630
          }
1631
          
1632
          try {
1633
              //System.out.println("before read ===============");
1634
              boolean isAuthorized = 
1635
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1636
              //System.out.println("after read ===============");
1637
          } catch (NotFound nf) {
1638
              System.out.println("the exception 4 is "+nf.getMessage());
1639
              assertTrue(nf.getMessage().contains("deleted"));
1640
          }
1641
          
1642
          assertNull(deletedObject);
1643
          
1644
        } catch (UnsupportedEncodingException e) {
1645
          e.printStackTrace();
1646
          
1647
        } catch (Exception e) {
1648
          e.printStackTrace();
1649
          fail("Unexpected error: " + e.getMessage());
1650

    
1651
        } 
1652
    }
1653
    
1654
    /**
1655
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1656
     * has some special charaters. The saved document should has the same bytes as the origianl.
1657
     */
1658
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1659
          String algorithm = "md5";
1660
          Session session = getTestSession();
1661
          Identifier guid = new Identifier();
1662
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1663
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1664
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1665
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1666
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1667
          Identifier pid = 
1668
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1669
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1670
          byte[] readBytes = IOUtils.toByteArray(readResult);
1671
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1672
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1673
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1674
          
1675
          Identifier newPid = new Identifier();
1676
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1677
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1678
                
1679
          // do the update
1680
          Identifier updatedPid = 
1681
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1682
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1683
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1684
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1685
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1686
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1687

    
1688
          
1689
    }
1690
  
1691
    /**
1692
     * Test the method - get api  for a speicified SID
1693
     */
1694
    public void testGetSID() {
1695
        String str1 = "object1";
1696
        String str2 = "object2";
1697
        String str3 = "object3";
1698
        Date fromDate = new Date();
1699
        Calendar calendar = Calendar.getInstance();
1700
        calendar.setTime(fromDate);
1701
        calendar.roll(Calendar.YEAR, false);
1702
        fromDate = calendar.getTime();
1703
        try {
1704
            //insert test documents with a series id
1705
            Session session = getTestSession();
1706
            Identifier guid = new Identifier();
1707
            guid.setValue(generateDocumentId());
1708
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1709
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1710
            String sid1= "sid."+System.nanoTime();
1711
            Identifier seriesId = new Identifier();
1712
            seriesId.setValue(sid1);
1713
            System.out.println("the first sid is "+seriesId.getValue());
1714
            sysmeta.setSeriesId(seriesId);
1715
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1716
            System.out.println("the first pid is "+guid.getValue());
1717
            //test the get(pid) for v2
1718
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1719
            // go back to beginning of original stream
1720
            object1.reset();
1721
            // check
1722
            assertTrue(object1.available() > 0);
1723
            assertTrue(result.available() > 0);
1724
            assertTrue(IOUtils.contentEquals(result, object1));
1725
            // test the get(id) for v2
1726
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1727
            object1.reset();
1728
            // check
1729
            assertTrue(object1.available() > 0);
1730
            assertTrue(result1.available() > 0);
1731
            assertTrue(IOUtils.contentEquals(result1, object1));
1732
            //test the get(pid) for v1
1733
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1734
            object1.reset();
1735
            // check
1736
            assertTrue(object1.available() > 0);
1737
            assertTrue(result2.available() > 0);
1738
            assertTrue(IOUtils.contentEquals(result2, object1));
1739
            //test the get(sid) for v1
1740
            try {
1741
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1742
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1743
            } catch (NotFound ee) {
1744
                
1745
            }
1746
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1747
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1748
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1749
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1750
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1751
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1752
            
1753
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1754
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1755
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1756
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1757
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1758
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1759
            
1760
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1761
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1762
            
1763
            try {
1764
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1765
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1766
            } catch(NotFound nf2) {
1767
                
1768
            }
1769
            
1770
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1771
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1772
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1773
            try {
1774
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1775
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1776
            } catch(NotFound nf2) {
1777
                
1778
            }
1779
            
1780
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1781
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1782
            
1783
            try {
1784
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1785
                fail("the getCheckSum shouldn't work for sid");
1786
            } catch(NotFound nf3) {
1787
                
1788
            }
1789
            
1790
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1791
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1792
            
1793
            try {
1794
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1795
                fail("the getCheckSum shouldn't work for sid");
1796
            } catch(NotFound nf3) {
1797
                
1798
            }
1799
            
1800
            boolean isAuthorized = 
1801
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1802
            assertEquals(isAuthorized, true);
1803
            
1804
            isAuthorized = 
1805
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1806
            assertEquals(isAuthorized, true);
1807
            
1808
            isAuthorized = 
1809
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1810
            assertEquals(isAuthorized, true);
1811
            
1812
            try {
1813
                isAuthorized = 
1814
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1815
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1816
            } catch (NotFound e) {
1817
                
1818
            }
1819
            
1820
            Session cnsession = getCNSession();
1821
            Date toDate = new Date();
1822
            Event event = Event.READ;
1823
            int start = 0;
1824
            int count = 1;
1825
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1826
            event.xmlValue(), seriesId.getValue(), start, count);
1827
          
1828
          assertNotNull(log);      
1829
          assertTrue(log.getCount() == count);
1830
          assertTrue(log.getStart() == start);
1831
          assertTrue(log.getTotal() >= 1);
1832
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1833

    
1834
            //do a update with the same series id
1835
            Thread.sleep(1000);
1836
            Identifier newPid = new Identifier();
1837
            newPid.setValue(generateDocumentId()+"1");
1838
            System.out.println("the second pid is "+newPid.getValue());
1839
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1840
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1841
            newSysMeta.setObsoletes(guid);
1842
            newSysMeta.setSeriesId(seriesId);
1843
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1844
           
1845
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1846
            // go back to beginning of original stream
1847
            object1.reset();
1848
            // check
1849
            assertTrue(object1.available() > 0);
1850
            assertTrue(result4.available() > 0);
1851
            assertTrue(IOUtils.contentEquals(result4, object1));
1852
            
1853
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1854
            // go back to beginning of original stream
1855
            object2.reset();
1856
            // check
1857
            assertTrue(object2.available() > 0);
1858
            assertTrue(result5.available() > 0);
1859
            assertTrue(IOUtils.contentEquals(result5, object2));
1860
            
1861

    
1862
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1863
            object2.reset();
1864
            // check
1865
            assertTrue(object2.available() > 0);
1866
            assertTrue(result6.available() > 0);
1867
            assertTrue(IOUtils.contentEquals(result6, object2));
1868
            //test the get(pid) for v1
1869
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1870
            object1.reset();
1871
            // check
1872
            assertTrue(object1.available() > 0);
1873
            assertTrue(result7.available() > 0);
1874
            assertTrue(IOUtils.contentEquals(result7, object1));
1875
            
1876
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1877
            object2.reset();
1878
            // check
1879
            assertTrue(object2.available() > 0);
1880
            assertTrue(result8.available() > 0);
1881
            assertTrue(IOUtils.contentEquals(result8, object2));
1882
            //test the get(sid) for v1
1883
            try {
1884
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1885
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1886
            } catch (NotFound ee) {
1887
                
1888
            }
1889
            
1890
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1891
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1892
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1893
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1894
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1895
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1896
            
1897
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1898
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1899
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1900
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1901
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1902
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1903
            
1904
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1905
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1906
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1907
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1908
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1909
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1910
            
1911
            //do another update with different series id
1912
            Thread.sleep(1000);
1913
            String sid2 = "sid."+System.nanoTime();
1914
            Identifier seriesId2= new Identifier();
1915
            seriesId2.setValue(sid2);
1916
            System.out.println("the second sid is "+seriesId2.getValue());
1917
            Identifier newPid2 = new Identifier();
1918
            newPid2.setValue(generateDocumentId()+"2");
1919
            System.out.println("the third pid is "+newPid2.getValue());
1920
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1921
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1922
            sysmeta3.setObsoletes(newPid);
1923
            sysmeta3.setSeriesId(seriesId2);
1924
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1925
            
1926
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1927
            // go back to beginning of original stream
1928
            object1.reset();
1929
            // check
1930
            assertTrue(object1.available() > 0);
1931
            assertTrue(result9.available() > 0);
1932
            assertTrue(IOUtils.contentEquals(result9, object1));
1933
            
1934
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1935
            // go back to beginning of original stream
1936
            object2.reset();
1937
            // check
1938
            assertTrue(object2.available() > 0);
1939
            assertTrue(result10.available() > 0);
1940
            assertTrue(IOUtils.contentEquals(result10, object2));
1941
            
1942
            
1943
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1944
            // go back to beginning of original stream
1945
            object3.reset();
1946
            // check
1947
            assertTrue(object3.available() > 0);
1948
            assertTrue(result11.available() > 0);
1949
            assertTrue(IOUtils.contentEquals(result11, object3));
1950
            
1951
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1952
            object3.reset();
1953
            // check
1954
            assertTrue(object3.available() > 0);
1955
            assertTrue(result12.available() > 0);
1956
            assertTrue(IOUtils.contentEquals(result12, object3));
1957
            
1958
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1959
            object2.reset();
1960
            // check
1961
            assertTrue(object2.available() > 0);
1962
            assertTrue(result16.available() > 0);
1963
            assertTrue(IOUtils.contentEquals(result16, object2));
1964
           
1965
            //test the get(pid) for v1
1966
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1967
            object1.reset();
1968
            // check
1969
            assertTrue(object1.available() > 0);
1970
            assertTrue(result13.available() > 0);
1971
            assertTrue(IOUtils.contentEquals(result13, object1));
1972
            
1973
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1974
            object2.reset();
1975
            // check
1976
            assertTrue(object2.available() > 0);
1977
            assertTrue(result14.available() > 0);
1978
            assertTrue(IOUtils.contentEquals(result14, object2));
1979
            
1980
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1981
            object3.reset();
1982
            // check
1983
            assertTrue(object3.available() > 0);
1984
            assertTrue(result15.available() > 0);
1985
            assertTrue(IOUtils.contentEquals(result15, object3));
1986
            
1987
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1988
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1989
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1990
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1991
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1992
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1993
            
1994
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1995
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1996
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1997
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1998
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1999
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
2000
            
2001
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2002
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
2003
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
2004
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
2005
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
2006
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
2007
            
2008
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2009
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
2010
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
2011
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
2012
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
2013
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
2014
            
2015
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2016
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
2017
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
2018
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
2019
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
2020
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
2021
            
2022
            
2023
            
2024
            
2025
            //test the get(sid) for v1
2026
            try {
2027
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
2028
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2029
            } catch (NotFound ee) {
2030
                
2031
            }
2032
            
2033
            //test the get(sid) for v1
2034
            try {
2035
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
2036
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2037
            } catch (NotFound ee) {
2038
                
2039
            }
2040
            
2041
            //test to get non-existing id for v2
2042
            try {
2043
             // the pid should be null when we try to get a no-exist sid
2044
                Identifier non_exist_sid = new Identifier();
2045
                non_exist_sid.setValue("no-sid-exist-123qwe");
2046
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
2047
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2048
            } catch (NotFound ee) {
2049
                
2050
            }
2051
            
2052
            try {
2053
                // the pid should be null when we try to get a no-exist sid
2054
                   Identifier non_exist_sid = new Identifier();
2055
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2056
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
2057
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2058
            } catch (NotFound ee) {
2059
                   
2060
            }
2061
            
2062
            try {
2063
                // the pid should be null when we try to get a no-exist sid
2064
                   Identifier non_exist_sid = new Identifier();
2065
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2066
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
2067
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2068
               } catch (NotFound ee) {
2069
                   
2070
               }
2071
            
2072
            toDate = new Date();
2073
            event = Event.READ;
2074
            start = 0;
2075
            count = 1;
2076
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
2077
            event.xmlValue(), seriesId.getValue(), start, count);
2078
          
2079
            assertNotNull(log);      
2080
            assertTrue(log.getCount() == count);
2081
            assertTrue(log.getStart() == start);
2082
            assertTrue(log.getTotal() >= 1);
2083
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
2084
            
2085
            //do another update with invalid series ids
2086
            Thread.sleep(1000);
2087
            Identifier newPid3 = new Identifier();
2088
            newPid3.setValue(generateDocumentId()+"3");
2089
            System.out.println("the third pid is "+newPid3.getValue());
2090
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
2091
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
2092
            sysmeta4.setObsoletes(newPid2);
2093
            sysmeta4.setSeriesId(seriesId);
2094
            try {
2095
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2096
                fail("we can't reach here since the sid is using an old one ");
2097
            } catch (InvalidSystemMetadata eee) {
2098
                
2099
            } 
2100
            
2101
            sysmeta4.setSeriesId(newPid3);
2102
            try {
2103
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2104
                fail("we can't reach here since the sid is using the pid ");
2105
            } catch (InvalidSystemMetadata eee) {
2106
                
2107
            } 
2108
            
2109
            //test archive a series id by v1
2110
            try {
2111
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
2112
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
2113
            } catch (NotFound nf2) {
2114
                
2115
            }
2116
            
2117
            // test delete a series id by v1
2118
            Session mnSession = getMNSession();
2119
            try {
2120
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
2121
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
2122
            } catch (NotFound nf2) {
2123
                
2124
            }
2125
            
2126
            // test archive a series id by v2
2127
            MNodeService.getInstance(request).archive(session, seriesId2);
2128
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2129
            assertTrue(archived.getArchived());
2130
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2131
            assertTrue(archived.getArchived());
2132
            
2133
            // test delete a series id by v2
2134
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
2135
            try {
2136
                MNodeService.getInstance(request).get(session, seriesId2);
2137
                fail("we can't reach here since the series id was deleted ");
2138
            } catch (NotFound nf3) {
2139
                System.out.println("the message is ============="+nf3.getMessage());
2140
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
2141
            }
2142
            
2143
            try {
2144
                MNodeService.getInstance(request).get(session, newPid2);
2145
                fail("we can't reach here since the series id was deleted ");
2146
            } catch (NotFound nf3) {
2147
                //System.out.println("the message is ============="+nf3.getMessage());
2148
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2149
            }
2150
            
2151
            try {
2152
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2153
                fail("we can't reach here since the series id was deleted ");
2154
            } catch (NotFound nf3) {
2155
                System.out.println("the message is ============="+nf3.getMessage());
2156
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2157
            }
2158
            
2159
            //archive seriesId
2160
            MNodeService.getInstance(request).archive(mnSession, seriesId);
2161
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2162
            assertTrue(archived.getArchived());
2163
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2164
            assertTrue(archived.getArchived());
2165
            
2166
            
2167
            //delete seriesId
2168
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2169
            try {
2170
                MNodeService.getInstance(request).get(session, newPid);
2171
                fail("we can't reach here since the series id was deleted ");
2172
            } catch (NotFound nf3) {
2173
                //System.out.println("the message is ============="+nf3.getMessage());
2174
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2175
            }
2176
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2177
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2178
            
2179
        } catch (Exception e) {
2180
            fail(e.getMessage());
2181
        }
2182
        
2183
        
2184
        
2185
        
2186
    }
2187
    
2188
    /**
2189
     * Test the listView methods.
2190
     * @throws Excpetion
2191
     */
2192
    public void testListViews() throws Exception {
2193
        Session session = null;
2194
        OptionList list = MNodeService.getInstance(request).listViews(session);
2195
        assertTrue(list.sizeOptionList() >0);
2196
        List<String> names = list.getOptionList();
2197
        for(String name : names) {
2198
            System.out.println("It has the view named "+name);
2199
        }
2200
    }
2201
    
2202
    public void testUpdateSystemMetadata() throws Exception {
2203
        String str1 = "object1";
2204
        String str2 = "object2";
2205
        String str3 = "object3";
2206
        
2207
        Date date = new Date();
2208
        Thread.sleep(2000);
2209
        //insert test documents with a series id
2210
        Session session = getTestSession();
2211
        Identifier guid = new Identifier();
2212
        guid.setValue(generateDocumentId());
2213
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2214
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2215
        String sid1= "sid."+System.nanoTime();
2216
        Identifier seriesId = new Identifier();
2217
        seriesId.setValue(sid1);
2218
        System.out.println("the first sid is "+seriesId.getValue());
2219
        sysmeta.setSeriesId(seriesId);
2220
        sysmeta.setArchived(false);
2221
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2222
        //Test the generating object succeeded. 
2223
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2224
        assertTrue(metadata.getIdentifier().equals(guid));
2225
        assertTrue(metadata.getArchived().equals(false));
2226
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2227
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2228
        System.out.println("the identifier is "+guid.getValue());
2229
        
2230
        Date current = sysmeta.getDateSysMetadataModified();
2231
        //updating system metadata failed since the date doesn't match
2232
        sysmeta.setArchived(true);
2233
        sysmeta.setDateSysMetadataModified(date);
2234
        try {
2235
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2236
            fail("We shouldn't get there");
2237
        } catch (Exception e) {
2238
            assertTrue(e instanceof InvalidRequest);
2239
        }
2240
        //update system metadata sucessfully
2241
        sysmeta.setDateSysMetadataModified(current);
2242
        BigInteger serialVersion = metadata.getSerialVersion();
2243
        //System.out.println("the current version is "+serialVersion.toString());
2244
        //serialVersion = serialVersion.add(BigInteger.ONE);
2245
        //System.out.println("the new version is "+serialVersion.toString());
2246
        //sysmeta.setSerialVersion(serialVersion);
2247
        System.out.println("the identifier is ----------------------- "+guid.getValue());
2248
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2249
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2250
        assertTrue(metadata2.getIdentifier().equals(guid));
2251
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2252
        assertTrue(metadata2.getArchived().equals(true));
2253
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2254
        assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime());
2255
        
2256
        Identifier newId = new Identifier();
2257
        newId.setValue("newValue");
2258
        sysmeta.setIdentifier(newId);
2259
        serialVersion = metadata.getSerialVersion();
2260
        serialVersion = serialVersion.add(BigInteger.ONE);
2261
        sysmeta.setSerialVersion(serialVersion);
2262
        try {
2263
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2264
            fail("We shouldn't get there");
2265
        } catch (Exception e) {
2266
            assertTrue(e instanceof InvalidRequest);
2267
        }
2268
        
2269
        newId.setValue("newValue");
2270
        sysmeta.setSeriesId(newId);
2271
        try {
2272
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2273
            fail("We shouldn't get there");
2274
        } catch (Exception e) {
2275
            assertTrue(e instanceof InvalidRequest);
2276
        }
2277
        
2278
        Date newDate = new Date();
2279
        sysmeta.setDateUploaded(newDate);
2280
        try {
2281
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2282
            fail("We shouldn't get there");
2283
        } catch (Exception e) {
2284
            assertTrue(e instanceof InvalidRequest);
2285
        }
2286
        
2287
        Checksum checkSum = new Checksum();
2288
        checkSum.setValue("12345");
2289
        sysmeta.setChecksum(checkSum);
2290
        try {
2291
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2292
            fail("We shouldn't get there");
2293
        } catch (Exception e) {
2294
            assertTrue(e instanceof InvalidRequest);
2295
        }
2296
        
2297
        BigInteger size = new BigInteger("4000");
2298
        sysmeta.setSize(size);
2299
        try {
2300
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2301
            fail("We shouldn't get there");
2302
        } catch (Exception e) {
2303
            assertTrue(e instanceof InvalidRequest);
2304
        }
2305
    }
2306
    
2307
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2308
        String str1 = "object1";
2309
        String str2 = "object2";
2310
        String str3 = "object3";
2311

    
2312
        //insert two documents 
2313
        Session session = getTestSession();
2314
        Identifier guid1 = new Identifier();
2315
        guid1.setValue(generateDocumentId());
2316
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2317
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2318
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2319
        //Test the generating object succeeded. 
2320
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2321
        assertTrue(metadata.getIdentifier().equals(guid1));
2322
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2323
        
2324
        Identifier guid2 = new Identifier();
2325
        guid2.setValue(generateDocumentId());
2326
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2327
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2328
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2329
        //Test the generating object succeeded. 
2330
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2331
        assertTrue(metadata.getIdentifier().equals(guid2));
2332
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2333
        
2334
        
2335
        
2336
        //update the system metadata without touching the obsoletes and obsoletdBy
2337
        AccessPolicy accessPolicy = new AccessPolicy();
2338
        AccessRule allow = new AccessRule();
2339
        allow.addPermission(Permission.WRITE);
2340
        Subject subject = new Subject();
2341
        subject.setValue("user_foo");
2342
        allow.addSubject(subject);
2343
        accessPolicy.addAllow(allow);
2344
        sysmeta1.setAccessPolicy(accessPolicy);
2345
        BigInteger serialVersion = metadata.getSerialVersion();
2346
        serialVersion = serialVersion.add(BigInteger.ONE);
2347
        sysmeta1.setSerialVersion(serialVersion);
2348
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2349
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2350
        assertTrue(metadata.getIdentifier().equals(guid1));
2351
        assertTrue(metadata.getObsoletedBy() == null);
2352
        assertTrue(metadata.getObsoletes() == null);
2353
        Session newSession = new Session();
2354
        newSession.setSubject(subject);
2355
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2356
        assertTrue(isAuthorized);
2357
        
2358
        sysmeta2.setAccessPolicy(accessPolicy);
2359
        serialVersion = metadata.getSerialVersion();
2360
        serialVersion = serialVersion.add(BigInteger.ONE);
2361
        sysmeta2.setSerialVersion(serialVersion);
2362
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2363
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2364
        assertTrue(metadata.getIdentifier().equals(guid2));
2365
        assertTrue(metadata.getObsoletes() == null);
2366
        assertTrue(metadata.getObsoletedBy() == null);
2367
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2368
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2369
        assertTrue(isAuthorized);
2370
        
2371
        
2372
        
2373
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2374
        sysmeta1.setObsoletedBy(guid2);
2375
        serialVersion = metadata.getSerialVersion();
2376
        serialVersion = serialVersion.add(BigInteger.ONE);
2377
        sysmeta1.setSerialVersion(serialVersion);
2378
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2379
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2380
        assertTrue(metadata.getIdentifier().equals(guid1));
2381
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2382
        assertTrue(metadata.getObsoletes() == null);
2383
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2384
        
2385
        sysmeta2.setObsoletes(guid1);
2386
        serialVersion = metadata.getSerialVersion();
2387
        serialVersion = serialVersion.add(BigInteger.ONE);
2388
        sysmeta2.setSerialVersion(serialVersion);
2389
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2390
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2391
        assertTrue(metadata.getIdentifier().equals(guid2));
2392
        assertTrue(metadata.getObsoletes().equals(guid1));
2393
        assertTrue(metadata.getObsoletedBy() == null);
2394
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2395
        
2396
        
2397
        
2398
        
2399
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2400
        sysmeta1.setObsoletedBy(guid2);
2401
        serialVersion = metadata.getSerialVersion();
2402
        serialVersion = serialVersion.add(BigInteger.ONE);
2403
        sysmeta1.setSerialVersion(serialVersion);
2404
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2405
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2406
        assertTrue(metadata.getIdentifier().equals(guid1));
2407
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2408
        assertTrue(metadata.getObsoletes() == null);
2409
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2410
        
2411
        sysmeta2.setObsoletes(guid1);
2412
        serialVersion = metadata.getSerialVersion();
2413
        serialVersion = serialVersion.add(BigInteger.ONE);
2414
        sysmeta2.setSerialVersion(serialVersion);
2415
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2416
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2417
        assertTrue(metadata.getIdentifier().equals(guid2));
2418
        assertTrue(metadata.getObsoletes().equals(guid1));
2419
        assertTrue(metadata.getObsoletedBy() == null);
2420
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2421
        
2422

    
2423
        
2424
        
2425
        
2426
        //resetting the obsoletes and obsoletedBy fails
2427
        Identifier newId = new Identifier();
2428
        newId.setValue("newValue");
2429
        sysmeta1.setObsoletedBy(newId);
2430
        serialVersion = metadata.getSerialVersion();
2431
        serialVersion = serialVersion.add(BigInteger.ONE);
2432
        sysmeta1.setSerialVersion(serialVersion);
2433
        try {
2434
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2435
            fail("We shouldn't get there");
2436
        } catch (Exception e) {
2437
            e.printStackTrace();
2438
            assertTrue(e instanceof InvalidRequest);
2439
        }
2440
       
2441
        sysmeta2.setObsoletes(newId);
2442
        serialVersion = metadata.getSerialVersion();
2443
        serialVersion = serialVersion.add(BigInteger.ONE);
2444
        sysmeta2.setSerialVersion(serialVersion);
2445
        try {
2446
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2447
            fail("We shouldn't get there");
2448
        } catch (Exception e) {
2449
            e.printStackTrace();
2450
            assertTrue(e instanceof InvalidRequest);
2451
        }
2452
        
2453
        
2454
        
2455
        
2456
        //insert another object
2457
        Identifier guid5 = new Identifier();
2458
        guid5.setValue(generateDocumentId());
2459
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2460
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2461
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2462
        //Test the generating object succeeded. 
2463
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2464
        assertTrue(metadata.getIdentifier().equals(guid5));
2465
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2466
        
2467
        
2468
        
2469
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2470
        sysmeta5.setObsoletes(guid1);
2471
        serialVersion = metadata.getSerialVersion();
2472
        serialVersion = serialVersion.add(BigInteger.ONE);
2473
        sysmeta5.setSerialVersion(serialVersion);
2474
        try {
2475
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2476
            fail("We shouldn't get there");
2477
        } catch (Exception e) {
2478
            e.printStackTrace();
2479
            
2480
        }
2481
        
2482
        
2483
       
2484
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2485
        sysmeta5.setObsoletes(null);
2486
        sysmeta5.setObsoletedBy(guid2);
2487
        try {
2488
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2489
            fail("We shouldn't get there");
2490
        } catch (Exception e) {
2491
            e.printStackTrace();
2492
            
2493
        }
2494
        
2495
        
2496
        
2497
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2498
        sysmeta5.setObsoletedBy(null);
2499
        sysmeta5.setObsoletes(guid2);
2500
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2501
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2502
        assertTrue(metadata.getIdentifier().equals(guid5));
2503
        assertTrue(metadata.getObsoletes().equals(guid2));
2504
        assertTrue(metadata.getObsoletedBy() == null);
2505
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2506
        
2507
        
2508
        
2509
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2510
        sysmeta2.setObsoletes(guid1);
2511
        sysmeta2.setObsoletedBy(guid5);
2512
        serialVersion = sysmeta2.getSerialVersion();
2513
        serialVersion = serialVersion.add(BigInteger.ONE);
2514
        sysmeta2.setSerialVersion(serialVersion);
2515
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2516
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2517
        assertTrue(metadata.getIdentifier().equals(guid2));
2518
        assertTrue(metadata.getObsoletes().equals(guid1));
2519
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2520
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2521
    }
2522
    
2523
    /**
2524
     * Test to create a metacat object which uses the isotc211 noaa variant.
2525
     * @throws Exception
2526
     */
2527
    public void testCreateNOAAObject() throws Exception {
2528
        Session session = getTestSession();
2529
        Identifier guid = new Identifier();
2530
        guid.setValue("testNoaa." + System.currentTimeMillis());
2531
        InputStream object = new FileInputStream("test/sciencemetadata-noaa.xml");
2532
        InputStream sysmetaInput = new FileInputStream("test/sysmeta-noaa.xml");
2533
        SystemMetadata sysmeta = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmetaInput);
2534
        sysmeta.setIdentifier(guid);
2535
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
2536
        assertTrue(pid.getValue().equals(guid.getValue()));
2537
    }
2538
    
2539
    
2540
    /**
2541
     * Test the permission control on the updateSystemMetadata method
2542
     * @throws Exception
2543
     */
2544
    public void testPermissionOfUpdateSystemmeta() throws Exception {
2545
        String str = "object1";
2546
       
2547
        Date date = new Date();
2548
        Thread.sleep(2000);
2549
        //insert a test document
2550
        Session session = getTestSession();
2551
        Identifier guid = new Identifier();
2552
        guid.setValue(generateDocumentId());
2553
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2554
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2555
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2556
        //Test the generating object succeeded. 
2557
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2558
        
2559
        //Test cn session -success
2560
        Session cnSession= getCNSession();
2561
        MNodeService.getInstance(request).updateSystemMetadata(cnSession, guid, metadata);
2562
        
2563
        //Test mn session - success
2564
        Session mnSession = getMNSession();
2565
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2566
        MNodeService.getInstance(request).updateSystemMetadata(mnSession, guid, metadata);
2567
        
2568
        //Test the owner session -success
2569
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2570
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2571
        
2572
        //Test another session -failed
2573
        Session anotherSession = getAnotherSession();
2574
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2575
        try {
2576
             MNodeService.getInstance(request).updateSystemMetadata(anotherSession, guid, metadata);
2577
            fail("Another user can't update the system metadata");
2578
        } catch (NotAuthorized e)  {
2579
            
2580
        }
2581
       
2582
    }
2583
    
2584
    
2585
    /**
2586
     * Test if the updateSystemmetadata method can catch the circular obsoletes fields chain
2587
     */
2588
    public void testUpdateSystemMetadataWithCircularObsoletesChain() throws Exception{
2589
        
2590
        Date date = new Date();
2591
        Thread.sleep(1000);
2592
        String str = "object1";
2593
        //insert a test document
2594
        Session session = getTestSession();
2595
        Identifier guid = new Identifier();
2596
        guid.setValue(generateDocumentId());
2597
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2598
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2599
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2600
        
2601
        //Test the generating object succeeded. 
2602
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2603
        Thread.sleep(1000);
2604
        Identifier guid1 = new Identifier();
2605
        guid1.setValue(generateDocumentId());
2606
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2607
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2608
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2609
        //Test the generating object succeeded. 
2610
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2611
        
2612
        Thread.sleep(1000);
2613
        Identifier guid2 = new Identifier();
2614
        guid2.setValue(generateDocumentId());
2615
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2616
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2617
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2618
        //Test the generating object succeeded. 
2619
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2620
        
2621
        // test to create a circular obsoletes chain: guid obsoletes guid
2622
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2623
        metadata.setObsoletes(guid);
2624
        try {
2625
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2626
             fail("We can't update the system metadata which the obsoletes field is itself");
2627
       } catch (InvalidRequest e)  {
2628
           assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2629
       }
2630
       
2631
       // guid obsolete guid1
2632
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2633
       metadata.setObsoletes(guid1);
2634
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2635
       
2636
       // guid1 obsoletedBy guid
2637
       // guid1  obsoletes  guid2
2638
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2639
       metadata.setObsoletes(guid2);
2640
       metadata.setObsoletedBy(guid);
2641
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2642
       
2643
       // crete a circular obsolete chain:
2644
       // guid2 obsoletes guid
2645
       //guid2 obsoletedBy guid1
2646
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2647
       metadata.setObsoletes(guid);
2648
       metadata.setObsoletedBy(guid1);
2649
       
2650
       try {
2651
           MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2652
           fail("We can't update the system metadata which has a circular obsoletes chain");
2653
      } catch (InvalidRequest e)  {
2654
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2655
      }
2656
       
2657
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2658
       metadata.setObsoletedBy(guid1);
2659
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2660
    }
2661
    
2662
    
2663
    
2664
    
2665
    /**
2666
     * Test if the updateSystemmetadata method can catch the circular obsoletedBy chain
2667
     */
2668
    public void testUpdateSystemMetadataWithCircularObsoletedByChain() throws Exception{
2669
        
2670
        Date date = new Date();
2671
        Thread.sleep(1000);
2672
        String str = "object1";
2673
        //insert a test document
2674
        Session session = getTestSession();
2675
        Identifier guid = new Identifier();
2676
        guid.setValue(generateDocumentId());
2677
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2678
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2679
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2680
        
2681
        //Test the generating object succeeded. 
2682
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2683
        Thread.sleep(1000);
2684
        Identifier guid1 = new Identifier();
2685
        guid1.setValue(generateDocumentId());
2686
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2687
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2688
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2689
        //Test the generating object succeeded. 
2690
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2691
        
2692
        Thread.sleep(1000);
2693
        Identifier guid2 = new Identifier();
2694
        guid2.setValue(generateDocumentId());
2695
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2696
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2697
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2698
        //Test the generating object succeeded. 
2699
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2700
        
2701
      
2702
       // guid obsolete guid1
2703
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2704
       metadata.setObsoletes(guid1);
2705
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2706
       
2707
       // guid1  obsoletes  guid2
2708
       // guid1 obsoletedBy guid1 (a circular chain)
2709
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2710
       metadata.setObsoletes(guid2);
2711
       metadata.setObsoletedBy(guid1);
2712
       try {
2713
           MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2714
            fail("We can't update the system metadata which the obsoletes field is itself");
2715
      } catch (InvalidRequest e)  {
2716
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2717
      }
2718
       
2719
       
2720
       // guid1  obsoletes  guid2
2721
       // guid1 obsoletedBy guid 
2722
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2723
       metadata.setObsoletes(guid2);
2724
       metadata.setObsoletedBy(guid);
2725
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2726
      
2727
       
2728
       //guid2 obsoletedBy guid1
2729
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2730
       metadata.setObsoletedBy(guid1);
2731
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2732
       
2733
       
2734
       //guid2 obsoletedBy guid1
2735
       //guid1 obsoletedBy guid
2736
       //guid  obsoletedBy guid2 (created a circle)
2737
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2738
       metadata.setObsoletedBy(guid2);
2739
       try {
2740
           MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2741
           fail("We can't update the system metadata which has a circular obsoletes chain");
2742
      } catch (InvalidRequest e)  {
2743
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2744
      }
2745
       
2746
   
2747
    }
2748
}
(5-5/11)