Project

General

Profile

1
package eu.dnetlib.repo.manager.service;
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.springframework.beans.factory.annotation.Autowired;
12
import org.springframework.beans.factory.annotation.Value;
13
import org.springframework.core.ParameterizedTypeReference;
14
import org.springframework.http.*;
15
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
16
import org.springframework.stereotype.Service;
17
import org.springframework.util.LinkedMultiValueMap;
18
import org.springframework.util.MultiValueMap;
19
import org.springframework.web.client.RestClientException;
20
import org.springframework.web.client.RestTemplate;
21
import org.springframework.web.util.UriComponents;
22
import org.springframework.web.util.UriComponentsBuilder;
23

    
24
import javax.annotation.PostConstruct;
25
import java.io.IOException;
26
import java.io.InputStream;
27
import java.net.URL;
28
import java.util.*;
29

    
30
@Service("brokerService")
31
public class BrokerServiceImpl implements BrokerService {
32

    
33
    @Autowired
34
    private RepositoryServiceImpl repoAPI;
35
    @Value("${services.broker.url}:${services.broker.port}/${services.broker.api}${services.broker.openaire}")
36
    private String openairePath;
37
    @Value("${services.broker.url}:${services.broker.port}/${services.broker.api}")
38
    private String apiPath;
39
    @Value("${topic_types.url}")
40
    private String topicsURL;
41

    
42
    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
43
            .getLogger(BrokerServiceImpl.class);
44

    
45
    @Autowired
46
    RestTemplate restTemplate ;
47

    
48
    private HttpHeaders httpHeaders;
49

    
50
    private HashMap<String,Term> topics = new HashMap<String, Term>();
51

    
52
    @Autowired
53
    private EmailUtils emailUtils;
54

    
55
    @PostConstruct
56
    private void initDnetTopicsMap() {
57

    
58
        httpHeaders = new HttpHeaders();
59
        httpHeaders.set("Content-Type", "application/json");
60

    
61
        LOGGER.debug("Init dnet topics!");
62
        InputStream is = null;
63
        try {
64
            is = new URL(topicsURL).openStream();
65
            ObjectMapper mapper = new ObjectMapper();
66
            JsonNode root = mapper.readTree(is);
67
            for (JsonNode term : root.path("terms") )
68
                topics.put(term.path("code").textValue(), parseTerm(term));
69
        } catch (IOException e) {
70
            LOGGER.debug("Exception on initDnetTopicsMap" , e);
71
            emailUtils.reportException(e);
72
        }
73
    }
74

    
75
    private Term parseTerm(JsonNode term) {
76
        return new Term(term.path("englishName").textValue(),term.path("nativeName").textValue(),
77
                term.path("encoding").textValue(),term.path("code").textValue());
78
    }
79

    
80

    
81
    @Override
82
    public DatasourcesBroker getDatasourcesOfUser(String user,String includeShared,String includeByOthers) throws JSONException {
83

    
84
        DatasourcesBroker ret = new DatasourcesBroker();
85
        try {
86
            ret.setDatasourcesOfUser(getDatasourcesOfUserType(getRepositoriesOfUser(user)));
87
            //TODO fix bug when values are true
88
            if (Boolean.parseBoolean(includeShared)) {
89
                List<String> sharedDatasourceIds = new ArrayList<String>();
90
                ret.setSharedDatasources(getDatasourcesOfUserType(getRepositoriesByIds(sharedDatasourceIds)));
91
            }
92

    
93
            if (Boolean.parseBoolean(includeByOthers)) {
94
                ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(user)));
95
            }
96
        } catch (BrokerException e) {
97
            LOGGER.debug("Exception on getDatasourcesOfUser" , e);
98
            emailUtils.reportException(e);
99
        }
100

    
101
        return ret;
102
    }
103

    
104
    @Override
105
    public List<BrowseEntry> getTopicsForDatasource(String datasourceName) throws BrokerException {
106
        final String service = "/topicsForDatasource";
107

    
108
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
109
                .queryParam("ds", datasourceName);
110

    
111
        ResponseEntity<List<BrowseEntry>> resp;
112
        try {
113
            resp = restTemplate.exchange(
114
                    builder.build().encode().toUri(),
115
                    HttpMethod.GET,
116
                    null,
117
                    new ParameterizedTypeReference<List<BrowseEntry>>() {
118
                    });
119
        } catch (RestClientException e) {
120
            LOGGER.debug("Exception on getTopicsForDatasource" , e);
121
            emailUtils.reportException(e);
122
            throw new BrokerException(e);
123
        }
124

    
125
        return resp.getBody();
126
    }
127

    
128
    @Override
129
    public EventsPage advancedShowEvents(String page,
130
                                         String size,
131
                                         AdvQueryObject advQueryObject) throws BrokerException, JSONException ,IOException {
132

    
133
        final String service = "/events/{page}/{pageSize}";
134

    
135
        Map<String, Long> uriParams = new HashMap<>();
136
        uriParams.put("page", Long.parseLong(page));
137
        uriParams.put("pageSize", Long.parseLong(size));
138

    
139
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
140

    
141
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
142
        advQueryObject.setPage(Long.parseLong(page));
143
        HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, httpHeaders);
144
        ResponseEntity<EventsPage> resp;
145
        try {
146
            resp = restTemplate.exchange(
147
                    builder.buildAndExpand(uriParams).encode().toUri(),
148
                    HttpMethod.POST,
149
                    entity,
150
                    new ParameterizedTypeReference<EventsPage>() {
151
                    }
152
            );
153
        } catch (RestClientException e) {
154
            LOGGER.debug("Exception on advancedShowEvents" , e);
155
            emailUtils.reportException(e);
156
            throw new BrokerException(e);
157
        }
158
        return resp.getBody();
159

    
160

    
161
    }
162

    
163

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

    
166
        List<Tuple<BrowseEntry, String>> entries = new ArrayList<>();
167
        for (Repository repo : repositories) {
168
            BrowseEntry temp = new BrowseEntry();
169
            temp.setValue(repo.getOfficialName());
170
            temp.setSize(new Long(0));
171
            for (BrowseEntry e : getTopicsForDatasource(repo.getOfficialName())) {
172
                temp.setSize(temp.getSize() + e.getSize());
173
            }
174
            Tuple<BrowseEntry, String> tup = new Tuple<>(temp, repo.getLogoUrl());
175
            entries.add(tup);
176
        }
177

    
178
        // sort the collection by the second field of the tuple which is size
179
        Collections.sort(entries, new Comparator<Tuple<BrowseEntry, String>>() {
180
            @Override
181
            public int compare(Tuple<BrowseEntry, String> e1, Tuple<BrowseEntry, String> e2) {
182
                return (int) (e2.getFirst().getSize().longValue() - e1.getFirst().getSize().longValue());
183
            }
184
        });
185

    
186
        return entries;
187
    }
188

    
189
    private List<Repository> getRepositoriesOfUser(String userEmail) throws JSONException {
190

    
191
        int page = 0;
192
        int size = 50;
193
        List<Repository> rs ;
194
        List<Repository> resultSet = new ArrayList<>();
195

    
196
        while (true){
197
            rs = repoAPI.getRepositoriesOfUser(userEmail, String.valueOf(page), String.valueOf(size));
198
            resultSet.addAll(rs);
199
            page+=1;
200
            if(rs.size() == 0) break;
201
        }
202
        return resultSet;
203
    }
204

    
205
    private List<Repository> getRepositoriesByIds(List<String> sharedDatasourceIds) {
206
        return null;
207
    }
208

    
209
    @Override
210
    public EventsPage showEvents(String datasourceName,
211
                                 String topic,
212
                                 String page,
213
                                 String size) throws BrokerException, JSONException {
214

    
215
        final String service = "/events";
216

    
217
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
218
                .queryParam("ds", datasourceName)
219
                .queryParam("topic", topic)
220
                .path("/{page}/{size}/");
221

    
222
        ResponseEntity<EventsPage> resp;
223
        try {
224
            resp = restTemplate.exchange(
225
                    builder.build().expand(page, size).encode().toUri(),
226
                    HttpMethod.GET,
227
                    null,
228
                    new ParameterizedTypeReference<EventsPage>() {
229
                    });
230
        } catch (RestClientException e) {
231
            LOGGER.debug("Exception on showEvents" , e);
232
            emailUtils.reportException(e);
233
            throw new BrokerException(e);
234
        }
235
        return resp.getBody();
236
    }
237

    
238
    @Override
239
    public Map<String, List<SimpleSubscriptionDesc>> getSimpleSubscriptionsOfUser(String userEmail)
240
            throws BrokerException {
241

    
242
        final String service = "/subscriptions";
243

    
244
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
245
                .queryParam("email", userEmail);
246

    
247
        LOGGER.debug(builder.build().encode().toUri());
248
        ResponseEntity<Map<String, List<SimpleSubscriptionDesc>>> resp;
249
        try {
250
            resp = restTemplate.exchange(
251
                    builder.build().encode().toUri(),
252
                    HttpMethod.GET,
253
                    null,
254
                    new ParameterizedTypeReference<Map<String, List<SimpleSubscriptionDesc>>>() {
255
                    });
256
        } catch (RestClientException e) {
257
            LOGGER.debug("Exception on getSimpleSubscriptionsOfUser" , e);
258
            emailUtils.reportException(e);
259
            throw new BrokerException(e);
260
        }
261
        return resp.getBody();
262
    }
263

    
264
    @Override
265
    public Subscription subscribe(OpenaireSubscription obj) throws BrokerException {
266
        final String service = "/subscribe";
267

    
268
        //build the uri params
269
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
270

    
271
        HttpEntity<OpenaireSubscription> entity = new HttpEntity<>(obj, httpHeaders);
272

    
273
        //create new template engine
274
        RestTemplate template = new RestTemplate();
275
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
276
        ResponseEntity<Subscription> resp;
277
        try {
278
            //communicate with endpoint
279
            resp = restTemplate.exchange(
280
                    builder.build().encode().toUri(),
281
                    HttpMethod.POST,
282
                    entity,
283
                    new ParameterizedTypeReference<Subscription>() {
284
                    });
285
        } catch (RestClientException e) {
286
            LOGGER.debug("Exception on OpenaireSubscription" , e);
287
            emailUtils.reportException(e);
288
            throw new BrokerException(e);
289
        }
290

    
291
        return resp.getBody();
292
    }
293

    
294
    @Override
295
    public ResponseEntity<Object> unsubscribe(String subscriptionId) throws BrokerException {
296
        final String service = "/subscriptions/" + subscriptionId;
297

    
298
        //build the uri params
299
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
300

    
301
        try {
302
            //communicate with endpoint
303
            restTemplate.exchange(
304
                    builder.build().encode().toUri(),
305
                    HttpMethod.DELETE,
306
                    null,
307
                    new ParameterizedTypeReference<Void>() {
308
                    });
309
        } catch (RestClientException e) {
310
            LOGGER.debug("Exception on unsubscribe" , e);
311
            emailUtils.reportException(e);
312
            throw new BrokerException(e);
313
        }
314
        return new ResponseEntity<>("OK",HttpStatus.OK);
315
    }
316

    
317
    @Override
318
    public Subscription getSubscription( String subscriptionId) throws BrokerException {
319
        final String service = "/subscriptions/" + subscriptionId;
320

    
321
        //build the uri params
322
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
323

    
324
        ResponseEntity<Subscription> resp;
325
        try {
326
            //communicate with endpoint
327
            resp = restTemplate.exchange(
328
                    builder.build().encode().toUri(),
329
                    HttpMethod.GET,
330
                    null,
331
                    new ParameterizedTypeReference<Subscription>() {
332
                    });
333
        } catch (RestClientException e) {
334
            LOGGER.debug("Exception on getSubscription" , e);
335
            emailUtils.reportException(e);
336
            throw new BrokerException(e);
337
        }
338
        return resp.getBody();
339
    }
340

    
341
    @Override
342
    public Map<String, Term> getDnetTopics() throws BrokerException {
343
        return topics;
344
    }
345

    
346
    @Override
347
    public EventsPage getNotificationsBySubscriptionId(String subscriptionId,
348
                                                       String page,
349
                                                       String size) throws BrokerException {
350

    
351
        UriComponents uriComponents = UriComponentsBuilder
352
                .fromHttpUrl(openairePath + "/notifications/")
353
                .path("/{id}/{page}/{size}/")
354
                .build().expand(subscriptionId,page, size).encode();
355

    
356
        ResponseEntity<EventsPage> resp;
357
        try {
358
            resp = restTemplate.exchange(
359
                    uriComponents.toUri(),
360
                    HttpMethod.GET,
361
                    null,
362
                    new ParameterizedTypeReference<EventsPage>() {
363
                    });
364
        } catch (RestClientException e) {
365
            LOGGER.debug("Exception on getNotificationsBySubscriptionId" , e);
366
            emailUtils.reportException(e);
367
            throw new BrokerException(e);
368
        }
369
        return resp.getBody();
370
    }
371

    
372
    //@Override
373
    public Map<String, List<Subscription>> getSubscriptionsOfUser(String userEmail)
374
            throws BrokerException {
375

    
376
        Map<String, List<SimpleSubscriptionDesc>> simpleSubs = getSimpleSubscriptionsOfUser(userEmail);
377
        Map<String,List<Subscription>> subs = new HashMap<>();
378
        List<Subscription> subscriptions = null;
379

    
380
        for(String s:simpleSubs.keySet()){
381
            List<SimpleSubscriptionDesc> simpleSubscriptionDescs = simpleSubs.get(s);
382
            for(SimpleSubscriptionDesc simpleSubscriptionDesc : simpleSubscriptionDescs) {
383
                subscriptions = new ArrayList<>();
384
                subscriptions.add(getSubscription(simpleSubscriptionDesc.getId()));
385
            }
386
            subs.put(s,subscriptions);
387
        }
388
        return subs;
389
    }
390

    
391

    
392
}
(2-2/18)