Project

General

Profile

1
package eu.dnetlib.repo.manager.service.controllers;
2

    
3
import eu.dnetlib.usagestats.sushilite.domain.ReportItem;
4
import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper;
5
import org.springframework.beans.factory.annotation.Autowired;
6
import org.springframework.beans.factory.annotation.Value;
7
import org.springframework.core.ParameterizedTypeReference;
8
import org.springframework.http.HttpMethod;
9
import org.springframework.http.ResponseEntity;
10
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
11
import org.springframework.security.access.prepost.PreAuthorize;
12
import org.springframework.stereotype.Component;
13
import org.springframework.web.bind.annotation.PathVariable;
14
import org.springframework.web.bind.annotation.RequestParam;
15
import org.springframework.web.client.RestClientException;
16
import org.springframework.web.client.RestTemplate;
17
import org.springframework.web.util.UriComponentsBuilder;
18

    
19
import java.util.ArrayList;
20
import java.util.List;
21

    
22
@Component
23
public class SushiliteApiImpl implements SushiliteApi {
24

    
25

    
26
    @Value("${services.repomanager.usagestats.sushiliteEndpoint}")
27
    private String usagestatsSushiliteEndpoint;
28

    
29
    @Autowired
30
    private EmailUtils emailUtils;
31

    
32
    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(SushiliteApiImpl.class);
33

    
34

    
35
    @Override
36
    @PreAuthorize("hasRole('ROLE_USER')")
37
    public ReportResponseWrapper getReportResults(@PathVariable("page") String page,
38
                                                  @PathVariable("pageSize") String pageSize,
39
                                                  @RequestParam(value = "Report") String Report,
40
                                                  @RequestParam(value = "Release",defaultValue="4") String Release,
41
                                                  @RequestParam(value = "RequestorID",required=false,defaultValue="anonymous") String RequestorID,
42
                                                  @RequestParam(value = "BeginDate",required=false,defaultValue="") String BeginDate,
43
                                                  @RequestParam(value = "EndDate",required=false,defaultValue="") String EndDate,
44
                                                  @RequestParam(value = "RepositoryIdentifier") String RepositoryIdentifier,
45
                                                  @RequestParam(value = "ItemIdentifier",required=false,defaultValue="") String ItemIdentifier,
46
                                                  @RequestParam(value = "ItemDataType",required=false,defaultValue="") String ItemDataType,
47
                                                  @RequestParam(value = "Granularity") String Granularity,
48
                                                  @RequestParam(value = "Pretty",required=false,defaultValue="") String Pretty) {
49

    
50
            //build the uri params
51
            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.usagestatsSushiliteEndpoint + "GetReport/")
52
                                                                .queryParam("Report", Report)
53
                                                                .queryParam("Release", Release)
54
                                                                .queryParam("RequestorID", RequestorID)
55
                                                                .queryParam("BeginDate", BeginDate)
56
                                                                .queryParam("EndDate", EndDate)
57
                                                                .queryParam("RepositoryIdentifier", RepositoryIdentifier)
58
                                                                .queryParam("ItemIdentifier", ItemIdentifier)
59
                                                                .queryParam("ItemDataType", ItemDataType)
60
                                                                .queryParam("Granularity", Granularity)
61
                                                                .queryParam("Pretty", Pretty);
62

    
63
            //create new template engine
64
            RestTemplate template = new RestTemplate();
65
            template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
66

    
67
            ResponseEntity<ReportResponseWrapper> resp;
68
            try {
69
                //communicate with endpoint
70
                resp = template.exchange(
71
                        builder.build().encode().toUri(),
72
                        HttpMethod.GET,
73
                        null,
74
                        new ParameterizedTypeReference<ReportResponseWrapper>() {
75
                        });
76
            } catch (RestClientException e) {
77
                LOGGER.debug("Exception on getReportResults" , e);
78
                emailUtils.reportException(e);
79
                throw e;
80
            }
81

    
82
            // check remote api's response
83
            System.out.println("sushi responded status " + resp.getStatusCode());
84

    
85
            // get the items corresponding to the requested page
86
            List<ReportItem> requestedItemList = new ArrayList<>();
87
            if (resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems() != null) {
88
                try {
89
                    int totalItems = resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems().size();
90
                    int size = Integer.parseInt(pageSize);
91
                    int offset = Integer.parseInt(page)*size;
92

    
93
                    if (offset < totalItems ) {
94
                        int upperIndex = offset+size;
95
                        if (upperIndex > totalItems) {
96
                            upperIndex = totalItems;
97
                        }
98
                        requestedItemList = resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems().subList(offset,upperIndex);
99
                    }
100

    
101
                } catch (NumberFormatException e) {
102
                    LOGGER.debug("Exception on getReportResults - trying to cast strings to integers", e);
103
                    //emailUtils.reportException(e);
104
                    throw e;
105
                }
106

    
107
            }
108

    
109
            ReportResponseWrapper newReportResponse = resp.getBody();
110
            newReportResponse.getReportResponse().getReportWrapper().getReport().getCustomer().setReportItems(requestedItemList);
111

    
112

    
113
            return newReportResponse;
114
    }
115

    
116
}
(15-15/19)