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
 *  Purpose: To test the Access Controls in metacat by JUnit
6
 *
7
 *   '$Author: tao $'
8
 *     '$Date: 2016-10-04 15:26:03 -0700 (Tue, 04 Oct 2016) $'
9
 * '$Revision: 10002 $'
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 */
25

    
26
package edu.ucsb.nceas.metacat.dataone;
27

    
28

    
29
import java.io.ByteArrayInputStream;
30
import java.io.IOException;
31
import java.io.InputStream;
32
import java.math.BigInteger;
33
import java.text.SimpleDateFormat;
34
import java.util.Calendar;
35
import java.util.Date;
36
import java.util.List;
37
import java.util.ArrayList;
38

    
39
import junit.framework.Test;
40
import junit.framework.TestSuite;
41

    
42
import org.apache.commons.beanutils.BeanUtils;
43
import org.apache.commons.io.IOUtils;
44
import org.dataone.client.D1Node;
45
import org.dataone.client.NodeLocator;
46
import org.dataone.client.exception.ClientSideException;
47
import org.dataone.client.v2.CNode;
48
import org.dataone.client.v2.itk.D1Client;
49
import org.dataone.service.exceptions.BaseException;
50
import org.dataone.service.exceptions.InvalidRequest;
51
import org.dataone.service.exceptions.InvalidSystemMetadata;
52
import org.dataone.service.exceptions.NotAuthorized;
53
import org.dataone.service.exceptions.NotFound;
54
import org.dataone.service.exceptions.NotImplemented;
55
import org.dataone.service.exceptions.ServiceFailure;
56
import org.dataone.service.types.v1.AccessPolicy;
57
import org.dataone.service.types.v1.AccessRule;
58
import org.dataone.service.types.v1.Checksum;
59
import org.dataone.service.types.v1.DescribeResponse;
60
import org.dataone.service.types.v1.Event;
61
import org.dataone.service.types.v1.Identifier;
62
import org.dataone.service.types.v1.NodeReference;
63
import org.dataone.service.types.v1.NodeType;
64
import org.dataone.service.types.v1.ObjectFormatIdentifier;
65
import org.dataone.service.types.v1.ObjectList;
66
import org.dataone.service.types.v1.Permission;
67
import org.dataone.service.types.v1.Replica;
68
import org.dataone.service.types.v1.ReplicationPolicy;
69
import org.dataone.service.types.v1.ReplicationStatus;
70
import org.dataone.service.types.v1.Session;
71
import org.dataone.service.types.v1.Subject;
72
import org.dataone.service.types.v2.Log;
73
import org.dataone.service.types.v2.Node;
74
import org.dataone.service.types.v2.NodeList;
75
import org.dataone.service.types.v2.ObjectFormat;
76
import org.dataone.service.types.v2.ObjectFormatList;
77
import org.dataone.service.types.v2.OptionList;
78
import org.dataone.service.types.v2.SystemMetadata;
79
import org.dataone.service.util.Constants;
80

    
81
import edu.ucsb.nceas.metacat.dataone.CNodeService;
82
import edu.ucsb.nceas.metacat.dataone.D1NodeService;
83
import edu.ucsb.nceas.metacat.dataone.MNodeService;
84

    
85
/**
86
 * A JUnit test for testing the dataone CNCore implementation
87
 */
88
public class CNodeServiceTest extends D1NodeServiceTest {   
89
    
90
    /**
91
    * constructor for the test
92
    */
93
    public CNodeServiceTest(String name)
94
    {
95
        super(name);
96
    }
97

    
98
	/**
99
	 * Create a suite of tests to be run together
100
	 */
101
	public static Test suite() 
102
	{
103
		TestSuite suite = new TestSuite();
104
		suite.addTest(new CNodeServiceTest("initialize"));
105
		
106
		suite.addTest(new CNodeServiceTest("testChecksum"));
107
		suite.addTest(new CNodeServiceTest("testCreate"));
108
		suite.addTest(new CNodeServiceTest("testGet"));
109
		suite.addTest(new CNodeServiceTest("testGetFormat"));
110
		suite.addTest(new CNodeServiceTest("testGetLogRecords"));
111
		suite.addTest(new CNodeServiceTest("testGetSystemMetadata"));
112
		suite.addTest(new CNodeServiceTest("testIsAuthorized"));
113
		suite.addTest(new CNodeServiceTest("testListFormats"));
114
		suite.addTest(new CNodeServiceTest("testListNodes"));
115
		suite.addTest(new CNodeServiceTest("testObjectFormatNotFoundException"));
116
		suite.addTest(new CNodeServiceTest("testRegisterSystemMetadata"));
117
		suite.addTest(new CNodeServiceTest("testReplicationPolicy"));
118
		suite.addTest(new CNodeServiceTest("testReplicationStatus"));
119
		suite.addTest(new CNodeServiceTest("testReserveIdentifier"));
120
		suite.addTest(new CNodeServiceTest("testSearch"));
121
		suite.addTest(new CNodeServiceTest("testSetAccessPolicy"));
122
		suite.addTest(new CNodeServiceTest("testSetOwner"));
123
		suite.addTest(new CNodeServiceTest("readDeletedObject"));
124
		suite.addTest(new CNodeServiceTest("testGetSID"));
125
		suite.addTest(new CNodeServiceTest("testListViews"));
126
		suite.addTest(new CNodeServiceTest("testUpdateSystemMetadata"));
127
		suite.addTest(new CNodeServiceTest("testArchive"));
128
		suite.addTest(new CNodeServiceTest("testExpandRighsHolder"));
129
		
130
		return suite;
131
	}
132
	
133
	
134
	/**
135
	 * test for registering standalone system metadata
136
	 */
137
	public Identifier testRegisterSystemMetadata() {
138
	    printTestHeader("testRegisterSystemMetadata");
139

    
140
	    try {
141
	        Session testSession = getTestSession();
142
            Session session = getCNSession();
143
			Identifier guid = new Identifier();
144
			guid.setValue("testRegisterSystemMetadata." + System.currentTimeMillis());
145
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
146
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
147
			try {
148
			    CNodeService.getInstance(request).registerSystemMetadata(testSession, guid, sysmeta);
149
			    fail("We shouldn't get there since the test session can't regsiter system metadata");
150
			} catch (NotAuthorized ee) {
151
			    
152
			}
153
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
154
			assertEquals(guid.getValue(), retGuid.getValue());
155
			return retGuid;
156
        } catch(Exception e) {
157
            fail("Unexpected error: " + e.getMessage());
158
        }
159
        return null;
160
	}
161
	
162
	/**
163
	 * test for getting system metadata
164
	 */
165
	public void testGetSystemMetadata() {
166
	    printTestHeader("testGetSystemMetadata");
167

    
168
	    try {
169
            Session session = getCNSession();
170
			Identifier guid = new Identifier();
171
			guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
172
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
173
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
174
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
175
			assertEquals(guid.getValue(), retGuid.getValue());
176
			// get it
177
			SystemMetadata retSysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
178
			// check it
179
			assertEquals(sysmeta.getIdentifier().getValue(), retSysmeta.getIdentifier().getValue());
180
        } catch(Exception e) {
181
            fail("Unexpected error: " + e.getMessage());
182
        }
183
	}
184
	
185
	public void testGetLogRecords() {
186
	    printTestHeader("testGetLogRecords");
187
	    try {
188

    
189
		    Session session = getCNSession();
190
		    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
191
		    Date fromDate = sdf.parse("2010-01-01");
192
		    Date toDate = new Date();
193
		    Event event = Event.CREATE;
194
		    int start = 0;
195
		    int count = 1;
196
	    
197
		    Log log = CNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
198
		    	event.xmlValue(), null, start, count);
199
		    assertNotNull(log);
200
		    assertTrue(log.getCount() == count);
201
		    assertTrue(log.getStart() == start);
202
		    assertTrue(log.getTotal() > 0);
203
	    } catch (Exception e) {
204
		    e.printStackTrace();
205
		    fail("Unexpected error: " + e.getMessage());
206
	    } 
207
	}
208
	
209
	public void testCreate() {
210
	    printTestHeader("testCreate");
211

    
212
	    try {
213
            Session session = getCNSession();
214
			Identifier guid = new Identifier();
215
			guid.setValue("testCreate." + System.currentTimeMillis());
216
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
217
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
218
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
219
			assertEquals(guid, pid);
220
        } catch(Exception e) {
221
        	e.printStackTrace();
222
            fail("Unexpected error: " + e.getMessage());
223
        }
224
	}
225
	
226
	public void testGet() {
227
	    printTestHeader("testGet");
228

    
229
	    try {
230
            Session session = getCNSession();
231
			Identifier guid = new Identifier();
232
			guid.setValue("testGet." + System.currentTimeMillis());
233
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
234
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
235
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
236
			assertEquals(guid.getValue(), pid.getValue());
237
			System.out.println("the pid is+++++++++++++++++++++++++"+guid.getValue());
238
			// get it
239
			InputStream retObject = CNodeService.getInstance(request).get(session, pid);
240
			// check it
241
			object.reset();
242
			assertTrue(IOUtils.contentEquals(object, retObject));
243
        } catch(Exception e) {
244
        	e.printStackTrace();
245
            fail("Unexpected error: " + e.getMessage());
246
        }
247
	}
248
	
249
	public void testChecksum() {
250
	    printTestHeader("testChecksum");
251

    
252
	    try {
253
            Session session = getCNSession();
254
			Identifier guid = new Identifier();
255
			guid.setValue("testChecksum." + System.currentTimeMillis());
256
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
257
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
258
			// save it
259
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
260
			assertEquals(guid.getValue(), retGuid.getValue());
261
			// check it
262
			Checksum checksum = CNodeService.getInstance(request).getChecksum(session, guid);
263
			assertEquals(sysmeta.getChecksum().getValue(), checksum.getValue());
264
        } catch(Exception e) {
265
            fail("Unexpected error: " + e.getMessage());
266
        }
267
	}
268
	
269
	public void testListNodes() {
270
	    printTestHeader("testListNodes");
271

    
272
	    try {
273
	    	CNodeService.getInstance(request).listNodes();
274
        } catch(NotImplemented e) {
275
        	// expecting not implemented
276
            assertTrue(true);
277
        } catch(Exception e) {
278
            fail("Unexpected error: " + e.getMessage());
279
        }
280
	}
281
	
282
	public void testReserveIdentifier() {
283
	    printTestHeader("testReserveIdentifier");
284

    
285
	    try {
286
            Session session = getCNSession();
287
			Identifier guid = new Identifier();
288
			guid.setValue("testReserveIdentifier." + System.currentTimeMillis());
289
			// reserve it
290
			Identifier resultPid = CNodeService.getInstance(request).reserveIdentifier(session, guid);
291
			assertNotNull(resultPid);
292
			assertEquals(guid.getValue(), resultPid.getValue());
293
	    } catch(NotImplemented ni) {
294
        	// this is not implemented in Metacat
295
            assertTrue(true);	
296
        } catch(Exception e) {
297
        	e.printStackTrace();
298
            fail("Unexpected error: " + e.getMessage());
299
        }
300
	}
301
	
302
	public void testSearch() {
303
	    printTestHeader("testSearch");
304

    
305
	    try {
306
            Session session = getCNSession();
307
			
308
			// search for objects, but expect a NotImplemented exception
309
			try {
310
				ObjectList objectList = CNodeService.getInstance(request).search(session, null, null);
311
			} catch (NotImplemented ne) {
312
				assertTrue(true);
313
				return;
314
			}
315
			fail("Metacat should not implement CN.search");
316
			
317
        } catch(Exception e) {
318
            fail("Unexpected error: " + e.getMessage());
319
        }
320
	}
321
	
322
	public void testSetOwner() {
323
	    printTestHeader("testSetOwner");
324

    
325
	    try {
326
            Session session = getCNSession();
327
			Identifier guid = new Identifier();
328
			guid.setValue("testSetOwner." + System.currentTimeMillis());
329
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
330
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
331
			long serialVersion = 1L;
332
			// save it
333
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
334
			assertEquals(guid.getValue(), retGuid.getValue());
335
			Subject rightsHolder = new Subject();
336
			rightsHolder.setValue("newUser");
337
			// set it
338
			Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
339
			assertEquals(guid, retPid);
340
			// get it
341
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
342
			assertNotNull(sysmeta);
343
			// check it
344
			assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
345
			
346
        } catch(Exception e) {
347
            e.printStackTrace();
348
            if(e instanceof ServiceFailure) {
349
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
350
            } else {
351
                fail("Unexpected error: " + e.getMessage());
352
            }
353
        }
354
	}
355
	
356
	public void testSetAccessPolicy() {
357
	    printTestHeader("testSetAccessPolicy");
358

    
359
	    try {
360
            Session session = getCNSession();
361
			Identifier guid = new Identifier();
362
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
363
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
364
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
365
	    long serialVersion = 1L;
366

    
367
			// save it
368
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
369
			assertEquals(guid.getValue(), retGuid.getValue());
370
			AccessPolicy accessPolicy = new AccessPolicy();
371
			AccessRule accessRule = new AccessRule();
372
			accessRule.addPermission(Permission.WRITE);
373
			Subject publicSubject = new Subject();
374
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
375
			accessRule.addSubject(publicSubject);
376
			accessPolicy.addAllow(accessRule);
377
			// set it
378
			boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
379
			assertTrue(result);
380
			// check it
381
			result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
382
			assertTrue(result);
383
        } catch(Exception e) {
384
            e.printStackTrace();
385
            if(e instanceof ServiceFailure) {
386
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
387
            } else {
388
                fail("Unexpected error: " + e.getMessage());
389
            }
390
        }
391
	}
392
	
393
	public void testIsAuthorized() {
394
	    printTestHeader("testIsAuthorized");
395

    
396
	    try {
397
            Session session = getCNSession();
398
			Identifier guid = new Identifier();
399
			guid.setValue("testIsAuthorized." + System.currentTimeMillis());
400
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
401
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
402
			// save it
403
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
404
			assertEquals(guid.getValue(), retGuid.getValue());
405
			// check it
406
			Subject publicSubject = new Subject();
407
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
408
			session.setSubject(publicSubject);
409
			// public read
410
			boolean result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
411
			assertTrue(result);
412
			// not public write
413
			try {
414
				result = false;
415
				result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
416
				fail("Public WRITE should be denied");
417
			} catch (NotAuthorized nae) {
418
				result = true;
419
			}
420
			assertTrue(result);
421
        } catch(Exception e) {
422
            fail("Unexpected error: " + e.getMessage());
423
        }
424
	}
425
	
426
	public void testReplicationPolicy() {
427
	    printTestHeader("testReplicationPolicy");
428

    
429
	    try {
430
            Session session = getCNSession();
431
			Identifier guid = new Identifier();
432
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
433
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
434
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
435
	    long serialVersion = 1L;
436

    
437
			// save it
438
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
439
			assertEquals(guid.getValue(), retGuid.getValue());
440
			
441
			ReplicationPolicy policy = new ReplicationPolicy();
442
			NodeReference node = new NodeReference();
443
			node.setValue("testNode");
444
			policy.addPreferredMemberNode(node );
445
			// set it
446
			boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
447
			assertTrue(result);
448
			// get it
449
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
450
			assertNotNull(sysmeta);
451
			// check it
452
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
453
			
454
        } catch(Exception e) {
455
            e.printStackTrace();
456
            if(e instanceof ServiceFailure) {
457
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
458
            } else {
459
                fail("Unexpected error: " + e.getMessage());
460
            }
461
            
462
        }
463
	}
464
	
465
	public void testReplicationStatus() {
466
	    printTestHeader("testReplicationStatus");
467

    
468
	    try {
469
            Session session = getCNSession();
470
			Identifier guid = new Identifier();
471
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
472
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
473
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
474
			Replica replica = new Replica();
475
			NodeReference replicaMemberNode = new NodeReference();
476
			replicaMemberNode.setValue("testNode");
477
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
478
			replica.setReplicaMemberNode(replicaMemberNode);
479
			replica.setReplicaVerified(Calendar.getInstance().getTime());
480
			sysmeta.addReplica(replica );
481
			// save it
482
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
483
			assertEquals(guid.getValue(), retGuid.getValue());
484
			// set it
485
			ReplicationStatus status = ReplicationStatus.QUEUED;
486
			BaseException failure = new NotAuthorized("000", "Mock exception for " + this.getClass().getName());
487
			//Test the failure of setReplicationStatus by a non-cn subject
488
			Session testSession = getTestSession();
489
			try {
490
			    CNodeService.getInstance(request).setReplicationStatus(testSession, guid, replicaMemberNode, status, failure);
491
			    fail("It can't reach here since the non-cn subject can't call setReplicationStatus");
492
			} catch (NotAuthorized ee) {
493
			    
494
			}
495
			//Test the success of setReplicationStatus by a cn subject
496
			boolean result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
497
			assertTrue(result);
498
			// get it
499
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
500
			BigInteger version = sysmeta.getSerialVersion();
501
			System.out.println("the version of system metadata is "+version.intValue());
502
			assertNotNull(sysmeta);
503
			// check it
504
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
505
			
506
			//set it failed.
507
			status = ReplicationStatus.FAILED;
508
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
509
            assertTrue(result);
510
            // get it
511
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
512
            BigInteger version1 = sysmeta.getSerialVersion();
513
            System.out.println("the version of system metadata is "+version1.intValue());
514
            assertTrue(version1.compareTo(version) == 1);
515
            assertNotNull(sysmeta);
516
            // check it
517
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
518
			
519
            //set it failed again
520
            status = ReplicationStatus.FAILED;
521
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
522
            assertTrue(result);
523
            // get it
524
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
525
            BigInteger version2 = sysmeta.getSerialVersion();
526
            System.out.println("the version of system metadata is "+version2.intValue());
527
            assertTrue(version2.compareTo(version1) ==0);
528
            assertNotNull(sysmeta);
529
            // check it
530
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
531
			
532
			//requeque it
533
			status = ReplicationStatus.QUEUED;
534
			result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
535
            assertTrue(result);
536
            // get it
537
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
538
            BigInteger version3 = sysmeta.getSerialVersion();
539
            System.out.println("the version of system metadata is "+version3.intValue());
540
            assertTrue(version3.compareTo(version2) ==1);
541
            assertNotNull(sysmeta);
542
            // check it
543
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
544
			
545
            
546
			//Test the success of setReplicationStatus by a register mn subject
547
			Session mnSession = getMNSessionFromCN();
548
			status = ReplicationStatus.COMPLETED;
549
			result = CNodeService.getInstance(request).setReplicationStatus(mnSession, guid, replicaMemberNode, status, failure);
550
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
551
			BigInteger version4 = sysmeta.getSerialVersion();
552
			            System.out.println("the version of system metadata is "+version4.intValue());
553
			            assertTrue(version4.compareTo(version3) ==1);
554
            assertNotNull(sysmeta);
555
            // check it
556
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
557
			
558
        } catch(Exception e) {
559
            fail("Unexpected error: " + e.getMessage());
560
        }
561
	}
562
	
563
	/**
564
	 * Run an initial test that always passes to check that the test harness is
565
	 * working.
566
	 */
567
	public void initialize() 
568
	{
569
	    printTestHeader("initialize");
570
		assertTrue(1 == 1);
571
	}
572
	
573
	/**
574
	 * We want to act as the CN itself
575
	 * @throws ServiceFailure 
576
	 * @throws Exception 
577
	 */
578
	/*@Override
579
	public Session getTestSession() throws Exception {
580
		Session session = super.getTestSession();
581
		
582
		// use the first CN we find in the nodelist
583
        NodeList nodeList = D1Client.getCN().listNodes();
584
        for (Node node : nodeList.getNodeList()) {
585
            if ( node.getType().equals(NodeType.CN) ) {
586
                
587
                List<Subject> subjects = node.getSubjectList();
588
                for (Subject subject : subjects) {
589
                   session.setSubject(subject);
590
                   // we are done here
591
                   return session;
592
                }
593
            }
594
        }
595
        // in case we didn't find it
596
        return session;
597
	}*/
598
	
599

    
600
	/**
601
	 * test to list the object formats registered in metacat
602
	 */
603
	public void testListFormats() {
604
		
605
    printTestHeader("testListFormats");
606
    
607
    // make sure we are set up
608
    setUpFormats();
609
    
610
    // there should be at least 59 formats in the list
611
  	int formatsCount = 59;
612
  	ObjectFormatList objectFormatList;
613
  	
614
  	try {
615
	    objectFormatList = CNodeService.getInstance(request).listFormats();
616
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
617
  	
618
  	} catch (ServiceFailure e) {
619
  		fail("Could not get the object format list: " + e.getMessage());
620

    
621
    } catch (NotImplemented e) {
622
  		fail("Could not get the object format list: " + e.getMessage());
623

    
624
    }
625
    
626
	}
627
	
628
  /**
629
   * Test getting a single object format from the registered list
630
   */
631
  public void testGetFormat() {
632
  	
633
    printTestHeader("testGetFormat");
634

    
635
    // make sure we are set up
636
    setUpFormats();
637
    
638
    String knownFormat = "text/plain";
639
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
640
    fmtid.setValue(knownFormat);
641
  	
642
    try {
643
	    
644
			String result = 
645
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
646
	  	System.out.println("Expected result: " + knownFormat);
647
	  	System.out.println("Found    result: " + result);
648
	  	assertTrue(result.equals(knownFormat));
649
  
650
    } catch (NullPointerException npe) {	  
651
	    fail("The returned format was null: " + npe.getMessage());
652
    
653
    } catch (NotFound nfe) {     
654
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
655
    	
656
    } catch (ServiceFailure sfe) {
657
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
658

    
659
    } catch (NotImplemented nie) {
660
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
661

    
662
    }
663
  	
664
  }
665
	
666
  /**
667
   * Test getting a non-existent object format, returning NotFound
668
   */
669
  public void testObjectFormatNotFoundException() {
670
  
671
    printTestHeader("testObjectFormatNotFoundException");
672

    
673
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
674
  	String badFormat = "text/bad-format";
675
  	fmtid.setValue(badFormat);
676
  	
677
  	try {
678
  		
679
	    ObjectFormat objectFormat = 
680
	    	CNodeService.getInstance(request).getFormat(fmtid);
681
      
682
  	} catch (Exception e) {
683
	    
684
  		assertTrue(e instanceof NotFound);
685
  	}
686
  	
687
  }
688
  
689
  public void readDeletedObject() {
690
      printTestHeader("testCreate");
691

    
692
      try {
693
          Session session = getCNSession();
694
          Identifier guid = new Identifier();
695
          guid.setValue("testCreate." + System.currentTimeMillis());
696
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
697
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
698
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
699
          assertEquals(guid, pid);
700
          
701
          Thread.sleep(3000);
702
          // use MN admin to delete
703
          session = getMNSession();
704
          Identifier deletedPid = CNodeService.getInstance(request).delete(session, pid);
705
          System.out.println("after deleting");
706
          assertEquals(pid.getValue(), deletedPid.getValue());
707
          // check that we cannot get the object
708
          session = getTestSession();
709
          InputStream deletedObject = null;
710
          try {
711
              //System.out.println("before read ===============");
712
              deletedObject = CNodeService.getInstance(request).get(session, deletedPid);
713
              //System.out.println("after read ===============");
714
          } catch (NotFound nf) {
715
              //System.out.println("the exception is1 "+nf.getMessage());
716
              //nf.printStackTrace();
717
              assertTrue(nf.getMessage().contains("deleted"));
718
          }
719
          try {
720
              //System.out.println("before read ===============");
721
              SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
722
              //System.out.println("after read ===============");
723
          } catch (NotFound nf) {
724
              //System.out.println("the exception is "+nf.getMessage());
725
              //nf.printStackTrace();
726
              assertTrue(nf.getMessage().contains("deleted"));
727
          }
728
          
729
          try {
730
              //System.out.println("before read ===============");
731
              DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, pid);
732
              //System.out.println("after read ===============");
733
          } catch (NotFound nf) {
734
              //System.out.println("the exception is "+nf.getMessage());
735
              //nf.printStackTrace();
736
              assertTrue(nf.getMessage().contains("deleted"));
737
          }
738
          
739
          try {
740
              //System.out.println("before read ===============");
741
              Checksum checksum = CNodeService.getInstance(request).getChecksum(session, pid);
742
              //System.out.println("after read ===============");
743
          } catch (NotFound nf) {
744
              //System.out.println("the exception 3 is "+nf.getMessage());
745
              //nf.printStackTrace();
746
              assertTrue(nf.getMessage().contains("deleted"));
747
          }
748
          
749
          try {
750
              //System.out.println("before read ===============");
751
              boolean isAuthorized = 
752
                      CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
753
              //System.out.println("after read ===============");
754
          } catch (NotFound nf) {
755
              //System.out.println("the exception 4 is "+nf.getMessage());
756
              //nf.printStackTrace();
757
              assertTrue(nf.getMessage().contains("deleted"));
758
          }
759
          
760
         
761
          
762
          assertNull(deletedObject);
763
      } catch(Exception e) {
764
          e.printStackTrace();
765
          fail("Unexpected error: " + e.getMessage());
766
      }
767
  }
768
  
769
  /**
770
   * Test the method - get api  for a speicified SID
771
   */
772
  public void testGetSID() {
773
      String str1 = "object1";
774
      String str2 = "object2";
775
      String str3 = "object3";
776
      try {
777
          //insert test documents with a series id
778
          Session session = getCNSession();
779
          Identifier guid = new Identifier();
780
          guid.setValue(generateDocumentId());
781
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
782
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
783
          String sid1= "sid."+System.nanoTime();
784
          Identifier seriesId = new Identifier();
785
          seriesId.setValue(sid1);
786
          System.out.println("the first sid is "+seriesId.getValue());
787
          sysmeta.setSeriesId(seriesId);
788
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
789
          System.out.println("the first pid is "+guid.getValue());
790
          //test the get(pid) for v2
791
          InputStream result = CNodeService.getInstance(request).get(session, guid);
792
          // go back to beginning of original stream
793
          object1.reset();
794
          // check
795
          assertTrue(object1.available() > 0);
796
          assertTrue(result.available() > 0);
797
          assertTrue(IOUtils.contentEquals(result, object1));
798
          // test the get(id) for v2
799
          InputStream result1 = CNodeService.getInstance(request).get(session, seriesId);
800
          object1.reset();
801
          // check
802
          assertTrue(object1.available() > 0);
803
          assertTrue(result1.available() > 0);
804
          assertTrue(IOUtils.contentEquals(result1, object1));
805
          //test the get(pid) for v1
806
          InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
807
          object1.reset();
808
          // check
809
          assertTrue(object1.available() > 0);
810
          assertTrue(result2.available() > 0);
811
          assertTrue(IOUtils.contentEquals(result2, object1));
812
          //test the get(sid) for v1
813
          try {
814
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
815
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
816
          } catch (NotFound ee) {
817
              
818
          }
819
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
820
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
821
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
822
          DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
823
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
824
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
825
          
826
          metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
827
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
828
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
829
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
830
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
831
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
832
          
833
          org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, guid);
834
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
835
          
836
          try {
837
              org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
838
              fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
839
          } catch(NotFound nf2) {
840
              
841
          }
842
          
843
          describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, guid);
844
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
845
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
846
          try {
847
              describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, seriesId);
848
              fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
849
          } catch(NotFound nf2) {
850
              
851
          }
852
          
853
          Checksum sum = CNodeService.getInstance(request).getChecksum(session, guid);
854
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
855
          
856
          try {
857
              sum = CNodeService.getInstance(request).getChecksum(session, seriesId);
858
              fail("the getCheckSum shouldn't work for sid");
859
          } catch(NotFound nf3) {
860
              
861
          }
862
          
863
          sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, guid);
864
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
865
          
866
          try {
867
              sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, seriesId);
868
              fail("the getCheckSum shouldn't work for sid");
869
          } catch(NotFound nf3) {
870
              
871
          }
872
          
873
          boolean isAuthorized = 
874
                  CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
875
          assertEquals(isAuthorized, true);
876
          
877
          isAuthorized = 
878
                  CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
879
          assertEquals(isAuthorized, true);
880
          
881
          isAuthorized = 
882
                  edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
883
          assertEquals(isAuthorized, true);
884
          
885
          try {
886
              isAuthorized = 
887
                      edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
888
              fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
889
          } catch (NotFound e) {
890
              
891
          }
892

    
893
          //do a update with the same series id
894
          Thread.sleep(1000);
895
          Identifier newPid = new Identifier();
896
          newPid.setValue(generateDocumentId()+"1");
897
          System.out.println("the second pid is "+newPid.getValue());
898
          InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
899
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
900
          newSysMeta.setObsoletes(guid);
901
          newSysMeta.setSeriesId(seriesId);
902
          //CNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
903
          CNodeService.getInstance(request).create(session, newPid, object2, newSysMeta);
904
          //update the system metadata of previous version.
905
          sysmeta.setObsoletedBy(newPid);
906
          SystemMetadata read = CNodeService.getInstance(request).getSystemMetadata(session, guid);
907
          BigInteger version = read.getSerialVersion();
908
          version = version.add(BigInteger.ONE);
909
          sysmeta.setSerialVersion(version);
910
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
911
          InputStream result4 = CNodeService.getInstance(request).get(session, guid);
912
          // go back to beginning of original stream
913
          object1.reset();
914
          // check
915
          assertTrue(object1.available() > 0);
916
          assertTrue(result4.available() > 0);
917
          assertTrue(IOUtils.contentEquals(result4, object1));
918
          
919
          InputStream result5 = CNodeService.getInstance(request).get(session, newPid);
920
          // go back to beginning of original stream
921
          object2.reset();
922
          // check
923
          assertTrue(object2.available() > 0);
924
          assertTrue(result5.available() > 0);
925
          assertTrue(IOUtils.contentEquals(result5, object2));
926
          
927

    
928
          InputStream result6 = CNodeService.getInstance(request).get(session, seriesId);
929
          object2.reset();
930
          // check
931
          assertTrue(object2.available() > 0);
932
          assertTrue(result6.available() > 0);
933
          assertTrue(IOUtils.contentEquals(result6, object2));
934
          //test the get(pid) for v1
935
          InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
936
          //System.out.println("+++++++++++++++++++++"+IOUtils.toString(result7));
937
          object1.reset();
938
          // check
939
          assertTrue(object1.available() > 0);
940
          assertTrue(result7.available() > 0);
941
          assertTrue(IOUtils.contentEquals(result7, object1));
942
          
943
          InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
944
          object2.reset();
945
          // check
946
          assertTrue(object2.available() > 0);
947
          assertTrue(result8.available() > 0);
948
          assertTrue(IOUtils.contentEquals(result8, object2));
949
          //test the get(sid) for v1
950
          try {
951
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
952
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
953
          } catch (NotFound ee) {
954
              
955
          }
956
          
957
          SystemMetadata metadata1 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
958
          assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
959
          assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
960
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
961
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
962
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
963
          
964
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
965
          assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
966
          assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
967
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
968
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
969
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
970
          
971
          SystemMetadata metadata3 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
972
          assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
973
          assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
974
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
975
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
976
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
977
          
978
          //do another update with different series id
979
          Thread.sleep(1000);
980
          String sid2 = "sid."+System.nanoTime();
981
          Identifier seriesId2= new Identifier();
982
          seriesId2.setValue(sid2);
983
          System.out.println("the second sid is "+seriesId2.getValue());
984
          Identifier newPid2 = new Identifier();
985
          newPid2.setValue(generateDocumentId()+"2");
986
          System.out.println("the third pid is "+newPid2.getValue());
987
          InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
988
          SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
989
          sysmeta3.setObsoletes(newPid);
990
          sysmeta3.setSeriesId(seriesId2);
991
          //CNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
992
          CNodeService.getInstance(request).create(session, newPid2, object3, sysmeta3);
993
          //update the system metadata of the previous version 
994
          newSysMeta.setObsoletedBy(newPid2);
995
          SystemMetadata read2 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
996
          BigInteger version2= read2.getSerialVersion();
997
          version2 = version2.add(BigInteger.ONE);
998
          newSysMeta.setSerialVersion(version2);
999
          CNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
1000
          
1001
          InputStream result9 = CNodeService.getInstance(request).get(session, guid);
1002
          // go back to beginning of original stream
1003
          object1.reset();
1004
          // check
1005
          assertTrue(object1.available() > 0);
1006
          assertTrue(result9.available() > 0);
1007
          assertTrue(IOUtils.contentEquals(result9, object1));
1008
          
1009
          InputStream result10 = CNodeService.getInstance(request).get(session, newPid);
1010
          // go back to beginning of original stream
1011
          object2.reset();
1012
          // check
1013
          assertTrue(object2.available() > 0);
1014
          assertTrue(result10.available() > 0);
1015
          assertTrue(IOUtils.contentEquals(result10, object2));
1016
          
1017
          
1018
          InputStream result11 = CNodeService.getInstance(request).get(session, newPid2);
1019
          // go back to beginning of original stream
1020
          object3.reset();
1021
          // check
1022
          assertTrue(object3.available() > 0);
1023
          assertTrue(result11.available() > 0);
1024
          assertTrue(IOUtils.contentEquals(result11, object3));
1025
          
1026
          InputStream result12 = CNodeService.getInstance(request).get(session, seriesId2);
1027
          object3.reset();
1028
          // check
1029
          assertTrue(object3.available() > 0);
1030
          assertTrue(result12.available() > 0);
1031
          assertTrue(IOUtils.contentEquals(result12, object3));
1032
          
1033
          InputStream result16 = CNodeService.getInstance(request).get(session, seriesId);
1034
          object2.reset();
1035
          // check
1036
          assertTrue(object2.available() > 0);
1037
          assertTrue(result16.available() > 0);
1038
          assertTrue(IOUtils.contentEquals(result16, object2));
1039
         
1040
          //test the get(pid) for v1
1041
          InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
1042
          object1.reset();
1043
          // check
1044
          assertTrue(object1.available() > 0);
1045
          assertTrue(result13.available() > 0);
1046
          assertTrue(IOUtils.contentEquals(result13, object1));
1047
          
1048
          InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
1049
          object2.reset();
1050
          // check
1051
          assertTrue(object2.available() > 0);
1052
          assertTrue(result14.available() > 0);
1053
          assertTrue(IOUtils.contentEquals(result14, object2));
1054
          
1055
          InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1056
          object3.reset();
1057
          // check
1058
          assertTrue(object3.available() > 0);
1059
          assertTrue(result15.available() > 0);
1060
          assertTrue(IOUtils.contentEquals(result15, object3));
1061
          
1062
          SystemMetadata metadata4 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1063
          assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1064
          assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1065
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
1066
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1067
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1068
          
1069
          SystemMetadata metadata5 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1070
          assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1071
          assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1072
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId2);
1073
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1074
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1075
          
1076
          SystemMetadata metadata6 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1077
          assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1078
          assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1079
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
1080
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1081
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1082
          
1083
          SystemMetadata metadata7 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1084
          assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1085
          assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1086
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
1087
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1088
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1089
          
1090
          SystemMetadata metadata8 = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1091
          assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1092
          assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1093
          describeResponse = CNodeService.getInstance(request).describe(session, newPid2);
1094
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1095
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1096
          
1097
          
1098
          
1099
          System.out.println("here===========================");
1100
          //test the get(sid) for v1
1101
          try {
1102
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1103
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1104
          } catch (NotFound ee) {
1105
              
1106
          }
1107
          
1108
          //test the get(sid) for v1
1109
          try {
1110
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId2);
1111
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1112
          } catch (NotFound ee) {
1113
              
1114
          }
1115
          
1116
          //test to get non-existing id for v2
1117
          try {
1118
           // the pid should be null when we try to get a no-exist sid
1119
              Identifier non_exist_sid = new Identifier();
1120
              non_exist_sid.setValue("no-sid-exist-123qwe");
1121
              InputStream result3 = CNodeService.getInstance(request).get(session, non_exist_sid);
1122
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1123
          } catch (NotFound ee) {
1124
              
1125
          }
1126
          
1127
          try {
1128
              // the pid should be null when we try to get a no-exist sid
1129
                 Identifier non_exist_sid = new Identifier();
1130
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1131
                 SystemMetadata result3 = CNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1132
                 fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1133
          } catch (NotFound ee) {
1134
                 
1135
          }
1136
          
1137
          try {
1138
              // the pid should be null when we try to get a no-exist sid
1139
                 Identifier non_exist_sid = new Identifier();
1140
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1141
                  CNodeService.getInstance(request).describe(session, non_exist_sid);
1142
                 fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1143
             } catch (NotFound ee) {
1144
                 
1145
             }
1146
          
1147
          
1148
          //do another update with invalid series ids
1149
          Thread.sleep(1000);
1150
          Identifier newPid3 = new Identifier();
1151
          newPid3.setValue(generateDocumentId()+"3");
1152
          System.out.println("the third pid is "+newPid3.getValue());
1153
          InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1154
          SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1155
          sysmeta4.setObsoletes(newPid2);
1156
          sysmeta4.setSeriesId(seriesId);
1157
          /*try {
1158
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1159
              fail("we can't reach here since the sid is using an old one ");
1160
          } catch (InvalidSystemMetadata eee) {
1161
              
1162
          } */
1163
          
1164
          /*sysmeta4.setSeriesId(newPid3);
1165
          try {
1166
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1167
              fail("we can't reach here since the sid is using the pid ");
1168
          } catch (InvalidSystemMetadata eee) {
1169
              
1170
          }*/
1171
          
1172
          //test archive a series id by v1
1173
          try {
1174
              edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1175
              fail("we can't reach here since the v1 archive method doesn't support the sid ");
1176
          } catch (NotFound nf2) {
1177
              
1178
          }
1179
          
1180
          // test delete a series id by v1
1181
          Session mnSession = getMNSession();
1182
          try {
1183
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).delete(mnSession, seriesId2);
1184
              fail("we can't reach here since the v1 delete method doesn't support the sid ");
1185
          } catch (NotFound nf2) {
1186
              
1187
          }
1188
          
1189
          // test archive a series id by v2
1190
          MNodeService.getInstance(request).archive(session, seriesId2);
1191
          SystemMetadata archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1192
          assertTrue(archived.getArchived());
1193
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1194
          assertTrue(archived.getArchived());
1195
          
1196
          // test delete a series id by v2
1197
          CNodeService.getInstance(request).delete(mnSession, seriesId2);
1198
          try {
1199
              CNodeService.getInstance(request).get(session, seriesId2);
1200
              fail("we can't reach here since the series id was deleted ");
1201
          } catch (NotFound nf3) {
1202
              System.out.println("the message is ============="+nf3.getMessage());
1203
              //assertTrue(nf3.getMessage().indexOf("delete") >0);
1204
          }
1205
          
1206
          try {
1207
              CNodeService.getInstance(request).get(session, newPid2);
1208
              fail("we can't reach here since the series id was deleted ");
1209
          } catch (NotFound nf3) {
1210
              //System.out.println("the message is ============="+nf3.getMessage());
1211
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1212
          }
1213
          
1214
          try {
1215
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1216
              fail("we can't reach here since the series id was deleted ");
1217
          } catch (NotFound nf3) {
1218
              System.out.println("the message is ============="+nf3.getMessage());
1219
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1220
          }
1221
          
1222
          //archive seriesId
1223
          MNodeService.getInstance(request).archive(mnSession, seriesId);
1224
          archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1225
          assertTrue(archived.getArchived());
1226
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1227
          assertTrue(archived.getArchived());
1228
          
1229
          
1230
          //delete seriesId
1231
          CNodeService.getInstance(request).delete(mnSession, seriesId);
1232
          try {
1233
              CNodeService.getInstance(request).get(session, newPid);
1234
              fail("we can't reach here since the series id was deleted ");
1235
          } catch (NotFound nf3) {
1236
              //System.out.println("the message is ============="+nf3.getMessage());
1237
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1238
          }
1239
          SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1240
          assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1241
          
1242
      } catch (Exception e) {
1243
          e.printStackTrace();
1244
          fail(e.getMessage());
1245
      }
1246
  }
1247
 
1248
  /**
1249
   * Test the listView methods.
1250
   * @throws Excpetion
1251
   */
1252
  public void testListViews() throws Exception {
1253
      OptionList list = CNodeService.getInstance(request).listViews();
1254
      assertTrue(list.sizeOptionList() >0);
1255
      List<String> names = list.getOptionList();
1256
      for(String name : names) {
1257
          System.out.println("It has the view named "+name);
1258
      }
1259
  }
1260
  
1261
  public void testUpdateSystemMetadata() throws Exception {
1262
          String str1 = "object1";
1263
          String str2 = "object2";
1264
          String str3 = "object3";
1265
  
1266
          Date date = new Date();
1267
          //insert test documents with a series id
1268
          Session session = getCNSession();
1269
          Identifier guid = new Identifier();
1270
          guid.setValue(generateDocumentId());
1271
          System.out.println("?????????????update the id without archive is "+guid.getValue());
1272
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1273
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1274
          String sid1= "sid."+System.nanoTime();
1275
          Identifier seriesId = new Identifier();
1276
          seriesId.setValue(sid1);
1277
          System.out.println("the first sid is "+seriesId.getValue());
1278
          sysmeta.setSeriesId(seriesId);
1279
          sysmeta.setArchived(false);
1280
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1281
          //Test the generating object succeeded. 
1282
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1283
          assertTrue(metadata.getIdentifier().equals(guid));
1284
          assertTrue(metadata.getArchived().equals(false));
1285
          System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
1286
          assertTrue(metadata.getSize().equals(sysmeta.getSize()));
1287
          
1288
          //test to fail to update system metadata by a non-cn subject
1289
          Session testSession = getTestSession();
1290
          SystemMetadata sysmeta1 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1291
          BigInteger version = sysmeta.getSerialVersion();
1292
          version = version.add(BigInteger.ONE);
1293
          sysmeta1.setSerialVersion(version);
1294
          AccessPolicy accessPolicy = new AccessPolicy();
1295
          AccessRule accessRule = new AccessRule();
1296
          accessRule.addPermission(Permission.WRITE);
1297
          Subject publicSubject = new Subject();
1298
          publicSubject.setValue("hello");
1299
          accessRule.addSubject(publicSubject);
1300
          accessPolicy.addAllow(accessRule);
1301
          AccessRule allow = new AccessRule();
1302
          allow.addPermission(Permission.READ);
1303
          Subject publicSubject2 = new Subject();
1304
          publicSubject2.setValue(Constants.SUBJECT_PUBLIC);
1305
          allow.addSubject(publicSubject2);
1306
          accessPolicy.addAllow(allow);
1307
          sysmeta1.setAccessPolicy(accessPolicy);
1308
          try {
1309
              CNodeService.getInstance(request).updateSystemMetadata(testSession, guid, sysmeta1);
1310
              fail("It shouldn't get there since the test session can't update system metadata");
1311
          } catch (NotAuthorized e) {
1312
              
1313
          }
1314
         
1315
          
1316
          //update system metadata sucessfully
1317
          SystemMetadata sysmeta1c = new SystemMetadata();
1318
          BeanUtils.copyProperties(sysmeta1c, sysmeta1);
1319
          sysmeta1c.setDateSysMetadataModified(date);
1320
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta1c);
1321
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1322
          assertTrue(metadata2.getIdentifier().equals(guid));
1323
          assertTrue(metadata2.getSeriesId().equals(seriesId));
1324
          //assertTrue(metadata2.getArchived().equals(true));
1325
          assertTrue(metadata2.getAccessPolicy().getAllowList().size() == 2);
1326
          assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
1327
          assertTrue(metadata2.getDateSysMetadataModified().getTime() == date.getTime());
1328
          
1329
          SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1330
          version = sysmeta2.getSerialVersion();
1331
          version = version.add(BigInteger.ONE);
1332
          sysmeta2.setSerialVersion(version);
1333
          Identifier newId = new Identifier();
1334
          newId.setValue("newValue");
1335
          sysmeta2.setIdentifier(newId);
1336
          try {
1337
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1338
              fail("We shouldn't get there");
1339
          } catch (Exception e) {
1340
              assertTrue(e instanceof InvalidRequest);
1341
          }
1342
          
1343
          newId.setValue("newValue");
1344
          sysmeta2.setSeriesId(newId);
1345
          try {
1346
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1347
              fail("We shouldn't get there");
1348
          } catch (Exception e) {
1349
              assertTrue(e instanceof InvalidRequest);
1350
          }
1351
          
1352
          Date newDate = new Date();
1353
          sysmeta2.setDateUploaded(newDate);
1354
          try {
1355
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1356
              fail("We shouldn't get there");
1357
          } catch (Exception e) {
1358
              assertTrue(e instanceof InvalidRequest);
1359
          }
1360
          
1361
          Checksum checkSum = new Checksum();
1362
          checkSum.setValue("12345");
1363
          sysmeta2.setChecksum(checkSum);
1364
          try {
1365
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1366
              fail("We shouldn't get there");
1367
          } catch (Exception e) {
1368
              assertTrue(e instanceof InvalidRequest);
1369
          }
1370
          
1371
          BigInteger size = new BigInteger("4000");
1372
          sysmeta2.setSize(size);
1373
          try {
1374
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1375
              fail("We shouldn't get there");
1376
          } catch (Exception e) {
1377
              assertTrue(e instanceof InvalidRequest);
1378
          }
1379
          
1380
          // test cn.updateSystemMetadata will ignore the serial version and replica list
1381
          Identifier id = new Identifier();
1382
          id.setValue(generateDocumentId());
1383
          System.out.println("?????????????update the id with archive is "+id.getValue());
1384
          object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1385
          SystemMetadata sysmeta10 = createSystemMetadata(id, session.getSubject(), object1);
1386
          List<Replica> replicas = new ArrayList<Replica>();
1387
          Replica replica1= new Replica();
1388
          NodeReference node1 = new NodeReference();
1389
          node1.setValue("node1");
1390
          replica1.setReplicaMemberNode(node1);
1391
          replica1.setReplicationStatus(ReplicationStatus.FAILED);
1392
          replica1.setReplicaVerified(date);
1393
          replicas.add(replica1);
1394
          Replica replica2= new Replica();
1395
          NodeReference node2 = new NodeReference();
1396
          node2.setValue("node2");
1397
          replica2.setReplicaMemberNode(node2);
1398
          replica2.setReplicationStatus(ReplicationStatus.FAILED);
1399
          replica2.setReplicaVerified(date);
1400
          replicas.add(replica2);
1401
          sysmeta10.setReplicaList(replicas);
1402
          sysmeta10.setArchived(false);
1403
          CNodeService.getInstance(request).create(session, id, object1, sysmeta10);
1404
          SystemMetadata result = CNodeService.getInstance(request).getSystemMetadata(session, id);
1405
          assertTrue(result.getIdentifier().equals(id));
1406
          System.out.println("the serial version is "+result.getSerialVersion().intValue());
1407
          assertTrue(result.getSerialVersion().intValue() == 1);
1408
          List<Replica> list1 = result.getReplicaList();
1409
          assertTrue(list1.size()==2);
1410
          assertTrue(result.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1411
          assertTrue(result.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1412
          assertTrue(result.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1413
          assertTrue(result.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1414
          assertTrue(result.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1415
          assertTrue(result.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1416
          assertTrue(result.getArchived() ==false);
1417
          
1418
          Date date2 = new Date();
1419
          SystemMetadata sysmeta11 = new SystemMetadata();
1420
          BeanUtils.copyProperties(sysmeta11, result);
1421
          List<Replica> replicaList = new ArrayList<Replica>();
1422
          Replica replica3= new Replica();
1423
          NodeReference node3 = new NodeReference();
1424
          node3.setValue("node3");
1425
          replica3.setReplicaMemberNode(node3);
1426
          replica3.setReplicationStatus(ReplicationStatus.COMPLETED);
1427
          replica3.setReplicaVerified(date2);
1428
          replicaList.add(replica3);
1429
          sysmeta11.setReplicaList(replicaList);
1430
          sysmeta11.setSerialVersion(BigInteger.TEN);
1431
          sysmeta11.setArchived(true);
1432
          
1433
          //make sure the sysmmeta11 has the new replca list and serial version
1434
          assertTrue(sysmeta11.getSerialVersion().equals(BigInteger.TEN));
1435
          assertTrue(sysmeta11.getReplicaList().size()==1);
1436
          assertTrue(sysmeta11.getReplica(0).getReplicaMemberNode().getValue().equals("node3"));
1437
          assertTrue(sysmeta11.getReplica(0).getReplicationStatus().equals(ReplicationStatus.COMPLETED));
1438
          assertTrue(sysmeta11.getReplica(0).getReplicaVerified().getTime() == date2.getTime());
1439
         
1440
          // update the system metadata with the new serial version and new replica list
1441
          // the new serial version and replica list should be ignored.
1442
          CNodeService.getInstance(request).updateSystemMetadata(session, id, sysmeta11);
1443
          SystemMetadata result2 = CNodeService.getInstance(request).getSystemMetadata(session, id);
1444
          assertTrue(result2.getIdentifier().equals(id));
1445
          assertTrue(result2.getSerialVersion().intValue() == 1);
1446
          List<Replica> list2 = result.getReplicaList();
1447
          assertTrue(list2.size()==2);
1448
          assertTrue(result2.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1449
          assertTrue(result2.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1450
          assertTrue(result2.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1451
          assertTrue(result2.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1452
          assertTrue(result2.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1453
          assertTrue(result2.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1454
          assertTrue(result2.getArchived() ==true);
1455
  }
1456
  
1457
  public void testArchive() throws Exception {
1458
      Session session = getCNSession();
1459
      Identifier guid = new Identifier();
1460
      guid.setValue("testArchive." + System.currentTimeMillis());
1461
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1462
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1463
      Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
1464
      try {
1465
          CNodeService.getInstance(request).archive(session, guid);
1466
      } catch (Exception e) {
1467
         e.printStackTrace();
1468
         if(e instanceof ServiceFailure) {
1469
          assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
1470
        } else {
1471
          fail("Unexpected error: " + e.getMessage());
1472
        }
1473
     }
1474
  }
1475
  
1476
  public void testExpandRighsHolder() throws Exception {
1477
      // set back to force it to use defaults
1478
       D1Client.setNodeLocator(null);
1479
       Subject rightsHolder = new Subject();
1480
       rightsHolder.setValue("CN=arctic-data-admins,DC=dataone,DC=org");
1481
       Subject user = new Subject();
1482
       
1483
       user.setValue("CN=Christopher Jones A2108,O=Google,C=US,DC=cilogon,DC=org");
1484
       assertTrue(D1NodeService.expandRightsHolder(rightsHolder, user));
1485
       
1486
       user.setValue("uid=foo");
1487
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1488
       
1489
       user.setValue("http://orcid.org/0000-0002-1586-0121");
1490
       assertTrue(D1NodeService.expandRightsHolder(rightsHolder, user));
1491
       
1492
       rightsHolder.setValue("CN=foo,,DC=dataone,DC=org");
1493
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1494
       
1495
       user.setValue("uid=foo");
1496
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1497
       
1498
       rightsHolder.setValue(null);
1499
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1500
       
1501
       rightsHolder.setValue("CN=foo,,DC=dataone,DC=org");
1502
       user.setValue(null);
1503
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1504
       
1505
       rightsHolder.setValue(null);
1506
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1507
       
1508
       rightsHolder.setValue("");
1509
       user.setValue("");
1510
       assertTrue(!D1NodeService.expandRightsHolder(rightsHolder, user));
1511
       NodeLocator nodeLocator = new NodeLocator() {
1512
           @Override
1513
           public D1Node getCNode() throws ClientSideException {
1514
               D1Node node = null;
1515
               try {
1516
                   node = new MockCNode();
1517
               } catch (IOException e) {
1518
                   throw new ClientSideException(e.getMessage());
1519
               }
1520
               return node;
1521
           }
1522
       };
1523
       D1Client.setNodeLocator(nodeLocator );
1524
   }
1525
  
1526
  public Session getMNSessionFromCN() throws NotImplemented, ServiceFailure {
1527
      Session session = new Session();
1528
      Subject subject = null;
1529
      CNode cn = D1Client.getCN();
1530
      System.out.println("the cn is "+cn.getNodeBaseServiceUrl());
1531
      List<Node> nodes = cn.listNodes().getNodeList();
1532
      System.out.println("the size of the list is "+nodes.size());
1533
      // find the first CN in the node list
1534
      for (Node node : nodes) {
1535
          if (node.getType().equals(NodeType.MN)) {
1536
              subject = node.getSubject(0);
1537
              break;
1538
          }
1539
      }
1540
      session.setSubject(subject);
1541
      return session;
1542
  }
1543
  
1544
}
(1-1/8)