3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.ext
.bci
;
12 import java
.io
.BufferedReader
;
13 import java
.io
.IOException
;
14 import java
.io
.InputStream
;
15 import java
.io
.InputStreamReader
;
16 import java
.net
.HttpURLConnection
;
17 import java
.net
.MalformedURLException
;
19 import java
.net
.URISyntaxException
;
21 import java
.util
.ArrayList
;
22 import java
.util
.HashMap
;
23 import java
.util
.List
;
26 import org
.apache
.commons
.lang
.StringUtils
;
27 import org
.apache
.http
.HttpException
;
28 import org
.apache
.http
.NameValuePair
;
29 import org
.apache
.http
.message
.BasicNameValuePair
;
30 import org
.apache
.log4j
.Logger
;
31 import org
.springframework
.stereotype
.Component
;
33 import com
.ibm
.lsid
.MalformedLSIDException
;
35 import eu
.etaxonomy
.cdm
.api
.application
.ICdmApplicationConfiguration
;
36 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
37 import eu
.etaxonomy
.cdm
.common
.UriUtils
;
38 import eu
.etaxonomy
.cdm
.ext
.common
.SchemaAdapterBase
;
39 import eu
.etaxonomy
.cdm
.ext
.common
.ServiceWrapperBase
;
40 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
41 import eu
.etaxonomy
.cdm
.model
.common
.LSID
;
42 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
43 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
44 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
48 * This service allows to query the Biodiversity collection index {@link http://www.biodiversitycollectionsindex.org}
50 * @created Aug 16, 2010
55 public class BciServiceWrapper
extends ServiceWrapperBase
<Collection
> implements IBciServiceWrapper
{
56 private static final Logger logger
= Logger
.getLogger(BciServiceWrapper
.class);
58 private enum ServiceType
{
65 // private URL serviceUrl;
67 // ******************************** CONSTRUCTOR **************************************
71 // * Creates new instance of this factory and connects it to the given
72 // * CDM Community Stores access point.
74 // * Typically, there is no need to instantiate this class.
76 // protected IpniService(URL webserviceUrl){
77 // this.serviceUrl = webserviceUrl;
80 // ****************************** METHODS ****************************************************/
87 public List
<Collection
> getCollectionsByCode(String code
, ICdmApplicationConfiguration appConfig
){
89 SchemaAdapterBase
<Collection
> schemaAdapter
= schemaAdapterMap
.get("recordSchema");
90 if(schemaAdapter
== null){
91 logger
.error("No SchemaAdapter found for " + "recordSchema");
94 String SruOperation
= "searchRetrieve";
96 List
<NameValuePair
> pairs
= new ArrayList
<NameValuePair
>();
97 pairs
.add(new BasicNameValuePair("code", SruOperation
));
99 Map
<String
, String
> requestHeaders
= new HashMap
<String
, String
>();
100 requestHeaders
.put("Accept-Charset", "UTF-8");
103 URI requestUri
= createUri(null, pairs
);
106 InputStream stream
= executeHttpGet(requestUri
, requestHeaders
);
107 return schemaAdapter
.getCmdEntities(stream
);
109 } catch (IOException e
) {
110 // thrown by doHttpGet
112 } catch (URISyntaxException e
) {
113 // thrown by createUri
115 } catch (HttpException e
){
116 // thrown by createUri
124 code
= normalizeParameter(code
);
125 String request
= code
;
127 return (List
)queryService(request
, appConfig
, getServiceUrl(IBciServiceWrapper
.LOOKUP_CODE_REST
), ServiceType
.AUTHOR
);
136 private List
<?
extends IdentifiableEntity
> queryService(String request
, ICdmApplicationConfiguration appConfig
, URL serviceUrl
, ServiceType serviceType
){
138 // create the request url
139 URL newUrl
= new URL(serviceUrl
.getProtocol(),
140 serviceUrl
.getHost(),
141 serviceUrl
.getPort(),
145 HttpURLConnection connection
= (HttpURLConnection
) newUrl
.openConnection();
146 // set the accept property to XML so we can use jdom to handle the content
147 //connection.setRequestProperty("Accept", "text/xml");
150 logger
.info("Firing request for URL: " + newUrl
);
152 int responseCode
= connection
.getResponseCode();
154 // get the content at the resource
155 InputStream content
= (InputStream
) connection
.getContent();
158 List
<?
extends IdentifiableEntity
> result
;
159 if (serviceType
.equals(ServiceType
.AUTHOR
)){
160 result
= buildCollectionList(content
, appConfig
);
161 }else if (serviceType
.equals(ServiceType
.NAME
)){
168 if(responseCode
== HttpURLConnection
.HTTP_OK
){
170 }else if(responseCode
== HttpURLConnection
.HTTP_MULT_CHOICE
){
173 //TODO error handling
174 logger
.error("No Http_OK");
177 } catch (IOException e
) {
178 logger
.error("No content for request: " + request
);
186 private List
<Collection
> buildCollectionList(InputStream content
, ICdmApplicationConfiguration appConfig
) throws IOException
{
187 List
<Collection
> result
= new ArrayList
<Collection
>();
188 BufferedReader reader
= new BufferedReader (new InputStreamReader(content
));
190 String headerLine
= reader
.readLine();
192 String line
= reader
.readLine();
193 while (StringUtils
.isNotBlank(line
)){
194 Collection collection
= getCollectionFromLine(line
, appConfig
);
195 result
.add(collection
);
196 line
= reader
.readLine();
203 private Collection
getCollectionFromLine(String line
, ICdmApplicationConfiguration appConfig
) {
204 //urn:lsid:biocol.org:col:15727 http://biocol.org/urn:lsid:biocol.org:col:15727 University of Bergen Herbarium
205 String
[] splits
= line
.split("\t");
206 if (splits
.length
!= 3){
207 logger
.warn("Unknwon BCI line format: " + line
);
210 String lsidString
= splits
[0];
211 String urlString
= splits
[1];
212 String collectionName
= splits
[2];
214 Collection result
= Collection
.NewInstance();
219 lsid
= new LSID(lsidString
);
220 } catch (MalformedLSIDException e
) {
221 logger
.warn("Malformed LSID " + lsidString
, e
);
224 result
.setLsid(lsid
);
225 String id
= getCollectionId(lsid
);
227 result
.setName(collectionName
);
230 Reference citation
= getBciCitation(appConfig
);
231 result
.addSource(id
, null, citation
, null);
238 private String
getCollectionId(LSID lsid
) {
239 String result
= lsid
== null?
null : lsid
.getObject();
244 private Reference
getBciCitation(ICdmApplicationConfiguration appConfig
) {
245 Reference bciReference
;
246 if (appConfig
!= null){
247 bciReference
= appConfig
.getReferenceService().find(uuidBci
);
248 if (bciReference
== null){
249 bciReference
= getNewBciReference();
250 bciReference
.setUuid(uuidBci
);
251 appConfig
.getReferenceService().save(bciReference
);
254 bciReference
= getNewBciReference();
262 private Reference
getNewBciReference() {
263 Reference bciReference
;
264 bciReference
= ReferenceFactory
.newDatabase();
265 bciReference
.setTitleCache("Biodiversity Collection Index (BCI))");
273 private String
normalizeParameter(String parameter
) {
274 String result
= CdmUtils
.Nz(parameter
).replace(" ", "+");
283 * @return the serviceUrl
285 public URL
getServiceUrl(String url
) {
288 serviceUrl
= new URL(url
);
289 } catch (MalformedURLException e
) {
290 throw new RuntimeException("This should not happen", e
);