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.dataone.CNodeService;
32
import edu.ucsb.nceas.metacat.dataone.MNodeService;
33
import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
34
import edu.ucsb.nceas.metacat.service.ServiceService;
35
import edu.ucsb.nceas.utilities.IOUtil;
36
import gov.loc.repository.bagit.Bag;
37
import gov.loc.repository.bagit.BagFactory;
38
import gov.loc.repository.bagit.BagFile;
39
import gov.loc.repository.bagit.Manifest;
40

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

    
60
import junit.framework.Test;
61
import junit.framework.TestSuite;
62

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

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

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

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

    
195
  /**
196
   * Initial blank test
197
   */
198
  public void initialize() {
199
    assertTrue(1 == 1);
200
    
201
  }
202
  
203
  /**
204
   * Test getting a known object
205
   */
206
  public void testGet() {
207
    printTestHeader("testGet");
208

    
209
    try {
210
      Session session = getTestSession();
211
      Identifier guid = new Identifier();
212
      guid.setValue("testGet." + System.currentTimeMillis());
213
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
214
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
215
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
216
      InputStream result = MNodeService.getInstance(request).get(session, guid);
217
      // go back to beginning of original stream
218
      object.reset();
219
      // check
220
      assertTrue(object.available() > 0);
221
      assertTrue(result.available() > 0);
222
      assertTrue(IOUtils.contentEquals(result, object));
223
      
224
    } catch (UnsupportedEncodingException e) {
225
      e.printStackTrace();
226
      fail("Unexpected error: " + e.getMessage());
227

    
228
    } catch (InvalidToken e) {
229
      e.printStackTrace();
230
      fail("Unexpected error: " + e.getMessage());
231
      
232
    } catch (ServiceFailure e) {
233
      e.printStackTrace();
234
      fail("Unexpected error: " + e.getMessage());
235
      
236
    } catch (NotAuthorized e) {
237
      e.printStackTrace();
238
      fail("Unexpected error: " + e.getMessage());
239
      
240
    } catch (IdentifierNotUnique e) {
241
      e.printStackTrace();
242
      fail("Unexpected error: " + e.getMessage());
243
      
244
    } catch (UnsupportedType e) {
245
      e.printStackTrace();
246
      fail("Unexpected error: " + e.getMessage());
247
      
248
    } catch (InsufficientResources e) {
249
      e.printStackTrace();
250
      fail("Unexpected error: " + e.getMessage());
251
      
252
    } catch (InvalidSystemMetadata e) {
253
      e.printStackTrace();
254
      fail("Unexpected error: " + e.getMessage());
255
      
256
    } catch (NotImplemented e) {
257
      e.printStackTrace();
258
      fail("Unexpected error: " + e.getMessage());
259
      
260
    } catch (InvalidRequest e) {
261
      e.printStackTrace();
262
      fail("Unexpected error: " + e.getMessage());
263
      
264
    } catch (NotFound e) {
265
      e.printStackTrace();
266
      fail("Unexpected error: " + e.getMessage());
267
      
268
    } catch (Exception e) {
269
      e.printStackTrace();
270
      fail("Unexpected error: " + e.getMessage());
271
      
272
    }
273

    
274
  }
275

    
276
  /**
277
   * Test getting the system metadata of an object
278
   */
279
  public void testGetSystemMetadata() {    
280
    printTestHeader("testGetSystemMetadata");
281

    
282
    try {
283
      Session session = getTestSession();
284
      Identifier guid = new Identifier();
285
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
286
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
287
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
288
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
289
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
290
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
291
      assertEquals(newsysmeta.getSeriesId(), null);
292
      
293
    } catch (UnsupportedEncodingException e) {
294
      e.printStackTrace();
295
      fail("Unexpected error: " + e.getMessage());
296

    
297
    } catch (InvalidToken e) {
298
      e.printStackTrace();      
299
      fail("Unexpected error: " + e.getMessage());
300

    
301
    } catch (ServiceFailure e) {
302
      e.printStackTrace();
303
      fail("Unexpected error: " + e.getMessage());
304

    
305
    } catch (NotAuthorized e) {
306
      e.printStackTrace();
307
      fail("Unexpected error: " + e.getMessage());
308

    
309
    } catch (IdentifierNotUnique e) {
310
      e.printStackTrace();
311
      fail("Unexpected error: " + e.getMessage());
312
      
313
    } catch (UnsupportedType e) {
314
      e.printStackTrace();
315
      fail("Unexpected error: " + e.getMessage());
316

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

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

    
325
    } catch (NotImplemented e) {
326
      e.printStackTrace();
327
      fail("Unexpected error: " + e.getMessage());
328

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

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

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

    
341
    }
342
    
343
  }
344

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

    
387
    } catch (InvalidToken e) {
388
      e.printStackTrace();
389
      fail("Unexpected error: " + e.getMessage());
390

    
391
    } catch (ServiceFailure e) {
392
      e.printStackTrace();
393
      fail("Unexpected error: " + e.getMessage());
394

    
395
    } catch (NotAuthorized e) {
396
      e.printStackTrace();
397
      fail("Unexpected error: " + e.getMessage());
398

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

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

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

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

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

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

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

    
427
    }
428
      
429
  }
430

    
431
  /**
432
   * test object deletion
433
   */
434
  public void testDelete() {
435
    printTestHeader("testDelete");
436

    
437
    try {
438
      Session session = getTestSession();
439
      Identifier guid = new Identifier();
440
      guid.setValue("testDelete." + System.currentTimeMillis());
441
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
442
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
443
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
444
      
445
      // use MN admin to delete
446
      session = getMNSession();
447
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
448
      assertEquals(pid.getValue(), deletedPid.getValue());
449
      // check that we cannot get the object
450
      session = getTestSession();
451
      InputStream deletedObject = null;
452
      try {
453
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
454
      } catch (NotFound nf) {
455
    	  // this is expected
456
      }
457
	  assertNull(deletedObject);
458
      
459
    } catch (UnsupportedEncodingException e) {
460
      e.printStackTrace();
461
      
462
    } catch (Exception e) {
463
      e.printStackTrace();
464
      fail("Unexpected error: " + e.getMessage());
465

    
466
    } 
467

    
468
  }
469
  
470
  public void testArchive() throws Exception {
471
          Session session = getTestSession();
472
          Identifier guid = new Identifier();
473
          guid.setValue("testUpdate." + System.currentTimeMillis());
474
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
475
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
476
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
477
          MNodeService.getInstance(request).archive(session, guid);
478
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
479
          assertTrue(result.getArchived());
480
  }
481

    
482
  /**
483
   * Test object updating
484
   */
485
  public void testUpdate() {
486
    printTestHeader("testUpdate");
487
    
488
    try {
489
      Session session = getTestSession();
490
      Identifier guid = new Identifier();
491
      guid.setValue("testUpdate." + System.currentTimeMillis());
492
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
493
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
494
      Identifier newPid = new Identifier();
495
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
496
      Identifier pid = 
497
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
498
      
499
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
500
      newSysMeta.setArchived(true);
501
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
502
      // do the update
503
      Identifier updatedPid = 
504
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
505
      
506
      // get the updated system metadata
507
      SystemMetadata updatedSysMeta = 
508
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
509

    
510
      assertEquals(updatedPid.getValue(), newPid.getValue());
511
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
512
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue())); 
513
      
514
      //try to update an archived object and need to get an exception
515
      Identifier newPid2 = new Identifier();
516
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
517
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
518
      try {
519
           updatedPid = 
520
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
521
           fail("update an archived object should get an invalid request exception");
522
      } catch (Exception ee) {
523
          assertTrue( ee instanceof InvalidRequest);
524
      }
525
      
526
      //update the authoritative node on the existing pid (newPid)
527
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
528
      BigInteger version = meta.getSerialVersion();
529
      version = version.add(BigInteger.ONE);
530
      newSysMeta.setSerialVersion(version);
531
      NodeReference newMN = new NodeReference();
532
      newMN.setValue("urn:node:river1");
533
      newSysMeta.setAuthoritativeMemberNode(newMN);
534
      newSysMeta.setArchived(false);
535
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
536
      try {
537
          updatedPid = 
538
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
539
          fail("update an object on non-authoritatvie node should get anexception");
540
     } catch (Exception ee) {
541
         assertTrue( ee instanceof NotAuthorized);
542
     }
543
     //cn can succeed even though it updates an object on the non-authoritative node.
544
     Session cnSession = getCNSession();
545
     updatedPid = 
546
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
547
     assertEquals(updatedPid.getValue(), newPid2.getValue());
548
    } catch (UnsupportedEncodingException e) {
549
      e.printStackTrace();
550
      fail("Unexpected error: " + e.getMessage());
551

    
552
    } catch (InvalidToken e) {
553
      e.printStackTrace();
554
      fail("Unexpected error: " + e.getMessage());
555

    
556
    } catch (ServiceFailure e) {
557
      e.printStackTrace();
558
      fail("Unexpected error: " + e.getMessage());
559

    
560
    } catch (NotAuthorized e) {
561
      e.printStackTrace();
562
      fail("Unexpected error: " + e.getMessage());
563

    
564
    } catch (IdentifierNotUnique e) {
565
      e.printStackTrace();
566
      fail("Unexpected error: " + e.getMessage());
567

    
568
    } catch (UnsupportedType e) {
569
      e.printStackTrace();
570
      fail("Unexpected error: " + e.getMessage());
571

    
572
    } catch (InsufficientResources e) {
573
      e.printStackTrace();
574
      fail("Unexpected error: " + e.getMessage());
575

    
576
    } catch (InvalidSystemMetadata e) {
577
      e.printStackTrace();
578
      fail("Unexpected error: " + e.getMessage());
579

    
580
    } catch (NotImplemented e) {
581
      e.printStackTrace();
582
      fail("Unexpected error: " + e.getMessage());
583

    
584
    } catch (InvalidRequest e) {
585
      e.printStackTrace();
586
      fail("Unexpected error: " + e.getMessage());
587

    
588
    } catch (Exception e) {
589
      e.printStackTrace();
590
      fail("Unexpected error: " + e.getMessage());
591

    
592
    }
593
  }
594

    
595
  /**
596
   * We currently expect this unit test to fail because it should rely on a different member node
597
   * to retrieve the object from. Currently it gets the object from itself and throws 
598
   * and expected error for duplicate entry.
599
   * 
600
   */
601
  public void testReplicate() {
602
      printTestHeader("testReplicate");
603
      try {
604
        Session session = getTestSession();
605
        Identifier guid = new Identifier();
606
        guid.setValue("testReplicate." + System.currentTimeMillis());
607
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
608
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
609
        // save locally
610
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
611
        // get our node reference (attempting to replicate with self)
612
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
613
        // attempt to replicate with ourselves -- this should fail!
614
      boolean result = false;
615
      try {
616
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
617
      } catch (Exception inu) {
618
        // we are expecting this to fail since we already have the doc
619
        result = true;
620
      }
621
      assertTrue(result);
622
      } catch (Exception e) {
623
        e.printStackTrace();
624
      fail("Probably not yet implemented: " + e.getMessage());
625
    }
626
  }
627

    
628
  /**
629
   * Test describing an object
630
   */
631
  public void testDescribe() {
632
    printTestHeader("testDescribe");
633

    
634
    try {
635
      Session session = getTestSession();
636
      Identifier guid = new Identifier();
637
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
638
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
639
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
640
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
641
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
642
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
643
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
644
      
645
    } catch (UnsupportedEncodingException e) {
646
      e.printStackTrace();
647
      fail("Unexpected error: " + e.getMessage());
648

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

    
653
    } catch (ServiceFailure e) {
654
      e.printStackTrace();
655
      fail("Unexpected error: " + e.getMessage());
656

    
657
    } catch (NotAuthorized e) {
658
      e.printStackTrace();
659
      fail("Unexpected error: " + e.getMessage());
660

    
661
    } catch (IdentifierNotUnique e) {
662
      e.printStackTrace();
663
      fail("Unexpected error: " + e.getMessage());
664
      
665
    } catch (UnsupportedType e) {
666
      e.printStackTrace();
667
      fail("Unexpected error: " + e.getMessage());
668

    
669
    } catch (InsufficientResources e) {
670
      e.printStackTrace();
671
      fail("Unexpected error: " + e.getMessage());
672

    
673
    } catch (InvalidSystemMetadata e) {
674
      e.printStackTrace();
675
      fail("Unexpected error: " + e.getMessage());
676

    
677
    } catch (NotImplemented e) {
678
      e.printStackTrace();
679
      fail("Unexpected error: " + e.getMessage());
680

    
681
    } catch (InvalidRequest e) {
682
      e.printStackTrace();
683
      fail("Unexpected error: " + e.getMessage());
684

    
685
    } catch (NotFound e) {
686
      e.printStackTrace();
687
      fail("Unexpected error: " + e.getMessage());
688

    
689
    } catch (Exception e) {
690
      e.printStackTrace();
691
      fail("Unexpected error: " + e.getMessage());
692

    
693
    }
694
  }
695

    
696
  /**
697
   * Test getting the checksum of an object
698
   */
699
  public void testGetChecksum() {
700
    printTestHeader("testGetChecksum");
701

    
702
    try {
703
      Session session = getTestSession();
704
      Identifier guid = new Identifier();
705
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
706
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
707
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
708
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
709
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
710
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
711
    
712
    } catch (UnsupportedEncodingException e) {
713
      e.printStackTrace();
714
      fail("Unexpected error: " + e.getMessage());
715

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

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

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

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

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

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

    
740
    } catch (InvalidSystemMetadata e) {
741
      e.printStackTrace();
742
      fail("Unexpected error: " + e.getMessage());
743

    
744
    } catch (NotImplemented e) {
745
      e.printStackTrace();
746
      fail("Unexpected error: " + e.getMessage());
747

    
748
    } catch (InvalidRequest e) {
749
      e.printStackTrace();
750
      fail("Unexpected error: " + e.getMessage());
751

    
752
    } catch (NotFound e) {
753
      e.printStackTrace();
754
      fail("Unexpected error: " + e.getMessage());
755

    
756
    } catch (Exception e) {
757
      e.printStackTrace();
758
      fail("Unexpected error: " + e.getMessage());
759

    
760
    }
761
    
762
  }
763

    
764
  /**
765
   * Testing listing objects on the Member Node
766
   */
767
  public void testListObjects() {
768
      printTestHeader("testListObjects");
769
  
770
      try {
771
  
772
        Session session = getTestSession();
773
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
774
        Date startTime = sdf.parse("2010-01-01");
775
        Date endTime = new Date();
776
        ObjectFormatIdentifier objectFormatId = null;
777
        boolean replicaStatus = false;
778
        int start = 0;
779
        int count = 1;
780
      
781
        // insert at least one object 
782
        testCreate();
783
        // now check that we have at least one
784
        ObjectList objectList = 
785
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
786
              objectFormatId, null, replicaStatus, start, count);
787
        assertNotNull(objectList);
788
        assertTrue(objectList.getCount() == count);
789
        assertTrue(objectList.getStart() == 0);
790
        assertTrue(objectList.getTotal() >= 1);
791
        
792
      } catch (Exception e) {
793
        e.printStackTrace();
794
        fail("Unexpected error: " + e.getMessage());
795
  
796
      }
797
  }
798

    
799
  public void testGetCapabilities() {
800
      printTestHeader("testGetCapabilities");
801
    try {
802
      Node node = MNodeService.getInstance(request).getCapabilities();
803
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
804
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
805
      assertNotNull(node);
806
      // TODO: should probably test other parts of the node information
807
      
808
    } catch (JiBXException e) {
809
        e.printStackTrace();
810
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
811
        
812
    } catch (IOException e) {
813
        e.printStackTrace();
814
        fail("The node instance couldn't be read correctly:" + e.getMessage());
815
        
816
    } catch (Exception e) {
817
        e.printStackTrace();
818
        fail("Probably not yet implemented: " + e.getMessage());
819
        
820
    }
821
    
822
  }
823

    
824
  public void testPing() {
825

    
826
    try {
827
      Date mnDate = MNodeService.getInstance(request).ping();
828
      assertTrue(mnDate != null);
829
      
830
    } catch (NotImplemented e) {
831
      e.printStackTrace();
832
      fail("Unexpected error: " + e.getMessage());
833

    
834
    } catch (ServiceFailure e) {
835
      e.printStackTrace();
836
      fail("Unexpected error: " + e.getMessage());
837

    
838
    }  catch (InsufficientResources e) {
839
      e.printStackTrace();
840
      fail("Unexpected error: " + e.getMessage());
841

    
842
    }
843
    
844
  }
845

    
846
  public void testSynchronizationFailed() {
847
    printTestHeader("testSynchronizationFailed");
848
    try {
849
        Session session = getTestSession();
850
        
851
        // create the object
852
        Identifier pid = new Identifier();
853
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
854
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
855
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
856
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
857
        assertEquals(retPid.getValue(), pid.getValue());
858
        
859
        // pretend the sync failed, act as CN
860
      SynchronizationFailed syncFailed = 
861
        new SynchronizationFailed("0000", "Testing Synch Failure");
862
      syncFailed.setPid(pid.getValue());
863
      session = getCNSession();
864
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
865
    } catch (Exception e) {
866
      e.printStackTrace();
867
        fail("Unexpected error: " + e.getMessage());
868
    }
869

    
870
  }
871

    
872
  public void testSystemMetadataChanged() {
873
      printTestHeader("testSystemMetadataChanged");
874
      try {
875
          Session session = getTestSession();
876
          
877
          // create the object
878
          Identifier pid = new Identifier();
879
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
880
          Identifier sid = new Identifier();
881
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
882
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
883
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
884
          sysmeta.setSeriesId(sid);
885
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
886
          assertEquals(retPid.getValue(), pid.getValue());
887
          
888
          // pretend the system metadata changed on the CN
889
          MNodeService.getInstance(request).systemMetadataChanged(session, 
890
                  retPid, 5000L, Calendar.getInstance().getTime());
891
          MNodeService.getInstance(request).systemMetadataChanged(session, 
892
                  sid, 5000L, Calendar.getInstance().getTime());
893
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
894
                  retPid, 5000L, Calendar.getInstance().getTime());
895
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
896
                  sid, 5000L, Calendar.getInstance().getTime());
897
          
898
      } catch (Exception e) {
899
          if (e instanceof NotAuthorized) {
900
              // only CN subjects can call this
901
              // TODO: use a CN certificate in the tests
902
          } else {
903
              fail("Unexpected error: " + e.getMessage());
904
              
905
          }
906
      }
907

    
908
    }
909

    
910
  public void testGetLogRecords() {
911
    printTestHeader("testLogRecords");
912

    
913
    try {
914
	    Log log = null;
915
	    Session session = getCNSession();
916
	    Date fromDate = new Date();
917
	    Calendar calendar = Calendar.getInstance();
918
	    calendar.setTime(fromDate);
919
	    calendar.roll(Calendar.YEAR, false);
920
	    fromDate = calendar.getTime();
921
	    Date toDate = new Date();
922
	    Event event = Event.CREATE;
923
	    int start = 0;
924
	    int count = 1;
925
    
926
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
927
        event.xmlValue(), null, start, count);
928
      
929
      assertNotNull(log);      
930
      assertTrue(log.getCount() == count);
931
      assertTrue(log.getStart() == start);
932
      assertTrue(log.getTotal() >= 1);
933
        
934
    } catch (Exception e) {
935
      e.printStackTrace();
936
      fail("Unexpected error: " + e.getMessage());
937

    
938
    }
939
  }
940

    
941
  /**
942
   * Testing setting access on a known object
943
   */
944
  public void testSetAccessPolicy() {
945
    printTestHeader("testSetAccess");
946
    
947
    //boolean accessWasSet = false;
948
    //
949
    //try {
950
    //  // create an object to set access on
951
    //  Session session = getTestSession();
952
    //  Identifier guid = new Identifier();
953
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
954
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
955
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
956
    //  Identifier pid = 
957
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
958
    //  // set the access
959
    //  AccessPolicy accessPolicy = new AccessPolicy();
960
    //  AccessRule allow = new AccessRule();
961
    //  allow.addPermission(Permission.WRITE);
962
    //  Subject publicSubject = new Subject();
963
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
964
    //  allow.addSubject(publicSubject);
965
    //  accessPolicy.addAllow(allow);
966
    //  
967
    //  accessWasSet = 
968
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
969
    //  assertTrue(accessWasSet);
970
    //  // test that it is enforced
971
    //  session.setSubject(publicSubject);
972
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
973
    //  assertTrue(isAuthorized);
974
    //
975
    //} catch (UnsupportedEncodingException e) {
976
    //  e.printStackTrace();
977
    //  
978
    //} catch (InvalidToken e) {
979
    //  e.printStackTrace();
980
    //  fail("Unexpected error: " + e.getMessage());
981
    //  
982
    //} catch (ServiceFailure e) {
983
    //  e.printStackTrace();
984
    //  fail("Unexpected error: " + e.getMessage());
985
    //  
986
    //} catch (NotAuthorized e) {
987
    //  e.printStackTrace();
988
    //  fail("Unexpected error: " + e.getMessage());
989
    //  
990
    //} catch (IdentifierNotUnique e) {
991
    //  e.printStackTrace();
992
    //  fail("Unexpected error: " + e.getMessage());
993
    //  
994
    //} catch (UnsupportedType e) {
995
    //  e.printStackTrace();
996
    //  fail("Unexpected error: " + e.getMessage());
997
    //  
998
    //} catch (InsufficientResources e) {
999
    //  e.printStackTrace();
1000
    //  fail("Unexpected error: " + e.getMessage());
1001
    //  
1002
    //} catch (InvalidSystemMetadata e) {
1003
    //  e.printStackTrace();
1004
    //  fail("Unexpected error: " + e.getMessage());
1005
    //  
1006
    //} catch (NotImplemented e) {
1007
    //  e.printStackTrace();
1008
    //  fail("Unexpected error: " + e.getMessage());
1009
    //  
1010
    //} catch (InvalidRequest e) {
1011
    //  e.printStackTrace();
1012
    //  fail("Unexpected error: " + e.getMessage());
1013
    //  
1014
    //} catch (NotFound e) {
1015
    //  e.printStackTrace();
1016
    //  fail("Unexpected error: " + e.getMessage());
1017
    //  
1018
    //} catch (Exception e) {
1019
    //  e.printStackTrace();
1020
    //  fail("Unexpected error: " + e.getMessage());
1021
    //  
1022
    //}
1023
      
1024
  }
1025

    
1026
  /**
1027
   * Test if a subject is authorized to read a known object
1028
   */
1029
  public void testIsAuthorized() {
1030
    printTestHeader("testIsAuthorized");
1031
    
1032
    try {
1033
      Session session = getTestSession();
1034
      Identifier guid = new Identifier();
1035
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1036
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1037
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1038
      //non-public readable
1039
      AccessPolicy accessPolicy = new AccessPolicy();
1040
      AccessRule allow = new AccessRule();
1041
      allow.addPermission(Permission.READ);
1042
      Subject subject = new Subject();
1043
      subject.setValue("cn=test2,dc=dataone,dc=org");
1044
      allow.addSubject(subject);
1045
      accessPolicy.addAllow(allow);
1046
      sysmeta.setAccessPolicy(accessPolicy);
1047
      Identifier pid = 
1048
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1049
      boolean isAuthorized = 
1050
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1051
      assertEquals(isAuthorized, true);
1052
      isAuthorized = 
1053
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1054
      assertEquals(isAuthorized, true);
1055
      try {
1056
          isAuthorized = 
1057
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1058
          fail("we can reach here");
1059
      } catch(NotAuthorized ee) {
1060
          
1061
      }
1062
      
1063
     
1064
      Session session2= getAnotherSession();
1065
      isAuthorized = 
1066
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1067
      assertEquals(isAuthorized, true);
1068
     
1069
      try {
1070
          isAuthorized = 
1071
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1072
          fail("we can reach here");
1073
      } catch(NotAuthorized ee) {
1074
          
1075
      }
1076
      
1077
    
1078
      try {
1079
          isAuthorized = 
1080
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1081
          fail("we can reach here");
1082
      } catch(NotAuthorized ee) {
1083
          
1084
      }
1085
     
1086
      
1087
    } catch (UnsupportedEncodingException e) {
1088
      e.printStackTrace();
1089
      fail("Unexpected error: " + e.getMessage());
1090

    
1091
    } catch (InvalidToken e) {
1092
      e.printStackTrace();
1093
      fail("Unexpected error: " + e.getMessage());
1094

    
1095
    } catch (ServiceFailure e) {
1096
      e.printStackTrace();
1097
      fail("Unexpected error: " + e.getMessage());
1098

    
1099
    } catch (NotAuthorized e) {
1100
      e.printStackTrace();
1101
      fail("Unexpected error: " + e.getMessage());
1102

    
1103
    } catch (IdentifierNotUnique e) {
1104
      e.printStackTrace();
1105
      fail("Unexpected error: " + e.getMessage());
1106

    
1107
    } catch (UnsupportedType e) {
1108
      e.printStackTrace();
1109
      fail("Unexpected error: " + e.getMessage());
1110

    
1111
    } catch (InsufficientResources e) {
1112
      e.printStackTrace();
1113
      fail("Unexpected error: " + e.getMessage());
1114

    
1115
    } catch (InvalidSystemMetadata e) {
1116
      e.printStackTrace();
1117
      fail("Unexpected error: " + e.getMessage());
1118

    
1119
    } catch (NotImplemented e) {
1120
      e.printStackTrace();
1121
      fail("Unexpected error: " + e.getMessage());
1122

    
1123
    } catch (InvalidRequest e) {
1124
      e.printStackTrace();
1125
      fail("Unexpected error: " + e.getMessage());
1126

    
1127
    } catch (Exception e) {
1128
      e.printStackTrace();
1129
      fail("Unexpected error: " + e.getMessage());
1130

    
1131
    }
1132
  }
1133
  
1134
  /**
1135
   * Test if node admin is authorized to read a known object
1136
   */
1137
  public void testIsAdminAuthorized() {
1138
    printTestHeader("testIsAdminAuthorized");
1139
    
1140
    try {
1141
      Session session = getTestSession();
1142
      Identifier guid = new Identifier();
1143
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1144
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1145
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1146
      Identifier pid = 
1147
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1148
      
1149
      // test as public - read
1150
      boolean isAuthorized = 
1151
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1152
      assertEquals(isAuthorized, true);
1153
      
1154
      // test as public - change perm
1155
      isAuthorized = 
1156
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1157
      assertEquals(isAuthorized, false);
1158
      
1159
      //test write by another session
1160
      Session session2 = getAnotherSession();
1161
      isAuthorized = 
1162
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1163
            assertEquals(isAuthorized, false);
1164
      
1165
      // test as admin
1166
      isAuthorized = 
1167
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1168
    	      assertEquals(isAuthorized, true);
1169
     // test as cn
1170
    	isAuthorized = 
1171
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1172
    	              assertEquals(isAuthorized, true);      
1173
      
1174
    } catch (Exception e) {
1175
      e.printStackTrace();
1176
      fail("Unexpected error: " + e.getMessage());
1177

    
1178
    } 
1179
  }
1180

    
1181
  
1182
  public void testIsEquivIdentityAuthorized() {
1183
      printTestHeader("testIsEquivIdentityAuthorized");
1184

    
1185
      try {
1186
          Session session = new Session();
1187
          Subject s = new Subject();
1188
          s.setValue("cn=test,dc=dataone,dc=org");
1189
          session.setSubject(s);
1190
          
1191
          Identifier pid = new Identifier();
1192
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1193
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1194
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1195
          
1196
          // reset the access policy to only allow 'self' read (no public)
1197
          AccessPolicy ap = new AccessPolicy();
1198
          AccessRule ar = new AccessRule();
1199
          List<Subject> sList = new ArrayList<Subject>();
1200
          sList.add(session.getSubject());
1201
          ar.setSubjectList(sList);
1202
          List<Permission> permList = new ArrayList<Permission>();
1203
          permList.add(Permission.CHANGE_PERMISSION);
1204
          ar.setPermissionList(permList);
1205
          ap.addAllow(ar);
1206
          sysmeta.setAccessPolicy(ap);
1207
          
1208
          // save it
1209
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1210
          assertEquals(pid.getValue(), retPid.getValue());
1211
          
1212
          //check it against an equivalent identity not listed in the access policy
1213
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1214
          SubjectInfo subjectInfo = new SubjectInfo();
1215
          Person person = new Person();
1216
          person.setSubject(session.getSubject());
1217
          List<String> givenNames = new ArrayList<String>();
1218
          givenNames.add("New");
1219
          person.setGivenNameList(givenNames);
1220
          person.setFamilyName("Subject");
1221
          
1222
          // add equivalent identities
1223
          List<Subject> equivIdentities = new ArrayList<Subject>();
1224
          Subject mappedSubject2 = new Subject();
1225
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1226
          equivIdentities.add(mappedSubject2);
1227
          
1228
          Subject mappedSubject = new Subject();
1229
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1230
          equivIdentities.add(mappedSubject);          
1231
          
1232
          person.setEquivalentIdentityList(equivIdentities);
1233
          
1234
          List<Person> personList = new ArrayList<Person>();
1235
          personList.add(person);
1236
          subjectInfo.setPersonList(personList);
1237
          
1238
          // update the session to include subject info with a mapped identity
1239
          session.setSubjectInfo(subjectInfo);
1240
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1241
          assertTrue(result);
1242
        
1243
    } catch (Exception e) {
1244
        e.printStackTrace();
1245
        
1246
    }
1247
    
1248
  }
1249

    
1250
/**
1251
   * Test object creation failure when there is a space in the identifier
1252
   */
1253
  public void testCreateInvalidIdentifier() {
1254
    printTestHeader("testCreateInvalidIdentifier");
1255
    
1256
    try {
1257
      Session session = getTestSession();
1258
      Identifier guid = new Identifier();
1259
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1260
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1261
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1262
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1263
      fail("Should not be able to create with whitespace in indentifier");
1264
    } catch (InvalidRequest e) {
1265
    	// expect that this request fails
1266
        assertTrue(true);
1267
    } catch (Exception e) {
1268
      e.printStackTrace();
1269
      fail("Unexpected error: " + e.getMessage());
1270
    }
1271
      
1272
  }
1273
  
1274
	/**
1275
	 * Test getting a known object
1276
	 */
1277
	public void testGetPackage() {
1278
		printTestHeader("testGetPackage");
1279

    
1280
		try {
1281
			Session session = getTestSession();
1282
			Identifier guid = new Identifier();
1283
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1284
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1285
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1286
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1287
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1288
			format.setValue("application/bagit-097");
1289
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1290
			File bagFile = File.createTempFile("bagit.", ".zip");
1291
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1292
			BagFactory bagFactory = new BagFactory();
1293
			Bag bag = bagFactory.createBag(bagFile);
1294
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1295
			
1296
			// go back to beginning of original stream
1297
			object.reset();
1298
			// check
1299
			assertTrue(object.available() > 0);
1300
			assertTrue(result.available() > 0);
1301
			assertTrue(IOUtils.contentEquals(result, object));
1302
			
1303
			// clean up
1304
			bagFile.delete();
1305

    
1306
		} catch (Exception e) {
1307
			e.printStackTrace();
1308
			fail("Unexpected error: " + e.getMessage());
1309
		}
1310
	}
1311
	
1312
	
1313
	/**
1314
	 * Test getting a known object
1315
	 */
1316
	public void testGetOREPackage() {
1317
		printTestHeader("testGetOREPackage");
1318

    
1319
		try {
1320
			
1321
			// construct the ORE package
1322
			Identifier resourceMapId = new Identifier();
1323
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1324
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1325
			Identifier metadataId = new Identifier();
1326
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1327
			List<Identifier> dataIds = new ArrayList<Identifier>();
1328
			Identifier dataId = new Identifier();
1329
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1330
			Identifier dataId2 = new Identifier();
1331
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1332
			dataIds.add(dataId);
1333
			dataIds.add(dataId2);
1334
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1335
			idMap.put(metadataId, dataIds);
1336
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1337
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1338
			assertNotNull(resourceMap);
1339
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1340
			assertNotNull(rdfXml);
1341
			
1342
			Session session = getTestSession();
1343
			InputStream object = null;
1344
			SystemMetadata sysmeta = null;
1345
			
1346
			// save the data objects (data just contains their ID)
1347
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1348
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1349
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1350
			// second data file
1351
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1352
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1353
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1354
			// metadata file
1355
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1356
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1357
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1358
						
1359
			// save the ORE object
1360
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1361
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1362
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1363
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1364
			
1365
			// get the package we uploaded
1366
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1367
            format.setValue("application/bagit-097");
1368
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1369
			File bagFile = File.createTempFile("bagit.", ".zip");
1370
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1371
			BagFactory bagFactory = new BagFactory();
1372
			Bag bag = bagFactory.createBag(bagFile);
1373
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1374
			while (manifestIter.hasNext()) {
1375
				String filepath = manifestIter.next().getFilepath();
1376
				BagFile entryFile = bag.getBagFile(filepath);
1377
				InputStream result = entryFile.newInputStream();
1378
				// check ORE
1379
				if (filepath.contains(resourceMapId.getValue())) {
1380
					object.reset();
1381
					assertTrue(object.available() > 0);
1382
					assertTrue(result.available() > 0);
1383
					assertTrue(IOUtils.contentEquals(result, object));
1384
				}
1385
				// check metadata
1386
				if (filepath.contains(metadataId.getValue())) {
1387
					metadataObject.reset();
1388
					assertTrue(metadataObject.available() > 0);
1389
					assertTrue(result.available() > 0);
1390
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1391
				}
1392
				if (filepath.contains(dataId.getValue())) {
1393
					dataObject1.reset();
1394
					assertTrue(dataObject1.available() > 0);
1395
					assertTrue(result.available() > 0);
1396
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1397
				}
1398
				if (filepath.contains(dataId2.getValue())) {
1399
					dataObject2.reset();
1400
					assertTrue(dataObject2.available() > 0);
1401
					assertTrue(result.available() > 0);
1402
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1403
				}
1404
				
1405
				
1406
			}
1407
			
1408
			// clean up
1409
			bagFile.delete();
1410
			
1411
			// test the ORE lookup
1412
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1413
			assertTrue(oreIds.contains(resourceMapId));
1414

    
1415
		} catch (Exception e) {
1416
			e.printStackTrace();
1417
			fail("Unexpected error: " + e.getMessage());
1418
		}
1419
	}
1420
	
1421
	/**
1422
     * Test the extra "delete information" was added to the NotFoundException
1423
     * if the object was delete in the following methods:
1424
     * MN.get
1425
     * MN.getSystemmetadata
1426
     * MN.describe
1427
     * MN.getChecksum
1428
     * MN.getRelica
1429
     */
1430
    public void testReadDeletedObject() {
1431
        printTestHeader("testDelete");
1432

    
1433
        try {
1434
          Session session = getTestSession();
1435
          Identifier guid = new Identifier();
1436
          guid.setValue("testDelete." + System.currentTimeMillis());
1437
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1438
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1439
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1440
          Thread.sleep(3000);
1441
          // use MN admin to delete
1442
          session = getMNSession();
1443
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1444
          System.out.println("after deleting");
1445
          assertEquals(pid.getValue(), deletedPid.getValue());
1446
          // check that we cannot get the object
1447
          session = getTestSession();
1448
          InputStream deletedObject = null;
1449
          try {
1450
              //System.out.println("before read ===============");
1451
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1452
              //System.out.println("after read ===============");
1453
          } catch (NotFound nf) {
1454
              assertTrue(nf.getMessage().contains("deleted"));
1455
          }
1456
          try {
1457
              //System.out.println("before read ===============");
1458
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1459
              //System.out.println("after read ===============");
1460
          } catch (NotFound nf) {
1461
              //System.out.println("the exception is "+nf.getMessage());
1462
              assertTrue(nf.getMessage().contains("deleted"));
1463
          }
1464
          
1465
          try {
1466
              //System.out.println("before read ===============");
1467
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1468
              //System.out.println("after read ===============");
1469
          } catch (NotFound nf) {
1470
              //System.out.println("the exception is "+nf.getMessage());
1471
              assertTrue(nf.getMessage().contains("deleted"));
1472
          }
1473
          
1474
          try {
1475
              //System.out.println("before read ===============");
1476
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1477
              //System.out.println("after read ===============");
1478
          } catch (NotFound nf) {
1479
              //System.out.println("the exception 3 is "+nf.getMessage());
1480
              assertTrue(nf.getMessage().contains("deleted"));
1481
          }
1482
          
1483
          try {
1484
              //System.out.println("before read ===============");
1485
              boolean isAuthorized = 
1486
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1487
              //System.out.println("after read ===============");
1488
          } catch (NotFound nf) {
1489
              System.out.println("the exception 4 is "+nf.getMessage());
1490
              assertTrue(nf.getMessage().contains("deleted"));
1491
          }
1492
          
1493
          assertNull(deletedObject);
1494
          
1495
        } catch (UnsupportedEncodingException e) {
1496
          e.printStackTrace();
1497
          
1498
        } catch (Exception e) {
1499
          e.printStackTrace();
1500
          fail("Unexpected error: " + e.getMessage());
1501

    
1502
        } 
1503
    }
1504
    
1505
    /**
1506
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1507
     * has some special charaters. The saved document should has the same bytes as the origianl.
1508
     */
1509
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1510
          String algorithm = "md5";
1511
          Session session = getTestSession();
1512
          Identifier guid = new Identifier();
1513
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1514
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1515
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1516
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1517
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1518
          Identifier pid = 
1519
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1520
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1521
          byte[] readBytes = IOUtils.toByteArray(readResult);
1522
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1523
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1524
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1525
          
1526
          Identifier newPid = new Identifier();
1527
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1528
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1529
                
1530
          // do the update
1531
          Identifier updatedPid = 
1532
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1533
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1534
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1535
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1536
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1537
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1538

    
1539
          
1540
    }
1541
  
1542
    /**
1543
     * Test the method - get api  for a speicified SID
1544
     */
1545
    public void testGetSID() {
1546
        String str1 = "object1";
1547
        String str2 = "object2";
1548
        String str3 = "object3";
1549
        Date fromDate = new Date();
1550
        Calendar calendar = Calendar.getInstance();
1551
        calendar.setTime(fromDate);
1552
        calendar.roll(Calendar.YEAR, false);
1553
        fromDate = calendar.getTime();
1554
        try {
1555
            //insert test documents with a series id
1556
            Session session = getTestSession();
1557
            Identifier guid = new Identifier();
1558
            guid.setValue(generateDocumentId());
1559
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1560
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1561
            String sid1= "sid."+System.nanoTime();
1562
            Identifier seriesId = new Identifier();
1563
            seriesId.setValue(sid1);
1564
            System.out.println("the first sid is "+seriesId.getValue());
1565
            sysmeta.setSeriesId(seriesId);
1566
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1567
            System.out.println("the first pid is "+guid.getValue());
1568
            //test the get(pid) for v2
1569
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1570
            // go back to beginning of original stream
1571
            object1.reset();
1572
            // check
1573
            assertTrue(object1.available() > 0);
1574
            assertTrue(result.available() > 0);
1575
            assertTrue(IOUtils.contentEquals(result, object1));
1576
            // test the get(id) for v2
1577
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1578
            object1.reset();
1579
            // check
1580
            assertTrue(object1.available() > 0);
1581
            assertTrue(result1.available() > 0);
1582
            assertTrue(IOUtils.contentEquals(result1, object1));
1583
            //test the get(pid) for v1
1584
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1585
            object1.reset();
1586
            // check
1587
            assertTrue(object1.available() > 0);
1588
            assertTrue(result2.available() > 0);
1589
            assertTrue(IOUtils.contentEquals(result2, object1));
1590
            //test the get(sid) for v1
1591
            try {
1592
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1593
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1594
            } catch (NotFound ee) {
1595
                
1596
            }
1597
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1598
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1599
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1600
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1601
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1602
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1603
            
1604
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1605
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1606
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1607
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1608
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1609
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1610
            
1611
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1612
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1613
            
1614
            try {
1615
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1616
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1617
            } catch(NotFound nf2) {
1618
                
1619
            }
1620
            
1621
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1622
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1623
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1624
            try {
1625
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1626
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1627
            } catch(NotFound nf2) {
1628
                
1629
            }
1630
            
1631
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1632
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1633
            
1634
            try {
1635
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1636
                fail("the getCheckSum shouldn't work for sid");
1637
            } catch(NotFound nf3) {
1638
                
1639
            }
1640
            
1641
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1642
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1643
            
1644
            try {
1645
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1646
                fail("the getCheckSum shouldn't work for sid");
1647
            } catch(NotFound nf3) {
1648
                
1649
            }
1650
            
1651
            boolean isAuthorized = 
1652
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1653
            assertEquals(isAuthorized, true);
1654
            
1655
            isAuthorized = 
1656
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1657
            assertEquals(isAuthorized, true);
1658
            
1659
            isAuthorized = 
1660
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1661
            assertEquals(isAuthorized, true);
1662
            
1663
            try {
1664
                isAuthorized = 
1665
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1666
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1667
            } catch (NotFound e) {
1668
                
1669
            }
1670
            
1671
            Session cnsession = getCNSession();
1672
            Date toDate = new Date();
1673
            Event event = Event.READ;
1674
            int start = 0;
1675
            int count = 1;
1676
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1677
            event.xmlValue(), seriesId.getValue(), start, count);
1678
          
1679
          assertNotNull(log);      
1680
          assertTrue(log.getCount() == count);
1681
          assertTrue(log.getStart() == start);
1682
          assertTrue(log.getTotal() >= 1);
1683
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1684

    
1685
            //do a update with the same series id
1686
            Thread.sleep(1000);
1687
            Identifier newPid = new Identifier();
1688
            newPid.setValue(generateDocumentId()+"1");
1689
            System.out.println("the second pid is "+newPid.getValue());
1690
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1691
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1692
            newSysMeta.setObsoletes(guid);
1693
            newSysMeta.setSeriesId(seriesId);
1694
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1695
           
1696
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1697
            // go back to beginning of original stream
1698
            object1.reset();
1699
            // check
1700
            assertTrue(object1.available() > 0);
1701
            assertTrue(result4.available() > 0);
1702
            assertTrue(IOUtils.contentEquals(result4, object1));
1703
            
1704
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1705
            // go back to beginning of original stream
1706
            object2.reset();
1707
            // check
1708
            assertTrue(object2.available() > 0);
1709
            assertTrue(result5.available() > 0);
1710
            assertTrue(IOUtils.contentEquals(result5, object2));
1711
            
1712

    
1713
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1714
            object2.reset();
1715
            // check
1716
            assertTrue(object2.available() > 0);
1717
            assertTrue(result6.available() > 0);
1718
            assertTrue(IOUtils.contentEquals(result6, object2));
1719
            //test the get(pid) for v1
1720
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1721
            object1.reset();
1722
            // check
1723
            assertTrue(object1.available() > 0);
1724
            assertTrue(result7.available() > 0);
1725
            assertTrue(IOUtils.contentEquals(result7, object1));
1726
            
1727
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1728
            object2.reset();
1729
            // check
1730
            assertTrue(object2.available() > 0);
1731
            assertTrue(result8.available() > 0);
1732
            assertTrue(IOUtils.contentEquals(result8, object2));
1733
            //test the get(sid) for v1
1734
            try {
1735
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1736
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1737
            } catch (NotFound ee) {
1738
                
1739
            }
1740
            
1741
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1742
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1743
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1744
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1745
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1746
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1747
            
1748
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1749
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1750
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1751
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1752
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1753
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1754
            
1755
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1756
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1757
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1758
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1759
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1760
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1761
            
1762
            //do another update with different series id
1763
            Thread.sleep(1000);
1764
            String sid2 = "sid."+System.nanoTime();
1765
            Identifier seriesId2= new Identifier();
1766
            seriesId2.setValue(sid2);
1767
            System.out.println("the second sid is "+seriesId2.getValue());
1768
            Identifier newPid2 = new Identifier();
1769
            newPid2.setValue(generateDocumentId()+"2");
1770
            System.out.println("the third pid is "+newPid2.getValue());
1771
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1772
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1773
            sysmeta3.setObsoletes(newPid);
1774
            sysmeta3.setSeriesId(seriesId2);
1775
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1776
            
1777
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1778
            // go back to beginning of original stream
1779
            object1.reset();
1780
            // check
1781
            assertTrue(object1.available() > 0);
1782
            assertTrue(result9.available() > 0);
1783
            assertTrue(IOUtils.contentEquals(result9, object1));
1784
            
1785
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1786
            // go back to beginning of original stream
1787
            object2.reset();
1788
            // check
1789
            assertTrue(object2.available() > 0);
1790
            assertTrue(result10.available() > 0);
1791
            assertTrue(IOUtils.contentEquals(result10, object2));
1792
            
1793
            
1794
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1795
            // go back to beginning of original stream
1796
            object3.reset();
1797
            // check
1798
            assertTrue(object3.available() > 0);
1799
            assertTrue(result11.available() > 0);
1800
            assertTrue(IOUtils.contentEquals(result11, object3));
1801
            
1802
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1803
            object3.reset();
1804
            // check
1805
            assertTrue(object3.available() > 0);
1806
            assertTrue(result12.available() > 0);
1807
            assertTrue(IOUtils.contentEquals(result12, object3));
1808
            
1809
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1810
            object2.reset();
1811
            // check
1812
            assertTrue(object2.available() > 0);
1813
            assertTrue(result16.available() > 0);
1814
            assertTrue(IOUtils.contentEquals(result16, object2));
1815
           
1816
            //test the get(pid) for v1
1817
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1818
            object1.reset();
1819
            // check
1820
            assertTrue(object1.available() > 0);
1821
            assertTrue(result13.available() > 0);
1822
            assertTrue(IOUtils.contentEquals(result13, object1));
1823
            
1824
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1825
            object2.reset();
1826
            // check
1827
            assertTrue(object2.available() > 0);
1828
            assertTrue(result14.available() > 0);
1829
            assertTrue(IOUtils.contentEquals(result14, object2));
1830
            
1831
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1832
            object3.reset();
1833
            // check
1834
            assertTrue(object3.available() > 0);
1835
            assertTrue(result15.available() > 0);
1836
            assertTrue(IOUtils.contentEquals(result15, object3));
1837
            
1838
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1839
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1840
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1841
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1842
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1843
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1844
            
1845
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1846
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1847
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1848
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1849
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1850
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1851
            
1852
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1853
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1854
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1855
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1856
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1857
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1858
            
1859
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1860
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1861
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1862
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1863
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1864
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1865
            
1866
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1867
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1868
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1869
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1870
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1871
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1872
            
1873
            
1874
            
1875
            
1876
            //test the get(sid) for v1
1877
            try {
1878
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1879
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1880
            } catch (NotFound ee) {
1881
                
1882
            }
1883
            
1884
            //test the get(sid) for v1
1885
            try {
1886
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1887
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1888
            } catch (NotFound ee) {
1889
                
1890
            }
1891
            
1892
            //test to get non-existing id for v2
1893
            try {
1894
             // the pid should be null when we try to get a no-exist sid
1895
                Identifier non_exist_sid = new Identifier();
1896
                non_exist_sid.setValue("no-sid-exist-123qwe");
1897
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1898
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1899
            } catch (NotFound ee) {
1900
                
1901
            }
1902
            
1903
            try {
1904
                // the pid should be null when we try to get a no-exist sid
1905
                   Identifier non_exist_sid = new Identifier();
1906
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1907
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1908
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1909
            } catch (NotFound ee) {
1910
                   
1911
            }
1912
            
1913
            try {
1914
                // the pid should be null when we try to get a no-exist sid
1915
                   Identifier non_exist_sid = new Identifier();
1916
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1917
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1918
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1919
               } catch (NotFound ee) {
1920
                   
1921
               }
1922
            
1923
            toDate = new Date();
1924
            event = Event.READ;
1925
            start = 0;
1926
            count = 1;
1927
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1928
            event.xmlValue(), seriesId.getValue(), start, count);
1929
          
1930
            assertNotNull(log);      
1931
            assertTrue(log.getCount() == count);
1932
            assertTrue(log.getStart() == start);
1933
            assertTrue(log.getTotal() >= 1);
1934
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
1935
            
1936
            //do another update with invalid series ids
1937
            Thread.sleep(1000);
1938
            Identifier newPid3 = new Identifier();
1939
            newPid3.setValue(generateDocumentId()+"3");
1940
            System.out.println("the third pid is "+newPid3.getValue());
1941
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1942
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1943
            sysmeta4.setObsoletes(newPid2);
1944
            sysmeta4.setSeriesId(seriesId);
1945
            try {
1946
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1947
                fail("we can't reach here since the sid is using an old one ");
1948
            } catch (InvalidSystemMetadata eee) {
1949
                
1950
            } 
1951
            
1952
            sysmeta4.setSeriesId(newPid3);
1953
            try {
1954
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1955
                fail("we can't reach here since the sid is using the pid ");
1956
            } catch (InvalidSystemMetadata eee) {
1957
                
1958
            } 
1959
            
1960
            //test archive a series id by v1
1961
            try {
1962
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1963
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
1964
            } catch (NotFound nf2) {
1965
                
1966
            }
1967
            
1968
            // test delete a series id by v1
1969
            Session mnSession = getMNSession();
1970
            try {
1971
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
1972
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
1973
            } catch (NotFound nf2) {
1974
                
1975
            }
1976
            
1977
            // test archive a series id by v2
1978
            MNodeService.getInstance(request).archive(session, seriesId2);
1979
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1980
            assertTrue(archived.getArchived());
1981
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1982
            assertTrue(archived.getArchived());
1983
            
1984
            // test delete a series id by v2
1985
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
1986
            try {
1987
                MNodeService.getInstance(request).get(session, seriesId2);
1988
                fail("we can't reach here since the series id was deleted ");
1989
            } catch (NotFound nf3) {
1990
                System.out.println("the message is ============="+nf3.getMessage());
1991
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
1992
            }
1993
            
1994
            try {
1995
                MNodeService.getInstance(request).get(session, newPid2);
1996
                fail("we can't reach here since the series id was deleted ");
1997
            } catch (NotFound nf3) {
1998
                //System.out.println("the message is ============="+nf3.getMessage());
1999
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2000
            }
2001
            
2002
            try {
2003
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2004
                fail("we can't reach here since the series id was deleted ");
2005
            } catch (NotFound nf3) {
2006
                System.out.println("the message is ============="+nf3.getMessage());
2007
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2008
            }
2009
            
2010
            //archive seriesId
2011
            MNodeService.getInstance(request).archive(mnSession, seriesId);
2012
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2013
            assertTrue(archived.getArchived());
2014
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2015
            assertTrue(archived.getArchived());
2016
            
2017
            
2018
            //delete seriesId
2019
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2020
            try {
2021
                MNodeService.getInstance(request).get(session, newPid);
2022
                fail("we can't reach here since the series id was deleted ");
2023
            } catch (NotFound nf3) {
2024
                //System.out.println("the message is ============="+nf3.getMessage());
2025
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2026
            }
2027
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2028
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2029
            
2030
        } catch (Exception e) {
2031
            fail(e.getMessage());
2032
        }
2033
        
2034
        
2035
        
2036
        
2037
    }
2038
    
2039
    /**
2040
     * Test the listView methods.
2041
     * @throws Excpetion
2042
     */
2043
    public void testListViews() throws Exception {
2044
        Session session = null;
2045
        OptionList list = MNodeService.getInstance(request).listViews(session);
2046
        assertTrue(list.sizeOptionList() >0);
2047
        List<String> names = list.getOptionList();
2048
        for(String name : names) {
2049
            System.out.println("It has the view named "+name);
2050
        }
2051
    }
2052
    
2053
    public void testUpdateSystemMetadata() throws Exception {
2054
        String str1 = "object1";
2055
        String str2 = "object2";
2056
        String str3 = "object3";
2057
        
2058
        Date date = new Date();
2059
        Thread.sleep(2000);
2060
        //insert test documents with a series id
2061
        Session session = getTestSession();
2062
        Identifier guid = new Identifier();
2063
        guid.setValue(generateDocumentId());
2064
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2065
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2066
        String sid1= "sid."+System.nanoTime();
2067
        Identifier seriesId = new Identifier();
2068
        seriesId.setValue(sid1);
2069
        System.out.println("the first sid is "+seriesId.getValue());
2070
        sysmeta.setSeriesId(seriesId);
2071
        sysmeta.setArchived(false);
2072
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2073
        //Test the generating object succeeded. 
2074
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2075
        assertTrue(metadata.getIdentifier().equals(guid));
2076
        assertTrue(metadata.getArchived().equals(false));
2077
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2078
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2079
        System.out.println("the identifier is "+guid.getValue());
2080
        
2081
        Date current = sysmeta.getDateSysMetadataModified();
2082
        //updating system metadata failed since the date doesn't match
2083
        sysmeta.setArchived(true);
2084
        sysmeta.setDateSysMetadataModified(date);
2085
        try {
2086
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2087
            fail("We shouldn't get there");
2088
        } catch (Exception e) {
2089
            assertTrue(e instanceof InvalidRequest);
2090
        }
2091
        //update system metadata sucessfully
2092
        sysmeta.setDateSysMetadataModified(current);
2093
        BigInteger serialVersion = metadata.getSerialVersion();
2094
        //System.out.println("the current version is "+serialVersion.toString());
2095
        //serialVersion = serialVersion.add(BigInteger.ONE);
2096
        //System.out.println("the new version is "+serialVersion.toString());
2097
        //sysmeta.setSerialVersion(serialVersion);
2098
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2099
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2100
        assertTrue(metadata2.getIdentifier().equals(guid));
2101
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2102
        assertTrue(metadata2.getArchived().equals(true));
2103
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2104
        assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime());
2105
        
2106
        Identifier newId = new Identifier();
2107
        newId.setValue("newValue");
2108
        sysmeta.setIdentifier(newId);
2109
        serialVersion = metadata.getSerialVersion();
2110
        serialVersion = serialVersion.add(BigInteger.ONE);
2111
        sysmeta.setSerialVersion(serialVersion);
2112
        try {
2113
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2114
            fail("We shouldn't get there");
2115
        } catch (Exception e) {
2116
            assertTrue(e instanceof InvalidRequest);
2117
        }
2118
        
2119
        newId.setValue("newValue");
2120
        sysmeta.setSeriesId(newId);
2121
        try {
2122
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2123
            fail("We shouldn't get there");
2124
        } catch (Exception e) {
2125
            assertTrue(e instanceof InvalidRequest);
2126
        }
2127
        
2128
        Date newDate = new Date();
2129
        sysmeta.setDateUploaded(newDate);
2130
        try {
2131
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2132
            fail("We shouldn't get there");
2133
        } catch (Exception e) {
2134
            assertTrue(e instanceof InvalidRequest);
2135
        }
2136
        
2137
        Checksum checkSum = new Checksum();
2138
        checkSum.setValue("12345");
2139
        sysmeta.setChecksum(checkSum);
2140
        try {
2141
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2142
            fail("We shouldn't get there");
2143
        } catch (Exception e) {
2144
            assertTrue(e instanceof InvalidRequest);
2145
        }
2146
        
2147
        BigInteger size = new BigInteger("4000");
2148
        sysmeta.setSize(size);
2149
        try {
2150
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2151
            fail("We shouldn't get there");
2152
        } catch (Exception e) {
2153
            assertTrue(e instanceof InvalidRequest);
2154
        }
2155
    }
2156
    
2157
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2158
        String str1 = "object1";
2159
        String str2 = "object2";
2160
        String str3 = "object3";
2161

    
2162
        //insert two documents 
2163
        Session session = getTestSession();
2164
        Identifier guid1 = new Identifier();
2165
        guid1.setValue(generateDocumentId());
2166
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2167
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2168
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2169
        //Test the generating object succeeded. 
2170
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2171
        assertTrue(metadata.getIdentifier().equals(guid1));
2172
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2173
        
2174
        Identifier guid2 = new Identifier();
2175
        guid2.setValue(generateDocumentId());
2176
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2177
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2178
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2179
        //Test the generating object succeeded. 
2180
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2181
        assertTrue(metadata.getIdentifier().equals(guid2));
2182
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2183
        
2184
        
2185
        
2186
        //update the system metadata without touching the obsoletes and obsoletdBy
2187
        AccessPolicy accessPolicy = new AccessPolicy();
2188
        AccessRule allow = new AccessRule();
2189
        allow.addPermission(Permission.WRITE);
2190
        Subject subject = new Subject();
2191
        subject.setValue("user_foo");
2192
        allow.addSubject(subject);
2193
        accessPolicy.addAllow(allow);
2194
        sysmeta1.setAccessPolicy(accessPolicy);
2195
        BigInteger serialVersion = metadata.getSerialVersion();
2196
        serialVersion = serialVersion.add(BigInteger.ONE);
2197
        sysmeta1.setSerialVersion(serialVersion);
2198
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2199
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2200
        assertTrue(metadata.getIdentifier().equals(guid1));
2201
        assertTrue(metadata.getObsoletedBy() == null);
2202
        assertTrue(metadata.getObsoletes() == null);
2203
        Session newSession = new Session();
2204
        newSession.setSubject(subject);
2205
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2206
        assertTrue(isAuthorized);
2207
        
2208
        sysmeta2.setAccessPolicy(accessPolicy);
2209
        serialVersion = metadata.getSerialVersion();
2210
        serialVersion = serialVersion.add(BigInteger.ONE);
2211
        sysmeta2.setSerialVersion(serialVersion);
2212
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2213
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2214
        assertTrue(metadata.getIdentifier().equals(guid2));
2215
        assertTrue(metadata.getObsoletes() == null);
2216
        assertTrue(metadata.getObsoletedBy() == null);
2217
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2218
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2219
        assertTrue(isAuthorized);
2220
        
2221
        
2222
        
2223
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2224
        sysmeta1.setObsoletedBy(guid2);
2225
        serialVersion = metadata.getSerialVersion();
2226
        serialVersion = serialVersion.add(BigInteger.ONE);
2227
        sysmeta1.setSerialVersion(serialVersion);
2228
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2229
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2230
        assertTrue(metadata.getIdentifier().equals(guid1));
2231
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2232
        assertTrue(metadata.getObsoletes() == null);
2233
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2234
        
2235
        sysmeta2.setObsoletes(guid1);
2236
        serialVersion = metadata.getSerialVersion();
2237
        serialVersion = serialVersion.add(BigInteger.ONE);
2238
        sysmeta2.setSerialVersion(serialVersion);
2239
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2240
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2241
        assertTrue(metadata.getIdentifier().equals(guid2));
2242
        assertTrue(metadata.getObsoletes().equals(guid1));
2243
        assertTrue(metadata.getObsoletedBy() == null);
2244
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2245
        
2246
        
2247
        
2248
        
2249
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2250
        sysmeta1.setObsoletedBy(guid2);
2251
        serialVersion = metadata.getSerialVersion();
2252
        serialVersion = serialVersion.add(BigInteger.ONE);
2253
        sysmeta1.setSerialVersion(serialVersion);
2254
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2255
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2256
        assertTrue(metadata.getIdentifier().equals(guid1));
2257
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2258
        assertTrue(metadata.getObsoletes() == null);
2259
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2260
        
2261
        sysmeta2.setObsoletes(guid1);
2262
        serialVersion = metadata.getSerialVersion();
2263
        serialVersion = serialVersion.add(BigInteger.ONE);
2264
        sysmeta2.setSerialVersion(serialVersion);
2265
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2266
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2267
        assertTrue(metadata.getIdentifier().equals(guid2));
2268
        assertTrue(metadata.getObsoletes().equals(guid1));
2269
        assertTrue(metadata.getObsoletedBy() == null);
2270
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2271
        
2272

    
2273
        
2274
        
2275
        
2276
        //resetting the obsoletes and obsoletedBy fails
2277
        Identifier newId = new Identifier();
2278
        newId.setValue("newValue");
2279
        sysmeta1.setObsoletedBy(newId);
2280
        serialVersion = metadata.getSerialVersion();
2281
        serialVersion = serialVersion.add(BigInteger.ONE);
2282
        sysmeta1.setSerialVersion(serialVersion);
2283
        try {
2284
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2285
            fail("We shouldn't get there");
2286
        } catch (Exception e) {
2287
            e.printStackTrace();
2288
            assertTrue(e instanceof InvalidRequest);
2289
        }
2290
       
2291
        sysmeta2.setObsoletes(newId);
2292
        serialVersion = metadata.getSerialVersion();
2293
        serialVersion = serialVersion.add(BigInteger.ONE);
2294
        sysmeta2.setSerialVersion(serialVersion);
2295
        try {
2296
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2297
            fail("We shouldn't get there");
2298
        } catch (Exception e) {
2299
            e.printStackTrace();
2300
            assertTrue(e instanceof InvalidRequest);
2301
        }
2302
        
2303
        
2304
        
2305
        
2306
        //insert another object
2307
        Identifier guid5 = new Identifier();
2308
        guid5.setValue(generateDocumentId());
2309
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2310
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2311
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2312
        //Test the generating object succeeded. 
2313
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2314
        assertTrue(metadata.getIdentifier().equals(guid5));
2315
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2316
        
2317
        
2318
        
2319
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2320
        sysmeta5.setObsoletes(guid1);
2321
        serialVersion = metadata.getSerialVersion();
2322
        serialVersion = serialVersion.add(BigInteger.ONE);
2323
        sysmeta5.setSerialVersion(serialVersion);
2324
        try {
2325
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2326
            fail("We shouldn't get there");
2327
        } catch (Exception e) {
2328
            e.printStackTrace();
2329
            
2330
        }
2331
        
2332
        
2333
       
2334
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2335
        sysmeta5.setObsoletes(null);
2336
        sysmeta5.setObsoletedBy(guid2);
2337
        try {
2338
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2339
            fail("We shouldn't get there");
2340
        } catch (Exception e) {
2341
            e.printStackTrace();
2342
            
2343
        }
2344
        
2345
        
2346
        
2347
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2348
        sysmeta5.setObsoletedBy(null);
2349
        sysmeta5.setObsoletes(guid2);
2350
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2351
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2352
        assertTrue(metadata.getIdentifier().equals(guid5));
2353
        assertTrue(metadata.getObsoletes().equals(guid2));
2354
        assertTrue(metadata.getObsoletedBy() == null);
2355
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2356
        
2357
        
2358
        
2359
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2360
        sysmeta2.setObsoletes(guid1);
2361
        sysmeta2.setObsoletedBy(guid5);
2362
        serialVersion = sysmeta2.getSerialVersion();
2363
        serialVersion = serialVersion.add(BigInteger.ONE);
2364
        sysmeta2.setSerialVersion(serialVersion);
2365
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2366
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2367
        assertTrue(metadata.getIdentifier().equals(guid2));
2368
        assertTrue(metadata.getObsoletes().equals(guid1));
2369
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2370
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2371
    }
2372
    
2373
}
(4-4/8)