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.FileInputStream;
45
import java.io.FileOutputStream;
46
import java.io.IOException;
47
import java.io.InputStream;
48
import java.io.UnsupportedEncodingException;
49
import java.math.BigInteger;
50
import java.net.URL;
51
import java.text.SimpleDateFormat;
52
import java.util.ArrayList;
53
import java.util.Calendar;
54
import java.util.Date;
55
import java.util.HashMap;
56
import java.util.Iterator;
57
import java.util.List;
58
import java.util.Map;
59
import java.util.Vector;
60

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

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

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

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

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

    
203
  /**
204
   * Initial blank test
205
   */
206
  public void initialize() {
207
    assertTrue(1 == 1);
208
    
209
  }
210
  
211
  /**
212
   * Test getting a known object
213
   */
214
  public void testGet() {
215
    printTestHeader("testGet");
216

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

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

    
282
  }
283

    
284
  /**
285
   * Test getting the system metadata of an object
286
   */
287
  public void testGetSystemMetadata() {    
288
    printTestHeader("testGetSystemMetadata");
289

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

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

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

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

    
317
    } catch (IdentifierNotUnique e) {
318
      e.printStackTrace();
319
      fail("Unexpected error: " + e.getMessage());
320
      
321
    } catch (UnsupportedType e) {
322
      e.printStackTrace();
323
      fail("Unexpected error: " + e.getMessage());
324

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

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

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

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

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

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

    
349
    }
350
    
351
  }
352

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

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

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

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

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

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

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

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

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

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

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

    
435
    }
436
      
437
  }
438

    
439
  /**
440
   * test object deletion
441
   */
442
  public void testDelete() {
443
    printTestHeader("testDelete");
444

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

    
474
    } 
475

    
476
  }
477
  
478
  public void testArchive() throws Exception {
479
          Session session = getTestSession();
480
          Identifier guid = new Identifier();
481
          guid.setValue("testUpdate." + System.currentTimeMillis());
482
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
483
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
484
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
485
          MNodeService.getInstance(request).archive(session, guid);
486
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
487
          assertTrue(result.getArchived());
488
          System.out.println("the identifier is ==================="+pid.getValue());
489
  }
490

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

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

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

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

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

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

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

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

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

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

    
593
    } catch (InvalidRequest e) {
594
      e.printStackTrace();
595
      fail("Unexpected error: " + e.getMessage());
596

    
597
    } catch (Exception e) {
598
      e.printStackTrace();
599
      fail("Unexpected error: " + e.getMessage());
600

    
601
    }
602
  }
603
  
604
  
605
  /**
606
   * Test object updating
607
   */
608
  public void testUpdateSciMetadata() {
609
    printTestHeader("testUpdate");
610
    
611
    try {
612
      String st1="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
613
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
614
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
615
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
616
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
617
      Session session = getTestSession();
618
      Identifier guid = new Identifier();
619
      guid.setValue("testUpdate." + System.currentTimeMillis());
620
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
621
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
622
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
623
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
624
      
625
      String st2="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
626
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
627
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
628
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
629
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
630
      Identifier newPid = new Identifier();
631
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
632
      System.out.println("=================the pid is "+newPid.getValue());
633
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
634
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
635
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
636
      sysmeta2.setObsoletes(guid);
637
      Checksum sum1= sysmeta2.getChecksum();
638
      System.out.println("the checksum before sending is "+sum1.getValue());
639
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
640
      MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
641
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
642
      System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue());
643
      assertTrue(meta.getChecksum().getValue().equals(sum1.getValue()));
644
    } catch (UnsupportedEncodingException e) {
645
      e.printStackTrace();
646
      fail("Unexpected error: " + e.getMessage());
647

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

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

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

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

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

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

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

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

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

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

    
688
    }
689
  }
690

    
691
  /**
692
   * We currently expect this unit test to fail because it should rely on a different member node
693
   * to retrieve the object from. Currently it gets the object from itself and throws 
694
   * and expected error for duplicate entry.
695
   * 
696
   */
697
  public void testReplicate() {
698
      printTestHeader("testReplicate");
699
      try {
700
        Session session = getTestSession();
701
        Identifier guid = new Identifier();
702
        guid.setValue("testReplicate." + System.currentTimeMillis());
703
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
704
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
705
        // save locally
706
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
707
        // get our node reference (attempting to replicate with self)
708
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
709
        // attempt to replicate with ourselves -- this should fail!
710
      boolean result = false;
711
      try {
712
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
713
      } catch (Exception inu) {
714
        // we are expecting this to fail since we already have the doc
715
        result = true;
716
      }
717
      assertTrue(result);
718
      } catch (Exception e) {
719
        e.printStackTrace();
720
      fail("Probably not yet implemented: " + e.getMessage());
721
    }
722
  }
723

    
724
  /**
725
   * Test describing an object
726
   */
727
  public void testDescribe() {
728
    printTestHeader("testDescribe");
729

    
730
    try {
731
      Session session = getTestSession();
732
      Identifier guid = new Identifier();
733
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
734
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
735
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
736
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
737
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
738
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
739
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
740
      
741
    } catch (UnsupportedEncodingException e) {
742
      e.printStackTrace();
743
      fail("Unexpected error: " + e.getMessage());
744

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

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

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

    
757
    } catch (IdentifierNotUnique e) {
758
      e.printStackTrace();
759
      fail("Unexpected error: " + e.getMessage());
760
      
761
    } catch (UnsupportedType e) {
762
      e.printStackTrace();
763
      fail("Unexpected error: " + e.getMessage());
764

    
765
    } catch (InsufficientResources e) {
766
      e.printStackTrace();
767
      fail("Unexpected error: " + e.getMessage());
768

    
769
    } catch (InvalidSystemMetadata e) {
770
      e.printStackTrace();
771
      fail("Unexpected error: " + e.getMessage());
772

    
773
    } catch (NotImplemented e) {
774
      e.printStackTrace();
775
      fail("Unexpected error: " + e.getMessage());
776

    
777
    } catch (InvalidRequest e) {
778
      e.printStackTrace();
779
      fail("Unexpected error: " + e.getMessage());
780

    
781
    } catch (NotFound e) {
782
      e.printStackTrace();
783
      fail("Unexpected error: " + e.getMessage());
784

    
785
    } catch (Exception e) {
786
      e.printStackTrace();
787
      fail("Unexpected error: " + e.getMessage());
788

    
789
    }
790
  }
791

    
792
  /**
793
   * Test getting the checksum of an object
794
   */
795
  public void testGetChecksum() {
796
    printTestHeader("testGetChecksum");
797

    
798
    try {
799
      Session session = getTestSession();
800
      Identifier guid = new Identifier();
801
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
802
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
803
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
804
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
805
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
806
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
807
    
808
    } catch (UnsupportedEncodingException e) {
809
      e.printStackTrace();
810
      fail("Unexpected error: " + e.getMessage());
811

    
812
    } catch (InvalidToken e) {
813
      e.printStackTrace();
814
      fail("Unexpected error: " + e.getMessage());
815

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

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

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

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

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

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

    
840
    } catch (NotImplemented e) {
841
      e.printStackTrace();
842
      fail("Unexpected error: " + e.getMessage());
843

    
844
    } catch (InvalidRequest e) {
845
      e.printStackTrace();
846
      fail("Unexpected error: " + e.getMessage());
847

    
848
    } catch (NotFound e) {
849
      e.printStackTrace();
850
      fail("Unexpected error: " + e.getMessage());
851

    
852
    } catch (Exception e) {
853
      e.printStackTrace();
854
      fail("Unexpected error: " + e.getMessage());
855

    
856
    }
857
    
858
  }
859

    
860
  /**
861
   * Testing listing objects on the Member Node
862
   */
863
  public void testListObjects() {
864
      printTestHeader("testListObjects");
865
  
866
      try {
867
  
868
        Session session = getTestSession();
869
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
870
        Date startTime = sdf.parse("2010-01-01");
871
        Date endTime = new Date();
872
        ObjectFormatIdentifier objectFormatId = null;
873
        boolean replicaStatus = false;
874
        int start = 0;
875
        int count = 1;
876
      
877
        // insert at least one object 
878
        testCreate();
879
        // now check that we have at least one
880
        ObjectList objectList = 
881
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
882
              objectFormatId, null, replicaStatus, start, count);
883
        assertNotNull(objectList);
884
        assertTrue(objectList.getCount() == count);
885
        assertTrue(objectList.getStart() == 0);
886
        assertTrue(objectList.getTotal() >= 1);
887
        
888
      } catch (Exception e) {
889
        e.printStackTrace();
890
        fail("Unexpected error: " + e.getMessage());
891
  
892
      }
893
  }
894

    
895
  public void testGetCapabilities() {
896
      printTestHeader("testGetCapabilities");
897
    try {
898
      Node node = MNodeService.getInstance(request).getCapabilities();
899
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
900
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
901
      assertNotNull(node);
902
      // TODO: should probably test other parts of the node information
903
      
904
    } catch (MarshallingException e) {
905
        e.printStackTrace();
906
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
907
        
908
    } catch (IOException e) {
909
        e.printStackTrace();
910
        fail("The node instance couldn't be read correctly:" + e.getMessage());
911
        
912
    } catch (Exception e) {
913
        e.printStackTrace();
914
        fail("Probably not yet implemented: " + e.getMessage());
915
        
916
    }
917
    
918
  }
919

    
920
  public void testPing() {
921

    
922
    try {
923
      Date mnDate = MNodeService.getInstance(request).ping();
924
      assertTrue(mnDate != null);
925
      
926
    } catch (NotImplemented e) {
927
      e.printStackTrace();
928
      fail("Unexpected error: " + e.getMessage());
929

    
930
    } catch (ServiceFailure e) {
931
      e.printStackTrace();
932
      fail("Unexpected error: " + e.getMessage());
933

    
934
    }  catch (InsufficientResources e) {
935
      e.printStackTrace();
936
      fail("Unexpected error: " + e.getMessage());
937

    
938
    }
939
    
940
  }
941

    
942
  public void testSynchronizationFailed() {
943
    printTestHeader("testSynchronizationFailed");
944
    try {
945
        Session session = getTestSession();
946
        
947
        // create the object
948
        Identifier pid = new Identifier();
949
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
950
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
951
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
952
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
953
        assertEquals(retPid.getValue(), pid.getValue());
954
        
955
        // pretend the sync failed, act as CN
956
      SynchronizationFailed syncFailed = 
957
        new SynchronizationFailed("0000", "Testing Synch Failure");
958
      syncFailed.setPid(pid.getValue());
959
      session = getCNSession();
960
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
961
    } catch (Exception e) {
962
      e.printStackTrace();
963
        fail("Unexpected error: " + e.getMessage());
964
    }
965

    
966
  }
967

    
968
  public void testSystemMetadataChanged() {
969
      printTestHeader("testSystemMetadataChanged");
970
      try {
971
          Session session = getTestSession();
972
          
973
          // create the object
974
          Identifier pid = new Identifier();
975
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
976
          Identifier sid = new Identifier();
977
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
978
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
979
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
980
          sysmeta.setSeriesId(sid);
981
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
982
          assertEquals(retPid.getValue(), pid.getValue());
983
          
984
          // pretend the system metadata changed on the CN
985
          MNodeService.getInstance(request).systemMetadataChanged(session, 
986
                  retPid, 5000L, Calendar.getInstance().getTime());
987
          MNodeService.getInstance(request).systemMetadataChanged(session, 
988
                  sid, 5000L, Calendar.getInstance().getTime());
989
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
990
                  retPid, 5000L, Calendar.getInstance().getTime());
991
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
992
                  sid, 5000L, Calendar.getInstance().getTime());
993
          
994
      } catch (Exception e) {
995
          if (e instanceof NotAuthorized) {
996
              // only CN subjects can call this
997
              // TODO: use a CN certificate in the tests
998
          } else {
999
              fail("Unexpected error: " + e.getMessage());
1000
              
1001
          }
1002
      }
1003

    
1004
    }
1005

    
1006
  public void testGetLogRecords() {
1007
    printTestHeader("testLogRecords");
1008

    
1009
    try {
1010
	    Log log = null;
1011
	    Session session = getCNSession();
1012
	    Date fromDate = new Date();
1013
	    Calendar calendar = Calendar.getInstance();
1014
	    calendar.setTime(fromDate);
1015
	    calendar.roll(Calendar.YEAR, false);
1016
	    fromDate = calendar.getTime();
1017
	    Date toDate = new Date();
1018
	    Event event = Event.CREATE;
1019
	    int start = 0;
1020
	    int count = 1;
1021
    
1022
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
1023
        event.xmlValue(), null, start, count);
1024
      
1025
      assertNotNull(log);      
1026
      assertTrue(log.getCount() == count);
1027
      assertTrue(log.getStart() == start);
1028
      assertTrue(log.getTotal() >= 1);
1029
        
1030
    } catch (Exception e) {
1031
      e.printStackTrace();
1032
      fail("Unexpected error: " + e.getMessage());
1033

    
1034
    }
1035
  }
1036

    
1037
  /**
1038
   * Testing setting access on a known object
1039
   */
1040
  public void testSetAccessPolicy() {
1041
    printTestHeader("testSetAccess");
1042
    
1043
    //boolean accessWasSet = false;
1044
    //
1045
    //try {
1046
    //  // create an object to set access on
1047
    //  Session session = getTestSession();
1048
    //  Identifier guid = new Identifier();
1049
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1050
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1051
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1052
    //  Identifier pid = 
1053
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1054
    //  // set the access
1055
    //  AccessPolicy accessPolicy = new AccessPolicy();
1056
    //  AccessRule allow = new AccessRule();
1057
    //  allow.addPermission(Permission.WRITE);
1058
    //  Subject publicSubject = new Subject();
1059
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1060
    //  allow.addSubject(publicSubject);
1061
    //  accessPolicy.addAllow(allow);
1062
    //  
1063
    //  accessWasSet = 
1064
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1065
    //  assertTrue(accessWasSet);
1066
    //  // test that it is enforced
1067
    //  session.setSubject(publicSubject);
1068
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1069
    //  assertTrue(isAuthorized);
1070
    //
1071
    //} catch (UnsupportedEncodingException e) {
1072
    //  e.printStackTrace();
1073
    //  
1074
    //} catch (InvalidToken e) {
1075
    //  e.printStackTrace();
1076
    //  fail("Unexpected error: " + e.getMessage());
1077
    //  
1078
    //} catch (ServiceFailure e) {
1079
    //  e.printStackTrace();
1080
    //  fail("Unexpected error: " + e.getMessage());
1081
    //  
1082
    //} catch (NotAuthorized e) {
1083
    //  e.printStackTrace();
1084
    //  fail("Unexpected error: " + e.getMessage());
1085
    //  
1086
    //} catch (IdentifierNotUnique e) {
1087
    //  e.printStackTrace();
1088
    //  fail("Unexpected error: " + e.getMessage());
1089
    //  
1090
    //} catch (UnsupportedType e) {
1091
    //  e.printStackTrace();
1092
    //  fail("Unexpected error: " + e.getMessage());
1093
    //  
1094
    //} catch (InsufficientResources e) {
1095
    //  e.printStackTrace();
1096
    //  fail("Unexpected error: " + e.getMessage());
1097
    //  
1098
    //} catch (InvalidSystemMetadata e) {
1099
    //  e.printStackTrace();
1100
    //  fail("Unexpected error: " + e.getMessage());
1101
    //  
1102
    //} catch (NotImplemented e) {
1103
    //  e.printStackTrace();
1104
    //  fail("Unexpected error: " + e.getMessage());
1105
    //  
1106
    //} catch (InvalidRequest e) {
1107
    //  e.printStackTrace();
1108
    //  fail("Unexpected error: " + e.getMessage());
1109
    //  
1110
    //} catch (NotFound 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
  /**
1123
   * Test if a subject is authorized to read a known object
1124
   */
1125
  public void testIsAuthorized() {
1126
    printTestHeader("testIsAuthorized");
1127
    
1128
    try {
1129
      Session session = getTestSession();
1130
      Identifier guid = new Identifier();
1131
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1132
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1133
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1134
      //non-public readable
1135
      AccessPolicy accessPolicy = new AccessPolicy();
1136
      AccessRule allow = new AccessRule();
1137
      allow.addPermission(Permission.READ);
1138
      Subject subject = new Subject();
1139
      subject.setValue("cn=test2,dc=dataone,dc=org");
1140
      allow.addSubject(subject);
1141
      accessPolicy.addAllow(allow);
1142
      sysmeta.setAccessPolicy(accessPolicy);
1143
      Identifier pid = 
1144
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1145
      boolean isAuthorized = 
1146
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1147
      assertEquals(isAuthorized, true);
1148
      isAuthorized = 
1149
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1150
      assertEquals(isAuthorized, true);
1151
      try {
1152
          isAuthorized = 
1153
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1154
          fail("we can reach here");
1155
      } catch(NotAuthorized ee) {
1156
          
1157
      }
1158
      
1159
     
1160
      Session session2= getAnotherSession();
1161
      isAuthorized = 
1162
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1163
      assertEquals(isAuthorized, true);
1164
     
1165
      try {
1166
          isAuthorized = 
1167
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1168
          fail("we can reach here");
1169
      } catch(NotAuthorized ee) {
1170
          
1171
      }
1172
      
1173
    
1174
      try {
1175
          isAuthorized = 
1176
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1177
          fail("we can reach here");
1178
      } catch(NotAuthorized ee) {
1179
          
1180
      }
1181
     
1182
      
1183
    } catch (UnsupportedEncodingException e) {
1184
      e.printStackTrace();
1185
      fail("Unexpected error: " + e.getMessage());
1186

    
1187
    } catch (InvalidToken e) {
1188
      e.printStackTrace();
1189
      fail("Unexpected error: " + e.getMessage());
1190

    
1191
    } catch (ServiceFailure e) {
1192
      e.printStackTrace();
1193
      fail("Unexpected error: " + e.getMessage());
1194

    
1195
    } catch (NotAuthorized e) {
1196
      e.printStackTrace();
1197
      fail("Unexpected error: " + e.getMessage());
1198

    
1199
    } catch (IdentifierNotUnique e) {
1200
      e.printStackTrace();
1201
      fail("Unexpected error: " + e.getMessage());
1202

    
1203
    } catch (UnsupportedType e) {
1204
      e.printStackTrace();
1205
      fail("Unexpected error: " + e.getMessage());
1206

    
1207
    } catch (InsufficientResources e) {
1208
      e.printStackTrace();
1209
      fail("Unexpected error: " + e.getMessage());
1210

    
1211
    } catch (InvalidSystemMetadata e) {
1212
      e.printStackTrace();
1213
      fail("Unexpected error: " + e.getMessage());
1214

    
1215
    } catch (NotImplemented e) {
1216
      e.printStackTrace();
1217
      fail("Unexpected error: " + e.getMessage());
1218

    
1219
    } catch (InvalidRequest e) {
1220
      e.printStackTrace();
1221
      fail("Unexpected error: " + e.getMessage());
1222

    
1223
    } catch (Exception e) {
1224
      e.printStackTrace();
1225
      fail("Unexpected error: " + e.getMessage());
1226

    
1227
    }
1228
  }
1229
  
1230
  /**
1231
   * Test if node admin is authorized to read a known object
1232
   */
1233
  public void testIsAdminAuthorized() {
1234
    printTestHeader("testIsAdminAuthorized");
1235
    
1236
    try {
1237
      Session session = getTestSession();
1238
      Identifier guid = new Identifier();
1239
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1240
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1241
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1242
      Identifier pid = 
1243
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1244
      
1245
      // test as public - read
1246
      boolean isAuthorized = 
1247
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1248
      assertEquals(isAuthorized, true);
1249
      
1250
      // test as public - change perm
1251
      isAuthorized = 
1252
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1253
      assertEquals(isAuthorized, false);
1254
      
1255
      //test write by another session
1256
      Session session2 = getAnotherSession();
1257
      isAuthorized = 
1258
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1259
            assertEquals(isAuthorized, false);
1260
      
1261
      // test as admin
1262
      isAuthorized = 
1263
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1264
    	      assertEquals(isAuthorized, true);
1265
     // test as cn
1266
    	isAuthorized = 
1267
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1268
    	              assertEquals(isAuthorized, true);      
1269
      
1270
    } catch (Exception e) {
1271
      e.printStackTrace();
1272
      fail("Unexpected error: " + e.getMessage());
1273

    
1274
    } 
1275
  }
1276

    
1277
  
1278
  public void testIsEquivIdentityAuthorized() {
1279
      printTestHeader("testIsEquivIdentityAuthorized");
1280

    
1281
      try {
1282
          Session session = new Session();
1283
          Subject s = new Subject();
1284
          s.setValue("cn=test,dc=dataone,dc=org");
1285
          session.setSubject(s);
1286
          
1287
          Identifier pid = new Identifier();
1288
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1289
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1290
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1291
          
1292
          // reset the access policy to only allow 'self' read (no public)
1293
          AccessPolicy ap = new AccessPolicy();
1294
          AccessRule ar = new AccessRule();
1295
          List<Subject> sList = new ArrayList<Subject>();
1296
          sList.add(session.getSubject());
1297
          ar.setSubjectList(sList);
1298
          List<Permission> permList = new ArrayList<Permission>();
1299
          permList.add(Permission.CHANGE_PERMISSION);
1300
          ar.setPermissionList(permList);
1301
          ap.addAllow(ar);
1302
          sysmeta.setAccessPolicy(ap);
1303
          
1304
          // save it
1305
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1306
          assertEquals(pid.getValue(), retPid.getValue());
1307
          
1308
          //check it against an equivalent identity not listed in the access policy
1309
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1310
          SubjectInfo subjectInfo = new SubjectInfo();
1311
          Person person = new Person();
1312
          person.setSubject(session.getSubject());
1313
          List<String> givenNames = new ArrayList<String>();
1314
          givenNames.add("New");
1315
          person.setGivenNameList(givenNames);
1316
          person.setFamilyName("Subject");
1317
          
1318
          // add equivalent identities
1319
          List<Subject> equivIdentities = new ArrayList<Subject>();
1320
          Subject mappedSubject2 = new Subject();
1321
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1322
          equivIdentities.add(mappedSubject2);
1323
          
1324
          Subject mappedSubject = new Subject();
1325
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1326
          equivIdentities.add(mappedSubject);          
1327
          
1328
          person.setEquivalentIdentityList(equivIdentities);
1329
          
1330
          List<Person> personList = new ArrayList<Person>();
1331
          personList.add(person);
1332
          subjectInfo.setPersonList(personList);
1333
          
1334
          // update the session to include subject info with a mapped identity
1335
          session.setSubjectInfo(subjectInfo);
1336
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1337
          assertTrue(result);
1338
        
1339
    } catch (Exception e) {
1340
        e.printStackTrace();
1341
        
1342
    }
1343
    
1344
  }
1345

    
1346
/**
1347
   * Test object creation failure when there is a space in the identifier
1348
   */
1349
  public void testCreateInvalidIdentifier() {
1350
    printTestHeader("testCreateInvalidIdentifier");
1351
    
1352
    try {
1353
      Session session = getTestSession();
1354
      Identifier guid = new Identifier();
1355
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1356
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1357
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1358
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1359
      fail("Should not be able to create with whitespace in indentifier");
1360
    } catch (InvalidRequest e) {
1361
    	// expect that this request fails
1362
        assertTrue(true);
1363
    } catch (Exception e) {
1364
      e.printStackTrace();
1365
      fail("Unexpected error: " + e.getMessage());
1366
    }
1367
      
1368
  }
1369
  
1370
	/**
1371
	 * Test getting a known object
1372
	 */
1373
	public void testGetPackage() {
1374
		printTestHeader("testGetPackage");
1375

    
1376
		try {
1377
			Session session = getTestSession();
1378
			Identifier guid = new Identifier();
1379
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1380
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1381
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1382
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1383
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1384
			format.setValue("application/bagit-097");
1385
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1386
			/*File bagFile = File.createTempFile("bagit.", ".zip");
1387
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1388
			BagFactory bagFactory = new BagFactory();
1389
			Bag bag = bagFactory.createBag(bagFile);
1390
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1391
			
1392
			// go back to beginning of original stream
1393
			object.reset();
1394
			// check
1395
			assertTrue(object.available() > 0);
1396
			assertTrue(result.available() > 0);
1397
			assertTrue(IOUtils.contentEquals(result, object));
1398
			
1399
			// clean up
1400
			bagFile.delete();*/
1401

    
1402
		} catch(InvalidRequest e) {
1403
		    
1404
		} catch (Exception e) {
1405
			e.printStackTrace();
1406
			fail("Unexpected error: " + e.getMessage());
1407
		}
1408
	}
1409
	
1410
	
1411
	/**
1412
	 * Test getting a known object
1413
	 */
1414
	public void testGetOREPackage() {
1415
		printTestHeader("testGetOREPackage");
1416

    
1417
		try {
1418
			
1419
			// construct the ORE package
1420
			Identifier resourceMapId = new Identifier();
1421
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1422
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1423
			Identifier metadataId = new Identifier();
1424
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1425
			List<Identifier> dataIds = new ArrayList<Identifier>();
1426
			Identifier dataId = new Identifier();
1427
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1428
			Identifier dataId2 = new Identifier();
1429
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1430
			dataIds.add(dataId);
1431
			dataIds.add(dataId2);
1432
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1433
			idMap.put(metadataId, dataIds);
1434
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1435
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1436
			assertNotNull(resourceMap);
1437
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1438
			assertNotNull(rdfXml);
1439
			
1440
			Session session = getTestSession();
1441
			InputStream object = null;
1442
			SystemMetadata sysmeta = null;
1443
			
1444
			// save the data objects (data just contains their ID)
1445
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1446
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1447
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1448
			// second data file
1449
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1450
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1451
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1452
			// metadata file
1453
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1454
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1455
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1456
						
1457
			// save the ORE object
1458
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1459
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1460
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1461
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1462
			
1463
			// get the package we uploaded
1464
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1465
            format.setValue("application/bagit-097");
1466
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1467
			File bagFile = File.createTempFile("bagit.", ".zip");
1468
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1469
			BagFactory bagFactory = new BagFactory();
1470
			Bag bag = bagFactory.createBag(bagFile);
1471
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1472
			while (manifestIter.hasNext()) {
1473
				String filepath = manifestIter.next().getFilepath();
1474
				BagFile entryFile = bag.getBagFile(filepath);
1475
				InputStream result = entryFile.newInputStream();
1476
				// check ORE
1477
				if (filepath.contains(resourceMapId.getValue())) {
1478
					object.reset();
1479
					assertTrue(object.available() > 0);
1480
					assertTrue(result.available() > 0);
1481
					assertTrue(IOUtils.contentEquals(result, object));
1482
				}
1483
				// check metadata
1484
				if (filepath.contains(metadataId.getValue())) {
1485
					metadataObject.reset();
1486
					assertTrue(metadataObject.available() > 0);
1487
					assertTrue(result.available() > 0);
1488
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1489
				}
1490
				if (filepath.contains(dataId.getValue())) {
1491
					dataObject1.reset();
1492
					assertTrue(dataObject1.available() > 0);
1493
					assertTrue(result.available() > 0);
1494
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1495
				}
1496
				if (filepath.contains(dataId2.getValue())) {
1497
					dataObject2.reset();
1498
					assertTrue(dataObject2.available() > 0);
1499
					assertTrue(result.available() > 0);
1500
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1501
				}
1502
				
1503
				
1504
			}
1505
			
1506
			// clean up
1507
			bagFile.delete();
1508
			
1509
			// test the ORE lookup
1510
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1511
			assertTrue(oreIds.contains(resourceMapId));
1512

    
1513
		} catch (Exception e) {
1514
			e.printStackTrace();
1515
			fail("Unexpected error: " + e.getMessage());
1516
		}
1517
	}
1518
	
1519
	/**
1520
     * Test the extra "delete information" was added to the NotFoundException
1521
     * if the object was delete in the following methods:
1522
     * MN.get
1523
     * MN.getSystemmetadata
1524
     * MN.describe
1525
     * MN.getChecksum
1526
     * MN.getRelica
1527
     */
1528
    public void testReadDeletedObject() {
1529
        printTestHeader("testDelete");
1530

    
1531
        try {
1532
          Session session = getTestSession();
1533
          Identifier guid = new Identifier();
1534
          guid.setValue("testDelete." + System.currentTimeMillis());
1535
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1536
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1537
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1538
          Thread.sleep(3000);
1539
          // use MN admin to delete
1540
          session = getMNSession();
1541
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1542
          System.out.println("after deleting");
1543
          assertEquals(pid.getValue(), deletedPid.getValue());
1544
          // check that we cannot get the object
1545
          session = getTestSession();
1546
          InputStream deletedObject = null;
1547
          try {
1548
              //System.out.println("before read ===============");
1549
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1550
              //System.out.println("after read ===============");
1551
          } catch (NotFound nf) {
1552
              assertTrue(nf.getMessage().contains("deleted"));
1553
          }
1554
          try {
1555
              //System.out.println("before read ===============");
1556
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1557
              //System.out.println("after read ===============");
1558
          } catch (NotFound nf) {
1559
              //System.out.println("the exception is "+nf.getMessage());
1560
              assertTrue(nf.getMessage().contains("deleted"));
1561
          }
1562
          
1563
          try {
1564
              //System.out.println("before read ===============");
1565
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1566
              //System.out.println("after read ===============");
1567
          } catch (NotFound nf) {
1568
              //System.out.println("the exception is "+nf.getMessage());
1569
              assertTrue(nf.getMessage().contains("deleted"));
1570
          }
1571
          
1572
          try {
1573
              //System.out.println("before read ===============");
1574
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1575
              //System.out.println("after read ===============");
1576
          } catch (NotFound nf) {
1577
              //System.out.println("the exception 3 is "+nf.getMessage());
1578
              assertTrue(nf.getMessage().contains("deleted"));
1579
          }
1580
          
1581
          try {
1582
              //System.out.println("before read ===============");
1583
              boolean isAuthorized = 
1584
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1585
              //System.out.println("after read ===============");
1586
          } catch (NotFound nf) {
1587
              System.out.println("the exception 4 is "+nf.getMessage());
1588
              assertTrue(nf.getMessage().contains("deleted"));
1589
          }
1590
          
1591
          assertNull(deletedObject);
1592
          
1593
        } catch (UnsupportedEncodingException e) {
1594
          e.printStackTrace();
1595
          
1596
        } catch (Exception e) {
1597
          e.printStackTrace();
1598
          fail("Unexpected error: " + e.getMessage());
1599

    
1600
        } 
1601
    }
1602
    
1603
    /**
1604
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1605
     * has some special charaters. The saved document should has the same bytes as the origianl.
1606
     */
1607
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1608
          String algorithm = "md5";
1609
          Session session = getTestSession();
1610
          Identifier guid = new Identifier();
1611
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1612
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1613
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1614
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1615
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1616
          Identifier pid = 
1617
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1618
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1619
          byte[] readBytes = IOUtils.toByteArray(readResult);
1620
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1621
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1622
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1623
          
1624
          Identifier newPid = new Identifier();
1625
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1626
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1627
                
1628
          // do the update
1629
          Identifier updatedPid = 
1630
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1631
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1632
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1633
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1634
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1635
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1636

    
1637
          
1638
    }
1639
  
1640
    /**
1641
     * Test the method - get api  for a speicified SID
1642
     */
1643
    public void testGetSID() {
1644
        String str1 = "object1";
1645
        String str2 = "object2";
1646
        String str3 = "object3";
1647
        Date fromDate = new Date();
1648
        Calendar calendar = Calendar.getInstance();
1649
        calendar.setTime(fromDate);
1650
        calendar.roll(Calendar.YEAR, false);
1651
        fromDate = calendar.getTime();
1652
        try {
1653
            //insert test documents with a series id
1654
            Session session = getTestSession();
1655
            Identifier guid = new Identifier();
1656
            guid.setValue(generateDocumentId());
1657
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1658
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1659
            String sid1= "sid."+System.nanoTime();
1660
            Identifier seriesId = new Identifier();
1661
            seriesId.setValue(sid1);
1662
            System.out.println("the first sid is "+seriesId.getValue());
1663
            sysmeta.setSeriesId(seriesId);
1664
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1665
            System.out.println("the first pid is "+guid.getValue());
1666
            //test the get(pid) for v2
1667
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1668
            // go back to beginning of original stream
1669
            object1.reset();
1670
            // check
1671
            assertTrue(object1.available() > 0);
1672
            assertTrue(result.available() > 0);
1673
            assertTrue(IOUtils.contentEquals(result, object1));
1674
            // test the get(id) for v2
1675
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1676
            object1.reset();
1677
            // check
1678
            assertTrue(object1.available() > 0);
1679
            assertTrue(result1.available() > 0);
1680
            assertTrue(IOUtils.contentEquals(result1, object1));
1681
            //test the get(pid) for v1
1682
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1683
            object1.reset();
1684
            // check
1685
            assertTrue(object1.available() > 0);
1686
            assertTrue(result2.available() > 0);
1687
            assertTrue(IOUtils.contentEquals(result2, object1));
1688
            //test the get(sid) for v1
1689
            try {
1690
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1691
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1692
            } catch (NotFound ee) {
1693
                
1694
            }
1695
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1696
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1697
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1698
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1699
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1700
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1701
            
1702
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1703
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1704
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1705
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1706
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1707
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1708
            
1709
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1710
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1711
            
1712
            try {
1713
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1714
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1715
            } catch(NotFound nf2) {
1716
                
1717
            }
1718
            
1719
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1720
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1721
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1722
            try {
1723
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1724
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1725
            } catch(NotFound nf2) {
1726
                
1727
            }
1728
            
1729
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1730
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1731
            
1732
            try {
1733
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1734
                fail("the getCheckSum shouldn't work for sid");
1735
            } catch(NotFound nf3) {
1736
                
1737
            }
1738
            
1739
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1740
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1741
            
1742
            try {
1743
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1744
                fail("the getCheckSum shouldn't work for sid");
1745
            } catch(NotFound nf3) {
1746
                
1747
            }
1748
            
1749
            boolean isAuthorized = 
1750
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1751
            assertEquals(isAuthorized, true);
1752
            
1753
            isAuthorized = 
1754
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1755
            assertEquals(isAuthorized, true);
1756
            
1757
            isAuthorized = 
1758
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1759
            assertEquals(isAuthorized, true);
1760
            
1761
            try {
1762
                isAuthorized = 
1763
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1764
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1765
            } catch (NotFound e) {
1766
                
1767
            }
1768
            
1769
            Session cnsession = getCNSession();
1770
            Date toDate = new Date();
1771
            Event event = Event.READ;
1772
            int start = 0;
1773
            int count = 1;
1774
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1775
            event.xmlValue(), seriesId.getValue(), start, count);
1776
          
1777
          assertNotNull(log);      
1778
          assertTrue(log.getCount() == count);
1779
          assertTrue(log.getStart() == start);
1780
          assertTrue(log.getTotal() >= 1);
1781
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1782

    
1783
            //do a update with the same series id
1784
            Thread.sleep(1000);
1785
            Identifier newPid = new Identifier();
1786
            newPid.setValue(generateDocumentId()+"1");
1787
            System.out.println("the second pid is "+newPid.getValue());
1788
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1789
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1790
            newSysMeta.setObsoletes(guid);
1791
            newSysMeta.setSeriesId(seriesId);
1792
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1793
           
1794
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1795
            // go back to beginning of original stream
1796
            object1.reset();
1797
            // check
1798
            assertTrue(object1.available() > 0);
1799
            assertTrue(result4.available() > 0);
1800
            assertTrue(IOUtils.contentEquals(result4, object1));
1801
            
1802
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1803
            // go back to beginning of original stream
1804
            object2.reset();
1805
            // check
1806
            assertTrue(object2.available() > 0);
1807
            assertTrue(result5.available() > 0);
1808
            assertTrue(IOUtils.contentEquals(result5, object2));
1809
            
1810

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

    
2261
        //insert two documents 
2262
        Session session = getTestSession();
2263
        Identifier guid1 = new Identifier();
2264
        guid1.setValue(generateDocumentId());
2265
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2266
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2267
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2268
        //Test the generating object succeeded. 
2269
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2270
        assertTrue(metadata.getIdentifier().equals(guid1));
2271
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2272
        
2273
        Identifier guid2 = new Identifier();
2274
        guid2.setValue(generateDocumentId());
2275
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2276
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2277
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2278
        //Test the generating object succeeded. 
2279
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2280
        assertTrue(metadata.getIdentifier().equals(guid2));
2281
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2282
        
2283
        
2284
        
2285
        //update the system metadata without touching the obsoletes and obsoletdBy
2286
        AccessPolicy accessPolicy = new AccessPolicy();
2287
        AccessRule allow = new AccessRule();
2288
        allow.addPermission(Permission.WRITE);
2289
        Subject subject = new Subject();
2290
        subject.setValue("user_foo");
2291
        allow.addSubject(subject);
2292
        accessPolicy.addAllow(allow);
2293
        sysmeta1.setAccessPolicy(accessPolicy);
2294
        BigInteger serialVersion = metadata.getSerialVersion();
2295
        serialVersion = serialVersion.add(BigInteger.ONE);
2296
        sysmeta1.setSerialVersion(serialVersion);
2297
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2298
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2299
        assertTrue(metadata.getIdentifier().equals(guid1));
2300
        assertTrue(metadata.getObsoletedBy() == null);
2301
        assertTrue(metadata.getObsoletes() == null);
2302
        Session newSession = new Session();
2303
        newSession.setSubject(subject);
2304
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2305
        assertTrue(isAuthorized);
2306
        
2307
        sysmeta2.setAccessPolicy(accessPolicy);
2308
        serialVersion = metadata.getSerialVersion();
2309
        serialVersion = serialVersion.add(BigInteger.ONE);
2310
        sysmeta2.setSerialVersion(serialVersion);
2311
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2312
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2313
        assertTrue(metadata.getIdentifier().equals(guid2));
2314
        assertTrue(metadata.getObsoletes() == null);
2315
        assertTrue(metadata.getObsoletedBy() == null);
2316
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2317
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2318
        assertTrue(isAuthorized);
2319
        
2320
        
2321
        
2322
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2323
        sysmeta1.setObsoletedBy(guid2);
2324
        serialVersion = metadata.getSerialVersion();
2325
        serialVersion = serialVersion.add(BigInteger.ONE);
2326
        sysmeta1.setSerialVersion(serialVersion);
2327
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2328
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2329
        assertTrue(metadata.getIdentifier().equals(guid1));
2330
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2331
        assertTrue(metadata.getObsoletes() == null);
2332
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2333
        
2334
        sysmeta2.setObsoletes(guid1);
2335
        serialVersion = metadata.getSerialVersion();
2336
        serialVersion = serialVersion.add(BigInteger.ONE);
2337
        sysmeta2.setSerialVersion(serialVersion);
2338
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2339
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2340
        assertTrue(metadata.getIdentifier().equals(guid2));
2341
        assertTrue(metadata.getObsoletes().equals(guid1));
2342
        assertTrue(metadata.getObsoletedBy() == null);
2343
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2344
        
2345
        
2346
        
2347
        
2348
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2349
        sysmeta1.setObsoletedBy(guid2);
2350
        serialVersion = metadata.getSerialVersion();
2351
        serialVersion = serialVersion.add(BigInteger.ONE);
2352
        sysmeta1.setSerialVersion(serialVersion);
2353
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2354
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2355
        assertTrue(metadata.getIdentifier().equals(guid1));
2356
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2357
        assertTrue(metadata.getObsoletes() == null);
2358
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2359
        
2360
        sysmeta2.setObsoletes(guid1);
2361
        serialVersion = metadata.getSerialVersion();
2362
        serialVersion = serialVersion.add(BigInteger.ONE);
2363
        sysmeta2.setSerialVersion(serialVersion);
2364
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2365
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2366
        assertTrue(metadata.getIdentifier().equals(guid2));
2367
        assertTrue(metadata.getObsoletes().equals(guid1));
2368
        assertTrue(metadata.getObsoletedBy() == null);
2369
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2370
        
2371

    
2372
        
2373
        
2374
        
2375
        //resetting the obsoletes and obsoletedBy fails
2376
        Identifier newId = new Identifier();
2377
        newId.setValue("newValue");
2378
        sysmeta1.setObsoletedBy(newId);
2379
        serialVersion = metadata.getSerialVersion();
2380
        serialVersion = serialVersion.add(BigInteger.ONE);
2381
        sysmeta1.setSerialVersion(serialVersion);
2382
        try {
2383
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2384
            fail("We shouldn't get there");
2385
        } catch (Exception e) {
2386
            e.printStackTrace();
2387
            assertTrue(e instanceof InvalidRequest);
2388
        }
2389
       
2390
        sysmeta2.setObsoletes(newId);
2391
        serialVersion = metadata.getSerialVersion();
2392
        serialVersion = serialVersion.add(BigInteger.ONE);
2393
        sysmeta2.setSerialVersion(serialVersion);
2394
        try {
2395
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2396
            fail("We shouldn't get there");
2397
        } catch (Exception e) {
2398
            e.printStackTrace();
2399
            assertTrue(e instanceof InvalidRequest);
2400
        }
2401
        
2402
        
2403
        
2404
        
2405
        //insert another object
2406
        Identifier guid5 = new Identifier();
2407
        guid5.setValue(generateDocumentId());
2408
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2409
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2410
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2411
        //Test the generating object succeeded. 
2412
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2413
        assertTrue(metadata.getIdentifier().equals(guid5));
2414
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2415
        
2416
        
2417
        
2418
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2419
        sysmeta5.setObsoletes(guid1);
2420
        serialVersion = metadata.getSerialVersion();
2421
        serialVersion = serialVersion.add(BigInteger.ONE);
2422
        sysmeta5.setSerialVersion(serialVersion);
2423
        try {
2424
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2425
            fail("We shouldn't get there");
2426
        } catch (Exception e) {
2427
            e.printStackTrace();
2428
            
2429
        }
2430
        
2431
        
2432
       
2433
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2434
        sysmeta5.setObsoletes(null);
2435
        sysmeta5.setObsoletedBy(guid2);
2436
        try {
2437
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2438
            fail("We shouldn't get there");
2439
        } catch (Exception e) {
2440
            e.printStackTrace();
2441
            
2442
        }
2443
        
2444
        
2445
        
2446
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2447
        sysmeta5.setObsoletedBy(null);
2448
        sysmeta5.setObsoletes(guid2);
2449
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2450
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2451
        assertTrue(metadata.getIdentifier().equals(guid5));
2452
        assertTrue(metadata.getObsoletes().equals(guid2));
2453
        assertTrue(metadata.getObsoletedBy() == null);
2454
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2455
        
2456
        
2457
        
2458
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2459
        sysmeta2.setObsoletes(guid1);
2460
        sysmeta2.setObsoletedBy(guid5);
2461
        serialVersion = sysmeta2.getSerialVersion();
2462
        serialVersion = serialVersion.add(BigInteger.ONE);
2463
        sysmeta2.setSerialVersion(serialVersion);
2464
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2465
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2466
        assertTrue(metadata.getIdentifier().equals(guid2));
2467
        assertTrue(metadata.getObsoletes().equals(guid1));
2468
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2469
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2470
    }
2471
    
2472
    /**
2473
     * Test to create a metacat object which uses the isotc211 noaa variant.
2474
     * @throws Exception
2475
     */
2476
    public void testCreateNOAAObject() throws Exception {
2477
        Session session = getTestSession();
2478
        Identifier guid = new Identifier();
2479
        guid.setValue("testNoaa." + System.currentTimeMillis());
2480
        InputStream object = new FileInputStream("test/sciencemetadata-noaa.xml");
2481
        InputStream sysmetaInput = new FileInputStream("test/sysmeta-noaa.xml");
2482
        SystemMetadata sysmeta = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmetaInput);
2483
        sysmeta.setIdentifier(guid);
2484
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
2485
        assertTrue(pid.getValue().equals(guid.getValue()));
2486
    }
2487
    
2488
    
2489
    /**
2490
     * Test the permission control on the updateSystemMetadata method
2491
     * @throws Exception
2492
     */
2493
    public void testPermissionOfUpdateSystemmeta() throws Exception {
2494
        String str = "object1";
2495
       
2496
        Date date = new Date();
2497
        Thread.sleep(2000);
2498
        //insert a test document
2499
        Session session = getTestSession();
2500
        Identifier guid = new Identifier();
2501
        guid.setValue(generateDocumentId());
2502
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2503
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2504
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2505
        //Test the generating object succeeded. 
2506
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2507
        
2508
        //Test cn session -success
2509
        Session cnSession= getCNSession();
2510
        MNodeService.getInstance(request).updateSystemMetadata(cnSession, guid, metadata);
2511
        
2512
        //Test mn session - success
2513
        Session mnSession = getMNSession();
2514
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2515
        MNodeService.getInstance(request).updateSystemMetadata(mnSession, guid, metadata);
2516
        
2517
        //Test the owner session -success
2518
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2519
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2520
        
2521
        //Test another session -failed
2522
        Session anotherSession = getAnotherSession();
2523
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2524
        try {
2525
             MNodeService.getInstance(request).updateSystemMetadata(anotherSession, guid, metadata);
2526
            fail("Another user can't update the system metadata");
2527
        } catch (NotAuthorized e)  {
2528
            
2529
        }
2530
       
2531
    }
2532
}
(4-4/8)