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
            LOGGER.debug(e);
75
            e.printStackTrace();
76
        }
77
    }
78

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

    
84

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

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

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

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

    
109
        return ret;
110
    }
111

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

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

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

    
131
        return resp.getBody();
132
    }
133

    
134
    @Override
135
    public EventsPage advancedShowEvents(String page,String size,AdvQueryObject advQueryObject) throws BrokerException, JSONException ,IOException {
136
        /*JSONObject json_params = new JSONObject(params);
137

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

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

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

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

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

    
153
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
154
        advQueryObject.setPage(Long.parseLong(page));
155
        HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, httpHeaders);
156
        ResponseEntity<EventsPage> resp;
157
        try {
158
            resp = restTemplate.exchange(
159
                    builder.buildAndExpand(uriParams).encode().toUri(),
160
                    HttpMethod.POST,
161
                    entity,
162
                    new ParameterizedTypeReference<EventsPage>() {
163
                    }
164
            );
165
        } catch (RestClientException e) {
166
            throw new BrokerException(e);
167
        }
168
        return resp.getBody();
169

    
170

    
171
    }
172

    
173

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

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

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

    
196
        return entries;
197
    }
198

    
199

    
200

    
201
    private List<Repository> getRepositoriesOfUser(String userEmail) throws JSONException {
202

    
203
        int page = 0;
204
        int size = 50;
205
        List<Repository> rs ;
206
        List<Repository> resultSet = new ArrayList<>();
207

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

    
217
    private List<Repository> getRepositoriesByIds(List<String> sharedDatasourceIds) {
218
        return null;
219
    }
220

    
221
    @Override
222
    public EventsPage showEvents(String datasourceName,String topic,String page) throws BrokerException, JSONException {
223

    
224
        /*JSONObject json_params = new JSONObject(params);
225

    
226
        String datasourceName = json_params.getString("datasourceName");
227
        String topic = json_params.getString("topic");
228
        String page = json_params.getString("page");*/
229

    
230
        final String service = "/showEvents";
231

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

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

    
253
    @Override
254
    public Map<String, List<SimpleSubscriptionDesc>> getSimpleSubscriptionsOfUser(@PathVariable("userEmail") String userEmail) throws BrokerException {
255

    
256
        final String service = "/subscriptions";
257

    
258
        //build the uri params
259
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
260
                .queryParam("email", userEmail);
261

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

    
279
    @Override
280
    public Subscription subscribe(OpenaireSubscription obj) throws BrokerException {
281
        final String service = "/subscribe";
282

    
283
        //build the uri params
284
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
285

    
286
        HttpEntity<OpenaireSubscription> entity = new HttpEntity<>(obj, httpHeaders);
287

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

    
304
        return resp.getBody();
305
    }
306

    
307
    @Override
308
    public void unsubscribe(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
309
        final String service = "/subscriptions/" + subscriptionId;
310

    
311
        //build the uri params
312
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
313

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

    
327
    @Override
328
    public Subscription getSubscription(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
329
        final String service = "/subscriptions/" + subscriptionId;
330

    
331
        //build the uri params
332
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
333

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

    
349
    @Override
350
    public Map<String, Term> getDnetTopics() throws BrokerException {
351
        return topics;
352
    }
353

    
354
    @Override
355
    public EventsPage getNotificationsBySubscriptionId(@PathVariable("subscriptionId") String subscriptionId,
356
                                                       @PathVariable("page") String page,
357
                                                       @PathVariable("size") String size
358
                                                       ) throws BrokerException {
359

    
360
        UriComponents uriComponents = UriComponentsBuilder
361
                .fromHttpUrl(openairePath + "/notifications/")
362
                .path("/{id}/{page}/{size}/")
363
                .build().expand(subscriptionId,page, size).encode();
364

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

    
379
    @Override
380
    public Map<String, List<Subscription>> getSubscriptionsOfUser(@PathVariable("userEmail") String userEmail)
381
            throws BrokerException {
382

    
383
        Map<String, List<SimpleSubscriptionDesc>> simpleSubs = getSimpleSubscriptionsOfUser(userEmail);
384
        Map<String,List<Subscription>> subs = new HashMap<>();
385
        List<Subscription> subscriptions = null;
386

    
387
        for(String s:simpleSubs.keySet()){
388
            List<SimpleSubscriptionDesc> simpleSubscriptionDescs = simpleSubs.get(s);
389
            for(SimpleSubscriptionDesc simpleSubscriptionDesc : simpleSubscriptionDescs) {
390
                subscriptions = new ArrayList<>();
391
                subscriptions.add(getSubscription(simpleSubscriptionDesc.getId()));
392
            }
393
            subs.put(s,subscriptions);
394
        }
395
        return subs;
396
    }
397

    
398

    
399
}
(2-2/12)