Project

General

Profile

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

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

    
26
import java.io.IOException;
27
import java.util.*;
28

    
29
@Component
30
public class BrokerApiImpl implements BrokerApi {
31

    
32

    
33
    @Autowired
34
    private RepositoryApiImpl 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

    
40
    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
41
            .getLogger(BrokerApiImpl.class);
42

    
43
    @Override
44
    public DatasourcesBroker getDatasourcesOfUser(String params) throws JSONException {
45
        JSONObject json_params = new JSONObject(params);
46
        DatasourcesBroker ret = new DatasourcesBroker();
47

    
48
        String userEmail = json_params.getString("userEmail");
49
        boolean includeShared = Boolean.parseBoolean( json_params.getString("includeShared") );
50
        boolean includeByOthers = Boolean.parseBoolean( json_params.getString("includeByOthers") );
51

    
52
        try {
53
            ret.setDatasourcesOfUser(getDatasourcesOfUserType(getRepositoriesOfUser(userEmail)));
54
            if (includeShared) {
55
                //TODO whatever nikonas was saying
56
                List<String> sharedDatasourceIds = new ArrayList<String>();
57
                ret.setSharedDatasources(getDatasourcesOfUserType(getRepositoriesByIds(sharedDatasourceIds)));
58
            }
59

    
60
            if (includeByOthers) {
61
                ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(userEmail)));
62
            }
63
        } catch (BrokerException e) {
64
            e.printStackTrace();
65
        }
66

    
67
        return ret;
68
    }
69

    
70
    @Override
71
    public List<BrowseEntry> getTopicsForDatasource(@PathVariable("datasourceName")  String datasourceName) throws BrokerException {
72
        final String service = "/topicsForDatasource";
73

    
74
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
75
                .queryParam("ds", datasourceName);
76

    
77
        RestTemplate template = new RestTemplate();
78
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
79
        ResponseEntity<List<BrowseEntry>> resp;
80
        try {
81
            resp = template.exchange(
82
                    builder.build().encode().toUri(),
83
                    HttpMethod.GET,
84
                    null,
85
                    new ParameterizedTypeReference<List<BrowseEntry>>() {
86
                    });
87
        } catch (RestClientException e) {
88
            throw new BrokerException(e);
89
        }
90

    
91
        return resp.getBody();
92
    }
93

    
94
    @Override
95
    public EventsPage advancedShowEvents(String params) throws BrokerException, JSONException ,IOException {
96
        JSONObject json_params = new JSONObject(params);
97

    
98
        String page = json_params.getString("page");
99
        String pagesize = json_params.getString("pagesize");
100
        String json_advQueryObject = json_params.getString("advQueryObject");
101

    
102
        ObjectMapper mapper = new ObjectMapper();
103
        AdvQueryObject advQueryObject = mapper.readValue(json_advQueryObject, AdvQueryObject.class);
104

    
105
        final String service = "/events/{page}/{pageSize}";
106

    
107
        Map<String, Long> uriParams = new HashMap<>();
108
        uriParams.put("page", Long.parseLong(page));
109
        uriParams.put("pageSize", Long.parseLong(pagesize));
110

    
111
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
112

    
113
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
114
        headers.add("Content-Type", "application/json");
115

    
116
        advQueryObject.setPage(Long.parseLong(page));
117

    
118
        HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, headers);
119

    
120
        RestTemplate template = new RestTemplate();
121
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
122
        ResponseEntity<EventsPage> resp;
123
        try {
124
            resp = template.exchange(
125
                    builder.buildAndExpand(uriParams).encode().toUri(),
126
                    HttpMethod.POST,
127
                    entity,
128
                    new ParameterizedTypeReference<EventsPage>() {
129
                    }
130
            );
131
        } catch (RestClientException e) {
132
            throw new BrokerException(e);
133
        }
134
        return resp.getBody();
135

    
136

    
137
    }
138

    
139

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

    
142
        List<Tuple<BrowseEntry, String>> entries = new ArrayList<>();
143
        for (Repository repo : repositories) {
144
            BrowseEntry temp = new BrowseEntry();
145
            temp.setValue(repo.getOfficialName());
146
            temp.setSize(new Long(0));
147
            for (BrowseEntry e : getTopicsForDatasource(repo.getOfficialName())) {
148
                temp.setSize(temp.getSize() + e.getSize());
149
            }
150
            Tuple<BrowseEntry, String> tup = new Tuple<>(temp, repo.getLogoUrl());
151
            entries.add(tup);
152
        }
153

    
154
        // sort the collection by the second field of the tuple which is size
155
        Collections.sort(entries, new Comparator<Tuple<BrowseEntry, String>>() {
156
            @Override
157
            public int compare(Tuple<BrowseEntry, String> e1, Tuple<BrowseEntry, String> e2) {
158
                return (int) (e2.getFirst().getSize().longValue() - e1.getFirst().getSize().longValue());
159
            }
160
        });
161

    
162
        return entries;
163
    }
164

    
165

    
166

    
167
    private List<Repository> getRepositoriesOfUser(String userEmail) throws JSONException {
168

    
169
        int page = 0;
170
        int size = 50;
171
        List<Repository> rs ;
172
        List<Repository> resultSet = new ArrayList<>();
173

    
174
        while (true){
175
            rs = repoAPI.getRepositoriesOfUser(userEmail, String.valueOf(page), String.valueOf(size));
176
            resultSet.addAll(rs);
177
            page+=1;
178
            if(rs.size() == 0) break;
179
        }
180
        return resultSet;
181
    }
182

    
183
    private List<Repository> getRepositoriesByIds(List<String> sharedDatasourceIds) {
184
        return null;
185
    }
186

    
187
    @Override
188
    public EventsPage showEvents(String params) throws BrokerException, JSONException {
189

    
190
        JSONObject json_params = new JSONObject(params);
191

    
192
        String datasourceName = json_params.getString("datasourceName");
193
        String topic = json_params.getString("topic");
194
        String page = json_params.getString("page");
195

    
196
        final String service = "/showEvents";
197

    
198
        //build the uri params
199
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
200
                .queryParam("ds", datasourceName)
201
                .queryParam("topic", topic)
202
                .queryParam("page", page);
203

    
204
        //create new template engine
205
        RestTemplate template = new RestTemplate();
206
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
207
        ResponseEntity<EventsPage> resp;
208
        try {
209
            //communicate with endpoint
210
            resp = template.exchange(
211
                    builder.build().encode().toUri(),
212
                    HttpMethod.GET,
213
                    null,
214
                    new ParameterizedTypeReference<EventsPage>() {
215
                    });
216
        } catch (RestClientException e) {
217
            throw new BrokerException(e);
218
        }
219
        return resp.getBody();
220
    }
221

    
222
    @Override
223
    public Map<String, List<SimpleSubscriptionDesc>> getSubscriptionsOfUser(@PathVariable("userEmail") String userEmail) throws BrokerException {
224

    
225
        final String service = "/subscriptions";
226

    
227
        //build the uri params
228
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
229
                .queryParam("email", userEmail);
230

    
231
        //create new template engine
232
        RestTemplate template = new RestTemplate();
233
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
234
        ResponseEntity<Map<String, List<SimpleSubscriptionDesc>>> resp;
235
        try {
236
            //communicate with endpoint
237
            resp = template.exchange(
238
                    builder.build().encode().toUri(),
239
                    HttpMethod.GET,
240
                    null,
241
                    new ParameterizedTypeReference<Map<String, List<SimpleSubscriptionDesc>>>() {
242
                    });
243
        } catch (RestClientException e) {
244
            LOGGER.debug("Error " , e);
245
            throw new BrokerException(e);
246
        }
247
        return resp.getBody();
248
    }
249

    
250
    @Override
251
    public Subscription subscribe(OpenaireSubscription obj) throws BrokerException {
252
        final String service = "/subscribe";
253

    
254
        //build the uri params
255
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
256

    
257
        //Header info
258
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
259
        headers.add("Content-Type", "application/json");
260
        HttpEntity<OpenaireSubscription> entity = new HttpEntity<>(obj, headers);
261

    
262
        //create new template engine
263
        RestTemplate template = new RestTemplate();
264
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
265
        ResponseEntity<Subscription> resp;
266
        try {
267
            //communicate with endpoint
268
            resp = template.exchange(
269
                    builder.build().encode().toUri(),
270
                    HttpMethod.POST,
271
                    entity,
272
                    new ParameterizedTypeReference<Subscription>() {
273
                    });
274
        } catch (RestClientException e) {
275
            throw new BrokerException(e);
276
        }
277

    
278
        return resp.getBody();
279
    }
280

    
281
    @Override
282
    public void unsubscribe(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
283
        final String service = "/subscriptions/" + subscriptionId;
284

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

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

    
304
    @Override
305
    public Subscription getSubscription(@PathVariable("subscriptionId") String subscriptionId) throws BrokerException {
306
        final String service = "/subscriptions/" + subscriptionId;
307

    
308
        //build the uri params
309
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiPath + service);
310

    
311
        //create new template engine
312
        RestTemplate template = new RestTemplate();
313
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
314
        ResponseEntity<Subscription> resp;
315
        try {
316
            //communicate with endpoint
317
            resp = template.exchange(
318
                    builder.build().encode().toUri(),
319
                    HttpMethod.GET,
320
                    null,
321
                    new ParameterizedTypeReference<Subscription>() {
322
                    });
323
        } catch (RestClientException e) {
324
            throw new BrokerException(e);
325
        }
326
        return resp.getBody();
327
    }
328

    
329

    
330

    
331
}
(2-2/10)