Project

General

Profile

1
package eu.dnetlib.functionality.modular.ui.oai;
2

    
3
import com.google.common.base.Joiner;
4
import eu.dnetlib.functionality.modular.ui.oai.objects.OaiRequest;
5
import eu.dnetlib.functionality.modular.ui.oai.objects.ResponseDetails;
6
import eu.dnetlib.miscutils.datetime.DateUtils;
7
import org.apache.commons.lang.math.NumberUtils;
8
import org.apache.commons.logging.Log;
9
import org.apache.commons.logging.LogFactory;
10
import org.apache.http.HttpStatus;
11
import org.apache.http.client.methods.CloseableHttpResponse;
12
import org.apache.http.client.methods.HttpGet;
13
import org.apache.http.impl.client.HttpClients;
14
import org.dom4j.Document;
15
import org.dom4j.Node;
16
import org.dom4j.io.SAXReader;
17
import org.springframework.core.io.ClassPathResource;
18
import org.springframework.core.io.Resource;
19
import org.springframework.stereotype.Controller;
20
import org.springframework.web.bind.annotation.RequestBody;
21
import org.springframework.web.bind.annotation.RequestMapping;
22
import org.springframework.web.bind.annotation.ResponseBody;
23

    
24
import javax.xml.transform.Transformer;
25
import javax.xml.transform.TransformerFactory;
26
import javax.xml.transform.stream.StreamResult;
27
import javax.xml.transform.stream.StreamSource;
28
import java.io.StringWriter;
29

    
30
@Controller
31
public class OaiExplorerInternalController {
32
	
33
	private final static Resource oaiXslt = new ClassPathResource("/eu/dnetlib/functionality/modular/ui/xslt/oai.xslt");
34
	
35
	private static final Log log = LogFactory.getLog(OaiExplorerInternalController.class);
36
	
37
	@RequestMapping("/ui/oai_verb")
38
	public @ResponseBody String oaiVerb(@RequestBody(required=true) OaiRequest req) throws Exception {
39
		return callOaiVerb(req);
40
	}
41
		
42
	@RequestMapping("/ui/test_oai_verb")
43
	public @ResponseBody ResponseDetails testOaiVerb(@RequestBody final OaiRequest req) throws Exception {
44
		final ResponseDetails response = new ResponseDetails();
45
		
46
		final Document doc = callOaiVerb(req, response);
47
		
48
		if (response.isValid() && doc != null) {
49
			final OaiRequest nextCall = new OaiRequest();
50
			nextCall.setBaseUrl(req.getBaseUrl());
51
			
52
			if ("Identify".equals(req.getVerb())) {
53
				nextCall.setVerb("ListSets");
54
			} else if ("ListSets".equals(req.getVerb())) {
55
				nextCall.setVerb("ListMetadataFormats");
56
			} else if ("ListMetadataFormats".equals(req.getVerb())) {
57
				nextCall.setVerb("ListRecords");
58
				if (doc.selectSingleNode("//*[local-name()='metadataPrefix' and text()='oai_dc']") != null) {
59
					nextCall.setMdf("oai_dc");
60
				} else {
61
					nextCall.setMdf(doc.selectSingleNode("//*[local-name()='metadataPrefix']").getText());
62
				}
63
			} else if ("ListRecords".equals(req.getVerb())) {
64
				nextCall.setVerb("ListIdentifiers");
65
				nextCall.setMdf(req.getMdf());
66
			} else if ("ListIdentifiers".equals(req.getVerb())) {
67
				nextCall.setVerb("GetRecord");
68
				nextCall.setMdf(req.getMdf());
69
				nextCall.setId(doc.selectSingleNode("//*[local-name()='identifier']").getText());
70
			} else if ("GetRecord".equals(req.getVerb())) {
71
				// NOTHING
72
			}
73
			response.setNextCall(nextCall);
74
		}
75
		return response;
76
	}
77
	
78
	@RequestMapping("/ui/test_harvesting")
79
	public @ResponseBody ResponseDetails testHarvesting(@RequestBody final OaiRequest req) throws Exception {
80
		final ResponseDetails response = new ResponseDetails();
81
		
82
		final Document doc = callOaiVerb(req, response);
83
		
84
		if (response.isValid() && doc != null) {
85
			
86
			final Node node = doc.selectSingleNode("//*[local-name() = 'resumptionToken']");
87
			
88
			if (node != null) {
89
				response.setSize(doc.selectNodes("//*[local-name()='" + req.getVerb() + "']/*[local-name() != 'resumptionToken']").size());
90
				response.setCursor(NumberUtils.toInt(node.valueOf("@cursor"), -1));
91
				response.setTotal(NumberUtils.toInt(node.valueOf("@completeListSize"), -1));
92
				
93
				final OaiRequest nextCall = new OaiRequest();
94
				nextCall.setBaseUrl(req.getBaseUrl());
95
				nextCall.setVerb(req.getVerb());
96
				nextCall.setToken(node.getText());
97
				response.setNextCall(nextCall);
98
			}
99
		}
100
		return response;
101
	}
102
	
103
	private String callOaiVerb(final OaiRequest req) throws Exception {
104

    
105
		final HttpGet method = new HttpGet(!req.toQueryParams().isEmpty() ? req.getBaseUrl() + "?" + Joiner.on("&").join(req.toQueryParams()) : req.getBaseUrl());
106

    
107
		method.addHeader("Content-type", "text/xml; charset=UTF-8");
108

    
109
		try(CloseableHttpResponse response = HttpClients.createDefault().execute(method)) {
110

    
111
			int responseCode = response.getStatusLine().getStatusCode();
112
			if (HttpStatus.SC_OK != responseCode) {
113
				log.error("Error downloading from baseUrl: " + req.getBaseUrl());
114
				throw new RuntimeException("Error: " + responseCode);
115
			}
116

    
117
			final TransformerFactory tfactory = TransformerFactory.newInstance();
118

    
119
			final Transformer transformer = tfactory.newTransformer(new StreamSource(oaiXslt.getInputStream()));
120
			final StringWriter output = new StringWriter();
121
			transformer.transform(new StreamSource(response.getEntity().getContent()), new StreamResult(output));
122

    
123
			return output.toString();
124
		}
125
	}
126
	
127
	private Document callOaiVerb(final OaiRequest req, final ResponseDetails details) {
128

    
129
		final HttpGet method = new HttpGet(!req.toQueryParams().isEmpty() ? req.getBaseUrl() + "?" + Joiner.on("&").join(req.toQueryParams()) : req.getBaseUrl());
130
		method.addHeader("Content-type", "text/xml; charset=UTF-8");
131
		
132
		Document doc = null;
133

    
134
		final long start = DateUtils.now();
135

    
136
		try(CloseableHttpResponse response = HttpClients.createDefault().execute(method)) {
137

    
138
			int responseCode = response.getStatusLine().getStatusCode();
139
	
140
			details.setHttpCode(responseCode);
141
			details.setValid(HttpStatus.SC_OK == responseCode);
142
			
143
			if (HttpStatus.SC_OK == responseCode) {
144
				try {
145
					doc = new SAXReader().read(response.getEntity().getContent());
146
				} catch (Exception e) {
147
					details.setValid(false);
148
					details.setError(e.getMessage());
149
				}
150
			}
151
		} catch (Exception e) {
152
			details.setValid(false);
153
			details.setError(e.getMessage());
154
		}
155
				
156
		details.setTime(DateUtils.now() - start);
157
		details.setVerb(req.getVerb());
158
		
159
		return doc;
160
	}
161
	
162
}
(2-2/2)