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.Identifier;
87
import org.dataone.service.types.v2.Log;
88
import org.dataone.service.types.v2.Node;
89
import org.dataone.service.types.v2.OptionList;
90
import org.dataone.service.types.v1.NodeReference;
91
import org.dataone.service.types.v1.ObjectFormatIdentifier;
92
import org.dataone.service.types.v1.ObjectList;
93
import org.dataone.service.types.v1.Permission;
94
import org.dataone.service.types.v1.Person;
95
import org.dataone.service.types.v1.Session;
96
import org.dataone.service.types.v1.Subject;
97
import org.dataone.service.types.v1.SubjectInfo;
98
import org.dataone.service.types.v1.util.ChecksumUtil;
99
import org.dataone.service.types.v2.SystemMetadata;
100
import org.dspace.foresite.ResourceMap;
101
import org.jibx.runtime.JiBXException;
102
import org.junit.After;
103
import org.junit.Before;
104

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

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

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

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

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

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

    
272
  }
273

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

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

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

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

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

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

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

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

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

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

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

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

    
339
    }
340
    
341
  }
342

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

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

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

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

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

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

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

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

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

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

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

    
425
    }
426
      
427
  }
428

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

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

    
464
    } 
465

    
466
  }
467

    
468
  /**
469
   * Test object updating
470
   */
471
  public void testUpdate() {
472
    printTestHeader("testUpdate");
473
    
474
    try {
475
      Session session = getTestSession();
476
      Identifier guid = new Identifier();
477
      guid.setValue("testUpdate." + System.currentTimeMillis());
478
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
479
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
480
      Identifier newPid = new Identifier();
481
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
482
      Identifier pid = 
483
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
484
      
485
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
486
      newSysMeta.setArchived(true);
487
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
488
      // do the update
489
      Identifier updatedPid = 
490
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
491
      
492
      // get the updated system metadata
493
      SystemMetadata updatedSysMeta = 
494
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
495

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

    
538
    } catch (InvalidToken e) {
539
      e.printStackTrace();
540
      fail("Unexpected error: " + e.getMessage());
541

    
542
    } catch (ServiceFailure e) {
543
      e.printStackTrace();
544
      fail("Unexpected error: " + e.getMessage());
545

    
546
    } catch (NotAuthorized e) {
547
      e.printStackTrace();
548
      fail("Unexpected error: " + e.getMessage());
549

    
550
    } catch (IdentifierNotUnique e) {
551
      e.printStackTrace();
552
      fail("Unexpected error: " + e.getMessage());
553

    
554
    } catch (UnsupportedType e) {
555
      e.printStackTrace();
556
      fail("Unexpected error: " + e.getMessage());
557

    
558
    } catch (InsufficientResources e) {
559
      e.printStackTrace();
560
      fail("Unexpected error: " + e.getMessage());
561

    
562
    } catch (InvalidSystemMetadata e) {
563
      e.printStackTrace();
564
      fail("Unexpected error: " + e.getMessage());
565

    
566
    } catch (NotImplemented e) {
567
      e.printStackTrace();
568
      fail("Unexpected error: " + e.getMessage());
569

    
570
    } catch (InvalidRequest e) {
571
      e.printStackTrace();
572
      fail("Unexpected error: " + e.getMessage());
573

    
574
    } catch (Exception e) {
575
      e.printStackTrace();
576
      fail("Unexpected error: " + e.getMessage());
577

    
578
    }
579
  }
580

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

    
614
  /**
615
   * Test describing an object
616
   */
617
  public void testDescribe() {
618
    printTestHeader("testDescribe");
619

    
620
    try {
621
      Session session = getTestSession();
622
      Identifier guid = new Identifier();
623
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
624
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
625
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
626
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
627
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
628
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
629
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
630
      
631
    } catch (UnsupportedEncodingException e) {
632
      e.printStackTrace();
633
      fail("Unexpected error: " + e.getMessage());
634

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

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

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

    
647
    } catch (IdentifierNotUnique e) {
648
      e.printStackTrace();
649
      fail("Unexpected error: " + e.getMessage());
650
      
651
    } catch (UnsupportedType e) {
652
      e.printStackTrace();
653
      fail("Unexpected error: " + e.getMessage());
654

    
655
    } catch (InsufficientResources e) {
656
      e.printStackTrace();
657
      fail("Unexpected error: " + e.getMessage());
658

    
659
    } catch (InvalidSystemMetadata e) {
660
      e.printStackTrace();
661
      fail("Unexpected error: " + e.getMessage());
662

    
663
    } catch (NotImplemented e) {
664
      e.printStackTrace();
665
      fail("Unexpected error: " + e.getMessage());
666

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

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

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

    
679
    }
680
  }
681

    
682
  /**
683
   * Test getting the checksum of an object
684
   */
685
  public void testGetChecksum() {
686
    printTestHeader("testGetChecksum");
687

    
688
    try {
689
      Session session = getTestSession();
690
      Identifier guid = new Identifier();
691
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
692
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
693
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
694
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
695
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
696
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
697
    
698
    } catch (UnsupportedEncodingException e) {
699
      e.printStackTrace();
700
      fail("Unexpected error: " + e.getMessage());
701

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

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

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

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

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

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

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

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

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

    
738
    } catch (NotFound e) {
739
      e.printStackTrace();
740
      fail("Unexpected error: " + e.getMessage());
741

    
742
    } catch (Exception e) {
743
      e.printStackTrace();
744
      fail("Unexpected error: " + e.getMessage());
745

    
746
    }
747
    
748
  }
749

    
750
  /**
751
   * Testing listing objects on the Member Node
752
   */
753
  public void testListObjects() {
754
      printTestHeader("testListObjects");
755
  
756
      try {
757
  
758
        Session session = getTestSession();
759
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
760
        Date startTime = sdf.parse("2010-01-01");
761
        Date endTime = new Date();
762
        ObjectFormatIdentifier objectFormatId = null;
763
        boolean replicaStatus = false;
764
        int start = 0;
765
        int count = 1;
766
      
767
        // insert at least one object 
768
        testCreate();
769
        // now check that we have at least one
770
        ObjectList objectList = 
771
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
772
              objectFormatId, null, replicaStatus, start, count);
773
        assertNotNull(objectList);
774
        assertTrue(objectList.getCount() == count);
775
        assertTrue(objectList.getStart() == 0);
776
        assertTrue(objectList.getTotal() >= 1);
777
        
778
      } catch (Exception e) {
779
        e.printStackTrace();
780
        fail("Unexpected error: " + e.getMessage());
781
  
782
      }
783
  }
784

    
785
  public void testGetCapabilities() {
786
      printTestHeader("testGetCapabilities");
787
    try {
788
      Node node = MNodeService.getInstance(request).getCapabilities();
789
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
790
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
791
      assertNotNull(node);
792
      // TODO: should probably test other parts of the node information
793
      
794
    } catch (JiBXException e) {
795
        e.printStackTrace();
796
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
797
        
798
    } catch (IOException e) {
799
        e.printStackTrace();
800
        fail("The node instance couldn't be read correctly:" + e.getMessage());
801
        
802
    } catch (Exception e) {
803
        e.printStackTrace();
804
        fail("Probably not yet implemented: " + e.getMessage());
805
        
806
    }
807
    
808
  }
809

    
810
  public void testPing() {
811

    
812
    try {
813
      Date mnDate = MNodeService.getInstance(request).ping();
814
      assertTrue(mnDate != null);
815
      
816
    } catch (NotImplemented e) {
817
      e.printStackTrace();
818
      fail("Unexpected error: " + e.getMessage());
819

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

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

    
828
    }
829
    
830
  }
831

    
832
  public void testSynchronizationFailed() {
833
    printTestHeader("testSynchronizationFailed");
834
    try {
835
        Session session = getTestSession();
836
        
837
        // create the object
838
        Identifier pid = new Identifier();
839
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
840
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
841
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
842
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
843
        assertEquals(retPid.getValue(), pid.getValue());
844
        
845
        // pretend the sync failed, act as CN
846
      SynchronizationFailed syncFailed = 
847
        new SynchronizationFailed("0000", "Testing Synch Failure");
848
      syncFailed.setPid(pid.getValue());
849
      session = getCNSession();
850
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
851
    } catch (Exception e) {
852
      e.printStackTrace();
853
        fail("Unexpected error: " + e.getMessage());
854
    }
855

    
856
  }
857

    
858
  public void testSystemMetadataChanged() {
859
      printTestHeader("testSystemMetadataChanged");
860
      try {
861
          Session session = getTestSession();
862
          
863
          // create the object
864
          Identifier pid = new Identifier();
865
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
866
          Identifier sid = new Identifier();
867
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
868
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
869
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
870
          sysmeta.setSeriesId(sid);
871
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
872
          assertEquals(retPid.getValue(), pid.getValue());
873
          
874
          // pretend the system metadata changed on the CN
875
          MNodeService.getInstance(request).systemMetadataChanged(session, 
876
                  retPid, 5000L, Calendar.getInstance().getTime());
877
          MNodeService.getInstance(request).systemMetadataChanged(session, 
878
                  sid, 5000L, Calendar.getInstance().getTime());
879
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
880
                  retPid, 5000L, Calendar.getInstance().getTime());
881
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
882
                  sid, 5000L, Calendar.getInstance().getTime());
883
          
884
      } catch (Exception e) {
885
          if (e instanceof NotAuthorized) {
886
              // only CN subjects can call this
887
              // TODO: use a CN certificate in the tests
888
          } else {
889
              fail("Unexpected error: " + e.getMessage());
890
              
891
          }
892
      }
893

    
894
    }
895

    
896
  public void testGetLogRecords() {
897
    printTestHeader("testLogRecords");
898

    
899
    try {
900
	    Log log = null;
901
	    Session session = getCNSession();
902
	    Date fromDate = new Date();
903
	    Calendar calendar = Calendar.getInstance();
904
	    calendar.setTime(fromDate);
905
	    calendar.roll(Calendar.YEAR, false);
906
	    fromDate = calendar.getTime();
907
	    Date toDate = new Date();
908
	    Event event = Event.CREATE;
909
	    int start = 0;
910
	    int count = 1;
911
    
912
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
913
        event.xmlValue(), null, start, count);
914
      
915
      assertNotNull(log);      
916
      assertTrue(log.getCount() == count);
917
      assertTrue(log.getStart() == start);
918
      assertTrue(log.getTotal() >= 1);
919
        
920
    } catch (Exception e) {
921
      e.printStackTrace();
922
      fail("Unexpected error: " + e.getMessage());
923

    
924
    }
925
  }
926

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

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

    
1077
    } catch (InvalidToken e) {
1078
      e.printStackTrace();
1079
      fail("Unexpected error: " + e.getMessage());
1080

    
1081
    } catch (ServiceFailure e) {
1082
      e.printStackTrace();
1083
      fail("Unexpected error: " + e.getMessage());
1084

    
1085
    } catch (NotAuthorized e) {
1086
      e.printStackTrace();
1087
      fail("Unexpected error: " + e.getMessage());
1088

    
1089
    } catch (IdentifierNotUnique e) {
1090
      e.printStackTrace();
1091
      fail("Unexpected error: " + e.getMessage());
1092

    
1093
    } catch (UnsupportedType e) {
1094
      e.printStackTrace();
1095
      fail("Unexpected error: " + e.getMessage());
1096

    
1097
    } catch (InsufficientResources e) {
1098
      e.printStackTrace();
1099
      fail("Unexpected error: " + e.getMessage());
1100

    
1101
    } catch (InvalidSystemMetadata e) {
1102
      e.printStackTrace();
1103
      fail("Unexpected error: " + e.getMessage());
1104

    
1105
    } catch (NotImplemented e) {
1106
      e.printStackTrace();
1107
      fail("Unexpected error: " + e.getMessage());
1108

    
1109
    } catch (InvalidRequest e) {
1110
      e.printStackTrace();
1111
      fail("Unexpected error: " + e.getMessage());
1112

    
1113
    } catch (Exception e) {
1114
      e.printStackTrace();
1115
      fail("Unexpected error: " + e.getMessage());
1116

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

    
1164
    } 
1165
  }
1166

    
1167
  
1168
  public void testIsEquivIdentityAuthorized() {
1169
      printTestHeader("testIsEquivIdentityAuthorized");
1170

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

    
1236
/**
1237
   * Test object creation failure when there is a space in the identifier
1238
   */
1239
  public void testCreateInvalidIdentifier() {
1240
    printTestHeader("testCreateInvalidIdentifier");
1241
    
1242
    try {
1243
      Session session = getTestSession();
1244
      Identifier guid = new Identifier();
1245
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1246
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1247
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1248
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1249
      fail("Should not be able to create with whitespace in indentifier");
1250
    } catch (InvalidRequest e) {
1251
    	// expect that this request fails
1252
        assertTrue(true);
1253
    } catch (Exception e) {
1254
      e.printStackTrace();
1255
      fail("Unexpected error: " + e.getMessage());
1256
    }
1257
      
1258
  }
1259
  
1260
	/**
1261
	 * Test getting a known object
1262
	 */
1263
	public void testGetPackage() {
1264
		printTestHeader("testGetPackage");
1265

    
1266
		try {
1267
			Session session = getTestSession();
1268
			Identifier guid = new Identifier();
1269
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1270
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1271
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1272
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1273
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1274
			File bagFile = File.createTempFile("bagit.", ".zip");
1275
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1276
			BagFactory bagFactory = new BagFactory();
1277
			Bag bag = bagFactory.createBag(bagFile);
1278
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1279
			
1280
			// go back to beginning of original stream
1281
			object.reset();
1282
			// check
1283
			assertTrue(object.available() > 0);
1284
			assertTrue(result.available() > 0);
1285
			assertTrue(IOUtils.contentEquals(result, object));
1286
			
1287
			// clean up
1288
			bagFile.delete();
1289

    
1290
		} catch (Exception e) {
1291
			e.printStackTrace();
1292
			fail("Unexpected error: " + e.getMessage());
1293
		}
1294
	}
1295
	
1296
	
1297
	/**
1298
	 * Test getting a known object
1299
	 */
1300
	public void testGetOREPackage() {
1301
		printTestHeader("testGetOREPackage");
1302

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

    
1397
		} catch (Exception e) {
1398
			e.printStackTrace();
1399
			fail("Unexpected error: " + e.getMessage());
1400
		}
1401
	}
1402
	
1403
	/**
1404
     * Test the extra "delete information" was added to the NotFoundException
1405
     * if the object was delete in the following methods:
1406
     * MN.get
1407
     * MN.getSystemmetadata
1408
     * MN.describe
1409
     * MN.getChecksum
1410
     * MN.getRelica
1411
     */
1412
    public void testReadDeletedObject() {
1413
        printTestHeader("testDelete");
1414

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

    
1484
        } 
1485
    }
1486
    
1487
    /**
1488
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1489
     * has some special charaters. The saved document should has the same bytes as the origianl.
1490
     */
1491
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1492
          String algorithm = "md5";
1493
          Session session = getTestSession();
1494
          Identifier guid = new Identifier();
1495
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1496
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1497
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1498
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1499
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1500
          Identifier pid = 
1501
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1502
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1503
          byte[] readBytes = IOUtils.toByteArray(readResult);
1504
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1505
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1506
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1507
          
1508
          Identifier newPid = new Identifier();
1509
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1510
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1511
                
1512
          // do the update
1513
          Identifier updatedPid = 
1514
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1515
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1516
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1517
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1518
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1519
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1520

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

    
1667
            //do a update with the same series id
1668
            Thread.sleep(1000);
1669
            Identifier newPid = new Identifier();
1670
            newPid.setValue(generateDocumentId()+"1");
1671
            System.out.println("the second pid is "+newPid.getValue());
1672
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1673
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1674
            newSysMeta.setObsoletes(guid);
1675
            newSysMeta.setSeriesId(seriesId);
1676
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1677
           
1678
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1679
            // go back to beginning of original stream
1680
            object1.reset();
1681
            // check
1682
            assertTrue(object1.available() > 0);
1683
            assertTrue(result4.available() > 0);
1684
            assertTrue(IOUtils.contentEquals(result4, object1));
1685
            
1686
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1687
            // go back to beginning of original stream
1688
            object2.reset();
1689
            // check
1690
            assertTrue(object2.available() > 0);
1691
            assertTrue(result5.available() > 0);
1692
            assertTrue(IOUtils.contentEquals(result5, object2));
1693
            
1694

    
1695
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1696
            object2.reset();
1697
            // check
1698
            assertTrue(object2.available() > 0);
1699
            assertTrue(result6.available() > 0);
1700
            assertTrue(IOUtils.contentEquals(result6, object2));
1701
            //test the get(pid) for v1
1702
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1703
            object1.reset();
1704
            // check
1705
            assertTrue(object1.available() > 0);
1706
            assertTrue(result7.available() > 0);
1707
            assertTrue(IOUtils.contentEquals(result7, object1));
1708
            
1709
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1710
            object2.reset();
1711
            // check
1712
            assertTrue(object2.available() > 0);
1713
            assertTrue(result8.available() > 0);
1714
            assertTrue(IOUtils.contentEquals(result8, object2));
1715
            //test the get(sid) for v1
1716
            try {
1717
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1718
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1719
            } catch (NotFound ee) {
1720
                
1721
            }
1722
            
1723
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1724
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1725
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1726
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1727
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1728
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1729
            
1730
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1731
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1732
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1733
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1734
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1735
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1736
            
1737
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1738
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1739
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1740
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1741
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1742
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1743
            
1744
            //do another update with different series id
1745
            Thread.sleep(1000);
1746
            String sid2 = "sid."+System.nanoTime();
1747
            Identifier seriesId2= new Identifier();
1748
            seriesId2.setValue(sid2);
1749
            System.out.println("the second sid is "+seriesId2.getValue());
1750
            Identifier newPid2 = new Identifier();
1751
            newPid2.setValue(generateDocumentId()+"2");
1752
            System.out.println("the third pid is "+newPid2.getValue());
1753
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1754
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1755
            sysmeta3.setObsoletes(newPid);
1756
            sysmeta3.setSeriesId(seriesId2);
1757
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1758
            
1759
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1760
            // go back to beginning of original stream
1761
            object1.reset();
1762
            // check
1763
            assertTrue(object1.available() > 0);
1764
            assertTrue(result9.available() > 0);
1765
            assertTrue(IOUtils.contentEquals(result9, object1));
1766
            
1767
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1768
            // go back to beginning of original stream
1769
            object2.reset();
1770
            // check
1771
            assertTrue(object2.available() > 0);
1772
            assertTrue(result10.available() > 0);
1773
            assertTrue(IOUtils.contentEquals(result10, object2));
1774
            
1775
            
1776
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1777
            // go back to beginning of original stream
1778
            object3.reset();
1779
            // check
1780
            assertTrue(object3.available() > 0);
1781
            assertTrue(result11.available() > 0);
1782
            assertTrue(IOUtils.contentEquals(result11, object3));
1783
            
1784
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1785
            object3.reset();
1786
            // check
1787
            assertTrue(object3.available() > 0);
1788
            assertTrue(result12.available() > 0);
1789
            assertTrue(IOUtils.contentEquals(result12, object3));
1790
            
1791
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1792
            object2.reset();
1793
            // check
1794
            assertTrue(object2.available() > 0);
1795
            assertTrue(result16.available() > 0);
1796
            assertTrue(IOUtils.contentEquals(result16, object2));
1797
           
1798
            //test the get(pid) for v1
1799
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1800
            object1.reset();
1801
            // check
1802
            assertTrue(object1.available() > 0);
1803
            assertTrue(result13.available() > 0);
1804
            assertTrue(IOUtils.contentEquals(result13, object1));
1805
            
1806
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1807
            object2.reset();
1808
            // check
1809
            assertTrue(object2.available() > 0);
1810
            assertTrue(result14.available() > 0);
1811
            assertTrue(IOUtils.contentEquals(result14, object2));
1812
            
1813
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1814
            object3.reset();
1815
            // check
1816
            assertTrue(object3.available() > 0);
1817
            assertTrue(result15.available() > 0);
1818
            assertTrue(IOUtils.contentEquals(result15, object3));
1819
            
1820
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1821
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1822
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1823
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1824
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1825
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1826
            
1827
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1828
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1829
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1830
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1831
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1832
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1833
            
1834
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1835
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1836
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1837
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1838
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1839
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1840
            
1841
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1842
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1843
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1844
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1845
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1846
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1847
            
1848
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1849
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1850
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1851
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1852
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1853
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1854
            
1855
            
1856
            
1857
            
1858
            //test the get(sid) for v1
1859
            try {
1860
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1861
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1862
            } catch (NotFound ee) {
1863
                
1864
            }
1865
            
1866
            //test the get(sid) for v1
1867
            try {
1868
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1869
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1870
            } catch (NotFound ee) {
1871
                
1872
            }
1873
            
1874
            //test to get non-existing id for v2
1875
            try {
1876
             // the pid should be null when we try to get a no-exist sid
1877
                Identifier non_exist_sid = new Identifier();
1878
                non_exist_sid.setValue("no-sid-exist-123qwe");
1879
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1880
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1881
            } catch (NotFound ee) {
1882
                
1883
            }
1884
            
1885
            try {
1886
                // the pid should be null when we try to get a no-exist sid
1887
                   Identifier non_exist_sid = new Identifier();
1888
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1889
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1890
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1891
            } catch (NotFound ee) {
1892
                   
1893
            }
1894
            
1895
            try {
1896
                // the pid should be null when we try to get a no-exist sid
1897
                   Identifier non_exist_sid = new Identifier();
1898
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1899
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1900
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1901
               } catch (NotFound ee) {
1902
                   
1903
               }
1904
            
1905
            toDate = new Date();
1906
            event = Event.READ;
1907
            start = 0;
1908
            count = 1;
1909
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1910
            event.xmlValue(), seriesId.getValue(), start, count);
1911
          
1912
            assertNotNull(log);      
1913
            assertTrue(log.getCount() == count);
1914
            assertTrue(log.getStart() == start);
1915
            assertTrue(log.getTotal() >= 1);
1916
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
1917
            
1918
            //do another update with invalid series ids
1919
            Thread.sleep(1000);
1920
            Identifier newPid3 = new Identifier();
1921
            newPid3.setValue(generateDocumentId()+"3");
1922
            System.out.println("the third pid is "+newPid3.getValue());
1923
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1924
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1925
            sysmeta4.setObsoletes(newPid2);
1926
            sysmeta4.setSeriesId(seriesId);
1927
            try {
1928
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1929
                fail("we can't reach here since the sid is using an old one ");
1930
            } catch (InvalidSystemMetadata eee) {
1931
                
1932
            } 
1933
            
1934
            sysmeta4.setSeriesId(newPid3);
1935
            try {
1936
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1937
                fail("we can't reach here since the sid is using the pid ");
1938
            } catch (InvalidSystemMetadata eee) {
1939
                
1940
            } 
1941
            
1942
            //test archive a series id by v1
1943
            try {
1944
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1945
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
1946
            } catch (NotFound nf2) {
1947
                
1948
            }
1949
            
1950
            // test delete a series id by v1
1951
            Session mnSession = getMNSession();
1952
            try {
1953
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
1954
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
1955
            } catch (NotFound nf2) {
1956
                
1957
            }
1958
            
1959
            // test archive a series id by v2
1960
            MNodeService.getInstance(request).archive(session, seriesId2);
1961
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1962
            assertTrue(archived.getArchived());
1963
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1964
            assertTrue(archived.getArchived());
1965
            
1966
            // test delete a series id by v2
1967
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
1968
            try {
1969
                MNodeService.getInstance(request).get(session, seriesId2);
1970
                fail("we can't reach here since the series id was deleted ");
1971
            } catch (NotFound nf3) {
1972
                System.out.println("the message is ============="+nf3.getMessage());
1973
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
1974
            }
1975
            
1976
            try {
1977
                MNodeService.getInstance(request).get(session, newPid2);
1978
                fail("we can't reach here since the series id was deleted ");
1979
            } catch (NotFound nf3) {
1980
                //System.out.println("the message is ============="+nf3.getMessage());
1981
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1982
            }
1983
            
1984
            try {
1985
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1986
                fail("we can't reach here since the series id was deleted ");
1987
            } catch (NotFound nf3) {
1988
                System.out.println("the message is ============="+nf3.getMessage());
1989
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1990
            }
1991
            
1992
            //archive seriesId
1993
            MNodeService.getInstance(request).archive(mnSession, seriesId);
1994
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1995
            assertTrue(archived.getArchived());
1996
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1997
            assertTrue(archived.getArchived());
1998
            
1999
            
2000
            //delete seriesId
2001
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2002
            try {
2003
                MNodeService.getInstance(request).get(session, newPid);
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
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2010
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2011
            
2012
        } catch (Exception e) {
2013
            fail(e.getMessage());
2014
        }
2015
        
2016
        
2017
        
2018
        
2019
    }
2020
    
2021
    /**
2022
     * Test the listView methods.
2023
     * @throws Excpetion
2024
     */
2025
    public void testListViews() throws Exception {
2026
        Session session = null;
2027
        OptionList list = MNodeService.getInstance(request).listViews(session);
2028
        assertTrue(list.sizeOptionList() >0);
2029
        List<String> names = list.getOptionList();
2030
        for(String name : names) {
2031
            System.out.println("It has the view named "+name);
2032
        }
2033
    }
2034
    
2035
    public void testUpdateSystemMetadata() throws Exception {
2036
        String str1 = "object1";
2037
        String str2 = "object2";
2038
        String str3 = "object3";
2039

    
2040
        //insert test documents with a series id
2041
        Session session = getTestSession();
2042
        Identifier guid = new Identifier();
2043
        guid.setValue(generateDocumentId());
2044
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2045
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2046
        String sid1= "sid."+System.nanoTime();
2047
        Identifier seriesId = new Identifier();
2048
        seriesId.setValue(sid1);
2049
        System.out.println("the first sid is "+seriesId.getValue());
2050
        sysmeta.setSeriesId(seriesId);
2051
        sysmeta.setArchived(false);
2052
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2053
        //Test the generating object succeeded. 
2054
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2055
        assertTrue(metadata.getIdentifier().equals(guid));
2056
        assertTrue(metadata.getArchived().equals(false));
2057
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2058
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2059
        System.out.println("the identifier is "+guid.getValue());
2060
        
2061
        
2062
        
2063
        //update system metadata sucessfully
2064
        sysmeta.setArchived(true);
2065
        BigInteger serialVersion = metadata.getSerialVersion();
2066
        System.out.println("the current version is "+serialVersion.toString());
2067
        serialVersion = serialVersion.add(BigInteger.ONE);
2068
        System.out.println("the new version is "+serialVersion.toString());
2069
        sysmeta.setSerialVersion(serialVersion);
2070
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2071
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2072
        assertTrue(metadata2.getIdentifier().equals(guid));
2073
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2074
        assertTrue(metadata2.getArchived().equals(true));
2075
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2076
        
2077
        Identifier newId = new Identifier();
2078
        newId.setValue("newValue");
2079
        sysmeta.setIdentifier(newId);
2080
        serialVersion = metadata.getSerialVersion();
2081
        serialVersion = serialVersion.add(BigInteger.ONE);
2082
        sysmeta.setSerialVersion(serialVersion);
2083
        try {
2084
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2085
            fail("We shouldn't get there");
2086
        } catch (Exception e) {
2087
            assertTrue(e instanceof InvalidRequest);
2088
        }
2089
        
2090
        newId.setValue("newValue");
2091
        sysmeta.setSeriesId(newId);
2092
        try {
2093
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2094
            fail("We shouldn't get there");
2095
        } catch (Exception e) {
2096
            assertTrue(e instanceof InvalidRequest);
2097
        }
2098
        
2099
        Date newDate = new Date();
2100
        sysmeta.setDateUploaded(newDate);
2101
        try {
2102
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2103
            fail("We shouldn't get there");
2104
        } catch (Exception e) {
2105
            assertTrue(e instanceof InvalidRequest);
2106
        }
2107
        
2108
        Checksum checkSum = new Checksum();
2109
        checkSum.setValue("12345");
2110
        sysmeta.setChecksum(checkSum);
2111
        try {
2112
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2113
            fail("We shouldn't get there");
2114
        } catch (Exception e) {
2115
            assertTrue(e instanceof InvalidRequest);
2116
        }
2117
        
2118
        BigInteger size = new BigInteger("4000");
2119
        sysmeta.setSize(size);
2120
        try {
2121
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2122
            fail("We shouldn't get there");
2123
        } catch (Exception e) {
2124
            assertTrue(e instanceof InvalidRequest);
2125
        }
2126
}
2127
    
2128
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2129
        String str1 = "object1";
2130
        String str2 = "object2";
2131
        String str3 = "object3";
2132

    
2133
        //insert two documents 
2134
        Session session = getTestSession();
2135
        Identifier guid1 = new Identifier();
2136
        guid1.setValue(generateDocumentId());
2137
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2138
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2139
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2140
        //Test the generating object succeeded. 
2141
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2142
        assertTrue(metadata.getIdentifier().equals(guid1));
2143
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2144
        
2145
        Identifier guid2 = new Identifier();
2146
        guid2.setValue(generateDocumentId());
2147
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2148
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2149
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2150
        //Test the generating object succeeded. 
2151
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2152
        assertTrue(metadata.getIdentifier().equals(guid2));
2153
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2154
        
2155
        
2156
        
2157
        //update the system metadata without touching the obsoletes and obsoletdBy
2158
        AccessPolicy accessPolicy = new AccessPolicy();
2159
        AccessRule allow = new AccessRule();
2160
        allow.addPermission(Permission.WRITE);
2161
        Subject subject = new Subject();
2162
        subject.setValue("user_foo");
2163
        allow.addSubject(subject);
2164
        accessPolicy.addAllow(allow);
2165
        sysmeta1.setAccessPolicy(accessPolicy);
2166
        BigInteger serialVersion = metadata.getSerialVersion();
2167
        serialVersion = serialVersion.add(BigInteger.ONE);
2168
        sysmeta1.setSerialVersion(serialVersion);
2169
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2170
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2171
        assertTrue(metadata.getIdentifier().equals(guid1));
2172
        assertTrue(metadata.getObsoletedBy() == null);
2173
        assertTrue(metadata.getObsoletes() == null);
2174
        Session newSession = new Session();
2175
        newSession.setSubject(subject);
2176
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2177
        assertTrue(isAuthorized);
2178
        
2179
        sysmeta2.setAccessPolicy(accessPolicy);
2180
        serialVersion = metadata.getSerialVersion();
2181
        serialVersion = serialVersion.add(BigInteger.ONE);
2182
        sysmeta2.setSerialVersion(serialVersion);
2183
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2184
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2185
        assertTrue(metadata.getIdentifier().equals(guid2));
2186
        assertTrue(metadata.getObsoletes() == null);
2187
        assertTrue(metadata.getObsoletedBy() == null);
2188
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2189
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2190
        assertTrue(isAuthorized);
2191
        
2192
        
2193
        
2194
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2195
        sysmeta1.setObsoletedBy(guid2);
2196
        serialVersion = metadata.getSerialVersion();
2197
        serialVersion = serialVersion.add(BigInteger.ONE);
2198
        sysmeta1.setSerialVersion(serialVersion);
2199
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2200
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2201
        assertTrue(metadata.getIdentifier().equals(guid1));
2202
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2203
        assertTrue(metadata.getObsoletes() == null);
2204
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2205
        
2206
        sysmeta2.setObsoletes(guid1);
2207
        serialVersion = metadata.getSerialVersion();
2208
        serialVersion = serialVersion.add(BigInteger.ONE);
2209
        sysmeta2.setSerialVersion(serialVersion);
2210
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2211
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2212
        assertTrue(metadata.getIdentifier().equals(guid2));
2213
        assertTrue(metadata.getObsoletes().equals(guid1));
2214
        assertTrue(metadata.getObsoletedBy() == null);
2215
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2216
        
2217
        
2218
        
2219
        
2220
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2221
        sysmeta1.setObsoletedBy(guid2);
2222
        serialVersion = metadata.getSerialVersion();
2223
        serialVersion = serialVersion.add(BigInteger.ONE);
2224
        sysmeta1.setSerialVersion(serialVersion);
2225
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2226
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2227
        assertTrue(metadata.getIdentifier().equals(guid1));
2228
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2229
        assertTrue(metadata.getObsoletes() == null);
2230
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2231
        
2232
        sysmeta2.setObsoletes(guid1);
2233
        serialVersion = metadata.getSerialVersion();
2234
        serialVersion = serialVersion.add(BigInteger.ONE);
2235
        sysmeta2.setSerialVersion(serialVersion);
2236
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2237
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2238
        assertTrue(metadata.getIdentifier().equals(guid2));
2239
        assertTrue(metadata.getObsoletes().equals(guid1));
2240
        assertTrue(metadata.getObsoletedBy() == null);
2241
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2242
        
2243

    
2244
        
2245
        
2246
        
2247
        //resetting the obsoletes and obsoletedBy fails
2248
        Identifier newId = new Identifier();
2249
        newId.setValue("newValue");
2250
        sysmeta1.setObsoletedBy(newId);
2251
        serialVersion = metadata.getSerialVersion();
2252
        serialVersion = serialVersion.add(BigInteger.ONE);
2253
        sysmeta1.setSerialVersion(serialVersion);
2254
        try {
2255
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2256
            fail("We shouldn't get there");
2257
        } catch (Exception e) {
2258
            e.printStackTrace();
2259
            assertTrue(e instanceof InvalidRequest);
2260
        }
2261
       
2262
        sysmeta2.setObsoletes(newId);
2263
        serialVersion = metadata.getSerialVersion();
2264
        serialVersion = serialVersion.add(BigInteger.ONE);
2265
        sysmeta2.setSerialVersion(serialVersion);
2266
        try {
2267
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2268
            fail("We shouldn't get there");
2269
        } catch (Exception e) {
2270
            e.printStackTrace();
2271
            assertTrue(e instanceof InvalidRequest);
2272
        }
2273
        
2274
        
2275
        
2276
        
2277
        //insert another object
2278
        Identifier guid5 = new Identifier();
2279
        guid5.setValue(generateDocumentId());
2280
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2281
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2282
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2283
        //Test the generating object succeeded. 
2284
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2285
        assertTrue(metadata.getIdentifier().equals(guid5));
2286
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2287
        
2288
        
2289
        
2290
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2291
        sysmeta5.setObsoletes(guid1);
2292
        serialVersion = metadata.getSerialVersion();
2293
        serialVersion = serialVersion.add(BigInteger.ONE);
2294
        sysmeta5.setSerialVersion(serialVersion);
2295
        try {
2296
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2297
            fail("We shouldn't get there");
2298
        } catch (Exception e) {
2299
            e.printStackTrace();
2300
            
2301
        }
2302
        
2303
        
2304
       
2305
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2306
        sysmeta5.setObsoletes(null);
2307
        sysmeta5.setObsoletedBy(guid2);
2308
        try {
2309
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2310
            fail("We shouldn't get there");
2311
        } catch (Exception e) {
2312
            e.printStackTrace();
2313
            
2314
        }
2315
        
2316
        
2317
        
2318
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2319
        sysmeta5.setObsoletedBy(null);
2320
        sysmeta5.setObsoletes(guid2);
2321
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2322
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2323
        assertTrue(metadata.getIdentifier().equals(guid5));
2324
        assertTrue(metadata.getObsoletes().equals(guid2));
2325
        assertTrue(metadata.getObsoletedBy() == null);
2326
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2327
        
2328
        
2329
        
2330
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2331
        sysmeta2.setObsoletes(guid1);
2332
        sysmeta2.setObsoletedBy(guid5);
2333
        serialVersion = sysmeta2.getSerialVersion();
2334
        serialVersion = serialVersion.add(BigInteger.ONE);
2335
        sysmeta2.setSerialVersion(serialVersion);
2336
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2337
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2338
        assertTrue(metadata.getIdentifier().equals(guid2));
2339
        assertTrue(metadata.getObsoletes().equals(guid1));
2340
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2341
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2342
    }
2343
    
2344
}
(3-3/7)