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
        return suite;
99
    }
100
    /**
101
     * Initialize the connection to metacat, and insert a document to be 
102
     * used for testing with a known docid.
103
     */
104
    public void setUp() {
105
        
106
        metacatConnectionNeeded = true;
107
        try {
108
            DBConnectionPool pool = DBConnectionPool.getInstance();
109
        } catch (SQLException e2) {
110
            fail(e2.getMessage());
111
        }
112
        
113
        try {
114
            super.setUp();
115
        } catch (Exception e1) {
116
            fail(e1.getMessage());
117
        }
118
    }
119
    
120
    /**
121
     * test getting a guid from the systemmetadata table
122
     */
123
    public void testGetGUID()
124
    {
125
        ph("testGetGUID");
126
        try
127
        {
128
            IdentifierManager im = IdentifierManager.getInstance();
129

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

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

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

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

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

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

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

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

    
1479
          //case-19 This is about the time stamps messing up.
1480
          //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. 
1481
                                                       //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)
1482
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1483
            Identifier pid3_case19 = new Identifier();
1484
            pid3_case19.setValue(generateDocumentId());
1485
            System.out.println("pid3 is "+pid3_case19.getValue());
1486
            Thread.sleep(1000);
1487
            Identifier pid2_case19 = new Identifier();
1488
            pid2_case19.setValue(generateDocumentId());
1489
            System.out.println("pid2 is "+pid2_case19.getValue());
1490
            Thread.sleep(1000);
1491
            Identifier pid1_case19 = new Identifier();
1492
            pid1_case19.setValue(generateDocumentId());
1493
            System.out.println("pid1 is "+pid1_case19.getValue());
1494
            
1495
            Identifier sid_case19 = new Identifier();
1496
            sid_case19.setValue("sid."+System.nanoTime());
1497
            SystemMetadata sysmeta3_case19 = createSystemMetadata(pid3_case19, session.getSubject(), object);
1498
            sysmeta3_case19.setSeriesId(sid_case19);
1499
            sysmeta3_case19.setObsoletes(pid2_case19);
1500
            CNodeService.getInstance(request).create(session, pid3_case19, object, sysmeta3_case19);
1501
            SystemMetadata sys3 = CNodeService.getInstance(request).getSystemMetadata(session, pid3_case19);
1502
            Date time3 = sys3.getDateUploaded();
1503
            
1504
            Thread.sleep(1000);
1505
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1506
            SystemMetadata sysmeta2_case19 = createSystemMetadata(pid2_case19, session.getSubject(), object);
1507
            sysmeta2_case19.setSeriesId(sid_case19);
1508
            sysmeta2_case19.setObsoletes(pid1_case19);
1509
            CNodeService.getInstance(request).create(session, pid2_case19, object, sysmeta2_case19);
1510
            SystemMetadata sys2 = CNodeService.getInstance(request).getSystemMetadata(session, pid2_case19);
1511
            Date time2 = sys2.getDateUploaded();
1512
            
1513
            Thread.sleep(1000);
1514
            object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1515
            SystemMetadata sysmeta1_case19 = createSystemMetadata(pid1_case19, session.getSubject(), object);
1516
            sysmeta1_case19.setSeriesId(sid_case19);
1517
            CNodeService.getInstance(request).create(session, pid1_case19, object, sysmeta1_case19);
1518
            SystemMetadata sys1 = CNodeService.getInstance(request).getSystemMetadata(session, pid1_case19);
1519
            Date time1 = sys1.getDateUploaded();
1520
            
1521
            //time1 > time2 > time3
1522
            assertTrue(time1.getTime()>time2.getTime());
1523
            assertTrue(time2.getTime()>time3.getTime());
1524
            
1525
            System.out.println("case 19: =======");
1526
            Identifier head2 = IdentifierManager.getInstance().getHeadPID(sid_case19);
1527
            assertTrue(head2.equals(pid3_case19));
1528
            
1529
         
1530
        } catch (Exception e) {
1531
            e.printStackTrace();
1532
            fail(e.getMessage());
1533
        }
1534
        
1535
    }
1536

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