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

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

    
37
import org.apache.commons.io.FileUtils;
38

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

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

    
66
import org.dataone.service.exceptions.InvalidSystemMetadata;
67
import org.dataone.service.exceptions.NotFound;
68
import org.dataone.service.exceptions.ServiceFailure;
69

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

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

    
165
    /** Test that IM instances can be created. */
166
    public void testGetInstance() {
167
        ph("testGetInstance");
168
        IdentifierManager im = IdentifierManager.getInstance();
169
        assertNotNull(im);
170
    }
171

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

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

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

    
1121
            Thread.sleep(1000);
1122
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1123
            Identifier pid3_case14 = new Identifier();
1124
            pid3_case14.setValue(generateDocumentId());
1125
            Identifier sid2_case14 = new Identifier();
1126
            sid2_case14.setValue("sid."+System.nanoTime());
1127
            SystemMetadata sysmeta3_case14 = createSystemMetadata(pid3_case14, session.getSubject(), object);
1128
            sysmeta3_case14.setSeriesId(sid2_case14);
1129
            CNodeService.getInstance(request).create(session, pid3_case14, object, sysmeta3_case14);
1130
            
1131
            sysmeta2_case14.setObsoletedBy(pid3_case14);
1132
            version = version.add(BigInteger.ONE);
1133
            sysmeta2_case14.setSerialVersion(version);
1134
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case14, sysmeta2_case14);
1135
            
1136
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case14);
1137
            assertTrue(meta.getObsoletedBy().equals(pid3_case14));
1138
            assertTrue(meta.getObsoletes().equals(pid1_case14));
1139
            
1140
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid1_case14);
1141
            assertTrue(meta.getObsoletedBy() == null);
1142
            assertTrue(meta.getObsoletes() == null);
1143
            
1144
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case14);
1145
            assertTrue(meta.getObsoletedBy() == null);
1146
            assertTrue(meta.getObsoletes() == null);
1147
            
1148
            System.out.println("case 14: =======");
1149
            head = IdentifierManager.getInstance().getHeadPID(sid_case14);
1150
            assertTrue(head.equals(pid2_case14));
1151
            head = IdentifierManager.getInstance().getHeadPID(sid2_case14);
1152
            assertTrue(head.equals(pid3_case14));
1153
            
1154
            
1155
            //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)
1156
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1157
            Identifier pid1_case15 = new Identifier();
1158
            pid1_case15.setValue(generateDocumentId());
1159
            Identifier sid_case15 = new Identifier();
1160
            sid_case15.setValue("sid."+System.nanoTime());
1161
            SystemMetadata sysmeta_case15 = createSystemMetadata(pid1_case15, session.getSubject(), object);
1162
            sysmeta_case15.setSeriesId(sid_case15);
1163
            CNodeService.getInstance(request).create(session, pid1_case15, object, sysmeta_case15);
1164
            
1165
            Thread.sleep(1000);
1166
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1167
            Identifier pid2_case15 = new Identifier();
1168
            pid2_case15.setValue(generateDocumentId());
1169
            SystemMetadata sysmeta2_case15 = createSystemMetadata(pid2_case15, session.getSubject(), object);
1170
            sysmeta2_case15.setSeriesId(sid_case15);
1171
            sysmeta2_case15.setObsoletes(pid1_case15);
1172
            CNodeService.getInstance(request).create(session, pid2_case15, object, sysmeta2_case15);
1173

    
1174
            sysmeta_case15.setObsoletedBy(pid2_case15);
1175
            version = version.add(BigInteger.ONE);
1176
            sysmeta_case15.setSerialVersion(version);
1177
            MNodeService.getInstance(request).updateSystemMetadata(session, pid1_case15, sysmeta_case15);
1178
            //check
1179
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1180
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1181
            
1182
            Thread.sleep(1000);
1183
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1184
            Identifier pid3_case15 = new Identifier();
1185
            pid3_case15.setValue(generateDocumentId());
1186
            SystemMetadata sysmeta3_case15 = createSystemMetadata(pid3_case15, session.getSubject(), object);
1187
            sysmeta3_case15.setSeriesId(sid_case15);
1188
            sysmeta3_case15.setObsoletes(pid2_case15);
1189
            CNodeService.getInstance(request).create(session, pid3_case15, object, sysmeta3_case15);
1190
            
1191
            Thread.sleep(1000);
1192
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1193
            Identifier pid4_case15 = new Identifier();
1194
            pid4_case15.setValue(generateDocumentId());
1195
            SystemMetadata sysmeta4_case15 = createSystemMetadata(pid4_case15, session.getSubject(), object);
1196
            sysmeta4_case15.setSeriesId(sid_case15);
1197
            sysmeta4_case15.setObsoletes(pid3_case15);
1198
            CNodeService.getInstance(request).create(session, pid4_case15, object, sysmeta4_case15);
1199
            
1200
            Thread.sleep(1000);
1201
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1202
            Identifier pid5_case15 = new Identifier();
1203
            pid5_case15.setValue(generateDocumentId());
1204
            Identifier sid2_case15 = new Identifier();
1205
            sid2_case15.setValue("sid."+System.nanoTime());
1206
            SystemMetadata sysmeta5_case15 = createSystemMetadata(pid5_case15, session.getSubject(), object);
1207
            sysmeta5_case15.setSeriesId(sid2_case15);
1208
            sysmeta5_case15.setObsoletes(pid4_case15);
1209
            CNodeService.getInstance(request).create(session, pid5_case15, object, sysmeta5_case15);
1210
            
1211
            sysmeta4_case15.setObsoletedBy(pid5_case15);
1212
            version = version.add(BigInteger.ONE);
1213
            sysmeta4_case15.setSerialVersion(version);
1214
            MNodeService.getInstance(request).updateSystemMetadata(session, pid4_case15, sysmeta4_case15);
1215
            
1216
            CNodeService.getInstance(request).delete(session, pid3_case15);
1217
            try {
1218
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case15);
1219
                fail("The pid "+pid3_case15.getValue()+" should be deleted.");
1220
            } catch (NotFound ee) {
1221
                assertTrue(true);
1222
            }
1223
            //check
1224
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case15);
1225
            assertTrue(meta.getObsoletedBy().equals(pid2_case15));
1226
            assertTrue(meta.getObsoletes() == null);
1227
            
1228
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case15);
1229
            assertTrue(meta.getObsoletedBy() == null);
1230
            assertTrue(meta.getObsoletes().equals(pid1_case15));
1231
            
1232
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case15);
1233
            assertTrue(meta.getObsoletedBy().equals(pid5_case15));
1234
            assertTrue(meta.getObsoletes().equals(pid3_case15));
1235
            
1236
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case15);
1237
            assertTrue(meta.getObsoletedBy() == null);
1238
            assertTrue(meta.getObsoletes().equals(pid4_case15));
1239
            
1240
            System.out.println("case 15: =======");
1241
            head = IdentifierManager.getInstance().getHeadPID(sid_case15);
1242
            assertTrue(head.equals(pid4_case15));
1243
            head = IdentifierManager.getInstance().getHeadPID(sid2_case15);
1244
            assertTrue(head.equals(pid5_case15));
1245
            
1246
            
1247
            
1248
            
1249
          //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)
1250
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1251
            Identifier pid1_case16 = new Identifier();
1252
            pid1_case16.setValue(generateDocumentId());
1253
            Identifier sid_case16 = new Identifier();
1254
            sid_case16.setValue("sid."+System.nanoTime());
1255
            SystemMetadata sysmeta_case16 = createSystemMetadata(pid1_case16, session.getSubject(), object);
1256
            sysmeta_case16.setSeriesId(sid_case16);
1257
            CNodeService.getInstance(request).create(session, pid1_case16, object, sysmeta_case16);
1258
            
1259
            Thread.sleep(1000);
1260
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1261
            Identifier pid2_case16 = new Identifier();
1262
            pid2_case16.setValue(generateDocumentId());
1263
            SystemMetadata sysmeta2_case16 = createSystemMetadata(pid2_case16, session.getSubject(), object);
1264
            sysmeta2_case16.setSeriesId(sid_case16);
1265
            sysmeta2_case16.setObsoletes(pid1_case16);
1266
            CNodeService.getInstance(request).create(session, pid2_case16, object, sysmeta2_case16);
1267
   
1268
            Thread.sleep(1000);
1269
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1270
            Identifier pid3_case16 = new Identifier();
1271
            pid3_case16.setValue(generateDocumentId());
1272
            SystemMetadata sysmeta3_case16 = createSystemMetadata(pid3_case16, session.getSubject(), object);
1273
            sysmeta3_case16.setSeriesId(sid_case16);
1274
            sysmeta3_case16.setObsoletes(pid2_case16);
1275
            CNodeService.getInstance(request).create(session, pid3_case16, object, sysmeta3_case16);
1276
            
1277
            sysmeta2_case16.setObsoletedBy(pid3_case16);
1278
            version = version.add(BigInteger.ONE);
1279
            sysmeta2_case16.setSerialVersion(version);
1280
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case16, sysmeta2_case16);
1281
            
1282
            Thread.sleep(1000);
1283
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1284
            Identifier pid4_case16 = new Identifier();
1285
            pid4_case16.setValue(generateDocumentId());
1286
            Identifier sid2_case16 = new Identifier();
1287
            sid2_case16.setValue("sid."+System.nanoTime());
1288
            SystemMetadata sysmeta4_case16 = createSystemMetadata(pid4_case16, session.getSubject(), object);
1289
            sysmeta4_case16.setSeriesId(sid2_case16);
1290
            sysmeta4_case16.setObsoletes(pid3_case16);
1291
            CNodeService.getInstance(request).create(session, pid4_case16, object, sysmeta4_case16);
1292
            
1293
            CNodeService.getInstance(request).delete(session, pid3_case16);
1294
            try {
1295
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case16);
1296
                fail("The pid "+pid3_case16.getValue()+" should be deleted.");
1297
            } catch (NotFound ee) {
1298
                assertTrue(true);
1299
            }
1300
            //check
1301
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case16);
1302
            assertTrue(meta.getObsoletedBy() == null);
1303
            assertTrue(meta.getObsoletes() == null);
1304
            
1305
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case16);
1306
            assertTrue(meta.getObsoletedBy().equals(pid3_case16));
1307
            assertTrue(meta.getObsoletes().equals(pid1_case16));
1308
            
1309
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case16);
1310
            assertTrue(meta.getObsoletedBy() == null);
1311
            assertTrue(meta.getObsoletes().equals(pid3_case16));
1312
            
1313
            System.out.println("case 16: =======");
1314
            head = IdentifierManager.getInstance().getHeadPID(sid_case16);
1315
            assertTrue(head.equals(pid2_case16));
1316
            head = IdentifierManager.getInstance().getHeadPID(sid2_case16);
1317
            assertTrue(head.equals(pid4_case16));
1318
            
1319
            
1320
          //case-17   P1(S1) <- P2(S1) -> ?? <-P4(S1) S1 = P4 (P1 and P4 are type 1 ends, not an ideal chain)
1321
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1322
            Identifier pid1_case17 = new Identifier();
1323
            pid1_case17.setValue(generateDocumentId());
1324
            Identifier sid_case17 = new Identifier();
1325
            sid_case17.setValue("sid."+System.nanoTime());
1326
            SystemMetadata sysmeta_case17 = createSystemMetadata(pid1_case17, session.getSubject(), object);
1327
            sysmeta_case17.setSeriesId(sid_case17);
1328
            CNodeService.getInstance(request).create(session, pid1_case17, object, sysmeta_case17);
1329
            
1330
            Thread.sleep(1000);
1331
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1332
            Identifier pid2_case17 = new Identifier();
1333
            pid2_case17.setValue(generateDocumentId());
1334
            SystemMetadata sysmeta2_case17 = createSystemMetadata(pid2_case17, session.getSubject(), object);
1335
            sysmeta2_case17.setSeriesId(sid_case17);
1336
            sysmeta2_case17.setObsoletes(pid1_case17);
1337
            CNodeService.getInstance(request).create(session, pid2_case17, object, sysmeta2_case17);
1338
   
1339
            Thread.sleep(1000);
1340
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1341
            Identifier pid3_case17 = new Identifier();
1342
            pid3_case17.setValue(generateDocumentId());
1343
            SystemMetadata sysmeta3_case17 = createSystemMetadata(pid3_case17, session.getSubject(), object);
1344
            sysmeta3_case17.setSeriesId(sid_case17);
1345
            sysmeta3_case17.setObsoletes(pid2_case17);
1346
            CNodeService.getInstance(request).create(session, pid3_case17, object, sysmeta3_case17);
1347
            
1348
            sysmeta2_case17.setObsoletedBy(pid3_case17);
1349
            version = version.add(BigInteger.ONE);
1350
            sysmeta2_case17.setSerialVersion(version);
1351
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case17, sysmeta2_case17);
1352
            
1353
            Thread.sleep(1000);
1354
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1355
            Identifier pid4_case17 = new Identifier();
1356
            pid4_case17.setValue(generateDocumentId());
1357
            SystemMetadata sysmeta4_case17 = createSystemMetadata(pid4_case17, session.getSubject(), object);
1358
            sysmeta4_case17.setSeriesId(sid_case17);
1359
            sysmeta4_case17.setObsoletes(pid3_case17);
1360
            CNodeService.getInstance(request).create(session, pid4_case17, object, sysmeta4_case17);
1361
            
1362
            CNodeService.getInstance(request).delete(session, pid3_case17);
1363
            try {
1364
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case17);
1365
                fail("The pid "+pid3_case17.getValue()+" should be deleted.");
1366
            } catch (NotFound ee) {
1367
                assertTrue(true);
1368
            }
1369
            //check
1370
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case17);
1371
            assertTrue(meta.getObsoletedBy() == null);
1372
            assertTrue(meta.getObsoletes() == null);
1373
            
1374
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case17);
1375
            assertTrue(meta.getObsoletedBy().equals(pid3_case17));
1376
            assertTrue(meta.getObsoletes().equals(pid1_case17));
1377
            
1378
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case17);
1379
            assertTrue(meta.getObsoletedBy() == null);
1380
            assertTrue(meta.getObsoletes().equals(pid3_case17));
1381
            
1382
            System.out.println("case 17: =======");
1383
            head = IdentifierManager.getInstance().getHeadPID(sid_case17);
1384
            assertTrue(head.equals(pid4_case17));
1385
           
1386
            
1387
            
1388
            //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)
1389
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1390
            Identifier pid1_case18 = new Identifier();
1391
            pid1_case18.setValue(generateDocumentId());
1392
            Identifier sid_case18 = new Identifier();
1393
            sid_case18.setValue("sid."+System.nanoTime());
1394
            SystemMetadata sysmeta_case18 = createSystemMetadata(pid1_case18, session.getSubject(), object);
1395
            sysmeta_case18.setSeriesId(sid_case18);
1396
            CNodeService.getInstance(request).create(session, pid1_case18, object, sysmeta_case18);
1397
            
1398
            Thread.sleep(1000);
1399
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1400
            Identifier pid2_case18 = new Identifier();
1401
            pid2_case18.setValue(generateDocumentId());
1402
            SystemMetadata sysmeta2_case18 = createSystemMetadata(pid2_case18, session.getSubject(), object);
1403
            sysmeta2_case18.setSeriesId(sid_case18);
1404
            sysmeta2_case18.setObsoletes(pid1_case18);
1405
            CNodeService.getInstance(request).create(session, pid2_case18, object, sysmeta2_case18);
1406

    
1407
            sysmeta_case18.setObsoletedBy(pid2_case18);
1408
            version = version.add(BigInteger.ONE);
1409
            sysmeta_case18.setSerialVersion(version);
1410
            MNodeService.getInstance(request).updateSystemMetadata(session, pid1_case18, sysmeta_case18);
1411
                 
1412
            Thread.sleep(1000);
1413
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1414
            Identifier pid3_case18 = new Identifier();
1415
            pid3_case18.setValue(generateDocumentId());
1416
            SystemMetadata sysmeta3_case18 = createSystemMetadata(pid3_case18, session.getSubject(), object);
1417
            sysmeta3_case18.setSeriesId(sid_case18);
1418
            sysmeta3_case18.setObsoletes(pid2_case18);
1419
            CNodeService.getInstance(request).create(session, pid3_case18, object, sysmeta3_case18);
1420
            
1421
            sysmeta2_case18.setObsoletedBy(pid3_case18);
1422
            version = version.add(BigInteger.ONE);
1423
            sysmeta2_case18.setSerialVersion(version);
1424
            MNodeService.getInstance(request).updateSystemMetadata(session, pid2_case18, sysmeta2_case18);
1425
            
1426
            Thread.sleep(1000);
1427
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1428
            Identifier pid4_case18 = new Identifier();
1429
            pid4_case18.setValue(generateDocumentId());
1430
            SystemMetadata sysmeta4_case18 = createSystemMetadata(pid4_case18, session.getSubject(), object);
1431
            sysmeta4_case18.setSeriesId(sid_case18);
1432
            sysmeta4_case18.setObsoletes(pid3_case18);
1433
            CNodeService.getInstance(request).create(session, pid4_case18, object, sysmeta4_case18);
1434
            
1435
            Thread.sleep(1000);
1436
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1437
            Identifier pid5_case18 = new Identifier();
1438
            pid5_case18.setValue(generateDocumentId());
1439
            SystemMetadata sysmeta5_case18 = createSystemMetadata(pid5_case18, session.getSubject(), object);
1440
            sysmeta5_case18.setSeriesId(sid_case18);
1441
            sysmeta5_case18.setObsoletes(pid4_case18);
1442
            CNodeService.getInstance(request).create(session, pid5_case18, object, sysmeta5_case18);
1443
            
1444
            sysmeta4_case18.setObsoletedBy(pid5_case18);
1445
            version = version.add(BigInteger.ONE);
1446
            sysmeta4_case18.setSerialVersion(version);
1447
            MNodeService.getInstance(request).updateSystemMetadata(session, pid4_case18, sysmeta4_case18);
1448
            
1449
            CNodeService.getInstance(request).delete(session, pid3_case18);
1450
            try {
1451
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid3_case18);
1452
                fail("The pid "+pid3_case18.getValue()+" should be deleted.");
1453
            } catch (NotFound ee) {
1454
                assertTrue(true);
1455
            }
1456
            
1457
            CNodeService.getInstance(request).delete(session, pid4_case18);
1458
            try {
1459
                meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid4_case18);
1460
                fail("The pid "+pid4_case18.getValue()+" should be deleted.");
1461
            } catch (NotFound ee) {
1462
                assertTrue(true);
1463
            }
1464
            //check
1465
            meta = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case18);
1466
            assertTrue(meta.getObsoletedBy().equals(pid2_case18));
1467
            assertTrue(meta.getObsoletes() == null);
1468
            
1469
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid2_case18);
1470
            assertTrue(meta.getObsoletedBy().equals(pid3_case18));
1471
            assertTrue(meta.getObsoletes().equals(pid1_case18));
1472
            
1473
            meta =  CNodeService.getInstance(request).getSystemMetadata(session, pid5_case18);
1474
            assertTrue(meta.getObsoletedBy() == null);
1475
            assertTrue(meta.getObsoletes().equals(pid4_case18));
1476
            
1477
            System.out.println("case 18: =======");
1478
            head = IdentifierManager.getInstance().getHeadPID(sid_case18);
1479
            assertTrue(head.equals(pid5_case18));
1480

    
1481
          //case-19 This is about the time stamps messing up.
1482
          //P1(S1,t1) <-P2(S1,t2) <-P3(S1, t3) S1 = P3 (t1, t2 and t3 are the time stamp while t1 >t2 > t3. P1, P2 and P3 are a type 1 end, not an ideal chain. 
1483
                                                       //So we will pick up P1 as the head since t1 is the lastest one. However, if we also consider the obsoletes chain, we will pick up P3)
1484
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1485
            Identifier pid3_case19 = new Identifier();
1486
            pid3_case19.setValue(generateDocumentId());
1487
            System.out.println("pid3 is "+pid3_case19.getValue());
1488
            Thread.sleep(1000);
1489
            Identifier pid2_case19 = new Identifier();
1490
            pid2_case19.setValue(generateDocumentId());
1491
            System.out.println("pid2 is "+pid2_case19.getValue());
1492
            Thread.sleep(1000);
1493
            Identifier pid1_case19 = new Identifier();
1494
            pid1_case19.setValue(generateDocumentId());
1495
            System.out.println("pid1 is "+pid1_case19.getValue());
1496
            
1497
            Identifier sid_case19 = new Identifier();
1498
            sid_case19.setValue("sid."+System.nanoTime());
1499
            SystemMetadata sysmeta3_case19 = createSystemMetadata(pid3_case19, session.getSubject(), object);
1500
            sysmeta3_case19.setSeriesId(sid_case19);
1501
            sysmeta3_case19.setObsoletes(pid2_case19);
1502
            CNodeService.getInstance(request).create(session, pid3_case19, object, sysmeta3_case19);
1503
            SystemMetadata sys3 = CNodeService.getInstance(request).getSystemMetadata(session, pid3_case19);
1504
            Date time3 = sys3.getDateUploaded();
1505
            
1506
            Thread.sleep(1000);
1507
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1508
            SystemMetadata sysmeta2_case19 = createSystemMetadata(pid2_case19, session.getSubject(), object);
1509
            sysmeta2_case19.setSeriesId(sid_case19);
1510
            sysmeta2_case19.setObsoletes(pid1_case19);
1511
            CNodeService.getInstance(request).create(session, pid2_case19, object, sysmeta2_case19);
1512
            SystemMetadata sys2 = CNodeService.getInstance(request).getSystemMetadata(session, pid2_case19);
1513
            Date time2 = sys2.getDateUploaded();
1514
            
1515
            Thread.sleep(1000);
1516
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1517
            SystemMetadata sysmeta1_case19 = createSystemMetadata(pid1_case19, session.getSubject(), object);
1518
            sysmeta1_case19.setSeriesId(sid_case19);
1519
            CNodeService.getInstance(request).create(session, pid1_case19, object, sysmeta1_case19);
1520
            SystemMetadata sys1 = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case19);
1521
            Date time1 = sys1.getDateUploaded();
1522
            
1523
            //time1 > time2 > time3
1524
            assertTrue(time1.getTime()>time2.getTime());
1525
            assertTrue(time2.getTime()>time3.getTime());
1526
            
1527
            System.out.println("case 19: =======");
1528
            Identifier head2 = IdentifierManager.getInstance().getHeadPID(sid_case19);
1529
            assertTrue(head2.equals(pid3_case19));
1530
            
1531
         
1532
        } catch (Exception e) {
1533
            e.printStackTrace();
1534
            fail(e.getMessage());
1535
        }
1536
        
1537
    }
1538

    
1539
    /** 
1540
     * Insert a test document, returning the docid that was used. 
1541
     */
1542
    private String insertTestDocument() {
1543
        String accessBlock = getAccessBlock("public", true, true,
1544
                false, false, false);
1545
        String emldoc = getTestEmlDoc("Test identifier manager", EML2_1_0, null,
1546
                null, "http://fake.example.com/somedata", null,
1547
                accessBlock, null, null,
1548
                null, null);
1549
        System.out.println("inserting doc: " + emldoc);
1550
        String docid = generateDocumentId() + ".1";
1551
        try {
1552
            m.login(username, password);
1553
            String response = insertDocumentId(docid, emldoc, true, false);
1554
        } catch (MetacatAuthException e) {
1555
            fail(e.getMessage());
1556
        } catch (MetacatInaccessibleException e) {
1557
            fail(e.getMessage());
1558
        }
1559
        return docid;
1560
    }
1561
    
1562
    /**
1563
     * Method to test new system metadata field such as media type and file name.
1564
     */
1565
    public void testMediaType() throws Exception {
1566
        String fileName = "new file name";
1567
        String name = "text/plain";
1568
        String p1Name = "charset";
1569
        String p1Value = "UTF8";
1570
        String p2Name = "n2";
1571
        String p2Value = "v2";
1572
        IdentifierManager im = IdentifierManager.getInstance();
1573
        
1574
        //test system metadata write/read without mediatype and file name.
1575
        String docid = "test." + new Date().getTime() + ".1";
1576
        String guid = "guid:" + docid;
1577
        //create a mapping (identifier-docid)
1578
        im.createMapping(guid, docid);
1579
        Session session = getTestSession();
1580
        Identifier id = new Identifier();
1581
        id.setValue(guid);
1582
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1583
        SystemMetadata sysmeta = createSystemMetadata(id, session.getSubject(), object);
1584
        //sysmeta.setFileName(fileName);
1585
        im.insertOrUpdateSystemMetadata(sysmeta);
1586
        SystemMetadata read = im.getSystemMetadata(guid);
1587
        assertTrue(read.getIdentifier().equals(id));
1588
        assertTrue(read.getFileName() == null);
1589
        assertTrue(read.getMediaType() == null);
1590
        //remove the system metadata
1591
        im.deleteSystemMetadata(guid);
1592
        //remove the mapping
1593
        im.removeMapping(guid, docid);
1594
        
1595
        
1596
      //test system metadata write/read with mediatype and file name.
1597
        Thread.sleep(1000);
1598
        docid = "test." + new Date().getTime() + ".1";
1599
        guid = "guid:" + docid;
1600
        //create a mapping (identifier-docid)
1601
        im.createMapping(guid, docid);
1602
        id = new Identifier();
1603
        id.setValue(guid);
1604
        object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1605
        sysmeta = createSystemMetadata(id, session.getSubject(), object);
1606
        sysmeta.setFileName(fileName);
1607
        MediaType media = new MediaType();
1608
        media.setName(name);
1609
        MediaTypeProperty p1 = new MediaTypeProperty();
1610
        p1.setName(p1Name);
1611
        p1.setValue(p1Value);
1612
        media.addProperty(p1);
1613
        MediaTypeProperty p2 = new MediaTypeProperty();
1614
        p2.setName(p2Name);
1615
        p2.setValue(p2Value);
1616
        media.addProperty(p2);
1617
        sysmeta.setMediaType(media);
1618
        im.insertOrUpdateSystemMetadata(sysmeta);
1619
        read = im.getSystemMetadata(guid);
1620
        assertTrue(read.getIdentifier().equals(id));
1621
        assertTrue(read.getFileName().equals(fileName));
1622
        MediaType type = read.getMediaType();
1623
        assertTrue(type.getName().equals(name));
1624
        List<MediaTypeProperty> list = type.getPropertyList();
1625
        assertTrue(list.size() == 2);
1626
        MediaTypeProperty item1 = list.get(0);
1627
        assertTrue(item1.getName().equals(p1Name));
1628
        assertTrue(item1.getValue().equals(p1Value));
1629
        MediaTypeProperty item2 = list.get(1);
1630
        assertTrue(item2.getName().equals(p2Name));
1631
        assertTrue(item2.getValue().equals(p2Value));
1632
        
1633
        //Thread.sleep(100000);
1634
        //remove the system metadata
1635
        im.deleteSystemMetadata(guid);
1636
        //remove the mapping
1637
        im.removeMapping(guid, docid);
1638
        
1639
        
1640
    }
1641
    
1642
    private void ph(String s)
1643
    {
1644
        System.out.println("*********************** " + s + " ****************************");
1645
    }
1646
    
1647
    public void testQuerySystemMetadata() throws Exception {
1648
        String nodeIdStr="rtgf:test:ert";
1649
        Date startTime = null;
1650
        Date endTime = null;
1651
        ObjectFormatIdentifier objectFormatId = null;
1652
        NodeReference nodeId = null;
1653
        int start = 0;
1654
        int count =1000;
1655
        Identifier identifier = null;
1656
        boolean isSID = false;
1657
        ObjectList list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1658
                objectFormatId, nodeId, start, count, identifier, isSID);
1659
        int size1= list.sizeObjectInfoList();
1660
        assertTrue( size1>0);
1661
        nodeId = new NodeReference();
1662
        String currentNodeId = Settings.getConfiguration().getString("dataone.nodeId");
1663
        nodeId.setValue(currentNodeId);
1664
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1665
                objectFormatId, nodeId, start, count, identifier, isSID);
1666
        int size2= list.sizeObjectInfoList();
1667
        assertTrue( size2 > 0);
1668
        assertTrue( size1 >= size2);
1669
        nodeId.setValue("there_bei_we12");
1670
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1671
                objectFormatId, nodeId, start, count, identifier, isSID);
1672
        int size3 = list.sizeObjectInfoList();
1673
        assertTrue(size3==0);
1674
        
1675
        Session session = getTestSession();
1676
        Identifier guid = new Identifier();
1677
        guid.setValue(generateDocumentId());
1678
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1679
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1680
        nodeId.setValue(nodeIdStr);
1681
        sysmeta.setAuthoritativeMemberNode(nodeId);
1682
        String sid1= "sid."+System.nanoTime();
1683
        Identifier seriesId = new Identifier();
1684
        seriesId.setValue(sid1);
1685
        System.out.println("the first sid is "+seriesId.getValue());
1686
        sysmeta.setSeriesId(seriesId);
1687
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1688
        Thread.sleep(5000);
1689
        list = IdentifierManager.getInstance().querySystemMetadata(startTime, endTime,
1690
                objectFormatId, nodeId, start, count, identifier, isSID);
1691
        int size4 = list.sizeObjectInfoList();
1692
        assertTrue(size4 > 0);
1693
    }
1694
    
1695
    public void testObjectFileExist() throws Exception {
1696
        //test the data object
1697
        Session session = getTestSession();
1698
        Identifier guid = new Identifier();
1699
        guid.setValue(generateDocumentId());
1700
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1701
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1702
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1703
        String localId =  IdentifierManager.getInstance().getLocalId(guid.getValue());
1704
        boolean isScienceMetadata = false;
1705
        assertTrue("The data file "+localId+" should exists.", IdentifierManager.getInstance().objectFileExists(localId, isScienceMetadata));
1706
        
1707
        localId = "boo.foo.12w3d";
1708
        assertTrue("The data file "+localId+" should exists.", !IdentifierManager.getInstance().objectFileExists(localId, isScienceMetadata));
1709
        
1710
        Thread.sleep(500);
1711
        //test the medata object
1712
        guid = new Identifier();
1713
        guid.setValue(generateDocumentId());
1714
        object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File("./test/eml-sample.xml")));
1715
        sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1716
        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
1717
        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
1718
        sysmeta.setFormatId(formatId);
1719
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1720
        localId =  IdentifierManager.getInstance().getLocalId(guid.getValue());
1721
        isScienceMetadata = true;
1722
        assertTrue("The science data file "+localId+" should exists.", IdentifierManager.getInstance().objectFileExists(localId, isScienceMetadata));
1723
        
1724
        localId = "boo.foo.12w3d";
1725
        assertTrue("The science data file "+localId+" should exists.", !IdentifierManager.getInstance().objectFileExists(localId, isScienceMetadata));
1726
        
1727
        Thread.sleep(500);
1728
        //test the medata object
1729
        guid = new Identifier();
1730
        guid.setValue(generateDocumentId());
1731
        object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File("./test/resourcemap.xml")));
1732
        sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1733
        formatId = new ObjectFormatIdentifier();
1734
        formatId.setValue("http://www.openarchives.org/ore/terms");
1735
        sysmeta.setFormatId(formatId);
1736
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1737
        localId =  IdentifierManager.getInstance().getLocalId(guid.getValue());
1738
        System.out.println("The local id for resource map ================================= is "+localId);
1739
        isScienceMetadata = false;
1740
        assertTrue("The science data file "+localId+" should exists.", IdentifierManager.getInstance().objectFileExists(localId, isScienceMetadata));
1741
        
1742
     
1743
        
1744
    }
1745
    
1746
    public void testExistsInXmlRevisionTable() {
1747
        try {
1748
            String localId = "test.12";
1749
            int rev =1;
1750
            assertTrue("The object "+localId+" should not exists in the xml_revisions table.", !IdentifierManager.getInstance().existsInXmlLRevisionTable(localId, rev));
1751
        } catch (Exception e) {
1752
            e.printStackTrace();
1753
            fail("testExistsInXmlRevisiontable failed since" +e.getMessage());
1754
        }
1755
        
1756
    }
1757
    /**
1758
     * We want to act as the CN itself
1759
     * @throws ServiceFailure 
1760
     * @throws Exception 
1761
     */
1762
    @Override
1763
    public Session getTestSession() throws Exception {
1764
        Session session = super.getTestSession();
1765
        
1766
        // use the first CN we find in the nodelist
1767
        NodeList nodeList = D1Client.getCN().listNodes();
1768
        for (Node node : nodeList.getNodeList()) {
1769
            if ( node.getType().equals(NodeType.CN) ) {
1770
                
1771
                List<Subject> subjects = node.getSubjectList();
1772
                for (Subject subject : subjects) {
1773
                   session.setSubject(subject);
1774
                   // we are done here
1775
                   return session;
1776
                }
1777
            }
1778
        }
1779
        // in case we didn't find it
1780
        return session;
1781
    }
1782
    
1783
}
(8-8/30)