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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.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
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case11, sysmeta2_case11);
918
            
919
            //archive pid3_case11 
920
            sysmeta3_case11.setArchived(true);
921
            MNodeService.getInstance(request).updateSystemMetadata(session, pid3_case11, sysmeta3_case11);
922
            //CNodeService.getInstance(request).archive(session, pid3_case11);
923
            
924
            //check
925
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case11);
926
            assertTrue(meta.getObsoletedBy().equals(pid2_case11));
927
            assertTrue(meta.getObsoletes() == null);
928
            
929
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case11);
930
            assertTrue(meta.getObsoletedBy().equals(pid3_case11));
931
            assertTrue(meta.getObsoletes().equals(pid1_case11));
932
            
933
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case11);
934
            assertTrue(meta.getArchived());
935
            assertTrue(meta.getObsoletedBy() == null);
936
            assertTrue(meta.getObsoletes().equals(pid2_case11));
937
            
938
            System.out.println("case 11: =======");
939
            head = IdentifierManager.getInstance().getHeadPID(sid_case11);
940
            assertTrue(head.equals(pid3_case11));
941
            
942
            
943
            //case-12   P1(S1) <-> P2(S1) -> ??, S1 = P2, (Type 2) (Error, but will happen)
944
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
945
            Identifier pid1_case12 = new Identifier();
946
            pid1_case12.setValue(generateDocumentId());
947
            Identifier sid_case12 = new Identifier();
948
            sid_case12.setValue("sid."+System.nanoTime());
949
            SystemMetadata sysmeta_case12 = createSystemMetadata(pid1_case12, session.getSubject(), object);
950
            sysmeta_case12.setSeriesId(sid_case12);
951
            CNodeService.getInstance(request).create(session, pid1_case12, object, sysmeta_case12);
952
            
953
            Thread.sleep(1000);
954
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
955
            Identifier pid2_case12 = new Identifier();
956
            pid2_case12.setValue(generateDocumentId());
957
            SystemMetadata sysmeta2_case12 = createSystemMetadata(pid2_case12, session.getSubject(), object);
958
            sysmeta2_case12.setSeriesId(sid_case12);
959
            sysmeta2_case12.setObsoletes(pid1_case12);
960
            CNodeService.getInstance(request).create(session, pid2_case12, object, sysmeta2_case12);
961
            
962
            sysmeta_case12.setObsoletedBy(pid2_case12);
963
            version = version.add(BigInteger.ONE);
964
            sysmeta_case12.setSerialVersion(version);
965
            MNodeService.getInstance(request).updateSystemMetadata(session, pid1_case12, sysmeta_case12);
966
            //check
967
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case12);
968
            assertTrue(meta.getObsoletedBy().equals(pid2_case12));
969
            
970
            Thread.sleep(1000);
971
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
972
            Identifier pid3_case12 = new Identifier();
973
            pid3_case12.setValue(generateDocumentId());
974
            SystemMetadata sysmeta3_case12 = createSystemMetadata(pid3_case12, session.getSubject(), object);
975
            sysmeta3_case12.setObsoletes(pid2_case12);
976
            sysmeta3_case12.setSeriesId(sid_case12);
977
            CNodeService.getInstance(request).create(session, pid3_case12, object, sysmeta3_case12);
978
            
979
            sysmeta2_case12.setObsoletedBy(pid3_case12);
980
            version = version.add(BigInteger.ONE);
981
            sysmeta2_case12.setSerialVersion(version);
982
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case12, sysmeta2_case12);
983
            
984
            //archive pid3_case12 
985
            MNodeService.getInstance(request).delete(session, pid3_case12);
986
            try {
987
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case12);
988
                fail("The pid "+pid3_case12.getValue()+" should be deleted.");
989
            } catch (NotFound ee) {
990
                assertTrue(true);
991
            }
992
            
993
            //check
994
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case12);
995
            assertTrue(meta.getObsoletedBy().equals(pid2_case12));
996
            assertTrue(meta.getObsoletes() == null);
997
            
998
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case12);
999
            assertTrue(meta.getObsoletedBy().equals(pid3_case12));
1000
            assertTrue(meta.getObsoletes().equals(pid1_case12));
1001
            
1002
            System.out.println("case 12: =======");
1003
            head = IdentifierManager.getInstance().getHeadPID(sid_case12);
1004
            assertTrue(head.equals(pid2_case12));
1005
            
1006
            
1007
            
1008
            //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)
1009
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1010
            Identifier pid1_case13 = new Identifier();
1011
            pid1_case13.setValue(generateDocumentId());
1012
            Identifier sid_case13 = new Identifier();
1013
            sid_case13.setValue("sid."+System.nanoTime());
1014
            SystemMetadata sysmeta_case13 = createSystemMetadata(pid1_case13, session.getSubject(), object);
1015
            sysmeta_case13.setSeriesId(sid_case13);
1016
            CNodeService.getInstance(request).create(session, pid1_case13, object, sysmeta_case13);
1017
            
1018
            Thread.sleep(1000);
1019
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1020
            Identifier pid2_case13 = new Identifier();
1021
            pid2_case13.setValue(generateDocumentId());
1022
            Thread.sleep(1000);
1023
            Identifier pid3_case13 = new Identifier();
1024
            pid3_case13.setValue(generateDocumentId());
1025
            SystemMetadata sysmeta2_case13 = createSystemMetadata(pid2_case13, session.getSubject(), object);
1026
            sysmeta2_case13.setSeriesId(sid_case13);
1027
            sysmeta2_case13.setObsoletes(pid1_case13);
1028
            sysmeta2_case13.setObsoletedBy(pid3_case13);
1029
            CNodeService.getInstance(request).create(session, pid2_case13, object, sysmeta2_case13);
1030
            
1031
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case13);
1032
            assertTrue(meta.getObsoletedBy().equals(pid3_case13));
1033
            assertTrue(meta.getObsoletes().equals(pid1_case13));
1034
            
1035
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case13);
1036
            assertTrue(meta.getObsoletedBy() == null);
1037
            assertTrue(meta.getObsoletes() == null);
1038
            
1039
            System.out.println("case 13: =======");
1040
            head = IdentifierManager.getInstance().getHeadPID(sid_case13);
1041
            assertTrue(head.equals(pid2_case13));
1042
            
1043
            
1044
            
1045
            //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)
1046
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1047
            Identifier pid1_case14 = new Identifier();
1048
            pid1_case14.setValue(generateDocumentId());
1049
            Identifier sid_case14 = new Identifier();
1050
            sid_case14.setValue("sid."+System.nanoTime());
1051
            SystemMetadata sysmeta_case14 = createSystemMetadata(pid1_case14, session.getSubject(), object);
1052
            sysmeta_case14.setSeriesId(sid_case14);
1053
            CNodeService.getInstance(request).create(session, pid1_case14, object, sysmeta_case14);
1054
            
1055
            Thread.sleep(1000);
1056
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1057
            Identifier pid2_case14 = new Identifier();
1058
            pid2_case14.setValue(generateDocumentId());
1059
            SystemMetadata sysmeta2_case14 = createSystemMetadata(pid2_case14, session.getSubject(), object);
1060
            sysmeta2_case14.setSeriesId(sid_case14);
1061
            sysmeta2_case14.setObsoletes(pid1_case14);
1062
            CNodeService.getInstance(request).create(session, pid2_case14, object, sysmeta2_case14);
1063

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

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

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

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

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