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: berkley $'
8
 *     '$Date: 2010-05-03 14:26:08 -0700 (Fri, 14 Aug 2009) $'
9
 * '$Revision: 5027 $'
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
import java.util.*;
29
import java.io.*;
30

    
31
import java.security.MessageDigest;
32

    
33
import edu.ucsb.nceas.MCTestCase;
34
import edu.ucsb.nceas.metacat.IdentifierManager;
35
import edu.ucsb.nceas.metacat.client.MetacatAuthException;
36
import edu.ucsb.nceas.metacat.client.MetacatException;
37
import edu.ucsb.nceas.metacat.client.MetacatInaccessibleException;
38
import edu.ucsb.nceas.metacat.dataone.CrudService;
39
import junit.framework.Test;
40
import junit.framework.TestSuite;
41

    
42
import org.apache.log.LogEvent;
43
import org.dataone.service.exceptions.InvalidRequest;
44
import org.dataone.service.exceptions.InvalidToken;
45
import org.dataone.service.exceptions.NotAuthorized;
46
import org.dataone.service.exceptions.NotImplemented;
47
import org.dataone.service.exceptions.ServiceFailure;
48
import org.dataone.service.types.*;
49

    
50
import edu.ucsb.nceas.metacat.properties.PropertyService;
51
import edu.ucsb.nceas.metacat.client.rest.MetacatRestClient;
52

    
53
import edu.ucsb.nceas.metacat.service.SessionService;
54
import edu.ucsb.nceas.metacat.util.SessionData;
55

    
56
/**
57
 * A JUnit test for testing the dataone CrudService class
58
 */
59
public class CrudServiceTest extends MCTestCase 
60
{   
61
    /**
62
    * consstructor for the test
63
    */
64
    public CrudServiceTest(String name)
65
    {
66
        super(name);
67
    }
68
  
69
    /**
70
	 * Establish a testing framework by initializing appropriate objects
71
	 */
72
	public void setUp() throws Exception 
73
	{
74
		super.setUp();
75
	}
76

    
77
	/**
78
	 * Release any objects after tests are complete
79
	 */
80
	public void tearDown() 
81
	{
82
	}
83

    
84
	/**
85
	 * Create a suite of tests to be run together
86
	 */
87
	public static Test suite() 
88
	{
89
		TestSuite suite = new TestSuite();
90
		suite.addTest(new CrudServiceTest("initialize"));
91
		suite.addTest(new CrudServiceTest("testSingletonAccessor"));
92
		suite.addTest(new CrudServiceTest("testCreateAndGet"));
93
		suite.addTest(new CrudServiceTest("testGetSystemMetadata"));
94
		suite.addTest(new CrudServiceTest("testUpdate"));
95
		suite.addTest(new CrudServiceTest("testListObjects"));
96
		suite.addTest(new CrudServiceTest("testAccessControl"));
97
		suite.addTest(new CrudServiceTest("testGenerateMissingSystemMetadata"));
98
		suite.addTest(new CrudServiceTest("testGetLogRecords"));
99
		suite.addTest(new CrudServiceTest("testChecksumError"));
100
		return suite;
101
	}
102
	
103
	/**
104
	 * test for an error where the checksum algorithm gets appended onto the checksum.
105
	 */
106
	public void testChecksumError()
107
	{
108
	    printTestHeader("testChecksumError");
109
	    try
110
	    {
111
	        Date d1 = new Date();
112
	        CrudService cs = CrudService.getInstance();
113
	        AuthToken token = getToken();
114
	        ObjectFormat of1 = ObjectFormat.convert("eml://ecoinformatics.org/eml-2.1.0");
115
	        //create docs at different times
116

    
117
	        Identifier id = new Identifier();
118
	        String docid = generateDocumentId();
119
	        id.setValue(docid);
120

    
121
	        //create the system metadata then run the create method
122
	        String testDoc = getTestDoc();
123
	        StringBufferInputStream sbis = new StringBufferInputStream(testDoc);
124
	        SystemMetadata sm = createSystemMetadata(id, testDoc, of1);
125
	        assertFalse(sm.getChecksum().getValue().startsWith("MD5"));
126
	        //create the doc
127
	        Identifier idC = cs.create(token, id, sbis, sm);
128
	        assertTrue(idC.getValue().equals(id.getValue()));
129
	        SystemMetadata smC = getSystemMetadata(token, idC);
130
	        assertFalse(smC.getChecksum().getValue().startsWith("MD5"));
131
	        
132
	        Date d2 = new Date();
133
	        ObjectList ol = cs.listObjects(token, d1, d2, of1);
134
	        assertTrue(ol.sizeObjectInfoList() == 1);
135
	        ObjectInfo oi = ol.getObjectInfo(0);
136
	        //this will fail if the error state exists.
137
	        assertFalse(oi.getChecksum().getValue().startsWith("MD5"));
138
	    }
139
	    catch(Exception e)
140
	    {
141
	        fail("Unexpected exception: " + e.getMessage());
142
	    }
143
        
144
	}
145
	
146
	/**
147
	 * test CrudService.getLogRecords
148
	 */
149
	public void testGetLogRecords()
150
	{
151
	    printTestHeader("testGetLogRecords");
152
	    try
153
	    {
154
	        CrudService cs = CrudService.getInstance();
155
	        AuthToken token = getToken();
156
	        Date fromDate = new Date();
157
	        Identifier id = createDoc(token, getTestDoc());
158
	        Date toDate = new Date();
159
	        Log lrs = cs.getLogRecords(token, fromDate, toDate);
160
	        assertNotNull(lrs);
161
	        assertTrue(lrs.sizeLogEntryList() == 1);
162
	        LogEntry lrLogEvent = lrs.getLogEntry(0);
163
	        assertTrue(lrLogEvent.getEvent().name().equals("CREATE"));
164
	    }
165
	    catch(Exception e)
166
	    {
167
	        e.printStackTrace();
168
	        fail("testGetLogRecords threw an unexpected exception: " + e.getMessage());
169
	    }
170
	}
171
	
172
	/**
173
	 * test the generation of system metadata for docs that don't already 
174
	 * have it.  This will be used for migration of existing object stores
175
	 * to dataone.
176
	 */
177
	public void testGenerateMissingSystemMetadata()
178
	{
179
	    printTestHeader("testGenerateMissingSystemMetadata");
180
	    try
181
	    {
182
	        CrudService cs = CrudService.getInstance();
183
	        AuthToken token = getToken();
184
	        //create a document with no system metadata
185
	        String testDoc = getTestDoc();
186
	        Identifier id = new Identifier();
187
	        String docid = generateDocumentId();
188
	        id.setValue(docid);
189
	        
190
	        cs.insertOrUpdateDocument(testDoc, id, cs.getSessionData(token), "insert");
191
	        //try to get its system metadata, should fail
192
	        try
193
	        {
194
	            getSystemMetadata(token, id);
195
	            fail("call to getSystemMetadata should have failed.");
196
	        }
197
	        catch(Exception e)
198
	        {}
199
	        
200
	        //generate missing system metadata
201
	        cs.generateMissingSystemMetadata(token);
202
	        //try to get system metadata again, should succeed
203
	        getSystemMetadata(token, id);
204
	    }
205
	    catch(Exception e)
206
	    {
207
	        fail("Unexpected error generating missing system metadata: " + e.getMessage());
208
	    }
209
	}
210
	
211
	/**
212
	 * make sure that only valid sessions can update/delete
213
	 */
214
	public void testAccessControl()
215
	{
216
	    printTestHeader("testAccessControl");
217
        try
218
        {
219
            CrudService cs = CrudService.getInstance();
220
            AuthToken token = getToken();
221
            //create a doc
222
            Identifier id = createDoc(token, getTestDoc());
223
            
224
            //get the doc and sysmetadata
225
            String gotDoc = getDoc(token, id);
226
            SystemMetadata sm = getSystemMetadata(token, id);
227
            
228
            //break the session id
229
            String sessionid = "somefakesessionid";
230
            token = new AuthToken(sessionid);
231
            
232
            //update the doc
233
            gotDoc = gotDoc.replaceAll("XXX", "YYY");
234
            Identifier newid = new Identifier();
235
            newid.setValue(generateDocumentId());
236
            StringBufferInputStream sbis = new StringBufferInputStream(gotDoc);
237
            SystemMetadata newsm = createSystemMetadata(newid, gotDoc);
238
            Identifier updatedid = cs.update(token, newid, sbis, id, newsm);
239
            fail("exception should have been thrown.");
240
        }
241
        catch(Exception e)
242
        {
243
        }
244
        
245
        try
246
        {
247
            CrudService cs = CrudService.getInstance();
248
            AuthToken token = new AuthToken("somefakesessionid");
249
            //create a doc
250
            Identifier id = createDoc(token, getTestDoc());
251
            fail("exception should have been thrown.");
252
        }
253
        catch(Exception e)
254
        {
255
        }
256
	}
257
	
258
	/**
259
	 * public ObjectList listObjects(AuthToken token, Date startTime, Date endTime, 
260
     *     ObjectFormat objectFormat, boolean replicaStatus, int start, int count)
261
     *       throws NotAuthorized, InvalidRequest, NotImplemented, ServiceFailure, InvalidToken
262
	 */
263
	public void testListObjects()
264
	{
265
	    printTestHeader("testListObjects");
266
	    try
267
	    {
268
	        CrudService cs = CrudService.getInstance();
269
	        AuthToken token = getToken();
270
	        ObjectFormat of1 = ObjectFormat.convert("eml://ecoinformatics.org/eml-2.1.0");
271
	        ObjectFormat of2 = ObjectFormat.convert("eml://ecoinformatics.org/eml-2.0.0");
272
	        //create docs at different times
273
	        Date d1 = new Date();
274
	        Identifier id1 = createDoc(token, getTestDoc(), of1);
275
            SystemMetadata sm1 = getSystemMetadata(token, id1);
276
            
277
            Date d2 = new Date();
278
            Identifier id2 = createDoc(token, getTestDoc(), of2);
279
            SystemMetadata sm2 = getSystemMetadata(token, id2);
280
            
281
            Date d3 = new Date();
282
            Identifier id3 = createDoc(token, getTestDoc(), of1);
283
            SystemMetadata sm3 = getSystemMetadata(token, id3);
284
              
285
            Date d4 = new Date();
286
            Identifier id4 = createDoc(token, getTestDoc(), of2);
287
            SystemMetadata sm4 = getSystemMetadata(token, id4);
288
            
289
            Date d5 = new Date();
290
            Identifier id5 = createDoc(token, getTestDoc(), of1);
291
            SystemMetadata sm5 = getSystemMetadata(token, id5);  
292
             
293
            Date d6 = new Date();
294
            
295
            //now get the objects for specific time ranges and test that it returns
296
            //the correct objects
297
            
298
            ObjectList list = cs.listObjects(token, null, null, null);
299
            //System.out.println("list size: " + list.sizeObjectInfoList());
300
           
301
            //should return sm1 and sm2
302
            ObjectList list1 = cs.listObjects(token, d1, d3, null);
303
            assertTrue(list1.sizeObjectInfoList() == 2);
304
            assertTrue(idInObjectList(id1, list1));
305
            assertTrue(idInObjectList(id2, list1));
306
            
307
            ObjectInfo info = list1.getObjectInfo(0);
308
            
309
            
310
            //should only return sm1
311
            ObjectList list2 = cs.listObjects(token, d1, d3, of1);
312
            assertTrue(list2.sizeObjectInfoList() == 1);
313
            assertTrue(idInObjectList(id1, list2));
314
            
315
            //should return sm1-sm4
316
            ObjectList list3 = cs.listObjects(token, d1, d5, null);
317
            assertTrue(list3.sizeObjectInfoList() == 4);
318
            ObjectInfo oi4 = list3.getObjectInfo(0);
319
            assertTrue(idInObjectList(id1, list3));
320
            assertTrue(idInObjectList(id2, list3));
321
            assertTrue(idInObjectList(id3, list3));
322
            assertTrue(idInObjectList(id4, list3));
323
            
324
            //should only return sm2 and sm4
325
            ObjectList list4 = cs.listObjects(token, d1, d5, of2);
326
            assertTrue(list4.sizeObjectInfoList() == 2);
327
            assertTrue(idInObjectList(id2, list4));
328
            assertTrue(idInObjectList(id4, list4));
329
            
330
            //should return all
331
            ObjectList list5 = cs.listObjects(token, d1, d6, null);
332
            assertTrue(list5.sizeObjectInfoList() == 5);
333
            assertTrue(idInObjectList(id1, list5));
334
            assertTrue(idInObjectList(id2, list5));
335
            assertTrue(idInObjectList(id3, list5));
336
            assertTrue(idInObjectList(id4, list5));
337
            assertTrue(idInObjectList(id5, list5));
338
            
339
            //should return 1, 3, 5
340
            ObjectList list6 = cs.listObjects(token, d1, d6, of1);
341
            assertTrue(list6.sizeObjectInfoList() == 3);
342
            assertTrue(idInObjectList(id1, list6));
343
            assertTrue(idInObjectList(id3, list6));
344
            assertTrue(idInObjectList(id5, list6));
345
            
346
	    }
347
	    catch(Exception e)
348
	    {
349
	        //e.printStackTrace();
350
	        fail("Error in listObjects: " + e.getMessage());
351
	    }
352
	}
353
	
354
	private boolean idInObjectList(Identifier id, ObjectList list)
355
	{
356
	    for(int i=0; i<list.sizeObjectInfoList(); i++)
357
	    {
358
	        ObjectInfo oi = list.getObjectInfo(i);
359
	        if(id.getValue().equals(oi.getIdentifier().getValue()))
360
	            return true;
361
	    }
362
	    return false;
363
	}
364
	
365
	/**
366
	 * public Identifier update(AuthToken token, Identifier guid, 
367
     *       InputStream object, Identifier obsoletedGuid, SystemMetadata sysmeta) 
368
     *         throws InvalidToken, ServiceFailure, NotAuthorized, IdentifierNotUnique, 
369
     *           UnsupportedType, InsufficientResources, NotFound, InvalidSystemMetadata, 
370
     *           NotImplemented
371
	 */
372
	public void testUpdate()
373
	{
374
	    printTestHeader("testUpdate");
375
	    try
376
	    {
377
	        CrudService cs = CrudService.getInstance();
378
	        AuthToken token = getToken();
379
            //create a doc
380
            Identifier id = createDoc(token, getTestDoc());
381
            
382
            //get the doc and sysmetadata
383
            String gotDoc = getDoc(token, id);
384
            SystemMetadata sm = getSystemMetadata(token, id);
385
            
386
            //update the doc
387
            gotDoc = gotDoc.replaceAll("XXX", "YYY");
388
            Identifier newid = new Identifier();
389
            newid.setValue(generateDocumentId());
390
            StringBufferInputStream sbis = new StringBufferInputStream(gotDoc);
391
            SystemMetadata newsm = createSystemMetadata(newid, gotDoc);
392
            Identifier updatedid = cs.update(token, newid, sbis, id, newsm);
393
            
394
            //get doc - check that it matches update
395
            String newdoc = getDoc(token, newid);
396
            assertTrue(gotDoc.equals(newdoc));
397
            
398
            //get sysmeta - check that ids and other fields are updated
399
            SystemMetadata newnewsm = getSystemMetadata(token, id);
400
            assertTrue(newnewsm.getObsoletedBy(0).getValue().equals(newid.getValue()));
401
            
402
            //get the new sysmeta and make sure the obsoletes field is set
403
            SystemMetadata newnewnewsm = getSystemMetadata(token, newid);
404
            assertTrue(newnewnewsm.getObsolete(0).getValue().equals(id.getValue()));
405
        }
406
        catch(Exception e)
407
        {
408
            e.printStackTrace();
409
            fail("Error in testUpdate: " + e.getMessage());
410
        }
411
	}
412
	
413
	/**
414
	 * public SystemMetadata getSystemMetadata(AuthToken token, Identifier guid)
415
     *       throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, 
416
     *       InvalidRequest, NotImplemented
417
	 */
418
	public void testGetSystemMetadata()
419
	{
420
	    printTestHeader("testGetSystemMetadata");
421
	    try
422
	    {
423
            CrudService cs = CrudService.getInstance();
424
            AuthToken token = getToken();
425
            //run create
426
            Identifier id = createDoc(token, getTestDoc());
427
            //get the systemMetadata and make sure it is the correct object for this testDoc
428
            SystemMetadata sm = getSystemMetadata(token, id);
429
            assertTrue(sm.getIdentifier().getValue().equals(id.getValue()));
430
            assertTrue(sm.getChecksum().getValue().equals(checksum(getTestDoc())));
431
            
432
            try
433
            {
434
                Identifier fakeid = new Identifier();
435
                fakeid.setValue("somethingfake.234234");
436
                getSystemMetadata(token, fakeid);
437
                fail("getSystemMetadata should have thrown an exception.");
438
            }
439
            catch(Exception e)
440
            {
441
                assertTrue(true);
442
            }
443
        }
444
        catch(Exception e)
445
        {
446
            e.printStackTrace();
447
            fail("Error testing system metadata: " + e.getMessage());
448
        }
449
	}
450
	
451
	/**
452
	 * create(AuthToken token, Identifier guid, InputStream object, SystemMetadata sysmeta) 
453
     *   throws InvalidToken, ServiceFailure, NotAuthorized, IdentifierNotUnique, UnsupportedType, 
454
     *       InsufficientResources, InvalidSystemMetadata, NotImplemented
455
     *
456
     * public InputStream get(AuthToken token, Identifier guid)
457
     *       throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, 
458
     *       NotImplemented
459
	 */
460
	public void testCreateAndGet()
461
	{
462
	    printTestHeader("testCreateAndGet");
463
	    try
464
	    {
465
	        CrudService cs = CrudService.getInstance();
466
	        AuthToken token = getToken();
467
	        //run create
468
	        Identifier id = createDoc(token, getTestDoc());
469
	        //make these docs public for debugging purposes.
470
	        makeDocPublic(id, true);
471
            //compare the docs
472
            String gotDoc = getDoc(token, id);
473
            assertTrue(gotDoc.trim().equals(getTestDoc().trim()));
474
            
475
            try
476
            {
477
                Identifier fakeid = new Identifier();
478
                fakeid.setValue("somethingfake.234234");
479
                getDoc(token, fakeid);
480
                fail("testCreateAndGet should have thrown an exception.");
481
            }
482
            catch(Exception e)
483
            {
484
                assertTrue(true);
485
            }
486
        }
487
        catch(Exception e)
488
        {
489
            e.printStackTrace();
490
            fail("Error in testCreate: " + e.getMessage());
491
        }
492
	}
493

    
494
	/**
495
	 * getInstance()
496
	 */
497
	public void testSingletonAccessor()
498
	{
499
	    printTestHeader("testSingletonAccessor");
500
	    CrudService cs = CrudService.getInstance();
501
	    assertNotNull(cs);
502
	}
503
	
504
	/**
505
	 * Run an initial test that always passes to check that the test harness is
506
	 * working.
507
	 */
508
	public void initialize() 
509
	{
510
	    printTestHeader("initialize");
511
		assertTrue(1 == 1);
512
	}
513
	
514
	/**
515
	 * return the systemMetadata object for id
516
	 */
517
	private SystemMetadata getSystemMetadata(AuthToken token, Identifier id)
518
	  throws Exception
519
	{
520
	    CrudService cs = CrudService.getInstance();
521
	    return cs.getSystemMetadata(token, id);
522
	}
523
	
524
	/**
525
	 * get a doc from metacat using CrudService.get()
526
	 */
527
	private String getDoc(AuthToken token, Identifier id)
528
	  throws Exception
529
	{
530
	    CrudService cs = CrudService.getInstance();
531
	    //try to get the same doc then compare them
532
        InputStream gotDocStream = cs.get(token, id);
533
        StringBuffer sb = new StringBuffer();
534
        byte[] b = new byte[1024];
535
        int numread = gotDocStream.read(b, 0, 1024);
536
        while(numread != -1)
537
        {
538
            sb.append(new String(b, 0, numread));
539
            numread = gotDocStream.read(b, 0, 1024);
540
        }
541
        return sb.toString();
542
	}
543
	
544
	/**
545
	 * return a test document
546
	 */
547
	private String getTestDoc()
548
	{
549
	    return "<?xml version=\"1.0\"?><test><somecontent>This is some content XXX</somecontent></test>\n";
550
	}
551
	
552
	/**
553
	 * authenticate and return a token
554
	 */
555
	private AuthToken getToken()
556
	  throws Exception
557
	{
558
	    CrudService cs = CrudService.getInstance();
559
        //login and get a sessionid
560
        MetacatRestClient restClient = new MetacatRestClient(cs.getContextUrl());
561
        String username = PropertyService.getProperty("test.mcUser");
562
        String password = PropertyService.getProperty("test.mcPassword");
563
        String response = restClient.login(username, password);
564
        String sessionid = restClient.getSessionId();
565
        SessionService sessionService = SessionService.getInstance();
566
        sessionService.registerSession(new SessionData(sessionid, username, new String[0], password, "CrudServiceLogin"));
567
        AuthToken token = new AuthToken(sessionid);
568
        return token;
569
	}
570
	
571
	/**
572
	 * create a doc using CrudService.create() and return its id
573
	 */
574
	private Identifier createDoc(AuthToken token, String testDoc) throws Exception
575
	{
576
	    return createDoc(token, testDoc, ObjectFormat.convert("eml://ecoinformatics.org/eml-2.1.0"));
577
	}
578
	
579
	/**
580
	 * create a doc using CrudService.create() and return its id
581
	 */
582
	private Identifier createDoc(AuthToken token, String testDoc, ObjectFormat format) throws Exception
583
	{
584
	    Identifier id;
585
        CrudService cs = CrudService.getInstance();
586
        
587
        id = new Identifier();
588
        String docid = generateDocumentId();
589
        id.setValue(docid);
590
        
591
        //create the system metadata then run the create method
592
        StringBufferInputStream sbis = new StringBufferInputStream(testDoc);
593
        SystemMetadata sm = createSystemMetadata(id, testDoc, format);
594
        //create the doc
595
        cs.create(token, id, sbis, sm);
596
        return id;
597
	}
598
	
599
	/**
600
	 * create a generic SystemMetadata object for testing
601
	 */
602
	private SystemMetadata createSystemMetadata(Identifier id, String testDoc)
603
	  throws Exception
604
	{
605
	    return createSystemMetadata(id, testDoc, 
606
	            ObjectFormat.convert("eml://ecoinformatics.org/eml-2.1.0"));
607
	}
608
	
609
	/**
610
	 * create system metadata with a specified id, doc and format
611
	 */
612
	private SystemMetadata createSystemMetadata(Identifier id, String testDoc, ObjectFormat format)
613
	  throws Exception
614
	{
615
	    SystemMetadata sm = new SystemMetadata();
616
        //set the id
617
        sm.setIdentifier(id);
618
        sm.setObjectFormat(format);
619
        //create the checksum
620
        String checksumS = checksum(testDoc);
621
        ChecksumAlgorithm ca = ChecksumAlgorithm.convert("MD5");
622
        Checksum checksum = new Checksum();
623
        checksum.setValue(checksumS);
624
        checksum.setAlgorithm(ca);
625
        sm.setChecksum(checksum);
626
        //set the size
627
        sm.setSize(testDoc.getBytes().length);
628
        //submitter
629
        Principal p = new Principal();
630
        p.setValue("joe");
631
        sm.setSubmitter(p);
632
        sm.setRightsHolder(p);
633
        sm.setDateUploaded(new Date());
634
        sm.setDateSysMetadataModified(new Date());
635
        NodeReference nr = new NodeReference();
636
        nr.setValue("metacat");
637
        sm.setOriginMemberNode(nr);
638
        sm.setAuthoritativeMemberNode(nr);
639
        return sm;
640
	}
641
	
642
	/**
643
	 *  make a document public in metacat by inserting an access document
644
	 * @param id
645
	 */
646
	private void makeDocPublic(Identifier id, boolean systemMetadataToo)
647
	  throws Exception
648
	{
649
	    CrudService cs = CrudService.getInstance();
650
	    IdentifierManager im = IdentifierManager.getInstance();
651
	    cs.setAccess(getToken(), id, "public", "read", "allow", "allowFirst");
652
	    if(systemMetadataToo)
653
	    {
654
	        String smidS = im.getSystemMetadataId(id.getValue());
655
	        Identifier smid = new Identifier();
656
	        smid.setValue(smidS);
657
	        cs.setAccess(getToken(), smid, "public", "read", "allow", "allowFirst");
658
	    }
659
	}
660
	
661
	/**
662
	 * print a header to start each test
663
	 */
664
	private void printTestHeader(String testName)
665
	{
666
	    System.out.println();
667
	    System.out.println("*************** " + testName + " ***************");
668
	}
669
  
670
	/**
671
	 * produce an md5 checksum for item
672
	 */
673
	private String checksum(String item)
674
	  throws Exception
675
	{
676
        StringBufferInputStream fis =  new StringBufferInputStream(item);
677
        
678
        byte[] buffer = new byte[1024];
679
        MessageDigest complete = MessageDigest.getInstance("MD5");
680
        int numRead;
681
        
682
        do 
683
        {
684
          numRead = fis.read(buffer);
685
          if (numRead > 0) 
686
          {
687
            complete.update(buffer, 0, numRead);
688
          }
689
        } while (numRead != -1);
690
        
691
        
692
        return getHex(complete.digest());
693
	}
694
	
695
	/**
696
	 * convert a byte array to a hex string
697
	 */
698
	private static String getHex( byte [] raw ) 
699
	{
700
	    final String HEXES = "0123456789ABCDEF";
701
        if ( raw == null ) {
702
          return null;
703
        }
704
        final StringBuilder hex = new StringBuilder( 2 * raw.length );
705
        for ( final byte b : raw ) {
706
          hex.append(HEXES.charAt((b & 0xF0) >> 4))
707
             .append(HEXES.charAt((b & 0x0F)));
708
        }
709
        return hex.toString();
710
    }
711
}
(1-1/2)