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.domain.BrokerException;
7
import eu.dnetlib.repo.manager.domain.Term;
8
import eu.dnetlib.repo.manager.domain.Tuple;
9
import eu.dnetlib.repo.manager.domain.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
        try (InputStream is = new URL(topicsURL).openStream() ){
63
            ObjectMapper mapper = new ObjectMapper();
64
            JsonNode root = mapper.readTree(is);
65
            for (JsonNode term : root.path("terms") )
66
                topics.put(term.path("code").textValue(), parseTerm(term));
67
        } catch (IOException e) {
68
            LOGGER.debug("Exception on initDnetTopicsMap" , e);
69
            emailUtils.reportException(e);
70
        }
71
    }
72

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

    
78

    
79
    @Override
80
    public DatasourcesBroker getDatasourcesOfUser(String user,String includeShared,String includeByOthers) throws JSONException {
81
        long start = System.currentTimeMillis();
82
        DatasourcesBroker ret = new DatasourcesBroker();
83
        try {
84
            ret.setDatasourcesOfUser(getDatasourcesOfUserType(getRepositoriesOfUser(user)));
85
            //TODO fix bug when values are true
86
            if (Boolean.parseBoolean(includeShared)) {
87
                List<String> sharedDatasourceIds = new ArrayList<String>();
88
                ret.setSharedDatasources(getDatasourcesOfUserType(getRepositoriesByIds(sharedDatasourceIds)));
89
            }
90

    
91
            if (Boolean.parseBoolean(includeByOthers)) {
92
                ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(user)));
93
            }
94
        } catch (BrokerException e) {
95
            LOGGER.debug("Exception on getDatasourcesOfUser" , e);
96
            emailUtils.reportException(e);
97
        }
98
        long end = System.currentTimeMillis();
99
        System.out.println("Getting datasources of user in " + (end-start)+"ms");
100
        return ret;
101
    }
102

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

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

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

    
124
        return resp.getBody();
125
    }
126

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

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

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

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

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

    
159

    
160
    }
161

    
162

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

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

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

    
185
        return entries;
186
    }
187

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

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

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

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

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

    
214
        final String service = "/events";
215

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

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

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

    
241
        final String service = "/subscriptions";
242

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

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

    
263
    @Override
264
    public Map<String, List<SimpleSubscriptionDesc>> getSimpleSubscriptionsOfUserByRepoId(String userEmail, String repoId) throws BrokerException {
265
        Map<String, List<SimpleSubscriptionDesc>> subscriptionsOfUser = getSimpleSubscriptionsOfUser(userEmail);
266

    
267
        return null;
268
    }
269

    
270
    @Override
271
    public Subscription subscribe(OpenaireSubscription obj) throws BrokerException {
272
        final String service = "/subscribe";
273

    
274
        //build the uri params
275
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
276

    
277
        HttpEntity<OpenaireSubscription> entity = new HttpEntity<>(obj, httpHeaders);
278

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

    
297
        return resp.getBody();
298
    }
299

    
300
    @Override
301
    public ResponseEntity<Object> unsubscribe(String subscriptionId) throws BrokerException {
302
        final String service = "/subscriptions/" + subscriptionId;
303

    
304
        //build the uri params
305
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
306

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

    
323
    @Override
324
    public Subscription getSubscription( String subscriptionId) throws BrokerException {
325
        final String service = "/subscriptions/" + subscriptionId;
326

    
327
        //build the uri params
328
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
329

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

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

    
352
    @Override
353
    public EventsPage getNotificationsBySubscriptionId(String subscriptionId,
354
                                                       String page,
355
                                                       String size) throws BrokerException {
356

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

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

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

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

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

    
397

    
398
}
(2-2/20)