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