uoa-repository-manager-service/src/main/java/eu/dnetlib/repo/manager/service/StatsServiceImpl.java

163 lines
6.4 KiB
Java

package eu.dnetlib.repo.manager.service;
import eu.dnetlib.repo.manager.controllers.RestTemplateResponseErrorHandler;
import eu.dnetlib.repo.manager.exception.EndPointException;
import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("statsService")
public class StatsServiceImpl implements StatsService {
private RestTemplate restTemplate = null;
private HttpHeaders httpHeaders;
private static final Logger LOGGER = Logger.getLogger(RepositoryServiceImpl.class);
@Value("${search.api.baseAddress}")
private String baseAddress;
@Value("${search.api.usagestats}")
private String usagestatsBaseAddress;
@Value("${search.api.usageEvents}")
private String usagestatsEvents;
@Autowired
RestTemplateResponseErrorHandler restTemplateResponseErrorHandler;
@PostConstruct
private void init() {
LOGGER.debug("Initialization method of statistics api!");
restTemplate = new RestTemplate();
restTemplate.setErrorHandler(restTemplateResponseErrorHandler);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", "application/json");
}
@Override
public Map<String, Object> getStatistics() throws JSONException {
String aggregators = getTotalByType("datasource",baseAddress+"/resources",
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository Aggregator " +
" or datasourcetypename exact Publication Repository Aggregator )");
String dataRepositories = getTotalByType("datasource",baseAddress+"/resources",
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Data Repository " );
String literature = getTotalByType("datasource",baseAddress+"/resources",
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository " +
" or datasourcetypename exact Publication Repository )");
String journal = getTotalByType("datasource",baseAddress+"/resources",
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Journal");
String publications = getTotalByType("other",baseAddress,"/publications/count");
String datasets = getTotalByType("other",baseAddress,"/datasets/count");
String software = getTotalByType("other",baseAddress,"/software/count");
Map lastYearUsagestats = getLastYearUsageStatsTotal();
Map<String,Object> stats = new HashMap<>();
stats.put("aggregators",aggregators);
stats.put("dataRepositories",dataRepositories);
stats.put("literature",literature);
stats.put("journal",journal);
stats.put("publications",publications);
stats.put("datasets",datasets);
stats.put("software",software);
stats.put("lastYearUsagestats", lastYearUsagestats != null ? lastYearUsagestats.toString() : null);
// Integer usagestats = getUsageStatsTotal();
stats.put("usagestats","N/A");
return stats;
}
private String getTotalByType(String type,String url,String query) {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url + query)
.queryParam("page",0)
.queryParam("size",0)
.queryParam("format","json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
// if(rs.getStatusCode().equals(HttpStatus.OK)){
if(type.equalsIgnoreCase("datasource")){
Map metadata = (Map) ((Map)rs.getBody()).get("meta");
return String.valueOf(metadata.get("total"));
}else {
Map metadata = (Map) (rs.getBody());
return String.valueOf(metadata.get("total"));
}
//}
// return null;
}
private Map getLastYearUsageStatsTotal() {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsBaseAddress + "/totals")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
// if(rs.getStatusCode().equals(HttpStatus.OK)){
List yearly_stats = (List) ((Map)rs.getBody()).get("yearly_stats");
Map lastYear = (Map) yearly_stats.get(yearly_stats.size()-1);
Integer downloads = (Integer) lastYear.get("downloads");
Integer views = (Integer) lastYear.get("views");
Integer year = (Integer) lastYear.get("year");
Map<String,Object> usagestats = new HashMap<>();
usagestats.put("number",String.valueOf(downloads+views));
usagestats.put("year",year);
return usagestats;
//}
}
private Integer getUsageStatsTotal() throws JSONException {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsEvents)
.build().encode();
// ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
String rs = restTemplate.getForObject(uriComponents.toUri(), String.class);
JSONObject resultSet = new JSONObject(rs);
JSONObject totals = resultSet.getJSONObject("totals");
return Integer.valueOf(totals.getString("events"));
}
}