Project

General

Profile

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

    
3
import com.fasterxml.jackson.databind.JsonNode;
4
import com.fasterxml.jackson.databind.ObjectMapper;
5
import eu.dnetlib.domain.data.Repository;
6
import eu.dnetlib.repo.manager.shared.BrokerException;
7
import eu.dnetlib.repo.manager.shared.Term;
8
import eu.dnetlib.repo.manager.shared.Tuple;
9
import eu.dnetlib.repo.manager.shared.broker.*;
10
import org.json.JSONException;
11
import org.json.JSONObject;
12
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.beans.factory.annotation.Value;
14
import org.springframework.core.ParameterizedTypeReference;
15
import org.springframework.http.HttpEntity;
16
import org.springframework.http.HttpHeaders;
17
import org.springframework.http.HttpMethod;
18
import org.springframework.http.ResponseEntity;
19
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
20
import org.springframework.stereotype.Component;
21
import org.springframework.util.LinkedMultiValueMap;
22
import org.springframework.util.MultiValueMap;
23
import org.springframework.web.bind.annotation.PathVariable;
24
import org.springframework.web.client.RestClientException;
25
import org.springframework.web.client.RestTemplate;
26
import org.springframework.web.util.UriComponents;
27
import org.springframework.web.util.UriComponentsBuilder;
28

    
29
import javax.annotation.PostConstruct;
30
import java.io.IOException;
31
import java.io.InputStream;
32
import java.net.URL;
33
import java.util.*;
34

    
35
@Component
36
public class BrokerApiImpl implements BrokerApi {
37

    
38
    @Autowired
39
    private RepositoryApiImpl repoAPI;
40
    @Value("${services.broker.url}:${services.broker.port}/${services.broker.api}${services.broker.openaire}")
41
    private String openairePath;
42
    @Value("${services.broker.url}:${services.broker.port}/${services.broker.api}")
43
    private String apiPath;
44
    @Value("${topic_types.url}")
45
    private String topicsURL;
46

    
47
    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
48
            .getLogger(BrokerApiImpl.class);
49

    
50
    private RestTemplate restTemplate = null;
51

    
52
    private HttpHeaders httpHeaders;
53

    
54
    private HashMap<String,Term> topics = new HashMap<String, Term>();
55

    
56
    @PostConstruct
57
    private void initDnetTopicsMap() {
58

    
59
        restTemplate = new RestTemplate();
60
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
61

    
62
        httpHeaders = new HttpHeaders();
63
        httpHeaders.set("Content-Type", "application/json");
64

    
65
        LOGGER.debug("Init dnet topics!");
66
        InputStream is = null;
67
        try {
68
            is = new URL(topicsURL).openStream();
69
            ObjectMapper mapper = new ObjectMapper();
70
            JsonNode root = mapper.readTree(is);
71
            for (JsonNode term : root.path("terms") )
72
                topics.put(term.path("code").textValue(), parseTerm(term));
73
        } catch (IOException e) {
74
            e.printStackTrace();
75
        }
76
    }
77

    
78
    private Term parseTerm(JsonNode term) {
79
        return new Term(term.path("englishName").textValue(),term.path("nativeName").textValue(),
80
                term.path("encoding").textValue(),term.path("code").textValue());
81
    }
82

    
83

    
84
    @Override
85
    public DatasourcesBroker getDatasourcesOfUser(String params) throws JSONException {
86
        JSONObject json_params = new JSONObject(params);
87
        DatasourcesBroker ret = new DatasourcesBroker();
88

    
89
        String userEmail = json_params.getString("userEmail");
90
        boolean includeShared = Boolean.parseBoolean( json_params.getString("includeShared") );
91
        boolean includeByOthers = Boolean.parseBoolean( json_params.getString("includeByOthers") );
92

    
93
        try {
94
            ret.setDatasourcesOfUser(getDatasourcesOfUserType(getRepositoriesOfUser(userEmail)));
95
            if (includeShared) {
96
                //TODO whatever nikonas was saying
97
                List<String> sharedDatasourceIds = new ArrayList<String>();
98
                ret.setSharedDatasources(getDatasourcesOfUserType(getRepositoriesByIds(sharedDatasourceIds)));
99
            }
100

    
101
            if (includeByOthers) {
102
                ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(userEmail)));
103
            }
104
        } catch (BrokerException e) {
105
            e.printStackTrace();
106
        }
107

    
108
        return ret;
109
    }
110

    
111
    @Override
112
    public List<BrowseEntry> getTopicsForDatasource(@PathVariable("datasourceName")  String datasourceName) throws BrokerException {
113
        final String service = "/topicsForDatasource";
114

    
115
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
116
                .queryParam("ds", datasourceName);
117

    
118
        ResponseEntity<List<BrowseEntry>> resp;
119
        try {
120
            resp = restTemplate.exchange(
121
                    builder.build().encode().toUri(),
122
                    HttpMethod.GET,
123
                    null,
124
                    new ParameterizedTypeReference<List<BrowseEntry>>() {
125
                    });
126
        } catch (RestClientException e) {
127
            throw new BrokerException(e);
128
        }
129

    
130
        return resp.getBody();
131
    }
132

    
133
    @Override
134
    public EventsPage advancedShowEvents(String params) throws BrokerException, JSONException ,IOException {
135
        JSONObject json_params = new JSONObject(params);
136

    
137
        String page = json_params.getString("page");
138
        String pagesize = json_params.getString("pagesize");
139
        String json_advQueryObject = json_params.getString("advQueryObject");
140

    
141
        ObjectMapper mapper = new ObjectMapper();
142
        AdvQueryObject advQueryObject = mapper.readValue(json_advQueryObject, AdvQueryObject.class);
143

    
144
        final String service = "/events/{page}/{pageSize}";
145

    
146
        Map<String, Long> uriParams = new HashMap<>();
147
        uriParams.put("page", Long.parseLong(page));
148
        uriParams.put("pageSize", Long.parseLong(pagesize));
149

    
150
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
151

    
152
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
153
        headers.add("Content-Type", "application/json");
154

    
155
        advQueryObject.setPage(Long.parseLong(page));
156

    
157
        HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, headers);
158

    
159
        ResponseEntity<EventsPage> resp;
160
        try {
161
            resp = restTemplate.exchange(
162
                    builder.buildAndExpand(uriParams).encode().toUri(),
163
                    HttpMethod.POST,
164
                    entity,
165
                    new ParameterizedTypeReference<EventsPage>() {
166
                    }
167
            );
168
        } catch (RestClientException e) {
169
            throw new BrokerException(e);
170
        }
171
        return resp.getBody();
172

    
173

    
174
    }
175

    
176

    
177
    private List<Tuple<BrowseEntry, String>> getDatasourcesOfUserType(List<Repository> repositories) throws BrokerException {
178

    
179
        List<Tuple<BrowseEntry, String>> entries = new ArrayList<>();
180
        for (Repository repo : repositories) {
181
            BrowseEntry temp = new BrowseEntry();
182
            temp.setValue(repo.getOfficialName());
183
            temp.setSize(new Long(0));
184
            for (BrowseEntry e : getTopicsForDatasource(repo.getOfficialName())) {
185
                temp.setSize(temp.getSize() + e.getSize());
186
            }
187
            Tuple<BrowseEntry, String> tup = new Tuple<>(temp, repo.getLogoUrl());
188
            entries.add(tup);
189
        }
190

    
191
        // sort the collection by the second field of the tuple which is size
192
        Collections.sort(entries, new Comparator<Tuple<BrowseEntry, String>>() {
193
            @Override
194
            public int compare(Tuple<BrowseEntry, String> e1, Tuple<BrowseEntry, String> e2) {
195
                return (int) (e2.getFirst().getSize().longValue() - e1.getFirst().getSize().longValue());
196
            }
197
        });
198

    
199
        return entries;
200
    }
201

    
202

    
203

    
204
    private List<Repository> getRepositoriesOfUser(String userEmail) throws JSONException {
205

    
206
        int page = 0;
207
        int size = 50;
208
        List<Repository> rs ;
209
        List<Repository> resultSet = new ArrayList<>();
210

    
211
        while (true){
212
            rs = repoAPI.getRepositoriesOfUser(userEmail, String.valueOf(page), String.valueOf(size));
213
            resultSet.addAll(rs);
214
            page+=1;
215
            if(rs.size() == 0) break;
216
        }
217
        return resultSet;
218
    }
219

    
220
    private List<Repository> getRepositoriesByIds(List<String> sharedDatasourceIds) {
221
        return null;
222
    }
223

    
224
    @Override
225
    public EventsPage showEvents(String params) throws BrokerException, JSONException {
226

    
227
        JSONObject json_params = new JSONObject(params);
228

    
229
        String datasourceName = json_params.getString("datasourceName");
230
        String topic = json_params.getString("topic");
231
        String page = json_params.getString("page");
232

    
233
        final String service = "/showEvents";
234

    
235
        //build the uri params
236
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
237
                .queryParam("ds", datasourceName)
238
                .queryParam("topic", topic)
239
                .queryParam("page", page);
240

    
241
        ResponseEntity<EventsPage> resp;
242
        try {
243
            //communicate with endpoint
244
            resp = restTemplate.exchange(
245
                    builder.build().encode().toUri(),
246
                    HttpMethod.GET,
247
                    null,
248
                    new ParameterizedTypeReference<EventsPage>() {
249
                    });
250
        } catch (RestClientException e) {
251
            throw new BrokerException(e);
252
        }
253
        return resp.getBody();
254
    }
255

    
256
    @Override
257
    public Map<String, List<SimpleSubscriptionDesc>> getSubscriptionsOfUser(@PathVariable("userEmail") String userEmail) throws BrokerException {
258

    
259
        final String service = "/subscriptions";
260

    
261
        //build the uri params
262
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
263
                .queryParam("email", userEmail);
264

    
265
        //create new template engine
266
        ResponseEntity<Map<String, List<SimpleSubscriptionDesc>>> resp;
267
        try {
268
            //communicate with endpoint
269
            resp = restTemplate.exchange(
270
                    builder.build().encode().toUri(),
271
                    HttpMethod.GET,
272
                    null,
273
                    new ParameterizedTypeReference<Map<String, List<SimpleSubscriptionDesc>>>() {
274
                    });
275
        } catch (RestClientException e) {
276
            LOGGER.debug("Error " , e);
277
            throw new BrokerException(e);
278
        }
279
        return resp.getBody();
280
    }
281

    
282
    @Override
283
    public Subscription subscribe(OpenaireSubscription obj) throws BrokerException {
284
        final String service = "/subscribe";
285

    
286
        //build the uri params
287
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
288

    
289
        HttpEntity<OpenaireSubscription> entity = new HttpEntity<>(obj, httpHeaders);
290

    
291
        //create new template engine
292
        RestTemplate template = new RestTemplate();
293
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
294
        ResponseEntity<Subscription> resp;
295
        try {
296
            //communicate with endpoint
297
            resp = restTemplate.exchange(
298
                    builder.build().encode().toUri(),
299
                    HttpMethod.POST,
300
                    entity,
301
                    new ParameterizedTypeReference<Subscription>() {
302
                    });
303
        } catch (RestClientException e) {
304
            throw new BrokerException(e);
305
        }
306

    
307
        return resp.getBody();
308
    }
309

    
310
    @Override
311
    public void unsubscribe(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
312
        final String service = "/subscriptions/" + subscriptionId;
313

    
314
        //build the uri params
315
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
316

    
317
        try {
318
            //communicate with endpoint
319
            restTemplate.exchange(
320
                    builder.build().encode().toUri(),
321
                    HttpMethod.DELETE,
322
                    null,
323
                    new ParameterizedTypeReference<Void>() {
324
                    });
325
        } catch (RestClientException e) {
326
            throw new BrokerException(e);
327
        }
328
    }
329

    
330
    @Override
331
    public Subscription getSubscription(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
332
        final String service = "/subscriptions/" + subscriptionId;
333

    
334
        //build the uri params
335
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
336

    
337
        ResponseEntity<Subscription> resp;
338
        try {
339
            //communicate with endpoint
340
            resp = restTemplate.exchange(
341
                    builder.build().encode().toUri(),
342
                    HttpMethod.GET,
343
                    null,
344
                    new ParameterizedTypeReference<Subscription>() {
345
                    });
346
        } catch (RestClientException e) {
347
            throw new BrokerException(e);
348
        }
349
        return resp.getBody();
350
    }
351

    
352
    @Override
353
    public Map<String, Term> getDnetTopics() throws BrokerException {
354
        return topics;
355
    }
356

    
357
    @Override
358
    public EventsPage getNotificationsBySubscriptionId(@PathVariable("subscriptionId") String subscriptionId,
359
                                                       @PathVariable("page") String page,
360
                                                       @PathVariable("size") String size
361
                                                       ) throws BrokerException {
362

    
363
        UriComponents uriComponents = UriComponentsBuilder
364
                .fromHttpUrl(apiPath + "/openaireBroker/notifications/")
365
                .path("/{id}/{page}/{size}/")
366
                .build().expand(subscriptionId,page, size).encode();
367

    
368
        ResponseEntity<EventsPage> resp;
369
        try {
370
            resp = restTemplate.exchange(
371
                    uriComponents.toUri(),
372
                    HttpMethod.GET,
373
                    null,
374
                    new ParameterizedTypeReference<EventsPage>() {
375
                    });
376
        } catch (RestClientException e) {
377
            throw new BrokerException(e);
378
        }
379
        return resp.getBody();
380
    }
381

    
382

    
383
}
(2-2/12)