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.math.BigInteger;
30
import java.sql.SQLException;
31
import java.util.*;
32

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

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

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

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

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

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

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

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

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

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

    
1062
            Thread.sleep(1000);
1063
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1064
            Identifier pid3_case14 = new Identifier();
1065
            pid3_case14.setValue(generateDocumentId());
1066
            Identifier sid2_case14 = new Identifier();
1067
            sid2_case14.setValue("sid."+System.nanoTime());
1068
            SystemMetadata sysmeta3_case14 = createSystemMetadata(pid3_case14, session.getSubject(), object);
1069
            sysmeta3_case14.setSeriesId(sid2_case14);
1070
            CNodeService.getInstance(request).create(session, pid3_case14, object, sysmeta3_case14);
1071
            
1072
            sysmeta2_case14.setObsoletedBy(pid3_case14);
1073
            version = version.add(BigInteger.ONE);
1074
            sysmeta2_case14.setSerialVersion(version);
1075
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case14, sysmeta2_case14);
1076
            
1077
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case14);
1078
            assertTrue(meta.getObsoletedBy().equals(pid3_case14));
1079
            assertTrue(meta.getObsoletes().equals(pid1_case14));
1080
            
1081
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case14);
1082
            assertTrue(meta.getObsoletedBy() == null);
1083
            assertTrue(meta.getObsoletes() == null);
1084
            
1085
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case14);
1086
            assertTrue(meta.getObsoletedBy() == null);
1087
            assertTrue(meta.getObsoletes() == null);
1088
            
1089
            System.out.println("case 14: =======");
1090
            head = IdentifierManager.getInstance().getHeadPID(sid_case14);
1091
            assertTrue(head.equals(pid2_case14));
1092
            head = IdentifierManager.getInstance().getHeadPID(sid2_case14);
1093
            assertTrue(head.equals(pid3_case14));
1094
            
1095
            
1096
            //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)
1097
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1098
            Identifier pid1_case15 = new Identifier();
1099
            pid1_case15.setValue(generateDocumentId());
1100
            Identifier sid_case15 = new Identifier();
1101
            sid_case15.setValue("sid."+System.nanoTime());
1102
            SystemMetadata sysmeta_case15 = createSystemMetadata(pid1_case15, session.getSubject(), object);
1103
            sysmeta_case15.setSeriesId(sid_case15);
1104
            CNodeService.getInstance(request).create(session, pid1_case15, object, sysmeta_case15);
1105
            
1106
            Thread.sleep(1000);
1107
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1108
            Identifier pid2_case15 = new Identifier();
1109
            pid2_case15.setValue(generateDocumentId());
1110
            SystemMetadata sysmeta2_case15 = createSystemMetadata(pid2_case15, session.getSubject(), object);
1111
            sysmeta2_case15.setSeriesId(sid_case15);
1112
            sysmeta2_case15.setObsoletes(pid1_case15);
1113
            CNodeService.getInstance(request).create(session, pid2_case15, object, sysmeta2_case15);
1114

    
1115
            sysmeta_case15.setObsoletedBy(pid2_case15);
1116
            version = version.add(BigInteger.ONE);
1117
            sysmeta_case15.setSerialVersion(version);
1118
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case15, sysmeta_case15);
1119
            //check
1120
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1121
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1122
            
1123
            Thread.sleep(1000);
1124
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1125
            Identifier pid3_case15 = new Identifier();
1126
            pid3_case15.setValue(generateDocumentId());
1127
            SystemMetadata sysmeta3_case15 = createSystemMetadata(pid3_case15, session.getSubject(), object);
1128
            sysmeta3_case15.setSeriesId(sid_case15);
1129
            sysmeta3_case15.setObsoletes(pid2_case15);
1130
            CNodeService.getInstance(request).create(session, pid3_case15, object, sysmeta3_case15);
1131
            
1132
            Thread.sleep(1000);
1133
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1134
            Identifier pid4_case15 = new Identifier();
1135
            pid4_case15.setValue(generateDocumentId());
1136
            SystemMetadata sysmeta4_case15 = createSystemMetadata(pid4_case15, session.getSubject(), object);
1137
            sysmeta4_case15.setSeriesId(sid_case15);
1138
            sysmeta4_case15.setObsoletes(pid3_case15);
1139
            CNodeService.getInstance(request).create(session, pid4_case15, object, sysmeta4_case15);
1140
            
1141
            Thread.sleep(1000);
1142
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1143
            Identifier pid5_case15 = new Identifier();
1144
            pid5_case15.setValue(generateDocumentId());
1145
            Identifier sid2_case15 = new Identifier();
1146
            sid2_case15.setValue("sid."+System.nanoTime());
1147
            SystemMetadata sysmeta5_case15 = createSystemMetadata(pid5_case15, session.getSubject(), object);
1148
            sysmeta5_case15.setSeriesId(sid2_case15);
1149
            sysmeta5_case15.setObsoletes(pid4_case15);
1150
            CNodeService.getInstance(request).create(session, pid5_case15, object, sysmeta5_case15);
1151
            
1152
            sysmeta4_case15.setObsoletedBy(pid5_case15);
1153
            version = version.add(BigInteger.ONE);
1154
            sysmeta4_case15.setSerialVersion(version);
1155
            CNodeService.getInstance(request).updateSystemMetadata(session, pid4_case15, sysmeta4_case15);
1156
            
1157
            CNodeService.getInstance(request).delete(session, pid3_case15);
1158
            try {
1159
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case15);
1160
                fail("The pid "+pid3_case15.getValue()+" should be deleted.");
1161
            } catch (NotFound ee) {
1162
                assertTrue(true);
1163
            }
1164
            //check
1165
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1166
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1167
            assertTrue(meta.getObsoletes() == null);
1168
            
1169
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case15);
1170
            assertTrue(meta.getObsoletedBy() == null);
1171
            assertTrue(meta.getObsoletes().equals(pid1_case15));
1172
            
1173
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case15);
1174
            assertTrue(meta.getObsoletedBy().equals(pid5_case15));
1175
            assertTrue(meta.getObsoletes().equals(pid3_case15));
1176
            
1177
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case15);
1178
            assertTrue(meta.getObsoletedBy() == null);
1179
            assertTrue(meta.getObsoletes().equals(pid4_case15));
1180
            
1181
            System.out.println("case 15: =======");
1182
            head = IdentifierManager.getInstance().getHeadPID(sid_case15);
1183
            assertTrue(head.equals(pid4_case15));
1184
            head = IdentifierManager.getInstance().getHeadPID(sid2_case15);
1185
            assertTrue(head.equals(pid5_case15));
1186
            
1187
            
1188
            
1189
            
1190
          //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)
1191
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1192
            Identifier pid1_case16 = new Identifier();
1193
            pid1_case16.setValue(generateDocumentId());
1194
            Identifier sid_case16 = new Identifier();
1195
            sid_case16.setValue("sid."+System.nanoTime());
1196
            SystemMetadata sysmeta_case16 = createSystemMetadata(pid1_case16, session.getSubject(), object);
1197
            sysmeta_case16.setSeriesId(sid_case16);
1198
            CNodeService.getInstance(request).create(session, pid1_case16, object, sysmeta_case16);
1199
            
1200
            Thread.sleep(1000);
1201
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1202
            Identifier pid2_case16 = new Identifier();
1203
            pid2_case16.setValue(generateDocumentId());
1204
            SystemMetadata sysmeta2_case16 = createSystemMetadata(pid2_case16, session.getSubject(), object);
1205
            sysmeta2_case16.setSeriesId(sid_case16);
1206
            sysmeta2_case16.setObsoletes(pid1_case16);
1207
            CNodeService.getInstance(request).create(session, pid2_case16, object, sysmeta2_case16);
1208
   
1209
            Thread.sleep(1000);
1210
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1211
            Identifier pid3_case16 = new Identifier();
1212
            pid3_case16.setValue(generateDocumentId());
1213
            SystemMetadata sysmeta3_case16 = createSystemMetadata(pid3_case16, session.getSubject(), object);
1214
            sysmeta3_case16.setSeriesId(sid_case16);
1215
            sysmeta3_case16.setObsoletes(pid2_case16);
1216
            CNodeService.getInstance(request).create(session, pid3_case16, object, sysmeta3_case16);
1217
            
1218
            sysmeta2_case16.setObsoletedBy(pid3_case16);
1219
            version = version.add(BigInteger.ONE);
1220
            sysmeta2_case16.setSerialVersion(version);
1221
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case16, sysmeta2_case16);
1222
            
1223
            Thread.sleep(1000);
1224
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1225
            Identifier pid4_case16 = new Identifier();
1226
            pid4_case16.setValue(generateDocumentId());
1227
            Identifier sid2_case16 = new Identifier();
1228
            sid2_case16.setValue("sid."+System.nanoTime());
1229
            SystemMetadata sysmeta4_case16 = createSystemMetadata(pid4_case16, session.getSubject(), object);
1230
            sysmeta4_case16.setSeriesId(sid2_case16);
1231
            sysmeta4_case16.setObsoletes(pid3_case16);
1232
            CNodeService.getInstance(request).create(session, pid4_case16, object, sysmeta4_case16);
1233
            
1234
            CNodeService.getInstance(request).delete(session, pid3_case16);
1235
            try {
1236
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case16);
1237
                fail("The pid "+pid3_case16.getValue()+" should be deleted.");
1238
            } catch (NotFound ee) {
1239
                assertTrue(true);
1240
            }
1241
            //check
1242
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case16);
1243
            assertTrue(meta.getObsoletedBy() == null);
1244
            assertTrue(meta.getObsoletes() == null);
1245
            
1246
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case16);
1247
            assertTrue(meta.getObsoletedBy().equals(pid3_case16));
1248
            assertTrue(meta.getObsoletes().equals(pid1_case16));
1249
            
1250
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case16);
1251
            assertTrue(meta.getObsoletedBy() == null);
1252
            assertTrue(meta.getObsoletes().equals(pid3_case16));
1253
            
1254
            System.out.println("case 16: =======");
1255
            head = IdentifierManager.getInstance().getHeadPID(sid_case16);
1256
            assertTrue(head.equals(pid2_case16));
1257
            head = IdentifierManager.getInstance().getHeadPID(sid2_case16);
1258
            assertTrue(head.equals(pid4_case16));
1259
            
1260
            
1261
          //case-17   P1(S1) <- P2(S1) -> ?? <-P4(S1) S1 = P4 (P1 and P4 are type 1 ends, not an ideal chain)
1262
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1263
            Identifier pid1_case17 = new Identifier();
1264
            pid1_case17.setValue(generateDocumentId());
1265
            Identifier sid_case17 = new Identifier();
1266
            sid_case17.setValue("sid."+System.nanoTime());
1267
            SystemMetadata sysmeta_case17 = createSystemMetadata(pid1_case17, session.getSubject(), object);
1268
            sysmeta_case17.setSeriesId(sid_case17);
1269
            CNodeService.getInstance(request).create(session, pid1_case17, object, sysmeta_case17);
1270
            
1271
            Thread.sleep(1000);
1272
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1273
            Identifier pid2_case17 = new Identifier();
1274
            pid2_case17.setValue(generateDocumentId());
1275
            SystemMetadata sysmeta2_case17 = createSystemMetadata(pid2_case17, session.getSubject(), object);
1276
            sysmeta2_case17.setSeriesId(sid_case17);
1277
            sysmeta2_case17.setObsoletes(pid1_case17);
1278
            CNodeService.getInstance(request).create(session, pid2_case17, object, sysmeta2_case17);
1279
   
1280
            Thread.sleep(1000);
1281
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1282
            Identifier pid3_case17 = new Identifier();
1283
            pid3_case17.setValue(generateDocumentId());
1284
            SystemMetadata sysmeta3_case17 = createSystemMetadata(pid3_case17, session.getSubject(), object);
1285
            sysmeta3_case17.setSeriesId(sid_case17);
1286
            sysmeta3_case17.setObsoletes(pid2_case17);
1287
            CNodeService.getInstance(request).create(session, pid3_case17, object, sysmeta3_case17);
1288
            
1289
            sysmeta2_case17.setObsoletedBy(pid3_case17);
1290
            version = version.add(BigInteger.ONE);
1291
            sysmeta2_case17.setSerialVersion(version);
1292
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case17, sysmeta2_case17);
1293
            
1294
            Thread.sleep(1000);
1295
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1296
            Identifier pid4_case17 = new Identifier();
1297
            pid4_case17.setValue(generateDocumentId());
1298
            SystemMetadata sysmeta4_case17 = createSystemMetadata(pid4_case17, session.getSubject(), object);
1299
            sysmeta4_case17.setSeriesId(sid_case17);
1300
            sysmeta4_case17.setObsoletes(pid3_case17);
1301
            CNodeService.getInstance(request).create(session, pid4_case17, object, sysmeta4_case17);
1302
            
1303
            CNodeService.getInstance(request).delete(session, pid3_case17);
1304
            try {
1305
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case17);
1306
                fail("The pid "+pid3_case17.getValue()+" should be deleted.");
1307
            } catch (NotFound ee) {
1308
                assertTrue(true);
1309
            }
1310
            //check
1311
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case17);
1312
            assertTrue(meta.getObsoletedBy() == null);
1313
            assertTrue(meta.getObsoletes() == null);
1314
            
1315
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case17);
1316
            assertTrue(meta.getObsoletedBy().equals(pid3_case17));
1317
            assertTrue(meta.getObsoletes().equals(pid1_case17));
1318
            
1319
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case17);
1320
            assertTrue(meta.getObsoletedBy() == null);
1321
            assertTrue(meta.getObsoletes().equals(pid3_case17));
1322
            
1323
            System.out.println("case 17: =======");
1324
            head = IdentifierManager.getInstance().getHeadPID(sid_case17);
1325
            assertTrue(head.equals(pid4_case17));
1326
           
1327
            
1328
            
1329
            //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)
1330
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1331
            Identifier pid1_case18 = new Identifier();
1332
            pid1_case18.setValue(generateDocumentId());
1333
            Identifier sid_case18 = new Identifier();
1334
            sid_case18.setValue("sid."+System.nanoTime());
1335
            SystemMetadata sysmeta_case18 = createSystemMetadata(pid1_case18, session.getSubject(), object);
1336
            sysmeta_case18.setSeriesId(sid_case18);
1337
            CNodeService.getInstance(request).create(session, pid1_case18, object, sysmeta_case18);
1338
            
1339
            Thread.sleep(1000);
1340
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1341
            Identifier pid2_case18 = new Identifier();
1342
            pid2_case18.setValue(generateDocumentId());
1343
            SystemMetadata sysmeta2_case18 = createSystemMetadata(pid2_case18, session.getSubject(), object);
1344
            sysmeta2_case18.setSeriesId(sid_case18);
1345
            sysmeta2_case18.setObsoletes(pid1_case18);
1346
            CNodeService.getInstance(request).create(session, pid2_case18, object, sysmeta2_case18);
1347

    
1348
            sysmeta_case18.setObsoletedBy(pid2_case18);
1349
            version = version.add(BigInteger.ONE);
1350
            sysmeta_case18.setSerialVersion(version);
1351
            CNodeService.getInstance(request).updateSystemMetadata(session, pid1_case18, sysmeta_case18);
1352
                 
1353
            Thread.sleep(1000);
1354
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1355
            Identifier pid3_case18 = new Identifier();
1356
            pid3_case18.setValue(generateDocumentId());
1357
            SystemMetadata sysmeta3_case18 = createSystemMetadata(pid3_case18, session.getSubject(), object);
1358
            sysmeta3_case18.setSeriesId(sid_case18);
1359
            sysmeta3_case18.setObsoletes(pid2_case18);
1360
            CNodeService.getInstance(request).create(session, pid3_case18, object, sysmeta3_case18);
1361
            
1362
            sysmeta2_case18.setObsoletedBy(pid3_case18);
1363
            version = version.add(BigInteger.ONE);
1364
            sysmeta2_case18.setSerialVersion(version);
1365
            CNodeService.getInstance(request).updateSystemMetadata(session, pid2_case18, sysmeta2_case18);
1366
            
1367
            Thread.sleep(1000);
1368
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1369
            Identifier pid4_case18 = new Identifier();
1370
            pid4_case18.setValue(generateDocumentId());
1371
            SystemMetadata sysmeta4_case18 = createSystemMetadata(pid4_case18, session.getSubject(), object);
1372
            sysmeta4_case18.setSeriesId(sid_case18);
1373
            sysmeta4_case18.setObsoletes(pid3_case18);
1374
            CNodeService.getInstance(request).create(session, pid4_case18, object, sysmeta4_case18);
1375
            
1376
            Thread.sleep(1000);
1377
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1378
            Identifier pid5_case18 = new Identifier();
1379
            pid5_case18.setValue(generateDocumentId());
1380
            SystemMetadata sysmeta5_case18 = createSystemMetadata(pid5_case18, session.getSubject(), object);
1381
            sysmeta5_case18.setSeriesId(sid_case18);
1382
            sysmeta5_case18.setObsoletes(pid4_case18);
1383
            CNodeService.getInstance(request).create(session, pid5_case18, object, sysmeta5_case18);
1384
            
1385
            sysmeta4_case18.setObsoletedBy(pid5_case18);
1386
            version = version.add(BigInteger.ONE);
1387
            sysmeta4_case18.setSerialVersion(version);
1388
            CNodeService.getInstance(request).updateSystemMetadata(session, pid4_case18, sysmeta4_case18);
1389
            
1390
            CNodeService.getInstance(request).delete(session, pid3_case18);
1391
            try {
1392
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case18);
1393
                fail("The pid "+pid3_case18.getValue()+" should be deleted.");
1394
            } catch (NotFound ee) {
1395
                assertTrue(true);
1396
            }
1397
            
1398
            CNodeService.getInstance(request).delete(session, pid4_case18);
1399
            try {
1400
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case18);
1401
                fail("The pid "+pid4_case18.getValue()+" should be deleted.");
1402
            } catch (NotFound ee) {
1403
                assertTrue(true);
1404
            }
1405
            //check
1406
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case18);
1407
            assertTrue(meta.getObsoletedBy().equals(pid2_case18));
1408
            assertTrue(meta.getObsoletes() == null);
1409
            
1410
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case18);
1411
            assertTrue(meta.getObsoletedBy().equals(pid3_case18));
1412
            assertTrue(meta.getObsoletes().equals(pid1_case18));
1413
            
1414
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case18);
1415
            assertTrue(meta.getObsoletedBy() == null);
1416
            assertTrue(meta.getObsoletes().equals(pid4_case18));
1417
            
1418
            System.out.println("case 18: =======");
1419
            head = IdentifierManager.getInstance().getHeadPID(sid_case18);
1420
            assertTrue(head.equals(pid5_case18));
1421

    
1422
         
1423
        } catch (Exception e) {
1424
            e.printStackTrace();
1425
            fail(e.getMessage());
1426
        }
1427
        
1428
    }
1429

    
1430
    /** 
1431
     * Insert a test document, returning the docid that was used. 
1432
     */
1433
    private String insertTestDocument() {
1434
        String accessBlock = getAccessBlock("public", true, true,
1435
                false, false, false);
1436
        String emldoc = getTestEmlDoc("Test identifier manager", EML2_1_0, null,
1437
                null, "http://fake.example.com/somedata", null,
1438
                accessBlock, null, null,
1439
                null, null);
1440
        System.out.println("inserting doc: " + emldoc);
1441
        String docid = generateDocumentId() + ".1";
1442
        try {
1443
            m.login(username, password);
1444
            String response = insertDocumentId(docid, emldoc, true, false);
1445
        } catch (MetacatAuthException e) {
1446
            fail(e.getMessage());
1447
        } catch (MetacatInaccessibleException e) {
1448
            fail(e.getMessage());
1449
        }
1450
        return docid;
1451
    }
1452
    
1453
    /**
1454
     * Method to test new system metadata field such as media type and file name.
1455
     */
1456
    public void testMediaType() throws Exception {
1457
        String fileName = "new file name";
1458
        String name = "text/plain";
1459
        String p1Name = "charset";
1460
        String p1Value = "UTF8";
1461
        String p2Name = "n2";
1462
        String p2Value = "v2";
1463
        IdentifierManager im = IdentifierManager.getInstance();
1464
        
1465
        //test system metadata write/read without mediatype and file name.
1466
        String docid = "test." + new Date().getTime() + ".1";
1467
        String guid = "guid:" + docid;
1468
        //create a mapping (identifier-docid)
1469
        im.createMapping(guid, docid);
1470
        Session session = getTestSession();
1471
        Identifier id = new Identifier();
1472
        id.setValue(guid);
1473
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1474
        SystemMetadata sysmeta = createSystemMetadata(id, session.getSubject(), object);
1475
        //sysmeta.setFileName(fileName);
1476
        im.insertOrUpdateSystemMetadata(sysmeta);
1477
        SystemMetadata read = im.getSystemMetadata(guid);
1478
        assertTrue(read.getIdentifier().equals(id));
1479
        assertTrue(read.getFileName() == null);
1480
        assertTrue(read.getMediaType() == null);
1481
        //remove the system metadata
1482
        im.deleteSystemMetadata(guid);
1483
        //remove the mapping
1484
        im.removeMapping(guid, docid);
1485
        
1486
        
1487
      //test system metadata write/read with mediatype and file name.
1488
        Thread.sleep(1000);
1489
        docid = "test." + new Date().getTime() + ".1";
1490
        guid = "guid:" + docid;
1491
        //create a mapping (identifier-docid)
1492
        im.createMapping(guid, docid);
1493
        id = new Identifier();
1494
        id.setValue(guid);
1495
        object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1496
        sysmeta = createSystemMetadata(id, session.getSubject(), object);
1497
        sysmeta.setFileName(fileName);
1498
        MediaType media = new MediaType();
1499
        media.setName(name);
1500
        MediaTypeProperty p1 = new MediaTypeProperty();
1501
        p1.setName(p1Name);
1502
        p1.setValue(p1Value);
1503
        media.addProperty(p1);
1504
        MediaTypeProperty p2 = new MediaTypeProperty();
1505
        p2.setName(p2Name);
1506
        p2.setValue(p2Value);
1507
        media.addProperty(p2);
1508
        sysmeta.setMediaType(media);
1509
        im.insertOrUpdateSystemMetadata(sysmeta);
1510
        read = im.getSystemMetadata(guid);
1511
        assertTrue(read.getIdentifier().equals(id));
1512
        assertTrue(read.getFileName().equals(fileName));
1513
        MediaType type = read.getMediaType();
1514
        assertTrue(type.getName().equals(name));
1515
        List<MediaTypeProperty> list = type.getPropertyList();
1516
        assertTrue(list.size() == 2);
1517
        MediaTypeProperty item1 = list.get(0);
1518
        assertTrue(item1.getName().equals(p1Name));
1519
        assertTrue(item1.getValue().equals(p1Value));
1520
        MediaTypeProperty item2 = list.get(1);
1521
        assertTrue(item2.getName().equals(p2Name));
1522
        assertTrue(item2.getValue().equals(p2Value));
1523
        
1524
        //Thread.sleep(100000);
1525
        //remove the system metadata
1526
        im.deleteSystemMetadata(guid);
1527
        //remove the mapping
1528
        im.removeMapping(guid, docid);
1529
        
1530
        
1531
    }
1532
    
1533
    private void ph(String s)
1534
    {
1535
        System.out.println("*********************** " + s + " ****************************");
1536
    }
1537
    
1538
    public void testQuerySystemMetadata() throws Exception {
1539
        String nodeIdStr="rtgf:test:ert";
1540
        Date startTime = null;
1541
        Date endTime = null;
1542
        ObjectFormatIdentifier objectFormatId = null;
1543
        NodeReference nodeId = null;
1544
        int start = 0;
1545
        int count =1000;
1546
        Identifier identifier = null;
1547
        boolean isSID = false;
1548
        ObjectList list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1549
                objectFormatId, nodeId, start, count, identifier, isSID);
1550
        int size1= list.sizeObjectInfoList();
1551
        assertTrue( size1>0);
1552
        nodeId = new NodeReference();
1553
        String currentNodeId = Settings.getConfiguration().getString("dataone.nodeId");
1554
        nodeId.setValue(currentNodeId);
1555
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1556
                objectFormatId, nodeId, start, count, identifier, isSID);
1557
        int size2= list.sizeObjectInfoList();
1558
        assertTrue( size2 > 0);
1559
        assertTrue( size1 >= size2);
1560
        nodeId.setValue("there_bei_we12");
1561
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1562
                objectFormatId, nodeId, start, count, identifier, isSID);
1563
        int size3 = list.sizeObjectInfoList();
1564
        assertTrue(size3==0);
1565
        
1566
        Session session = getTestSession();
1567
        Identifier guid = new Identifier();
1568
        guid.setValue(generateDocumentId());
1569
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1570
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1571
        nodeId.setValue(nodeIdStr);
1572
        sysmeta.setAuthoritativeMemberNode(nodeId);
1573
        String sid1= "sid."+System.nanoTime();
1574
        Identifier seriesId = new Identifier();
1575
        seriesId.setValue(sid1);
1576
        System.out.println("the first sid is "+seriesId.getValue());
1577
        sysmeta.setSeriesId(seriesId);
1578
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1579
        Thread.sleep(5000);
1580
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1581
                objectFormatId, nodeId, start, count, identifier, isSID);
1582
        int size4 = list.sizeObjectInfoList();
1583
        assertTrue(size4 > 0);
1584
    }
1585
    
1586
    /**
1587
     * We want to act as the CN itself
1588
     * @throws ServiceFailure 
1589
     * @throws Exception 
1590
     */
1591
    @Override
1592
    public Session getTestSession() throws Exception {
1593
        Session session = super.getTestSession();
1594
        
1595
        // use the first CN we find in the nodelist
1596
        NodeList nodeList = D1Client.getCN().listNodes();
1597
        for (Node node : nodeList.getNodeList()) {
1598
            if ( node.getType().equals(NodeType.CN) ) {
1599
                
1600
                List<Subject> subjects = node.getSubjectList();
1601
                for (Subject subject : subjects) {
1602
                   session.setSubject(subject);
1603
                   // we are done here
1604
                   return session;
1605
                }
1606
            }
1607
        }
1608
        // in case we didn't find it
1609
        return session;
1610
    }
1611
    
1612
}
(8-8/27)