Project

General

Profile

Download (8.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 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.bci;
10

    
11
import java.io.BufferedReader;
12
import java.io.IOException;
13
import java.io.InputStream;
14
import java.io.InputStreamReader;
15
import java.net.HttpURLConnection;
16
import java.net.MalformedURLException;
17
import java.net.URI;
18
import java.net.URISyntaxException;
19
import java.net.URL;
20
import java.util.ArrayList;
21
import java.util.HashMap;
22
import java.util.List;
23
import java.util.Map;
24

    
25
import org.apache.commons.lang.StringUtils;
26
import org.apache.http.NameValuePair;
27
import org.apache.http.message.BasicNameValuePair;
28
import org.apache.log4j.Logger;
29
import org.springframework.stereotype.Component;
30

    
31
import com.ibm.lsid.MalformedLSIDException;
32

    
33
import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
34
import eu.etaxonomy.cdm.common.CdmUtils;
35
import eu.etaxonomy.cdm.ext.common.SchemaAdapterBase;
36
import eu.etaxonomy.cdm.ext.common.ServiceWrapperBase;
37
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
38
import eu.etaxonomy.cdm.model.common.LSID;
39
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
40
import eu.etaxonomy.cdm.model.occurrence.Collection;
41
import eu.etaxonomy.cdm.model.reference.Reference;
42
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
43

    
44

    
45
/**
46
* This service allows to query the Biodiversity collection index {@link http://www.biodiversitycollectionsindex.org}
47
* @author a.mueller
48
* @created Aug 16, 2010
49
* @version 1.0
50
 *
51
 */
52
@Component
53
public class BciServiceWrapper extends ServiceWrapperBase<Collection> implements IBciServiceWrapper{
54
	private static final Logger logger = Logger.getLogger(BciServiceWrapper.class);
55

    
56
	 private enum ServiceType{
57
		 AUTHOR,
58
		 NAME,
59
		 PUBLICATION,
60
	 }
61

    
62

    
63
//	private URL serviceUrl;
64

    
65
// ******************************** CONSTRUCTOR **************************************
66

    
67

    
68
//	/**
69
//	 * Creates new instance of this factory and connects it to the given
70
//	 * CDM Community Stores access point.
71
//	 *
72
//	 * Typically, there is no need to instantiate this class.
73
//	 */
74
//	protected IpniService(URL webserviceUrl){
75
//		this.serviceUrl = webserviceUrl;
76
//	}
77

    
78
// ****************************** METHODS ****************************************************/
79

    
80
	/**
81
	 *
82
	 * @param restRequest
83
	 * @return
84
	 */
85
	@Override
86
    public List<Collection> getCollectionsByCode(String code, ICdmApplicationConfiguration appConfig){
87

    
88
		SchemaAdapterBase<Collection> schemaAdapter = schemaAdapterMap.get("recordSchema");
89
		if(schemaAdapter == null){
90
			logger.error("No SchemaAdapter found for " + "recordSchema");
91
		}
92

    
93
		String SruOperation = "searchRetrieve";
94

    
95
		List<NameValuePair> pairs = new ArrayList<NameValuePair>();
96
		pairs.add(new BasicNameValuePair("code", SruOperation));
97

    
98
		Map<String, String> requestHeaders = new HashMap<String, String>();
99
		requestHeaders.put("Accept-Charset", "UTF-8");
100

    
101
		try {
102
			URI requestUri = createUri(null, pairs);
103

    
104

    
105
			InputStream stream = executeHttpGet(requestUri, requestHeaders);
106
			return schemaAdapter.getCmdEntities(stream);
107

    
108
		} catch (IOException e) {
109
			// thrown by doHttpGet
110
			logger.error(e);
111
		} catch (URISyntaxException e) {
112
			// thrown by createUri
113
			logger.error(e);
114
		}
115

    
116
//		return null;
117

    
118

    
119

    
120
		code = normalizeParameter(code);
121
		String request = code;
122

    
123
		return (List)queryService(request, appConfig, getServiceUrl(IBciServiceWrapper.LOOKUP_CODE_REST), ServiceType.AUTHOR);
124
	}
125

    
126

    
127
	/**
128
	 *
129
	 * @param restRequest
130
	 * @return
131
	*/
132
	private List<? extends IdentifiableEntity> queryService(String request, ICdmApplicationConfiguration appConfig, URL serviceUrl, ServiceType serviceType){
133
		try {
134
            // create the request url
135
            URL newUrl = new URL(serviceUrl.getProtocol(),
136
                                                     serviceUrl.getHost(),
137
                                                     serviceUrl.getPort(),
138
                                                     serviceUrl.getPath()
139
                                                     + "" + request);
140
            // open a connection
141
            HttpURLConnection connection = (HttpURLConnection) newUrl.openConnection();
142
            // set the accept property to XML so we can use jdom to handle the content
143
            //connection.setRequestProperty("Accept", "text/xml");
144

    
145

    
146
            logger.info("Firing request for URL: " + newUrl);
147

    
148
            int responseCode = connection.getResponseCode();
149

    
150
            // get the content at the resource
151
            InputStream content = (InputStream) connection.getContent();
152

    
153
            // build the result
154
            List<? extends IdentifiableEntity> result;
155
            if (serviceType.equals(ServiceType.AUTHOR)){
156
            	result = buildCollectionList(content, appConfig);
157
            }else if (serviceType.equals(ServiceType.NAME)){
158
            	//
159
            	result = null;
160
            }else{
161
            	//
162
            	result = null;
163
            }
164
            if(responseCode == HttpURLConnection.HTTP_OK){
165
                    return result;
166
            }else if(responseCode == HttpURLConnection.HTTP_MULT_CHOICE){
167
                    return result;
168
            }else{
169
                //TODO error handling
170
            	logger.error("No Http_OK");
171
            }
172

    
173
        } catch (IOException e) {
174
                logger.error("No content for request: " + request);
175
        }
176

    
177
        // error
178
        return null;
179
    }
180

    
181

    
182
	private List<Collection> buildCollectionList(InputStream content, ICdmApplicationConfiguration appConfig) throws IOException {
183
		List<Collection> result = new ArrayList<Collection>();
184
		BufferedReader reader = new BufferedReader (new InputStreamReader(content));
185

    
186
		String headerLine = reader.readLine();
187

    
188
		String line = reader.readLine();
189
		while (StringUtils.isNotBlank(line)){
190
			Collection collection = getCollectionFromLine(line, appConfig);
191
			result.add(collection);
192
			line = reader.readLine();
193
		}
194

    
195
		return result;
196
	}
197

    
198

    
199
	private Collection getCollectionFromLine(String line, ICdmApplicationConfiguration appConfig) {
200
		//urn:lsid:biocol.org:col:15727	http://biocol.org/urn:lsid:biocol.org:col:15727	University of Bergen Herbarium
201
		String[] splits = line.split("\t");
202
		if (splits.length != 3){
203
			logger.warn("Unknwon BCI line format: " + line);
204
			return null;
205
		}
206
		String lsidString = splits[0];
207
		String urlString = splits[1];
208
		String collectionName = splits[2];
209

    
210
		Collection result = Collection.NewInstance();
211

    
212
		//LSID
213
		LSID lsid = null;
214
		try {
215
			lsid = new LSID(lsidString);
216
		} catch (MalformedLSIDException e) {
217
			logger.warn("Malformed LSID " + lsidString, e);
218
		}
219

    
220
		result.setLsid(lsid);
221
		String id = getCollectionId(lsid);
222

    
223
		result.setName(collectionName);
224

    
225
		//id, citation
226
		Reference citation = getBciCitation(appConfig);
227
		result.addSource(OriginalSourceType.Lineage, id, null, citation, null);
228

    
229

    
230
		return result;
231
	}
232

    
233

    
234
	private String getCollectionId(LSID lsid) {
235
		String result = lsid == null? null : lsid.getObject();
236
		return result;
237
	}
238

    
239

    
240
	private Reference getBciCitation(ICdmApplicationConfiguration appConfig) {
241
		Reference bciReference;
242
		if (appConfig != null){
243
			bciReference = appConfig.getReferenceService().find(uuidBci);
244
			if (bciReference == null){
245
				bciReference = getNewBciReference();
246
				bciReference.setUuid(uuidBci);
247
				appConfig.getReferenceService().save(bciReference);
248
			}
249
		}else{
250
			bciReference = getNewBciReference();
251
		}
252
		return bciReference;
253
	}
254

    
255
	/**
256
	 * @return
257
	 */
258
	private Reference getNewBciReference() {
259
		Reference bciReference;
260
		bciReference = ReferenceFactory.newDatabase();
261
		bciReference.setTitleCache("Biodiversity Collection Index (BCI))");
262
		return bciReference;
263
	}
264

    
265

    
266
	/**
267
	 * @param parameter
268
	 */
269
	private String normalizeParameter(String parameter) {
270
		String result = CdmUtils.Nz(parameter).replace(" ", "+");
271
		return result;
272
	}
273

    
274

    
275

    
276
	/**
277
	 * The service url
278
	 *
279
	 * @return the serviceUrl
280
	 */
281
	@Override
282
    public URL getServiceUrl(String url) {
283
		URL serviceUrl;
284
		try {
285
			serviceUrl = new URL(url);
286
		} catch (MalformedURLException e) {
287
			throw new RuntimeException("This should not happen", e);
288
		}
289
		return serviceUrl;
290
	}
291

    
292

    
293

    
294
}
(2-2/3)