Project

General

Profile

Download (13 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9
package eu.etaxonomy.cdm.remote.view;
10

    
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Set;
17

    
18
import org.apache.log4j.Logger;
19
import org.custommonkey.xmlunit.XMLUnit;
20
import org.hibernate.envers.RevisionType;
21
import org.joda.time.DateTime;
22
import org.joda.time.format.ISODateTimeFormat;
23
import org.junit.Before;
24
import org.junit.Test;
25
import org.springframework.mock.web.MockHttpServletRequest;
26
import org.springframework.mock.web.MockHttpServletResponse;
27
import org.springframework.oxm.Marshaller;
28
import org.unitils.UnitilsJUnit4;
29
import org.unitils.spring.annotation.SpringApplicationContext;
30
import org.unitils.spring.annotation.SpringBeanByName;
31
import org.unitils.spring.annotation.SpringBeanByType;
32

    
33
import com.github.dozermapper.core.Mapper;
34

    
35
import eu.etaxonomy.cdm.api.service.pager.Pager;
36
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
37
import eu.etaxonomy.cdm.common.URI;
38
import eu.etaxonomy.cdm.common.UriUtils;
39
import eu.etaxonomy.cdm.model.common.LSID;
40
import eu.etaxonomy.cdm.model.name.TaxonName;
41
import eu.etaxonomy.cdm.model.taxon.Taxon;
42
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
43
import eu.etaxonomy.cdm.model.view.AuditEvent;
44
import eu.etaxonomy.cdm.model.view.AuditEventRecord;
45
import eu.etaxonomy.cdm.model.view.AuditEventRecordImpl;
46
import eu.etaxonomy.cdm.remote.dto.oaipmh.DeletedRecord;
47
import eu.etaxonomy.cdm.remote.dto.oaipmh.Granularity;
48
import eu.etaxonomy.cdm.remote.dto.oaipmh.MetadataPrefix;
49
import eu.etaxonomy.cdm.remote.dto.oaipmh.ResumptionToken;
50
import eu.etaxonomy.cdm.remote.dto.oaipmh.SetSpec;
51
import eu.etaxonomy.cdm.remote.view.oaipmh.IdentifyView;
52
import eu.etaxonomy.cdm.remote.view.oaipmh.ListIdentifiersView;
53
import eu.etaxonomy.cdm.remote.view.oaipmh.ListMetadataFormatsView;
54
import eu.etaxonomy.cdm.remote.view.oaipmh.ListSetsView;
55
import eu.etaxonomy.cdm.remote.view.oaipmh.dc.GetRecordView;
56
import eu.etaxonomy.cdm.remote.view.oaipmh.dc.ListRecordsView;
57

    
58
@SpringApplicationContext("file:./target/test-classes/eu/etaxonomy/cdm/applicationContext-test.xml")
59
public class OaiPmhViewTest extends UnitilsJUnit4 {
60

    
61
    public static final Logger logger = Logger.getLogger(OaiPmhViewTest.class);
62

    
63
    @SpringBeanByName
64
    private Marshaller marshaller;
65

    
66
    @SpringBeanByType
67
    private Mapper mapper;
68

    
69
    private Map<String,Object> model;
70
    private IdentifyView identifyView;
71
    private GetRecordView getRecordView;
72
    private ListMetadataFormatsView listMetadataFormatsView;
73
    private ListSetsView listSetsView;
74
    private ListIdentifiersView listIdentifiersView;
75
    private ListRecordsView listRecordsView;
76
    private MockHttpServletRequest request;
77
    private MockHttpServletResponse response;
78

    
79
    private eu.etaxonomy.cdm.remote.view.oaipmh.rdf.GetRecordView rdfGetRecordView;
80

    
81
    private URI oaiServerURI;
82
    private static URI dozerXsdServerURI = URI.create("https://dozermapper.github.io/");  //for testing https://dozermapper.github.io/schema/bean-mapping.xsd
83

    
84
    @Before
85
    public void setUp() throws Exception {
86

    
87
        XMLUnit.setControlParser("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
88
        XMLUnit.setTestParser("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
89
        XMLUnit.setSAXParserFactory("org.apache.xerces.jaxp.SAXParserFactoryImpl");
90
        XMLUnit.setIgnoreWhitespace(true);
91

    
92
        model = new HashMap<>();
93
        identifyView = new IdentifyView();
94
        identifyView.setMarshaller(marshaller);
95

    
96
        getRecordView = new GetRecordView();
97
        getRecordView.setMarshaller(marshaller);
98
        getRecordView.setMapper(mapper);
99

    
100
        rdfGetRecordView = new eu.etaxonomy.cdm.remote.view.oaipmh.rdf.GetRecordView();
101
        rdfGetRecordView.setMarshaller(marshaller);
102
        rdfGetRecordView.setMapper(mapper);
103

    
104
        listMetadataFormatsView = new ListMetadataFormatsView();
105
        listMetadataFormatsView.setMarshaller(marshaller);
106

    
107
        listSetsView = new ListSetsView();
108
        listSetsView.setMarshaller(marshaller);
109

    
110
        listIdentifiersView = new ListIdentifiersView();
111
        listIdentifiersView.setMarshaller(marshaller);
112
        listIdentifiersView.setMapper(mapper);
113

    
114
        listRecordsView = new ListRecordsView();
115
        listRecordsView.setMarshaller(marshaller);
116
        listRecordsView.setMapper(mapper);
117

    
118
        request = new MockHttpServletRequest();
119

    
120
        oaiServerURI = new URI("http://memory.loc.gov");
121

    
122
        request.setServerName(oaiServerURI.toString());
123
        request.setServerPort(80);
124
        response = new MockHttpServletResponse();
125
    }
126

    
127
    @Test
128
    public void testIdentifyView() throws Exception {
129

    
130
        if(!oaiServiceIsAvailable()){
131
            return;
132
        }
133

    
134
        model.put("repositoryName", "Library of Congress Open Archive Initiative Repository 1");
135
        model.put("baseURL","http://memory.loc.gov/cgi-bin/oai");
136
        model.put("protocolVersion","2.0");
137
        model.put("deletedRecord",DeletedRecord.TRANSIENT);
138
        model.put("granularity",Granularity.YYYY_MM_DD_THH_MM_SS_Z);
139

    
140
        model.put("earliestDatestamp",ISODateTimeFormat.dateTimeParser().parseDateTime("1990-02-01T12:00:00Z"));
141
        model.put("adminEmail","somebody@loc.gov");
142
        model.put("description","<oai-identifier xmlns=\"http://www.openarchives.org/OAI/2.0/oai-identifier\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.openarchives.org/OAI/2.0/oai-identifier  http://www.openarchives.org/OAI/2.0/oai-identifier.xsd\"><scheme>oai</scheme><repositoryIdentifier>lcoa1.loc.gov</repositoryIdentifier><delimiter>:</delimiter><sampleIdentifier>oai:lcoa1.loc.gov:loc.music/musdi.002</sampleIdentifier></oai-identifier>");
143

    
144
        request.setRequestURI("/cgi-bin/oai?verb=Identify");
145

    
146
        identifyView.render(model, request, response);
147
//		String resource = "/eu/etaxonomy/cdm/remote/view/oaipmh/IdentifyView.xml";
148
//		System.out.println(new String(response.getContentAsByteArray()));
149
//		XMLAssert.assertXMLEqual(new InputStreamReader(this.getClass().getResourceAsStream(resource)),new StringReader(new String(response.getContentAsByteArray())));
150
    }
151

    
152
    @Test
153
    public void testGetRecordView() throws Exception {
154

    
155
        if(!oaiServiceIsAvailable() || !dozerXsdIsAvailable()){
156
            return;
157
        }
158

    
159
        Taxon taxon = Taxon.NewInstance((TaxonName)null, null);
160
        taxon.setTitleCache("TitleCache", true);
161
        taxon.setCreated(new DateTime());
162
        taxon.setLsid(new LSID("urn:lsid:example.org:taxonconcepts:1"));
163

    
164
        AuditEventRecord<Taxon> auditEventRecord = new AuditEventRecordImpl<Taxon>(new Object[] {taxon, new AuditEvent(),RevisionType.ADD});
165

    
166
        model.put("object", auditEventRecord);
167

    
168
        request.setRequestURI("/cgi-bin/oai?verb=GetRecord&identifier=urn:lsid:example.org:taxonconcepts:1&metadataPrefix=oai_dc");
169
        getRecordView.render(model, request, response);
170
//		System.out.println(new String(response.getContentAsByteArray()));
171
    }
172

    
173
    @Test
174
    public void testRdfGetRecordView() throws Exception {
175

    
176
        if(!oaiServiceIsAvailable() || !dozerXsdIsAvailable()){
177
            return;
178
        }
179

    
180
        Taxon taxon = Taxon.NewInstance(null, null);
181
        taxon.setTitleCache("TitleCache", true);
182
        taxon.setCreated(new DateTime());
183
        taxon.setLsid(new LSID("urn:lsid:example.org:taxonconcepts:1"));
184

    
185
        AuditEventRecord<Taxon> auditEventRecord = new AuditEventRecordImpl<Taxon>(new Object[] {taxon, new AuditEvent(),RevisionType.ADD});
186

    
187
        model.put("object", auditEventRecord);
188

    
189
        request.setRequestURI("/cgi-bin/oai?verb=GetRecord&identifier=urn:lsid:example.org:taxonconcepts:1&metadataPrefix=rdf");
190
        rdfGetRecordView.render(model, request, response);
191
        //System.out.println(new String(response.getContentAsByteArray()));
192
    }
193

    
194
    @Test
195
    public void testListMetadataFormatsView() throws Exception {
196

    
197
        if(!oaiServiceIsAvailable()){
198
            return;
199
        }
200

    
201
        request.setRequestURI("/cgi-bin/pdataprov?verb=ListMetadataFormats&identifier=oai:perseus.tufts.edu:Perseus:text:1999.02.0119");
202
        listMetadataFormatsView.render(model, request, response);
203
        //System.out.println(new String(response.getContentAsByteArray()));
204
    }
205

    
206
    @Test
207
    public void testListSetsView() throws Exception {
208

    
209
        if(!oaiServiceIsAvailable()){
210
            return;
211
        }
212

    
213
        request.setRequestURI("/OAI-script?verb=ListSets");
214
        Set<SetSpec> sets = new HashSet<SetSpec>();
215
        sets.add(SetSpec.TAXON);
216
        sets.add(SetSpec.SYNONYM);
217
        model.put("sets",sets);
218
        listSetsView.render(model, request, response);
219
//		System.out.println(new String(response.getContentAsByteArray()));
220
    }
221

    
222
    @Test
223
    public void testListIdentifiersView() throws Exception {
224

    
225
        if(!oaiServiceIsAvailable() || !dozerXsdIsAvailable()){
226
            return;
227
        }
228

    
229
        model.put("metadataPrefix", MetadataPrefix.OAI_DC);
230

    
231
        DateTime from = new DateTime(1990,2,1,12,0,0, 0);
232
        DateTime until = new DateTime();
233
        model.put("from",from);
234
        model.put("until", until);
235

    
236
        List<AuditEventRecord<TaxonBase>> r = new ArrayList<>();
237
        for(int i = 0; i < 10; i++) {
238
            TaxonBase<?> taxon = Taxon.NewInstance(null, null);
239
            taxon.setTitleCache("TitleCache", true);
240
            taxon.setCreated(new DateTime());
241
            taxon.setLsid(new LSID("urn:lsid:example.org:taxonconcepts:"+i));
242
            if((i % 3) == 0 ) {
243
                AuditEventRecord<TaxonBase> auditEventRecord = new AuditEventRecordImpl<>(new Object[] {taxon, new AuditEvent(), RevisionType.DEL});
244
                r.add(auditEventRecord);
245
            } else {
246
                AuditEventRecord<TaxonBase> auditEventRecord = new AuditEventRecordImpl<>(new Object[] {taxon, new AuditEvent(), RevisionType.ADD});
247
                r.add(auditEventRecord);
248
            }
249
        }
250
        Pager<AuditEventRecord<TaxonBase>> results = new DefaultPagerImpl<>(0, Long.valueOf(100), 10, r);
251
        model.put("pager", results);
252
        ResumptionToken resumptionToken = new ResumptionToken(results, from, until, MetadataPrefix.OAI_DC, null);
253
        model.put("resumptionToken",resumptionToken);
254
        listIdentifiersView.render(model, request, response);
255
//		System.out.println(new String(response.getContentAsByteArray()));
256
    }
257

    
258
    @Test
259
    public void testListRecordsView() throws Exception {
260

    
261
        if(!oaiServiceIsAvailable() || !dozerXsdIsAvailable()){
262
            return;
263
        }
264

    
265
        model.put("metadataPrefix", MetadataPrefix.OAI_DC);
266

    
267
        DateTime from = new DateTime(1990,2,1,12,0,0, 0);
268
        DateTime until = new DateTime();
269
        model.put("from",from);
270
        model.put("until", until);
271

    
272
        List<AuditEventRecord<TaxonBase>> r = new ArrayList<>();
273
        for(int i = 0; i < 10; i++) {
274
            TaxonBase<?> taxon = Taxon.NewInstance(null, null);
275
            taxon.setTitleCache("TitleCache", true);
276
            taxon.setCreated(new DateTime());
277
            taxon.setLsid(new LSID("urn:lsid:example.org:taxonconcepts:"+i));
278
            if((i % 3) == 0 ) {
279
                AuditEventRecord<TaxonBase> auditEventRecord = new AuditEventRecordImpl<>(new Object[] {taxon, new AuditEvent(), RevisionType.DEL});
280
                r.add(auditEventRecord);
281
            } else {
282
                AuditEventRecord<TaxonBase> auditEventRecord = new AuditEventRecordImpl<>(new Object[] {taxon, new AuditEvent(), RevisionType.ADD});
283
                r.add(auditEventRecord);
284
            }
285
        }
286
        Pager<AuditEventRecord<TaxonBase>> results = new DefaultPagerImpl<>(0, Long.valueOf(100), 10, r);
287
        model.put("pager", results);
288
        ResumptionToken resumptionToken = new ResumptionToken(results, from, until, MetadataPrefix.OAI_DC, null);
289
        model.put("resumptionToken",resumptionToken);
290
        listRecordsView.render(model, request, response);
291
        //System.out.println(new String(response.getContentAsByteArray()));
292
    }
293

    
294
    private boolean oaiServiceIsAvailable() {
295
        if(!UriUtils.isServiceAvailable(oaiServerURI)) {
296
            logger.warn("Service " + oaiServerURI.toString() + " unavailable");
297
            return false;
298
        } else {
299
            return true;
300
        }
301
    }
302

    
303
    public static boolean dozerXsdIsAvailable() {
304
        // dozer requires access to dozer.sourceforge.net to test schema (.xsd/.dtd)
305
        if(!UriUtils.isServiceAvailable(dozerXsdServerURI)) {
306
            logger.warn("Service " + dozerXsdServerURI.toString() + " unavailable");
307
            return false;
308
        } else {
309
            return true;
310
        }
311
    }
312
}
(2-2/3)