Project

General

Profile

Download (7.92 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2013 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.ext.occurrence.bioCase;
10

    
11
import java.io.IOException;
12
import java.io.InputStream;
13
import java.net.URI;
14
import java.util.ArrayList;
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
18

    
19
import javax.xml.parsers.DocumentBuilder;
20
import javax.xml.parsers.DocumentBuilderFactory;
21
import javax.xml.parsers.ParserConfigurationException;
22

    
23
import org.apache.http.NameValuePair;
24
import org.apache.http.client.ClientProtocolException;
25
import org.apache.http.client.entity.UrlEncodedFormEntity;
26
import org.apache.http.message.BasicNameValuePair;
27
import org.jdom.Document;
28
import org.jdom.output.Format;
29
import org.jdom.output.XMLOutputter;
30
import org.springframework.stereotype.Service;
31
import org.springframework.transaction.annotation.Transactional;
32
import org.w3c.dom.Element;
33
import org.w3c.dom.Node;
34
import org.w3c.dom.NodeList;
35
import org.xml.sax.SAXException;
36

    
37
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
38
import eu.etaxonomy.cdm.common.UriUtils;
39
import eu.etaxonomy.cdm.ext.common.ServiceWrapperBase;
40
import eu.etaxonomy.cdm.ext.occurrence.OccurenceQuery;
41
import eu.etaxonomy.cdm.model.location.NamedArea;
42
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
43
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
44

    
45
/**
46
 * This service provides access to BioCASe providers.<br>
47
 * It sends a {@link OccurenceQuery} via HTTP POST to a given provider
48
 * @author pplitzner
49
 \* @since 13.09.2013
50
 *
51
 */
52

    
53
@Service
54
@Transactional(readOnly = true)
55
public class BioCaseQueryServiceWrapper extends ServiceWrapperBase<SpecimenOrObservationBase<?>>{
56

    
57
    private static final BasicNameValuePair SUBMIT_PARAM = new BasicNameValuePair("Submit", "Submit");
58
    private static final String QUERY_PARAM_NAME = "query";
59
    private static final BasicNameValuePair CAPABILITY_TEST_PARAM = new BasicNameValuePair("capabilities", "1");
60

    
61
    /**
62
     * Queries the BioCASE provider at the given endPoint with the given {@link OccurenceQuery}.<br>
63
     * @param query the query object which stores all the query parameters
64
     * @param endPoint If <code>null</code> then the default endPoint is used
65
     *  (<i>http://ww3.bgbm.org/biocase/pywrapper.cgi?dsa=Herbar</i>)
66
     * @return The response as an {@link InputStream}
67
     */
68
    public InputStream query(OccurenceQuery query, URI endPoint) throws ClientProtocolException, IOException{
69
        if(endPoint==null){
70
            logger.warn("URI for querying was null.");
71
            return null;
72
        }
73
        if(UriUtils.isServiceAvailable(endPoint, 10000)){
74
            //check capabilities for ABCD version
75
            Map<String, String> requestHeaders = new HashMap<String, String>();
76
            requestHeaders.put(CAPABILITY_TEST_PARAM.getName(), CAPABILITY_TEST_PARAM.getValue());
77
            InputStream response = executeHttpGet(endPoint, requestHeaders);
78
            String abcdSchema = parseAbcdSchemaVersion(response);
79

    
80
            //build XML query
81
            Document doc = BioCaseQueryGenerator.generateXMLQuery(query, abcdSchema);
82
            String xmlOutputString = new XMLOutputter(Format.getPrettyFormat()).outputString(doc);
83

    
84
            //POST parameters
85
            List<NameValuePair> queryParamsPOST = new ArrayList<NameValuePair>();
86
            queryParamsPOST.add(SUBMIT_PARAM);
87
            addNameValuePairTo(queryParamsPOST, QUERY_PARAM_NAME, xmlOutputString);
88
            UrlEncodedFormEntity httpEntity = new UrlEncodedFormEntity(queryParamsPOST);
89

    
90
            //Query provider
91
            logger.debug("Querying BioCASE service with " + endPoint + ", POST: " + queryParamsPOST);
92
            //FIXME do the ABCD import here
93
            return executeHttpPost(endPoint, null, httpEntity);
94
        }
95
        else{
96
            logger.error("Querying " + endPoint + " got a timeout!");
97
            return null;
98
        }
99
    }
100

    
101
    public String parseAbcdSchemaVersion(InputStream inputStream){
102
        String errorMessage = "Unable to parse ABCD version.";
103
        String schemaVersion = null;
104

    
105
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
106
        DocumentBuilder builder;
107
        try {
108
            builder = factory.newDocumentBuilder();
109
            org.w3c.dom.Document document = builder.parse(inputStream);
110
            Element root = document.getDocumentElement();
111
            NodeList supportedSchemasList = root.getElementsByTagName("biocase:SupportedSchemas");
112
            if(supportedSchemasList!=null){
113
                for(int i=0;i<supportedSchemasList.getLength();i++){
114
                    Node supportedSchema = supportedSchemasList.item(i);
115
                    if(supportedSchema instanceof Element){
116
                        schemaVersion = ((Element) supportedSchema).getAttribute("namespace");
117
                    }
118
                }
119
            }
120
        } catch (ParserConfigurationException e) {
121
            logger.error(errorMessage, e);
122
        } catch (SAXException e) {
123
            logger.error(errorMessage, e);
124
        } catch (IOException e) {
125
            logger.error(errorMessage, e);
126
        }
127

    
128
        return schemaVersion;
129
    }
130

    
131
    public List<SpecimenOrObservationBase<?>> dummyData(){
132
        List<SpecimenOrObservationBase<?>> results = new ArrayList<SpecimenOrObservationBase<?>>();
133
        DerivedUnitFacade unit1 = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
134
//        newInstance.setTitleCache("Test Specimen", true);
135
        unit1.setCollectingMethod("Collected from the ground");
136
        unit1.setAccessionNumber("ACC-12345");
137
        unit1.setLocality("locality");
138
        unit1.setCountry(NamedArea.EUROPE());
139

    
140
        DerivedUnitFacade unit2 = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
141
        unit1.setTitleCache("Test Specimen 2", false);
142
        unit2.setCollectingMethod("Collected from the ground");
143
        unit2.setAccessionNumber("ACC-67890");
144
        unit2.setLocality("solid ground close to car park");
145
        unit2.setCountry(NamedArea.EUROPE());
146
        results.add(unit1.innerDerivedUnit());
147
        results.add(unit2.innerDerivedUnit());
148
        return results;
149
    }
150

    
151
    /**
152
     * @param query
153
     * @param endPoint
154
     * @return
155
     */
156
    public InputStream querySiblings(OccurenceQuery query, URI endPoint) throws ClientProtocolException, IOException{
157
        if(endPoint==null){
158
            logger.warn("URI for querying was null.");
159
            return null;
160
        }
161
        if(UriUtils.isServiceAvailable(endPoint, 10000)){
162
            //check capabilities for ABCD version
163
            Map<String, String> requestHeaders = new HashMap<String, String>();
164
            requestHeaders.put(CAPABILITY_TEST_PARAM.getName(), CAPABILITY_TEST_PARAM.getValue());
165
            InputStream response = executeHttpGet(endPoint, requestHeaders);
166
            String abcdSchema = parseAbcdSchemaVersion(response);
167

    
168
            //build XML query
169
            Document doc = BioCaseQueryGenerator.generateXMLQueryForSiblings(query, abcdSchema);
170
            String xmlOutputString = new XMLOutputter(Format.getPrettyFormat()).outputString(doc);
171

    
172
            //POST parameters
173
            List<NameValuePair> queryParamsPOST = new ArrayList<NameValuePair>();
174
            queryParamsPOST.add(SUBMIT_PARAM);
175
            addNameValuePairTo(queryParamsPOST, QUERY_PARAM_NAME, xmlOutputString);
176
            UrlEncodedFormEntity httpEntity = new UrlEncodedFormEntity(queryParamsPOST);
177

    
178
            //Query provider
179
            logger.debug("Querying BioCASE service with " + endPoint + ", POST: " + queryParamsPOST);
180
            //FIXME do the ABCD import here
181
            return executeHttpPost(endPoint, null, httpEntity);
182
        }
183
        else{
184
            logger.error("Querying " + endPoint + " got a timeout!");
185
            return null;
186
        }
187
    }
188
}
(2-2/3)