Project

General

Profile

1
package eu.dnetlib.repo.manager.service;
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.Service;
13
import org.springframework.web.client.RestClientException;
14
import org.springframework.web.client.RestTemplate;
15
import org.springframework.web.util.UriComponentsBuilder;
16

    
17
import java.util.ArrayList;
18
import java.util.List;
19

    
20
@Service("sushiliteService")
21
public class SushiliteServiceImpl implements SushiliteService {
22

    
23

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

    
27
    @Autowired
28
    private EmailUtils emailUtils;
29

    
30
    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(SushiliteServiceImpl.class);
31

    
32

    
33
    @Override
34
    @PreAuthorize("hasRole('ROLE_USER')")
35
    public ReportResponseWrapper getReportResults(String page,
36
                                                  String pageSize,
37
                                                  String Report,
38
                                                  String Release,
39
                                                  String RequestorID,
40
                                                  String BeginDate,
41
                                                  String EndDate,
42
                                                  String RepositoryIdentifier,
43
                                                  String ItemIdentifier,
44
                                                  String ItemDataType,
45
                                                  String Granularity,
46
                                                  String Pretty) {
47

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

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

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

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

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

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

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

    
105
            }
106

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

    
110

    
111
            return newReportResponse;
112
    }
113

    
114
}
(16-16/20)