Project

General

Profile

1 6309 cjones
/**
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 6338 cjones
29 8908 tao
30 9034 tao
31 10282 tao
import edu.ucsb.nceas.metacat.IdentifierManager;
32 9167 tao
import edu.ucsb.nceas.metacat.dataone.CNodeService;
33 9034 tao
import edu.ucsb.nceas.metacat.dataone.MNodeService;
34 9147 tao
import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
35
import edu.ucsb.nceas.metacat.service.ServiceService;
36
import edu.ucsb.nceas.utilities.IOUtil;
37 7850 leinfelder
import gov.loc.repository.bagit.Bag;
38
import gov.loc.repository.bagit.BagFactory;
39 7853 leinfelder
import gov.loc.repository.bagit.BagFile;
40
import gov.loc.repository.bagit.Manifest;
41 7850 leinfelder
42 6309 cjones
import java.io.ByteArrayInputStream;
43 6942 cjones
import java.io.ByteArrayOutputStream;
44 7850 leinfelder
import java.io.File;
45 9590 tao
import java.io.FileInputStream;
46 7850 leinfelder
import java.io.FileOutputStream;
47 6942 cjones
import java.io.IOException;
48 6309 cjones
import java.io.InputStream;
49
import java.io.UnsupportedEncodingException;
50 9167 tao
import java.math.BigInteger;
51 9147 tao
import java.net.URL;
52 6326 leinfelder
import java.text.SimpleDateFormat;
53 7040 cjones
import java.util.ArrayList;
54 6312 cjones
import java.util.Calendar;
55 6309 cjones
import java.util.Date;
56 7853 leinfelder
import java.util.HashMap;
57
import java.util.Iterator;
58 7040 cjones
import java.util.List;
59 7853 leinfelder
import java.util.Map;
60 9147 tao
import java.util.Vector;
61 6309 cjones
62
import junit.framework.Test;
63
import junit.framework.TestSuite;
64
65 8952 tao
import org.apache.commons.io.FileUtils;
66 6324 leinfelder
import org.apache.commons.io.IOUtils;
67 8810 leinfelder
import org.dataone.client.v2.formats.ObjectFormatCache;
68 9834 tao
import org.dataone.exceptions.MarshallingException;
69 6348 leinfelder
import org.dataone.configuration.Settings;
70 7853 leinfelder
import org.dataone.ore.ResourceMapFactory;
71 9191 tao
import org.dataone.service.util.Constants;
72 6942 cjones
import org.dataone.service.util.TypeMarshaller;
73 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
74
import org.dataone.service.exceptions.InsufficientResources;
75
import org.dataone.service.exceptions.InvalidRequest;
76
import org.dataone.service.exceptions.InvalidSystemMetadata;
77
import org.dataone.service.exceptions.InvalidToken;
78
import org.dataone.service.exceptions.NotAuthorized;
79
import org.dataone.service.exceptions.NotFound;
80
import org.dataone.service.exceptions.NotImplemented;
81
import org.dataone.service.exceptions.ServiceFailure;
82 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
83 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
84 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
85
import org.dataone.service.types.v1.AccessRule;
86
import org.dataone.service.types.v1.Checksum;
87
import org.dataone.service.types.v1.DescribeResponse;
88
import org.dataone.service.types.v1.Event;
89 9289 tao
import org.dataone.service.types.v1.ObjectFormatIdentifier;
90 6366 leinfelder
import org.dataone.service.types.v1.Identifier;
91 8810 leinfelder
import org.dataone.service.types.v2.Log;
92
import org.dataone.service.types.v2.Node;
93 9147 tao
import org.dataone.service.types.v2.OptionList;
94 6366 leinfelder
import org.dataone.service.types.v1.NodeReference;
95
import org.dataone.service.types.v1.ObjectFormatIdentifier;
96
import org.dataone.service.types.v1.ObjectList;
97
import org.dataone.service.types.v1.Permission;
98 7040 cjones
import org.dataone.service.types.v1.Person;
99 10282 tao
import org.dataone.service.types.v1.ReplicationPolicy;
100 6366 leinfelder
import org.dataone.service.types.v1.Session;
101
import org.dataone.service.types.v1.Subject;
102 7040 cjones
import org.dataone.service.types.v1.SubjectInfo;
103 8952 tao
import org.dataone.service.types.v1.util.ChecksumUtil;
104 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
105 7853 leinfelder
import org.dspace.foresite.ResourceMap;
106 6309 cjones
import org.junit.After;
107
import org.junit.Before;
108
109
/**
110
 * A JUnit test to exercise the Metacat Member Node service implementation.
111
 * This also tests a few of the D1NodeService superclass methods
112
 *
113
 * @author cjones
114
 *
115
 */
116 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
117 6309 cjones
118 8952 tao
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
119 6354 cjones
  /**
120
   * Set up the test fixtures
121
   *
122
   * @throws Exception
123
   */
124
  @Before
125
  public void setUp() throws Exception {
126
    super.setUp();
127
    // set up the configuration for d1client
128
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
129
  }
130 6309 cjones
131 6354 cjones
  /**
132
   * Remove the test fixtures
133
   */
134
  @After
135
  public void tearDown() {
136
  }
137
138
  /**
139
   * Build the test suite
140
   * @return
141
   */
142
  public static Test suite() {
143
144
    TestSuite suite = new TestSuite();
145 9279 tao
    suite.addTest(new MNodeServiceTest("initialize"));
146 6309 cjones
    // MNStorage tests
147 10284 tao
    suite.addTest(new MNodeServiceTest("testMissMatchMetadataCreate"));
148 10282 tao
    suite.addTest(new MNodeServiceTest("testMissMatchChecksumInCreate"));
149 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testCreate"));
150 7816 leinfelder
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
151 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testUpdate"));
152 9378 tao
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadata"));
153
    suite.addTest(new MNodeServiceTest("testUpdateObsoletesAndObsoletedBy"));
154
    suite.addTest(new MNodeServiceTest("testArchive"));
155
    suite.addTest(new MNodeServiceTest("testUpdateSciMetadata"));
156 7161 leinfelder
    // this requires MN certificate
157 7163 leinfelder
    suite.addTest(new MNodeServiceTest("testDelete"));
158 7161 leinfelder
159 7160 leinfelder
    // MNRead tests
160
    suite.addTest(new MNodeServiceTest("testGet"));
161
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
162
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
163
    suite.addTest(new MNodeServiceTest("testDescribe"));
164
    suite.addTest(new MNodeServiceTest("testListObjects"));
165 9378 tao
    suite.addTest(new MNodeServiceTest("testGetSID"));
166 7161 leinfelder
    // this requires CN certificate
167 7164 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
168 7161 leinfelder
169 7160 leinfelder
    // MNCore tests
170
    suite.addTest(new MNodeServiceTest("testPing"));
171
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
172
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
173 8833 leinfelder
174 7160 leinfelder
    // MNAuthorization tests
175
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
176 7040 cjones
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
177 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
178
    // MNreplication tests
179
    suite.addTest(new MNodeServiceTest("testReplicate"));
180 7850 leinfelder
    // MN packaging tests
181
    suite.addTest(new MNodeServiceTest("testGetPackage"));
182 7853 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
183 8906 tao
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
184 8952 tao
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
185 9147 tao
    suite.addTest(new MNodeServiceTest("testListViews"));
186 9590 tao
    suite.addTest(new MNodeServiceTest("testCreateNOAAObject"));
187 10023 tao
188
    suite.addTest(new MNodeServiceTest("testPermissionOfUpdateSystemmeta"));
189
190 10108 tao
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletesChain"));
191 9147 tao
192 10108 tao
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadataWithCircularObsoletedByChain"));
193 9377 tao
194 6354 cjones
    return suite;
195
196
  }
197
198
  /**
199
   * Constructor for the tests
200
   *
201
   * @param name - the name of the test
202
   */
203
  public MNodeServiceTest(String name) {
204
    super(name);
205
206
  }
207 6309 cjones
208 6354 cjones
  /**
209
   * Initial blank test
210
   */
211
  public void initialize() {
212
    assertTrue(1 == 1);
213
214
  }
215
216
  /**
217
   * Test getting a known object
218
   */
219
  public void testGet() {
220 6309 cjones
    printTestHeader("testGet");
221
222 6354 cjones
    try {
223
      Session session = getTestSession();
224
      Identifier guid = new Identifier();
225
      guid.setValue("testGet." + System.currentTimeMillis());
226
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
227
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
228 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
229
      InputStream result = MNodeService.getInstance(request).get(session, guid);
230 6354 cjones
      // go back to beginning of original stream
231
      object.reset();
232
      // check
233
      assertTrue(object.available() > 0);
234
      assertTrue(result.available() > 0);
235
      assertTrue(IOUtils.contentEquals(result, object));
236
237 6309 cjones
    } catch (UnsupportedEncodingException e) {
238 6354 cjones
      e.printStackTrace();
239
      fail("Unexpected error: " + e.getMessage());
240 6309 cjones
241
    } catch (InvalidToken e) {
242 6354 cjones
      e.printStackTrace();
243
      fail("Unexpected error: " + e.getMessage());
244
245 6309 cjones
    } catch (ServiceFailure e) {
246 6354 cjones
      e.printStackTrace();
247
      fail("Unexpected error: " + e.getMessage());
248
249 6309 cjones
    } catch (NotAuthorized e) {
250 6354 cjones
      e.printStackTrace();
251
      fail("Unexpected error: " + e.getMessage());
252
253 6309 cjones
    } catch (IdentifierNotUnique e) {
254 6354 cjones
      e.printStackTrace();
255
      fail("Unexpected error: " + e.getMessage());
256
257 6309 cjones
    } catch (UnsupportedType e) {
258 6354 cjones
      e.printStackTrace();
259
      fail("Unexpected error: " + e.getMessage());
260
261 6309 cjones
    } catch (InsufficientResources e) {
262 6354 cjones
      e.printStackTrace();
263
      fail("Unexpected error: " + e.getMessage());
264
265 6309 cjones
    } catch (InvalidSystemMetadata e) {
266 6354 cjones
      e.printStackTrace();
267
      fail("Unexpected error: " + e.getMessage());
268
269 6309 cjones
    } catch (NotImplemented e) {
270 6354 cjones
      e.printStackTrace();
271
      fail("Unexpected error: " + e.getMessage());
272
273 6309 cjones
    } catch (InvalidRequest e) {
274 6354 cjones
      e.printStackTrace();
275
      fail("Unexpected error: " + e.getMessage());
276
277 6309 cjones
    } catch (NotFound e) {
278 6354 cjones
      e.printStackTrace();
279
      fail("Unexpected error: " + e.getMessage());
280
281 6309 cjones
    } catch (Exception e) {
282 6354 cjones
      e.printStackTrace();
283
      fail("Unexpected error: " + e.getMessage());
284
285 6309 cjones
    }
286
287 6354 cjones
  }
288 6309 cjones
289 6354 cjones
  /**
290
   * Test getting the system metadata of an object
291
   */
292
  public void testGetSystemMetadata() {
293 6309 cjones
    printTestHeader("testGetSystemMetadata");
294
295
    try {
296 6354 cjones
      Session session = getTestSession();
297
      Identifier guid = new Identifier();
298
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
299
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
300
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
301 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
302
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
303 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
304 9039 tao
      assertEquals(newsysmeta.getSeriesId(), null);
305 6354 cjones
306 6309 cjones
    } catch (UnsupportedEncodingException e) {
307 6354 cjones
      e.printStackTrace();
308
      fail("Unexpected error: " + e.getMessage());
309 6309 cjones
310
    } catch (InvalidToken e) {
311 6354 cjones
      e.printStackTrace();
312
      fail("Unexpected error: " + e.getMessage());
313 6309 cjones
314
    } catch (ServiceFailure e) {
315 6354 cjones
      e.printStackTrace();
316
      fail("Unexpected error: " + e.getMessage());
317 6309 cjones
318
    } catch (NotAuthorized e) {
319 6354 cjones
      e.printStackTrace();
320
      fail("Unexpected error: " + e.getMessage());
321 6309 cjones
322
    } catch (IdentifierNotUnique e) {
323 6354 cjones
      e.printStackTrace();
324
      fail("Unexpected error: " + e.getMessage());
325
326 6309 cjones
    } catch (UnsupportedType e) {
327 6354 cjones
      e.printStackTrace();
328
      fail("Unexpected error: " + e.getMessage());
329 6309 cjones
330
    } catch (InsufficientResources e) {
331 6354 cjones
      e.printStackTrace();
332
      fail("Unexpected error: " + e.getMessage());
333 6309 cjones
334
    } catch (InvalidSystemMetadata e) {
335 6354 cjones
      e.printStackTrace();
336
      fail("Unexpected error: " + e.getMessage());
337 6309 cjones
338
    } catch (NotImplemented e) {
339 6354 cjones
      e.printStackTrace();
340
      fail("Unexpected error: " + e.getMessage());
341 6309 cjones
342
    } catch (InvalidRequest e) {
343 6354 cjones
      e.printStackTrace();
344
      fail("Unexpected error: " + e.getMessage());
345 6309 cjones
346
    } catch (NotFound e) {
347 6354 cjones
      e.printStackTrace();
348
      fail("Unexpected error: " + e.getMessage());
349 6309 cjones
350
    } catch (Exception e) {
351 6354 cjones
      e.printStackTrace();
352
      fail("Unexpected error: " + e.getMessage());
353 6309 cjones
354
    }
355
356 6354 cjones
  }
357 6309 cjones
358 6354 cjones
  /**
359
   * Test object creation
360
   */
361
  public void testCreate() {
362 6309 cjones
    printTestHeader("testCreate");
363
364 6354 cjones
    try {
365
      Session session = getTestSession();
366
      Identifier guid = new Identifier();
367
      guid.setValue("testCreate." + System.currentTimeMillis());
368
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
369
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
370 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
371 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
372 9049 tao
373
      Thread.sleep(1000);
374
      try {
375
          Identifier guid2 = new Identifier();
376
          guid2.setValue("testCreate." + System.currentTimeMillis());
377
          SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object);
378
          sysmeta2.setSeriesId(guid);
379
          MNodeService.getInstance(request).create(session, guid2, object, sysmeta2);
380
          fail("It should fail since the system metadata using an existing id as the sid");
381
      } catch (InvalidSystemMetadata ee) {
382
383
      }
384
385
      Thread.sleep(1000);
386
      try {
387
          Identifier guid3 = new Identifier();
388
          guid3.setValue("testCreate." + System.currentTimeMillis());
389
          SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object);
390
          sysmeta3.setSeriesId(guid3);
391
          MNodeService.getInstance(request).create(session, guid3, object, sysmeta3);
392
          fail("It should fail since the system metadata using the pid as the sid");
393
      } catch (InvalidSystemMetadata ee) {
394
395
      }
396 6309 cjones
    } catch (UnsupportedEncodingException e) {
397 6354 cjones
      e.printStackTrace();
398
      fail("Unexpected error: " + e.getMessage());
399 6309 cjones
400
    } catch (InvalidToken e) {
401 6354 cjones
      e.printStackTrace();
402
      fail("Unexpected error: " + e.getMessage());
403 6309 cjones
404
    } catch (ServiceFailure e) {
405 6354 cjones
      e.printStackTrace();
406
      fail("Unexpected error: " + e.getMessage());
407 6309 cjones
408
    } catch (NotAuthorized e) {
409 6354 cjones
      e.printStackTrace();
410
      fail("Unexpected error: " + e.getMessage());
411 6309 cjones
412
    } catch (IdentifierNotUnique e) {
413 6354 cjones
      e.printStackTrace();
414
      fail("Unexpected error: " + e.getMessage());
415 6309 cjones
416
    } catch (UnsupportedType e) {
417 6354 cjones
      e.printStackTrace();
418
      fail("Unexpected error: " + e.getMessage());
419 6309 cjones
420
    } catch (InsufficientResources e) {
421 6354 cjones
      e.printStackTrace();
422
      fail("Unexpected error: " + e.getMessage());
423 6309 cjones
424
    } catch (InvalidSystemMetadata e) {
425 6354 cjones
      e.printStackTrace();
426
      fail("Unexpected error: " + e.getMessage());
427 6309 cjones
428
    } catch (NotImplemented e) {
429 6354 cjones
      e.printStackTrace();
430
      fail("Unexpected error: " + e.getMessage());
431 6309 cjones
432
    } catch (InvalidRequest e) {
433 6354 cjones
      e.printStackTrace();
434
      fail("Unexpected error: " + e.getMessage());
435 6309 cjones
436
    } catch (Exception e) {
437 6354 cjones
      e.printStackTrace();
438
      fail("Unexpected error: " + e.getMessage());
439 6309 cjones
440
    }
441
442
  }
443 10282 tao
444
  /**
445
   * Test object creation
446
   */
447
  public void testMissMatchChecksumInCreate() {
448
    printTestHeader("testMissMatchChecksumInCreate");
449
    Identifier guid = new Identifier();
450
    guid.setValue("testCreate." + System.currentTimeMillis());
451
    Session session = null;
452
    try {
453
      session = getTestSession();
454
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
455
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
456
      Node localNode = MNodeService.getInstance(request).getCapabilities();
457
      ReplicationPolicy rePolicy = new ReplicationPolicy();
458
      rePolicy.setReplicationAllowed(true);
459
      rePolicy.setNumberReplicas(new Integer(3));
460
      rePolicy.addPreferredMemberNode(localNode.getIdentifier());
461
      sysmeta.setReplicationPolicy(rePolicy);
462
      Checksum checksum = new Checksum();
463
      checksum.setAlgorithm("md5");
464
      checksum.setValue("098F6BCD4621D373CADE4E832627B4F9");
465
      sysmeta.setChecksum(checksum);
466
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
467
      fail("It should fail since the checksum doesn't match.");
468
    } catch (InvalidSystemMetadata ee) {
469
      //ee.printStackTrace();
470
      try {
471
          Thread.sleep(5000);
472
          MNodeService.getInstance(request).getSystemMetadata(session, guid);
473
          fail("We shouldn't get here since the guid "+guid.getValue()+" was deleted.");
474
      } catch (NotFound e) {
475
         //here is okay.
476
      } catch (Exception e) {
477
          fail("Unexpected error: " + e.getMessage());
478
      }
479
      try {
480
          assertTrue(!IdentifierManager.getInstance().identifierExists(guid.getValue()));
481
      } catch (Exception e) {
482
          fail("Unexpected error: " + e.getMessage());
483
      }
484
485
    } catch (Exception e) {
486
        fail("Unexpected error: " + e.getMessage());
487
    }
488
  }
489 10284 tao
490
491
  /**
492
   * Test miss-match checksum for metacat object.
493
   */
494
  public void testMissMatchMetadataCreate() {
495
      printTestHeader("testMissMatchMetadataCreate");
496
      Identifier guid = new Identifier();
497
      guid.setValue("testCreate." + System.currentTimeMillis());
498
      Session session = null;
499
      try {
500
        session = getTestSession();
501
        InputStream object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
502
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
503
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
504
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
505
        sysmeta.setFormatId(formatId);
506
        Node localNode = MNodeService.getInstance(request).getCapabilities();
507
        ReplicationPolicy rePolicy = new ReplicationPolicy();
508
        rePolicy.setReplicationAllowed(true);
509
        rePolicy.setNumberReplicas(new Integer(3));
510
        rePolicy.addPreferredMemberNode(localNode.getIdentifier());
511
        sysmeta.setReplicationPolicy(rePolicy);
512
        Checksum checksum = new Checksum();
513
        checksum.setAlgorithm("md5");
514
        checksum.setValue("098F6BCD4621D373CADE4E832627B4F9");
515
        sysmeta.setChecksum(checksum);
516
        object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
517
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
518
        fail("It should fail since the checksum doesn't match.");
519
      } catch (ServiceFailure ee) {
520
        //ee.printStackTrace();
521
        try {
522
            Thread.sleep(5000);
523
            MNodeService.getInstance(request).getSystemMetadata(session, guid);
524
            fail("We shouldn't get here since the guid "+guid.getValue()+" was deleted.");
525
        } catch (NotFound e) {
526
           //here is okay.
527
        } catch (Exception e) {
528
            fail("Unexpected error: " + e.getMessage());
529
        }
530
        try {
531
            assertTrue(!IdentifierManager.getInstance().identifierExists(guid.getValue()));
532
        } catch (Exception e) {
533
            fail("Unexpected error: " + e.getMessage());
534
        }
535
536
      } catch (Exception e) {
537
          fail("Unexpected error: " + e.getMessage());
538
      }
539
  }
540 6309 cjones
541 6354 cjones
  /**
542
   * test object deletion
543
   */
544
  public void testDelete() {
545 6309 cjones
    printTestHeader("testDelete");
546
547 6354 cjones
    try {
548
      Session session = getTestSession();
549
      Identifier guid = new Identifier();
550
      guid.setValue("testDelete." + System.currentTimeMillis());
551
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
552
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
553 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
554 7163 leinfelder
555
      // use MN admin to delete
556
      session = getMNSession();
557 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
558 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
559 7160 leinfelder
      // check that we cannot get the object
560 7163 leinfelder
      session = getTestSession();
561 7160 leinfelder
      InputStream deletedObject = null;
562
      try {
563 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
564 7160 leinfelder
      } catch (NotFound nf) {
565
    	  // this is expected
566
      }
567
	  assertNull(deletedObject);
568 6309 cjones
569 6354 cjones
    } catch (UnsupportedEncodingException e) {
570
      e.printStackTrace();
571
572 6324 leinfelder
    } catch (Exception e) {
573 6354 cjones
      e.printStackTrace();
574
      fail("Unexpected error: " + e.getMessage());
575 6309 cjones
576 6324 leinfelder
    }
577 6309 cjones
578 6354 cjones
  }
579 9351 tao
580
  public void testArchive() throws Exception {
581
          Session session = getTestSession();
582
          Identifier guid = new Identifier();
583
          guid.setValue("testUpdate." + System.currentTimeMillis());
584
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
585
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
586
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
587
          MNodeService.getInstance(request).archive(session, guid);
588
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
589
          assertTrue(result.getArchived());
590 9377 tao
          System.out.println("the identifier is ==================="+pid.getValue());
591 9351 tao
  }
592 6309 cjones
593 6354 cjones
  /**
594
   * Test object updating
595
   */
596
  public void testUpdate() {
597 6309 cjones
    printTestHeader("testUpdate");
598
599 6354 cjones
    try {
600
      Session session = getTestSession();
601
      Identifier guid = new Identifier();
602
      guid.setValue("testUpdate." + System.currentTimeMillis());
603
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
604
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
605
      Identifier newPid = new Identifier();
606 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
607 6354 cjones
      Identifier pid =
608 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
609 6338 cjones
610 10296 tao
      object = new ByteArrayInputStream("test".getBytes("UTF-8"));
611 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
612 9201 tao
      newSysMeta.setArchived(true);
613 9282 tao
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
614 6354 cjones
      // do the update
615
      Identifier updatedPid =
616 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
617 6338 cjones
618 6354 cjones
      // get the updated system metadata
619 6338 cjones
      SystemMetadata updatedSysMeta =
620 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
621 6338 cjones
622 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
623 9201 tao
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
624
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
625 6354 cjones
626 9201 tao
      //try to update an archived object and need to get an exception
627
      Identifier newPid2 = new Identifier();
628
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
629 10296 tao
      object = new ByteArrayInputStream("test".getBytes("UTF-8"));
630 9201 tao
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
631
      try {
632
           updatedPid =
633
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
634
           fail("update an archived object should get an invalid request exception");
635
      } catch (Exception ee) {
636
          assertTrue( ee instanceof InvalidRequest);
637
      }
638 9264 tao
639
      //update the authoritative node on the existing pid (newPid)
640 9282 tao
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
641
      BigInteger version = meta.getSerialVersion();
642 9285 tao
      version = version.add(BigInteger.ONE);
643 9282 tao
      newSysMeta.setSerialVersion(version);
644 9264 tao
      NodeReference newMN = new NodeReference();
645
      newMN.setValue("urn:node:river1");
646
      newSysMeta.setAuthoritativeMemberNode(newMN);
647
      newSysMeta.setArchived(false);
648
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
649
      try {
650
          updatedPid =
651
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
652
          fail("update an object on non-authoritatvie node should get anexception");
653
     } catch (Exception ee) {
654
         assertTrue( ee instanceof NotAuthorized);
655
     }
656
     //cn can succeed even though it updates an object on the non-authoritative node.
657
     Session cnSession = getCNSession();
658
     updatedPid =
659
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
660
     assertEquals(updatedPid.getValue(), newPid2.getValue());
661 6309 cjones
    } catch (UnsupportedEncodingException e) {
662 6354 cjones
      e.printStackTrace();
663
      fail("Unexpected error: " + e.getMessage());
664 6309 cjones
665
    } catch (InvalidToken e) {
666 6354 cjones
      e.printStackTrace();
667
      fail("Unexpected error: " + e.getMessage());
668 6309 cjones
669
    } catch (ServiceFailure e) {
670 6354 cjones
      e.printStackTrace();
671
      fail("Unexpected error: " + e.getMessage());
672 6309 cjones
673
    } catch (NotAuthorized e) {
674 6354 cjones
      e.printStackTrace();
675
      fail("Unexpected error: " + e.getMessage());
676 6309 cjones
677
    } catch (IdentifierNotUnique e) {
678 6354 cjones
      e.printStackTrace();
679
      fail("Unexpected error: " + e.getMessage());
680 6309 cjones
681
    } catch (UnsupportedType e) {
682 6354 cjones
      e.printStackTrace();
683
      fail("Unexpected error: " + e.getMessage());
684 6309 cjones
685
    } catch (InsufficientResources e) {
686 6354 cjones
      e.printStackTrace();
687
      fail("Unexpected error: " + e.getMessage());
688 6309 cjones
689
    } catch (InvalidSystemMetadata e) {
690 6354 cjones
      e.printStackTrace();
691
      fail("Unexpected error: " + e.getMessage());
692 6309 cjones
693
    } catch (NotImplemented e) {
694 6354 cjones
      e.printStackTrace();
695
      fail("Unexpected error: " + e.getMessage());
696 6309 cjones
697
    } catch (InvalidRequest e) {
698 6354 cjones
      e.printStackTrace();
699
      fail("Unexpected error: " + e.getMessage());
700 6309 cjones
701
    } catch (Exception e) {
702 6354 cjones
      e.printStackTrace();
703
      fail("Unexpected error: " + e.getMessage());
704 6309 cjones
705
    }
706 6354 cjones
  }
707 9377 tao
708
709
  /**
710
   * Test object updating
711
   */
712
  public void testUpdateSciMetadata() {
713
    printTestHeader("testUpdate");
714
715
    try {
716
      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\">"
717
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
718
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
719
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
720
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
721
      Session session = getTestSession();
722
      Identifier guid = new Identifier();
723
      guid.setValue("testUpdate." + System.currentTimeMillis());
724
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
725
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
726
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
727
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
728
729
      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\">"
730
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
731
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
732
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
733
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
734
      Identifier newPid = new Identifier();
735
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
736
      System.out.println("=================the pid is "+newPid.getValue());
737
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
738
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
739
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
740 9378 tao
      sysmeta2.setObsoletes(guid);
741 9377 tao
      Checksum sum1= sysmeta2.getChecksum();
742
      System.out.println("the checksum before sending is "+sum1.getValue());
743
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
744
      MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
745
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
746
      System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue());
747
      assertTrue(meta.getChecksum().getValue().equals(sum1.getValue()));
748
    } catch (UnsupportedEncodingException e) {
749
      e.printStackTrace();
750
      fail("Unexpected error: " + e.getMessage());
751 6309 cjones
752 9377 tao
    } catch (InvalidToken e) {
753
      e.printStackTrace();
754
      fail("Unexpected error: " + e.getMessage());
755
756
    } catch (ServiceFailure e) {
757
      e.printStackTrace();
758
      fail("Unexpected error: " + e.getMessage());
759
760
    } catch (NotAuthorized e) {
761
      e.printStackTrace();
762
      fail("Unexpected error: " + e.getMessage());
763
764
    } catch (IdentifierNotUnique e) {
765
      e.printStackTrace();
766
      fail("Unexpected error: " + e.getMessage());
767
768
    } catch (UnsupportedType e) {
769
      e.printStackTrace();
770
      fail("Unexpected error: " + e.getMessage());
771
772
    } catch (InsufficientResources e) {
773
      e.printStackTrace();
774
      fail("Unexpected error: " + e.getMessage());
775
776
    } catch (InvalidSystemMetadata e) {
777
      e.printStackTrace();
778
      fail("Unexpected error: " + e.getMessage());
779
780
    } catch (NotImplemented e) {
781
      e.printStackTrace();
782
      fail("Unexpected error: " + e.getMessage());
783
784
    } catch (InvalidRequest e) {
785
      e.printStackTrace();
786
      fail("Unexpected error: " + e.getMessage());
787
788
    } catch (Exception e) {
789
      e.printStackTrace();
790
      fail("Unexpected error: " + e.getMessage());
791
792
    }
793
  }
794
795 6354 cjones
  /**
796 10284 tao
   * Test the replicate method. The getReplica method is from a MockMN.
797 6354 cjones
   */
798
  public void testReplicate() {
799
      printTestHeader("testReplicate");
800
      try {
801
        Session session = getTestSession();
802
        Identifier guid = new Identifier();
803
        guid.setValue("testReplicate." + System.currentTimeMillis());
804 10268 tao
        System.out.println("======================the id need to be replicated is "+guid.getValue());
805
        InputStream object = new FileInputStream(new File(MockReplicationMNode.replicationSourceFile));
806 6354 cjones
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
807 10268 tao
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
808
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
809
        sysmeta.setFormatId(formatId);
810
        NodeReference sourceNode = new NodeReference();
811
        sourceNode.setValue(MockReplicationMNode.NODE_ID);
812
        sysmeta.setAuthoritativeMemberNode(sourceNode);
813
        sysmeta.setOriginMemberNode(sourceNode);
814
        boolean result = false;
815 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
816 10268 tao
        assertTrue(result);
817
        SystemMetadata sys =  MNodeService.getInstance(request).getSystemMetadata(session, guid);
818
        assertTrue(sys.getIdentifier().equals(guid));
819 6354 cjones
      } catch (Exception e) {
820
        e.printStackTrace();
821
      fail("Probably not yet implemented: " + e.getMessage());
822
    }
823
  }
824 6309 cjones
825 6354 cjones
  /**
826
   * Test describing an object
827
   */
828
  public void testDescribe() {
829 6314 cjones
    printTestHeader("testDescribe");
830 6309 cjones
831
    try {
832 6354 cjones
      Session session = getTestSession();
833
      Identifier guid = new Identifier();
834
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
835
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
836
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
837 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
838
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
839 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
840 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
841 6354 cjones
842 6309 cjones
    } catch (UnsupportedEncodingException e) {
843 6354 cjones
      e.printStackTrace();
844
      fail("Unexpected error: " + e.getMessage());
845 6309 cjones
846
    } catch (InvalidToken e) {
847 6354 cjones
      e.printStackTrace();
848
      fail("Unexpected error: " + e.getMessage());
849 6309 cjones
850
    } catch (ServiceFailure e) {
851 6354 cjones
      e.printStackTrace();
852
      fail("Unexpected error: " + e.getMessage());
853 6309 cjones
854
    } catch (NotAuthorized e) {
855 6354 cjones
      e.printStackTrace();
856
      fail("Unexpected error: " + e.getMessage());
857 6309 cjones
858
    } catch (IdentifierNotUnique e) {
859 6354 cjones
      e.printStackTrace();
860
      fail("Unexpected error: " + e.getMessage());
861
862 6309 cjones
    } catch (UnsupportedType e) {
863 6354 cjones
      e.printStackTrace();
864
      fail("Unexpected error: " + e.getMessage());
865 6309 cjones
866
    } catch (InsufficientResources e) {
867 6354 cjones
      e.printStackTrace();
868
      fail("Unexpected error: " + e.getMessage());
869 6309 cjones
870
    } catch (InvalidSystemMetadata e) {
871 6354 cjones
      e.printStackTrace();
872
      fail("Unexpected error: " + e.getMessage());
873 6309 cjones
874
    } catch (NotImplemented e) {
875 6354 cjones
      e.printStackTrace();
876
      fail("Unexpected error: " + e.getMessage());
877 6309 cjones
878
    } catch (InvalidRequest e) {
879 6354 cjones
      e.printStackTrace();
880
      fail("Unexpected error: " + e.getMessage());
881 6309 cjones
882
    } catch (NotFound e) {
883 6354 cjones
      e.printStackTrace();
884
      fail("Unexpected error: " + e.getMessage());
885 6309 cjones
886
    } catch (Exception e) {
887 6354 cjones
      e.printStackTrace();
888
      fail("Unexpected error: " + e.getMessage());
889 6309 cjones
890
    }
891 6354 cjones
  }
892 6309 cjones
893 6354 cjones
  /**
894
   * Test getting the checksum of an object
895
   */
896
  public void testGetChecksum() {
897 6309 cjones
    printTestHeader("testGetChecksum");
898
899 6354 cjones
    try {
900
      Session session = getTestSession();
901
      Identifier guid = new Identifier();
902
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
903
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
904
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
905 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
906
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
907 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
908 6309 cjones
909 6354 cjones
    } catch (UnsupportedEncodingException e) {
910
      e.printStackTrace();
911
      fail("Unexpected error: " + e.getMessage());
912 6309 cjones
913
    } catch (InvalidToken e) {
914 6354 cjones
      e.printStackTrace();
915
      fail("Unexpected error: " + e.getMessage());
916 6309 cjones
917
    } catch (ServiceFailure e) {
918 6354 cjones
      e.printStackTrace();
919
      fail("Unexpected error: " + e.getMessage());
920 6309 cjones
921
    } catch (NotAuthorized e) {
922 6354 cjones
      e.printStackTrace();
923
      fail("Unexpected error: " + e.getMessage());
924 6309 cjones
925
    } catch (IdentifierNotUnique e) {
926 6354 cjones
      e.printStackTrace();
927
      fail("Unexpected error: " + e.getMessage());
928 6309 cjones
929
    } catch (UnsupportedType e) {
930 6354 cjones
      e.printStackTrace();
931
      fail("Unexpected error: " + e.getMessage());
932 6309 cjones
933
    } catch (InsufficientResources e) {
934 6354 cjones
      e.printStackTrace();
935
      fail("Unexpected error: " + e.getMessage());
936 6309 cjones
937
    } catch (InvalidSystemMetadata e) {
938 6354 cjones
      e.printStackTrace();
939
      fail("Unexpected error: " + e.getMessage());
940 6309 cjones
941
    } catch (NotImplemented e) {
942 6354 cjones
      e.printStackTrace();
943
      fail("Unexpected error: " + e.getMessage());
944 6309 cjones
945
    } catch (InvalidRequest e) {
946 6354 cjones
      e.printStackTrace();
947
      fail("Unexpected error: " + e.getMessage());
948 6309 cjones
949
    } catch (NotFound e) {
950 6354 cjones
      e.printStackTrace();
951
      fail("Unexpected error: " + e.getMessage());
952 6309 cjones
953
    } catch (Exception e) {
954 6354 cjones
      e.printStackTrace();
955
      fail("Unexpected error: " + e.getMessage());
956 6309 cjones
957
    }
958 6354 cjones
959
  }
960 6309 cjones
961 6354 cjones
  /**
962
   * Testing listing objects on the Member Node
963
   */
964
  public void testListObjects() {
965
      printTestHeader("testListObjects");
966
967
      try {
968
969
        Session session = getTestSession();
970
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
971
        Date startTime = sdf.parse("2010-01-01");
972
        Date endTime = new Date();
973
        ObjectFormatIdentifier objectFormatId = null;
974
        boolean replicaStatus = false;
975
        int start = 0;
976
        int count = 1;
977
978
        // insert at least one object
979
        testCreate();
980
        // now check that we have at least one
981
        ObjectList objectList =
982 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
983 8810 leinfelder
              objectFormatId, null, replicaStatus, start, count);
984 6354 cjones
        assertNotNull(objectList);
985
        assertTrue(objectList.getCount() == count);
986
        assertTrue(objectList.getStart() == 0);
987 9158 tao
        assertTrue(objectList.getTotal() >= 1);
988 6354 cjones
989
      } catch (Exception e) {
990
        e.printStackTrace();
991
        fail("Unexpected error: " + e.getMessage());
992
993
      }
994
  }
995 6309 cjones
996 6354 cjones
  public void testGetCapabilities() {
997
      printTestHeader("testGetCapabilities");
998
    try {
999 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
1000 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
1001
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
1002 6354 cjones
      assertNotNull(node);
1003
      // TODO: should probably test other parts of the node information
1004 6942 cjones
1005 9834 tao
    } catch (MarshallingException e) {
1006 6942 cjones
        e.printStackTrace();
1007
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
1008
1009
    } catch (IOException e) {
1010
        e.printStackTrace();
1011
        fail("The node instance couldn't be read correctly:" + e.getMessage());
1012
1013 6354 cjones
    } catch (Exception e) {
1014 6942 cjones
        e.printStackTrace();
1015
        fail("Probably not yet implemented: " + e.getMessage());
1016
1017 6354 cjones
    }
1018
1019
  }
1020 6309 cjones
1021 6354 cjones
  public void testPing() {
1022 6309 cjones
1023 6354 cjones
    try {
1024 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
1025
      assertTrue(mnDate != null);
1026 6354 cjones
1027 6309 cjones
    } catch (NotImplemented e) {
1028 6354 cjones
      e.printStackTrace();
1029
      fail("Unexpected error: " + e.getMessage());
1030 6309 cjones
1031
    } catch (ServiceFailure e) {
1032 6354 cjones
      e.printStackTrace();
1033
      fail("Unexpected error: " + e.getMessage());
1034 6309 cjones
1035 6612 leinfelder
    }  catch (InsufficientResources e) {
1036 6354 cjones
      e.printStackTrace();
1037
      fail("Unexpected error: " + e.getMessage());
1038 6309 cjones
1039
    }
1040 6354 cjones
1041
  }
1042 6309 cjones
1043 6354 cjones
  public void testSynchronizationFailed() {
1044
    printTestHeader("testSynchronizationFailed");
1045
    try {
1046
        Session session = getTestSession();
1047
1048
        // create the object
1049
        Identifier pid = new Identifier();
1050
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
1051
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1052
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1053 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1054 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
1055
1056 7163 leinfelder
        // pretend the sync failed, act as CN
1057 6354 cjones
      SynchronizationFailed syncFailed =
1058
        new SynchronizationFailed("0000", "Testing Synch Failure");
1059 6366 leinfelder
      syncFailed.setPid(pid.getValue());
1060 7163 leinfelder
      session = getCNSession();
1061 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
1062 6354 cjones
    } catch (Exception e) {
1063
      e.printStackTrace();
1064
        fail("Unexpected error: " + e.getMessage());
1065
    }
1066 6333 leinfelder
1067 6354 cjones
  }
1068 6309 cjones
1069 6605 cjones
  public void testSystemMetadataChanged() {
1070
      printTestHeader("testSystemMetadataChanged");
1071
      try {
1072
          Session session = getTestSession();
1073
1074
          // create the object
1075
          Identifier pid = new Identifier();
1076
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
1077 9052 tao
          Identifier sid = new Identifier();
1078
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
1079 6605 cjones
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1080
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1081 9052 tao
          sysmeta.setSeriesId(sid);
1082 6605 cjones
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
1083
          assertEquals(retPid.getValue(), pid.getValue());
1084
1085
          // pretend the system metadata changed on the CN
1086
          MNodeService.getInstance(request).systemMetadataChanged(session,
1087
                  retPid, 5000L, Calendar.getInstance().getTime());
1088 9052 tao
          MNodeService.getInstance(request).systemMetadataChanged(session,
1089
                  sid, 5000L, Calendar.getInstance().getTime());
1090
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
1091
                  retPid, 5000L, Calendar.getInstance().getTime());
1092
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
1093
                  sid, 5000L, Calendar.getInstance().getTime());
1094 6605 cjones
1095
      } catch (Exception e) {
1096
          if (e instanceof NotAuthorized) {
1097
              // only CN subjects can call this
1098
              // TODO: use a CN certificate in the tests
1099
          } else {
1100
              fail("Unexpected error: " + e.getMessage());
1101
1102
          }
1103
      }
1104
1105
    }
1106
1107 6354 cjones
  public void testGetLogRecords() {
1108 6312 cjones
    printTestHeader("testLogRecords");
1109 6309 cjones
1110 6698 leinfelder
    try {
1111
	    Log log = null;
1112 7261 leinfelder
	    Session session = getCNSession();
1113 6698 leinfelder
	    Date fromDate = new Date();
1114
	    Calendar calendar = Calendar.getInstance();
1115
	    calendar.setTime(fromDate);
1116
	    calendar.roll(Calendar.YEAR, false);
1117
	    fromDate = calendar.getTime();
1118
	    Date toDate = new Date();
1119
	    Event event = Event.CREATE;
1120
	    int start = 0;
1121
	    int count = 1;
1122 6309 cjones
1123 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
1124 8810 leinfelder
        event.xmlValue(), null, start, count);
1125 6354 cjones
1126
      assertNotNull(log);
1127
      assertTrue(log.getCount() == count);
1128
      assertTrue(log.getStart() == start);
1129
      assertTrue(log.getTotal() >= 1);
1130
1131 6698 leinfelder
    } catch (Exception e) {
1132 6354 cjones
      e.printStackTrace();
1133
      fail("Unexpected error: " + e.getMessage());
1134 6309 cjones
1135
    }
1136 6354 cjones
  }
1137 6309 cjones
1138 6354 cjones
  /**
1139
   * Testing setting access on a known object
1140
   */
1141
  public void testSetAccessPolicy() {
1142 6309 cjones
    printTestHeader("testSetAccess");
1143
1144 6577 cjones
    //boolean accessWasSet = false;
1145
    //
1146
    //try {
1147
    //  // create an object to set access on
1148
    //  Session session = getTestSession();
1149
    //  Identifier guid = new Identifier();
1150
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1151
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1152
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1153
    //  Identifier pid =
1154
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1155
    //  // set the access
1156
    //  AccessPolicy accessPolicy = new AccessPolicy();
1157
    //  AccessRule allow = new AccessRule();
1158
    //  allow.addPermission(Permission.WRITE);
1159
    //  Subject publicSubject = new Subject();
1160
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1161
    //  allow.addSubject(publicSubject);
1162
    //  accessPolicy.addAllow(allow);
1163
    //
1164
    //  accessWasSet =
1165
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1166
    //  assertTrue(accessWasSet);
1167
    //  // test that it is enforced
1168
    //  session.setSubject(publicSubject);
1169
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1170
    //  assertTrue(isAuthorized);
1171
    //
1172
    //} catch (UnsupportedEncodingException e) {
1173
    //  e.printStackTrace();
1174
    //
1175
    //} catch (InvalidToken e) {
1176
    //  e.printStackTrace();
1177
    //  fail("Unexpected error: " + e.getMessage());
1178
    //
1179
    //} catch (ServiceFailure e) {
1180
    //  e.printStackTrace();
1181
    //  fail("Unexpected error: " + e.getMessage());
1182
    //
1183
    //} catch (NotAuthorized e) {
1184
    //  e.printStackTrace();
1185
    //  fail("Unexpected error: " + e.getMessage());
1186
    //
1187
    //} catch (IdentifierNotUnique e) {
1188
    //  e.printStackTrace();
1189
    //  fail("Unexpected error: " + e.getMessage());
1190
    //
1191
    //} catch (UnsupportedType e) {
1192
    //  e.printStackTrace();
1193
    //  fail("Unexpected error: " + e.getMessage());
1194
    //
1195
    //} catch (InsufficientResources e) {
1196
    //  e.printStackTrace();
1197
    //  fail("Unexpected error: " + e.getMessage());
1198
    //
1199
    //} catch (InvalidSystemMetadata e) {
1200
    //  e.printStackTrace();
1201
    //  fail("Unexpected error: " + e.getMessage());
1202
    //
1203
    //} catch (NotImplemented e) {
1204
    //  e.printStackTrace();
1205
    //  fail("Unexpected error: " + e.getMessage());
1206
    //
1207
    //} catch (InvalidRequest e) {
1208
    //  e.printStackTrace();
1209
    //  fail("Unexpected error: " + e.getMessage());
1210
    //
1211
    //} catch (NotFound e) {
1212
    //  e.printStackTrace();
1213
    //  fail("Unexpected error: " + e.getMessage());
1214
    //
1215
    //} catch (Exception e) {
1216
    //  e.printStackTrace();
1217
    //  fail("Unexpected error: " + e.getMessage());
1218
    //
1219
    //}
1220 6354 cjones
1221
  }
1222 6309 cjones
1223 6354 cjones
  /**
1224
   * Test if a subject is authorized to read a known object
1225
   */
1226
  public void testIsAuthorized() {
1227 6309 cjones
    printTestHeader("testIsAuthorized");
1228
1229 6354 cjones
    try {
1230
      Session session = getTestSession();
1231
      Identifier guid = new Identifier();
1232
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1233
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1234
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1235 9191 tao
      //non-public readable
1236
      AccessPolicy accessPolicy = new AccessPolicy();
1237
      AccessRule allow = new AccessRule();
1238
      allow.addPermission(Permission.READ);
1239
      Subject subject = new Subject();
1240
      subject.setValue("cn=test2,dc=dataone,dc=org");
1241
      allow.addSubject(subject);
1242
      accessPolicy.addAllow(allow);
1243
      sysmeta.setAccessPolicy(accessPolicy);
1244 6354 cjones
      Identifier pid =
1245 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1246 6354 cjones
      boolean isAuthorized =
1247 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1248 6354 cjones
      assertEquals(isAuthorized, true);
1249 9191 tao
      isAuthorized =
1250
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1251
      assertEquals(isAuthorized, true);
1252
      try {
1253
          isAuthorized =
1254
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1255
          fail("we can reach here");
1256
      } catch(NotAuthorized ee) {
1257
1258
      }
1259 6354 cjones
1260 9191 tao
1261
      Session session2= getAnotherSession();
1262
      isAuthorized =
1263
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1264
      assertEquals(isAuthorized, true);
1265
1266
      try {
1267
          isAuthorized =
1268
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1269
          fail("we can reach here");
1270
      } catch(NotAuthorized ee) {
1271
1272
      }
1273
1274
1275
      try {
1276
          isAuthorized =
1277
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1278
          fail("we can reach here");
1279
      } catch(NotAuthorized ee) {
1280
1281
      }
1282
1283
1284 6309 cjones
    } catch (UnsupportedEncodingException e) {
1285 6354 cjones
      e.printStackTrace();
1286
      fail("Unexpected error: " + e.getMessage());
1287 6309 cjones
1288
    } catch (InvalidToken e) {
1289 6354 cjones
      e.printStackTrace();
1290
      fail("Unexpected error: " + e.getMessage());
1291 6309 cjones
1292
    } catch (ServiceFailure e) {
1293 6354 cjones
      e.printStackTrace();
1294
      fail("Unexpected error: " + e.getMessage());
1295 6309 cjones
1296
    } catch (NotAuthorized e) {
1297 6354 cjones
      e.printStackTrace();
1298
      fail("Unexpected error: " + e.getMessage());
1299 6309 cjones
1300
    } catch (IdentifierNotUnique e) {
1301 6354 cjones
      e.printStackTrace();
1302
      fail("Unexpected error: " + e.getMessage());
1303 6309 cjones
1304
    } catch (UnsupportedType e) {
1305 6354 cjones
      e.printStackTrace();
1306
      fail("Unexpected error: " + e.getMessage());
1307 6309 cjones
1308
    } catch (InsufficientResources e) {
1309 6354 cjones
      e.printStackTrace();
1310
      fail("Unexpected error: " + e.getMessage());
1311 6309 cjones
1312
    } catch (InvalidSystemMetadata e) {
1313 6354 cjones
      e.printStackTrace();
1314
      fail("Unexpected error: " + e.getMessage());
1315 6309 cjones
1316
    } catch (NotImplemented e) {
1317 6354 cjones
      e.printStackTrace();
1318
      fail("Unexpected error: " + e.getMessage());
1319 6309 cjones
1320
    } catch (InvalidRequest e) {
1321 6354 cjones
      e.printStackTrace();
1322
      fail("Unexpected error: " + e.getMessage());
1323 6309 cjones
1324
    } catch (Exception e) {
1325 6354 cjones
      e.printStackTrace();
1326
      fail("Unexpected error: " + e.getMessage());
1327 6309 cjones
1328
    }
1329 6354 cjones
  }
1330 8209 leinfelder
1331
  /**
1332
   * Test if node admin is authorized to read a known object
1333
   */
1334
  public void testIsAdminAuthorized() {
1335
    printTestHeader("testIsAdminAuthorized");
1336
1337
    try {
1338
      Session session = getTestSession();
1339
      Identifier guid = new Identifier();
1340
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1341
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1342
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1343
      Identifier pid =
1344
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1345
1346
      // test as public - read
1347
      boolean isAuthorized =
1348
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1349
      assertEquals(isAuthorized, true);
1350
1351
      // test as public - change perm
1352
      isAuthorized =
1353
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1354
      assertEquals(isAuthorized, false);
1355
1356 9191 tao
      //test write by another session
1357
      Session session2 = getAnotherSession();
1358
      isAuthorized =
1359
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1360
            assertEquals(isAuthorized, false);
1361
1362 8209 leinfelder
      // test as admin
1363
      isAuthorized =
1364
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1365
    	      assertEquals(isAuthorized, true);
1366 9191 tao
     // test as cn
1367
    	isAuthorized =
1368
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1369
    	              assertEquals(isAuthorized, true);
1370 8209 leinfelder
1371
    } catch (Exception e) {
1372
      e.printStackTrace();
1373
      fail("Unexpected error: " + e.getMessage());
1374 6309 cjones
1375 8209 leinfelder
    }
1376
  }
1377
1378 6309 cjones
1379 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1380
      printTestHeader("testIsEquivIdentityAuthorized");
1381
1382
      try {
1383
          Session session = new Session();
1384
          Subject s = new Subject();
1385
          s.setValue("cn=test,dc=dataone,dc=org");
1386
          session.setSubject(s);
1387
1388
          Identifier pid = new Identifier();
1389
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1390
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1391
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1392
1393
          // reset the access policy to only allow 'self' read (no public)
1394
          AccessPolicy ap = new AccessPolicy();
1395
          AccessRule ar = new AccessRule();
1396
          List<Subject> sList = new ArrayList<Subject>();
1397
          sList.add(session.getSubject());
1398
          ar.setSubjectList(sList);
1399
          List<Permission> permList = new ArrayList<Permission>();
1400
          permList.add(Permission.CHANGE_PERMISSION);
1401
          ar.setPermissionList(permList);
1402
          ap.addAllow(ar);
1403
          sysmeta.setAccessPolicy(ap);
1404
1405
          // save it
1406
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1407
          assertEquals(pid.getValue(), retPid.getValue());
1408
1409
          //check it against an equivalent identity not listed in the access policy
1410
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1411
          SubjectInfo subjectInfo = new SubjectInfo();
1412
          Person person = new Person();
1413
          person.setSubject(session.getSubject());
1414
          List<String> givenNames = new ArrayList<String>();
1415
          givenNames.add("New");
1416
          person.setGivenNameList(givenNames);
1417
          person.setFamilyName("Subject");
1418
1419
          // add equivalent identities
1420
          List<Subject> equivIdentities = new ArrayList<Subject>();
1421
          Subject mappedSubject2 = new Subject();
1422
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1423
          equivIdentities.add(mappedSubject2);
1424
1425
          Subject mappedSubject = new Subject();
1426
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1427
          equivIdentities.add(mappedSubject);
1428
1429
          person.setEquivalentIdentityList(equivIdentities);
1430
1431
          List<Person> personList = new ArrayList<Person>();
1432
          personList.add(person);
1433
          subjectInfo.setPersonList(personList);
1434
1435
          // update the session to include subject info with a mapped identity
1436
          session.setSubjectInfo(subjectInfo);
1437
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1438
          assertTrue(result);
1439
1440
    } catch (Exception e) {
1441
        e.printStackTrace();
1442
1443
    }
1444
1445
  }
1446 7816 leinfelder
1447
/**
1448
   * Test object creation failure when there is a space in the identifier
1449
   */
1450
  public void testCreateInvalidIdentifier() {
1451
    printTestHeader("testCreateInvalidIdentifier");
1452
1453
    try {
1454
      Session session = getTestSession();
1455
      Identifier guid = new Identifier();
1456
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1457
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1458
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1459
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1460
      fail("Should not be able to create with whitespace in indentifier");
1461
    } catch (InvalidRequest e) {
1462
    	// expect that this request fails
1463
        assertTrue(true);
1464
    } catch (Exception e) {
1465
      e.printStackTrace();
1466
      fail("Unexpected error: " + e.getMessage());
1467
    }
1468
1469
  }
1470 6354 cjones
1471 7850 leinfelder
	/**
1472
	 * Test getting a known object
1473
	 */
1474
	public void testGetPackage() {
1475
		printTestHeader("testGetPackage");
1476
1477
		try {
1478
			Session session = getTestSession();
1479
			Identifier guid = new Identifier();
1480
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1481
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1482
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1483
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1484 9289 tao
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1485 9306 tao
			format.setValue("application/bagit-097");
1486 9289 tao
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1487 9495 tao
			/*File bagFile = File.createTempFile("bagit.", ".zip");
1488 7850 leinfelder
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1489
			BagFactory bagFactory = new BagFactory();
1490
			Bag bag = bagFactory.createBag(bagFile);
1491
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1492
1493
			// go back to beginning of original stream
1494
			object.reset();
1495
			// check
1496
			assertTrue(object.available() > 0);
1497
			assertTrue(result.available() > 0);
1498
			assertTrue(IOUtils.contentEquals(result, object));
1499
1500
			// clean up
1501 9495 tao
			bagFile.delete();*/
1502 7850 leinfelder
1503 9495 tao
		} catch(InvalidRequest e) {
1504
1505 7850 leinfelder
		} catch (Exception e) {
1506
			e.printStackTrace();
1507
			fail("Unexpected error: " + e.getMessage());
1508
		}
1509
	}
1510 7853 leinfelder
1511
1512
	/**
1513
	 * Test getting a known object
1514
	 */
1515
	public void testGetOREPackage() {
1516
		printTestHeader("testGetOREPackage");
1517
1518
		try {
1519
1520
			// construct the ORE package
1521
			Identifier resourceMapId = new Identifier();
1522
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1523
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1524
			Identifier metadataId = new Identifier();
1525
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1526
			List<Identifier> dataIds = new ArrayList<Identifier>();
1527
			Identifier dataId = new Identifier();
1528
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1529
			Identifier dataId2 = new Identifier();
1530
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1531
			dataIds.add(dataId);
1532
			dataIds.add(dataId2);
1533
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1534
			idMap.put(metadataId, dataIds);
1535
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1536
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1537
			assertNotNull(resourceMap);
1538
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1539
			assertNotNull(rdfXml);
1540
1541
			Session session = getTestSession();
1542
			InputStream object = null;
1543
			SystemMetadata sysmeta = null;
1544
1545
			// save the data objects (data just contains their ID)
1546
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1547
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1548
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1549
			// second data file
1550
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1551
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1552
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1553
			// metadata file
1554
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1555
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1556
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1557
1558
			// save the ORE object
1559
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1560
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1561
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1562
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1563
1564
			// get the package we uploaded
1565 9289 tao
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1566 9306 tao
            format.setValue("application/bagit-097");
1567 9289 tao
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1568 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1569
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1570
			BagFactory bagFactory = new BagFactory();
1571
			Bag bag = bagFactory.createBag(bagFile);
1572
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1573
			while (manifestIter.hasNext()) {
1574
				String filepath = manifestIter.next().getFilepath();
1575
				BagFile entryFile = bag.getBagFile(filepath);
1576
				InputStream result = entryFile.newInputStream();
1577
				// check ORE
1578
				if (filepath.contains(resourceMapId.getValue())) {
1579
					object.reset();
1580
					assertTrue(object.available() > 0);
1581
					assertTrue(result.available() > 0);
1582
					assertTrue(IOUtils.contentEquals(result, object));
1583
				}
1584
				// check metadata
1585
				if (filepath.contains(metadataId.getValue())) {
1586
					metadataObject.reset();
1587
					assertTrue(metadataObject.available() > 0);
1588
					assertTrue(result.available() > 0);
1589
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1590
				}
1591
				if (filepath.contains(dataId.getValue())) {
1592
					dataObject1.reset();
1593
					assertTrue(dataObject1.available() > 0);
1594
					assertTrue(result.available() > 0);
1595
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1596
				}
1597
				if (filepath.contains(dataId2.getValue())) {
1598
					dataObject2.reset();
1599
					assertTrue(dataObject2.available() > 0);
1600
					assertTrue(result.available() > 0);
1601
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1602
				}
1603
1604
1605
			}
1606
1607
			// clean up
1608
			bagFile.delete();
1609 8745 leinfelder
1610
			// test the ORE lookup
1611
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1612
			assertTrue(oreIds.contains(resourceMapId));
1613 7853 leinfelder
1614
		} catch (Exception e) {
1615
			e.printStackTrace();
1616
			fail("Unexpected error: " + e.getMessage());
1617
		}
1618
	}
1619
1620 8906 tao
	/**
1621
     * Test the extra "delete information" was added to the NotFoundException
1622
     * if the object was delete in the following methods:
1623
     * MN.get
1624
     * MN.getSystemmetadata
1625
     * MN.describe
1626
     * MN.getChecksum
1627
     * MN.getRelica
1628
     */
1629
    public void testReadDeletedObject() {
1630
        printTestHeader("testDelete");
1631
1632
        try {
1633
          Session session = getTestSession();
1634
          Identifier guid = new Identifier();
1635
          guid.setValue("testDelete." + System.currentTimeMillis());
1636
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1637
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1638
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1639
          Thread.sleep(3000);
1640
          // use MN admin to delete
1641
          session = getMNSession();
1642
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1643
          System.out.println("after deleting");
1644
          assertEquals(pid.getValue(), deletedPid.getValue());
1645
          // check that we cannot get the object
1646
          session = getTestSession();
1647
          InputStream deletedObject = null;
1648
          try {
1649
              //System.out.println("before read ===============");
1650
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1651
              //System.out.println("after read ===============");
1652
          } catch (NotFound nf) {
1653
              assertTrue(nf.getMessage().contains("deleted"));
1654
          }
1655
          try {
1656
              //System.out.println("before read ===============");
1657
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1658
              //System.out.println("after read ===============");
1659
          } catch (NotFound nf) {
1660
              //System.out.println("the exception is "+nf.getMessage());
1661
              assertTrue(nf.getMessage().contains("deleted"));
1662
          }
1663
1664
          try {
1665
              //System.out.println("before read ===============");
1666
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1667
              //System.out.println("after read ===============");
1668
          } catch (NotFound nf) {
1669
              //System.out.println("the exception is "+nf.getMessage());
1670
              assertTrue(nf.getMessage().contains("deleted"));
1671
          }
1672
1673
          try {
1674
              //System.out.println("before read ===============");
1675
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1676
              //System.out.println("after read ===============");
1677
          } catch (NotFound nf) {
1678
              //System.out.println("the exception 3 is "+nf.getMessage());
1679
              assertTrue(nf.getMessage().contains("deleted"));
1680
          }
1681
1682
          try {
1683
              //System.out.println("before read ===============");
1684
              boolean isAuthorized =
1685
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1686
              //System.out.println("after read ===============");
1687
          } catch (NotFound nf) {
1688
              System.out.println("the exception 4 is "+nf.getMessage());
1689
              assertTrue(nf.getMessage().contains("deleted"));
1690
          }
1691
1692
          assertNull(deletedObject);
1693
1694
        } catch (UnsupportedEncodingException e) {
1695
          e.printStackTrace();
1696
1697
        } catch (Exception e) {
1698
          e.printStackTrace();
1699
          fail("Unexpected error: " + e.getMessage());
1700
1701
        }
1702
    }
1703 8952 tao
1704
    /**
1705
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1706
     * has some special charaters. The saved document should has the same bytes as the origianl.
1707
     */
1708
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1709
          String algorithm = "md5";
1710
          Session session = getTestSession();
1711
          Identifier guid = new Identifier();
1712
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1713
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1714
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1715
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1716
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1717
          Identifier pid =
1718
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1719
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1720
          byte[] readBytes = IOUtils.toByteArray(readResult);
1721
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1722
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1723
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1724
1725
          Identifier newPid = new Identifier();
1726
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1727 10296 tao
          object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1728 8952 tao
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1729
1730
          // do the update
1731
          Identifier updatedPid =
1732
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1733
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1734
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1735
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1736
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1737
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1738
1739
1740
    }
1741 6354 cjones
1742 9034 tao
    /**
1743
     * Test the method - get api  for a speicified SID
1744
     */
1745
    public void testGetSID() {
1746
        String str1 = "object1";
1747
        String str2 = "object2";
1748
        String str3 = "object3";
1749 9158 tao
        Date fromDate = new Date();
1750
        Calendar calendar = Calendar.getInstance();
1751
        calendar.setTime(fromDate);
1752
        calendar.roll(Calendar.YEAR, false);
1753
        fromDate = calendar.getTime();
1754 9034 tao
        try {
1755
            //insert test documents with a series id
1756
            Session session = getTestSession();
1757
            Identifier guid = new Identifier();
1758
            guid.setValue(generateDocumentId());
1759
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1760
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1761
            String sid1= "sid."+System.nanoTime();
1762
            Identifier seriesId = new Identifier();
1763
            seriesId.setValue(sid1);
1764
            System.out.println("the first sid is "+seriesId.getValue());
1765
            sysmeta.setSeriesId(seriesId);
1766
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1767
            System.out.println("the first pid is "+guid.getValue());
1768
            //test the get(pid) for v2
1769
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1770
            // go back to beginning of original stream
1771
            object1.reset();
1772
            // check
1773
            assertTrue(object1.available() > 0);
1774
            assertTrue(result.available() > 0);
1775
            assertTrue(IOUtils.contentEquals(result, object1));
1776
            // test the get(id) for v2
1777
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1778
            object1.reset();
1779
            // check
1780
            assertTrue(object1.available() > 0);
1781
            assertTrue(result1.available() > 0);
1782
            assertTrue(IOUtils.contentEquals(result1, object1));
1783
            //test the get(pid) for v1
1784
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1785
            object1.reset();
1786
            // check
1787
            assertTrue(object1.available() > 0);
1788
            assertTrue(result2.available() > 0);
1789
            assertTrue(IOUtils.contentEquals(result2, object1));
1790
            //test the get(sid) for v1
1791
            try {
1792
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1793
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1794
            } catch (NotFound ee) {
1795
1796
            }
1797 9039 tao
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1798
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1799
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1800
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1801
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1802
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1803 9034 tao
1804 9039 tao
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1805
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1806
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1807
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1808
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1809
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1810
1811
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1812
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1813
1814
            try {
1815
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1816
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1817
            } catch(NotFound nf2) {
1818
1819
            }
1820
1821
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1822
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1823
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1824
            try {
1825
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1826
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1827
            } catch(NotFound nf2) {
1828
1829
            }
1830
1831 9042 tao
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1832
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1833
1834
            try {
1835
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1836
                fail("the getCheckSum shouldn't work for sid");
1837
            } catch(NotFound nf3) {
1838
1839
            }
1840
1841
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1842
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1843
1844
            try {
1845
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1846
                fail("the getCheckSum shouldn't work for sid");
1847
            } catch(NotFound nf3) {
1848
1849
            }
1850
1851 9052 tao
            boolean isAuthorized =
1852
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1853
            assertEquals(isAuthorized, true);
1854 9042 tao
1855 9052 tao
            isAuthorized =
1856
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1857
            assertEquals(isAuthorized, true);
1858 9042 tao
1859 9052 tao
            isAuthorized =
1860
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1861
            assertEquals(isAuthorized, true);
1862
1863
            try {
1864
                isAuthorized =
1865
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1866
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1867
            } catch (NotFound e) {
1868
1869
            }
1870 9158 tao
1871
            Session cnsession = getCNSession();
1872
            Date toDate = new Date();
1873
            Event event = Event.READ;
1874
            int start = 0;
1875
            int count = 1;
1876
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null,
1877
            event.xmlValue(), seriesId.getValue(), start, count);
1878
1879
          assertNotNull(log);
1880
          assertTrue(log.getCount() == count);
1881
          assertTrue(log.getStart() == start);
1882
          assertTrue(log.getTotal() >= 1);
1883
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1884 9052 tao
1885 9034 tao
            //do a update with the same series id
1886 9035 tao
            Thread.sleep(1000);
1887 9034 tao
            Identifier newPid = new Identifier();
1888
            newPid.setValue(generateDocumentId()+"1");
1889
            System.out.println("the second pid is "+newPid.getValue());
1890 9035 tao
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1891
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1892 9034 tao
            newSysMeta.setObsoletes(guid);
1893
            newSysMeta.setSeriesId(seriesId);
1894 9035 tao
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1895
1896
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1897
            // go back to beginning of original stream
1898
            object1.reset();
1899
            // check
1900
            assertTrue(object1.available() > 0);
1901
            assertTrue(result4.available() > 0);
1902
            assertTrue(IOUtils.contentEquals(result4, object1));
1903 9034 tao
1904 9035 tao
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1905
            // go back to beginning of original stream
1906
            object2.reset();
1907
            // check
1908
            assertTrue(object2.available() > 0);
1909
            assertTrue(result5.available() > 0);
1910
            assertTrue(IOUtils.contentEquals(result5, object2));
1911
1912
1913
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1914
            object2.reset();
1915
            // check
1916
            assertTrue(object2.available() > 0);
1917
            assertTrue(result6.available() > 0);
1918
            assertTrue(IOUtils.contentEquals(result6, object2));
1919
            //test the get(pid) for v1
1920
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1921
            object1.reset();
1922
            // check
1923
            assertTrue(object1.available() > 0);
1924
            assertTrue(result7.available() > 0);
1925
            assertTrue(IOUtils.contentEquals(result7, object1));
1926
1927
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1928
            object2.reset();
1929
            // check
1930
            assertTrue(object2.available() > 0);
1931
            assertTrue(result8.available() > 0);
1932
            assertTrue(IOUtils.contentEquals(result8, object2));
1933
            //test the get(sid) for v1
1934
            try {
1935
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1936
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1937
            } catch (NotFound ee) {
1938
1939
            }
1940
1941 9039 tao
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1942
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1943
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1944
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1945
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1946
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1947
1948
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1949
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1950
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1951
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1952
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1953
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1954
1955
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1956
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1957
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1958
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1959
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1960
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1961
1962 9034 tao
            //do another update with different series id
1963
            Thread.sleep(1000);
1964
            String sid2 = "sid."+System.nanoTime();
1965
            Identifier seriesId2= new Identifier();
1966
            seriesId2.setValue(sid2);
1967
            System.out.println("the second sid is "+seriesId2.getValue());
1968
            Identifier newPid2 = new Identifier();
1969
            newPid2.setValue(generateDocumentId()+"2");
1970
            System.out.println("the third pid is "+newPid2.getValue());
1971 9035 tao
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1972
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1973 9034 tao
            sysmeta3.setObsoletes(newPid);
1974
            sysmeta3.setSeriesId(seriesId2);
1975 9035 tao
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1976 9034 tao
1977 9035 tao
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1978
            // go back to beginning of original stream
1979
            object1.reset();
1980
            // check
1981
            assertTrue(object1.available() > 0);
1982
            assertTrue(result9.available() > 0);
1983
            assertTrue(IOUtils.contentEquals(result9, object1));
1984 9034 tao
1985 9035 tao
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1986
            // go back to beginning of original stream
1987
            object2.reset();
1988
            // check
1989
            assertTrue(object2.available() > 0);
1990
            assertTrue(result10.available() > 0);
1991
            assertTrue(IOUtils.contentEquals(result10, object2));
1992 9034 tao
1993
1994 9035 tao
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1995
            // go back to beginning of original stream
1996
            object3.reset();
1997
            // check
1998
            assertTrue(object3.available() > 0);
1999
            assertTrue(result11.available() > 0);
2000
            assertTrue(IOUtils.contentEquals(result11, object3));
2001
2002
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
2003
            object3.reset();
2004
            // check
2005
            assertTrue(object3.available() > 0);
2006
            assertTrue(result12.available() > 0);
2007
            assertTrue(IOUtils.contentEquals(result12, object3));
2008
2009
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
2010
            object2.reset();
2011
            // check
2012
            assertTrue(object2.available() > 0);
2013
            assertTrue(result16.available() > 0);
2014
            assertTrue(IOUtils.contentEquals(result16, object2));
2015
2016
            //test the get(pid) for v1
2017
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
2018
            object1.reset();
2019
            // check
2020
            assertTrue(object1.available() > 0);
2021
            assertTrue(result13.available() > 0);
2022
            assertTrue(IOUtils.contentEquals(result13, object1));
2023
2024
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
2025
            object2.reset();
2026
            // check
2027
            assertTrue(object2.available() > 0);
2028
            assertTrue(result14.available() > 0);
2029
            assertTrue(IOUtils.contentEquals(result14, object2));
2030
2031
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2032
            object3.reset();
2033
            // check
2034
            assertTrue(object3.available() > 0);
2035
            assertTrue(result15.available() > 0);
2036
            assertTrue(IOUtils.contentEquals(result15, object3));
2037
2038 9039 tao
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2039
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
2040
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
2041
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
2042
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
2043
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
2044 9035 tao
2045 9039 tao
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2046
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
2047
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
2048
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
2049
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
2050
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
2051
2052
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2053
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
2054
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
2055
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
2056
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
2057
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
2058
2059
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2060
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
2061
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
2062
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
2063
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
2064
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
2065
2066
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2067
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
2068
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
2069
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
2070
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
2071
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
2072
2073
2074
2075
2076 9035 tao
            //test the get(sid) for v1
2077
            try {
2078
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
2079
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2080
            } catch (NotFound ee) {
2081
2082
            }
2083
2084
            //test the get(sid) for v1
2085
            try {
2086
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
2087
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2088
            } catch (NotFound ee) {
2089
2090
            }
2091
2092
            //test to get non-existing id for v2
2093
            try {
2094
             // the pid should be null when we try to get a no-exist sid
2095
                Identifier non_exist_sid = new Identifier();
2096
                non_exist_sid.setValue("no-sid-exist-123qwe");
2097
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
2098
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2099
            } catch (NotFound ee) {
2100
2101
            }
2102 9039 tao
2103
            try {
2104
                // the pid should be null when we try to get a no-exist sid
2105
                   Identifier non_exist_sid = new Identifier();
2106
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2107
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
2108
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2109
            } catch (NotFound ee) {
2110
2111
            }
2112
2113
            try {
2114
                // the pid should be null when we try to get a no-exist sid
2115
                   Identifier non_exist_sid = new Identifier();
2116
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2117
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
2118
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2119
               } catch (NotFound ee) {
2120
2121
               }
2122 9035 tao
2123 9158 tao
            toDate = new Date();
2124
            event = Event.READ;
2125
            start = 0;
2126
            count = 1;
2127
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null,
2128
            event.xmlValue(), seriesId.getValue(), start, count);
2129
2130
            assertNotNull(log);
2131
            assertTrue(log.getCount() == count);
2132
            assertTrue(log.getStart() == start);
2133
            assertTrue(log.getTotal() >= 1);
2134
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
2135 9049 tao
2136
            //do another update with invalid series ids
2137
            Thread.sleep(1000);
2138
            Identifier newPid3 = new Identifier();
2139
            newPid3.setValue(generateDocumentId()+"3");
2140
            System.out.println("the third pid is "+newPid3.getValue());
2141
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
2142
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
2143
            sysmeta4.setObsoletes(newPid2);
2144
            sysmeta4.setSeriesId(seriesId);
2145
            try {
2146
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2147
                fail("we can't reach here since the sid is using an old one ");
2148
            } catch (InvalidSystemMetadata eee) {
2149
2150
            }
2151
2152
            sysmeta4.setSeriesId(newPid3);
2153
            try {
2154
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2155
                fail("we can't reach here since the sid is using the pid ");
2156
            } catch (InvalidSystemMetadata eee) {
2157
2158
            }
2159
2160 9052 tao
            //test archive a series id by v1
2161
            try {
2162
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
2163
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
2164
            } catch (NotFound nf2) {
2165
2166
            }
2167
2168
            // test delete a series id by v1
2169
            Session mnSession = getMNSession();
2170
            try {
2171
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
2172
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
2173
            } catch (NotFound nf2) {
2174
2175
            }
2176
2177
            // test archive a series id by v2
2178
            MNodeService.getInstance(request).archive(session, seriesId2);
2179
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2180
            assertTrue(archived.getArchived());
2181
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2182
            assertTrue(archived.getArchived());
2183
2184
            // test delete a series id by v2
2185
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
2186
            try {
2187
                MNodeService.getInstance(request).get(session, seriesId2);
2188
                fail("we can't reach here since the series id was deleted ");
2189
            } catch (NotFound nf3) {
2190
                System.out.println("the message is ============="+nf3.getMessage());
2191
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
2192
            }
2193
2194
            try {
2195
                MNodeService.getInstance(request).get(session, newPid2);
2196
                fail("we can't reach here since the series id was deleted ");
2197
            } catch (NotFound nf3) {
2198
                //System.out.println("the message is ============="+nf3.getMessage());
2199
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2200
            }
2201
2202
            try {
2203
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2204
                fail("we can't reach here since the series id was deleted ");
2205
            } catch (NotFound nf3) {
2206
                System.out.println("the message is ============="+nf3.getMessage());
2207
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2208
            }
2209
2210
            //archive seriesId
2211
            MNodeService.getInstance(request).archive(mnSession, seriesId);
2212
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2213
            assertTrue(archived.getArchived());
2214
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2215
            assertTrue(archived.getArchived());
2216
2217
2218
            //delete seriesId
2219
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2220
            try {
2221
                MNodeService.getInstance(request).get(session, newPid);
2222
                fail("we can't reach here since the series id was deleted ");
2223
            } catch (NotFound nf3) {
2224
                //System.out.println("the message is ============="+nf3.getMessage());
2225
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2226
            }
2227
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2228
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2229
2230 9034 tao
        } catch (Exception e) {
2231
            fail(e.getMessage());
2232
        }
2233
2234 9049 tao
2235
2236
2237 9034 tao
    }
2238 9147 tao
2239
    /**
2240
     * Test the listView methods.
2241
     * @throws Excpetion
2242
     */
2243
    public void testListViews() throws Exception {
2244
        Session session = null;
2245
        OptionList list = MNodeService.getInstance(request).listViews(session);
2246
        assertTrue(list.sizeOptionList() >0);
2247
        List<String> names = list.getOptionList();
2248
        for(String name : names) {
2249
            System.out.println("It has the view named "+name);
2250
        }
2251
    }
2252
2253 9167 tao
    public void testUpdateSystemMetadata() throws Exception {
2254
        String str1 = "object1";
2255
        String str2 = "object2";
2256
        String str3 = "object3";
2257 9336 tao
2258
        Date date = new Date();
2259
        Thread.sleep(2000);
2260 9167 tao
        //insert test documents with a series id
2261
        Session session = getTestSession();
2262
        Identifier guid = new Identifier();
2263
        guid.setValue(generateDocumentId());
2264
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2265
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2266
        String sid1= "sid."+System.nanoTime();
2267
        Identifier seriesId = new Identifier();
2268
        seriesId.setValue(sid1);
2269
        System.out.println("the first sid is "+seriesId.getValue());
2270
        sysmeta.setSeriesId(seriesId);
2271
        sysmeta.setArchived(false);
2272
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2273
        //Test the generating object succeeded.
2274
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2275
        assertTrue(metadata.getIdentifier().equals(guid));
2276
        assertTrue(metadata.getArchived().equals(false));
2277
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2278
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2279 9281 tao
        System.out.println("the identifier is "+guid.getValue());
2280 9167 tao
2281 9336 tao
        Date current = sysmeta.getDateSysMetadataModified();
2282
        //updating system metadata failed since the date doesn't match
2283
        sysmeta.setArchived(true);
2284
        sysmeta.setDateSysMetadataModified(date);
2285
        try {
2286
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2287
            fail("We shouldn't get there");
2288
        } catch (Exception e) {
2289
            assertTrue(e instanceof InvalidRequest);
2290
        }
2291 9167 tao
        //update system metadata sucessfully
2292 9336 tao
        sysmeta.setDateSysMetadataModified(current);
2293 9281 tao
        BigInteger serialVersion = metadata.getSerialVersion();
2294 9336 tao
        //System.out.println("the current version is "+serialVersion.toString());
2295
        //serialVersion = serialVersion.add(BigInteger.ONE);
2296
        //System.out.println("the new version is "+serialVersion.toString());
2297
        //sysmeta.setSerialVersion(serialVersion);
2298 9377 tao
        System.out.println("the identifier is ----------------------- "+guid.getValue());
2299 9281 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2300 9167 tao
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2301
        assertTrue(metadata2.getIdentifier().equals(guid));
2302
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2303
        assertTrue(metadata2.getArchived().equals(true));
2304
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2305 9336 tao
        assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime());
2306 9167 tao
2307
        Identifier newId = new Identifier();
2308
        newId.setValue("newValue");
2309 9281 tao
        sysmeta.setIdentifier(newId);
2310
        serialVersion = metadata.getSerialVersion();
2311
        serialVersion = serialVersion.add(BigInteger.ONE);
2312
        sysmeta.setSerialVersion(serialVersion);
2313 9167 tao
        try {
2314 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2315 9167 tao
            fail("We shouldn't get there");
2316
        } catch (Exception e) {
2317
            assertTrue(e instanceof InvalidRequest);
2318
        }
2319
2320
        newId.setValue("newValue");
2321 9281 tao
        sysmeta.setSeriesId(newId);
2322 9167 tao
        try {
2323 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2324 9167 tao
            fail("We shouldn't get there");
2325
        } catch (Exception e) {
2326
            assertTrue(e instanceof InvalidRequest);
2327
        }
2328
2329
        Date newDate = new Date();
2330 9281 tao
        sysmeta.setDateUploaded(newDate);
2331 9167 tao
        try {
2332 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2333 9167 tao
            fail("We shouldn't get there");
2334
        } catch (Exception e) {
2335
            assertTrue(e instanceof InvalidRequest);
2336
        }
2337
2338
        Checksum checkSum = new Checksum();
2339
        checkSum.setValue("12345");
2340 9281 tao
        sysmeta.setChecksum(checkSum);
2341 9167 tao
        try {
2342 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2343 9167 tao
            fail("We shouldn't get there");
2344
        } catch (Exception e) {
2345
            assertTrue(e instanceof InvalidRequest);
2346
        }
2347
2348
        BigInteger size = new BigInteger("4000");
2349 9281 tao
        sysmeta.setSize(size);
2350 9167 tao
        try {
2351 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2352 9167 tao
            fail("We shouldn't get there");
2353
        } catch (Exception e) {
2354
            assertTrue(e instanceof InvalidRequest);
2355
        }
2356 9336 tao
    }
2357 9167 tao
2358 9276 tao
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2359
        String str1 = "object1";
2360
        String str2 = "object2";
2361
        String str3 = "object3";
2362
2363
        //insert two documents
2364
        Session session = getTestSession();
2365
        Identifier guid1 = new Identifier();
2366
        guid1.setValue(generateDocumentId());
2367
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2368
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2369
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2370
        //Test the generating object succeeded.
2371
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2372
        assertTrue(metadata.getIdentifier().equals(guid1));
2373
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2374
2375
        Identifier guid2 = new Identifier();
2376
        guid2.setValue(generateDocumentId());
2377
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2378
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2379
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2380
        //Test the generating object succeeded.
2381
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2382
        assertTrue(metadata.getIdentifier().equals(guid2));
2383
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2384
2385
2386
2387
        //update the system metadata without touching the obsoletes and obsoletdBy
2388
        AccessPolicy accessPolicy = new AccessPolicy();
2389
        AccessRule allow = new AccessRule();
2390
        allow.addPermission(Permission.WRITE);
2391
        Subject subject = new Subject();
2392
        subject.setValue("user_foo");
2393
        allow.addSubject(subject);
2394
        accessPolicy.addAllow(allow);
2395
        sysmeta1.setAccessPolicy(accessPolicy);
2396 9281 tao
        BigInteger serialVersion = metadata.getSerialVersion();
2397
        serialVersion = serialVersion.add(BigInteger.ONE);
2398
        sysmeta1.setSerialVersion(serialVersion);
2399 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2400
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2401
        assertTrue(metadata.getIdentifier().equals(guid1));
2402
        assertTrue(metadata.getObsoletedBy() == null);
2403
        assertTrue(metadata.getObsoletes() == null);
2404
        Session newSession = new Session();
2405
        newSession.setSubject(subject);
2406
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2407
        assertTrue(isAuthorized);
2408
2409
        sysmeta2.setAccessPolicy(accessPolicy);
2410 9281 tao
        serialVersion = metadata.getSerialVersion();
2411
        serialVersion = serialVersion.add(BigInteger.ONE);
2412
        sysmeta2.setSerialVersion(serialVersion);
2413 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2414
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2415
        assertTrue(metadata.getIdentifier().equals(guid2));
2416
        assertTrue(metadata.getObsoletes() == null);
2417
        assertTrue(metadata.getObsoletedBy() == null);
2418
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2419
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2420
        assertTrue(isAuthorized);
2421
2422
2423
2424 9278 tao
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2425 9276 tao
        sysmeta1.setObsoletedBy(guid2);
2426 9281 tao
        serialVersion = metadata.getSerialVersion();
2427
        serialVersion = serialVersion.add(BigInteger.ONE);
2428
        sysmeta1.setSerialVersion(serialVersion);
2429 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2430
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2431
        assertTrue(metadata.getIdentifier().equals(guid1));
2432
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2433
        assertTrue(metadata.getObsoletes() == null);
2434
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2435
2436
        sysmeta2.setObsoletes(guid1);
2437 9281 tao
        serialVersion = metadata.getSerialVersion();
2438
        serialVersion = serialVersion.add(BigInteger.ONE);
2439
        sysmeta2.setSerialVersion(serialVersion);
2440 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2441
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2442
        assertTrue(metadata.getIdentifier().equals(guid2));
2443
        assertTrue(metadata.getObsoletes().equals(guid1));
2444
        assertTrue(metadata.getObsoletedBy() == null);
2445
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2446
2447
2448
2449
2450 9278 tao
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2451 9276 tao
        sysmeta1.setObsoletedBy(guid2);
2452 9281 tao
        serialVersion = metadata.getSerialVersion();
2453
        serialVersion = serialVersion.add(BigInteger.ONE);
2454
        sysmeta1.setSerialVersion(serialVersion);
2455 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2456
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2457
        assertTrue(metadata.getIdentifier().equals(guid1));
2458
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2459
        assertTrue(metadata.getObsoletes() == null);
2460
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2461
2462
        sysmeta2.setObsoletes(guid1);
2463 9281 tao
        serialVersion = metadata.getSerialVersion();
2464
        serialVersion = serialVersion.add(BigInteger.ONE);
2465
        sysmeta2.setSerialVersion(serialVersion);
2466 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2467
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2468
        assertTrue(metadata.getIdentifier().equals(guid2));
2469
        assertTrue(metadata.getObsoletes().equals(guid1));
2470
        assertTrue(metadata.getObsoletedBy() == null);
2471
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2472
2473
2474
2475
2476
2477
        //resetting the obsoletes and obsoletedBy fails
2478
        Identifier newId = new Identifier();
2479
        newId.setValue("newValue");
2480
        sysmeta1.setObsoletedBy(newId);
2481 9281 tao
        serialVersion = metadata.getSerialVersion();
2482
        serialVersion = serialVersion.add(BigInteger.ONE);
2483
        sysmeta1.setSerialVersion(serialVersion);
2484 9276 tao
        try {
2485
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2486
            fail("We shouldn't get there");
2487
        } catch (Exception e) {
2488
            e.printStackTrace();
2489
            assertTrue(e instanceof InvalidRequest);
2490
        }
2491
2492
        sysmeta2.setObsoletes(newId);
2493 9281 tao
        serialVersion = metadata.getSerialVersion();
2494
        serialVersion = serialVersion.add(BigInteger.ONE);
2495
        sysmeta2.setSerialVersion(serialVersion);
2496 9276 tao
        try {
2497
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2498
            fail("We shouldn't get there");
2499
        } catch (Exception e) {
2500 9278 tao
            e.printStackTrace();
2501 9276 tao
            assertTrue(e instanceof InvalidRequest);
2502
        }
2503 9278 tao
2504
2505
2506
2507
        //insert another object
2508
        Identifier guid5 = new Identifier();
2509
        guid5.setValue(generateDocumentId());
2510
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2511
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2512
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2513
        //Test the generating object succeeded.
2514
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2515
        assertTrue(metadata.getIdentifier().equals(guid5));
2516
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2517
2518
2519
2520
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2521
        sysmeta5.setObsoletes(guid1);
2522 9281 tao
        serialVersion = metadata.getSerialVersion();
2523
        serialVersion = serialVersion.add(BigInteger.ONE);
2524
        sysmeta5.setSerialVersion(serialVersion);
2525 9278 tao
        try {
2526
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2527
            fail("We shouldn't get there");
2528
        } catch (Exception e) {
2529
            e.printStackTrace();
2530
2531
        }
2532
2533
2534
2535
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2536
        sysmeta5.setObsoletes(null);
2537
        sysmeta5.setObsoletedBy(guid2);
2538
        try {
2539
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2540
            fail("We shouldn't get there");
2541
        } catch (Exception e) {
2542
            e.printStackTrace();
2543
2544
        }
2545
2546
2547
2548
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2549
        sysmeta5.setObsoletedBy(null);
2550
        sysmeta5.setObsoletes(guid2);
2551
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2552
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2553
        assertTrue(metadata.getIdentifier().equals(guid5));
2554
        assertTrue(metadata.getObsoletes().equals(guid2));
2555
        assertTrue(metadata.getObsoletedBy() == null);
2556
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2557
2558
2559
2560
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2561
        sysmeta2.setObsoletes(guid1);
2562
        sysmeta2.setObsoletedBy(guid5);
2563 9281 tao
        serialVersion = sysmeta2.getSerialVersion();
2564
        serialVersion = serialVersion.add(BigInteger.ONE);
2565
        sysmeta2.setSerialVersion(serialVersion);
2566 9278 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2567
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2568
        assertTrue(metadata.getIdentifier().equals(guid2));
2569
        assertTrue(metadata.getObsoletes().equals(guid1));
2570
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2571
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2572 9276 tao
    }
2573
2574 9590 tao
    /**
2575
     * Test to create a metacat object which uses the isotc211 noaa variant.
2576
     * @throws Exception
2577
     */
2578
    public void testCreateNOAAObject() throws Exception {
2579
        Session session = getTestSession();
2580
        Identifier guid = new Identifier();
2581
        guid.setValue("testNoaa." + System.currentTimeMillis());
2582
        InputStream object = new FileInputStream("test/sciencemetadata-noaa.xml");
2583
        InputStream sysmetaInput = new FileInputStream("test/sysmeta-noaa.xml");
2584
        SystemMetadata sysmeta = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmetaInput);
2585
        sysmeta.setIdentifier(guid);
2586
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
2587
        assertTrue(pid.getValue().equals(guid.getValue()));
2588
    }
2589
2590 10023 tao
2591
    /**
2592
     * Test the permission control on the updateSystemMetadata method
2593
     * @throws Exception
2594
     */
2595
    public void testPermissionOfUpdateSystemmeta() throws Exception {
2596
        String str = "object1";
2597
2598
        Date date = new Date();
2599
        Thread.sleep(2000);
2600
        //insert a test document
2601
        Session session = getTestSession();
2602
        Identifier guid = new Identifier();
2603
        guid.setValue(generateDocumentId());
2604
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2605
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2606
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2607
        //Test the generating object succeeded.
2608
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2609
2610
        //Test cn session -success
2611
        Session cnSession= getCNSession();
2612
        MNodeService.getInstance(request).updateSystemMetadata(cnSession, guid, metadata);
2613
2614
        //Test mn session - success
2615
        Session mnSession = getMNSession();
2616
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2617
        MNodeService.getInstance(request).updateSystemMetadata(mnSession, guid, metadata);
2618
2619
        //Test the owner session -success
2620
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2621
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2622
2623
        //Test another session -failed
2624
        Session anotherSession = getAnotherSession();
2625
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2626
        try {
2627
             MNodeService.getInstance(request).updateSystemMetadata(anotherSession, guid, metadata);
2628
            fail("Another user can't update the system metadata");
2629
        } catch (NotAuthorized e)  {
2630
2631
        }
2632
2633
    }
2634 10108 tao
2635
2636
    /**
2637
     * Test if the updateSystemmetadata method can catch the circular obsoletes fields chain
2638
     */
2639
    public void testUpdateSystemMetadataWithCircularObsoletesChain() throws Exception{
2640
2641
        Date date = new Date();
2642
        Thread.sleep(1000);
2643
        String str = "object1";
2644
        //insert a test document
2645
        Session session = getTestSession();
2646
        Identifier guid = new Identifier();
2647
        guid.setValue(generateDocumentId());
2648
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2649
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2650
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2651
2652
        //Test the generating object succeeded.
2653
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2654
        Thread.sleep(1000);
2655
        Identifier guid1 = new Identifier();
2656
        guid1.setValue(generateDocumentId());
2657
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2658
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2659
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2660
        //Test the generating object succeeded.
2661
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2662
2663
        Thread.sleep(1000);
2664
        Identifier guid2 = new Identifier();
2665
        guid2.setValue(generateDocumentId());
2666
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2667
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2668
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2669
        //Test the generating object succeeded.
2670
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2671
2672
        // test to create a circular obsoletes chain: guid obsoletes guid
2673
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2674
        metadata.setObsoletes(guid);
2675
        try {
2676
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2677
             fail("We can't update the system metadata which the obsoletes field is itself");
2678
       } catch (InvalidRequest e)  {
2679
           assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2680
       }
2681
2682
       // guid obsolete guid1
2683
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2684
       metadata.setObsoletes(guid1);
2685
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2686
2687
       // guid1 obsoletedBy guid
2688
       // guid1  obsoletes  guid2
2689
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2690
       metadata.setObsoletes(guid2);
2691
       metadata.setObsoletedBy(guid);
2692
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2693
2694
       // crete a circular obsolete chain:
2695
       // guid2 obsoletes guid
2696
       //guid2 obsoletedBy guid1
2697
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2698
       metadata.setObsoletes(guid);
2699
       metadata.setObsoletedBy(guid1);
2700
2701
       try {
2702
           MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2703
           fail("We can't update the system metadata which has a circular obsoletes chain");
2704
      } catch (InvalidRequest e)  {
2705
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2706
      }
2707
2708
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2709
       metadata.setObsoletedBy(guid1);
2710
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2711
    }
2712
2713
2714
2715
2716
    /**
2717
     * Test if the updateSystemmetadata method can catch the circular obsoletedBy chain
2718
     */
2719
    public void testUpdateSystemMetadataWithCircularObsoletedByChain() throws Exception{
2720
2721
        Date date = new Date();
2722
        Thread.sleep(1000);
2723
        String str = "object1";
2724
        //insert a test document
2725
        Session session = getTestSession();
2726
        Identifier guid = new Identifier();
2727
        guid.setValue(generateDocumentId());
2728
        InputStream object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2729
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2730
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2731
2732
        //Test the generating object succeeded.
2733
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2734
        Thread.sleep(1000);
2735
        Identifier guid1 = new Identifier();
2736
        guid1.setValue(generateDocumentId());
2737
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2738
        sysmeta = createSystemMetadata(guid1, session.getSubject(), object1);
2739
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta);
2740
        //Test the generating object succeeded.
2741
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2742
2743
        Thread.sleep(1000);
2744
        Identifier guid2 = new Identifier();
2745
        guid2.setValue(generateDocumentId());
2746
        object1 = new ByteArrayInputStream(str.getBytes("UTF-8"));
2747
        sysmeta = createSystemMetadata(guid2, session.getSubject(), object1);
2748
        MNodeService.getInstance(request).create(session, guid2, object1, sysmeta);
2749
        //Test the generating object succeeded.
2750
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2751
2752
2753
       // guid obsolete guid1
2754
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2755
       metadata.setObsoletes(guid1);
2756
       MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2757
2758
       // guid1  obsoletes  guid2
2759
       // guid1 obsoletedBy guid1 (a circular chain)
2760
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2761
       metadata.setObsoletes(guid2);
2762
       metadata.setObsoletedBy(guid1);
2763
       try {
2764
           MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2765
            fail("We can't update the system metadata which the obsoletes field is itself");
2766
      } catch (InvalidRequest e)  {
2767
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2768
      }
2769
2770
2771
       // guid1  obsoletes  guid2
2772
       // guid1 obsoletedBy guid
2773
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2774
       metadata.setObsoletes(guid2);
2775
       metadata.setObsoletedBy(guid);
2776
       MNodeService.getInstance(request).updateSystemMetadata(session, guid1, metadata);
2777
2778
2779
       //guid2 obsoletedBy guid1
2780
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2781
       metadata.setObsoletedBy(guid1);
2782
       MNodeService.getInstance(request).updateSystemMetadata(session, guid2, metadata);
2783
2784
2785
       //guid2 obsoletedBy guid1
2786
       //guid1 obsoletedBy guid
2787
       //guid  obsoletedBy guid2 (created a circle)
2788
       metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2789
       metadata.setObsoletedBy(guid2);
2790
       try {
2791
           MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2792
           fail("We can't update the system metadata which has a circular obsoletes chain");
2793
      } catch (InvalidRequest e)  {
2794
          assertTrue("The update system metadata should fail and the error message should have the wording - circular chain", e.getMessage().contains("a circular chain"));
2795
      }
2796
2797
2798
    }
2799 9167 tao
}