Project

General

Profile

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

    
3
import com.fasterxml.jackson.core.JsonProcessingException;
4
import com.fasterxml.jackson.databind.ObjectMapper;
5
import com.fasterxml.jackson.databind.SerializationFeature;
6
import eu.dnetlib.domain.data.Repository;
7
import eu.dnetlib.domain.data.RepositoryInterface;
8
import eu.dnetlib.domain.enabling.Vocabulary;
9
import eu.dnetlib.repo.manager.service.domain.RequestFilter;
10
import eu.dnetlib.repo.manager.service.exception.ResourceNotFoundException;
11
import eu.dnetlib.repo.manager.service.utils.Converter;
12
import eu.dnetlib.repo.manager.shared.*;
13
import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader;
14
import org.apache.commons.codec.digest.DigestUtils;
15
import org.apache.log4j.Logger;
16
import org.json.JSONArray;
17
import org.json.JSONException;
18
import org.json.JSONObject;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.beans.factory.annotation.Value;
21
import org.springframework.core.ParameterizedTypeReference;
22
import org.springframework.http.HttpEntity;
23
import org.springframework.http.HttpHeaders;
24
import org.springframework.http.HttpMethod;
25
import org.springframework.http.ResponseEntity;
26
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
27
import org.springframework.security.access.prepost.PreAuthorize;
28
import org.springframework.stereotype.Component;
29
import org.springframework.web.bind.annotation.PathVariable;
30
import org.springframework.web.bind.annotation.RequestBody;
31
import org.springframework.web.bind.annotation.RequestParam;
32
import org.springframework.web.client.RestClientException;
33
import org.springframework.web.client.RestTemplate;
34
import org.springframework.web.util.UriComponents;
35
import org.springframework.web.util.UriComponentsBuilder;
36

    
37
import javax.annotation.PostConstruct;
38
import java.sql.Timestamp;
39
import java.util.*;
40
import java.util.concurrent.ConcurrentHashMap;
41
import java.util.stream.Collectors;
42

    
43
@Component
44
public class RepositoryApiImpl implements RepositoryApi {
45

    
46
    @Value("${api.baseAddress}")
47
    private String baseAddress;
48

    
49
    private RestTemplate restTemplate = null;
50

    
51
    private HttpHeaders httpHeaders;
52

    
53
    private final String[] vocabularyNames = {"dnet:countries", "dnet:datasource_typologies", "dnet:compatibilityLevel"};
54

    
55
    private static final Logger LOGGER = Logger.getLogger(RepositoryApiImpl.class);
56

    
57
    @Value("${services.repomanager.usageStatisticsDiagramsBaseURL}")
58
    private String usageStatisticsDiagramsBaseURL;
59

    
60
    @Value("${services.repomanager.usageStatisticsNumbersBaseURL}")
61
    private String usageStatisticsNumbersBaseURL;
62

    
63
    @Autowired
64
    private VocabularyLoader vocabularyLoader;
65

    
66
    @Autowired
67
    private PiWikApi piWikApi;
68

    
69
    @Autowired
70
    private EmailUtils emailUtils;
71

    
72
    private Map<String, Vocabulary> vocabularyMap = new ConcurrentHashMap<String, Vocabulary>();
73

    
74
    private Map<String, String> countriesMap = new HashMap<>();
75
    private Map<String, String> inverseCountriesMap = new HashMap<>();
76

    
77
    private static Map<String,List<String>> dataSourceClass = new HashMap<String,List<String>>(){{
78
        put("opendoar",new ArrayList<String>(){{ add("pubsrepository::institutional");
79
                                                    add("pubsrepository::thematic");
80
                                                    add("pubsrepository::unknown");
81
                                                    add("pubsrepository::mock");
82
        }});
83
        put("re3data",new ArrayList<String>(){{ add("datarepository::unknown");
84
        }});
85
        put("journal",new ArrayList<String>(){{ add("pubsrepository::journal");
86
        }});
87
        put("aggregator",new ArrayList<String>(){{ add("aggregator::pubsrepository::institutional");
88
                                                        add("aggregator::pubsrepository::journals");
89
                                                        add("aggregator::datarepository");
90
                                                        add("aggregator::pubsrepository::unknown");
91
        }});
92
    }};
93

    
94
    private static Map<String,String> invertedDataSourceClass = new HashMap<String,String>(){{
95
        put("pubsrepository::institutional","opendoar");
96
        put("pubsrepository::thematic","opendoar");
97
        put("pubsrepository::unknown","opendoar");
98
        put("pubsrepository::mock","opendoar");
99

    
100
        put("datarepository::unknown","re3data");
101

    
102
        put("pubsrepository::journal","journal");
103

    
104
        put("aggregator::pubsrepository::institutional","aggregator");
105
        put("aggregator::pubsrepository::journals","aggregator");
106
        put("aggregator::datarepository","aggregator");
107
        put("aggregator::pubsrepository::unknown","aggregator");
108

    
109
    }};
110

    
111

    
112

    
113
    @PostConstruct
114
    private void init() {
115
        LOGGER.debug("Initialization method of repository api!");
116

    
117
        restTemplate = new RestTemplate();
118
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
119

    
120
        httpHeaders = new HttpHeaders();
121
        httpHeaders.set("Content-Type", "application/json");
122

    
123
        for (String vocName : vocabularyNames) {
124
            vocabularyMap.put(vocName, vocabularyLoader.getVocabulary(vocName, Locale.ENGLISH, Locale.ROOT));
125
        }
126

    
127
        Country[] countries = getCountries();
128
        for (Country c : countries) {
129
            countriesMap.put(c.getName(), c.getCode());
130
            inverseCountriesMap.put(c.getCode(), c.getName());
131
        }
132

    
133

    
134
    }
135

    
136
    @Override
137
    public Country[] getCountries() {
138
        UriComponents uriComponents = UriComponentsBuilder
139
                .fromHttpUrl(baseAddress + "/ds/countries")
140
                .build().encode();
141
        return restTemplate.getForObject(uriComponents.toUri(), Country[].class);
142
    }
143

    
144

    
145
    @Override
146
    public List<Repository> getRepositoriesByCountry(@PathVariable("country") String country,
147
                                                     @PathVariable("mode") String mode,
148
                                                     @RequestParam(value = "managed",required=false) Boolean managed) throws JSONException {
149

    
150
        LOGGER.debug("Getting repositories by country!");
151
        int page = 0;
152
        int size = 100;
153
        List<Repository> resultSet = new ArrayList<>();
154

    
155
        String countryCode = countriesMap.get(country);
156
        String filterKey = "UNKNOWN";
157
        if (mode.equalsIgnoreCase("opendoar"))
158
            filterKey = "openaire____::opendoar";
159
        else if (mode.equalsIgnoreCase("re3data"))
160
            filterKey = "openaire____::re3data";
161

    
162

    
163
        LOGGER.debug("Country code equals : " + countryCode);
164
        LOGGER.debug("Filter mode equals : " + filterKey);
165

    
166
        UriComponents uriComponents = searchDatasource(String.valueOf(page),String.valueOf(size));
167
        RequestFilter requestFilter = new RequestFilter();
168
        requestFilter.setCountry(countryCode);
169

    
170
        try{
171
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
172
            JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo");
173
            while (jsonArray.length() > 0 ) {
174
                resultSet.addAll(this.getRepositoriesByMode(filterKey, Converter.jsonToRepositoryList(new JSONObject(rs))));
175
                page += 1;
176
                uriComponents = searchDatasource(String.valueOf(page),String.valueOf(size));
177
                rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
178
                jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo");
179
            }
180
            for (Repository r : resultSet)
181
                this.updateRepositoryInfo(r);
182

    
183
            return resultSet;
184
        }catch (Exception e){
185
            LOGGER.debug("Exception on getRepositoriesByCountry" , e);
186
            emailUtils.reportException(e);
187
            throw e;
188
        }
189

    
190

    
191
    }
192

    
193
    private Repository updateRepositoryInfo(Repository r) throws JSONException {
194

    
195
        /*
196
        * from datasource class
197
        * we get the datasource type form the inverted map
198
        * */
199
        r.setDatasourceType(getRepositoryType(r.getDatasourceClass()));
200
        r.setInterfaces(this.getRepositoryInterface(r.getId()));
201
        r.setPiwikInfo(piWikApi.getPiwikSiteForRepo(r.getId()));
202
        r.setCountryName(getCountryName(r.getCountryCode()));
203
        return r;
204
    }
205

    
206

    
207
    private Collection<Repository> getRepositoriesByMode(String mode, List<Repository> rs) {
208

    
209
        List<Repository> reps = new ArrayList<>();
210
        for (Repository r : rs) {
211
            if (r.getCollectedFrom() != null && r.getCollectedFrom().equals(mode))
212
                reps.add(r);
213

    
214
        }
215
        return reps;
216
    }
217

    
218
    @Override
219
    @PreAuthorize("hasRole('ROLE_USER')")
220
    public List<Repository> getRepositoriesOfUser(@PathVariable("userEmail") String userEmail,
221
                                                  @PathVariable("page") String page,
222
                                                  @PathVariable("size") String size) throws JSONException {
223

    
224
        LOGGER.debug("Retreiving repositories of user : " + userEmail );
225
        UriComponents uriComponents = searchDatasource(page,size);
226
        RequestFilter requestFilter = new RequestFilter();
227
        requestFilter.setRegisteredby(userEmail);
228

    
229
        try{
230
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
231

    
232
            List<Repository> repos = Converter.jsonToRepositoryList(new JSONObject(rs));
233
            for (Repository r : repos)
234
                this.updateRepositoryInfo(r);
235

    
236
            return repos;
237
        }catch (Exception e){
238
            LOGGER.debug("Exception on getRepositoriesOfUser" , e);
239
            emailUtils.reportException(e);
240
            throw e;
241
        }
242
    }
243

    
244
    @Override
245
    public Repository getRepositoryById(@PathVariable("id") String id) throws JSONException,ResourceNotFoundException {
246

    
247
        LOGGER.debug("Retreiving repositories with id : " + id );
248
        Repository repo = null;
249
        UriComponents uriComponents = searchDatasource("0","100");
250
        RequestFilter requestFilter = new RequestFilter();
251
        requestFilter.setId(id);
252

    
253
        try{
254
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
255
            JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo");
256

    
257
            if(jsonArray.length() == 0)
258
                throw new ResourceNotFoundException();
259

    
260
            repo = Converter.jsonToRepositoryObject(jsonArray.getJSONObject(0));
261
            return updateRepositoryInfo(repo);
262
        }catch (JSONException e){
263
            LOGGER.debug("Exception on getRepositoryById" , e);
264
            emailUtils.reportException(e);
265
            throw e;
266
        }
267

    
268
    }
269

    
270

    
271
    @Override
272
    public List<AggregationDetails> getRepositoryAggregations(@PathVariable("id") String id) throws JSONException {
273

    
274
        LOGGER.debug("Retreiving aggregations for repository with id : " + id );
275
        UriComponents uriComponents = searchDatasource("0","100");
276
        RequestFilter requestFilter = new RequestFilter();
277
        requestFilter.setId(id);
278

    
279
        List<AggregationDetails> aggregationHistory = new ArrayList<>();
280

    
281
        try {
282
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
283
            JSONObject repository = new JSONObject(rs);
284
            aggregationHistory.addAll(Converter.getAggregationHistoryFromJson(repository.getJSONArray("datasourceInfo").getJSONObject(0)));
285
            return aggregationHistory.size() == 0? aggregationHistory : aggregationHistory.stream()
286
                                                    .sorted(Comparator.comparing(AggregationDetails::getDate).reversed())
287
                                                    .limit(20)
288
                                                    .collect(Collectors.toList());
289
        } catch (JSONException e) {
290
            LOGGER.debug("Exception on getRepositoryAggregations" , e);
291
            emailUtils.reportException(e);
292
            throw e;
293
        }
294

    
295
    }
296

    
297
    @Override
298
    public Map<String, List<AggregationDetails>> getRepositoryAggregationsByYear(@PathVariable("id") String id) throws JSONException {
299
        LOGGER.debug("Retreiving aggregations (by year) for repository with id : " + id );
300
        UriComponents uriComponents = searchDatasource("0","100");
301
        RequestFilter requestFilter = new RequestFilter();
302
        requestFilter.setId(id);
303

    
304
        List<AggregationDetails> aggregationHistory = new ArrayList<>();
305
        Map<String, List<AggregationDetails>> aggregationByYear = new HashMap<>();
306
        try {
307
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
308
            JSONObject repository = new JSONObject(rs);
309
            aggregationHistory.addAll(Converter.getAggregationHistoryFromJson(repository.getJSONArray("datasourceInfo").getJSONObject(0)));
310
            return aggregationHistory.size() == 0? aggregationByYear:createYearMap(aggregationHistory);
311

    
312
        } catch (JSONException e) {
313
            LOGGER.debug("Exception on getRepositoryAggregations" , e);
314
            emailUtils.reportException(e);
315
            throw e;
316
        }
317
    }
318

    
319
    private Map<String,List<AggregationDetails>> createYearMap(List<AggregationDetails> aggregationHistory) {
320
        Map<String, List<AggregationDetails>> aggregationByYear;
321
        aggregationHistory = aggregationHistory.stream()
322
                            .sorted(Comparator.comparing(AggregationDetails::getDate).reversed())
323
                            .collect(Collectors.toList());
324

    
325
       return aggregationHistory.stream()
326
                            .collect(Collectors.groupingBy(AggregationDetails::getYear));
327
    }
328

    
329

    
330
    @Override
331
    public List<Repository> getRepositoriesByName(@PathVariable("name") String name,
332
                                                  @PathVariable("page") String page,
333
                                                  @PathVariable("size") String size) throws JSONException {
334

    
335
        LOGGER.debug("Retreiving  repositories with official name : " + name );
336
        UriComponents uriComponents = searchDatasource("0","100");
337
        RequestFilter requestFilter = new RequestFilter();
338
        requestFilter.setOfficialname(name);
339

    
340
        try{
341
            String rs = restTemplate.postForObject(uriComponents.toUri(),requestFilter, String.class);
342
            List<Repository> repos = Converter.jsonToRepositoryList(new JSONObject(rs));
343
            for (Repository r : repos)
344
                updateRepositoryInfo(r);
345
            return repos;
346
        }catch (Exception e){
347
            LOGGER.debug("Exception on getRepositoriesByName" , e);
348
            emailUtils.reportException(e);
349
            throw e;
350
        }
351

    
352
    }
353

    
354
    @Override
355
    public List<RepositoryInterface> getRepositoryInterface(@PathVariable("id") String id) throws JSONException {
356

    
357
        UriComponents uriComponents = UriComponentsBuilder
358
                .fromHttpUrl(baseAddress + "/ds/api/")
359
                .path("/{id}")
360
                .build().expand(id).encode();
361

    
362
        try{
363
            String rs = restTemplate.getForObject(uriComponents.toUri(), String.class);
364
            return Converter.jsonToRepositoryInterfaceList(new JSONObject(rs));
365
        }catch (Exception e ){
366
            LOGGER.debug("Exception on getRepositoryInterface" , e);
367
            emailUtils.reportException(e);
368
            throw e;
369
        }
370

    
371
    }
372

    
373
    @Override
374
    @PreAuthorize("hasRole('ROLE_USER') and #repository.registeredBy == authentication.userInfo.email")
375
    public Repository addRepository(@RequestParam("datatype") String datatype,
376
                                    @RequestBody Repository repository) throws Exception {
377

    
378
        repository = this.setRepositoryFeatures(datatype,repository);
379
        LOGGER.debug("storing " + datatype + " repository with id: " + repository.getId());
380
        this.storeRepository(repository);
381
        return repository;
382
    }
383

    
384
    @Override
385
    @PreAuthorize("hasRole('ROLE_USER') and #repository.registeredBy == authentication.userInfo.email")
386
    public Repository updateRepository(@RequestBody Repository repository) throws JSONException {
387
        UriComponents uriComponents = UriComponentsBuilder
388
                .fromHttpUrl(baseAddress + "/ds/update/")
389
                .build()
390
                .encode();
391

    
392
        try {
393
            String json_repository = Converter.repositoryObjectToJson(repository);
394
            HttpEntity<String> httpEntity = new HttpEntity <String> (json_repository,httpHeaders);
395
            restTemplate.postForObject(uriComponents.toUri(),httpEntity,String.class);
396
            return repository;
397
        }catch (Exception e){
398
            LOGGER.debug("Exception on updateRepository" , e);
399
            emailUtils.reportException(e);
400
            throw e;
401
        }
402

    
403
    }
404

    
405
    private Repository setRepositoryFeatures(String datatype, Repository repository) {
406

    
407
        //TODO update map
408
        repository.setCountryCode(countriesMap.get(repository.getCountryName()));
409
        repository.setActivationId(UUID.randomUUID().toString());
410
        repository.setCollectedFrom("infrastruct_::openaire");
411

    
412
        if (datatype.equals("journal")) {
413
            repository.setId("openaire____::issn" + repository.getIssn());
414
            repository.setNamespacePrefix("issn" + repository.getIssn());
415
        }else if (datatype.equals("aggregator")) {
416
            repository.setId("openaire____::" + com.unboundid.util.Base64.encode(repository.getOfficialName()));
417
            repository.setNamespacePrefix(DigestUtils.md5Hex(repository.getOfficialName()).substring(0,12));
418
        }
419

    
420
        return repository;
421
    }
422

    
423
    private void updateInterface(String datatype,RepositoryInterface iFace) {
424
        //TODO call update base url
425
        //((DatasourceManagerService) this.dmService.getService()).updateBaseUrl(repo.getId(), iFace.getId(), iFace.getBaseUrl());
426
        if (!iFace.getAccessSet().isEmpty()) {
427
            LOGGER.debug("set not empty: " + iFace.getAccessSet());
428
            //TODO call update method for access params
429
            // ((DatasourceManagerService) this.dmService.getService()).updateAccessParam(repo.getId(), iFace.getId(), "set", iFace.getAccessSet(), false);
430
        } else {
431
            //TODO call deleteAccessParamOrExtraField
432
            //((DatasourceManagerService) this.dmService.getService()).deleteAccessParamOrExtraField(repo.getId(), iFace.getId(), "set");
433
        }
434
        //TODO update content description
435
        //((DatasourceManagerService) this.dmService.getService()).updateContentDescription(repo.getId(), iFace.getId(), "metadata");
436
        if (datatype.equals("re3data")) {
437
            //TODO call update access params
438
            //  ((DatasourceManagerService) this.dmService.getService()).updateAccessParam(repo.getId(), iFace.getId(), "format", "oai_datacite", false);
439
            iFace.setAccessFormat("oai_datacite");
440
        } else {
441
            //TODO call update access params
442
            //((DatasourceManagerService) this.dmService.getService()).updateAccessParam(repo.getId(), iFace.getId(), "format", "oai_dc", false);
443
            iFace.setAccessFormat("oai_dc");
444
        }
445

    
446
    }
447

    
448
    private void storeRepository(Repository repository) throws JSONException {
449

    
450
        Date utilDate = new Date();
451
        Timestamp date = new Timestamp(utilDate.getTime());
452
        repository.setDateOfCollection(date);
453
        repository.setAggregator("OPENAIRE");
454
        repository.setCountryCode(countriesMap.get(repository.getCountryName()));
455

    
456
        UriComponents uriComponents = UriComponentsBuilder
457
                .fromHttpUrl(baseAddress + "/ds/add/")
458
                .build()
459
                .encode();
460
        String json_repository = Converter.repositoryObjectToJson(repository);
461

    
462
        ObjectMapper mapper = new ObjectMapper();
463
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
464
        try {
465
            LOGGER.debug(mapper.writeValueAsString(json_repository));
466
        } catch (JsonProcessingException e) {
467
            e.printStackTrace();
468
        }
469

    
470
        HttpEntity<String> httpEntity = new HttpEntity <String> (json_repository,httpHeaders);
471
        restTemplate.postForObject(uriComponents.toUri(),httpEntity,String.class);
472
    }
473

    
474
    @Override
475
    @PreAuthorize("hasRole('ROLE_USER') and #registeredBy == authentication.userInfo.email")
476
    public void deleteRepositoryInterface(@RequestParam("id") String id ,
477
                                          @RequestParam("registeredBy") String registeredBy){
478
        UriComponents uriComponents = UriComponentsBuilder
479
                .fromHttpUrl(baseAddress + "/ds/api/")
480
                .path("/{id}")
481
                .build().expand(id).encode();
482
        LOGGER.debug(uriComponents.toUri());
483
        restTemplate.delete(uriComponents.toUri());
484
    }
485

    
486
    @Override
487
    @PreAuthorize("hasRole('ROLE_USER') and #registeredBy == authentication.userInfo.email")
488
    public RepositoryInterface addRepositoryInterface(@RequestParam("datatype") String datatype,
489
                                                      @RequestParam("repoId") String repoId,
490
                                                      @RequestParam("registeredBy") String registeredBy,
491
                                                      @RequestBody RepositoryInterface repositoryInterface) throws JSONException,ResourceNotFoundException {
492
        try {
493
            Repository e = this.getRepositoryById(repoId);
494
            repositoryInterface = createRepositoryInterface(e,repositoryInterface,datatype);
495
            String json_interface = Converter.repositoryInterfaceObjectToJson(e,repositoryInterface);
496

    
497
            UriComponents uriComponents = UriComponentsBuilder
498
                    .fromHttpUrl(baseAddress + "/ds/api/add/")
499
                    .build()
500
                    .encode();
501

    
502
            HttpEntity<String> httpEntity = new HttpEntity <String> (json_interface,httpHeaders);
503
            restTemplate.postForObject(uriComponents.toUri(),httpEntity,String.class);
504
            return repositoryInterface;
505

    
506
        } catch (JSONException e) {
507
            LOGGER.debug("Exception on addRepositoryInterface" , e);
508
            emailUtils.reportException(e);
509
            throw e;
510
        }
511
    }
512

    
513
    private RepositoryInterface createRepositoryInterface(Repository repo, RepositoryInterface iFace, String datatype) {
514

    
515
        iFace.setContentDescription("metadata");
516
        iFace.setCompliance("UNKNOWN");
517

    
518
        if (datatype.equals("re3data"))
519
            iFace.setAccessFormat("oai_datacite");
520
        else
521
            iFace.setAccessFormat("oai_dc");
522

    
523

    
524
        if (repo.getDatasourceClass() != null && !repo.getDatasourceClass().isEmpty())
525
            iFace.setTypology(repo.getDatasourceClass());
526
        else if (datatype.equalsIgnoreCase("journal"))
527
            iFace.setTypology("pubsrepository::journal");
528
        else if (datatype.equalsIgnoreCase("aggregator"))
529
            iFace.setTypology("aggregator::pubsrepository::unknown");
530
        else if (datatype.equalsIgnoreCase("opendoar"))
531
            iFace.setTypology("pubsrepository::unknown");
532
        else if (datatype.equalsIgnoreCase("re3data"))
533
            iFace.setTypology("datarepository::unknown");
534

    
535
        iFace.setRemovable(true);
536
        iFace.setAccessProtocol("oai");
537
        iFace.setMetadataIdentifierPath("//*[local-name()='header']/*[local-name()='identifier']");
538
        iFace.setId("api_________::" + repo.getId() + "::" + UUID.randomUUID().toString().substring(0, 8));
539
        if (iFace.getAccessSet().isEmpty()) {
540
            LOGGER.debug("set is empty: " + iFace.getAccessSet());
541
            iFace.removeAccessSet();
542
        }
543
        return iFace;
544
    }
545

    
546
    @Override
547
    public List<String> getDnetCountries() {
548
        LOGGER.debug("Getting dnet-countries!");
549
        return Converter.readFile("countries.txt");
550
    }
551

    
552
    @Override
553
    public List<String> getTypologies() {
554
        return Converter.readFile("typologies.txt");
555
    }
556

    
557
    @Override
558
    public List<Timezone> getTimezones() {
559
        List<String> timezones =  Converter.readFile("timezones.txt");
560
        return Converter.toTimezones(timezones);
561
    }
562

    
563
    @Override
564
    @PreAuthorize("hasRole('ROLE_USER')")
565
    public List<String> getUrlsOfUserRepos(@PathVariable("user_email") String userEmail,
566
                                           @PathVariable("page") String page,
567
                                           @PathVariable("size") String size) throws JSONException {
568
        UriComponents uriComponents = UriComponentsBuilder
569
                .fromHttpUrl(baseAddress + "/api/baseurl/")
570
                .path("/{page}/{size}")
571
                .build().expand(page,size).encode();
572

    
573
        try{
574
            RequestFilter requestFilter = new RequestFilter();
575
            requestFilter.setRegisteredby(userEmail);
576
            return Arrays.asList(restTemplate.postForObject(uriComponents.toUri(),requestFilter, String[].class));
577
        }catch (Exception e){
578
            LOGGER.debug("Exception on addRepositoryInterface" , e);
579
            emailUtils.reportException(e);
580
            throw e;
581
        }
582
    }
583

    
584
    @Override
585
    public List<String> getDatasourceVocabularies(@PathVariable("mode") String mode) {
586

    
587
        List<String> resultSet = new ArrayList<>();
588
        for (Map.Entry<String, String> entry : this.getVocabulary("dnet:datasource_typologies").getAsMap().entrySet()) {
589
            if (mode.equalsIgnoreCase("aggregator")) {
590
                if (entry.getKey().contains("aggregator"))
591
                    resultSet.add(entry.getValue());
592
            } else if (mode.equalsIgnoreCase("journal")) {
593
                if (entry.getKey().contains("journal"))
594
                    resultSet.add(entry.getValue());
595
            } else if (mode.equalsIgnoreCase("opendoar")) {
596
                if (entry.getKey().contains("pubsrepository"))
597
                    resultSet.add(entry.getValue());
598
            } else if (mode.equalsIgnoreCase("re3data")) {
599
                if (entry.getKey().contains("datarepository"))
600
                    resultSet.add(entry.getValue());
601
            }
602
        }
603

    
604

    
605
        return resultSet;
606
    }
607

    
608
    private Vocabulary getVocabulary(String vocName) {
609

    
610
        if (!vocabularyMap.containsKey(vocName)) {
611
            vocabularyMap.put(vocName, vocabularyLoader.getVocabulary(vocName, Locale.ENGLISH, Locale.ROOT));
612
        }
613
        return vocabularyMap.get(vocName);
614
    }
615

    
616

    
617
    @Override
618
    public Map<String, String> getCompatibilityClasses(@PathVariable("mode") String mode)  {
619

    
620
        LOGGER.debug("Getting compatibility classes for mode: " + mode);
621
        Map<String, String> retMap = new HashMap<String, String>();
622

    
623
        Map<String, String> compatibilityClasses = this.getVocabulary("dnet:compatibilityLevel").getAsMap();
624
        boolean foundData = false;
625
        for (Map.Entry<String, String> entry : compatibilityClasses.entrySet()) {
626
            if (mode.equalsIgnoreCase(Constants.REPOSITORY_MODE_ALL))
627
                return compatibilityClasses;
628
            else if (mode.equalsIgnoreCase(Constants.REPOSITORY_MODE_RE3DATA)) {
629
                if (entry.getKey().matches("^openaire[1-9].0_data$")) {
630
                    retMap.put(entry.getKey(), entry.getValue());
631
                    foundData = true;
632
                }
633
            } else {
634
                if (entry.getKey().matches("^openaire[1-9].0$") || entry.getKey().equals("driver"))
635
                    retMap.put(entry.getKey(), entry.getValue());
636
            }
637
        }
638

    
639
        //TODO TO BE REMOVED WHEN VOCABULARIES ARE UPDATED
640
        if (mode.equalsIgnoreCase(Constants.REPOSITORY_MODE_RE3DATA) && !foundData)
641
            retMap.put("openaire2.0_data", "OpenAIRE Data (funded, referenced datasets)");
642

    
643
        return retMap;
644
    }
645

    
646
    @Override
647
    public Map<String, String> getDatasourceClasses(@PathVariable("mode") String mode)  {
648

    
649
        LOGGER.debug("Getting datasource classes for mode: " + mode);
650

    
651
        Map<String, String> retMap = new HashMap<String, String>();
652

    
653
        for (Map.Entry<String, String> entry : this.getVocabulary("dnet:datasource_typologies").getAsMap().entrySet()) {
654
            if (mode.equalsIgnoreCase("aggregator")) {
655
                if (entry.getKey().contains("aggregator"))
656
                    retMap.put(entry.getKey(), entry.getValue());
657
            } else if (mode.equalsIgnoreCase("journal")) {
658
                if (entry.getKey().contains("journal"))
659
                    retMap.put(entry.getKey(), entry.getValue());
660
            } else if (mode.equalsIgnoreCase("opendoar")) {
661
                if (entry.getKey().contains("pubsrepository"))
662
                    retMap.put(entry.getKey(), entry.getValue());
663
            } else if (mode.equalsIgnoreCase("re3data")) {
664
                if (entry.getKey().contains("datarepository"))
665
                    retMap.put(entry.getKey(), entry.getValue());
666
            }
667
        }
668
        return filterResults(retMap,mode);
669

    
670
    }
671

    
672
    private Map<String,String> filterResults(Map<String, String> map,String mode) {
673

    
674
        HashMap<String,String> filteredMap = new HashMap<>();
675
        for(String key:map.keySet())
676
            if(dataSourceClass.get(mode).contains(key))
677
                filteredMap.put(key,map.get(key));
678

    
679
        return filteredMap;
680
    }
681

    
682
    @Override
683
    public String getCountryName(String countryCode) {
684
        return inverseCountriesMap.get(countryCode);
685
    }
686

    
687
    @Override
688
    public MetricsInfo getMetricsInfoForRepository(@PathVariable("repoId")  String repoId) throws RepositoryServiceException {
689
        try {
690

    
691
            MetricsInfo metricsInfo = new MetricsInfo();
692
            metricsInfo.setDiagramsBaseURL(this.usageStatisticsDiagramsBaseURL);
693
            metricsInfo.setMetricsNumbers(getMetricsNumbers(getOpenAIREId(repoId)));
694
            return metricsInfo;
695

    
696
        } catch (Exception e) {
697
            LOGGER.error("Error while getting metrics info for repository: ", e);
698
            emailUtils.reportException(e);
699
            throw new RepositoryServiceException("General error", RepositoryServiceException.ErrorCode.GENERAL_ERROR);
700
        }
701
    }
702

    
703
    @Override
704
    public Map<String, String> getListLatestUpdate(@PathVariable("mode")  String mode) throws JSONException {
705
        if(mode.equals("opendoar"))
706
            return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::"+mode).get(0).getLastCollectionDate());
707
        else
708
            /*
709
            * first api of re3data has null value on collection date
710
            * */
711
            return Collections.singletonMap("lastCollectionDate", getRepositoryInterface("openaire____::"+mode).get(1).getLastCollectionDate());
712
    }
713

    
714
    @Override
715
    @PreAuthorize("hasRole('ROLE_USER') and #registeredBy == authentication.userInfo.email")
716
    public RepositoryInterface updateRepositoryInterface(@RequestParam("repoId") String repoId,
717
                                                         @RequestParam("registeredBy") String registeredBy,
718
                                                         @RequestBody RepositoryInterface repositoryInterface) throws JSONException {
719

    
720
        this.updateBaseUrl(repoId,repositoryInterface.getId(),repositoryInterface.getBaseUrl());
721
        this.updateCompliance(repoId,repositoryInterface.getId(),repositoryInterface.getCompliance());
722
        this.updateValidationSet(repoId,repositoryInterface.getId(),repositoryInterface.getAccessSet());
723
        return repositoryInterface;
724
    }
725

    
726
    private void updateValidationSet(String repositoryId, String repositoryInterfaceId, String validationSet) {
727
        UriComponents uriComponents = UriComponentsBuilder
728
                .fromHttpUrl(baseAddress + "/ds/api/oaiset")
729
                .queryParam("dsId",repositoryId)
730
                .queryParam("apiId",repositoryInterfaceId)
731
                .queryParam("oaiSet",validationSet)
732
                .build().encode();
733
        restTemplate.postForObject(uriComponents.toUri(),null,String.class);
734
    }
735

    
736

    
737
    private void updateBaseUrl(String repositoryId, String repositoryInterfaceId, String baseUrl) {
738
        UriComponents uriComponents = UriComponentsBuilder
739
                .fromHttpUrl(baseAddress + "/ds/api/baseurl")
740
                .queryParam("dsId",repositoryId)
741
                .queryParam("apiId",repositoryInterfaceId)
742
                .queryParam("baseUrl",baseUrl)
743
                .build().encode();
744
        restTemplate.postForObject(uriComponents.toUri(),null,String.class);
745
    }
746

    
747
    private void updateCompliance(String repositoryId, String repositoryInterfaceId,String compliance) {
748
        UriComponents uriComponents = UriComponentsBuilder
749
                .fromHttpUrl(baseAddress + "/ds/api/compliance")
750
                .queryParam("dsId",repositoryId)
751
                .queryParam("apiId",repositoryInterfaceId)
752
                .queryParam("compliance",compliance)
753
                .build().encode();
754
        restTemplate.postForObject(uriComponents.toUri(),null,String.class);
755
    }
756

    
757
    private MetricsNumbers getMetricsNumbers(String openAIREID) throws BrokerException {
758

    
759
        //build the uri params
760
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.usageStatisticsNumbersBaseURL + openAIREID + "/clicks");
761

    
762
        //create new template engine
763
        RestTemplate template = new RestTemplate();
764
        template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
765
        ResponseEntity<MetricsNumbers> resp;
766
        try {
767
            //communicate with endpoint
768
            resp = template.exchange(
769
                    builder.build().encode().toUri(),
770
                    HttpMethod.GET,
771
                    null,
772
                    new ParameterizedTypeReference<MetricsNumbers>() {
773
                    });
774
        } catch (RestClientException e) {
775
            LOGGER.debug("Exception on getMetricsNumbers" , e);
776
            emailUtils.reportException(e);
777
            throw e;
778
        }
779

    
780
        return resp.getBody();
781
    }
782

    
783
    private String getOpenAIREId(String repoId) {
784

    
785
        if (repoId != null && repoId.contains("::")) {
786
            return repoId.split("::")[0] + "::" + DigestUtils.md5Hex(repoId.split("::")[1]);
787
        }
788

    
789
        return null;
790
    }
791

    
792
    private UriComponents searchDatasource(String page,String size){
793

    
794
        return UriComponentsBuilder
795
                .fromHttpUrl(baseAddress + "/ds/search/")
796
                .path("/{page}/{size}/")
797
                .queryParam("requestSortBy","id")
798
                .queryParam("order","ASCENDING")
799
                .build().expand(page, size).encode();
800
    }
801

    
802
    private String getRepositoryType(String typology){
803
        return invertedDataSourceClass.get(typology);
804
    }
805

    
806

    
807
}
(11-11/19)