Project

General

Profile

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

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

    
28

    
29

    
30

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

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

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

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

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

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

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

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

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

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

    
277
  }
278

    
279
  /**
280
   * Test getting the system metadata of an object
281
   */
282
  public void testGetSystemMetadata() {    
283
    printTestHeader("testGetSystemMetadata");
284

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

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

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

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

    
312
    } catch (IdentifierNotUnique e) {
313
      e.printStackTrace();
314
      fail("Unexpected error: " + e.getMessage());
315
      
316
    } catch (UnsupportedType e) {
317
      e.printStackTrace();
318
      fail("Unexpected error: " + e.getMessage());
319

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

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

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

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

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

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

    
344
    }
345
    
346
  }
347

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

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

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

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

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

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

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

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

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

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

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

    
430
    }
431
      
432
  }
433

    
434
  /**
435
   * test object deletion
436
   */
437
  public void testDelete() {
438
    printTestHeader("testDelete");
439

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

    
469
    } 
470

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
683
    }
684
  }
685

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

    
719
  /**
720
   * Test describing an object
721
   */
722
  public void testDescribe() {
723
    printTestHeader("testDescribe");
724

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

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

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

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

    
752
    } catch (IdentifierNotUnique e) {
753
      e.printStackTrace();
754
      fail("Unexpected error: " + e.getMessage());
755
      
756
    } catch (UnsupportedType e) {
757
      e.printStackTrace();
758
      fail("Unexpected error: " + e.getMessage());
759

    
760
    } catch (InsufficientResources e) {
761
      e.printStackTrace();
762
      fail("Unexpected error: " + e.getMessage());
763

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

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

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

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

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

    
784
    }
785
  }
786

    
787
  /**
788
   * Test getting the checksum of an object
789
   */
790
  public void testGetChecksum() {
791
    printTestHeader("testGetChecksum");
792

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

    
807
    } catch (InvalidToken e) {
808
      e.printStackTrace();
809
      fail("Unexpected error: " + e.getMessage());
810

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

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

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

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

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

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

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

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

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

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

    
851
    }
852
    
853
  }
854

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

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

    
915
  public void testPing() {
916

    
917
    try {
918
      Date mnDate = MNodeService.getInstance(request).ping();
919
      assertTrue(mnDate != null);
920
      
921
    } catch (NotImplemented e) {
922
      e.printStackTrace();
923
      fail("Unexpected error: " + e.getMessage());
924

    
925
    } catch (ServiceFailure e) {
926
      e.printStackTrace();
927
      fail("Unexpected error: " + e.getMessage());
928

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

    
933
    }
934
    
935
  }
936

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

    
961
  }
962

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

    
999
    }
1000

    
1001
  public void testGetLogRecords() {
1002
    printTestHeader("testLogRecords");
1003

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

    
1029
    }
1030
  }
1031

    
1032
  /**
1033
   * Testing setting access on a known object
1034
   */
1035
  public void testSetAccessPolicy() {
1036
    printTestHeader("testSetAccess");
1037
    
1038
    //boolean accessWasSet = false;
1039
    //
1040
    //try {
1041
    //  // create an object to set access on
1042
    //  Session session = getTestSession();
1043
    //  Identifier guid = new Identifier();
1044
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1045
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1046
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1047
    //  Identifier pid = 
1048
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1049
    //  // set the access
1050
    //  AccessPolicy accessPolicy = new AccessPolicy();
1051
    //  AccessRule allow = new AccessRule();
1052
    //  allow.addPermission(Permission.WRITE);
1053
    //  Subject publicSubject = new Subject();
1054
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1055
    //  allow.addSubject(publicSubject);
1056
    //  accessPolicy.addAllow(allow);
1057
    //  
1058
    //  accessWasSet = 
1059
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1060
    //  assertTrue(accessWasSet);
1061
    //  // test that it is enforced
1062
    //  session.setSubject(publicSubject);
1063
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1064
    //  assertTrue(isAuthorized);
1065
    //
1066
    //} catch (UnsupportedEncodingException e) {
1067
    //  e.printStackTrace();
1068
    //  
1069
    //} catch (InvalidToken e) {
1070
    //  e.printStackTrace();
1071
    //  fail("Unexpected error: " + e.getMessage());
1072
    //  
1073
    //} catch (ServiceFailure e) {
1074
    //  e.printStackTrace();
1075
    //  fail("Unexpected error: " + e.getMessage());
1076
    //  
1077
    //} catch (NotAuthorized e) {
1078
    //  e.printStackTrace();
1079
    //  fail("Unexpected error: " + e.getMessage());
1080
    //  
1081
    //} catch (IdentifierNotUnique e) {
1082
    //  e.printStackTrace();
1083
    //  fail("Unexpected error: " + e.getMessage());
1084
    //  
1085
    //} catch (UnsupportedType e) {
1086
    //  e.printStackTrace();
1087
    //  fail("Unexpected error: " + e.getMessage());
1088
    //  
1089
    //} catch (InsufficientResources e) {
1090
    //  e.printStackTrace();
1091
    //  fail("Unexpected error: " + e.getMessage());
1092
    //  
1093
    //} catch (InvalidSystemMetadata e) {
1094
    //  e.printStackTrace();
1095
    //  fail("Unexpected error: " + e.getMessage());
1096
    //  
1097
    //} catch (NotImplemented e) {
1098
    //  e.printStackTrace();
1099
    //  fail("Unexpected error: " + e.getMessage());
1100
    //  
1101
    //} catch (InvalidRequest e) {
1102
    //  e.printStackTrace();
1103
    //  fail("Unexpected error: " + e.getMessage());
1104
    //  
1105
    //} catch (NotFound e) {
1106
    //  e.printStackTrace();
1107
    //  fail("Unexpected error: " + e.getMessage());
1108
    //  
1109
    //} catch (Exception e) {
1110
    //  e.printStackTrace();
1111
    //  fail("Unexpected error: " + e.getMessage());
1112
    //  
1113
    //}
1114
      
1115
  }
1116

    
1117
  /**
1118
   * Test if a subject is authorized to read a known object
1119
   */
1120
  public void testIsAuthorized() {
1121
    printTestHeader("testIsAuthorized");
1122
    
1123
    try {
1124
      Session session = getTestSession();
1125
      Identifier guid = new Identifier();
1126
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1127
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1128
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1129
      //non-public readable
1130
      AccessPolicy accessPolicy = new AccessPolicy();
1131
      AccessRule allow = new AccessRule();
1132
      allow.addPermission(Permission.READ);
1133
      Subject subject = new Subject();
1134
      subject.setValue("cn=test2,dc=dataone,dc=org");
1135
      allow.addSubject(subject);
1136
      accessPolicy.addAllow(allow);
1137
      sysmeta.setAccessPolicy(accessPolicy);
1138
      Identifier pid = 
1139
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1140
      boolean isAuthorized = 
1141
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1142
      assertEquals(isAuthorized, true);
1143
      isAuthorized = 
1144
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1145
      assertEquals(isAuthorized, true);
1146
      try {
1147
          isAuthorized = 
1148
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1149
          fail("we can reach here");
1150
      } catch(NotAuthorized ee) {
1151
          
1152
      }
1153
      
1154
     
1155
      Session session2= getAnotherSession();
1156
      isAuthorized = 
1157
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1158
      assertEquals(isAuthorized, true);
1159
     
1160
      try {
1161
          isAuthorized = 
1162
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1163
          fail("we can reach here");
1164
      } catch(NotAuthorized ee) {
1165
          
1166
      }
1167
      
1168
    
1169
      try {
1170
          isAuthorized = 
1171
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1172
          fail("we can reach here");
1173
      } catch(NotAuthorized ee) {
1174
          
1175
      }
1176
     
1177
      
1178
    } catch (UnsupportedEncodingException e) {
1179
      e.printStackTrace();
1180
      fail("Unexpected error: " + e.getMessage());
1181

    
1182
    } catch (InvalidToken e) {
1183
      e.printStackTrace();
1184
      fail("Unexpected error: " + e.getMessage());
1185

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

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

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

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

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

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

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

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

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

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

    
1269
    } 
1270
  }
1271

    
1272
  
1273
  public void testIsEquivIdentityAuthorized() {
1274
      printTestHeader("testIsEquivIdentityAuthorized");
1275

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

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

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

    
1397
		} catch(InvalidRequest e) {
1398
		    
1399
		} catch (Exception e) {
1400
			e.printStackTrace();
1401
			fail("Unexpected error: " + e.getMessage());
1402
		}
1403
	}
1404
	
1405
	
1406
	/**
1407
	 * Test getting a known object
1408
	 */
1409
	public void testGetOREPackage() {
1410
		printTestHeader("testGetOREPackage");
1411

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

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

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

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

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

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

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

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

    
2367
        
2368
        
2369
        
2370
        //resetting the obsoletes and obsoletedBy fails
2371
        Identifier newId = new Identifier();
2372
        newId.setValue("newValue");
2373
        sysmeta1.setObsoletedBy(newId);
2374
        serialVersion = metadata.getSerialVersion();
2375
        serialVersion = serialVersion.add(BigInteger.ONE);
2376
        sysmeta1.setSerialVersion(serialVersion);
2377
        try {
2378
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2379
            fail("We shouldn't get there");
2380
        } catch (Exception e) {
2381
            e.printStackTrace();
2382
            assertTrue(e instanceof InvalidRequest);
2383
        }
2384
       
2385
        sysmeta2.setObsoletes(newId);
2386
        serialVersion = metadata.getSerialVersion();
2387
        serialVersion = serialVersion.add(BigInteger.ONE);
2388
        sysmeta2.setSerialVersion(serialVersion);
2389
        try {
2390
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2391
            fail("We shouldn't get there");
2392
        } catch (Exception e) {
2393
            e.printStackTrace();
2394
            assertTrue(e instanceof InvalidRequest);
2395
        }
2396
        
2397
        
2398
        
2399
        
2400
        //insert another object
2401
        Identifier guid5 = new Identifier();
2402
        guid5.setValue(generateDocumentId());
2403
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2404
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2405
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2406
        //Test the generating object succeeded. 
2407
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2408
        assertTrue(metadata.getIdentifier().equals(guid5));
2409
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2410
        
2411
        
2412
        
2413
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2414
        sysmeta5.setObsoletes(guid1);
2415
        serialVersion = metadata.getSerialVersion();
2416
        serialVersion = serialVersion.add(BigInteger.ONE);
2417
        sysmeta5.setSerialVersion(serialVersion);
2418
        try {
2419
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2420
            fail("We shouldn't get there");
2421
        } catch (Exception e) {
2422
            e.printStackTrace();
2423
            
2424
        }
2425
        
2426
        
2427
       
2428
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2429
        sysmeta5.setObsoletes(null);
2430
        sysmeta5.setObsoletedBy(guid2);
2431
        try {
2432
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2433
            fail("We shouldn't get there");
2434
        } catch (Exception e) {
2435
            e.printStackTrace();
2436
            
2437
        }
2438
        
2439
        
2440
        
2441
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2442
        sysmeta5.setObsoletedBy(null);
2443
        sysmeta5.setObsoletes(guid2);
2444
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2445
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2446
        assertTrue(metadata.getIdentifier().equals(guid5));
2447
        assertTrue(metadata.getObsoletes().equals(guid2));
2448
        assertTrue(metadata.getObsoletedBy() == null);
2449
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2450
        
2451
        
2452
        
2453
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2454
        sysmeta2.setObsoletes(guid1);
2455
        sysmeta2.setObsoletedBy(guid5);
2456
        serialVersion = sysmeta2.getSerialVersion();
2457
        serialVersion = serialVersion.add(BigInteger.ONE);
2458
        sysmeta2.setSerialVersion(serialVersion);
2459
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2460
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2461
        assertTrue(metadata.getIdentifier().equals(guid2));
2462
        assertTrue(metadata.getObsoletes().equals(guid1));
2463
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2464
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2465
    }
2466
    
2467
}
(4-4/8)