Project

General

Profile

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

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

    
28

    
29

    
30

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

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

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

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

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

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

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

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

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

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

    
276
  }
277

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

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

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

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

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

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

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

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

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

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

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

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

    
343
    }
344
    
345
  }
346

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

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

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

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

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

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

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

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

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

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

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

    
429
    }
430
      
431
  }
432

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

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

    
468
    } 
469

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
682
    }
683
  }
684

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

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

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

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

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

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

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

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

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

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

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

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

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

    
783
    }
784
  }
785

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

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

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

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

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

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

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

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

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

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

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

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

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

    
850
    }
851
    
852
  }
853

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

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

    
914
  public void testPing() {
915

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

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

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

    
932
    }
933
    
934
  }
935

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

    
960
  }
961

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

    
998
    }
999

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

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

    
1028
    }
1029
  }
1030

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1268
    } 
1269
  }
1270

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

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

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

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

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

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

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

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

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

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

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

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

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

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