Project

General

Profile

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

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

    
28

    
29

    
30

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

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

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

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

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

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

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

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

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

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

    
273
  }
274

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

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

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

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

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

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

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

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

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

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

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

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

    
340
    }
341
    
342
  }
343

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

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

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

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

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

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

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

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

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

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

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

    
426
    }
427
      
428
  }
429

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

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

    
465
    } 
466

    
467
  }
468

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

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

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

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

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

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

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

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

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

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

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

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

    
579
    }
580
  }
581

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

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

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

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

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

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

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

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

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

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

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

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

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

    
680
    }
681
  }
682

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

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

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

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

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

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

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

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

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

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

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

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

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

    
747
    }
748
    
749
  }
750

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

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

    
811
  public void testPing() {
812

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

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

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

    
829
    }
830
    
831
  }
832

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

    
857
  }
858

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

    
895
    }
896

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

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

    
925
    }
926
  }
927

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1165
    } 
1166
  }
1167

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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