Project

General

Profile

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

    
25
package edu.ucsb.nceas.metacattest;
26

    
27
import java.io.ByteArrayInputStream;
28
import java.io.InputStream;
29
import java.sql.SQLException;
30
import java.util.*;
31

    
32
import junit.framework.Test;
33
import junit.framework.TestSuite;
34

    
35
import org.dataone.client.v2.itk.D1Client;
36
import org.dataone.configuration.Settings;
37
import org.dataone.service.types.v1.Identifier;
38
import org.dataone.service.types.v1.NodeReference;
39
import org.dataone.service.types.v1.NodeType;
40
import org.dataone.service.types.v1.ObjectFormatIdentifier;
41
import org.dataone.service.types.v1.ObjectList;
42
import org.dataone.service.types.v1.Session;
43
import org.dataone.service.types.v1.Subject;
44
import org.dataone.service.types.v2.MediaType;
45
import org.dataone.service.types.v2.MediaTypeProperty;
46
import org.dataone.service.types.v2.Node;
47
import org.dataone.service.types.v2.NodeList;
48
import org.dataone.service.types.v2.SystemMetadata;
49

    
50
import edu.ucsb.nceas.MCTestCase;
51
import edu.ucsb.nceas.metacat.AccessionNumber;
52
import edu.ucsb.nceas.metacat.AccessionNumberException;
53
import edu.ucsb.nceas.metacat.IdentifierManager;
54
import edu.ucsb.nceas.metacat.McdbDocNotFoundException;
55
import edu.ucsb.nceas.metacat.client.MetacatAuthException;
56
import edu.ucsb.nceas.metacat.client.MetacatInaccessibleException;
57
import edu.ucsb.nceas.metacat.database.DBConnectionPool;
58
import edu.ucsb.nceas.metacat.dataone.CNodeService;
59
import edu.ucsb.nceas.metacat.dataone.D1NodeServiceTest;
60
import edu.ucsb.nceas.metacat.dataone.MNodeService;
61

    
62
import org.dataone.service.exceptions.InvalidSystemMetadata;
63
import org.dataone.service.exceptions.NotFound;
64
import org.dataone.service.exceptions.ServiceFailure;
65

    
66
public class IdentifierManagerTest extends D1NodeServiceTest {
67
    private String badGuid = "test:testIdThatDoesNotExist";
68
    
69
    public IdentifierManagerTest(String name) {
70
        super(name);
71
    }
72
    
73
    /**
74
     * Create a suite of tests to be run together
75
     */
76
    public static Test suite() {
77
        TestSuite suite = new TestSuite();
78
        suite.addTest(new IdentifierManagerTest("initialize"));
79
        // Test basic functions
80
        suite.addTest(new IdentifierManagerTest("testGetGUID"));
81
        suite.addTest(new IdentifierManagerTest("testGetAllLocalIds"));
82
        suite.addTest(new IdentifierManagerTest("testGetInstance"));
83
        suite.addTest(new IdentifierManagerTest("testGetLocalId"));
84
        suite.addTest(new IdentifierManagerTest("testGetLocalIdNotFound"));
85
        suite.addTest(new IdentifierManagerTest("testIdentifierExists"));
86
        suite.addTest(new IdentifierManagerTest("testCreateMapping"));
87
        suite.addTest(new IdentifierManagerTest("testGenerateLocalId"));
88
        suite.addTest(new IdentifierManagerTest("testGetHeadPID"));
89
        suite.addTest(new IdentifierManagerTest("testMediaType"));
90
        suite.addTest(new IdentifierManagerTest("testQuerySystemMetadata"));
91
        return suite;
92
    }
93
    /**
94
     * Initialize the connection to metacat, and insert a document to be 
95
     * used for testing with a known docid.
96
     */
97
    public void setUp() {
98
        
99
        metacatConnectionNeeded = true;
100
        try {
101
            DBConnectionPool pool = DBConnectionPool.getInstance();
102
        } catch (SQLException e2) {
103
            fail(e2.getMessage());
104
        }
105
        
106
        try {
107
            super.setUp();
108
        } catch (Exception e1) {
109
            fail(e1.getMessage());
110
        }
111
    }
112
    
113
    /**
114
     * test getting a guid from the systemmetadata table
115
     */
116
    public void testGetGUID()
117
    {
118
        ph("testGetGUID");
119
        try
120
        {
121
            IdentifierManager im = IdentifierManager.getInstance();
122

    
123
            String docid = insertTestDocument();
124
            docid = docid.substring(0, docid.lastIndexOf("."));
125
            
126
            String gotGuid = im.getGUID(docid, 1);
127
            assertNotNull(gotGuid);
128
        }
129
        catch(Exception e)
130
        {
131
            fail("Unexpected exception in testGetGUID: " + e.getMessage());
132
        }
133
    }
134
    
135
    /**
136
     * test getting a list of all local ids
137
     */
138
    public void testGetAllLocalIds()
139
    {
140
        ph("testGetAllLocalIds");
141
        try
142
        {
143
            List l = IdentifierManager.getInstance().getAllLocalIds();
144
            for(int i=0; i<l.size(); i++)
145
            {
146
                System.out.println(l.get(i));
147
            }
148
            assertTrue(l.size() > 0);
149
        }
150
        catch(Exception e)
151
        {
152
            fail("Error in testGetAllLocalIds: " + e.getMessage());
153
        }
154
    }
155

    
156
    /** Test that IM instances can be created. */
157
    public void testGetInstance() {
158
        ph("testGetInstance");
159
        IdentifierManager im = IdentifierManager.getInstance();
160
        assertNotNull(im);
161
    }
162

    
163
    /** Test that known LocalId's can be looked up from GUIDs. */
164
    public void testGetLocalId() {
165
        ph("testGetLocalId");
166
        IdentifierManager im = IdentifierManager.getInstance();
167
        String docidWithRev = insertTestDocument();
168
        String docid = docidWithRev.substring(0, docidWithRev.lastIndexOf("."));
169
        String guid;
170
        String idReturned;
171
        try {
172
            guid = im.getGUID(docid, 1);
173
            idReturned = im.getLocalId(guid);
174
            assertEquals(docidWithRev, idReturned);
175
            
176
        } catch (McdbDocNotFoundException e) {
177
            fail(e.getMessage());
178
        } catch (SQLException e) {
179
            fail(e.getMessage());
180
        }
181
    }
182
    
183
    /** Test that unknown LocalId's return the proper exception. */
184
    public void testGetLocalIdNotFound() {
185
        ph("testGetLocalIdNotFound");
186
        IdentifierManager im = IdentifierManager.getInstance();
187
        String idReturned;
188
        try {
189
            idReturned = im.getLocalId(badGuid);
190
            fail("Failed: getLocalID() should have returned an document not " + 
191
                 "found exception but did not.");
192
        } catch (McdbDocNotFoundException e) {
193
            assertNotNull(e);
194
        } catch (SQLException e) {
195
            fail(e.getMessage());
196
        }
197
    }
198
    
199
    /** 
200
     * Test that an identifier is present in the system when it should
201
     *  be, and that it is not present when it shouldn't be. 
202
     */
203
    public void testIdentifierExists() {
204
        ph("testIdentifierExists");
205
        
206
        String goodGuid  = "";
207
        String accString = "";
208
        String docid     = "";
209
        int rev          = 0;
210
        
211
        try {
212
          IdentifierManager im = IdentifierManager.getInstance();
213
          accString = insertTestDocument();
214
          AccessionNumber accNumber = new AccessionNumber(accString, "NONE");
215
          docid = accNumber.getDocid();
216
          rev = new Integer(accNumber.getRev());
217
          goodGuid = im.getGUID(docid, rev);
218
          assertTrue(im.identifierExists(goodGuid));
219
          assertFalse(im.identifierExists(badGuid));
220
          
221
        } catch ( McdbDocNotFoundException dnfe ) {
222
          fail("The document " + docid + "couldn't be found. The error was: " +
223
               dnfe.getMessage());
224
          
225
        } catch ( AccessionNumberException ane ) {
226
          fail("The accession number could not be created for docid" +
227
               accString + ". The error was: " + ane.getMessage());
228
        
229
        } catch ( NumberFormatException nfe ) {
230
          fail("The revision number could not be created for docid" + 
231
               accString + ". The error was: " + nfe.getMessage());
232
          
233
           } catch ( SQLException sqle ) {
234
             fail("The accession number could not be created for docid" + 
235
                  accString + ". The error was: " + sqle.getMessage());
236

    
237
        }
238
    }
239
    
240
    /**
241
     * Test that we are able to create mappings from guids to localIds, and that
242
     * improperly formatted docids generate the proper exceptions.  This also tests
243
     * getLocalId() and getGUID()
244
     */
245
    public void testCreateMapping() {
246
       ph("testCreateMapping");
247
       try
248
       {
249
            IdentifierManager im = IdentifierManager.getInstance();
250
            String docid = "test." + new Date().getTime() + ".1";
251
            String guid = "guid:" + docid;
252
            im.createMapping(guid, docid);
253
            String guiddocid = docid.substring(0, docid.length() - 2);
254
            System.out.println("guiddocid: " + guiddocid);
255
            String guid2 = im.getGUID(guiddocid, 1);
256
            assertTrue(guid2.equals(guid));
257
            String docid2 = im.getLocalId(guid);
258
            assertTrue(docid.equals(docid2));
259
        } catch (McdbDocNotFoundException e) {
260
            e.printStackTrace();
261
            fail("createMapping failed to create proper localId from guid: " + e.getMessage());
262
        } catch (SQLException e) {
263
            fail(e.getMessage());
264
        }
265
    }
266
    
267
    
268
    /**
269
     * test the local id creation
270
     */
271
    public void testGenerateLocalId() {
272
      IdentifierManager im = IdentifierManager.getInstance();
273
      String localid = im.generateLocalId("mynewid." + new Date().getTime(), 1);
274
      System.out.println("localid: " + localid);
275
      assertTrue(localid != null);
276
    }
277
    
278
    /**
279
     * Test the method - getHeadPID for a speicified SID
280
     */
281
    public void testGetHeadPID() {
282
        
283
        try {
284
            //case-1  P1(S1) <-> P2(S1), S1 = P2 (Type 1)
285
            Session session = getTestSession();
286
            Identifier guid = new Identifier();
287
            guid.setValue(generateDocumentId());
288
            InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
289
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
290
            String sid1= "sid."+System.nanoTime();
291
            Identifier seriesId = new Identifier();
292
            seriesId.setValue(sid1);
293
            System.out.println("the first sid is "+seriesId.getValue());
294
            sysmeta.setSeriesId(seriesId);
295
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
296
            System.out.println("the first pid is "+guid.getValue());
297
            Identifier head = IdentifierManager.getInstance().getHeadPID(seriesId);
298
            System.out.println("the head 1 is "+head.getValue());
299
            assertTrue(head.getValue().equals(guid.getValue()));
300
            assertTrue(IdentifierManager.getInstance().systemMetadataSIDExists(seriesId.getValue()));
301
            assertTrue(!IdentifierManager.getInstance().systemMetadataPIDExists(seriesId.getValue()));
302
            assertTrue(IdentifierManager.getInstance().systemMetadataPIDExists(guid.getValue()));
303
            assertTrue(!IdentifierManager.getInstance().systemMetadataSIDExists(guid.getValue()));
304
            
305
            //do a update with the same series id
306
            Thread.sleep(1000);
307
            Identifier newPid = new Identifier();
308
            newPid.setValue(generateDocumentId()+"1");
309
            System.out.println("the second pid is "+newPid.getValue());
310
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
311
            newSysMeta.setObsoletes(guid);
312
            newSysMeta.setSeriesId(seriesId);
313
            MNodeService.getInstance(request).update(session, guid, object, newPid, newSysMeta);
314
            
315
            //check
316
            SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
317
            assertTrue(meta.getObsoletedBy().equals(newPid));
318
            assertTrue(meta.getObsoletes() == null);
319
            
320
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, newPid);
321
            assertTrue(meta.getObsoletedBy() == null);
322
            assertTrue(meta.getObsoletes().equals(guid));
323
            
324
            System.out.println("case 1: =======");
325
            // the pid should be the newPid when we try to get the sid1
326
            head = IdentifierManager.getInstance().getHeadPID(seriesId);
327
            assertTrue(head.getValue().equals(newPid.getValue()));
328
            
329
            
330
            // the pid should be null when we try to get a no-exist sid
331
            Identifier non_exist_sid = new Identifier();
332
            non_exist_sid.setValue("no-sid-exist-123qwe");
333
            assertTrue(IdentifierManager.getInstance().getHeadPID(non_exist_sid) == null);
334
            
335
            //case-2 P1(S1) ? P2(S1), S1 = P2
336
            // http://jenkins-1.dataone.org/documentation/unstable/API-Documentation-development/design/ContentMutability.html
337
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
338
            Identifier pid1_case2 = new Identifier();
339
            pid1_case2.setValue(generateDocumentId());
340
            String sid_case2_str= "sid."+System.nanoTime();
341
            Identifier sid_case2 = new Identifier();
342
            sid_case2.setValue(sid_case2_str);
343
            SystemMetadata sysmeta_case2 = createSystemMetadata(pid1_case2, session.getSubject(), object);
344
            sysmeta_case2.setSeriesId(sid_case2);
345
            CNodeService.getInstance(request).create(session, pid1_case2, object, sysmeta_case2);
346
            
347
            Thread.sleep(1000);
348
            Identifier pid2_case2 = new Identifier();
349
            pid2_case2.setValue(generateDocumentId());
350
            sysmeta = createSystemMetadata(pid2_case2, session.getSubject(), object);
351
            sysmeta.setSeriesId(sid_case2);
352
            try {
353
                CNodeService.getInstance(request).create(session, pid2_case2, object, sysmeta);
354
                fail("we shouldn't get here and an InvalidSystemMetacat exception should be thrown.");
355
            } catch (Exception e) {
356
                System.out.println("case 2======= Invalid system metadata to insert the second object");
357
                //check 
358
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case2);
359
                assertTrue(meta.getObsoletedBy() == null);
360
                assertTrue(meta.getObsoletes() == null);
361
                // the pid should be the newPid when we try to get the sid1
362
                head = IdentifierManager.getInstance().getHeadPID(sid_case2);
363
                assertTrue(head.getValue().equals(pid1_case2.getValue()));
364
            } 
365
            
366
            
367
            //case-3  P1(S1) <- P2(S1), S1 = P2, Discouraged, but not error condition, S1 = P2 (P1 and P2 are type 1 ends, not an ideal chain )
368
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
369
            Identifier pid1_case3 = new Identifier();
370
            pid1_case3.setValue(generateDocumentId());
371
            String sid_case3_str= "sid."+System.nanoTime();
372
            Identifier sid_case3 = new Identifier();
373
            sid_case3.setValue(sid_case3_str);
374
            SystemMetadata sysmeta_case3 = createSystemMetadata(pid1_case3, session.getSubject(), object);
375
            sysmeta_case3.setSeriesId(sid_case3);
376
            CNodeService.getInstance(request).create(session, pid1_case3, object, sysmeta_case3);
377
            
378
            Thread.sleep(1000);
379
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
380
            Identifier pid2_case3 = new Identifier();
381
            pid2_case3.setValue(generateDocumentId());
382
            SystemMetadata sysmeta2_case3 = createSystemMetadata(pid2_case3, session.getSubject(), object);
383
            sysmeta2_case3.setSeriesId(sid_case3);
384
            sysmeta2_case3.setObsoletes(pid1_case3);
385
            CNodeService.getInstance(request).create(session, pid2_case3, object, sysmeta2_case3);
386
            
387
            //check
388
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case3);
389
            assertTrue(meta.getObsoletedBy() == null);
390
            assertTrue(meta.getObsoletes() == null);
391
            
392
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case3);
393
            assertTrue(meta.getObsoletedBy() == null);
394
            assertTrue(meta.getObsoletes().equals(pid1_case3));
395

    
396
            System.out.println("case 3: =======");
397
            head = IdentifierManager.getInstance().getHeadPID(sid_case3);
398
            assertTrue(head.equals(pid2_case3));
399
            
400
            //case-4 P1(S1) <-> P2(S1) <-> P3(S2), S1 = P2 (Type 2), S2 = P3 (Type 1)
401
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
402
            Identifier pid1_case4 = new Identifier();
403
            pid1_case4.setValue(generateDocumentId());
404
            Identifier sid_case4 = new Identifier();
405
            sid_case4.setValue("sid."+System.nanoTime());
406
            SystemMetadata sysmeta_case4 = createSystemMetadata(pid1_case4, session.getSubject(), object);
407
            sysmeta_case4.setSeriesId(sid_case4);
408
            CNodeService.getInstance(request).create(session, pid1_case4, object, sysmeta_case4);
409
            
410
            Thread.sleep(1000);
411
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
412
            Identifier pid2_case4 = new Identifier();
413
            pid2_case4.setValue(generateDocumentId());
414
            SystemMetadata sysmeta2_case4 = createSystemMetadata(pid2_case4, session.getSubject(), object);
415
            sysmeta2_case4.setSeriesId(sid_case4);
416
            sysmeta2_case4.setObsoletes(pid1_case4);
417
            CNodeService.getInstance(request).create(session, pid2_case4, object, sysmeta2_case4);
418
            
419
            sysmeta_case4.setObsoletedBy(pid2_case4);
420
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case4, sysmeta_case4);
421
            
422
            Thread.sleep(1000);
423
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
424
            Identifier pid3_case4 = new Identifier();
425
            pid3_case4.setValue(generateDocumentId());
426
            Identifier sid2_case4 = new Identifier();
427
            sid2_case4.setValue("sid."+System.nanoTime());
428
            SystemMetadata sysmeta3_case4 = createSystemMetadata(pid3_case4, session.getSubject(), object);
429
            sysmeta3_case4.setSeriesId(sid2_case4);
430
            sysmeta3_case4.setObsoletes(pid2_case4);
431
            CNodeService.getInstance(request).create(session, pid3_case4, object, sysmeta3_case4);
432
            
433
            sysmeta2_case4.setObsoletedBy(pid3_case4);
434
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case4, sysmeta2_case4);
435
            
436
            //check
437
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case4);
438
            assertTrue(meta.getObsoletedBy().equals(pid2_case4));
439
            assertTrue(meta.getObsoletes() == null);
440
            
441
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case4);
442
            assertTrue(meta.getObsoletedBy().equals(pid3_case4));
443
            assertTrue(meta.getObsoletes().equals(pid1_case4));
444
            
445
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case4);
446
            assertTrue(meta.getObsoletedBy() == null);
447
            assertTrue(meta.getObsoletes().equals(pid2_case4));
448
            
449
            System.out.println("case 4: =======");
450
            head = IdentifierManager.getInstance().getHeadPID(sid_case4);
451
            assertTrue(head.equals(pid2_case4));
452
            head = IdentifierManager.getInstance().getHeadPID(sid2_case4);
453
            assertTrue(head.equals(pid3_case4));
454
            
455
            
456
            //case-5 P1(S1) <- P2(S1) <- P3(S2), S1 = P2 (P1 and P2 are type 1 ends, not an ideal chain), S2 = P3 (Type 1)
457
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
458
            Identifier pid1_case5 = new Identifier();
459
            pid1_case5.setValue(generateDocumentId());
460
            Identifier sid_case5 = new Identifier();
461
            sid_case5.setValue("sid."+System.nanoTime());
462
            SystemMetadata sysmeta1_case5 = createSystemMetadata(pid1_case5, session.getSubject(), object);
463
            sysmeta1_case5.setSeriesId(sid_case5);
464
            CNodeService.getInstance(request).create(session, pid1_case5, object, sysmeta1_case5);
465
            
466
            Thread.sleep(1000);
467
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
468
            Identifier pid2_case5 = new Identifier();
469
            pid2_case5.setValue(generateDocumentId());
470
            SystemMetadata sysmeta2_case5 = createSystemMetadata(pid2_case5, session.getSubject(), object);
471
            sysmeta2_case5.setSeriesId(sid_case5);
472
            sysmeta2_case5.setObsoletes(pid1_case5);
473
            CNodeService.getInstance(request).create(session, pid2_case5, object, sysmeta2_case5);
474
            
475
            Thread.sleep(1000);
476
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
477
            Identifier pid3_case5 = new Identifier();
478
            pid3_case5.setValue(generateDocumentId());
479
            Identifier sid2_case5 = new Identifier();
480
            sid2_case5.setValue("sid."+System.nanoTime());
481
            SystemMetadata sysmeta3_case5 = createSystemMetadata(pid3_case5, session.getSubject(), object);
482
            sysmeta3_case5.setSeriesId(sid2_case5);
483
            sysmeta3_case5.setObsoletes(pid2_case5);
484
            CNodeService.getInstance(request).create(session, pid3_case5, object, sysmeta3_case5);
485
            
486
          //check
487
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case5);
488
            assertTrue(meta.getObsoletedBy() == null);
489
            assertTrue(meta.getObsoletes() == null);
490
            
491
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case5);
492
            assertTrue(meta.getObsoletedBy() == null );
493
            assertTrue(meta.getObsoletes().equals(pid1_case5));
494
            
495
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case5);
496
            assertTrue(meta.getObsoletedBy() == null);
497
            assertTrue(meta.getObsoletes().equals(pid2_case5));
498
            
499
            System.out.println("case 5: =======");
500
            head = IdentifierManager.getInstance().getHeadPID(sid_case5);
501
            assertTrue(head.equals(pid2_case5));
502
            head = IdentifierManager.getInstance().getHeadPID(sid2_case5);
503
            assertTrue(head.equals(pid3_case5));
504
            
505
            
506
            //case-6 P1(S1) <-> P2(S1) <-> P3(), S1 = P2 (Type 2)
507
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
508
            Identifier pid1_case6 = new Identifier();
509
            pid1_case6.setValue(generateDocumentId());
510
            Identifier sid_case6 = new Identifier();
511
            sid_case6.setValue("sid."+System.nanoTime());
512
            SystemMetadata sysmeta_case6 = createSystemMetadata(pid1_case6, session.getSubject(), object);
513
            sysmeta_case6.setSeriesId(sid_case6);
514
            CNodeService.getInstance(request).create(session, pid1_case6, object, sysmeta_case6);
515
            
516
            Thread.sleep(1000);
517
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
518
            Identifier pid2_case6 = new Identifier();
519
            pid2_case6.setValue(generateDocumentId());
520
            SystemMetadata sysmeta2_case6 = createSystemMetadata(pid2_case6, session.getSubject(), object);
521
            sysmeta2_case6.setSeriesId(sid_case6);
522
            sysmeta2_case6.setObsoletes(pid1_case6);
523
            CNodeService.getInstance(request).create(session, pid2_case6, object, sysmeta2_case6);
524
            
525
            sysmeta_case6.setObsoletedBy(pid2_case6);
526
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case6, sysmeta_case6);
527
            
528
            Thread.sleep(1000);
529
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
530
            Identifier pid3_case6 = new Identifier();
531
            pid3_case6.setValue(generateDocumentId());
532
            SystemMetadata sysmeta3_case6 = createSystemMetadata(pid3_case6, session.getSubject(), object);
533
            sysmeta3_case6.setObsoletes(pid2_case6);
534
            CNodeService.getInstance(request).create(session, pid3_case6, object, sysmeta3_case6);
535
            
536
            sysmeta2_case6.setObsoletedBy(pid3_case6);
537
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case6, sysmeta2_case6);
538
            
539
            //check
540
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case6);
541
            assertTrue(meta.getObsoletedBy().equals(pid2_case6));
542
            assertTrue(meta.getObsoletes() == null);
543
            
544
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case6);
545
            assertTrue(meta.getObsoletedBy().equals(pid3_case6));
546
            assertTrue(meta.getObsoletes().equals(pid1_case6));
547
            
548
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case6);
549
            assertTrue(meta.getObsoletedBy() == null);
550
            assertTrue(meta.getObsoletes().equals(pid2_case6));
551
            
552
            System.out.println("case 6: =======");
553
            head = IdentifierManager.getInstance().getHeadPID(sid_case6);
554
            assertTrue(head.equals(pid2_case6));
555
            
556
            
557
            //case-7 P1(S1) <-> P2(S1) <-> P3() <-> P4(S2), S1 = P2 (Type 2), S2 = P4 (Type 1)
558
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
559
            Identifier pid1_case7 = new Identifier();
560
            pid1_case7.setValue(generateDocumentId());
561
            Identifier sid_case7 = new Identifier();
562
            sid_case7.setValue("sid."+System.nanoTime());
563
            SystemMetadata sysmeta_case7 = createSystemMetadata(pid1_case7, session.getSubject(), object);
564
            sysmeta_case7.setSeriesId(sid_case7);
565
            CNodeService.getInstance(request).create(session, pid1_case7, object, sysmeta_case7);
566
            
567
            Thread.sleep(1000);
568
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
569
            Identifier pid2_case7 = new Identifier();
570
            pid2_case7.setValue(generateDocumentId());
571
            SystemMetadata sysmeta2_case7 = createSystemMetadata(pid2_case7, session.getSubject(), object);
572
            sysmeta2_case7.setSeriesId(sid_case7);
573
            sysmeta2_case7.setObsoletes(pid1_case7);
574
            CNodeService.getInstance(request).create(session, pid2_case7, object, sysmeta2_case7);
575
            
576
            sysmeta_case7.setObsoletedBy(pid2_case7);
577
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case7, sysmeta_case7);
578
            
579
            Thread.sleep(1000);
580
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
581
            Identifier pid3_case7 = new Identifier();
582
            pid3_case7.setValue(generateDocumentId());
583
            SystemMetadata sysmeta3_case7 = createSystemMetadata(pid3_case7, session.getSubject(), object);
584
            sysmeta3_case7.setObsoletes(pid2_case7);
585
            CNodeService.getInstance(request).create(session, pid3_case7, object, sysmeta3_case7);
586
            
587
            sysmeta2_case7.setObsoletedBy(pid3_case7);
588
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case7, sysmeta2_case7);
589
            
590
            Thread.sleep(1000);
591
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
592
            Identifier pid4_case7 = new Identifier();
593
            pid4_case7.setValue(generateDocumentId());
594
            Identifier sid2_case7 = new Identifier();
595
            sid2_case7.setValue("sid."+System.nanoTime());
596
            SystemMetadata sysmeta4_case7 = createSystemMetadata(pid4_case7, session.getSubject(), object);
597
            sysmeta4_case7.setObsoletes(pid3_case7);
598
            sysmeta4_case7.setSeriesId(sid2_case7);
599
            CNodeService.getInstance(request).create(session, pid4_case7, object, sysmeta4_case7);
600
            
601
            sysmeta3_case7.setObsoletedBy(pid4_case7);
602
            CNodeService.getInstance(request).updateSystemMetadata(session, pid3_case7, sysmeta3_case7);
603
            
604
            //check
605
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case7);
606
            assertTrue(meta.getObsoletedBy().equals(pid2_case7));
607
            assertTrue(meta.getObsoletes() == null);
608
            
609
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case7);
610
            assertTrue(meta.getObsoletedBy().equals(pid3_case7));
611
            assertTrue(meta.getObsoletes().equals(pid1_case7));
612
            
613
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case7);
614
            assertTrue(meta.getObsoletedBy().equals(pid4_case7));
615
            assertTrue(meta.getObsoletes().equals(pid2_case7));
616
            
617
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case7);
618
            assertTrue(meta.getObsoletedBy() == null);
619
            assertTrue(meta.getObsoletes().equals(pid3_case7));
620
            
621
            System.out.println("case 7: =======");
622
            head = IdentifierManager.getInstance().getHeadPID(sid_case7);
623
            assertTrue(head.equals(pid2_case7));
624
            head = IdentifierManager.getInstance().getHeadPID(sid2_case7);
625
            assertTrue(head.equals(pid4_case7));
626
            
627
            
628
            //case-8  P1(S1) <-> P2(S1) -> ?? <- P4(S1), S1 = P4, (Type 1) (Error, but will happen)
629
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
630
            Identifier pid1_case8 = new Identifier();
631
            pid1_case8.setValue(generateDocumentId());
632
            Identifier sid_case8 = new Identifier();
633
            sid_case8.setValue("sid."+System.nanoTime());
634
            SystemMetadata sysmeta_case8 = createSystemMetadata(pid1_case8, session.getSubject(), object);
635
            sysmeta_case8.setSeriesId(sid_case8);
636
            CNodeService.getInstance(request).create(session, pid1_case8, object, sysmeta_case8);
637
            
638
            Thread.sleep(1000);
639
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
640
            Identifier pid2_case8 = new Identifier();
641
            pid2_case8.setValue(generateDocumentId());
642
            SystemMetadata sysmeta2_case8 = createSystemMetadata(pid2_case8, session.getSubject(), object);
643
            sysmeta2_case8.setSeriesId(sid_case8);
644
            sysmeta2_case8.setObsoletes(pid1_case8);
645
            CNodeService.getInstance(request).create(session, pid2_case8, object, sysmeta2_case8);
646
            
647
            sysmeta_case8.setObsoletedBy(pid2_case8);
648
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case8, sysmeta_case8);
649
            
650
            Thread.sleep(1000);
651
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
652
            Identifier pid3_case8 = new Identifier();
653
            pid3_case8.setValue(generateDocumentId());
654
            SystemMetadata sysmeta3_case8 = createSystemMetadata(pid3_case8, session.getSubject(), object);
655
            sysmeta3_case8.setObsoletes(pid2_case8);
656
            sysmeta3_case8.setSeriesId(sid_case8);
657
            CNodeService.getInstance(request).create(session, pid3_case8, object, sysmeta3_case8);
658
            
659
            sysmeta2_case8.setObsoletedBy(pid3_case8);
660
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case8, sysmeta2_case8);
661
            
662
            Thread.sleep(1000);
663
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
664
            Identifier pid4_case8 = new Identifier();
665
            pid4_case8.setValue(generateDocumentId());
666
            //Identifier sid2_case7 = new Identifier();
667
            //sid2_case7.setValue("sid."+System.nanoTime());
668
            SystemMetadata sysmeta4_case8 = createSystemMetadata(pid4_case8, session.getSubject(), object);
669
            sysmeta4_case8.setObsoletes(pid3_case8);
670
            sysmeta4_case8.setSeriesId(sid_case8);
671
            CNodeService.getInstance(request).create(session, pid4_case8, object, sysmeta4_case8);
672
            
673
            //delete pid3_case8 
674
            CNodeService.getInstance(request).delete(session, pid3_case8);
675
            try {
676
                CNodeService.getInstance(request).getSystemMetadata(session, pid3_case8);
677
                fail("The pid "+pid3_case8.getValue()+" should be deleted.");
678
            } catch (NotFound e) {
679
                //e.printStackTrace();
680
                assertTrue(true);
681
            }
682
            
683
            //check
684
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case8);
685
            assertTrue(meta.getObsoletedBy().equals(pid2_case8));
686
            assertTrue(meta.getObsoletes() == null);
687
            
688
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case8);
689
            assertTrue(meta.getObsoletedBy().equals(pid3_case8));
690
            assertTrue(meta.getObsoletes().equals(pid1_case8));
691
            
692
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case8);
693
            assertTrue(meta.getObsoletedBy() == null);
694
            assertTrue(meta.getObsoletes().equals(pid3_case8));
695
            
696
            System.out.println("case 8: =======");
697
            head = IdentifierManager.getInstance().getHeadPID(sid_case8);
698
            assertTrue(head.equals(pid4_case8));
699
            
700
            
701
            //case-9  P1(S1) <-> P2(S1) ?? <- P4(S1), S1 = P4 (P2 and P4 are type 1 ends, not an ideal chain)
702
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
703
            Identifier pid1_case9 = new Identifier();
704
            pid1_case9.setValue(generateDocumentId());
705
            Identifier sid_case9 = new Identifier();
706
            sid_case9.setValue("sid."+System.nanoTime());
707
            SystemMetadata sysmeta_case9 = createSystemMetadata(pid1_case9, session.getSubject(), object);
708
            sysmeta_case9.setSeriesId(sid_case9);
709
            CNodeService.getInstance(request).create(session, pid1_case9, object, sysmeta_case9);
710
            
711
            Thread.sleep(1000);
712
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
713
            Identifier pid2_case9 = new Identifier();
714
            pid2_case9.setValue(generateDocumentId());
715
            SystemMetadata sysmeta2_case9 = createSystemMetadata(pid2_case9, session.getSubject(), object);
716
            sysmeta2_case9.setSeriesId(sid_case9);
717
            sysmeta2_case9.setObsoletes(pid1_case9);
718
            CNodeService.getInstance(request).create(session, pid2_case9, object, sysmeta2_case9);
719
            
720
            sysmeta_case9.setObsoletedBy(pid2_case9);
721
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case9, sysmeta_case9);
722
            //check
723
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case9);
724
            assertTrue(meta.getObsoletedBy().equals(pid2_case9));
725
            
726
            Thread.sleep(1000);
727
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
728
            Identifier pid3_case9 = new Identifier();
729
            pid3_case9.setValue(generateDocumentId());
730
            SystemMetadata sysmeta3_case9 = createSystemMetadata(pid3_case9, session.getSubject(), object);
731
            sysmeta3_case9.setObsoletes(pid2_case9);
732
            sysmeta3_case9.setSeriesId(sid_case9);
733
            CNodeService.getInstance(request).create(session, pid3_case9, object, sysmeta3_case9);
734
            
735
            //sysmeta2_case8.setObsoletedBy(pid3_case8);
736
            //CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case8, sysmeta2_case8);
737
            
738
            Thread.sleep(1000);
739
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
740
            Identifier pid4_case9 = new Identifier();
741
            pid4_case9.setValue(generateDocumentId());
742
            //Identifier sid2_case7 = new Identifier();
743
            //sid2_case7.setValue("sid."+System.nanoTime());
744
            SystemMetadata sysmeta4_case9 = createSystemMetadata(pid4_case9, session.getSubject(), object);
745
            sysmeta4_case9.setObsoletes(pid3_case9);
746
            sysmeta4_case9.setSeriesId(sid_case9);
747
            CNodeService.getInstance(request).create(session, pid4_case9, object, sysmeta4_case9);
748
            
749
            //delete pid3_case8 
750
            CNodeService.getInstance(request).delete(session, pid3_case9);
751
            try {
752
                CNodeService.getInstance(request).getSystemMetadata(session, pid3_case9);
753
                fail("The pid "+pid3_case9.getValue()+" should be deleted.");
754
            } catch (NotFound e) {
755
                //e.printStackTrace();
756
                assertTrue(true);
757
            }
758
            
759
            //check
760
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case9);
761
            assertTrue(meta.getObsoletedBy().equals(pid2_case9));
762
            assertTrue(meta.getObsoletes() == null);
763
            
764
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case9);
765
            assertTrue(meta.getObsoletedBy() == null);
766
            assertTrue(meta.getObsoletes().equals(pid1_case9));
767
            
768
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case9);
769
            assertTrue(meta.getObsoletedBy() == null);
770
            assertTrue(meta.getObsoletes().equals(pid3_case9));
771
            
772
            System.out.println("case 9: =======");
773
            head = IdentifierManager.getInstance().getHeadPID(sid_case9);
774
            assertTrue(head.equals(pid4_case9));
775
            
776
            
777
            //case-10   P1(S1) <-> P2(S1) -> XX <- P4(S1), S1 = P4, (Type 1) 
778
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
779
            Identifier pid1_case10 = new Identifier();
780
            pid1_case10.setValue(generateDocumentId());
781
            Identifier sid_case10 = new Identifier();
782
            sid_case10.setValue("sid."+System.nanoTime());
783
            SystemMetadata sysmeta_case10 = createSystemMetadata(pid1_case10, session.getSubject(), object);
784
            sysmeta_case10.setSeriesId(sid_case10);
785
            CNodeService.getInstance(request).create(session, pid1_case10, object, sysmeta_case10);
786
            
787
            Thread.sleep(1000);
788
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
789
            Identifier pid2_case10 = new Identifier();
790
            pid2_case10.setValue(generateDocumentId());
791
            SystemMetadata sysmeta2_case10 = createSystemMetadata(pid2_case10, session.getSubject(), object);
792
            sysmeta2_case10.setSeriesId(sid_case10);
793
            sysmeta2_case10.setObsoletes(pid1_case10);
794
            CNodeService.getInstance(request).create(session, pid2_case10, object, sysmeta2_case10);
795
            
796
            sysmeta_case10.setObsoletedBy(pid2_case10);
797
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case10, sysmeta_case10);
798
            //check
799
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case10);
800
            assertTrue(meta.getObsoletedBy().equals(pid2_case10));
801
            
802
            Thread.sleep(1000);
803
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
804
            Identifier pid3_case10 = new Identifier();
805
            pid3_case10.setValue(generateDocumentId());
806
            SystemMetadata sysmeta3_case10 = createSystemMetadata(pid3_case10, session.getSubject(), object);
807
            sysmeta3_case10.setObsoletes(pid2_case10);
808
            sysmeta3_case10.setSeriesId(sid_case10);
809
            CNodeService.getInstance(request).create(session, pid3_case10, object, sysmeta3_case10);
810
            
811
            sysmeta2_case10.setObsoletedBy(pid3_case10);
812
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case10, sysmeta2_case10);
813
            
814
            Thread.sleep(1000);
815
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
816
            Identifier pid4_case10 = new Identifier();
817
            pid4_case10.setValue(generateDocumentId());
818
            //Identifier sid2_case7 = new Identifier();
819
            //sid2_case7.setValue("sid."+System.nanoTime());
820
            SystemMetadata sysmeta4_case10 = createSystemMetadata(pid4_case10, session.getSubject(), object);
821
            sysmeta4_case10.setObsoletes(pid3_case10);
822
            sysmeta4_case10.setSeriesId(sid_case10);
823
            CNodeService.getInstance(request).create(session, pid4_case10, object, sysmeta4_case10);
824
            
825
            //delete pid3_case10 
826
            CNodeService.getInstance(request).delete(session, pid3_case10);
827
            try {
828
                CNodeService.getInstance(request).getSystemMetadata(session, pid3_case10);
829
                fail("The pid "+pid3_case10.getValue()+" should be deleted.");
830
            } catch (NotFound e) {
831
                //e.printStackTrace();
832
                assertTrue(true);
833
            }
834
            
835
           //check
836
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case10);
837
            assertTrue(meta.getObsoletedBy().equals(pid2_case10));
838
            assertTrue(meta.getObsoletes() == null);
839
            
840
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case10);
841
            assertTrue(meta.getObsoletedBy().equals(pid3_case10));
842
            assertTrue(meta.getObsoletes().equals(pid1_case10));
843
            
844
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case10);
845
            assertTrue(meta.getObsoletedBy() == null);
846
            assertTrue(meta.getObsoletes().equals(pid3_case10));
847
            
848
            System.out.println("case 10: =======");
849
            head = IdentifierManager.getInstance().getHeadPID(sid_case10);
850
            assertTrue(head.equals(pid4_case10));
851
            
852
            
853
            //case-11   P1(S1) <-> P2(S1) <-> [archived:P3(S1)], S1 = P3, (Type 1)
854
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
855
            Identifier pid1_case11 = new Identifier();
856
            pid1_case11.setValue(generateDocumentId());
857
            Identifier sid_case11 = new Identifier();
858
            sid_case11.setValue("sid."+System.nanoTime());
859
            SystemMetadata sysmeta_case11 = createSystemMetadata(pid1_case11, session.getSubject(), object);
860
            sysmeta_case11.setSeriesId(sid_case11);
861
            CNodeService.getInstance(request).create(session, pid1_case11, object, sysmeta_case11);
862
            
863
            Thread.sleep(1000);
864
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
865
            Identifier pid2_case11 = new Identifier();
866
            pid2_case11.setValue(generateDocumentId());
867
            SystemMetadata sysmeta2_case11 = createSystemMetadata(pid2_case11, session.getSubject(), object);
868
            sysmeta2_case11.setSeriesId(sid_case11);
869
            sysmeta2_case11.setObsoletes(pid1_case11);
870
            CNodeService.getInstance(request).create(session, pid2_case11, object, sysmeta2_case11);
871
            
872
            sysmeta_case11.setObsoletedBy(pid2_case11);
873
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case11, sysmeta_case11);
874
            //check
875
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case11);
876
            assertTrue(meta.getObsoletedBy().equals(pid2_case11));
877
            
878
            Thread.sleep(1000);
879
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
880
            Identifier pid3_case11 = new Identifier();
881
            pid3_case11.setValue(generateDocumentId());
882
            SystemMetadata sysmeta3_case11 = createSystemMetadata(pid3_case11, session.getSubject(), object);
883
            sysmeta3_case11.setObsoletes(pid2_case11);
884
            sysmeta3_case11.setSeriesId(sid_case11);
885
            CNodeService.getInstance(request).create(session, pid3_case11, object, sysmeta3_case11);
886
            
887
            sysmeta2_case11.setObsoletedBy(pid3_case11);
888
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case11, sysmeta2_case11);
889
            
890
            //archive pid3_case11 
891
            CNodeService.getInstance(request).archive(session, pid3_case11);
892
            
893
            //check
894
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case11);
895
            assertTrue(meta.getObsoletedBy().equals(pid2_case11));
896
            assertTrue(meta.getObsoletes() == null);
897
            
898
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case11);
899
            assertTrue(meta.getObsoletedBy().equals(pid3_case11));
900
            assertTrue(meta.getObsoletes().equals(pid1_case11));
901
            
902
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case11);
903
            assertTrue(meta.getArchived());
904
            assertTrue(meta.getObsoletedBy() == null);
905
            assertTrue(meta.getObsoletes().equals(pid2_case11));
906
            
907
            System.out.println("case 11: =======");
908
            head = IdentifierManager.getInstance().getHeadPID(sid_case11);
909
            assertTrue(head.equals(pid3_case11));
910
            
911
            
912
            //case-12   P1(S1) <-> P2(S1) -> ??, S1 = P2, (Type 2) (Error, but will happen)
913
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
914
            Identifier pid1_case12 = new Identifier();
915
            pid1_case12.setValue(generateDocumentId());
916
            Identifier sid_case12 = new Identifier();
917
            sid_case12.setValue("sid."+System.nanoTime());
918
            SystemMetadata sysmeta_case12 = createSystemMetadata(pid1_case12, session.getSubject(), object);
919
            sysmeta_case12.setSeriesId(sid_case12);
920
            CNodeService.getInstance(request).create(session, pid1_case12, object, sysmeta_case12);
921
            
922
            Thread.sleep(1000);
923
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
924
            Identifier pid2_case12 = new Identifier();
925
            pid2_case12.setValue(generateDocumentId());
926
            SystemMetadata sysmeta2_case12 = createSystemMetadata(pid2_case12, session.getSubject(), object);
927
            sysmeta2_case12.setSeriesId(sid_case12);
928
            sysmeta2_case12.setObsoletes(pid1_case12);
929
            CNodeService.getInstance(request).create(session, pid2_case12, object, sysmeta2_case12);
930
            
931
            sysmeta_case12.setObsoletedBy(pid2_case12);
932
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case12, sysmeta_case12);
933
            //check
934
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case12);
935
            assertTrue(meta.getObsoletedBy().equals(pid2_case12));
936
            
937
            Thread.sleep(1000);
938
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
939
            Identifier pid3_case12 = new Identifier();
940
            pid3_case12.setValue(generateDocumentId());
941
            SystemMetadata sysmeta3_case12 = createSystemMetadata(pid3_case12, session.getSubject(), object);
942
            sysmeta3_case12.setObsoletes(pid2_case12);
943
            sysmeta3_case12.setSeriesId(sid_case12);
944
            CNodeService.getInstance(request).create(session, pid3_case12, object, sysmeta3_case12);
945
            
946
            sysmeta2_case12.setObsoletedBy(pid3_case12);
947
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case12, sysmeta2_case12);
948
            
949
            //archive pid3_case12 
950
            CNodeService.getInstance(request).delete(session, pid3_case12);
951
            try {
952
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case12);
953
                fail("The pid "+pid3_case12.getValue()+" should be deleted.");
954
            } catch (NotFound ee) {
955
                assertTrue(true);
956
            }
957
            
958
            //check
959
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case12);
960
            assertTrue(meta.getObsoletedBy().equals(pid2_case12));
961
            assertTrue(meta.getObsoletes() == null);
962
            
963
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case12);
964
            assertTrue(meta.getObsoletedBy().equals(pid3_case12));
965
            assertTrue(meta.getObsoletes().equals(pid1_case12));
966
            
967
            System.out.println("case 12: =======");
968
            head = IdentifierManager.getInstance().getHeadPID(sid_case12);
969
            assertTrue(head.equals(pid2_case12));
970
            
971
            
972
            
973
            //case-13   P1(S1) <- P2(S1) -> ??, S1 = P2 (P1 is a type 1 end and P2 is a type 2 end, not an ideal chain)
974
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
975
            Identifier pid1_case13 = new Identifier();
976
            pid1_case13.setValue(generateDocumentId());
977
            Identifier sid_case13 = new Identifier();
978
            sid_case13.setValue("sid."+System.nanoTime());
979
            SystemMetadata sysmeta_case13 = createSystemMetadata(pid1_case13, session.getSubject(), object);
980
            sysmeta_case13.setSeriesId(sid_case13);
981
            CNodeService.getInstance(request).create(session, pid1_case13, object, sysmeta_case13);
982
            
983
            Thread.sleep(1000);
984
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
985
            Identifier pid2_case13 = new Identifier();
986
            pid2_case13.setValue(generateDocumentId());
987
            Thread.sleep(1000);
988
            Identifier pid3_case13 = new Identifier();
989
            pid3_case13.setValue(generateDocumentId());
990
            SystemMetadata sysmeta2_case13 = createSystemMetadata(pid2_case13, session.getSubject(), object);
991
            sysmeta2_case13.setSeriesId(sid_case13);
992
            sysmeta2_case13.setObsoletes(pid1_case13);
993
            sysmeta2_case13.setObsoletedBy(pid3_case13);
994
            CNodeService.getInstance(request).create(session, pid2_case13, object, sysmeta2_case13);
995
            
996
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case13);
997
            assertTrue(meta.getObsoletedBy().equals(pid3_case13));
998
            assertTrue(meta.getObsoletes().equals(pid1_case13));
999
            
1000
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case13);
1001
            assertTrue(meta.getObsoletedBy() == null);
1002
            assertTrue(meta.getObsoletes() == null);
1003
            
1004
            System.out.println("case 13: =======");
1005
            head = IdentifierManager.getInstance().getHeadPID(sid_case13);
1006
            assertTrue(head.equals(pid2_case13));
1007
            
1008
            
1009
            
1010
            //case-14   P1(S1) <- P2(S1) -> P3(S2), S1 = P2 (P1 is a type one end and P2 is a type 2 end, not an ideal chain)
1011
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1012
            Identifier pid1_case14 = new Identifier();
1013
            pid1_case14.setValue(generateDocumentId());
1014
            Identifier sid_case14 = new Identifier();
1015
            sid_case14.setValue("sid."+System.nanoTime());
1016
            SystemMetadata sysmeta_case14 = createSystemMetadata(pid1_case14, session.getSubject(), object);
1017
            sysmeta_case14.setSeriesId(sid_case14);
1018
            CNodeService.getInstance(request).create(session, pid1_case14, object, sysmeta_case14);
1019
            
1020
            Thread.sleep(1000);
1021
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1022
            Identifier pid2_case14 = new Identifier();
1023
            pid2_case14.setValue(generateDocumentId());
1024
            SystemMetadata sysmeta2_case14 = createSystemMetadata(pid2_case14, session.getSubject(), object);
1025
            sysmeta2_case14.setSeriesId(sid_case14);
1026
            sysmeta2_case14.setObsoletes(pid1_case14);
1027
            CNodeService.getInstance(request).create(session, pid2_case14, object, sysmeta2_case14);
1028

    
1029
            Thread.sleep(1000);
1030
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1031
            Identifier pid3_case14 = new Identifier();
1032
            pid3_case14.setValue(generateDocumentId());
1033
            Identifier sid2_case14 = new Identifier();
1034
            sid2_case14.setValue("sid."+System.nanoTime());
1035
            SystemMetadata sysmeta3_case14 = createSystemMetadata(pid3_case14, session.getSubject(), object);
1036
            sysmeta3_case14.setSeriesId(sid2_case14);
1037
            CNodeService.getInstance(request).create(session, pid3_case14, object, sysmeta3_case14);
1038
            
1039
            sysmeta2_case14.setObsoletedBy(pid3_case14);
1040
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case14, sysmeta2_case14);
1041
            
1042
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case14);
1043
            assertTrue(meta.getObsoletedBy().equals(pid3_case14));
1044
            assertTrue(meta.getObsoletes().equals(pid1_case14));
1045
            
1046
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case14);
1047
            assertTrue(meta.getObsoletedBy() == null);
1048
            assertTrue(meta.getObsoletes() == null);
1049
            
1050
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case14);
1051
            assertTrue(meta.getObsoletedBy() == null);
1052
            assertTrue(meta.getObsoletes() == null);
1053
            
1054
            System.out.println("case 14: =======");
1055
            head = IdentifierManager.getInstance().getHeadPID(sid_case14);
1056
            assertTrue(head.equals(pid2_case14));
1057
            head = IdentifierManager.getInstance().getHeadPID(sid2_case14);
1058
            assertTrue(head.equals(pid3_case14));
1059
            
1060
            
1061
            //case-15    P1(S1) <-> P2(S1) ?? <- P4(S1) <-> P5(S2), S1 = P4 (P2 is a type 1 end and P4 is a type 2 end, not an ideal chain)
1062
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1063
            Identifier pid1_case15 = new Identifier();
1064
            pid1_case15.setValue(generateDocumentId());
1065
            Identifier sid_case15 = new Identifier();
1066
            sid_case15.setValue("sid."+System.nanoTime());
1067
            SystemMetadata sysmeta_case15 = createSystemMetadata(pid1_case15, session.getSubject(), object);
1068
            sysmeta_case15.setSeriesId(sid_case15);
1069
            CNodeService.getInstance(request).create(session, pid1_case15, object, sysmeta_case15);
1070
            
1071
            Thread.sleep(1000);
1072
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1073
            Identifier pid2_case15 = new Identifier();
1074
            pid2_case15.setValue(generateDocumentId());
1075
            SystemMetadata sysmeta2_case15 = createSystemMetadata(pid2_case15, session.getSubject(), object);
1076
            sysmeta2_case15.setSeriesId(sid_case15);
1077
            sysmeta2_case15.setObsoletes(pid1_case15);
1078
            CNodeService.getInstance(request).create(session, pid2_case15, object, sysmeta2_case15);
1079

    
1080
            sysmeta_case15.setObsoletedBy(pid2_case15);
1081
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case15, sysmeta_case15);
1082
            //check
1083
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1084
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1085
            
1086
            Thread.sleep(1000);
1087
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1088
            Identifier pid3_case15 = new Identifier();
1089
            pid3_case15.setValue(generateDocumentId());
1090
            SystemMetadata sysmeta3_case15 = createSystemMetadata(pid3_case15, session.getSubject(), object);
1091
            sysmeta3_case15.setSeriesId(sid_case15);
1092
            sysmeta3_case15.setObsoletes(pid2_case15);
1093
            CNodeService.getInstance(request).create(session, pid3_case15, object, sysmeta3_case15);
1094
            
1095
            Thread.sleep(1000);
1096
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1097
            Identifier pid4_case15 = new Identifier();
1098
            pid4_case15.setValue(generateDocumentId());
1099
            SystemMetadata sysmeta4_case15 = createSystemMetadata(pid4_case15, session.getSubject(), object);
1100
            sysmeta4_case15.setSeriesId(sid_case15);
1101
            sysmeta4_case15.setObsoletes(pid3_case15);
1102
            CNodeService.getInstance(request).create(session, pid4_case15, object, sysmeta4_case15);
1103
            
1104
            Thread.sleep(1000);
1105
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1106
            Identifier pid5_case15 = new Identifier();
1107
            pid5_case15.setValue(generateDocumentId());
1108
            Identifier sid2_case15 = new Identifier();
1109
            sid2_case15.setValue("sid."+System.nanoTime());
1110
            SystemMetadata sysmeta5_case15 = createSystemMetadata(pid5_case15, session.getSubject(), object);
1111
            sysmeta5_case15.setSeriesId(sid2_case15);
1112
            sysmeta5_case15.setObsoletes(pid4_case15);
1113
            CNodeService.getInstance(request).create(session, pid5_case15, object, sysmeta5_case15);
1114
            
1115
            sysmeta4_case15.setObsoletedBy(pid5_case15);
1116
            CNodeService.getInstance(request).updateSystemMetadata(session, pid4_case15, sysmeta4_case15);
1117
            
1118
            CNodeService.getInstance(request).delete(session, pid3_case15);
1119
            try {
1120
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case15);
1121
                fail("The pid "+pid3_case15.getValue()+" should be deleted.");
1122
            } catch (NotFound ee) {
1123
                assertTrue(true);
1124
            }
1125
            //check
1126
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1127
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1128
            assertTrue(meta.getObsoletes() == null);
1129
            
1130
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case15);
1131
            assertTrue(meta.getObsoletedBy() == null);
1132
            assertTrue(meta.getObsoletes().equals(pid1_case15));
1133
            
1134
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case15);
1135
            assertTrue(meta.getObsoletedBy().equals(pid5_case15));
1136
            assertTrue(meta.getObsoletes().equals(pid3_case15));
1137
            
1138
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case15);
1139
            assertTrue(meta.getObsoletedBy() == null);
1140
            assertTrue(meta.getObsoletes().equals(pid4_case15));
1141
            
1142
            System.out.println("case 15: =======");
1143
            head = IdentifierManager.getInstance().getHeadPID(sid_case15);
1144
            assertTrue(head.equals(pid4_case15));
1145
            head = IdentifierManager.getInstance().getHeadPID(sid2_case15);
1146
            assertTrue(head.equals(pid5_case15));
1147
            
1148
            
1149
            
1150
            
1151
          //case-16   P1(S1) <- P2(S1) -> ?? <-P4(S2) S1 = P2 (P1 is a type 1 end and P2 is a type 2 ends, not an ideal chain), S2=P4 (rule1)
1152
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1153
            Identifier pid1_case16 = new Identifier();
1154
            pid1_case16.setValue(generateDocumentId());
1155
            Identifier sid_case16 = new Identifier();
1156
            sid_case16.setValue("sid."+System.nanoTime());
1157
            SystemMetadata sysmeta_case16 = createSystemMetadata(pid1_case16, session.getSubject(), object);
1158
            sysmeta_case16.setSeriesId(sid_case16);
1159
            CNodeService.getInstance(request).create(session, pid1_case16, object, sysmeta_case16);
1160
            
1161
            Thread.sleep(1000);
1162
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1163
            Identifier pid2_case16 = new Identifier();
1164
            pid2_case16.setValue(generateDocumentId());
1165
            SystemMetadata sysmeta2_case16 = createSystemMetadata(pid2_case16, session.getSubject(), object);
1166
            sysmeta2_case16.setSeriesId(sid_case16);
1167
            sysmeta2_case16.setObsoletes(pid1_case16);
1168
            CNodeService.getInstance(request).create(session, pid2_case16, object, sysmeta2_case16);
1169
   
1170
            Thread.sleep(1000);
1171
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1172
            Identifier pid3_case16 = new Identifier();
1173
            pid3_case16.setValue(generateDocumentId());
1174
            SystemMetadata sysmeta3_case16 = createSystemMetadata(pid3_case16, session.getSubject(), object);
1175
            sysmeta3_case16.setSeriesId(sid_case16);
1176
            sysmeta3_case16.setObsoletes(pid2_case16);
1177
            CNodeService.getInstance(request).create(session, pid3_case16, object, sysmeta3_case16);
1178
            
1179
            sysmeta2_case16.setObsoletedBy(pid3_case16);
1180
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case16, sysmeta2_case16);
1181
            
1182
            Thread.sleep(1000);
1183
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1184
            Identifier pid4_case16 = new Identifier();
1185
            pid4_case16.setValue(generateDocumentId());
1186
            Identifier sid2_case16 = new Identifier();
1187
            sid2_case16.setValue("sid."+System.nanoTime());
1188
            SystemMetadata sysmeta4_case16 = createSystemMetadata(pid4_case16, session.getSubject(), object);
1189
            sysmeta4_case16.setSeriesId(sid2_case16);
1190
            sysmeta4_case16.setObsoletes(pid3_case16);
1191
            CNodeService.getInstance(request).create(session, pid4_case16, object, sysmeta4_case16);
1192
            
1193
            CNodeService.getInstance(request).delete(session, pid3_case16);
1194
            try {
1195
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case16);
1196
                fail("The pid "+pid3_case16.getValue()+" should be deleted.");
1197
            } catch (NotFound ee) {
1198
                assertTrue(true);
1199
            }
1200
            //check
1201
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case16);
1202
            assertTrue(meta.getObsoletedBy() == null);
1203
            assertTrue(meta.getObsoletes() == null);
1204
            
1205
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case16);
1206
            assertTrue(meta.getObsoletedBy().equals(pid3_case16));
1207
            assertTrue(meta.getObsoletes().equals(pid1_case16));
1208
            
1209
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case16);
1210
            assertTrue(meta.getObsoletedBy() == null);
1211
            assertTrue(meta.getObsoletes().equals(pid3_case16));
1212
            
1213
            System.out.println("case 16: =======");
1214
            head = IdentifierManager.getInstance().getHeadPID(sid_case16);
1215
            assertTrue(head.equals(pid2_case16));
1216
            head = IdentifierManager.getInstance().getHeadPID(sid2_case16);
1217
            assertTrue(head.equals(pid4_case16));
1218
            
1219
            
1220
          //case-17   P1(S1) <- P2(S1) -> ?? <-P4(S1) S1 = P4 (P1 and P4 are type 1 ends, not an ideal chain)
1221
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1222
            Identifier pid1_case17 = new Identifier();
1223
            pid1_case17.setValue(generateDocumentId());
1224
            Identifier sid_case17 = new Identifier();
1225
            sid_case17.setValue("sid."+System.nanoTime());
1226
            SystemMetadata sysmeta_case17 = createSystemMetadata(pid1_case17, session.getSubject(), object);
1227
            sysmeta_case17.setSeriesId(sid_case17);
1228
            CNodeService.getInstance(request).create(session, pid1_case17, object, sysmeta_case17);
1229
            
1230
            Thread.sleep(1000);
1231
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1232
            Identifier pid2_case17 = new Identifier();
1233
            pid2_case17.setValue(generateDocumentId());
1234
            SystemMetadata sysmeta2_case17 = createSystemMetadata(pid2_case17, session.getSubject(), object);
1235
            sysmeta2_case17.setSeriesId(sid_case17);
1236
            sysmeta2_case17.setObsoletes(pid1_case17);
1237
            CNodeService.getInstance(request).create(session, pid2_case17, object, sysmeta2_case17);
1238
   
1239
            Thread.sleep(1000);
1240
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1241
            Identifier pid3_case17 = new Identifier();
1242
            pid3_case17.setValue(generateDocumentId());
1243
            SystemMetadata sysmeta3_case17 = createSystemMetadata(pid3_case17, session.getSubject(), object);
1244
            sysmeta3_case17.setSeriesId(sid_case17);
1245
            sysmeta3_case17.setObsoletes(pid2_case17);
1246
            CNodeService.getInstance(request).create(session, pid3_case17, object, sysmeta3_case17);
1247
            
1248
            sysmeta2_case17.setObsoletedBy(pid3_case17);
1249
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case17, sysmeta2_case17);
1250
            
1251
            Thread.sleep(1000);
1252
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1253
            Identifier pid4_case17 = new Identifier();
1254
            pid4_case17.setValue(generateDocumentId());
1255
            SystemMetadata sysmeta4_case17 = createSystemMetadata(pid4_case17, session.getSubject(), object);
1256
            sysmeta4_case17.setSeriesId(sid_case17);
1257
            sysmeta4_case17.setObsoletes(pid3_case17);
1258
            CNodeService.getInstance(request).create(session, pid4_case17, object, sysmeta4_case17);
1259
            
1260
            CNodeService.getInstance(request).delete(session, pid3_case17);
1261
            try {
1262
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case17);
1263
                fail("The pid "+pid3_case17.getValue()+" should be deleted.");
1264
            } catch (NotFound ee) {
1265
                assertTrue(true);
1266
            }
1267
            //check
1268
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case17);
1269
            assertTrue(meta.getObsoletedBy() == null);
1270
            assertTrue(meta.getObsoletes() == null);
1271
            
1272
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case17);
1273
            assertTrue(meta.getObsoletedBy().equals(pid3_case17));
1274
            assertTrue(meta.getObsoletes().equals(pid1_case17));
1275
            
1276
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case17);
1277
            assertTrue(meta.getObsoletedBy() == null);
1278
            assertTrue(meta.getObsoletes().equals(pid3_case17));
1279
            
1280
            System.out.println("case 17: =======");
1281
            head = IdentifierManager.getInstance().getHeadPID(sid_case17);
1282
            assertTrue(head.equals(pid4_case17));
1283
           
1284
            
1285
            
1286
            //case-18    P1(S1) <->P2(S1) -> ?? ???<-P5(S1) S1 = P5 (P2 is a type 2 end and P4 is a type 1 end, not an ideal chain)
1287
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1288
            Identifier pid1_case18 = new Identifier();
1289
            pid1_case18.setValue(generateDocumentId());
1290
            Identifier sid_case18 = new Identifier();
1291
            sid_case18.setValue("sid."+System.nanoTime());
1292
            SystemMetadata sysmeta_case18 = createSystemMetadata(pid1_case18, session.getSubject(), object);
1293
            sysmeta_case18.setSeriesId(sid_case18);
1294
            CNodeService.getInstance(request).create(session, pid1_case18, object, sysmeta_case18);
1295
            
1296
            Thread.sleep(1000);
1297
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1298
            Identifier pid2_case18 = new Identifier();
1299
            pid2_case18.setValue(generateDocumentId());
1300
            SystemMetadata sysmeta2_case18 = createSystemMetadata(pid2_case18, session.getSubject(), object);
1301
            sysmeta2_case18.setSeriesId(sid_case18);
1302
            sysmeta2_case18.setObsoletes(pid1_case18);
1303
            CNodeService.getInstance(request).create(session, pid2_case18, object, sysmeta2_case18);
1304

    
1305
            sysmeta_case18.setObsoletedBy(pid2_case18);
1306
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case18, sysmeta_case18);
1307
                 
1308
            Thread.sleep(1000);
1309
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1310
            Identifier pid3_case18 = new Identifier();
1311
            pid3_case18.setValue(generateDocumentId());
1312
            SystemMetadata sysmeta3_case18 = createSystemMetadata(pid3_case18, session.getSubject(), object);
1313
            sysmeta3_case18.setSeriesId(sid_case18);
1314
            sysmeta3_case18.setObsoletes(pid2_case18);
1315
            CNodeService.getInstance(request).create(session, pid3_case18, object, sysmeta3_case18);
1316
            
1317
            sysmeta2_case18.setObsoletedBy(pid3_case18);
1318
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case18, sysmeta2_case18);
1319
            
1320
            Thread.sleep(1000);
1321
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1322
            Identifier pid4_case18 = new Identifier();
1323
            pid4_case18.setValue(generateDocumentId());
1324
            SystemMetadata sysmeta4_case18 = createSystemMetadata(pid4_case18, session.getSubject(), object);
1325
            sysmeta4_case18.setSeriesId(sid_case18);
1326
            sysmeta4_case18.setObsoletes(pid3_case18);
1327
            CNodeService.getInstance(request).create(session, pid4_case18, object, sysmeta4_case18);
1328
            
1329
            Thread.sleep(1000);
1330
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1331
            Identifier pid5_case18 = new Identifier();
1332
            pid5_case18.setValue(generateDocumentId());
1333
            SystemMetadata sysmeta5_case18 = createSystemMetadata(pid5_case18, session.getSubject(), object);
1334
            sysmeta5_case18.setSeriesId(sid_case18);
1335
            sysmeta5_case18.setObsoletes(pid4_case18);
1336
            CNodeService.getInstance(request).create(session, pid5_case18, object, sysmeta5_case18);
1337
            
1338
            sysmeta4_case18.setObsoletedBy(pid5_case18);
1339
            CNodeService.getInstance(request).updateSystemMetadata(session, pid4_case18, sysmeta4_case18);
1340
            
1341
            CNodeService.getInstance(request).delete(session, pid3_case18);
1342
            try {
1343
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case18);
1344
                fail("The pid "+pid3_case18.getValue()+" should be deleted.");
1345
            } catch (NotFound ee) {
1346
                assertTrue(true);
1347
            }
1348
            
1349
            CNodeService.getInstance(request).delete(session, pid4_case18);
1350
            try {
1351
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case18);
1352
                fail("The pid "+pid4_case18.getValue()+" should be deleted.");
1353
            } catch (NotFound ee) {
1354
                assertTrue(true);
1355
            }
1356
            //check
1357
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case18);
1358
            assertTrue(meta.getObsoletedBy().equals(pid2_case18));
1359
            assertTrue(meta.getObsoletes() == null);
1360
            
1361
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case18);
1362
            assertTrue(meta.getObsoletedBy().equals(pid3_case18));
1363
            assertTrue(meta.getObsoletes().equals(pid1_case18));
1364
            
1365
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case18);
1366
            assertTrue(meta.getObsoletedBy() == null);
1367
            assertTrue(meta.getObsoletes().equals(pid4_case18));
1368
            
1369
            System.out.println("case 18: =======");
1370
            head = IdentifierManager.getInstance().getHeadPID(sid_case18);
1371
            assertTrue(head.equals(pid5_case18));
1372

    
1373
         
1374
        } catch (Exception e) {
1375
            e.printStackTrace();
1376
            fail(e.getMessage());
1377
        }
1378
        
1379
    }
1380

    
1381
    /** 
1382
     * Insert a test document, returning the docid that was used. 
1383
     */
1384
    private String insertTestDocument() {
1385
        String accessBlock = getAccessBlock("public", true, true,
1386
                false, false, false);
1387
        String emldoc = getTestEmlDoc("Test identifier manager", EML2_1_0, null,
1388
                null, "http://fake.example.com/somedata", null,
1389
                accessBlock, null, null,
1390
                null, null);
1391
        System.out.println("inserting doc: " + emldoc);
1392
        String docid = generateDocumentId() + ".1";
1393
        try {
1394
            m.login(username, password);
1395
            String response = insertDocumentId(docid, emldoc, true, false);
1396
        } catch (MetacatAuthException e) {
1397
            fail(e.getMessage());
1398
        } catch (MetacatInaccessibleException e) {
1399
            fail(e.getMessage());
1400
        }
1401
        return docid;
1402
    }
1403
    
1404
    /**
1405
     * Method to test new system metadata field such as media type and file name.
1406
     */
1407
    public void testMediaType() throws Exception {
1408
        String fileName = "new file name";
1409
        String name = "text/plain";
1410
        String p1Name = "charset";
1411
        String p1Value = "UTF8";
1412
        String p2Name = "n2";
1413
        String p2Value = "v2";
1414
        IdentifierManager im = IdentifierManager.getInstance();
1415
        
1416
        //test system metadata write/read without mediatype and file name.
1417
        String docid = "test." + new Date().getTime() + ".1";
1418
        String guid = "guid:" + docid;
1419
        //create a mapping (identifier-docid)
1420
        im.createMapping(guid, docid);
1421
        Session session = getTestSession();
1422
        Identifier id = new Identifier();
1423
        id.setValue(guid);
1424
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1425
        SystemMetadata sysmeta = createSystemMetadata(id, session.getSubject(), object);
1426
        //sysmeta.setFileName(fileName);
1427
        im.insertOrUpdateSystemMetadata(sysmeta);
1428
        SystemMetadata read = im.getSystemMetadata(guid);
1429
        assertTrue(read.getIdentifier().equals(id));
1430
        assertTrue(read.getFileName() == null);
1431
        assertTrue(read.getMediaType() == null);
1432
        //remove the system metadata
1433
        im.deleteSystemMetadata(guid);
1434
        //remove the mapping
1435
        im.removeMapping(guid, docid);
1436
        
1437
        
1438
      //test system metadata write/read with mediatype and file name.
1439
        Thread.sleep(1000);
1440
        docid = "test." + new Date().getTime() + ".1";
1441
        guid = "guid:" + docid;
1442
        //create a mapping (identifier-docid)
1443
        im.createMapping(guid, docid);
1444
        id = new Identifier();
1445
        id.setValue(guid);
1446
        object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1447
        sysmeta = createSystemMetadata(id, session.getSubject(), object);
1448
        sysmeta.setFileName(fileName);
1449
        MediaType media = new MediaType();
1450
        media.setName(name);
1451
        MediaTypeProperty p1 = new MediaTypeProperty();
1452
        p1.setName(p1Name);
1453
        p1.setValue(p1Value);
1454
        media.addProperty(p1);
1455
        MediaTypeProperty p2 = new MediaTypeProperty();
1456
        p2.setName(p2Name);
1457
        p2.setValue(p2Value);
1458
        media.addProperty(p2);
1459
        sysmeta.setMediaType(media);
1460
        im.insertOrUpdateSystemMetadata(sysmeta);
1461
        read = im.getSystemMetadata(guid);
1462
        assertTrue(read.getIdentifier().equals(id));
1463
        assertTrue(read.getFileName().equals(fileName));
1464
        MediaType type = read.getMediaType();
1465
        assertTrue(type.getName().equals(name));
1466
        List<MediaTypeProperty> list = type.getPropertyList();
1467
        assertTrue(list.size() == 2);
1468
        MediaTypeProperty item1 = list.get(0);
1469
        assertTrue(item1.getName().equals(p1Name));
1470
        assertTrue(item1.getValue().equals(p1Value));
1471
        MediaTypeProperty item2 = list.get(1);
1472
        assertTrue(item2.getName().equals(p2Name));
1473
        assertTrue(item2.getValue().equals(p2Value));
1474
        
1475
        //Thread.sleep(100000);
1476
        //remove the system metadata
1477
        im.deleteSystemMetadata(guid);
1478
        //remove the mapping
1479
        im.removeMapping(guid, docid);
1480
        
1481
        
1482
    }
1483
    
1484
    private void ph(String s)
1485
    {
1486
        System.out.println("*********************** " + s + " ****************************");
1487
    }
1488
    
1489
    public void testQuerySystemMetadata() throws Exception {
1490
        Date startTime = null;
1491
        Date endTime = null;
1492
        ObjectFormatIdentifier objectFormatId = null;
1493
        NodeReference nodeId = null;
1494
        int start = 0;
1495
        int count =1000;
1496
        Identifier identifier = null;
1497
        boolean isSID = false;
1498
        ObjectList list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1499
                objectFormatId, nodeId, start, count, identifier, isSID);
1500
        int size1= list.sizeObjectInfoList();
1501
        assertTrue( size1>0);
1502
        nodeId = new NodeReference();
1503
        String currentNodeId = Settings.getConfiguration().getString("dataone.nodeId");
1504
        nodeId.setValue(currentNodeId);
1505
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1506
                objectFormatId, nodeId, start, count, identifier, isSID);
1507
        int size2= list.sizeObjectInfoList();
1508
        assertTrue( size2 > 0);
1509
        assertTrue( size1 >= size2);
1510
        nodeId.setValue("there_bei_we12");
1511
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1512
                objectFormatId, nodeId, start, count, identifier, isSID);
1513
        int size3 = list.sizeObjectInfoList();
1514
        assertTrue(size3==0);
1515
    }
1516
    
1517
    /**
1518
     * We want to act as the CN itself
1519
     * @throws ServiceFailure 
1520
     * @throws Exception 
1521
     */
1522
    @Override
1523
    public Session getTestSession() throws Exception {
1524
        Session session = super.getTestSession();
1525
        
1526
        // use the first CN we find in the nodelist
1527
        NodeList nodeList = D1Client.getCN().listNodes();
1528
        for (Node node : nodeList.getNodeList()) {
1529
            if ( node.getType().equals(NodeType.CN) ) {
1530
                
1531
                List<Subject> subjects = node.getSubjectList();
1532
                for (Subject subject : subjects) {
1533
                   session.setSubject(subject);
1534
                   // we are done here
1535
                   return session;
1536
                }
1537
            }
1538
        }
1539
        // in case we didn't find it
1540
        return session;
1541
    }
1542
    
1543
}
(8-8/27)