Compare commits

..

8 Commits

123 changed files with 3821 additions and 5250 deletions

4
.gitignore vendored
View File

@ -1,4 +0,0 @@
# Ignore directories
.idea
target

View File

@ -1,176 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

218
README.md
View File

@ -1,218 +0,0 @@
# OpenAIRE Provide - backend service
## Introduction
OpenAIRE PROVIDE is the content gateway service of OpenAIRE, where data providers are invited to connect scholarly content with OpenAIRE.<br>
OpenAIRE PROVIDE allows repositories, data archives, journals, aggregators, CRIS systems, to enter the OpenAIRE and European Open Science (EOSC) ecosystem and be accessible by millions of researchers, research institutes and networks, research funders, policy makers and citizens.<br>
OpenAIRE PROVIDE lowers any technological barriers, by supporting a series of integrations, therefore, enabling its users to visually access OpenAIRE's services that are responsible for the data harvesting process.
<br><br>
There are four distinctive steps from the initial express of interest for OpenAIRE PROVIDE to the actual content availability on OpenAIRE and EOSC.
<br>
The steps indicate the important subservices of OpenAIRE that perform the following functionalities:
- Validation of data sources with the OpenAIRE guidelines (via the OpenAIRE Validator)
- Registration of data sources to OpenAIRE and global interlinked networks provides links to content for text and data mining, view history of validations, status of harvesting Enrichment of metadata information that describes the data sources to be available through OpenAIRE.
- Subscribe and view/receive notifications to enrich the metadata or the content of the data source (via the OpenAIRE Broker)
- View usage statistics of Open research impact by subscribing to the OpenAIRE UsageCounts service; view aggregated, cleaned usage stats for repository access and broaden your mechanisms for impact assessment.
<br>
## Architecture
[...]
<br>
## Building
The backend is a [Maven](https://maven.apache.org/index.html) project. It has been tested using Java 8.
<br>
#### Manual Build Instructions
###### Requirements:
- Java 8
- Apache Maven 3+
###### Build Instructions:
1. Clone the repository and move inside the directory
<br> `git clone https://code-repo.d4science.org/MaDgIK/uoa-repository-manager-service.git && cd uoa-repository-manager-service`
2. Provide all not-set or redacted configurations, inside the **src/main/resources/application.yml** file.
3. Build Maven project
<br> `mvn clean package`
<br> Produces the file "./target/**uoa-repository-manager-service.jar**" which can be run with: - Run the app with: `java -jar ./target/uoa-repository-manager-service.jar`
#### Build using Docker
The repository contains a **Dockerfile** which can be used to build an image containing the compiled project.
###### Requirements:
- Docker
###### Build Instructions:
1. Clone the repository and move inside the directory
<br> `git clone https://code-repo.d4science.org/MaDgIK/uoa-repository-manager-service.git && cd uoa-repository-manager-service`
2. Provide all not-set or redacted configurations, inside the **src/main/resources/application.yml** file.
3. Build Docker image
<br> `docker build . -t <docker-image-name>`
<br>
## Configuration
The configuration can be set inside the **src/main/resources/application.yml** file.
### Server-related configuration.
```
server:
port: 8480
servlet:
context-path: /uoa-repository-manager-service
```
### Swagger UI - related configuration
```
springdoc:
swagger-ui:
disable-swagger-default-url: true
path: /swagger-ui.html
displayRequestDuration: true
api-docs:
path: /api-docs
```
### Datasource -related configuration
```
spring:
jpa:
hibernate:
ddl-auto: update
datasource:
url: ${services.provide.db.url}
username: ${services.provide.db.username}
password: ${services.provide.db.password}
driverClassName: ${services.provide.db.driverClassName}
```
### Configurations about the provide service.
```
services:
openaireServicesBaseUrl: https://beta.services.openaire.eu
provide:
dev-machine: 88.197.53.71 # VM-71
```
### Configuration about Authentication and authorization infrastructure (AAI).
```
aai:
baseURL: https://aai.openaire.eu
oidc:
domain: .openaire.eu # use empty value for local, otherwise: ".openaire.eu"
id: XX
issuer: ${services.provide.aai.baseURL}/oidc/
redirectURL: http://localhost:${server.port}${server.servlet.context-path}/openid_connect_login
secret: XX
webURL: http://localhost:4200/join
registry:
coid: XX
username: XX
password: XX
production: false
url: ${services.provide.aai.baseURL}/registry/
```
### Broker's configuration
```
broker:
api: api/
openaire: openaireBroker
port: 443
url: https://beta.broker.openaire.eu
```
### Client's configuration
```
clients:
dsm: ${services.provide.baseUrl}
search: ${services.openaireServicesBaseUrl}/search/v2/api
usageEvents: http://beta.lbs.openaire.eu:8080/ajax/summary
usagestats: ${services.openaireServicesBaseUrl}/usagestats
```
### Database configuration for Provide.
```
db:
driverClassName: org.postgresql.Driver
password: dnetPwd
url: jdbc:postgresql://${services.provide.dev-machine}:5432/repomanager
username: dnet
```
### Configuration for the IS LookUp service.
```
iSLookUpService:
url: https://dev-openaire.d4science.org:443/is/services/isLookUp
```
### Mail-server configuration.
```
mail:
authenticate: true
debug: false
from: XX
host: smtp.gmail.com
mode: ssl
password: XX
port: 465
replyTo: XX
username: XX
```
### Redis's configuration
```
redis:
host: vereniki.athenarc.gr
password: XX
port: 6379
```
### Usage statistics
```
usageStatisticsDiagramsBaseURL: https://beta.openaire.eu/stats3/
usageStatisticsNumbersBaseURL: ${services.openaireServicesBaseUrl}/usagestats/datasources/
usagestats:
adminEmail: XX
sushiliteEndpoint: ${services.openaireServicesBaseUrl}/usagestats/sushilite/
sushiliteR5Endpoint: ${services.openaireServicesBaseUrl}/usagestats_r5/sushilite/r5/
```
### Validator - related configuration.
```
validator:
results:
url: https://beta.provide.openaire.eu/compatibility/browseHistory/
validatorService:
url: http://${services.provide.dev-machine}:8080/uoa-validator-service/services/validatorWebService
```
### Miscellaneous
```
topic_types:
url: ${services.openaireServicesBaseUrl}/provision/mvc/vocabularies/dnet:topic_types.json
adminEmail: XX
analyticsURL: https://analytics.openaire.eu/addsite.php?
baseUrl: ${services.openaireServicesBaseUrl}/openaire
```
<br>
## Deployment
### Prerequisites
* install [PostgreSQL 9.5+](https://www.postgresql.org/)
* Run the app with: `java -jar ./target/uoa-repository-manager-service.jar --spring.config.location=application.yml`
<br>
## misc
### Notes for Swagger-UI:
- Access it through this url: http://localhost:8480/uoa-repository-manager-service/swagger-ui/index.html
- In order to request data from most endpoints, you have to be a "REGISTERED_USER", otherwise you will get a 403 error code.
- In order to be a registered user, you have to run the [UI-service](https://code-repo.d4science.org/MaDgIK/uoa-repository-manager-ui) , in the same machine, at the same time and login through a browser, using the following url: http://localhost:8480/uoa-repository-manager-service/openid_connect_login

379
pom.xml
View File

@ -6,25 +6,23 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <version>2.5.4</version>
<relativePath></relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>eu.dnetlib</groupId> <groupId>eu.dnetlib</groupId>
<artifactId>uoa-repository-manager-service</artifactId> <artifactId>uoa-repository-manager-service</artifactId>
<version>1.1.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<spring.boot.version>2.7.18</spring.boot.version> <spring.boot.version>2.5.4</spring.boot.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -32,86 +30,56 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId> <artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.boot.version}</version> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId> <artifactId>spring-boot-starter-data-jdbc</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId> <artifactId>spring-boot-actuator-autoconfigure</artifactId>
<version>${spring.boot.version}</version> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring.boot.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
<version>${spring.boot.version}</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<!--
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.1</version>
</dependency>
-->
<!--
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>javax.el</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>javax.el-api</artifactId>
<version>${spring.boot.version}</version> <version>3.0.0</version>
<scope>test</scope>
</dependency> </dependency>
<dependency> -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring.boot.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.boot.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
</dependency>
<dependency>
<groupId>eu.dnetlib.dhp</groupId>
<artifactId>dnet-exporter-model</artifactId>
<version>[3.5.1, )</version>
<exclusions>
<exclusion>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/io.micrometer/micrometer-registry-prometheus -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.12.4</version>
</dependency>
<dependency> <dependency>
<groupId>eu.dnetlib</groupId> <groupId>eu.dnetlib</groupId>
<artifactId>uoa-clients</artifactId> <artifactId>uoa-clients</artifactId>
@ -121,6 +89,7 @@
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
@ -153,16 +122,41 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework</groupId>-->
<!-- <artifactId>spring-webmvc</artifactId>-->
<!-- <version>${spring.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.hibernate</groupId>-->
<!-- <artifactId>hibernate-validator-annotation-processor</artifactId>-->
<!-- <version>4.1.0.Final</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>log4j</groupId>-->
<!-- <artifactId>log4j</artifactId>-->
<!-- <version>${log4j.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>eu.dnetlib</groupId>
<artifactId>uoa-domain</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0)</version>
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <dependency>
<groupId>eu.dnetlib</groupId> <groupId>eu.dnetlib</groupId>
<artifactId>dnet-openaire-usage-stats-sushilite</artifactId> <artifactId>dnet-openaire-usage-stats-sushilite</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>eu.dnetlib</groupId>
<artifactId>dnet-openaire-usage-stats-sushilite-r5</artifactId>
<version>1.1.0</version>
</dependency>
<dependency> <dependency>
<groupId>eu.dnetlib.dhp</groupId> <groupId>eu.dnetlib.dhp</groupId>
<artifactId>dnet-openaire-broker-common</artifactId> <artifactId>dnet-openaire-broker-common</artifactId>
@ -174,17 +168,16 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>cglib</groupId> <groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId> <artifactId>cglib-nodep</artifactId>
<version>3.3.0</version> <version>2.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.16.0</version> <version>2.4</version>
</dependency> </dependency>
<dependency> <dependency>
@ -192,58 +185,102 @@
<artifactId>oai4j</artifactId> <artifactId>oai4j</artifactId>
<version>[0.6b1,)</version> <version>[0.6b1,)</version>
</dependency> </dependency>
<!-- TODO - Do we need this? -->
<dependency> <dependency>
<groupId>xalan</groupId> <groupId>xalan</groupId>
<artifactId>xalan</artifactId> <artifactId>xalan</artifactId>
<version>2.7.3</version> <version>2.7.2</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client --> <!-- <dependency>-->
<!-- <groupId>xerces</groupId>-->
<!-- <artifactId>xercesImpl</artifactId>-->
<!-- <version>2.11.0</version>-->
<!-- </dependency>-->
<!--
<dependency> <dependency>
<groupId>org.glassfish.jersey.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
<scope>compile</scope>
</dependency>
-->
<!-- <dependency>-->
<!-- <groupId>org.springframework</groupId>-->
<!-- <artifactId>spring-context</artifactId>-->
<!-- <version>${spring.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework</groupId>-->
<!-- <artifactId>spring-jdbc</artifactId>-->
<!-- <version>${spring.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId> <artifactId>jersey-client</artifactId>
<version>2.42</version> <version>1.19.3</version>
</dependency> </dependency>
<!-- TODO - Do we need this? We already have: "com.google.code.gson:gson" -->
<dependency> <dependency>
<groupId>org.aksw.gson</groupId> <groupId>org.aksw.gson</groupId>
<artifactId>gson-utils-core</artifactId> <artifactId>gson-utils-core</artifactId>
<version>1.0.1</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.json</groupId> <groupId>org.json</groupId>
<artifactId>json</artifactId> <artifactId>json</artifactId>
<version>20240303</version> <version>20080701</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.mail</groupId> <groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId> <artifactId>javax.mail</artifactId>
<version>1.6.2</version> <version>1.6.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency> <dependency>
<groupId>org.postgresql</groupId> <groupId>io.springfox</groupId>
<artifactId>postgresql</artifactId> <artifactId>springfox-swagger2</artifactId>
<version>42.7.3</version> <version>2.7.0</version>
</dependency> </dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/postgresql/postgresql -->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina -->
<!-- <dependency>-->
<!-- <groupId>org.apache.tomcat</groupId>-->
<!-- <artifactId>tomcat-catalina</artifactId>-->
<!-- <version>9.0.22</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>1.5</version> <version>1.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mitre</groupId> <groupId>org.mitre</groupId>
<artifactId>openid-connect-client</artifactId> <artifactId>openid-connect-client</artifactId>
<version>1.3.4</version> <version>1.3.0</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
@ -254,40 +291,55 @@
<dependency> <dependency>
<groupId>org.springframework.session</groupId> <groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId> <artifactId>spring-session-data-redis</artifactId>
<version>2.7.4</version>
</dependency> </dependency>
<!--
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.5.1</version>
<type>pom</type>
</dependency>
-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency> <dependency>
<groupId>redis.clients</groupId> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId> <artifactId>jedis</artifactId>
<version>${jedis.version}</version> <!-- This property comes from the parent-pom. --> <version>${jedis.version}</version>
<!--<version>3.7.0</version>--> <!--<version>3.7.0</version>-->
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> <dependency>
<dependency> <groupId>org.apache.commons</groupId>
<groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId>
<artifactId>commons-pool2</artifactId> </dependency>
<version>2.12.0</version>
</dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.10.1</version> <version>2.6.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.thetransactioncompany</groupId> <groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId> <artifactId>cors-filter</artifactId>
<version>3.0</version> <version>2.5</version>
</dependency> </dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.18</version>
</dependency>
<!--
<dependency>
<groupId>com.netflix.rxjava</groupId>
<artifactId>rxjava-core</artifactId>
<version>0.20.7</version>
</dependency>
-->
<!-- https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api --> <!-- https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api -->
<dependency> <dependency>
<groupId>javax.xml.ws</groupId> <groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId> <artifactId>jaxws-api</artifactId>
<version>2.3.1</version> <version>2.3.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/javax.jws/javax.jws-api --> <!-- https://mvnrepository.com/artifact/javax.jws/javax.jws-api -->
<dependency> <dependency>
@ -298,23 +350,23 @@
<dependency> <dependency>
<groupId>javax.xml.bind</groupId> <groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId> <artifactId>jaxb-api</artifactId>
<version>2.3.1</version> <version>2.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.xml.bind</groupId> <groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId> <artifactId>jaxb-impl</artifactId>
<version>2.3.9</version> <version>2.3.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core --> <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core -->
<dependency> <dependency>
<groupId>com.sun.xml.bind</groupId> <groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId> <artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version> <version>2.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.activation</groupId> <groupId>javax.activation</groupId>
<artifactId>activation</artifactId> <artifactId>activation</artifactId>
<version>1.1.1</version> <version>1.1-rev-1</version>
</dependency> </dependency>
<dependency> <dependency>
@ -329,20 +381,51 @@
<!-- </exclusions>--> <!-- </exclusions>-->
</dependency> </dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.26.0</version>
<scope>test</scope>
</dependency>
<!-- Enable micrometer >> -->
<!-- <dependency> &lt;!&ndash; TODO: remove this with ActuatorConfig class &ndash;&gt;-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-actuator</artifactId>-->
<!-- <version>1.3.5.RELEASE</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-actuator-autoconfigure</artifactId>-->
<!-- <version>2.1.18.RELEASE</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.micrometer</groupId>-->
<!-- <artifactId>micrometer-core</artifactId>-->
<!-- <version>1.7.2</version>-->
<!-- </dependency>-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.7.2</version>
<scope>compile</scope>
</dependency>
<!-- << Enable micrometer -->
</dependencies> </dependencies>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.session</groupId> <groupId>org.springframework.session</groupId>
<artifactId>spring-session-bom</artifactId> <artifactId>spring-session-bom</artifactId>
<version>2021.2.3</version> <version>2021.0.2</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
@ -351,7 +434,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version> <version>3.7.0</version>
<configuration> <configuration>
<source>1.8</source> <source>1.8</source>
<target>1.8</target> <target>1.8</target>
@ -361,23 +444,21 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version> <version>2.6</version>
<configuration> <configuration>
<failOnMissingWebXml>false</failOnMissingWebXml> <failOnMissingWebXml>false</failOnMissingWebXml>
</configuration> </configuration>
</plugin> </plugin>
--> -->
<plugin>
<plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>cz.habarta.typescript-generator</groupId> <groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-maven-plugin</artifactId> <artifactId>typescript-generator-maven-plugin</artifactId>
<version>2.37.1128</version> <version>2.16.538</version>
<executions> <executions>
<execution> <execution>
<id>java to typeScript</id> <id>java to typeScript</id>
@ -408,75 +489,29 @@
</build> </build>
<repositories> <repositories>
<repository>
<id>central</id>
<name>Maven Central</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>dnet45-bootstrap-snapshot</id>
<name>D-Net 45 Bootstrap Snapshot</name>
<url>https://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-bootstrap-snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<layout>default</layout>
</repository>
<repository>
<id>dnet45-bootstrap-release</id>
<name>D-Net 45 Bootstrap Release</name>
<url>https://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-bootstrap-release</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
<repository> <repository>
<id>dnet-deps</id> <id>dnet-deps</id>
<name>dnet-dependencies</name> <name>dnet-dependencies</name>
<url>https://maven.d4science.org/nexus/content/repositories/dnet-deps</url> <url>https://maven.d4science.org/nexus/content/repositories/dnet-deps</url>
<layout>default</layout> <layout>default</layout>
</repository> </repository>
<repository>
<id>dnet45-releases</id>
<name>D-Net 45 releases</name>
<url>https://maven.d4science.org/nexus/content/repositories/dnet45-releases</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository> <repository>
<id>dnet45-snapshots</id> <id>dnet45-snapshots</id>
<name>D-Net 45 snapshots</name> <name>D-Net 45 Snapshots</name>
<url>https://maven.d4science.org/nexus/content/repositories/dnet45-snapshots</url> <url>https://maven.d4science.org/nexus/content/repositories/dnet45-snapshots</url>
<layout>default</layout> <layout>default</layout>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository> </repository>
<repository>
<!-- Use this when testing local JARs. --> <id>dnet45-releases</id>
<!--<repository> <name>D-Net 45 Releases</name>
<id>libs</id> <url>https://maven.d4science.org/nexus/content/repositories/dnet45-releases</url>
<url>file:///${project.basedir}/libs</url> <layout>default</layout>
</repository>--> <snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories> </repositories>
</project> </project>

View File

@ -2,13 +2,8 @@ package eu.dnetlib.repo.manager;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(exclude = SolrAutoConfiguration.class) @SpringBootApplication
@EnableJpaRepositories
@EnableScheduling
public class Application { public class Application {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -1,20 +0,0 @@
package eu.dnetlib.repo.manager.components;
import eu.dnetlib.repo.manager.service.PendingUserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
@Autowired
PendingUserRoleService pendingUserRoleService;
@Scheduled(fixedRate = 3_600_000)
public void assignPendingRoles() {
pendingUserRoleService.assignRoles();
}
}

View File

@ -15,6 +15,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
import java.util.*; import java.util.*;
@ -63,15 +64,16 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter {
.csrf().disable() .csrf().disable()
.authorizeRequests() .authorizeRequests()
.regexMatchers("/actuator/.*").permitAll() .regexMatchers("/actuator/.*").permitAll()
.regexMatchers("/repositories/.*/metrics/?.*").permitAll()
.regexMatchers("/metrics").permitAll() .regexMatchers("/metrics").permitAll()
.antMatchers("/api-docs/**","/swagger-ui/**").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
.and() .and()
// .anonymous().disable()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint())
.and()
.logout().logoutUrl("/openid_logout") .logout().logoutUrl("/openid_logout")
.clearAuthentication(true)
.invalidateHttpSession(true) .invalidateHttpSession(true)
.deleteCookies() .deleteCookies("openAIRESession")
.logoutSuccessUrl(logoutSuccessUrl) .logoutSuccessUrl(logoutSuccessUrl)
.and() .and()
.addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class) .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class)
@ -142,6 +144,12 @@ public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter {
return serverConfiguration; return serverConfiguration;
} }
@Bean
public LoginUrlAuthenticationEntryPoint authenticationEntryPoint() {
return new LoginUrlAuthenticationEntryPoint("/openid_connect_login");
}
@Bean @Bean
public OIDCAuthenticationFilter openIdConnectAuthenticationFilter() throws Exception { public OIDCAuthenticationFilter openIdConnectAuthenticationFilter() throws Exception {
OIDCAuthenticationFilter oidc = new OIDCAuthenticationFilter(); OIDCAuthenticationFilter oidc = new OIDCAuthenticationFilter();

View File

@ -1,7 +1,7 @@
package eu.dnetlib.repo.manager.config; package eu.dnetlib.repo.manager.config;
import org.slf4j.Logger; import eu.dnetlib.repo.manager.service.ValidatorServiceImpl;
import org.slf4j.LoggerFactory; import org.apache.log4j.Logger;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.AsyncConfigurer;
@ -16,11 +16,11 @@ public class AsyncConfiguration implements AsyncConfigurer {
@Override @Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() { return new AsyncUncaughtExceptionHandler() {
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = Logger.getLogger(getClass());
@Override @Override
public void handleUncaughtException(Throwable throwable, Method method, Object... objects) { public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
logger.error("Async error", throwable); //logger.error("Async error", throwable);
} }
}; };
} }

View File

@ -15,12 +15,9 @@ import gr.uoa.di.driver.util.StaticServiceLocator;
import gr.uoa.di.driver.xml.VocabularyXmlConverter; import gr.uoa.di.driver.xml.VocabularyXmlConverter;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.*;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@ComponentScan(basePackages = {"org.eurocris.openaire.cris.validator.service"})
public class Config { public class Config {
@Value("${services.provide.iSLookUpService.url}") @Value("${services.provide.iSLookUpService.url}")
@ -29,7 +26,7 @@ public class Config {
@Value("${services.provide.validatorService.url}") @Value("${services.provide.validatorService.url}")
private String validatorUrl; private String validatorUrl;
@Bean(name = "vocabularyLoader") @Bean(name="vocabularyLoader")
public VocabularyLoader createVocabularyLoader() throws Exception { public VocabularyLoader createVocabularyLoader() throws Exception {
ISVocabularyLoader loader = new ISVocabularyLoader(); ISVocabularyLoader loader = new ISVocabularyLoader();

View File

@ -1,40 +0,0 @@
package eu.dnetlib.repo.manager.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
@Configuration
public class CustomRestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
return restTemplate;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(customObjectMapper());
return converter;
}
@Bean
public ObjectMapper customObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// Do not fail when reading unknown properties
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Do not fail when reading properties of different case
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
return objectMapper;
}
}

View File

@ -0,0 +1,59 @@
package eu.dnetlib.repo.manager.config;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class DatasourceConfiguration {
private static Logger LOGGER = Logger.getLogger(DatasourceConfiguration.class);
@Value("${services.provide.db.driverClassName}")
private String driverClassname;
@Value("${services.provide.db.url}")
private String URL;
@Value("${services.provide.db.username}")
private String username;
@Value("${services.provide.db.password}")
private String password;
@Bean
public BasicDataSource dataSource(){
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(driverClassname);
basicDataSource.setUrl(URL);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
basicDataSource.setMaxIdle(10);
basicDataSource.setMaxActive(100);
basicDataSource.setMaxWait(1000);
basicDataSource.setValidationQuery("SELECT 1;");
basicDataSource.setTestOnBorrow(true);
basicDataSource.setTestOnReturn(true);
basicDataSource.setTestWhileIdle(true);
basicDataSource.setTimeBetweenEvictionRunsMillis(1200000);
basicDataSource.setMinEvictableIdleTimeMillis(1800000);
basicDataSource.setMinEvictableIdleTimeMillis(5);
basicDataSource.setPoolPreparedStatements(true);
basicDataSource.setDefaultAutoCommit(true);
return basicDataSource;
}
@Bean
public DataSourceTransactionManager txManager(){
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource());
return txManager;
}
}

View File

@ -1,9 +1,8 @@
package eu.dnetlib.repo.manager.config; package eu.dnetlib.repo.manager.config;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import org.apache.log4j.Logger;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
@ -23,26 +22,25 @@ public class FrontEndLinkURIAuthenticationSuccessHandler implements Authenticati
private String frontEndURI; private String frontEndURI;
private static final Logger logger = LoggerFactory.getLogger(FrontEndLinkURIAuthenticationSuccessHandler.class); private static final Logger LOGGER = Logger
.getLogger(FrontEndLinkURIAuthenticationSuccessHandler.class);
public void init() { public void init() {
logger.debug("Front end uri : {}", frontEndURI); LOGGER.debug("Front end uri : " + frontEndURI);
} }
@Value("${services.provide.aai.oidc.domain}") @Value("${services.provide.aai.oidc.domain}")
private String domain; private String domain;
private static final Pattern AUTH_REGEX = Pattern.compile("^([A-Za-z0-9-_=]+)\\.([A-Za-z0-9-_=]+)\\.?([A-Za-z0-9-_.+=]*)$");
@Override @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
OIDCAuthenticationToken authOIDC = (OIDCAuthenticationToken) authentication; OIDCAuthenticationToken authOIDC = (OIDCAuthenticationToken) authentication;
request.getSession().setAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, authOIDC.getUserInfo().getSub()); request.getSession().setAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, authOIDC.getUserInfo().getEmail());
Cookie accessToken = new Cookie("AccessToken", authOIDC.getAccessTokenValue()); Cookie accessToken = new Cookie("AccessToken", authOIDC.getAccessTokenValue());
Matcher matcher = AUTH_REGEX.matcher(authOIDC.getAccessTokenValue()); String regex = "^([A-Za-z0-9-_=]+)\\.([A-Za-z0-9-_=]+)\\.?([A-Za-z0-9-_.+=]*)$";
Matcher matcher = Pattern.compile(regex).matcher(authOIDC.getAccessTokenValue());
if (matcher.find()) { if (matcher.find()) {
long exp = new JsonParser().parse(new String(Base64.getDecoder().decode(matcher.group(2)))).getAsJsonObject().get("exp").getAsLong(); long exp = new JsonParser().parse(new String(Base64.getDecoder().decode(matcher.group(2)))).getAsJsonObject().get("exp").getAsLong();
accessToken.setMaxAge((int) (exp - (new Date().getTime() / 1000))); accessToken.setMaxAge((int) (exp - (new Date().getTime() / 1000)));

View File

@ -1,17 +0,0 @@
package eu.dnetlib.repo.manager.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
@Configuration
public class JPAConfig {
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager();
}
}

View File

@ -3,23 +3,22 @@ package eu.dnetlib.repo.manager.config;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.nimbusds.jwt.JWT; import com.nimbusds.jwt.JWT;
import eu.dnetlib.repo.manager.service.security.AuthoritiesMapper; import eu.dnetlib.repo.manager.service.security.AuthoritiesMapper;
import org.apache.log4j.Logger;
import org.mitre.openid.connect.client.OIDCAuthoritiesMapper; import org.mitre.openid.connect.client.OIDCAuthoritiesMapper;
import org.mitre.openid.connect.model.UserInfo; import org.mitre.openid.connect.model.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Collection; import java.util.*;
import java.util.HashSet;
import java.util.Set;
@ComponentScan
@Component @Component
public class OpenAIREAuthoritiesMapper implements OIDCAuthoritiesMapper { public class OpenAIREAuthoritiesMapper implements OIDCAuthoritiesMapper {
private static final Logger logger = LoggerFactory.getLogger(OpenAIREAuthoritiesMapper.class); private static final Logger logger = Logger.getLogger(OpenAIREAuthoritiesMapper.class);
@Value("${services.provide.adminEmail}") @Value("${services.provide.adminEmail}")
String adminEmail; String adminEmail;
@ -34,7 +33,7 @@ public class OpenAIREAuthoritiesMapper implements OIDCAuthoritiesMapper {
} else if (userInfo.getSource().getAsJsonArray("eduperson_entitlement") != null) { } else if (userInfo.getSource().getAsJsonArray("eduperson_entitlement") != null) {
entitlements = userInfo.getSource().getAsJsonArray("eduperson_entitlement"); entitlements = userInfo.getSource().getAsJsonArray("eduperson_entitlement");
} }
logger.debug("user info: {}\nentitlements: {}", userInfo, entitlements); logger.debug("user info: " + userInfo + "\nentitlements: " + entitlements);
// FIXME: delete this if statement when super administrators are set // FIXME: delete this if statement when super administrators are set
if (userInfo.getEmail() != null && userInfo.getEmail().equals(adminEmail)) { if (userInfo.getEmail() != null && userInfo.getEmail().equals(adminEmail)) {

View File

@ -1,23 +0,0 @@
package eu.dnetlib.repo.manager.config;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Contact;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
@OpenAPIDefinition(
info = @Info(
title = "Repository Manager Dashboard API Documentation",
description = "Repository Manager Dashboard API Documentation",
version = "1.0",
termsOfService = "urn:tos",
license = @License(
name = "Apache 2.0",
url = "https://www.apache.org/licenses/LICENSE-2.0.html"
),
contact = @Contact(name = "", url = "", email = "")
)
)
public class OpenAPIConfiguration {
}

View File

@ -1,22 +1,26 @@
package eu.dnetlib.repo.manager.config; package eu.dnetlib.repo.manager.config;
import org.slf4j.Logger; import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer; import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer; import org.springframework.session.web.http.DefaultCookieSerializer;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@Configuration @Configuration
@EnableRedisHttpSession @EnableRedisHttpSession
@ComponentScan(basePackages = {
"org.eurocris.openaire.cris.validator.service",
"eu.dnetlib.repo.manager.*"})
public class RedisConfiguration { public class RedisConfiguration {
private static final Logger logger = LoggerFactory.getLogger(RedisConfiguration.class); private static Logger LOGGER = Logger.getLogger(RedisConfiguration.class);
@Value("${services.provide.redis.host}") @Value("${services.provide.redis.host}")
private String host; private String host;
@ -31,18 +35,18 @@ public class RedisConfiguration {
private String domain; private String domain;
@PostConstruct @PostConstruct
private void init() { private void init(){
logger.info(String.format("Redis : %s Port : %s Password : %s", host, port, password)); LOGGER.info(String.format("Redis : %s Port : %s Password : %s",host,port,password));
} }
@Bean @Bean
public JedisConnectionFactory connectionFactory() { public JedisConnectionFactory connectionFactory() {
logger.info(String.format("Redis : %s Port : %s Password : %s", host, port, password)); LOGGER.info(String.format("Redis : %s Port : %s Password : %s",host,port,password));
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host); jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(Integer.parseInt(port)); jedisConnectionFactory.setPort(Integer.parseInt(port));
jedisConnectionFactory.setUsePool(true); jedisConnectionFactory.setUsePool(true);
if (password != null) jedisConnectionFactory.setPassword(password); if(password != null) jedisConnectionFactory.setPassword(password);
return jedisConnectionFactory; return jedisConnectionFactory;
} }
@ -52,8 +56,18 @@ public class RedisConfiguration {
serializer.setCookieName("openAIRESession"); serializer.setCookieName("openAIRESession");
serializer.setCookiePath("/"); serializer.setCookiePath("/");
serializer.setDomainName(domain); serializer.setDomainName(domain);
logger.info("Cookie Serializer : {}", serializer); LOGGER.info("Serializer : " + serializer);
return serializer; return serializer;
} }
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", "application/json");
return restTemplate;
}
} }

View File

@ -0,0 +1,59 @@
package eu.dnetlib.repo.manager.config;
import eu.dnetlib.repo.manager.controllers.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
/**
* Created by panagiotis on 16/11/2017.
*/
@Configuration
@EnableSwagger2
@EnableWebMvc
@ComponentScan(basePackageClasses = {
RepositoryController.class,
MonitorController.class,
ValidatorController.class,
PiWikController.class,
BrokerController.class,
StatsController.class,
UserController.class,
SushiliteController.class
},basePackages = "eu.dnetlib.repo.manager.*")
public class SwaggerConfig {
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.pathMapping("/")
.apiInfo(getApiInfo());
}
private ApiInfo getApiInfo() {
return new ApiInfo("Repository Manager Dashboard API Documentation",
"Repository Manager Dashboard API Documentation",
"1.0",
"urn:tos",
new Contact("", "", ""),
"Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<VendorExtension>());
}
}

View File

@ -1,11 +1,11 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.domain.BrokerException;
import eu.dnetlib.repo.manager.domain.Term; import eu.dnetlib.repo.manager.domain.Term;
import eu.dnetlib.repo.manager.domain.broker.*; import eu.dnetlib.repo.manager.domain.broker.*;
import eu.dnetlib.repo.manager.exception.BrokerException;
import eu.dnetlib.repo.manager.service.BrokerServiceImpl; import eu.dnetlib.repo.manager.service.BrokerServiceImpl;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiParam;
import org.json.JSONException; import org.json.JSONException;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -21,7 +21,7 @@ import java.util.Map;
@RestController @RestController
@RequestMapping(value = "/broker") @RequestMapping(value = "/broker")
@Tag(name="broker", description="Broker API") @Api(description = "Broker API", tags = {"broker"})
public class BrokerController{ public class BrokerController{
@Autowired @Autowired
@ -33,9 +33,9 @@ public class BrokerController{
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public DatasourcesBroker getDatasourcesOfUser( public DatasourcesBroker getDatasourcesOfUser(
@RequestParam("includeShared") @RequestParam("includeShared")
@Parameter(description = "Include shared datasources (default = false)", required = true) String includeShared, @ApiParam(value = "Include shared datasources", required = true , defaultValue = "false") String includeShared,
@RequestParam("includeByOthers") @RequestParam("includeByOthers")
@Parameter(description = "Include datasources of other (default = false)", required = true) String includeByOthers) throws JSONException { @ApiParam(value = "Include datasources of other", required = true,defaultValue = "false") String includeByOthers) throws JSONException {
return brokerService.getDatasourcesOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), includeShared, includeByOthers); return brokerService.getDatasourcesOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), includeShared, includeByOthers);
} }

View File

@ -1,14 +1,11 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo; import eu.dnetlib.repo.manager.domain.*;
import eu.dnetlib.repo.manager.domain.BrokerSummary; import eu.dnetlib.repo.manager.service.BrokerService;
import eu.dnetlib.repo.manager.domain.CollectionMonitorSummary; import eu.dnetlib.repo.manager.service.DashboardService;
import eu.dnetlib.repo.manager.domain.RepositorySummaryInfo; import eu.dnetlib.repo.manager.service.PiWikService;
import eu.dnetlib.repo.manager.domain.UsageSummary; import eu.dnetlib.repo.manager.service.RepositoryService;
import eu.dnetlib.repo.manager.exception.BrokerException; import io.swagger.annotations.Api;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException;
import eu.dnetlib.repo.manager.service.*;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.json.JSONException; import org.json.JSONException;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -21,7 +18,7 @@ import java.util.List;
@RestController @RestController
@RequestMapping(value = "/dashboard") @RequestMapping(value = "/dashboard")
@Tag(name="dashboard", description = "Dashboard API") @Api(description = "Dashboard API", tags = {"dashboard"})
public class DashboardController { public class DashboardController {
@Autowired @Autowired
@ -30,16 +27,13 @@ public class DashboardController {
@Autowired @Autowired
private RepositoryService repositoryService; private RepositoryService repositoryService;
@Autowired
private AggregationService aggregationService;
@Autowired @Autowired
private BrokerService brokerService; private BrokerService brokerService;
@Autowired @Autowired
private PiWikService piWikService; private PiWikService piWikService;
@RequestMapping(value = "/getRepositoriesSummary/{page}/{size}", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoriesSummary/{page}/{size}" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
@ -49,32 +43,33 @@ public class DashboardController {
return dashboardService.getRepositoriesSummaryInfo(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); return dashboardService.getRepositoriesSummaryInfo(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size);
} }
@RequestMapping(value = "/collectionMonitorSummary/{repoId}", method = RequestMethod.GET, @RequestMapping(value = "/collectionMonitorSummary/{repoId}" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public CollectionMonitorSummary getCollectionMonitorSummary( public CollectionMonitorSummary getCollectionMonitorSummary(
@PathVariable("repoId") String repoId, @PathVariable("repoId") String repoId,
@RequestParam(name = "size", required = false, defaultValue = "20") int summarySize) throws JSONException { @RequestParam(name = "size", required = false, defaultValue = "20") int size) throws JSONException {
List<AggregationInfo> aggregationInfoList = aggregationService.getRepositoryAggregations(repoId);
List<AggregationDetails> aggregationDetails = repositoryService.getRepositoryAggregations(repoId,0,size);
CollectionMonitorSummary collectionMonitorSummary = new CollectionMonitorSummary(); CollectionMonitorSummary collectionMonitorSummary = new CollectionMonitorSummary();
// Set the "aggregationInfo" for the first <number of> requested aggregations, in order to create a "summary". collectionMonitorSummary.setAggregationDetails(aggregationDetails);
collectionMonitorSummary.setAggregationInfo(aggregationInfoList.subList(0, Math.min(summarySize, aggregationInfoList.size()))); size=0;
do {
// Search for the last indexed version and set the "collectionMonitorSummary". aggregationDetails = repositoryService.getRepositoryAggregations(repoId,size,size+50);
for ( AggregationInfo aggregationInfo : aggregationInfoList ) { for(AggregationDetails aggregationDetail : aggregationDetails){
if ( aggregationInfo.isIndexedVersion() ) { if(aggregationDetail.getIndexedVersion()){
collectionMonitorSummary.setLastIndexedVersion(aggregationInfo); collectionMonitorSummary.setLastIndexedVersion(aggregationDetail);
break; break;
} }
} }
size+=30;
}while (aggregationDetails.size() != 0 && collectionMonitorSummary.getLastIndexedVersion()==null);
return collectionMonitorSummary; return collectionMonitorSummary;
} }
@RequestMapping(value = "/usageSummary/{repoId}", method = RequestMethod.GET, @RequestMapping(value = "/usageSummary/{repoId}" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
@ -84,13 +79,16 @@ public class DashboardController {
return new UsageSummary(repositoryService.getMetricsInfoForRepository(repoId), piWikService.getPiwikSiteForRepo(repoId)); return new UsageSummary(repositoryService.getMetricsInfoForRepository(repoId), piWikService.getPiwikSiteForRepo(repoId));
} }
@RequestMapping(value = "/brokerSummary/{ds_name}", method = RequestMethod.GET, @RequestMapping(value = "/brokerSummary/{ds_name}" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public BrokerSummary getBrokerSummary( public BrokerSummary getBrokerSummary(
@PathVariable("ds_name") String datasourceName) throws BrokerException { @PathVariable("ds_name") String datasourceName) throws BrokerException {
return new BrokerSummary(brokerService.getSimpleSubscriptionsOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail()), brokerService.getTopicsForDatasource(datasourceName)); return new BrokerSummary(brokerService.getSimpleSubscriptionsOfUser( ((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail()), brokerService.getTopicsForDatasource(datasourceName));
} }
} }

View File

@ -2,13 +2,13 @@ package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.api.functionality.ValidatorServiceException; import eu.dnetlib.api.functionality.ValidatorServiceException;
import eu.dnetlib.repo.manager.exception.BrokerException; import eu.dnetlib.repo.manager.domain.BrokerException;
import eu.dnetlib.repo.manager.exception.EndPointException; import eu.dnetlib.repo.manager.exception.EndPointException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import eu.dnetlib.repo.manager.exception.ServerError; import eu.dnetlib.repo.manager.exception.ServerError;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.json.JSONException; import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -26,42 +26,42 @@ import java.net.UnknownHostException;
@Order(Ordered.HIGHEST_PRECEDENCE) @Order(Ordered.HIGHEST_PRECEDENCE)
public class GenericControllerAdvice { public class GenericControllerAdvice {
private Logger logger = LoggerFactory.getLogger(GenericControllerAdvice.class); private Logger logger = LogManager.getLogger(GenericControllerAdvice.class);
@ResponseStatus(HttpStatus.NOT_FOUND) @ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ResourceNotFoundException.class) @ExceptionHandler(ResourceNotFoundException.class)
@ResponseBody @ResponseBody
public ServerError securityException(HttpServletRequest req, Exception ex) { public ServerError securityException(HttpServletRequest req, Exception ex) {
return new ServerError(req.getRequestURL().toString(), ex); return new ServerError(req.getRequestURL().toString(),ex);
} }
@ResponseStatus(HttpStatus.FORBIDDEN) @ResponseStatus(HttpStatus.FORBIDDEN)
@ExceptionHandler(AccessDeniedException.class) @ExceptionHandler(AccessDeniedException.class)
@ResponseBody @ResponseBody
public ServerError accessDeniedException(HttpServletRequest req, Exception ex) { public ServerError accessDeniedException(HttpServletRequest req, Exception ex) {
return new ServerError(req.getRequestURL().toString(), ex); return new ServerError(req.getRequestURL().toString(),ex);
} }
@ResponseStatus(HttpStatus.NOT_FOUND) @ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(UnknownHostException.class) @ExceptionHandler(UnknownHostException.class)
@ResponseBody @ResponseBody
public ServerError unknownHostException(HttpServletRequest req, Exception ex) { public ServerError unknownHostException(HttpServletRequest req, Exception ex) {
return new ServerError(req.getRequestURL().toString(), ex); return new ServerError(req.getRequestURL().toString(),ex);
} }
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({JSONException.class, BrokerException.class, ValidatorServiceException.class}) @ExceptionHandler({JSONException.class,BrokerException.class,ValidatorServiceException.class})
@ResponseBody @ResponseBody
public ServerError internalException(HttpServletRequest req, Exception ex) { public ServerError internalException(HttpServletRequest req, Exception ex) {
return new ServerError(req.getRequestURL().toString(), ex); return new ServerError(req.getRequestURL().toString(),ex);
} }
@ResponseStatus(HttpStatus.GATEWAY_TIMEOUT) @ResponseStatus(HttpStatus.GATEWAY_TIMEOUT)
@ExceptionHandler(EndPointException.class) @ExceptionHandler(EndPointException.class)
@ResponseBody @ResponseBody
public ServerError endPointException(HttpServletRequest req, Exception ex) { public ServerError endPointException(HttpServletRequest req, Exception ex) {
return new ServerError(req.getRequestURL().toString(), ex); return new ServerError(req.getRequestURL().toString(),ex);
} }
} }

View File

@ -1,47 +0,0 @@
package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.domain.InterfaceComplianceRequest;
import eu.dnetlib.repo.manager.domain.InterfaceComplianceRequestId;
import eu.dnetlib.repo.manager.domain.dto.InterfaceComplianceRequestDTO;
import eu.dnetlib.repo.manager.service.InterfaceComplianceService;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
@RestController
@RequestMapping("compliance")
public class InterfaceComplianceRequestController {
private final InterfaceComplianceService service;
public InterfaceComplianceRequestController(InterfaceComplianceService service) {
this.service = service;
}
@GetMapping("{repositoryId}/{interfaceId}")
public InterfaceComplianceRequest get(@PathVariable("repositoryId") String repositoryId, @PathVariable("interfaceId") String interfaceId) {
InterfaceComplianceRequestId id = new InterfaceComplianceRequestId();
id.setRepositoryId(repositoryId);
id.setInterfaceId(interfaceId);
return service.getById(id).orElse(null);
}
@GetMapping()
public Iterable<InterfaceComplianceRequest> get() {
return service.get();
}
@PostMapping()
public InterfaceComplianceRequest add(@RequestBody InterfaceComplianceRequestDTO requestDTO) {
requestDTO.setSubmissionDate(new Date());
return service.create(InterfaceComplianceRequest.from(requestDTO));
}
@DeleteMapping("{repositoryId}/{interfaceId}")
public void delete(@PathVariable("repositoryId") String repositoryId, @PathVariable("interfaceId") String interfaceId) {
InterfaceComplianceRequestId id = new InterfaceComplianceRequestId();
id.setRepositoryId(repositoryId);
id.setInterfaceId(interfaceId);
this.service.delete(id);
}
}

View File

@ -4,12 +4,11 @@ import eu.dnetlib.api.functionality.ValidatorServiceException;
import eu.dnetlib.domain.functionality.validator.StoredJob; import eu.dnetlib.domain.functionality.validator.StoredJob;
import eu.dnetlib.repo.manager.domain.JobsOfUser; import eu.dnetlib.repo.manager.domain.JobsOfUser;
import eu.dnetlib.repo.manager.service.MonitorServiceImpl; import eu.dnetlib.repo.manager.service.MonitorServiceImpl;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiParam;
import org.apache.log4j.Logger;
import org.json.JSONException; import org.json.JSONException;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -18,10 +17,11 @@ import org.springframework.web.bind.annotation.*;
@RestController @RestController
@RequestMapping(value = "/monitor") @RequestMapping(value = "/monitor")
@Tag(name="monitor", description="Monitor API") @Api(description = "Monitor API", tags = {"monitor"})
public class MonitorController { public class MonitorController {
private static final Logger logger = LoggerFactory.getLogger(MonitorController.class); private static final Logger LOGGER = Logger
.getLogger(MonitorController.class);
@Autowired @Autowired
private MonitorServiceImpl monitorService; private MonitorServiceImpl monitorService;
@ -31,13 +31,13 @@ public class MonitorController {
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public JobsOfUser getJobsOfUser(@RequestParam(value = "jobType", required = false) public JobsOfUser getJobsOfUser(@RequestParam(value = "jobType", required = false)
@Parameter(description = "Equals to filter job type on validation history page") String jobType, @ApiParam(value = "Equals to filter job type on validation history page") String jobType,
@RequestParam("offset") @Parameter(name = "Page number", required = true) String offset, @RequestParam("offset") @ApiParam(value = "Page number", required = true) String offset,
@RequestParam(value = "limit", required = false,defaultValue = "10") @Parameter(description = "Null value") String limit, @RequestParam(value = "limit", required = false,defaultValue = "10") @ApiParam(value = "Null value") String limit,
@RequestParam(value = "dateFrom", required = false) @Parameter(description = "Null value") String dateFrom, @RequestParam(value = "dateFrom", required = false) @ApiParam(value = "Null value") String dateFrom,
@RequestParam(value = "dateTo", required = false) @Parameter(description = "Null value") String dateTo, @RequestParam(value = "dateTo", required = false) @ApiParam(value = "Null value") String dateTo,
@RequestParam("validationStatus") @Parameter(description = "Equals to filter validation jobs", required = false) String validationStatus, @RequestParam("validationStatus") @ApiParam(value = "Equals to filter validation jobs", required = false) String validationStatus,
@RequestParam("includeJobsTotal") @Parameter(description = "Always true", required = true) String includeJobsTotal) throws JSONException, ValidatorServiceException { @RequestParam("includeJobsTotal") @ApiParam(value = "Always true", required = true) String includeJobsTotal) throws JSONException, ValidatorServiceException {
return monitorService.getJobsOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), jobType, offset, limit, dateFrom, dateTo, validationStatus, includeJobsTotal); return monitorService.getJobsOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), jobType, offset, limit, dateFrom, dateTo, validationStatus, includeJobsTotal);
} }

View File

@ -4,13 +4,12 @@ import eu.dnetlib.domain.data.PiwikInfo;
import eu.dnetlib.repo.manager.domain.OrderByField; import eu.dnetlib.repo.manager.domain.OrderByField;
import eu.dnetlib.repo.manager.domain.OrderByType; import eu.dnetlib.repo.manager.domain.OrderByType;
import eu.dnetlib.repo.manager.domain.Paging; import eu.dnetlib.repo.manager.domain.Paging;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.domain.RepositoryServiceException;
import eu.dnetlib.repo.manager.service.PiWikServiceImpl; import eu.dnetlib.repo.manager.service.PiWikServiceImpl;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiImplicitParams;
import org.slf4j.Logger; import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResource;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -31,49 +30,40 @@ import java.util.List;
@RestController @RestController
@RequestMapping(value = "/piwik") @RequestMapping(value = "/piwik")
@Tag(name="piwik", description = "Piwik API") @Api(description = "Piwik API", tags = {"piwik"})
public class PiWikController { public class PiWikController {
private static final Logger logger = LoggerFactory.getLogger(PiWikController.class); private static final Logger LOGGER = Logger
.getLogger(PiWikController.class);
@Autowired @Autowired
private PiWikServiceImpl piWikService; private PiWikServiceImpl piWikService;
@RequestMapping(value = "/validated", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Boolean isPiwikValidated(@RequestParam("repositoryId") String repositoryId) {
PiwikInfo info = piWikService.getPiwikSiteForRepo(repositoryId);
if (info != null) {
return info.isValidated();
}
return false;
}
@RequestMapping(value = "/getPiwikSiteForRepo/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/getPiwikSiteForRepo/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredby==null and hasAuthority('REGISTERED_USER'))") @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredBy=='null' and hasAuthority('REGISTERED_USER'))")
public PiwikInfo getPiwikSiteForRepo(@PathVariable("repositoryId") String repositoryId) { public PiwikInfo getPiwikSiteForRepo(@PathVariable("repositoryId") String repositoryId) {
return piWikService.getPiwikSiteForRepo(repositoryId); return piWikService.getPiwikSiteForRepo(repositoryId);
} }
@RequestMapping(value = "/savePiwikInfo" , method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/savePiwikInfo" , method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#piwikInfo.repositoryId) or (@repositoryService.getRepositoryById(#piwikInfo.repositoryId).registeredby==null and hasAuthority('REGISTERED_USER'))") @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#piwikInfo.repositoryId) or (@repositoryService.getRepositoryById(#piwikInfo.repositoryId).registeredBy=='null' and hasAuthority('REGISTERED_USER'))")
public PiwikInfo savePiwikInfo(@RequestBody PiwikInfo piwikInfo) { public PiwikInfo savePiwikInfo(@RequestBody PiwikInfo piwikInfo) {
return piWikService.savePiwikInfo(piwikInfo); return piWikService.savePiwikInfo(piwikInfo);
} }
@RequestMapping(value = "/getPiwikSitesForRepos" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/getPiwikSitesForRepos" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
@Parameters({ @ApiImplicitParams({
@Parameter(name = "from", description = "number"), @ApiImplicitParam(name = "from", dataType = "number", paramType = "query"),
@Parameter(name = "quantity", description = "number"), @ApiImplicitParam(name = "quantity", dataType = "number", paramType = "query"),
@Parameter(name = "order", description = "eu.dnetlib.repo.manager.domain.OrderByType"), @ApiImplicitParam(name = "order", dataType = "eu.dnetlib.repo.manager.domain.OrderByType", paramType = "query"),
@Parameter(name = "orderField", description = "eu.dnetlib.repo.manager.domain.OrderByField"), @ApiImplicitParam(name = "orderField", dataType = "eu.dnetlib.repo.manager.domain.OrderByField", paramType = "query"),
@Parameter(name = "searchField", description = "string") @ApiImplicitParam(name = "searchField", dataType = "string", paramType = "query"),
}) })
public Paging<PiwikInfo> getPiwikSitesForRepos( public Paging<PiwikInfo> getPiwikSitesForRepos(
@RequestParam(value = "from", required=false, defaultValue = "0") int from, @RequestParam(value = "from",required=false,defaultValue = "0") int from,
@RequestParam(value = "quantity", required=false, defaultValue = "100") int quantity, @RequestParam(value = "quantity",required=false,defaultValue = "100") int quantity,
@RequestParam(value = "order", required=false, defaultValue = "DSC") OrderByType orderType, @RequestParam(value = "order",required=false,defaultValue = "DSC") OrderByType orderType,
@RequestParam(value = "orderField", required = false, defaultValue = "REPOSITORY_NAME") OrderByField orderField, @RequestParam(value = "orderField", required = false, defaultValue = "REPOSITORY_NAME") OrderByField orderField,
@RequestParam(value = "searchField", required = false, defaultValue = "") String searchField @RequestParam(value = "searchField", required = false, defaultValue = "") String searchField
@ -86,13 +76,12 @@ public class PiWikController {
results.setResults(returning); results.setResults(returning);
return results; return results;
} }
@ApiImplicitParams({
@Parameters({ @ApiImplicitParam(name = "from", dataType = "number", paramType = "query"),
@Parameter(name = "from", description = "number"), @ApiImplicitParam(name = "quantity", dataType = "number", paramType = "query"),
@Parameter(name = "quantity", description = "number"), @ApiImplicitParam(name = "order", dataType = "eu.dnetlib.repo.manager.domain.OrderByType", paramType = "query"),
@Parameter(name = "order", description = "eu.dnetlib.repo.manager.domain.OrderByType"), @ApiImplicitParam(name = "searchField", dataType = "eu.dnetlib.repo.manager.domain.OrderByField", paramType = "query"),
@Parameter(name = "searchField", description = "eu.dnetlib.repo.manager.domain.OrderByField"), @ApiImplicitParam(name = "orderField", dataType = "string", paramType = "query"),
@Parameter(name = "orderField", description = "string")
}) })
@RequestMapping(value = "/getPiwikSitesForRepos/csv" , method = RequestMethod.GET,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @RequestMapping(value = "/getPiwikSitesForRepos/csv" , method = RequestMethod.GET,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody @ResponseBody
@ -114,22 +103,25 @@ public class PiWikController {
sb.append(" Repository ID , Repository name, Country, Site ID, Authentication token, Creation date, Requestor full name, Requestor email, Validated, Validation date, Comment \n"); sb.append(" Repository ID , Repository name, Country, Site ID, Authentication token, Creation date, Requestor full name, Requestor email, Validated, Validation date, Comment \n");
for(PiwikInfo piwikInfo : returning){ for(PiwikInfo piwikInfo : returning){
sb.append(piwikInfo.getRepositoryId() == null ? "," : piwikInfo.getRepositoryId() + ",") sb.append(
.append(piwikInfo.getRepositoryName() == null ? "," : piwikInfo.getRepositoryName() + ",") (piwikInfo.getRepositoryId() == null ? "," : piwikInfo.getRepositoryId()+ ",")+
.append(piwikInfo.getCountry() == null ? "," : piwikInfo.getCountry() + ",") (piwikInfo.getRepositoryName() == null ? "," : piwikInfo.getRepositoryName()+ ",")+
.append(piwikInfo.getSiteId() == null ? "," : piwikInfo.getSiteId() + ",") (piwikInfo.getCountry() == null ? "," : piwikInfo.getCountry()+ ",")+
.append(piwikInfo.getAuthenticationToken() == null ? "," : piwikInfo.getAuthenticationToken() + ",") (piwikInfo.getSiteId() == null ? "," : piwikInfo.getSiteId()+ ",") +
.append(piwikInfo.getCreationDate() == null ? "," : piwikInfo.getCreationDate().toString() + ",") (piwikInfo.getAuthenticationToken() == null ? "," : piwikInfo.getAuthenticationToken()+ ",")+
.append(piwikInfo.getRequestorName() == null ? "," : piwikInfo.getRequestorName() + ",") (piwikInfo.getCreationDate() == null ? "," : piwikInfo.getCreationDate().toString()+ ",") +
.append(piwikInfo.getRequestorEmail() == null ? "," : piwikInfo.getRequestorEmail() + ",") (piwikInfo.getRequestorName() == null ? "," : piwikInfo.getRequestorName()+ ",") +
.append(piwikInfo.isValidated()).append(",") (piwikInfo.getRequestorEmail() == null ? "," : piwikInfo.getRequestorEmail()+ ",")+
.append(piwikInfo.getValidationDate() == null ? "," : piwikInfo.getValidationDate().toString() + ",") piwikInfo.isValidated() + "," +
.append(piwikInfo.getComment() == null ? "\n" : piwikInfo.getComment() + "\n"); (piwikInfo.getValidationDate() == null ? "," : piwikInfo.getValidationDate().toString()+ ",") +
(piwikInfo.getComment() == null ? "\n" : piwikInfo.getComment()+ "\n")
);
} }
writer.write(sb.toString()); writer.write(sb.toString());
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
logger.error(e.getMessage()); LOGGER.error(e.getMessage());
} }
@ -149,6 +141,7 @@ public class PiWikController {
strDate); strDate);
response.setHeader(headerKey, headerValue); response.setHeader(headerKey, headerValue);
return new FileSystemResource(p.toFile()); return new FileSystemResource(p.toFile());
} }
@ -163,7 +156,7 @@ public class PiWikController {
@RequestMapping(value = "/getOpenaireId/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/getOpenaireId/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredby==null and hasAuthority('REGISTERED_USER'))") @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredBy=='null' and hasAuthority('REGISTERED_USER'))")
public String getOpenaireId(@PathVariable("repositoryId") String repositoryId){ public String getOpenaireId(@PathVariable("repositoryId") String repositoryId){
return piWikService.getOpenaireId(repositoryId); return piWikService.getOpenaireId(repositoryId);
} }

View File

@ -2,6 +2,7 @@ package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.service.PiWikService; import eu.dnetlib.repo.manager.service.PiWikService;
import eu.dnetlib.repo.manager.service.RepositoryService; import eu.dnetlib.repo.manager.service.RepositoryService;
import eu.dnetlib.repo.manager.service.RepositoryServiceImpl;
import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
@ -11,8 +12,8 @@ import io.micrometer.core.instrument.binder.system.UptimeMetrics;
import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry; import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.exporter.common.TextFormat; import io.prometheus.client.exporter.common.TextFormat;
import org.slf4j.Logger; import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory; import org.json.JSONException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -23,9 +24,9 @@ import java.io.File;
@RestController @RestController
@RequestMapping(value = "/actuator/prometheus", produces = "application/openmetrics-text; version=1.0.0; charset=utf-8") @RequestMapping("/actuator/prometheus")
public class PrometheusController { public class PrometheusController { // TODO: remove this with migration to Spring Boot 2
private static final Logger logger = LoggerFactory.getLogger(PrometheusController.class); private static final Logger LOGGER = Logger.getLogger(PrometheusController.class);
private final PiWikService piWikService; private final PiWikService piWikService;
private final RepositoryService repositoryService; private final RepositoryService repositoryService;
@ -36,12 +37,12 @@ public class PrometheusController {
this.repositoryService = repositoryService; this.repositoryService = repositoryService;
} }
@RequestMapping(method = RequestMethod.GET) @RequestMapping(method = RequestMethod.GET, path = "", produces = MediaType.TEXT_PLAIN_VALUE)
public String getPiwikMetrics() { public String getPiwikMetrics() {
PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
registry.gauge("provide_repositories_registered", repositoryService.getTotalRegisteredRepositories()); registry.counter("provide_repositories_registered").increment(repositoryService.getTotalRegisteredRepositories());
registry.gauge("provide_usagecounts_repositories_registered", piWikService.getTotal()); registry.counter("provide_usagecounts_repositories_registered").increment(piWikService.getTotal());
registry.gauge("provide_usagecounts_repositories_validated", piWikService.getValidated(true)); registry.counter("provide_usagecounts_repositories_validated").increment(piWikService.getValidated(true));
return registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100); return registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);
} }
@ -50,11 +51,7 @@ public class PrometheusController {
public String getMetrics() { public String getMetrics() {
PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
new JvmThreadMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry);
try (JvmGcMetrics jvmGcMetrics = new JvmGcMetrics() ) { new JvmGcMetrics().bindTo(registry);
jvmGcMetrics.bindTo(registry);
} catch (Exception e) {
logger.error("", e);
}
new JvmMemoryMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry);
new DiskSpaceMetrics(new File("/")).bindTo(registry); new DiskSpaceMetrics(new File("/")).bindTo(registry);
new ProcessorMetrics().bindTo(registry); // metrics related to the CPU stats new ProcessorMetrics().bindTo(registry); // metrics related to the CPU stats

View File

@ -1,22 +1,17 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.domain.data.PiwikInfo; import eu.dnetlib.domain.data.Repository;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo; import eu.dnetlib.domain.data.RepositoryInterface;
import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.*;
import eu.dnetlib.repo.manager.domain.dto.RepositoryTerms;
import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.domain.dto.User;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import eu.dnetlib.repo.manager.service.AggregationService;
import eu.dnetlib.repo.manager.service.PiWikService;
import eu.dnetlib.repo.manager.service.RepositoryService; import eu.dnetlib.repo.manager.service.RepositoryService;
import eu.dnetlib.repo.manager.service.security.AuthorizationService; import eu.dnetlib.repo.manager.service.security.AuthorizationService;
import eu.dnetlib.repo.manager.utils.JsonUtils; import eu.dnetlib.repo.manager.utils.JsonUtils;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.Api;
import org.apache.log4j.Logger;
import org.json.JSONException; import org.json.JSONException;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -28,34 +23,25 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.Date; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@RestController @RestController
@RequestMapping(value = "/repositories") @RequestMapping(value = "/repositories")
@Tag(name="repositories", description="Repository API") @Api(description = "Repository API", tags = {"repositories"})
public class RepositoryController { public class RepositoryController {
private static final Logger logger = LoggerFactory.getLogger(RepositoryController.class); private static final Logger logger = Logger.getLogger(RepositoryController.class);
private final RepositoryService repositoryService; private final RepositoryService repositoryService;
private final AggregationService aggregationService;
private final AuthorizationService authorizationService; private final AuthorizationService authorizationService;
private final PiWikService piWikService;
@Autowired @Autowired
RepositoryController(RepositoryService repositoryService, RepositoryController(RepositoryService repositoryService,
AggregationService aggregationService, AuthorizationService authorizationService) {
AuthorizationService authorizationService,
PiWikService piWikService) {
this.repositoryService = repositoryService; this.repositoryService = repositoryService;
this.aggregationService = aggregationService;
this.authorizationService = authorizationService; this.authorizationService = authorizationService;
this.piWikService = piWikService;
} }
@RequestMapping(value = "/countries", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/countries", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ -69,7 +55,7 @@ public class RepositoryController {
@ResponseBody @ResponseBody
public List<RepositorySnippet> getRepositoriesByCountry(@PathVariable("country") String country, public List<RepositorySnippet> getRepositoriesByCountry(@PathVariable("country") String country,
@PathVariable("mode") String mode, @PathVariable("mode") String mode,
@RequestParam(value = "managed", required = false) Boolean managed) { @RequestParam(value = "managed", required = false) Boolean managed) throws JSONException, IOException {
return repositoryService.getRepositoriesByCountry(country, mode, managed); return repositoryService.getRepositoriesByCountry(country, mode, managed);
} }
@ -77,26 +63,8 @@ public class RepositoryController {
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public List<RepositorySnippet> getRepositoriesSnippetsOfUser(@RequestParam(name = "page", defaultValue = "0") int page, public List<RepositorySnippet> getRepositoriesSnippetsOfUser() throws Exception {
@RequestParam(name = "size", defaultValue = "1000") int pageSize) throws Exception { return repositoryService.getRepositoriesSnippetsOfUser("0", "100");
return repositoryService.getRepositoriesSnippetsOfUser(String.valueOf(page), String.valueOf(pageSize));
}
@RequestMapping(value = "/terms", method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')")
public void updateRepositoriesTerms(@RequestBody List<RepositoryTerms> repositoriesTerms) throws Exception {
Date date = new Date();
if (repositoriesTerms != null) {
for (RepositoryTerms terms : repositoriesTerms) {
Repository repository = repositoryService.getRepositoryById(terms.getId());
repository.setConsentTermsOfUse(terms.getConsentTermsOfUse());
repository.setFullTextDownload(terms.getFullTextDownload());
repository.setLastConsentTermsOfUseDate(date);
repositoryService.updateRepository(repository, SecurityContextHolder.getContext().getAuthentication());
}
}
} }
@RequestMapping(value = "/searchRegisteredRepositories/{page}/{size}", method = RequestMethod.GET, @RequestMapping(value = "/searchRegisteredRepositories/{page}/{size}", method = RequestMethod.GET,
@ -110,7 +78,7 @@ public class RepositoryController {
@RequestParam("requestSortBy") String requestSortBy, @RequestParam("requestSortBy") String requestSortBy,
@RequestParam("order") String order, @RequestParam("order") String order,
@PathVariable("page") int page, @PathVariable("page") int page,
@PathVariable("size") int pageSize) { @PathVariable("size") int pageSize) throws Exception {
return repositoryService.searchRegisteredRepositories(country, typology, englishName, officialName, requestSortBy, order, page, pageSize); return repositoryService.searchRegisteredRepositories(country, typology, englishName, officialName, requestSortBy, order, page, pageSize);
} }
@ -118,29 +86,29 @@ public class RepositoryController {
@RequestMapping(value = "/getRepositoryById/{id}", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoryById/{id}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PostAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id) or (returnObject.registeredby==null and hasAuthority('REGISTERED_USER'))") @PostAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id) or (returnObject.registeredBy=='null' and hasAuthority('REGISTERED_USER'))")
public Repository getRepositoryById(@PathVariable("id") String id) throws ResourceNotFoundException { public Repository getRepositoryById(@PathVariable("id") String id) throws JSONException, ResourceNotFoundException {
Repository repo = repositoryService.getRepositoryById(id); Repository repo = repositoryService.getRepositoryById(id);
if (repo != null) if (repo != null)
logger.info("Returning repository {} registered by {}", repo.getId(), repo.getRegisteredby()); logger.info("Returning repository " + repo.getId() + " registered by " + repo.getRegisteredBy());
else else
logger.info("Requested repository {} not found", id); logger.info("Requested repository " + id + " not found");
return repo; return repo;
} }
@RequestMapping(value = "/getRepositoryAggregations/{id}", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoryAggregations/{id}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public List<AggregationInfo> getRepositoryAggregations(@PathVariable("id") String id) throws JSONException { public List<AggregationDetails> getRepositoryAggregations(@PathVariable("id") String id) throws JSONException {
return aggregationService.getRepositoryAggregations(id, 0, 20); return repositoryService.getRepositoryAggregations(id, 0, 20);
} }
@RequestMapping(value = "/getRepositoryAggregationsByYear/{id}", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoryAggregationsByYear/{id}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public Map<String, List<AggregationInfo>> getRepositoryAggregationsByYear(@PathVariable("id") String id) throws JSONException { public Map<String, List<AggregationDetails>> getRepositoryAggregationsByYear(@PathVariable("id") String id) throws JSONException {
return aggregationService.getRepositoryAggregationsByYear(id); return repositoryService.getRepositoryAggregationsByYear(id);
} }
@RequestMapping(value = "/getRepositoriesByName/{name:.+}/{page}/{size}/", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoriesByName/{name:.+}/{page}/{size}/", method = RequestMethod.GET,
@ -148,15 +116,15 @@ public class RepositoryController {
@ResponseBody @ResponseBody
public List<Repository> getRepositoriesByName(@PathVariable("name") String name, public List<Repository> getRepositoriesByName(@PathVariable("name") String name,
@PathVariable("page") String page, @PathVariable("page") String page,
@PathVariable("size") String size) { @PathVariable("size") String size) throws JSONException {
return repositoryService.getRepositoriesByName(name, page, size); return repositoryService.getRepositoriesByName(name, page, size);
} }
@RequestMapping(value = "/getRepositoryInterface/{id}", method = RequestMethod.GET, @RequestMapping(value = "/getRepositoryInterface/{id}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PostAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id) or (@repositoryService.getRepositoryById(#id).registeredby==null and hasAuthority('REGISTERED_USER'))") @PostAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id) or (@repositoryService.getRepositoryById(#id).registeredBy=='null' and hasAuthority('REGISTERED_USER'))")
public List<RepositoryInterface> getRepositoryInterface(@PathVariable("id") String id) { public List<RepositoryInterface> getRepositoryInterface(@PathVariable("id") String id) throws JSONException {
return repositoryService.getRepositoryInterface(id); return repositoryService.getRepositoryInterface(id);
} }
@ -166,12 +134,11 @@ public class RepositoryController {
// @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or (hasAuthority(@authorizationService.convertRepoIdToRoleId(#repository.id)) or hasAuthority(@authorizationService.convertRepoIdToRoleId(returnObject.id)))") // @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or (hasAuthority(@authorizationService.convertRepoIdToRoleId(#repository.id)) or hasAuthority(@authorizationService.convertRepoIdToRoleId(returnObject.id)))")
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or hasAuthority('REGISTERED_USER')")
public Repository addRepository(@RequestParam("datatype") String datatype, public Repository addRepository(@RequestParam("datatype") String datatype,
@RequestBody Repository repository) { @RequestBody Repository repository) throws Exception {
return repositoryService.addRepository(datatype, repository); return repositoryService.addRepository(datatype, repository);
} }
@Deprecated
@RequestMapping(value = "/getDnetCountries", method = RequestMethod.GET, @RequestMapping(value = "/getDnetCountries", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@ -179,7 +146,6 @@ public class RepositoryController {
return repositoryService.getDnetCountries(); return repositoryService.getDnetCountries();
} }
@Deprecated
@RequestMapping(value = "/getTypologies", method = RequestMethod.GET, @RequestMapping(value = "/getTypologies", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@ -187,7 +153,6 @@ public class RepositoryController {
return repositoryService.getTypologies(); return repositoryService.getTypologies();
} }
@Deprecated
@RequestMapping(value = "/getTimezones", method = RequestMethod.GET, @RequestMapping(value = "/getTimezones", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@ -198,8 +163,8 @@ public class RepositoryController {
@RequestMapping(value = "/updateRepository", method = RequestMethod.POST, @RequestMapping(value = "/updateRepository", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE) consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repository.id)") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOfInterface(#repository.id)")
public Repository updateRepository(@RequestBody Repository repository, Authentication authentication) { public Repository updateRepository(@RequestBody Repository repository, Authentication authentication) throws Exception {
return repositoryService.updateRepository(repository, authentication); return repositoryService.updateRepository(repository, authentication);
} }
@ -207,8 +172,7 @@ public class RepositoryController {
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOfInterface(#id)") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOfInterface(#id)")
public void deleteRepositoryInterface(@RequestParam("id") String id, public void deleteRepositoryInterface(@RequestParam("id") String id,
@RequestParam("registeredBy") String registeredBy) { @RequestParam("registeredBy") String registeredBy) {
// repositoryService.deleteRepositoryInterface(id, registeredBy); repositoryService.deleteRepositoryInterface(id, registeredBy);
logger.warn("User attempted delete on Interface with ID: {}", id);
} }
@RequestMapping(value = "/addInterface", method = RequestMethod.POST, @RequestMapping(value = "/addInterface", method = RequestMethod.POST,
@ -217,10 +181,10 @@ public class RepositoryController {
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id)") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id)")
public RepositoryInterface addRepositoryInterface(@RequestParam("datatype") String datatype, public RepositoryInterface addRepositoryInterface(@RequestParam("datatype") String datatype,
@RequestParam("repoId") String id, @RequestParam("repoId") String id,
@RequestParam(required = false, name = "desiredCompatibilityLevel") String desiredCompatibilityLevel, @RequestParam("registeredBy") String registeredBy,
@RequestParam(value = "comment", required = false) String comment, @RequestParam(value = "comment", required = false) String comment,
@RequestBody RepositoryInterface repositoryInterface) throws Exception { @RequestBody RepositoryInterface repositoryInterface) throws Exception {
return repositoryService.addRepositoryInterface(datatype, id, comment, repositoryInterface, desiredCompatibilityLevel); return repositoryService.addRepositoryInterface(datatype, id, registeredBy, comment, repositoryInterface);
} }
@RequestMapping(value = "/updateRepositoryInterface", method = RequestMethod.POST, @RequestMapping(value = "/updateRepositoryInterface", method = RequestMethod.POST,
@ -228,10 +192,10 @@ public class RepositoryController {
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id)") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#id)")
public RepositoryInterface updateRepositoryInterface(@RequestParam("repoId") String id, public RepositoryInterface updateRepositoryInterface(@RequestParam("repoId") String id,
@RequestParam(required = false, name = "desiredCompatibilityLevel") String desiredCompatibilityLevel, @RequestParam("registeredBy") String registeredBy,
@RequestParam(value = "comment", required = false) String comment, @RequestParam(value = "comment", required = false) String comment,
@RequestBody RepositoryInterface repositoryInterface) throws Exception { @RequestBody RepositoryInterface repositoryInterface) throws Exception {
return repositoryService.updateRepositoryInterface(id, comment, repositoryInterface, desiredCompatibilityLevel); return repositoryService.updateRepositoryInterface(id, registeredBy, comment, repositoryInterface);
} }
@RequestMapping(value = "/getUrlsOfUserRepos/{page}/{size}/", method = RequestMethod.GET, @RequestMapping(value = "/getUrlsOfUserRepos/{page}/{size}/", method = RequestMethod.GET,
@ -242,6 +206,13 @@ public class RepositoryController {
return repositoryService.getUrlsOfUserRepos(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); return repositoryService.getUrlsOfUserRepos(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size);
} }
@RequestMapping(value = "/getDatasourceVocabularies/{mode}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<String> getDatasourceVocabularies(@PathVariable("mode") String mode) {
return repositoryService.getDatasourceVocabularies(mode);
}
@RequestMapping(value = "/getCompatibilityClasses/{mode}", method = RequestMethod.GET, @RequestMapping(value = "/getCompatibilityClasses/{mode}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
@ -267,7 +238,7 @@ public class RepositoryController {
@RequestMapping(value = "/getListLatestUpdate/{mode}", method = RequestMethod.GET, @RequestMapping(value = "/getListLatestUpdate/{mode}", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public Map<String, String> getListLatestUpdate(@PathVariable("mode") String mode) { public Map<String, String> getListLatestUpdate(@PathVariable("mode") String mode) throws JSONException {
return repositoryService.getListLatestUpdate(mode); return repositoryService.getListLatestUpdate(mode);
} }
@ -302,26 +273,4 @@ public class RepositoryController {
authorizationService.removeAdmin(id, email); authorizationService.removeAdmin(id, email);
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Returns whether the Piwik Site of a repository is enabled and validated.
*/
@RequestMapping(value = "{repositoryId}/metrics/valid", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public boolean getMetricsEnabledAndValidated(@PathVariable("repositoryId") String repositoryId) {
PiwikInfo info = piWikService.getPiwikSiteForRepo(repositoryId);
return info != null && info.isValidated();
}
/**
* Returns repository Metrics.
*/
@RequestMapping(value = "{repositoryId}/metrics", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public MetricsInfo getMetricsInfo(@PathVariable("repositoryId") String id) throws RepositoryServiceException {
return repositoryService.getMetricsInfoForRepository(id);
}
} }

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.utils; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.exception.EndPointException; import eu.dnetlib.repo.manager.exception.EndPointException;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -16,17 +16,19 @@ public class RestTemplateResponseErrorHandler implements ResponseErrorHandler {
@Override @Override
public boolean hasError(ClientHttpResponse httpResponse) throws IOException { public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
HttpStatus.Series seriesError = httpResponse.getStatusCode().series(); return (httpResponse.getStatusCode().series() == CLIENT_ERROR
return ( (seriesError == CLIENT_ERROR) || (seriesError == SERVER_ERROR) ); || httpResponse.getStatusCode().series() == SERVER_ERROR);
} }
@Override @Override
public void handleError(ClientHttpResponse httpResponse) throws IOException { public void handleError(ClientHttpResponse httpResponse) throws IOException {
HttpStatus statusCode = httpResponse.getStatusCode(); if (httpResponse.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
if ( statusCode == HttpStatus.NOT_FOUND )
throw new IOException();
else if (statusCode.series() == SERVER_ERROR)
throw new EndPointException(); throw new EndPointException();
} else if (httpResponse.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
throw new IOException();
}
}
} }
} }

View File

@ -1,7 +1,7 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.service.StatsServiceImpl; import eu.dnetlib.repo.manager.service.StatsServiceImpl;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -13,13 +13,14 @@ import java.util.Map;
@RestController @RestController
@RequestMapping(value = "/stats") @RequestMapping(value = "/stats")
@Tag(name="statistics", description = "Stats API") @Api(description = "Stats API", tags = {"statistics"})
public class StatsController { public class StatsController {
@Autowired @Autowired
private StatsServiceImpl statsService; private StatsServiceImpl statsService;
@RequestMapping(value = "/getStatistics" , method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/getStatistics" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public Map getStatistics(){ public Map getStatistics(){
return statsService.getStatistics(); return statsService.getStatistics();

View File

@ -1,8 +1,8 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.service.sushilite.SushiliteServiceImpl; import eu.dnetlib.repo.manager.service.SushiliteServiceImpl;
import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper; import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -10,9 +10,10 @@ import org.springframework.web.bind.annotation.*;
@RestController @RestController
@RequestMapping(value = "/sushilite") @RequestMapping(value = "/sushilite")
@Tag(name="sushilite", description = "Sushi-Lite API") @Api(description = "Sushi-Lite API", tags = {"sushilite"})
public class SushiliteController { public class SushiliteController {
@Autowired @Autowired
private SushiliteServiceImpl sushiliteService; private SushiliteServiceImpl sushiliteService;

View File

@ -1,52 +0,0 @@
package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.service.sushilite.SushiliteR5ServiceImpl;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping(value = "/sushiliteR5")
@Tag(name="sushiliteR5", description = "Sushi-Lite R5 API")
public class SushiliteR5Controller {
private static final Logger logger = LoggerFactory.getLogger(SushiliteR5Controller.class);
@Autowired
private SushiliteR5ServiceImpl sushiliteR5Service;
@RequestMapping(value = "/getReportResults", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')")
public ResponseEntity<?> getReportResults(@RequestParam(value = "Report") String report,
@RequestParam(value = "Release", required=false, defaultValue="5") String release,
@RequestParam(value = "RequestorID",required=false, defaultValue="anonymous") String requestorID,
@RequestParam(value = "BeginDate",required=false, defaultValue="") String beginDate,
@RequestParam(value = "EndDate",required=false, defaultValue="") String endDate,
@RequestParam(value = "RepositoryIdentifier", required=false, defaultValue="") String repositoryIdentifier,
@RequestParam(value = "DatasetIdentifier", required=false, defaultValue="") String datasetIdentifier,
@RequestParam(value = "ItemIdentifier",required=false, defaultValue="") String itemIdentifier,
@RequestParam(value = "MetricType",required=false) List<String> metricTypes,
@RequestParam(value = "DataType",required=false, defaultValue="") String dataType,
@RequestParam(value = "Granularity", required = false, defaultValue ="Monthly") String granularity,
@RequestParam(value = "Pretty",required=false, defaultValue="") String pretty) {
try {
return sushiliteR5Service.getReportResults(report, release, requestorID, beginDate, endDate, repositoryIdentifier, datasetIdentifier, itemIdentifier, metricTypes, dataType, granularity, pretty);
} catch (JSONException je) {
logger.error("", je);
return ResponseEntity.internalServerError().build();
}
}
}

View File

@ -1,7 +1,7 @@
package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
import eu.dnetlib.repo.manager.service.UserServiceImpl; import eu.dnetlib.repo.manager.service.UserServiceImpl;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping(value = "/user") @RequestMapping(value = "/user")
@Tag(name="user", description = "User API") @Api(description = "User API", tags = {"user"})
public class UserController { public class UserController {
@Autowired @Autowired

View File

@ -1,108 +1,110 @@
//package eu.dnetlib.repo.manager.controllers; package eu.dnetlib.repo.manager.controllers;
//
//import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.Role;
//import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService;
//import eu.dnetlib.repo.manager.service.security.AuthoritiesUpdater; import eu.dnetlib.repo.manager.service.security.AuthoritiesUpdater;
//import eu.dnetlib.repo.manager.service.security.AuthorizationService; import eu.dnetlib.repo.manager.service.security.AuthorizationService;
//import eu.dnetlib.repo.manager.service.security.RoleMappingService; import eu.dnetlib.repo.manager.service.security.RoleMappingService;
//import eu.dnetlib.repo.manager.utils.JsonUtils; import eu.dnetlib.repo.manager.utils.JsonUtils;
//import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Api;
//import org.springframework.beans.factory.annotation.Autowired; import io.swagger.annotations.ApiOperation;
//import org.springframework.http.HttpStatus; import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.ResponseEntity; import org.springframework.http.HttpStatus;
//import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.*; import org.springframework.security.access.prepost.PreAuthorize;
// import org.springframework.web.bind.annotation.*;
//import javax.ws.rs.core.MediaType;
//import javax.ws.rs.core.Response; import javax.ws.rs.core.MediaType;
//import java.util.Collection; import javax.ws.rs.core.Response;
// import java.util.Collection;
////@RestController
////@RequestMapping(value = "/role-management") //@RestController
////@Api(description = "Role Management", value = "role-management") //@RequestMapping(value = "/role-management")
//public class UserRoleController { //@Api(description = "Role Management", value = "role-management")
// public class UserRoleController {
// private final AaiRegistryService aaiRegistryService;
// private final AuthoritiesUpdater authoritiesUpdater; private final AaiRegistryService aaiRegistryService;
// private final RoleMappingService roleMappingService; private final AuthoritiesUpdater authoritiesUpdater;
// private final AuthorizationService authorizationService; private final RoleMappingService roleMappingService;
// private final AuthorizationService authorizationService;
// @Autowired
// UserRoleController(AaiRegistryService aaiRegistryService, @Autowired
// AuthoritiesUpdater authoritiesUpdater, UserRoleController(AaiRegistryService aaiRegistryService,
// RoleMappingService roleMappingService, AuthoritiesUpdater authoritiesUpdater,
// AuthorizationService authorizationService) { RoleMappingService roleMappingService,
// this.aaiRegistryService = aaiRegistryService; AuthorizationService authorizationService) {
// this.authoritiesUpdater = authoritiesUpdater; this.aaiRegistryService = aaiRegistryService;
// this.roleMappingService = roleMappingService; this.authoritiesUpdater = authoritiesUpdater;
// this.authorizationService = authorizationService; this.roleMappingService = roleMappingService;
// } this.authorizationService = authorizationService;
// }
// /**
// * Get the role with the given id. /**
// **/ * Get the role with the given id.
// @RequestMapping(method = RequestMethod.GET, path = "/role/{id}") **/
//// @PreAuthorize("hasAnyAuthority('REGISTERED_USER', 'SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") @RequestMapping(method = RequestMethod.GET, path = "/role/{id}")
// public Response getRole(@RequestParam(value = "type", defaultValue = "datasource") String type, @PathVariable("id") String id) { // @PreAuthorize("hasAnyAuthority('REGISTERED_USER', 'SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')")
// int roleId = aaiRegistryService.getCouId(type, id); public Response getRole(@RequestParam(value = "type", defaultValue = "datasource") String type, @PathVariable("id") String id) {
// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role id is: " + roleId).toString()).type(MediaType.APPLICATION_JSON).build(); int roleId = aaiRegistryService.getCouId(type, id);
// } return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role id is: " + roleId).toString()).type(MediaType.APPLICATION_JSON).build();
// }
// /**
// * Create a new role with the given name and description. /**
// **/ * Create a new role with the given name and description.
// @RequestMapping(method = RequestMethod.POST, path = "/role") **/
// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR')") @RequestMapping(method = RequestMethod.POST, path = "/role")
// public Response createRole(@RequestBody Role role) { @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR')")
// aaiRegistryService.createRole(role); public Response createRole(@RequestBody Role role) {
// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build(); aaiRegistryService.createRole(role);
// } return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build();
// }
// /**
// * Subscribe to a type(Community, etc.) with id(ee, egi, etc.) /**
// */ * Subscribe to a type(Community, etc.) with id(ee, egi, etc.)
// @ApiOperation(value = "subscribe") */
// @RequestMapping(method = RequestMethod.POST, path = "/subscribe/{type}/{id}") @ApiOperation(value = "subscribe")
// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") @RequestMapping(method = RequestMethod.POST, path = "/subscribe/{type}/{id}")
// public Response subscribe(@PathVariable("type") String type, @PathVariable("id") String id) { @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')")
// Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); public Response subscribe(@PathVariable("type") String type, @PathVariable("id") String id) {
// if (coPersonId == null) { Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier();
// coPersonId = aaiRegistryService.getCoPersonIdsByEmail(); if (coPersonId == null) {
// } coPersonId = aaiRegistryService.getCoPersonIdByEmail();
// Integer couId = aaiRegistryService.getCouId(type, id); }
// if (couId != null) { Integer couId = aaiRegistryService.getCouId(type, id);
// aaiRegistryService.assignMemberRole(coPersonId, couId); if (couId != null) {
// Integer role = aaiRegistryService.getRoleId(coPersonId, couId);
// // Add role to current authorities aaiRegistryService.assignMemberRole(coPersonId, couId, role);
// authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(id));
// // Add role to current authorities
// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(id));
// } else {
// return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build();
// } } else {
// } return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build();
// ///////////////////////////////////////////////////////////////////////////////////////////// }
// ///////////////////////////////////////////////////////////////////////////////////////////// }
// /////////////////////////////////////////////////////////////////////////////////////////////
// @RequestMapping(method = RequestMethod.GET, path = "/users/couid/{id}") /////////////////////////////////////////////////////////////////////////////////////////////
// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')")
// public ResponseEntity<String> getUsersByCouId(@PathVariable("id") Integer id) { @RequestMapping(method = RequestMethod.GET, path = "/users/couid/{id}")
//// calls.getUserByCoId() @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')")
// return ResponseEntity.ok(aaiRegistryService.getUsersByCouId(id).toString()); public ResponseEntity<String> getUsersByCouId(@PathVariable("id") Integer id) {
// } // calls.getUserByCoId()
// return ResponseEntity.ok(aaiRegistryService.getUsersByCouId(id).toString());
// }
// @RequestMapping(method = RequestMethod.GET, path = "/users/{email}/roles")
// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or hasAuthority('REGISTERED_USER') and authentication.userInfo.email==#email")
// public ResponseEntity<Collection<String>> getRolesByEmail(@PathVariable("email") String email) { @RequestMapping(method = RequestMethod.GET, path = "/users/{email}/roles")
// return ResponseEntity.ok(authorizationService.getUserRolesByEmail(email)); @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or hasAuthority('REGISTERED_USER') and authentication.userInfo.email==#email")
// } public ResponseEntity<Collection<String>> getRolesByEmail(@PathVariable("email") String email) {
// return ResponseEntity.ok(authorizationService.getUserRoles(email));
// }
// @RequestMapping(method = RequestMethod.GET, path = "/user/roles/my")
// @PreAuthorize("hasAuthority('REGISTERED_USER')")
// public ResponseEntity<Collection<String>> getRoleNames() { @RequestMapping(method = RequestMethod.GET, path = "/user/roles/my")
// return ResponseEntity.ok(authorizationService.getUserRoles()); @PreAuthorize("hasAuthority('REGISTERED_USER')")
// } public ResponseEntity<Collection<String>> getRoleNames() {
// return ResponseEntity.ok(authorizationService.getUserRoles());
//} }
}

View File

@ -5,12 +5,12 @@ import eu.dnetlib.domain.functionality.validator.JobForValidation;
import eu.dnetlib.domain.functionality.validator.RuleSet; import eu.dnetlib.domain.functionality.validator.RuleSet;
import eu.dnetlib.domain.functionality.validator.StoredJob; import eu.dnetlib.domain.functionality.validator.StoredJob;
import eu.dnetlib.repo.manager.domain.InterfaceInformation; import eu.dnetlib.repo.manager.domain.InterfaceInformation;
import eu.dnetlib.repo.manager.domain.ValidationServiceException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import eu.dnetlib.repo.manager.exception.ValidationServiceException;
import eu.dnetlib.repo.manager.service.EmailUtils; import eu.dnetlib.repo.manager.service.EmailUtils;
import eu.dnetlib.repo.manager.service.ValidatorServiceImpl; import eu.dnetlib.repo.manager.service.ValidatorServiceImpl;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiParam;
import org.json.JSONException; import org.json.JSONException;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -25,7 +25,7 @@ import java.util.List;
@RestController @RestController
@RequestMapping(value = "/validator") @RequestMapping(value = "/validator")
@Tag(name="validator", description = "Validator API") @Api(description = "Validator API", tags = {"validator"})
public class ValidatorController { public class ValidatorController {
@Autowired @Autowired
@ -80,12 +80,12 @@ public class ValidatorController {
@ResponseBody @ResponseBody
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER')")
public List<StoredJob> getStoredJobsNew(@RequestParam(value = "jobType", required = false) public List<StoredJob> getStoredJobsNew(@RequestParam(value = "jobType", required = false)
@Parameter(description = "Equals to filter job type on validation history page") String jobType, @ApiParam(value = "Equals to filter job type on validation history page") String jobType,
@RequestParam("offset") @Parameter(description = "Page number", required = true) String offset, @RequestParam("offset") @ApiParam(value = "Page number", required = true) String offset,
@RequestParam(value = "limit", required = false,defaultValue = "10") @Parameter(description = "Null value") String limit, @RequestParam(value = "limit", required = false,defaultValue = "10") @ApiParam(value = "Null value") String limit,
@RequestParam(value = "dateFrom", required = false) @Parameter(description = "Null value") String dateFrom, @RequestParam(value = "dateFrom", required = false) @ApiParam(value = "Null value") String dateFrom,
@RequestParam(value = "dateTo", required = false) @Parameter(description = "Null value") String dateTo, @RequestParam(value = "dateTo", required = false) @ApiParam(value = "Null value") String dateTo,
@RequestParam("validationStatus") @Parameter(description = "Equals to filter validation jobs", required = true) String validationStatus @RequestParam("validationStatus") @ApiParam(value = "Equals to filter validation jobs", required = true) String validationStatus
) throws ValidatorServiceException { ) throws ValidatorServiceException {
return validatorService.getStoredJobsNew(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), jobType, offset, limit, dateFrom, dateTo, validationStatus); return validatorService.getStoredJobsNew(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), jobType, offset, limit, dateFrom, dateTo, validationStatus);
} }
@ -112,8 +112,8 @@ public class ValidatorController {
@RequestMapping(value = "/complete" , method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/complete" , method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public void validationCompleted( public void validationCompleted(
@RequestParam(value = "repoId") String repoId,
@RequestParam(value = "interfaceId") String interfaceId, @RequestParam(value = "interfaceId") String interfaceId,
@RequestParam(value = "repoId") String repoId,
@RequestParam(value = "jobId") String jobId, @RequestParam(value = "jobId") String jobId,
@RequestParam(value = "issuerEmail") String issuerEmail, @RequestParam(value = "issuerEmail") String issuerEmail,
@RequestParam(value = "isUpdate") boolean isUpdate, @RequestParam(value = "isUpdate") boolean isUpdate,
@ -121,7 +121,7 @@ public class ValidatorController {
@RequestParam(value = "scoreUsage") int scoreUsage, @RequestParam(value = "scoreUsage") int scoreUsage,
@RequestParam(value = "scoreContent") int scoreContent) throws Exception { @RequestParam(value = "scoreContent") int scoreContent) throws Exception {
validatorService.onComplete(repoId, interfaceId, jobId, issuerEmail, isUpdate, isSuccess, scoreUsage, scoreContent); emailUtils.sendUponJobCompletion(repoId,interfaceId,scoreUsage,scoreContent,isSuccess,isUpdate,issuerEmail, jobId);
} }

View File

@ -0,0 +1,63 @@
package eu.dnetlib.repo.manager.domain;
import java.util.Calendar;
import java.util.Date;
public class AggregationDetails{
private String aggregationStage;
private Date date;
private int numberOfRecords;
private String collectionMode;
private Boolean indexedVersion;
public AggregationDetails() {
}
public String getAggregationStage() {
return aggregationStage;
}
public String getCollectionMode() {
return collectionMode;
}
public void setCollectionMode(String collectionMode) {
this.collectionMode = collectionMode;
}
public void setAggregationStage(String aggregationStage) {
this.aggregationStage = aggregationStage;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getNumberOfRecords() {
return numberOfRecords;
}
public void setNumberOfRecords(int numberOfRecords) {
this.numberOfRecords = numberOfRecords;
}
public String getYear() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(getDate());
return String.valueOf(calendar.get(Calendar.YEAR));
}
public Boolean getIndexedVersion() {
return indexedVersion;
}
public void setIndexedVersion(Boolean indexedVersion) {
this.indexedVersion = indexedVersion;
}
}

View File

@ -0,0 +1,38 @@
package eu.dnetlib.repo.manager.domain;
import java.util.ArrayList;
import java.util.List;
public class Aggregations{
private List<AggregationDetails> aggregationHistory = new ArrayList<>();
private AggregationDetails lastCollection;
private AggregationDetails lastTransformation;
public Aggregations() {
}
public List<AggregationDetails> getAggregationHistory() {
return aggregationHistory;
}
public void setAggregationHistory(List<AggregationDetails> aggregationHistory) {
this.aggregationHistory = aggregationHistory;
}
public AggregationDetails getLastCollection() {
return lastCollection;
}
public void setLastCollection(AggregationDetails lastCollection) {
this.lastCollection = lastCollection;
}
public AggregationDetails getLastTransformation() {
return lastTransformation;
}
public void setLastTransformation(AggregationDetails lastTransformation) {
this.lastTransformation = lastTransformation;
}
}

View File

@ -1,188 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import java.util.Date;
import java.util.Set;
public class ApiDetails {
protected String id = null;
protected String protocol = null;
protected String datasource = null;
protected String contentdescription = null;
protected String eoscDatasourceType = null;
protected String compatibility;
protected String compatibilityOverride;
protected Integer lastCollectionTotal;
protected Date lastCollectionDate;
protected Integer lastAggregationTotal;
protected Date lastAggregationDate;
protected Integer lastDownloadTotal;
protected Date lastDownloadDate;
protected String baseurl;
protected Boolean removable = false;
protected Set<ApiParamDetails> apiParams;
protected String metadataIdentifierPath = "";
@Deprecated
protected String typology = null;
public String getId() {
return id;
}
public String getProtocol() {
return protocol;
}
public String getDatasource() {
return datasource;
}
public String getContentdescription() {
return contentdescription;
}
public String getCompatibility() {
return compatibility;
}
public Integer getLastCollectionTotal() {
return lastCollectionTotal;
}
public Date getLastCollectionDate() {
return lastCollectionDate;
}
public Integer getLastAggregationTotal() {
return lastAggregationTotal;
}
public Date getLastAggregationDate() {
return lastAggregationDate;
}
public Integer getLastDownloadTotal() {
return lastDownloadTotal;
}
public Date getLastDownloadDate() {
return lastDownloadDate;
}
public String getBaseurl() {
return baseurl;
}
public ApiDetails setId(final String id) {
this.id = id;
return this;
}
public ApiDetails setProtocol(final String protocol) {
this.protocol = protocol;
return this;
}
public ApiDetails setDatasource(final String datasource) {
this.datasource = datasource;
return this;
}
public ApiDetails setContentdescription(final String contentdescription) {
this.contentdescription = contentdescription;
return this;
}
public ApiDetails setCompatibility(final String compatibility) {
this.compatibility = compatibility;
return this;
}
public ApiDetails setLastCollectionTotal(final Integer lastCollectionTotal) {
this.lastCollectionTotal = lastCollectionTotal;
return this;
}
public ApiDetails setLastCollectionDate(final Date lastCollectionDate) {
this.lastCollectionDate = lastCollectionDate;
return this;
}
public ApiDetails setLastAggregationTotal(final Integer lastAggregationTotal) {
this.lastAggregationTotal = lastAggregationTotal;
return this;
}
public ApiDetails setLastAggregationDate(final Date lastAggregationDate) {
this.lastAggregationDate = lastAggregationDate;
return this;
}
public ApiDetails setLastDownloadTotal(final Integer lastDownloadTotal) {
this.lastDownloadTotal = lastDownloadTotal;
return this;
}
public ApiDetails setLastDownloadDate(final Date lastDownloadDate) {
this.lastDownloadDate = lastDownloadDate;
return this;
}
public ApiDetails setBaseurl(final String baseurl) {
this.baseurl = baseurl;
return this;
}
public Set<ApiParamDetails> getApiParams() {
return apiParams;
}
public void setApiParams(final Set<ApiParamDetails> apiParams) {
this.apiParams = apiParams;
}
public String getCompatibilityOverride() {
return compatibilityOverride;
}
public ApiDetails setCompatibilityOverride(final String compatibilityOverride) {
this.compatibilityOverride = compatibilityOverride;
return this;
}
public Boolean getRemovable() {
return removable;
}
public ApiDetails setRemovable(final Boolean removable) {
this.removable = removable;
return this;
}
public String getMetadataIdentifierPath() {
return metadataIdentifierPath;
}
public ApiDetails setMetadataIdentifierPath(final String metadataIdentifierPath) {
this.metadataIdentifierPath = metadataIdentifierPath;
return this;
}
public String getEoscDatasourceType() {
return eoscDatasourceType;
}
public ApiDetails setEoscDatasourceType(final String eoscDatasourceType) {
this.eoscDatasourceType = eoscDatasourceType;
return this;
}
public String getTypology() {
return typology;
}
public ApiDetails setTypology(final String typology) {
this.typology = typology;
return this;
}
}

View File

@ -1,19 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import java.util.List;
public class ApiDetailsResponse extends Response {
private List<ApiDetails> api;
public List<ApiDetails> getApi() {
return api;
}
public ApiDetailsResponse setApi(final List<ApiDetails> api) {
this.api = api;
return this;
}
}

View File

@ -1,25 +0,0 @@
package eu.dnetlib.repo.manager.domain;
public class ApiParamDetails {
protected String param;
protected String value;
public String getParam() {
return param;
}
public void setParam(final String param) {
this.param = param;
}
public String getValue() {
return value;
}
public void setValue(final String value) {
this.value = value;
}
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.exception; package eu.dnetlib.repo.manager.domain;
/** /**

View File

@ -1,34 +1,32 @@
package eu.dnetlib.repo.manager.domain; package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo;
import java.util.List; import java.util.List;
public class CollectionMonitorSummary { public class CollectionMonitorSummary {
private List<AggregationInfo> aggregationInfo; private List<AggregationDetails> aggregationDetails;
private AggregationInfo lastIndexedVersion; private AggregationDetails lastIndexedVersion;
public CollectionMonitorSummary(){} public CollectionMonitorSummary(){}
public CollectionMonitorSummary(List<AggregationInfo> aggregationInfo, AggregationInfo lastIndexedVersion) { public CollectionMonitorSummary(List<AggregationDetails> aggregationDetails, AggregationDetails lastIndexedVersion) {
this.aggregationInfo = aggregationInfo; this.aggregationDetails = aggregationDetails;
this.lastIndexedVersion = lastIndexedVersion; this.lastIndexedVersion = lastIndexedVersion;
} }
public List<AggregationInfo> getAggregationInfo() { public List<AggregationDetails> getAggregationDetails() {
return aggregationInfo; return aggregationDetails;
} }
public void setAggregationInfo(List<AggregationInfo> aggregationInfo) { public void setAggregationDetails(List<AggregationDetails> aggregationDetails) {
this.aggregationInfo = aggregationInfo; this.aggregationDetails = aggregationDetails;
} }
public AggregationInfo getLastIndexedVersion() { public AggregationDetails getLastIndexedVersion() {
return lastIndexedVersion; return lastIndexedVersion;
} }
public void setLastIndexedVersion(AggregationInfo lastIndexedVersion) { public void setLastIndexedVersion(AggregationDetails lastIndexedVersion) {
this.lastIndexedVersion = lastIndexedVersion; this.lastIndexedVersion = lastIndexedVersion;
} }
} }

View File

@ -1,321 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import javax.persistence.Transient;
import java.util.Date;
import java.util.Set;
public class DatasourceDetails {
protected String id;
@Transient
protected String openaireId;
protected String officialname;
protected String englishname;
protected String websiteurl;
protected String logourl;
protected String contactemail;
protected Double latitude = 0.0;
protected Double longitude = 0.0;
protected Double timezone = 0.0;
protected String namespaceprefix;
protected String languages;
protected Date dateofvalidation;
protected String eoscDatasourceType;
protected Date dateofcollection;
protected String platform;
protected String activationId;
protected String description;
protected String issn;
protected String eissn;
protected String lissn;
protected String registeredby;
protected String subjects;
protected String aggregator = "OPENAIRE";
protected String collectedfrom;
protected Boolean managed;
protected Boolean consentTermsOfUse;
protected Boolean fullTextDownload;
protected Date consentTermsOfUseDate;
protected Date lastConsentTermsOfUseDate;
protected Set<OrganizationDetails> organizations;
protected Set<IdentitiesDetails> identities;
protected String status;
protected String typology;
protected Date registrationdate;
public DatasourceDetails() {
// no arg constructor
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getOpenaireId() {
return openaireId;
}
public void setOpenaireId(String openaireId) {
this.openaireId = openaireId;
}
public String getOfficialname() {
return officialname;
}
public void setOfficialname(String officialname) {
this.officialname = officialname;
}
public String getEnglishname() {
return englishname;
}
public void setEnglishname(String englishname) {
this.englishname = englishname;
}
public String getWebsiteurl() {
return websiteurl;
}
public void setWebsiteurl(String websiteurl) {
this.websiteurl = websiteurl;
}
public String getLogourl() {
return logourl;
}
public void setLogourl(String logourl) {
this.logourl = logourl;
}
public String getContactemail() {
return contactemail;
}
public void setContactemail(String contactemail) {
this.contactemail = contactemail;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public String getNamespaceprefix() {
return namespaceprefix;
}
public void setNamespaceprefix(String namespaceprefix) {
this.namespaceprefix = namespaceprefix;
}
public String getLanguages() {
return languages;
}
public void setLanguages(String languages) {
this.languages = languages;
}
public Date getDateofvalidation() {
return dateofvalidation;
}
public void setDateofvalidation(Date dateofvalidation) {
this.dateofvalidation = dateofvalidation;
}
public String getEoscDatasourceType() {
return eoscDatasourceType;
}
public void setEoscDatasourceType(String eoscDatasourceType) {
this.eoscDatasourceType = eoscDatasourceType;
}
public Date getDateofcollection() {
return dateofcollection;
}
public void setDateofcollection(Date dateofcollection) {
this.dateofcollection = dateofcollection;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public String getActivationId() {
return activationId;
}
public void setActivationId(String activationId) {
this.activationId = activationId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getIssn() {
return issn;
}
public void setIssn(String issn) {
this.issn = issn;
}
public String getEissn() {
return eissn;
}
public void setEissn(String eissn) {
this.eissn = eissn;
}
public String getLissn() {
return lissn;
}
public void setLissn(String lissn) {
this.lissn = lissn;
}
public String getRegisteredby() {
return registeredby;
}
public void setRegisteredby(String registeredby) {
this.registeredby = registeredby;
}
public String getSubjects() {
return subjects;
}
public void setSubjects(String subjects) {
this.subjects = subjects;
}
public String getAggregator() {
return aggregator;
}
public void setAggregator(String aggregator) {
this.aggregator = aggregator;
}
public String getCollectedfrom() {
return collectedfrom;
}
public void setCollectedfrom(String collectedfrom) {
this.collectedfrom = collectedfrom;
}
public Boolean getManaged() {
return managed;
}
public void setManaged(Boolean managed) {
this.managed = managed;
}
public Boolean getConsentTermsOfUse() {
return consentTermsOfUse;
}
public void setConsentTermsOfUse(Boolean consentTermsOfUse) {
this.consentTermsOfUse = consentTermsOfUse;
}
public Boolean getFullTextDownload() {
return fullTextDownload;
}
public void setFullTextDownload(Boolean fullTextDownload) {
this.fullTextDownload = fullTextDownload;
}
public Date getConsentTermsOfUseDate() {
return consentTermsOfUseDate;
}
public void setConsentTermsOfUseDate(Date consentTermsOfUseDate) {
this.consentTermsOfUseDate = consentTermsOfUseDate;
}
public Date getLastConsentTermsOfUseDate() {
return lastConsentTermsOfUseDate;
}
public void setLastConsentTermsOfUseDate(Date lastConsentTermsOfUseDate) {
this.lastConsentTermsOfUseDate = lastConsentTermsOfUseDate;
}
public Set<OrganizationDetails> getOrganizations() {
return organizations;
}
public void setOrganizations(Set<OrganizationDetails> organizations) {
this.organizations = organizations;
}
public Set<IdentitiesDetails> getIdentities() {
return identities;
}
public void setIdentities(Set<IdentitiesDetails> identities) {
this.identities = identities;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getTypology() {
return typology;
}
public void setTypology(String typology) {
this.typology = typology;
}
public Date getRegistrationdate() {
return registrationdate;
}
public void setRegistrationdate(Date registrationdate) {
this.registrationdate = registrationdate;
}
}

View File

@ -0,0 +1,47 @@
package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.domain.data.Repository;
/**
* Created by stefania on 12/17/15.
*/
public class DatasourceRegistrationState extends WizardState {
private String mode;
private String selectedRepositoryId;
private Repository repository;
public DatasourceRegistrationState() {
}
public DatasourceRegistrationState(String mode, String selectedRepositoryId, Repository repository) {
this.mode = mode;
this.selectedRepositoryId = selectedRepositoryId;
this.repository = repository;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getSelectedRepositoryId() {
return selectedRepositoryId;
}
public void setSelectedRepositoryId(String selectedRepositoryId) {
this.selectedRepositoryId = selectedRepositoryId;
}
public Repository getRepository() {
return repository;
}
public void setRepository(Repository repository) {
this.repository = repository;
}
}

View File

@ -1,24 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import com.google.common.collect.Lists;
import java.util.List;
public class DatasourceResponse extends Response {
private List<DatasourceDetails> datasourceInfo = Lists.newArrayList();
public DatasourceResponse addDatasourceInfo(final DatasourceDetails datasourceInfo) {
getDatasourceInfo().add(datasourceInfo);
return this;
}
public List<DatasourceDetails> getDatasourceInfo() {
return datasourceInfo;
}
public DatasourceResponse setDatasourceInfo(final List<DatasourceDetails> datasourceInfo) {
this.datasourceInfo = datasourceInfo;
return this;
}
}

View File

@ -0,0 +1,60 @@
package eu.dnetlib.repo.manager.domain;
import java.util.List;
import java.util.Map;
/**
* Created by nikonas on 21/12/15.
*/
public class DatasourceVocabularies{
private Map<String, String> countries;
private List<Timezone> timezones;
private Map<String, String> datasourceClasses;
private List<String> typologies;
private Map<String, String> compatibilityLevels;
public DatasourceVocabularies() {
}
public Map<String, String> getCountries() {
return countries;
}
public void setCountries(Map<String, String> countries) {
this.countries = countries;
}
public List<Timezone> getTimezones() {
return timezones;
}
public void setTimezones(List<Timezone> timezones) {
this.timezones = timezones;
}
public Map<String, String> getDatasourceClasses() {
return datasourceClasses;
}
public void setDatasourceClasses(Map<String, String> datasourceClasses) {
this.datasourceClasses = datasourceClasses;
}
public List<String> getTypologies() {
return typologies;
}
public void setTypologies(List<String> typologies) {
this.typologies = typologies;
}
public Map<String, String> getCompatibilityLevels() {
return compatibilityLevels;
}
public void setCompatibilityLevels(Map<String, String> compatibilityLevels) {
this.compatibilityLevels = compatibilityLevels;
}
}

View File

@ -1,5 +1,7 @@
package eu.dnetlib.repo.manager.domain; package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.domain.data.Repository;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -1,79 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import com.google.common.collect.Lists;
import com.google.gson.GsonBuilder;
import java.util.List;
import java.util.Queue;
import java.util.stream.Collectors;
public class Header {
private long total;
private int page;
private int size;
private long time;
private int statusCode;
private List<String> errors = Lists.newArrayList();
private Queue<Throwable> exceptions = Lists.newLinkedList();
public static Header newInsance() {
return new Header();
}
public Header() {
}
public long getTime() {
return time;
}
public Header setTime(final long time) {
this.time = time;
return this;
}
public int getStatusCode() {
return statusCode;
}
public Header setStatusCode(final int statusCode) {
this.statusCode = statusCode;
return this;
}
public long getTotal() {
return total;
}
public int getPage() {
return page;
}
public int getSize() {
return size;
}
public Header setPage(final int page) {
this.page = page;
return this;
}
public Header setSize(final int size) {
this.size = size;
return this;
}
public Header setTotal(final long total) {
this.total = total;
return this;
}
public Queue<Throwable> getExceptions() {
return exceptions;
}
public Header setExceptions(final Queue<Throwable> exceptions) {
this.exceptions = exceptions;
return this;
}
public List<String> getErrors() {
return getExceptions().stream()
.map(Throwable::getMessage)
.collect(Collectors.toList());
}
public Header setErrors(final List<String> errors) {
this.errors = errors;
return this;
}
public String toJson() {
return new GsonBuilder().setPrettyPrinting().create().toJson(this);
}
}

View File

@ -1,29 +0,0 @@
package eu.dnetlib.repo.manager.domain;
public class IdentitiesDetails {
private String pid;
private String issuertype;
public IdentitiesDetails() {
// no arg constructor
}
public String getPid() {
return pid;
}
public String getIssuertype() {
return issuertype;
}
public IdentitiesDetails setPid(final String pid) {
this.pid = pid;
return this;
}
public IdentitiesDetails setIssuertype(final String issuertype) {
this.issuertype = issuertype;
return this;
}
}

View File

@ -1,95 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.repo.manager.domain.dto.InterfaceComplianceRequestDTO;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Transient;
import java.util.Date;
@Entity
@IdClass(InterfaceComplianceRequestId.class)
public class InterfaceComplianceRequest {
@Id
String repositoryId;
@Id
String interfaceId;
String desiredCompatibilityLevel;
Date submissionDate;
public InterfaceComplianceRequest() {
this.submissionDate = new Date();
}
public InterfaceComplianceRequest(String repositoryId, String interfaceId, String desiredCompatibilityLevel) {
this.submissionDate = new Date();
this.repositoryId = repositoryId;
this.interfaceId = interfaceId;
this.desiredCompatibilityLevel = desiredCompatibilityLevel;
}
public static InterfaceComplianceRequest from(InterfaceComplianceRequestDTO dto) {
InterfaceComplianceRequest request = new InterfaceComplianceRequest();
request.setRepositoryId(dto.getRepositoryId());
request.setInterfaceId(dto.getInterfaceId());
if (dto.getSubmissionDate() != null) {
request.setSubmissionDate(dto.getSubmissionDate());
} else {
request.setSubmissionDate(new Date());
}
request.setDesiredCompatibilityLevel(dto.getDesiredCompatibilityLevel());
return request;
}
@Transient
public InterfaceComplianceRequestId getId() {
InterfaceComplianceRequestId id = new InterfaceComplianceRequestId();
id.repositoryId = this.repositoryId;
id.interfaceId = this.interfaceId;
return id;
}
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getInterfaceId() {
return interfaceId;
}
public void setInterfaceId(String interfaceId) {
this.interfaceId = interfaceId;
}
public String getDesiredCompatibilityLevel() {
return desiredCompatibilityLevel;
}
public void setDesiredCompatibilityLevel(String desiredCompatibilityLevel) {
this.desiredCompatibilityLevel = desiredCompatibilityLevel;
}
public Date getSubmissionDate() {
return submissionDate;
}
public void setSubmissionDate(Date submissionDate) {
this.submissionDate = submissionDate;
}
@Override
public String toString() {
return "InterfaceComplianceRequest{" +
"repositoryId='" + repositoryId + '\'' +
", interfaceId='" + interfaceId + '\'' +
", desiredCompatibilityLevel='" + desiredCompatibilityLevel + '\'' +
", submissionDate=" + submissionDate +
'}';
}
}

View File

@ -1,50 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import java.io.Serializable;
public class InterfaceComplianceRequestId implements Serializable {
String repositoryId;
String interfaceId;
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getInterfaceId() {
return interfaceId;
}
public void setInterfaceId(String interfaceId) {
this.interfaceId = interfaceId;
}
public static InterfaceComplianceRequestId of(String repositoryId, String interfaceId) {
InterfaceComplianceRequestId id = new InterfaceComplianceRequestId();
id.setRepositoryId(repositoryId);
id.setInterfaceId(interfaceId);
return id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof InterfaceComplianceRequestId)) return false;
InterfaceComplianceRequestId that = (InterfaceComplianceRequestId) o;
if (getRepositoryId() != null ? !getRepositoryId().equals(that.getRepositoryId()) : that.getRepositoryId() != null)
return false;
return getInterfaceId() != null ? getInterfaceId().equals(that.getInterfaceId()) : that.getInterfaceId() == null;
}
@Override
public int hashCode() {
int result = getRepositoryId() != null ? getRepositoryId().hashCode() : 0;
result = 31 * result + (getInterfaceId() != null ? getInterfaceId().hashCode() : 0);
return result;
}
}

View File

@ -1,54 +0,0 @@
package eu.dnetlib.repo.manager.domain;
public class OrganizationDetails {
private String legalshortname;
private String legalname;
private String websiteurl;
private String logourl;
private String country;
public OrganizationDetails() {
// no arg constructor
}
public String getLegalshortname() {
return legalshortname;
}
public void setLegalshortname(String legalshortname) {
this.legalshortname = legalshortname;
}
public String getLegalname() {
return legalname;
}
public void setLegalname(String legalname) {
this.legalname = legalname;
}
public String getWebsiteurl() {
return websiteurl;
}
public void setWebsiteurl(String websiteurl) {
this.websiteurl = websiteurl;
}
public String getLogourl() {
return logourl;
}
public void setLogourl(String logourl) {
this.logourl = logourl;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}

View File

@ -43,18 +43,6 @@ public class Paging<T> {
this.results = new ArrayList<>(); this.results = new ArrayList<>();
} }
public static <K> Paging<K> of(Header header, List<K> results) {
Paging<K> paging = new Paging<>();
paging.setFrom(header.getPage() * header.getSize());
paging.setTo(paging.getFrom() + header.getSize() - 1);
if (paging.getTo() > header.getTotal()) {
paging.setTo((int) header.getTotal() - 1);
}
paging.setTotal((int) header.getTotal());
paging.setResults(results);
return paging;
}
public int getTotal() { public int getTotal() {
return total; return total;
} }

View File

@ -1,53 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class PendingUserRole {
@Id
long id;
int coPersonId;
int couId;
public PendingUserRole() {
// no-arg constructor
}
public PendingUserRole(int coPersonId, int couId) {
this.coPersonId = coPersonId;
this.couId = couId;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getCoPersonId() {
return coPersonId;
}
public void setCoPersonId(int coPersonId) {
this.coPersonId = coPersonId;
}
public int getCouId() {
return couId;
}
public void setCouId(int couId) {
this.couId = couId;
}
@Override
public String toString() {
return "PendingUserRole{" +
"coPersonId=" + coPersonId +
", couId=" + couId +
'}';
}
}

View File

@ -1,92 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.domain.data.DataCollectionType;
import eu.dnetlib.domain.data.PiwikInfo;
import java.util.ArrayList;
import java.util.List;
/**
* The domain object for the Repository resource data structure
*
*/
public class Repository extends DatasourceDetails {
private static final long serialVersionUID = -7241644234046760972L;
private List<RepositoryInterface> interfaces = new ArrayList<>();
private static List<DataCollectionType> dataCollectionTypes = new ArrayList<>();
private PiwikInfo piwikInfo;
public Repository() {
}
public List<RepositoryInterface> getInterfaces() {
return interfaces;
}
public void setInterfaces(List<RepositoryInterface> interfaces) {
this.interfaces = interfaces;
}
public Double getTimezone() {
return timezone;
}
public void setTimezone(Double timezone) throws IllegalArgumentException {
if (timezone < -12 || timezone > 12 || (timezone % 0.5) != 0) {
String t = String.valueOf(timezone);
throw new IllegalArgumentException(
"timezone must be in the range [-12.0, 12.0] and must me divided by 0.5. Value given is "
+ t);
}
this.timezone = timezone;
}
public List<DataCollectionType> getDataCollectionTypes() {
return dataCollectionTypes;
}
public void setDataCollectionTypes(
List<DataCollectionType> dataCollectionTypes) {
this.dataCollectionTypes = dataCollectionTypes;
}
public PiwikInfo getPiwikInfo() {
return piwikInfo;
}
public void setPiwikInfo(PiwikInfo piwikInfo) {
this.piwikInfo = piwikInfo;
}
@Override
public int hashCode() {
return officialname.hashCode();
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Repository))
return false;
else
return this.equals((Repository) o);
}
public boolean equals(Repository r) {
// TODO: fill with required fields...
if (this.getEnglishname() != null && r.getEnglishname() == null) {
return false;
} else if (this.getEnglishname() == null
&& r.getEnglishname() != null) {
return false;
} else if (this.getEnglishname() != null
&& r.getEnglishname() != null) {
return this.getEnglishname().equals(r.getEnglishname());
}
return true;
}
}

View File

@ -1,57 +0,0 @@
package eu.dnetlib.repo.manager.domain;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
public class RepositoryInterface extends ApiDetails {
private static final long serialVersionUID = 8013272950607614479L;
public void updateApiParam(String param, String value) {
for (ApiParamDetails entry : apiParams) {
if (entry.getParam().equals(param)) {
entry.setValue(value);
return;
}
}
ApiParamDetails newSet = new ApiParamDetails();
newSet.setParam(param);
newSet.setValue(value);
this.apiParams.add(newSet);
}
public void setAccessSet(String accessSet) {
if (accessSet != null) {
updateApiParam("set", accessSet);
}
}
public String getAccessSet() {
Map<String, String> map;
if (apiParams != null) {
map = apiParams.stream()
.filter(Objects::nonNull)
.filter(k -> k.getParam() != null && k.getValue() != null)
.collect(Collectors.toMap(ApiParamDetails::getParam, ApiParamDetails::getValue));
return map.get("set");
}
return null;
}
public void setAccessFormat(String accessFormat) {
updateApiParam("format", accessFormat);
}
public String getAccessFormat() {
Map<String, String> map;
if (apiParams != null) {
map = apiParams.stream()
.filter(Objects::nonNull)
.filter(k -> k.getParam() != null && k.getValue() != null)
.collect(Collectors.toMap(ApiParamDetails::getParam, ApiParamDetails::getValue));
return map.get("format");
}
return null;
}
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.exception; package eu.dnetlib.repo.manager.domain;
/** /**
* Created by nikonas on 7/12/15. * Created by nikonas on 7/12/15.

View File

@ -4,7 +4,6 @@ package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.domain.data.PiwikInfo; import eu.dnetlib.domain.data.PiwikInfo;
import java.util.Date; import java.util.Date;
import java.util.Set;
public class RepositorySnippet { public class RepositorySnippet {
@ -13,18 +12,15 @@ public class RepositorySnippet {
private String officialname; private String officialname;
private String englishname; private String englishname;
private String websiteurl; private String websiteurl;
private String typology;
private String registeredby; private String registeredby;
private Date registrationdate; private Organization[] organizations;
private String eoscDatasourceType; private String registrationdate;
private String logoUrl; private String logoUrl;
private String description; private String description;
private Boolean consentTermsOfUse; private String fullTextDownload;
private String consentTermsOfUse;
private Date consentTermsOfUseDate; private Date consentTermsOfUseDate;
private Date lastConsentTermsOfUseDate;
private Boolean fullTextDownload;
private Set<OrganizationDetails> organizations;
private String typology;
private PiwikInfo piwikInfo; private PiwikInfo piwikInfo;
@ -80,18 +76,19 @@ public class RepositorySnippet {
this.typology = typology; this.typology = typology;
} }
public Set<OrganizationDetails> getOrganizations() { public Organization[] getOrganizations() {
return organizations; return organizations;
} }
public void setOrganizations(Set<OrganizationDetails> organizations) { public void setOrganizations(Organization[] organizations) {
this.organizations = organizations; this.organizations = organizations;
} }
public Date getRegistrationdate() {
public String getRegistrationdate() {
return registrationdate; return registrationdate;
} }
public void setRegistrationdate(Date registrationdate) { public void setRegistrationdate(String registrationdate) {
this.registrationdate = registrationdate; this.registrationdate = registrationdate;
} }
@ -119,19 +116,19 @@ public class RepositorySnippet {
this.description = description; this.description = description;
} }
public Boolean getFullTextDownload() { public String getFullTextDownload() {
return fullTextDownload; return fullTextDownload;
} }
public void setFullTextDownload(Boolean fullTextDownload) { public void setFullTextDownload(String fullTextDownload) {
this.fullTextDownload = fullTextDownload; this.fullTextDownload = fullTextDownload;
} }
public Boolean getConsentTermsOfUse() { public String getConsentTermsOfUse() {
return consentTermsOfUse; return consentTermsOfUse;
} }
public void setConsentTermsOfUse(Boolean consentTermsOfUse) { public void setConsentTermsOfUse(String consentTermsOfUse) {
this.consentTermsOfUse = consentTermsOfUse; this.consentTermsOfUse = consentTermsOfUse;
} }
@ -142,20 +139,4 @@ public class RepositorySnippet {
public void setConsentTermsOfUseDate(Date consentTermsOfUseDate) { public void setConsentTermsOfUseDate(Date consentTermsOfUseDate) {
this.consentTermsOfUseDate = consentTermsOfUseDate; this.consentTermsOfUseDate = consentTermsOfUseDate;
} }
public Date getLastConsentTermsOfUseDate() {
return lastConsentTermsOfUseDate;
}
public void setLastConsentTermsOfUseDate(Date lastConsentTermsOfUseDate) {
this.lastConsentTermsOfUseDate = lastConsentTermsOfUseDate;
}
public String getEoscDatasourceType() {
return eoscDatasourceType;
}
public void setEoscDatasourceType(String eoscDatasourceType) {
this.eoscDatasourceType = eoscDatasourceType;
}
} }

View File

@ -7,7 +7,6 @@ public class RequestFilter{
private String registeredby = null; private String registeredby = null;
private String typology = null; private String typology = null;
private String eoscDatasourceType = null;
private String country = null; private String country = null;
private String id = null; private String id = null;
private String officialname = null; private String officialname = null;
@ -29,14 +28,6 @@ public class RequestFilter{
this.typology = typology; this.typology = typology;
} }
public String getEoscDatasourceType() {
return eoscDatasourceType;
}
public void setEoscDatasourceType(String eoscDatasourceType) {
this.eoscDatasourceType = eoscDatasourceType;
}
public String getRegisteredby() { public String getRegisteredby() {
return registeredby; return registeredby;
} }

View File

@ -1,20 +0,0 @@
package eu.dnetlib.repo.manager.domain;
public class Response {
private Header header;
public Response() {
this.header = new Header();
}
public Header getHeader() {
return header;
}
public Response setHeader(final Header header) {
this.header = header;
return this;
}
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.exception; package eu.dnetlib.repo.manager.domain;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.exception; package eu.dnetlib.repo.manager.domain;
/** /**
* Created by nikonas on 7/12/15. * Created by nikonas on 7/12/15.

View File

@ -0,0 +1,16 @@
package eu.dnetlib.repo.manager.domain;
import eu.dnetlib.domain.functionality.validator.JobForValidation;
/**
* Created by stefania on 2/10/16.
*/
public class ValidationState extends WizardState {
private JobForValidation jobForValidation = new JobForValidation();
public JobForValidation getJobForValidation() {
return jobForValidation;
}
}

View File

@ -0,0 +1,9 @@
package eu.dnetlib.repo.manager.domain;
/**
* Created by stefania on 2/10/16.
*/
public class WizardState {
}

View File

@ -1,47 +0,0 @@
package eu.dnetlib.repo.manager.domain.dto;
import java.util.Date;
public class InterfaceComplianceRequestDTO {
String repositoryId;
String interfaceId;
String desiredCompatibilityLevel;
Date submissionDate;
public InterfaceComplianceRequestDTO() {
// no-arg constructor
}
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getInterfaceId() {
return interfaceId;
}
public void setInterfaceId(String interfaceId) {
this.interfaceId = interfaceId;
}
public String getDesiredCompatibilityLevel() {
return desiredCompatibilityLevel;
}
public void setDesiredCompatibilityLevel(String desiredCompatibilityLevel) {
this.desiredCompatibilityLevel = desiredCompatibilityLevel;
}
public Date getSubmissionDate() {
return submissionDate;
}
public void setSubmissionDate(Date submissionDate) {
this.submissionDate = submissionDate;
}
}

View File

@ -1,64 +0,0 @@
package eu.dnetlib.repo.manager.domain.dto;
import java.util.Date;
public class RepositoryTerms {
private String id;
private String name;
private Boolean consentTermsOfUse;
private Boolean fullTextDownload;
private Date consentTermsOfUseDate;
private Date lastConsentTermsOfUseDate;
public RepositoryTerms() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getConsentTermsOfUse() {
return consentTermsOfUse;
}
public void setConsentTermsOfUse(Boolean consentTermsOfUse) {
this.consentTermsOfUse = consentTermsOfUse;
}
public Boolean getFullTextDownload() {
return fullTextDownload;
}
public void setFullTextDownload(Boolean fullTextDownload) {
this.fullTextDownload = fullTextDownload;
}
public Date getConsentTermsOfUseDate() {
return consentTermsOfUseDate;
}
public void setConsentTermsOfUseDate(Date consentTermsOfUseDate) {
this.consentTermsOfUseDate = consentTermsOfUseDate;
}
public Date getLastConsentTermsOfUseDate() {
return lastConsentTermsOfUseDate;
}
public void setLastConsentTermsOfUseDate(Date lastConsentTermsOfUseDate) {
this.lastConsentTermsOfUseDate = lastConsentTermsOfUseDate;
}
}

View File

@ -1,13 +0,0 @@
package eu.dnetlib.repo.manager.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.CONFLICT)
public class ResourceConflictException extends RuntimeException {
public ResourceConflictException(String message) {
super(message);
}
}

View File

@ -1,15 +0,0 @@
package eu.dnetlib.repo.manager.repository;
import eu.dnetlib.repo.manager.domain.InterfaceComplianceRequest;
import eu.dnetlib.repo.manager.domain.InterfaceComplianceRequestId;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.Set;
@Repository
public interface InterfaceComplianceRequestsRepository extends CrudRepository<InterfaceComplianceRequest, InterfaceComplianceRequestId> {
Set<InterfaceComplianceRequest> findAllBySubmissionDateBefore(Date submittedBefore);
}

View File

@ -1,9 +0,0 @@
package eu.dnetlib.repo.manager.repository;
import eu.dnetlib.repo.manager.domain.PendingUserRole;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PendingUserRoleRepository extends CrudRepository<PendingUserRole, Long> {
}

View File

@ -1,17 +0,0 @@
package eu.dnetlib.repo.manager.service;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo;
import org.json.JSONException;
import java.util.List;
import java.util.Map;
public interface AggregationService {
<T extends AggregationInfo> List<T> getRepositoryAggregations(String id) throws JSONException;
<T extends AggregationInfo> List<T> getRepositoryAggregations(String id, int from, int size) throws JSONException;
<T extends AggregationInfo> Map<String, List<T>> getRepositoryAggregationsByYear(String id) throws JSONException;
}

View File

@ -1,81 +0,0 @@
package eu.dnetlib.repo.manager.service;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationHistoryResponseV2;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static eu.dnetlib.repo.manager.utils.DateUtils.getYear;
@Service("aggregationService")
public class AggregationServiceImpl implements AggregationService {
private static final Logger logger = LoggerFactory.getLogger(AggregationServiceImpl.class);
@Value("${services.provide.clients.dsm}")
private String baseAddress;
private final RestTemplate restTemplate;
public AggregationServiceImpl(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public <T extends AggregationInfo> List<T> getRepositoryAggregations(String id) {
logger.debug("Retrieving aggregations for repository with id : " + id);
UriComponents uriComponents = getAggregationHistory(id);
AggregationHistoryResponseV2 rs = restTemplate.getForObject(uriComponents.toUri(), AggregationHistoryResponseV2.class);
return rs != null ? (List<T>) rs.getAggregationInfo() : null;
}
@Override
public <T extends AggregationInfo> List<T> getRepositoryAggregations(String id, int from, int size) {
List<T> res = getRepositoryAggregations(id);
return res.subList(from, Math.min(from + size, res.size()));
}
@Override
public <T extends AggregationInfo> Map<String, List<T>> getRepositoryAggregationsByYear(String id) {
logger.debug("Retrieving aggregations (by year) for repository with id : " + id);
List<T> aggregationHistory = getRepositoryAggregations(id);
return aggregationHistory.isEmpty() ? new HashMap<>() : createYearMap(aggregationHistory);
}
private <T extends AggregationInfo> Map<String, List<T>> createYearMap(List<T> aggregationHistory) {
return aggregationHistory.stream()
.sorted(Comparator.comparing(AggregationInfo::getDate).reversed())
.collect(Collectors.groupingBy(item -> getYear(item.getDate())));
}
private UriComponents getAggregationHistory(String repoId) {
return UriComponentsBuilder
.fromHttpUrl(baseAddress + "/dsm/2.0/aggregationhistory/")
.path(repoId)
.build().expand(repoId).encode();
}
}

View File

@ -1,8 +1,8 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.repo.manager.domain.BrokerException;
import eu.dnetlib.repo.manager.domain.Term; import eu.dnetlib.repo.manager.domain.Term;
import eu.dnetlib.repo.manager.domain.broker.*; import eu.dnetlib.repo.manager.domain.broker.*;
import eu.dnetlib.repo.manager.exception.BrokerException;
import org.json.JSONException; import org.json.JSONException;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;

View File

@ -2,20 +2,21 @@ package eu.dnetlib.repo.manager.service;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import eu.dnetlib.repo.manager.domain.BrokerException;
import eu.dnetlib.repo.manager.domain.RepositorySnippet; import eu.dnetlib.repo.manager.domain.RepositorySnippet;
import eu.dnetlib.repo.manager.domain.Term; import eu.dnetlib.repo.manager.domain.Term;
import eu.dnetlib.repo.manager.domain.Tuple; import eu.dnetlib.repo.manager.domain.Tuple;
import eu.dnetlib.repo.manager.domain.broker.*; import eu.dnetlib.repo.manager.domain.broker.*;
import eu.dnetlib.repo.manager.exception.BrokerException;
import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.NotImplementedException;
import org.slf4j.Logger; import org.json.JSONException;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*; import org.springframework.http.*;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponents;
@ -24,12 +25,8 @@ import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URI;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("brokerService") @Service("brokerService")
public class BrokerServiceImpl implements BrokerService { public class BrokerServiceImpl implements BrokerService {
@ -43,14 +40,15 @@ public class BrokerServiceImpl implements BrokerService {
@Value("${services.provide.topic_types.url}") @Value("${services.provide.topic_types.url}")
private String topicsURL; private String topicsURL;
private static final Logger logger = LoggerFactory.getLogger(BrokerServiceImpl.class); private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
.getLogger(BrokerServiceImpl.class);
@Autowired @Autowired
RestTemplate restTemplate; RestTemplate restTemplate;
private HttpHeaders httpHeaders; private HttpHeaders httpHeaders;
private final HashMap<String, Term> topics = new HashMap<>(); private HashMap<String, Term> topics = new HashMap<String, Term>();
@PostConstruct @PostConstruct
private void initDnetTopicsMap() { private void initDnetTopicsMap() {
@ -58,14 +56,14 @@ public class BrokerServiceImpl implements BrokerService {
httpHeaders = new HttpHeaders(); httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", "application/json"); httpHeaders.set("Content-Type", "application/json");
logger.debug("Init dnet topics!"); LOGGER.debug("Init dnet topics!");
try (InputStream is = new URL(topicsURL).openStream()) { try (InputStream is = new URL(topicsURL).openStream()) {
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(is); JsonNode root = mapper.readTree(is);
for (JsonNode term : root.path("terms")) for (JsonNode term : root.path("terms"))
topics.put(term.path("code").textValue(), parseTerm(term)); topics.put(term.path("code").textValue(), parseTerm(term));
} catch (IOException e) { } catch (IOException e) {
logger.error("Exception on initDnetTopicsMap", e); LOGGER.error("Exception on initDnetTopicsMap", e);
} }
} }
@ -76,7 +74,7 @@ public class BrokerServiceImpl implements BrokerService {
@Override @Override
public DatasourcesBroker getDatasourcesOfUser(String user, String includeShared, String includeByOthers) { public DatasourcesBroker getDatasourcesOfUser(String user, String includeShared, String includeByOthers) throws JSONException {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
DatasourcesBroker ret = new DatasourcesBroker(); DatasourcesBroker ret = new DatasourcesBroker();
try { try {
@ -91,10 +89,10 @@ public class BrokerServiceImpl implements BrokerService {
// ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(user))); // ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(user)));
// } // }
} catch (Exception e) { } catch (Exception e) {
logger.error("Exception on getDatasourcesOfUser", e); LOGGER.error("Exception on getDatasourcesOfUser", e);
} }
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
logger.debug("Getting datasources of user in " + (end - start) + "ms"); System.out.println("Getting datasources of user in " + (end - start) + "ms");
return ret; return ret;
} }
@ -114,7 +112,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<List<BrowseEntry>>() { new ParameterizedTypeReference<List<BrowseEntry>>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
@ -124,19 +121,18 @@ public class BrokerServiceImpl implements BrokerService {
@Override @Override
public EventsPage advancedShowEvents(String page, public EventsPage advancedShowEvents(String page,
String size, String size,
AdvQueryObject advQueryObject) throws BrokerException { AdvQueryObject advQueryObject) throws BrokerException, JSONException, IOException {
final String service = "/events/{page}/{pageSize}"; final String service = "/events/{page}/{pageSize}";
long pageNum = Long.parseLong(page);
advQueryObject.setPage(pageNum);
Map<String, Long> uriParams = new HashMap<>(); Map<String, Long> uriParams = new HashMap<>();
uriParams.put("page", pageNum); uriParams.put("page", Long.parseLong(page));
uriParams.put("pageSize", Long.parseLong(size)); uriParams.put("pageSize", Long.parseLong(size));
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
advQueryObject.setPage(Long.parseLong(page));
HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, httpHeaders); HttpEntity<AdvQueryObject> entity = new HttpEntity<>(advQueryObject, httpHeaders);
ResponseEntity<EventsPage> resp; ResponseEntity<EventsPage> resp;
try { try {
@ -144,10 +140,10 @@ public class BrokerServiceImpl implements BrokerService {
builder.buildAndExpand(uriParams).encode().toUri(), builder.buildAndExpand(uriParams).encode().toUri(),
HttpMethod.POST, HttpMethod.POST,
entity, entity,
new ParameterizedTypeReference<EventsPage>() {} new ParameterizedTypeReference<EventsPage>() {
}
); );
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return resp.getBody(); return resp.getBody();
@ -160,7 +156,7 @@ public class BrokerServiceImpl implements BrokerService {
for (RepositorySnippet repo : repositories) { for (RepositorySnippet repo : repositories) {
BrowseEntry temp = new BrowseEntry(); BrowseEntry temp = new BrowseEntry();
temp.setValue(repo.getOfficialname()); temp.setValue(repo.getOfficialname());
temp.setSize(0L); temp.setSize(new Long(0));
for (BrowseEntry e : getTopicsForDatasource(repo.getOfficialname())) { for (BrowseEntry e : getTopicsForDatasource(repo.getOfficialname())) {
temp.setSize(temp.getSize() + e.getSize()); temp.setSize(temp.getSize() + e.getSize());
} }
@ -169,9 +165,15 @@ public class BrokerServiceImpl implements BrokerService {
} }
// sort the collection by the second field of the tuple which is size // sort the collection by the second field of the tuple which is size
entries.sort((e1, e2) -> (int) (e2.getFirst().getSize() - e1.getFirst().getSize())); Collections.sort(entries, new Comparator<Tuple<BrowseEntry, String>>() {
@Override
public int compare(Tuple<BrowseEntry, String> e1, Tuple<BrowseEntry, String> e2) {
return (int) (e2.getFirst().getSize().longValue() - e1.getFirst().getSize().longValue());
}
});
long stop = System.currentTimeMillis(); long stop = System.currentTimeMillis();
logger.debug("getDatasourcesOfUserType returned in " + (stop - start) + "ms "); System.out.println("getDatasourcesOfUserType returned in " + (stop - start) + "ms ");
return entries; return entries;
} }
@ -179,7 +181,7 @@ public class BrokerServiceImpl implements BrokerService {
public EventsPage showEvents(String datasourceName, public EventsPage showEvents(String datasourceName,
String topic, String topic,
String page, String page,
String size) throws BrokerException { String size) throws BrokerException, JSONException {
final String service = "/events"; final String service = "/events";
@ -197,7 +199,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<EventsPage>() { new ParameterizedTypeReference<EventsPage>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return resp.getBody(); return resp.getBody();
@ -209,29 +210,29 @@ public class BrokerServiceImpl implements BrokerService {
final String service = "/subscriptions"; final String service = "/subscriptions";
URI uri = UriComponentsBuilder.fromHttpUrl(openairePath + service) UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(openairePath + service)
.queryParam("email", userEmail).build().encode().toUri(); .queryParam("email", userEmail);
logger.debug("{}", uri); LOGGER.debug(builder.build().encode().toUri());
ResponseEntity<Map<String, List<SimpleSubscriptionDesc>>> resp; ResponseEntity<Map<String, List<SimpleSubscriptionDesc>>> resp;
try { try {
resp = restTemplate.exchange( resp = restTemplate.exchange(
uri, builder.build().encode().toUri(),
HttpMethod.GET, HttpMethod.GET,
null, null,
new ParameterizedTypeReference<Map<String, List<SimpleSubscriptionDesc>>>() { new ParameterizedTypeReference<Map<String, List<SimpleSubscriptionDesc>>>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return resp.getBody(); return resp.getBody();
} }
@Override @Override
public Map<String, List<SimpleSubscriptionDesc>> getSimpleSubscriptionsOfUserByRepoId(String userEmail, String repoId) { //throws BrokerException { public Map<String, List<SimpleSubscriptionDesc>> getSimpleSubscriptionsOfUserByRepoId(String userEmail, String repoId) throws BrokerException {
Map<String, List<SimpleSubscriptionDesc>> subscriptionsOfUser = getSimpleSubscriptionsOfUser(userEmail);
throw new NotImplementedException(); throw new NotImplementedException();
//Map<String, List<SimpleSubscriptionDesc>> subscriptionsOfUser = getSimpleSubscriptionsOfUser(userEmail); // return null;
} }
@Override @Override
@ -256,7 +257,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<Subscription>() { new ParameterizedTypeReference<Subscription>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
@ -279,7 +279,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<Void>() { new ParameterizedTypeReference<Void>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return new ResponseEntity<>("OK", HttpStatus.OK); return new ResponseEntity<>("OK", HttpStatus.OK);
@ -302,7 +301,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<Subscription>() { new ParameterizedTypeReference<Subscription>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return resp.getBody(); return resp.getBody();
@ -332,7 +330,6 @@ public class BrokerServiceImpl implements BrokerService {
new ParameterizedTypeReference<EventsPage>() { new ParameterizedTypeReference<EventsPage>() {
}); });
} catch (RestClientException e) { } catch (RestClientException e) {
logger.error(e.getMessage());
throw new BrokerException(e); throw new BrokerException(e);
} }
return resp.getBody(); return resp.getBody();

View File

@ -1,15 +1,8 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.openaire.exporter.model.dsm.AggregationInfo; import eu.dnetlib.repo.manager.domain.*;
import eu.dnetlib.repo.manager.domain.MetricsNumbers;
import eu.dnetlib.repo.manager.domain.RepositorySnippet;
import eu.dnetlib.repo.manager.domain.RepositorySummaryInfo;
import eu.dnetlib.repo.manager.domain.broker.BrowseEntry; import eu.dnetlib.repo.manager.domain.broker.BrowseEntry;
import eu.dnetlib.repo.manager.exception.BrokerException; import org.apache.log4j.Logger;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException;
import eu.dnetlib.repo.manager.utils.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -19,14 +12,11 @@ import java.util.List;
@Service("dashboardService") @Service("dashboardService")
public class DashboardServiceImpl implements DashboardService { public class DashboardServiceImpl implements DashboardService {
private static final Logger logger = LoggerFactory.getLogger(DashboardServiceImpl.class); private static final Logger logger = Logger.getLogger(DashboardServiceImpl.class);
@Autowired @Autowired
private RepositoryService repositoryService; private RepositoryService repositoryService;
@Autowired
private AggregationService aggregationService;
@Autowired @Autowired
private BrokerService brokerService; private BrokerService brokerService;
@ -38,55 +28,54 @@ public class DashboardServiceImpl implements DashboardService {
List<RepositorySummaryInfo> repositorySummaryInfoList = new ArrayList<>(); List<RepositorySummaryInfo> repositorySummaryInfoList = new ArrayList<>();
try { try {
List<RepositorySnippet> repositoriesOfUser = repositoryService.getRepositoriesSnippetsOfUser(userEmail, page, size);
for (RepositorySnippet repository : repositoriesOfUser)
{
String repoId = repository.getId();
String repoOfficialName = repository.getOfficialname();
List<RepositorySnippet> repositoriesOfUser = repositoryService.getRepositoriesSnippetsOfUser(userEmail, page, size);
for (RepositorySnippet repository : repositoriesOfUser) {
RepositorySummaryInfo repositorySummaryInfo = new RepositorySummaryInfo(); RepositorySummaryInfo repositorySummaryInfo = new RepositorySummaryInfo();
repositorySummaryInfo.setId(repoId); repositorySummaryInfo.setId(repository.getId());
repositorySummaryInfo.setRepositoryName(repoOfficialName); repositorySummaryInfo.setRepositoryName(repository.getOfficialname());
repositorySummaryInfo.setLogoURL(repository.getLogoUrl()); repositorySummaryInfo.setLogoURL(repository.getLogoUrl());
//TODO getRepositoryAggregations returns only the 20 more recent items. Is it possible that we will find an indexed version there? //TODO getRepositoryAggregations returns only the 20 more recent items. Is it positive that we will find an indexed version there?
boolean isIndexedVersionFound = false;
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
List<AggregationInfo> aggregationInfoList = aggregationService.getRepositoryAggregations(repoId, 0, 20); List<AggregationDetails> aggregationDetailsList = repositoryService.getRepositoryAggregations(repository.getId(), 0, 20);
for (AggregationInfo aggregationInfo : aggregationInfoList) { for (AggregationDetails aggregationDetails : aggregationDetailsList) {
if (aggregationInfo.isIndexedVersion()) { if (aggregationDetails.getIndexedVersion()) {
repositorySummaryInfo.setRecordsCollected(aggregationInfo.getNumberOfRecords()); repositorySummaryInfo.setRecordsCollected(aggregationDetails.getNumberOfRecords());
repositorySummaryInfo.setLastIndexedVersion(DateUtils.toDate(aggregationInfo.getDate())); repositorySummaryInfo.setLastIndexedVersion(aggregationDetails.getDate());
isIndexedVersionFound = true;
break; break;
} }
} }
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
if ( isIndexedVersionFound )
logger.debug("Got repo aggregations in " + (end - start) + "ms"); System.out.println("Got repo aggregations in " + (end - start) + "ms");
else
logger.warn("Could not find repo aggregations, after " + (end - start) + "ms!");
try { try {
MetricsNumbers metricsNumbers = repositoryService.getMetricsInfoForRepository(repoId).getMetricsNumbers();
repositorySummaryInfo.setTotalDownloads(metricsNumbers.getTotalDownloads()); MetricsInfo metricsInfo = repositoryService.getMetricsInfoForRepository(repository.getId());
repositorySummaryInfo.setTotalViews(metricsNumbers.getTotalViews()); repositorySummaryInfo.setTotalDownloads(metricsInfo.getMetricsNumbers().getTotalDownloads());
repositorySummaryInfo.setTotalViews(metricsInfo.getMetricsNumbers().getTotalViews());
} catch (RepositoryServiceException e) { } catch (RepositoryServiceException e) {
logger.error("Exception getting metrics info for repository: {}, {} ", repoId, repoOfficialName, e); logger.error("Exception getting metrics info for repository: " + repository.getId(), e);
} }
try { try {
List<BrowseEntry> events = brokerService.getTopicsForDatasource(repoOfficialName);
List<BrowseEntry> events = brokerService.getTopicsForDatasource(repository.getOfficialname());
Long totalEvents = 0L; Long totalEvents = 0L;
for (BrowseEntry browseEntry : events) for (BrowseEntry browseEntry : events)
totalEvents += browseEntry.getSize(); totalEvents += browseEntry.getSize();
repositorySummaryInfo.setEnrichmentEvents(totalEvents); repositorySummaryInfo.setEnrichmentEvents(totalEvents);
} catch (BrokerException e) { } catch (BrokerException e) {
logger.error("Exception getting broker events for repository: {}, {} ", repoId, repoOfficialName, e); logger.error("Exception getting broker events for repository: " + repository.getId(), e);
} }
repositorySummaryInfoList.add(repositorySummaryInfo); repositorySummaryInfoList.add(repositorySummaryInfo);
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("Something baad happened!", e); logger.error("Something baad happened!", e);
} }

View File

@ -1,108 +1,97 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.domain.data.PiwikInfo; import eu.dnetlib.domain.data.PiwikInfo;
import eu.dnetlib.domain.data.Repository;
import eu.dnetlib.domain.data.RepositoryInterface;
import eu.dnetlib.domain.functionality.validator.JobForValidation; import eu.dnetlib.domain.functionality.validator.JobForValidation;
import eu.dnetlib.repo.manager.domain.InterfaceComplianceRequest;
import eu.dnetlib.repo.manager.domain.Repository;
import eu.dnetlib.repo.manager.domain.RepositoryInterface;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import java.util.List;
public interface EmailUtils { public interface EmailUtils {
@Async @Async
void sendAdministratorRequestToEnableMetrics(PiwikInfo piwikInfo); void sendAdministratorRequestToEnableMetrics(PiwikInfo piwikInfo) throws Exception;
@Async @Async
void sendUserRequestToEnableMetrics(PiwikInfo piwikInfo); void sendUserRequestToEnableMetrics(PiwikInfo piwikInfo) throws Exception;
@Async @Async
void sendAdministratorMetricsEnabled(PiwikInfo piwikInfo); void sendAdministratorMetricsEnabled(PiwikInfo piwikInfo) throws Exception;
@Async @Async
void sendUserMetricsEnabled(PiwikInfo piwikInfo); void sendUserMetricsEnabled(PiwikInfo piwikInfo) throws Exception;
/****USER REGISTRATION REQUEST EMAILS****/ /****USER REGISTRATION REQUEST EMAILS****/
@Async @Async
void sendAdminRegistrationEmail(Repository repository, Authentication authentication); void sendAdminRegistrationEmail(Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendUserRegistrationEmail(Repository repository, Authentication authentication); void sendUserRegistrationEmail(Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminRegisterInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, String desiredCompatibility, Authentication authentication); void sendAdminRegisterInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, Authentication authentication) throws Exception;
@Async @Async
void sendUserRegisterInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, String desiredCompatibility, Authentication authentication); void sendUserRegisterInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, Authentication authentication) throws Exception;
/****SUCCESSFUL REGISTRATION RESULTS EMAILS****/ /****SUCCESSFUL REGISTRATION RESULTS EMAILS****/
@Async @Async
void sendUserRegistrationResultsSuccessEmail(String issuerEmail, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendUserRegistrationResultsSuccessEmail(String issuerEmail, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminRegistrationResultsSuccessEmail(String issuerEmail, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendAdminRegistrationResultsSuccessEmail(String issuerEmail, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
/****FAILURE REGISTRATION RESULTS EMAILS****/ /****FAILURE REGISTRATION RESULTS EMAILS****/
@Async @Async
void sendUserRegistrationResultsFailureEmail(String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendUserRegistrationResultsFailureEmail(String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminRegistrationResultsFailureEmail(String issuerEmail, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendAdminRegistrationResultsFailureEmail(String issuerEmail, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
/****SUCCESSFUL UPDATE RESULTS EMAILS****/ /****SUCCESSFUL UPDATE RESULTS EMAILS****/
@Async @Async
void sendUserUpdateResultsSuccessEmail(String issuer, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendUserUpdateResultsSuccessEmail(String issuer, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminUpdateResultsSuccessEmail(String issuerEmail, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendAdminUpdateResultsSuccessEmail(String issuerEmail, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
/****FAILURE UPDATE RESULTS EMAILS****/ /****FAILURE UPDATE RESULTS EMAILS****/
@Async @Async
void sendUserUpdateResultsFailureEmail(String issuer, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendUserUpdateResultsFailureEmail(String issuer, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminUpdateResultsFailureEmail(String issuerEmail, String jobId, RepositoryInterface repositoryInterface, String desiredCompatibility, Repository repository, Authentication authentication); void sendAdminUpdateResultsFailureEmail(String issuerEmail, String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
/****FAILURE UPDATE INTERFACE COMPLIANCE****/
@Async
void sendUserUpdateInterfaceComplianceFailure(List<String> emails, Repository repository, RepositoryInterface repositoryInterface, InterfaceComplianceRequest request);
@Async
void sendAdminUpdateInterfaceComplianceFailure(Repository repository, RepositoryInterface repositoryInterface, InterfaceComplianceRequest request);
/****VALIDATION OF CONTENT PROVIDER EMAILS****/ /****VALIDATION OF CONTENT PROVIDER EMAILS****/
@Async @Async
void sendUserValidationResults(String issuer, String jobId, RepositoryInterface repositoryInterface, Repository repository, Authentication authentication); void sendUserValidationResults(String issuer,String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminValidationResults(String issuer, String jobId, RepositoryInterface repositoryInterface, Repository repository, Authentication authentication); void sendAdminValidationResults(String issuer,String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
/****GENERAL FAILURE OF VALIDATOR****/ /****GENERAL FAILURE OF VALIDATOR****/
@Async @Async
void sendAdminGeneralFailure(String issuer, String jobId, RepositoryInterface repositoryInterface, Repository repository, Authentication authentication); void sendAdminGeneralFailure(String issuer,String jobId,RepositoryInterface repositoryInterface, Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminUpdateRepositoryInfoEmail(Repository repository, Authentication authentication); void sendAdminUpdateRepositoryInfoEmail(Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendUserUpdateRepositoryInfoEmail(Repository repository, Authentication authentication); void sendUserUpdateRepositoryInfoEmail(Repository repository, Authentication authentication) throws Exception;
@Async @Async
void sendAdminUpdateInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, String desiredCompatibility, Authentication authentication); void sendAdminUpdateInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, Authentication authentication) throws Exception;
@Async @Async
void sendUserUpdateInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, String desiredCompatibility, Authentication authentication); void sendUserUpdateInterfaceEmail(Repository repository, String comment, RepositoryInterface repositoryInterface, Authentication authentication) throws Exception;
@Async @Async
void sendSubmitJobForValidationEmail(Authentication authentication, JobForValidation jobForValidation); void sendSubmitJobForValidationEmail(Authentication authentication, JobForValidation jobForValidation) throws Exception;
@Async @Async
void sendUponJobCompletion(String repoId, void sendUponJobCompletion(String repoId,
String repoInterfaceId, String repoInterfaceId,
String compatibility,
int scoreUsage, int scoreUsage,
int scoreContent, int scoreContent,
boolean isSuccess, boolean isSuccess,

View File

@ -1,96 +0,0 @@
package eu.dnetlib.repo.manager.service;
import eu.dnetlib.repo.manager.domain.*;
import eu.dnetlib.repo.manager.domain.dto.User;
import eu.dnetlib.repo.manager.exception.ResourceConflictException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import eu.dnetlib.repo.manager.repository.InterfaceComplianceRequestsRepository;
import eu.dnetlib.repo.manager.service.security.AuthorizationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class InterfaceComplianceService {
private static final Logger logger = LoggerFactory.getLogger(InterfaceComplianceService.class);
private final InterfaceComplianceRequestsRepository repository;
private final EmailUtils emailUtils;
private final AuthorizationService authorizationService;
private final RepositoryService repositoryService;
public InterfaceComplianceService(InterfaceComplianceRequestsRepository repository,
EmailUtils emailUtils,
AuthorizationService authorizationService,
RepositoryService repositoryService) {
this.repository = repository;
this.emailUtils = emailUtils;
this.authorizationService = authorizationService;
this.repositoryService = repositoryService;
}
@Scheduled(cron = "0 0 0 * * *") // every day at 00:00
public void cleanUp() {
Set<InterfaceComplianceRequest> requests = getOutdated();
// TODO - In case we want to send the emails, uncomment the following code.
/*for ( InterfaceComplianceRequest request : requests )
{
String repoId = request.getRepositoryId();
String interfaceId = request.getInterfaceId();
try {
Map<String, RepositoryInterface> repositoryInterfaceMap = repositoryService.getRepositoryInterface(repoId)
.stream()
.collect(Collectors.toMap(ApiDetails::getId, i -> i));
RepositoryInterface iFace = repositoryInterfaceMap.get(interfaceId);
if ( iFace == null ) {
logger.error("The repository-interface \"" + interfaceId + "\" does not exist! | the request had the \"repoId\": \"" + repoId + "\"");
continue;
}
Repository repo = repositoryService.getRepositoryById(repoId);
List<User> repositoryAdmins = authorizationService.getAdminsOfRepo(repoId);
emailUtils.sendUserUpdateInterfaceComplianceFailure(repositoryAdmins.stream().map(User::getEmail).collect(Collectors.toList()), repo, iFace, request);
emailUtils.sendAdminUpdateInterfaceComplianceFailure(repo, iFace, request);
} catch (ResourceNotFoundException e) {
logger.error("Error for request with \"repoId\": \"" + repoId + "\" and \"interfaceId\": \"" + interfaceId + "\"", e);
} // Continue to the next request.
}*/
repository.deleteAll(requests);
}
private Set<InterfaceComplianceRequest> getOutdated() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -7); // 7-days-old
return this.repository.findAllBySubmissionDateBefore(calendar.getTime());
}
public Optional<InterfaceComplianceRequest> getById(InterfaceComplianceRequestId id) {
return this.repository.findById(id);
}
public Iterable<InterfaceComplianceRequest> get() {
return this.repository.findAll();
}
public InterfaceComplianceRequest create(InterfaceComplianceRequest request) {
Optional<InterfaceComplianceRequest> existing = getById(request.getId());
if (existing.isPresent()) {
logger.warn("New Request: {}\nExisting request: {}", request, existing.get());
throw new ResourceConflictException("A request for altering compliance already exists. Desired Compatibility value: " + existing.get().getDesiredCompatibilityLevel());
}
return this.repository.save(request);
}
public void delete(InterfaceComplianceRequestId id) {
this.repository.deleteById(id);
}
}

View File

@ -7,11 +7,10 @@ import eu.dnetlib.repo.manager.domain.Constants;
import eu.dnetlib.repo.manager.domain.JobsOfUser; import eu.dnetlib.repo.manager.domain.JobsOfUser;
import eu.dnetlib.repo.manager.utils.CrisValidatorUtils; import eu.dnetlib.repo.manager.utils.CrisValidatorUtils;
import gr.uoa.di.driver.util.ServiceLocator; import gr.uoa.di.driver.util.ServiceLocator;
import org.apache.log4j.Logger;
import org.eurocris.openaire.cris.validator.model.Job; import org.eurocris.openaire.cris.validator.model.Job;
import org.eurocris.openaire.cris.validator.service.MapJobDao; import org.eurocris.openaire.cris.validator.service.MapJobDao;
import org.json.JSONException; import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -23,8 +22,6 @@ import java.util.stream.Collectors;
@Service("monitorService") @Service("monitorService")
public class MonitorServiceImpl implements MonitorService { public class MonitorServiceImpl implements MonitorService {
private static final Logger logger = LoggerFactory.getLogger(MonitorServiceImpl.class);
@Autowired @Autowired
private MapJobDao crisJobs; private MapJobDao crisJobs;
@ -44,6 +41,9 @@ public class MonitorServiceImpl implements MonitorService {
} }
private static final Logger LOGGER = Logger
.getLogger(MonitorServiceImpl.class);
@Override @Override
public JobsOfUser getJobsOfUser(String user, public JobsOfUser getJobsOfUser(String user,
String jobType, String jobType,
@ -52,7 +52,10 @@ public class MonitorServiceImpl implements MonitorService {
String dateFrom, String dateFrom,
String dateTo, String dateTo,
String validationStatus, String validationStatus,
String includeJobsTotal) throws ValidatorServiceException, NumberFormatException { String includeJobsTotal) throws JSONException, ValidatorServiceException {
LOGGER.debug("Getting jobs of user : " + user);
LOGGER.debug(user + "/" + jobType + "/" + offset + "/" + dateFrom + "/" + dateTo + "/" + validationStatus + "/" + includeJobsTotal);
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
// FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly // // FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly //
@ -95,6 +98,7 @@ public class MonitorServiceImpl implements MonitorService {
|| (job.getValidationType().equals("U") && job.getContentJobStatus().equals("none") && job.getUsageJobStatus().equals("finished") && job.getUsageJobScore() <= 50)) { || (job.getValidationType().equals("U") && job.getContentJobStatus().equals("none") && job.getUsageJobStatus().equals("finished") && job.getUsageJobScore() <= 50)) {
job.setValidationStatus("failed"); job.setValidationStatus("failed");
} }
} }
} }
@ -139,6 +143,7 @@ public class MonitorServiceImpl implements MonitorService {
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
return retJobs; return retJobs;
} }
private int getJobsTotalNumberOfUser(String user, String jobType, String validationStatus) throws ValidatorServiceException { private int getJobsTotalNumberOfUser(String user, String jobType, String validationStatus) throws ValidatorServiceException {
@ -149,7 +154,7 @@ public class MonitorServiceImpl implements MonitorService {
public int getJobsOfUserPerValidationStatus(String user, public int getJobsOfUserPerValidationStatus(String user,
String jobType, String jobType,
String validationStatus) throws JSONException { String validationStatus) throws JSONException {
logger.debug("Getting job with validation status : " + validationStatus); LOGGER.debug("Getting job with validation status : " + validationStatus);
if (jobType.equalsIgnoreCase("cris")) { if (jobType.equalsIgnoreCase("cris")) {
return crisJobs.getJobs(user, validationStatus).size(); return crisJobs.getJobs(user, validationStatus).size();
@ -158,19 +163,20 @@ public class MonitorServiceImpl implements MonitorService {
try { try {
return getValidationService().getStoredJobsTotalNumberNew(user, jobType, validationStatus); return getValidationService().getStoredJobsTotalNumberNew(user, jobType, validationStatus);
} catch (ValidatorServiceException e) { } catch (ValidatorServiceException e) {
logger.error(e.getMessage(), e); LOGGER.error(e);
} }
return 0; return 0;
} }
@Override @Override
public StoredJob getJobSummary(String jobId, String groupBy) { public StoredJob getJobSummary(String jobId,
logger.debug("Getting job summary with id : " + jobId); String groupBy) throws JSONException {
LOGGER.debug("Getting job summary with id : " + jobId);
StoredJob job = null; StoredJob job = null;
try { try {
job = getValidationService().getStoredJob(Integer.parseInt(jobId), groupBy); job = getValidationService().getStoredJob(Integer.parseInt(jobId), groupBy);
} catch (Exception e) { } catch (ValidatorServiceException e) {
logger.error(e.getMessage(), e); LOGGER.error(e);
} }
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
// FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly // // FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly //
@ -186,5 +192,4 @@ public class MonitorServiceImpl implements MonitorService {
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
return job; return job;
} }
} }

View File

@ -1,36 +0,0 @@
package eu.dnetlib.repo.manager.service;
import eu.dnetlib.repo.manager.domain.PendingUserRole;
import eu.dnetlib.repo.manager.repository.PendingUserRoleRepository;
import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class PendingUserRoleService {
private static final Logger logger = LoggerFactory.getLogger(PendingUserRoleService.class);
private final PendingUserRoleRepository pendingUserRoleRepository;
private final AaiRegistryService aaiRegistryService;
public PendingUserRoleService(PendingUserRoleRepository pendingUserRoleRepository,
AaiRegistryService aaiRegistryService) {
this.pendingUserRoleRepository = pendingUserRoleRepository;
this.aaiRegistryService = aaiRegistryService;
}
public void assignRoles() {
Iterable<PendingUserRole> roles = pendingUserRoleRepository.findAll();
for (PendingUserRole role : roles) {
logger.debug("Attempt to assign role: {}", role);
try {
aaiRegistryService.assignMemberRole(role.getCoPersonId(), role.getCouId());
pendingUserRoleRepository.deleteById(role.getId());
} catch (Exception e) {
logger.warn("Could not assign role to user. Pending Role: {}\n", role, e);
}
}
}
}

View File

@ -4,7 +4,7 @@ package eu.dnetlib.repo.manager.service;
import eu.dnetlib.domain.data.PiwikInfo; import eu.dnetlib.domain.data.PiwikInfo;
import eu.dnetlib.repo.manager.domain.OrderByField; import eu.dnetlib.repo.manager.domain.OrderByField;
import eu.dnetlib.repo.manager.domain.OrderByType; import eu.dnetlib.repo.manager.domain.OrderByType;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.domain.RepositoryServiceException;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import java.util.List; import java.util.List;

View File

@ -2,13 +2,12 @@ package eu.dnetlib.repo.manager.service;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import eu.dnetlib.domain.data.PiwikInfo; import eu.dnetlib.domain.data.PiwikInfo;
import eu.dnetlib.domain.data.Repository;
import eu.dnetlib.repo.manager.domain.OrderByField; import eu.dnetlib.repo.manager.domain.OrderByField;
import eu.dnetlib.repo.manager.domain.OrderByType; import eu.dnetlib.repo.manager.domain.OrderByType;
import eu.dnetlib.repo.manager.domain.Repository; import eu.dnetlib.repo.manager.domain.RepositoryServiceException;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger; import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -33,9 +32,6 @@ import java.util.Map;
@Service("piwikService") @Service("piwikService")
public class PiWikServiceImpl implements PiWikService { public class PiWikServiceImpl implements PiWikService {
private static final Logger logger = LoggerFactory.getLogger(PiWikServiceImpl.class);
@Autowired @Autowired
private DataSource dataSource; private DataSource dataSource;
@ -51,20 +47,20 @@ public class PiWikServiceImpl implements PiWikService {
@Qualifier("emailUtils") @Qualifier("emailUtils")
private EmailUtils emailUtils; private EmailUtils emailUtils;
private static final Logger LOGGER = Logger
.getLogger(PiWikServiceImpl.class);
private static final String GET_PIWIK_SITE = "select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site where repositoryid = ? LIMIT 1;"; private final static String GET_PIWIK_SITE = "select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site where repositoryid = ?;";
private static final String INSERT_PIWIK_INFO = "insert into piwik_site (repositoryid, siteid, creationdate, requestorname, requestoremail, validated, repositoryname, country, authenticationtoken) values (?, ?, now(), ?, ?, ?, ?, ?, ?)"; private final static String INSERT_PIWIK_INFO = "insert into piwik_site (repositoryid, siteid, creationdate, requestorname, requestoremail, validated, repositoryname, country, authenticationtoken) values (?, ?, now(), ?, ?, ?, ?, ?, ?)";
private static final String UPDATE_PIWIK_INFO = "update piwik_site set siteid = ?, creationdate = now(), requestorname = ?, requestoremail = ?, validated = ?, repositoryname = ?, country = ?, authenticationtoken = ? where repositoryid = ?"; private final static String GET_PIWIK_SITES = "select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site ";
private static final String GET_PIWIK_SITES = "select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site "; private final static String GET_PIWIK_SITES_TOTAL = "select count(*) as totals from piwik_site ";
private static final String GET_PIWIK_SITES_TOTAL = "select count(*) as totals from piwik_site "; private final static String APPROVE_PIWIK_SITE = "update piwik_site set validated=true, validationdate=now() where repositoryid = ?;";
private static final String APPROVE_PIWIK_SITE = "update piwik_site set validated=true, validationdate=now() where repositoryid = ?;"; private RowMapper<PiwikInfo> piwikRowMapper = (rs, i) -> new PiwikInfo(rs.getString("repositoryid"), getOpenaireId(rs.getString("repositoryid")), rs.getString("repositoryname"), rs.getString("country"),
private final RowMapper<PiwikInfo> piwikRowMapper = (rs, i) -> new PiwikInfo(rs.getString("repositoryid"), getOpenaireId(rs.getString("repositoryid")), rs.getString("repositoryname"), rs.getString("country"),
rs.getString("siteid"), rs.getString("authenticationtoken"), rs.getTimestamp("creationdate"), rs.getString("requestorname"), rs.getString("requestoremail"), rs.getString("siteid"), rs.getString("authenticationtoken"), rs.getTimestamp("creationdate"), rs.getString("requestorname"), rs.getString("requestoremail"),
rs.getBoolean("validated"), rs.getTimestamp("validationdate"), rs.getString("comment")); rs.getBoolean("validated"), rs.getTimestamp("validationdate"), rs.getString("comment"));
@ -82,15 +78,9 @@ public class PiWikServiceImpl implements PiWikService {
@PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or (hasAuthority('REGISTERED_USER') and #piwikInfo.requestorEmail == authentication.userInfo.email)") @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or (hasAuthority('REGISTERED_USER') and #piwikInfo.requestorEmail == authentication.userInfo.email)")
public PiwikInfo savePiwikInfo(PiwikInfo piwikInfo) { public PiwikInfo savePiwikInfo(PiwikInfo piwikInfo) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
if (getPiwikSiteForRepo(piwikInfo.getRepositoryId()) == null) {
jdbcTemplate.update(INSERT_PIWIK_INFO, new Object[]{piwikInfo.getRepositoryId(), piwikInfo.getSiteId(), piwikInfo.getRequestorName(), jdbcTemplate.update(INSERT_PIWIK_INFO, new Object[]{piwikInfo.getRepositoryId(), piwikInfo.getSiteId(), piwikInfo.getRequestorName(),
piwikInfo.getRequestorEmail(), piwikInfo.isValidated(), piwikInfo.getRepositoryName(), piwikInfo.getCountry(), piwikInfo.getAuthenticationToken()}, piwikInfo.getRequestorEmail(), piwikInfo.isValidated(), piwikInfo.getRepositoryName(), piwikInfo.getCountry(), piwikInfo.getAuthenticationToken()},
new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.BOOLEAN, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR}); new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.BOOLEAN, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
} else {
jdbcTemplate.update(UPDATE_PIWIK_INFO, new Object[]{piwikInfo.getSiteId(), piwikInfo.getRequestorName(), piwikInfo.getRequestorEmail(),
piwikInfo.isValidated(), piwikInfo.getRepositoryName(), piwikInfo.getCountry(), piwikInfo.getAuthenticationToken(), piwikInfo.getRepositoryId()},
new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.BOOLEAN, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR});
}
return piwikInfo; return piwikInfo;
} }
@ -178,10 +168,10 @@ public class PiWikServiceImpl implements PiWikService {
emailUtils.sendUserMetricsEnabled(piwikInfo); emailUtils.sendUserMetricsEnabled(piwikInfo);
} catch (EmptyResultDataAccessException e) { } catch (EmptyResultDataAccessException e) {
logger.error("Error while approving piwik site: ", e); LOGGER.error("Error while approving piwik site: ", e);
throw new RepositoryServiceException("General error", RepositoryServiceException.ErrorCode.GENERAL_ERROR); throw new RepositoryServiceException("General error", RepositoryServiceException.ErrorCode.GENERAL_ERROR);
} catch (Exception e) { } catch (Exception e) {
logger.error("Error while sending email to administrator or user about the enabling of metrics", e); LOGGER.error("Error while sending email to administrator or user about the enabling of metrics", e);
throw new RepositoryServiceException(e, RepositoryServiceException.ErrorCode.GENERAL_ERROR); throw new RepositoryServiceException(e, RepositoryServiceException.ErrorCode.GENERAL_ERROR);
} }
return new ResponseEntity<>("OK", HttpStatus.OK); return new ResponseEntity<>("OK", HttpStatus.OK);
@ -193,9 +183,9 @@ public class PiWikServiceImpl implements PiWikService {
String repoWebsite, String repoWebsite,
PiwikInfo piwikInfo) throws RepositoryServiceException { PiwikInfo piwikInfo) throws RepositoryServiceException {
try { try {
String url = analyticsURL + "siteName=" + URLEncoder.encode(officialName, "UTF-8") + "&url=" String URL = analyticsURL + "siteName=" + URLEncoder.encode(officialName, "UTF-8") + "&url="
+ URLEncoder.encode(repoWebsite, "UTF-8"); + URLEncoder.encode(repoWebsite, "UTF-8");
Map map = new ObjectMapper().readValue(new URL(url), Map.class); Map map = new ObjectMapper().readValue(new URL(URL), Map.class);
String siteId = null; String siteId = null;
if (map.get("value") != null) { if (map.get("value") != null) {
siteId = map.get("value").toString(); siteId = map.get("value").toString();
@ -212,13 +202,13 @@ public class PiWikServiceImpl implements PiWikService {
emailUtils.sendAdministratorRequestToEnableMetrics(piwikInfo); emailUtils.sendAdministratorRequestToEnableMetrics(piwikInfo);
emailUtils.sendUserRequestToEnableMetrics(piwikInfo); emailUtils.sendUserRequestToEnableMetrics(piwikInfo);
} catch (UnsupportedEncodingException uee) { } catch (UnsupportedEncodingException uee) {
logger.error("Error while creating piwikScript URL", uee); LOGGER.error("Error while creating piwikScript URL", uee);
throw new RepositoryServiceException("login.generalError", RepositoryServiceException.ErrorCode.GENERAL_ERROR); throw new RepositoryServiceException("login.generalError", RepositoryServiceException.ErrorCode.GENERAL_ERROR);
} catch (IOException ioe) { } catch (IOException ioe) {
logger.error("Error while creating piwik site", ioe); LOGGER.error("Error while creating piwik site", ioe);
throw new RepositoryServiceException("login.generalError", RepositoryServiceException.ErrorCode.GENERAL_ERROR); throw new RepositoryServiceException("login.generalError", RepositoryServiceException.ErrorCode.GENERAL_ERROR);
} catch (Exception e) { } catch (Exception e) {
logger.error("Error while sending email to administrator or user about the request to enable metrics", e); LOGGER.error("Error while sending email to administrator or user about the request to enable metrics", e);
throw new RepositoryServiceException(e, RepositoryServiceException.ErrorCode.GENERAL_ERROR); throw new RepositoryServiceException(e, RepositoryServiceException.ErrorCode.GENERAL_ERROR);
} }
return piwikInfo; return piwikInfo;
@ -226,12 +216,12 @@ public class PiWikServiceImpl implements PiWikService {
@Override @Override
public Integer getTotal() { public Integer getTotal() {
return new JdbcTemplate(dataSource).queryForObject(GET_PIWIK_SITES_TOTAL, Integer.class, new Object[]{}); return new JdbcTemplate(dataSource).queryForObject(GET_PIWIK_SITES_TOTAL, new Object[]{}, Integer.class);
} }
@Override @Override
public Integer getValidated(boolean validated) { public Integer getValidated(boolean validated) {
String finalizedQuery = GET_PIWIK_SITES_TOTAL + " where validated = ?"; String finalizedQuery = GET_PIWIK_SITES_TOTAL + " where validated = ?";
return new JdbcTemplate(dataSource).queryForObject(finalizedQuery, Integer.class, validated); return new JdbcTemplate(dataSource).queryForObject(finalizedQuery, new Object[]{validated}, Integer.class);
} }
} }

View File

@ -1,11 +1,13 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.api.functionality.ValidatorServiceException; import eu.dnetlib.domain.data.Repository;
import eu.dnetlib.domain.data.RepositoryInterface;
import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.*;
import eu.dnetlib.repo.manager.exception.RepositoryServiceException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import org.json.JSONException;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -15,51 +17,56 @@ public interface RepositoryService {
// TODO: move this elsewhere // TODO: move this elsewhere
Country[] getCountries(); Country[] getCountries();
List<Repository> getRepositories(List<String> ids); List<Repository> getRepositories(List<String> ids) throws JSONException;
List<Repository> getRepositories(List<String> ids, int page, int size); List<Repository> getRepositories(List<String> ids, int page, int size) throws JSONException;
List<RepositorySnippet> getRepositoriesSnippets(List<String> ids) throws Exception; List<RepositorySnippet> getRepositoriesSnippets(List<String> ids) throws Exception;
List<RepositorySnippet> getRepositoriesSnippets(List<String> ids, int page, int size) throws Exception; List<RepositorySnippet> getRepositoriesSnippets(List<String> ids, int page, int size) throws Exception;
List<RepositorySnippet> getRepositoriesByCountry(String country, String mode, Boolean managed); List<RepositorySnippet> getRepositoriesByCountry(String country, String mode, Boolean managed) throws JSONException, IOException;
// TODO: remove? // TODO: remove?
List<Repository> getRepositoriesOfUser(String page, String size); List<Repository> getRepositoriesOfUser(String page, String size) throws JSONException, IOException;
// TODO: remove? // TODO: remove?
List<Repository> getRepositoriesOfUser(String userEmail, String page, String size); List<Repository> getRepositoriesOfUser(String userEmail,
String page,
String size) throws JSONException, IOException;
List<RepositorySnippet> getRepositoriesSnippetsOfUser(String page, String size); List<RepositorySnippet> getRepositoriesSnippetsOfUser(String page, String size) throws Exception;
List<RepositorySnippet> getRepositoriesSnippetsOfUser(String userEmail, String page, String size); List<RepositorySnippet> getRepositoriesSnippetsOfUser(String userEmail, String page, String size) throws Exception;
RepositorySnippet getRepositorySnippetById(String id) throws ResourceNotFoundException; RepositorySnippet getRepositorySnippetById(String id) throws JSONException, ResourceNotFoundException;
Repository getRepositoryById(String id) throws ResourceNotFoundException; Repository getRepositoryById(String id) throws JSONException, ResourceNotFoundException;
List<AggregationDetails> getRepositoryAggregations(String id, int from, int size) throws JSONException;
Map<String, List<AggregationDetails>> getRepositoryAggregationsByYear(String id) throws JSONException;
List<Repository> getRepositoriesByName(String name, List<Repository> getRepositoriesByName(String name,
String page, String page,
String size); String size) throws JSONException;
List<RepositorySnippet> searchRegisteredRepositories(String country, String typology, String englishName, List<RepositorySnippet> searchRegisteredRepositories(String country, String typology, String englishName,
String officialName, String requestSortBy, String order, String officialName, String requestSortBy, String order,
int page, int pageSize); int page, int pageSize) throws Exception;
Integer getTotalRegisteredRepositories(); int getTotalRegisteredRepositories();
List<RepositoryInterface> getRepositoryInterface(String id); List<RepositoryInterface> getRepositoryInterface(String id) throws JSONException;
Repository addRepository(String datatype, Repository repository); Repository addRepository(String datatype, Repository repository) throws Exception;
void deleteRepositoryInterface(String id, String registeredBy); void deleteRepositoryInterface(String id, String registeredBy);
RepositoryInterface addRepositoryInterface(String datatype, RepositoryInterface addRepositoryInterface(String datatype,
String repoId, String repoId,
String comment, String registeredBy,
RepositoryInterface repositoryInterface, String comment, RepositoryInterface repositoryInterface) throws Exception;
String desiredCompatibilityLevel) throws Exception;
List<String> getDnetCountries(); List<String> getDnetCountries();
@ -67,9 +74,13 @@ public interface RepositoryService {
List<Timezone> getTimezones(); List<Timezone> getTimezones();
Repository updateRepository(Repository repository, Authentication authentication); Repository updateRepository(Repository repository, Authentication authentication) throws Exception;
List<String> getUrlsOfUserRepos(String userEmail, String page, String size); List<String> getUrlsOfUserRepos(String user_email,
String page,
String size);
List<String> getDatasourceVocabularies(String mode);
Map<String, String> getCompatibilityClasses(String mode); Map<String, String> getCompatibilityClasses(String mode);
@ -79,9 +90,8 @@ public interface RepositoryService {
MetricsInfo getMetricsInfoForRepository(String repoId) throws RepositoryServiceException; MetricsInfo getMetricsInfoForRepository(String repoId) throws RepositoryServiceException;
Map<String, String> getListLatestUpdate(String mode); Map<String, String> getListLatestUpdate(String mode) throws JSONException;
RepositoryInterface updateRepositoryInterface(String repoId, String comment, RepositoryInterface repositoryInterface, String desiredCompatibilityLevel) throws ResourceNotFoundException, ValidatorServiceException; RepositoryInterface updateRepositoryInterface(String repoId, String registeredBy, String comment, RepositoryInterface repositoryInterface) throws Exception;
void updateInterfaceCompliance(String repositoryId, String repositoryInterfaceId, String compliance);
} }

View File

@ -1,27 +1,17 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import org.slf4j.Logger; import eu.dnetlib.repo.manager.service.customHystrixCommands.*;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
@Service("statsService") @Service("statsService")
public class StatsServiceImpl implements StatsService { public class StatsServiceImpl implements StatsService {
private static final Logger logger = LoggerFactory.getLogger(StatsServiceImpl.class);
@Autowired @Autowired
RestTemplate restTemplate; RestTemplate restTemplate;
@ -34,215 +24,27 @@ public class StatsServiceImpl implements StatsService {
@Override @Override
public Map getStatistics() { public Map getStatistics() {
UsageStatsTotalHystrixCommand usageStatsTotalHystrixCommand = new UsageStatsTotalHystrixCommand(usagestatsEvents,restTemplate);
DataRepositoriesHystrixCommand dataRepositoriesHystrixCommand = new DataRepositoriesHystrixCommand(baseAddress,restTemplate);
AggregatorsHystrixCommand aggregatorsHystrixCommand = new AggregatorsHystrixCommand(baseAddress,restTemplate);
LiteratureHystrixCommand literatureHystrixCommand = new LiteratureHystrixCommand(baseAddress,restTemplate);
JournalHystrixCommand journalHystrixCommand = new JournalHystrixCommand(baseAddress,restTemplate);
PublicationHystrixCommand publicationHystrixCommand = new PublicationHystrixCommand(baseAddress,restTemplate);
DatasetsHystrixCommand datasetsHystrixCommand = new DatasetsHystrixCommand(baseAddress,restTemplate);
SoftwareHystrixCommand softwareHystrixCommand = new SoftwareHystrixCommand(baseAddress,restTemplate);
LastYearUsageStatsHystrixCommand lastYearUsageStatsHystrixCommand = new LastYearUsageStatsHystrixCommand(usagestatsBaseAddress,restTemplate);
Map<String,Object> stats = new HashMap<>(); Map<String,Object> stats = new HashMap<>();
stats.put("aggregators", this.getAggregatorsStats()); stats.put("aggregators",aggregatorsHystrixCommand.execute());
stats.put("dataRepositories", this.getDataRepositoriesMetadata()); stats.put("dataRepositories",dataRepositoriesHystrixCommand.execute());
stats.put("literature", this.getLiteratureStats()); stats.put("literature",literatureHystrixCommand.execute());
stats.put("journal", this.getJournalsStats()); stats.put("journal",journalHystrixCommand.execute());
stats.put("publications", this.getPublicationStats()); stats.put("publications",publicationHystrixCommand.execute());
stats.put("datasets", this.getDatasetsStats()); stats.put("datasets",datasetsHystrixCommand.execute());
stats.put("software", this.getSoftwareStats()); stats.put("software",softwareHystrixCommand.execute());
stats.put("lastYearUsagestats", this.getLastYearUsageStats()); stats.put("lastYearUsagestats", lastYearUsageStatsHystrixCommand.execute());
stats.put("usagestats", this.getUsageStatsTotal()); stats.put("usagestats",usageStatsTotalHystrixCommand.execute());
return stats; return stats;
} }
private String getAggregatorsStats()
{
String url = baseAddress + "/resources" +
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository Aggregator " +
" or datasourcetypename exact Publication Repository Aggregator )";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
try {
ResponseEntity<Map> rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) ((Map<?, ?>) Objects.requireNonNull(rs.getBody())).get("meta");
return String.valueOf(metadata.get("total"));
} catch ( RestClientException rce ) {
logger.error(rce.getMessage());
return null;
} catch ( Exception e ) {
logger.error("", e);
return null;
}
}
private String getDataRepositoriesMetadata()
{
String url = baseAddress + "/resources" +
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Data Repository ";
return getMetadataTotals(url);
}
private String getLiteratureStats()
{
String url = baseAddress + "/resources" +
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository " +
" or datasourcetypename exact Publication Repository )";
return getMetadataTotals(url);
}
private String getJournalsStats()
{
String url = baseAddress + "/resources" +
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Journal";
return getMetadataTotals(url);
}
private String getPublicationStats()
{
String url = baseAddress + "/publications/count";
return getCommonStats(url);
}
private String getDatasetsStats()
{
String url = baseAddress + "/datasets/count";
return getCommonStats(url);
}
private String getSoftwareStats()
{
String url = baseAddress + "/software/count";
return getCommonStats(url);
}
private Map<String,Object> getLastYearUsageStats()
{
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsBaseAddress + "/totals")
.build().encode();
try {
ResponseEntity<Map> rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
List yearly_stats = (List) ((Map<?, ?>) Objects.requireNonNull(rs.getBody())).get("yearly_stats");
Map lastYear = (Map) yearly_stats.get(yearly_stats.size() - 2);
Integer downloads = (Integer) lastYear.get("downloads");
Integer views = (Integer) lastYear.get("views");
Integer year = (Integer) lastYear.get("year");
Map<String, Object> usagestats = new HashMap<>();
usagestats.put("number", String.valueOf(downloads + views));
usagestats.put("year", year);
return usagestats;
} catch ( RestClientException rce ) {
logger.error(rce.getMessage());
return null;
} catch ( Exception e ) {
logger.error("", e);
return null;
}
}
private Integer getUsageStatsTotal()
{
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsEvents)
.build().encode();
try {
ResponseEntity<Map> rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map statsTotals = (Map) ((Map<?, ?>) Objects.requireNonNull(rs.getBody())).get("totals");
if ( statsTotals == null ) {
logger.error("The statsTotals was null!");
return null;
}
// TODO - Will we ever need the following lines?
// String rs = restTemplate.getForObject(uriComponents.toUri(), String.class);
// JSONObject resultSet = new JSONObject(rs);
// JSONObject totals = resultSet.getJSONObject("totals");
return (Integer) statsTotals.get("events");
} catch ( RestClientException rce ) {
logger.error(rce.getMessage());
return null;
} catch ( Exception e ) {
logger.error("", e);
return null;
}
}
private String getMetadataTotals(String url) {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
try {
ResponseEntity<Map> rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) ((Map<?, ?>) Objects.requireNonNull(rs.getBody())).get("meta");
if ( metadata == null ) {
logger.error("The metadata was null!");
return null;
}
return String.valueOf(metadata.get("total"));
} catch ( RestClientException rce ) {
logger.error(rce.getMessage());
return null;
} catch ( Exception e ) {
logger.error("", e);
return null;
}
}
private String getCommonStats(String url) {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
try {
ResponseEntity<Map> rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map stats = (Map<?, ?>) rs.getBody();
if ( stats == null ) {
logger.error("The stats was null!");
return null;
}
return String.valueOf(stats.get("total"));
} catch ( RestClientException rce ) {
logger.error(rce.getMessage());
return null;
} catch ( Exception e ) {
logger.error("", e);
return null;
}
}
} }

View File

@ -1,4 +1,4 @@
package eu.dnetlib.repo.manager.service.sushilite; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper; import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper;
import org.json.JSONException; import org.json.JSONException;

View File

@ -0,0 +1,104 @@
package eu.dnetlib.repo.manager.service;
import eu.dnetlib.usagestats.sushilite.domain.ReportItem;
import eu.dnetlib.usagestats.sushilite.domain.ReportResponseWrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.ArrayList;
import java.util.List;
@Service("sushiliteService")
public class SushiliteServiceImpl implements SushiliteService {
@Value("${services.provide.usagestats.sushiliteEndpoint}")
private String usagestatsSushiliteEndpoint;
private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(SushiliteServiceImpl.class);
@Override
@PreAuthorize("hasAuthority('REGISTERED_USER')")
public ReportResponseWrapper getReportResults(String page,
String pageSize,
String Report,
String Release,
String RequestorID,
String BeginDate,
String EndDate,
String RepositoryIdentifier,
String ItemIdentifier,
String ItemDataType,
String Granularity,
String Pretty) {
//build the uri params
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.usagestatsSushiliteEndpoint + "GetReport/")
.queryParam("Report", Report)
.queryParam("Release", Release)
.queryParam("RequestorID", RequestorID)
.queryParam("BeginDate", BeginDate)
.queryParam("EndDate", EndDate)
.queryParam("RepositoryIdentifier", RepositoryIdentifier)
.queryParam("ItemIdentifier", ItemIdentifier)
.queryParam("ItemDataType", ItemDataType)
.queryParam("Granularity", Granularity)
.queryParam("Pretty", Pretty);
//create new template engine
RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<ReportResponseWrapper> resp;
//communicate with endpoint
resp = template.exchange(
builder.build().encode().toUri(),
HttpMethod.GET,
null,
new ParameterizedTypeReference<ReportResponseWrapper>() {
});
// check remote api's response
System.out.println("sushi responded status " + resp.getStatusCode());
// get the items corresponding to the requested page
List<ReportItem> requestedItemList = new ArrayList<>();
if (resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems() != null) {
try {
int totalItems = resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems().size();
int size = Integer.parseInt(pageSize);
int offset = Integer.parseInt(page)*size;
if (offset < totalItems ) {
int upperIndex = offset+size;
if (upperIndex > totalItems) {
upperIndex = totalItems;
}
requestedItemList = resp.getBody().getReportResponse().getReportWrapper().getReport().getCustomer().getReportItems().subList(offset,upperIndex);
}
} catch (NumberFormatException e) {
LOGGER.debug("Exception on getReportResults - trying to cast strings to integers", e);
//emailUtils.reportException(e);
throw e;
}
}
ReportResponseWrapper newReportResponse = resp.getBody();
newReportResponse.getReportResponse().getReportWrapper().getReport().getCustomer().setReportItems(requestedItemList);
return newReportResponse;
}
}

View File

@ -1,9 +1,7 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.mitre.openid.connect.model.UserInfo; import org.springframework.beans.factory.annotation.Value;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
@ -18,24 +16,21 @@ import java.util.stream.Collectors;
@Service("userService") @Service("userService")
public class UserServiceImpl implements UserService { public class UserServiceImpl implements UserService {
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
.getLogger(UserServiceImpl.class);
@Override @Override
public ResponseEntity<Object> login() { public ResponseEntity<Object> login() {
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
logger.debug("User authentication : " + authentication); LOGGER.debug("User authentication : " + authentication);
Map<String,Object> body = new HashMap<>(); Map<String,Object> body = new HashMap<>();
body.put("sub",authentication.getSub()); body.put("sub",authentication.getSub());
if(authentication.getUserInfo().getName() == null || authentication.getUserInfo().getName().equals(""))
UserInfo userInfo = authentication.getUserInfo(); body.put("name",authentication.getUserInfo().getGivenName() + " " + authentication.getUserInfo().getFamilyName());
String userName = userInfo.getName();
if ( userName == null || userName.isEmpty() )
body.put("name", userInfo.getGivenName() + " " + userInfo.getFamilyName());
else else
body.put("name", userName); body.put("name",authentication.getUserInfo().getName());
body.put("email",userInfo.getEmail()); body.put("email",authentication.getUserInfo().getEmail());
List<String> roles = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()); List<String> roles = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
body.put("role",roles); body.put("role",roles);

View File

@ -5,8 +5,8 @@ import eu.dnetlib.domain.functionality.validator.JobForValidation;
import eu.dnetlib.domain.functionality.validator.RuleSet; import eu.dnetlib.domain.functionality.validator.RuleSet;
import eu.dnetlib.domain.functionality.validator.StoredJob; import eu.dnetlib.domain.functionality.validator.StoredJob;
import eu.dnetlib.repo.manager.domain.InterfaceInformation; import eu.dnetlib.repo.manager.domain.InterfaceInformation;
import eu.dnetlib.repo.manager.domain.ValidationServiceException;
import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException;
import eu.dnetlib.repo.manager.exception.ValidationServiceException;
import org.json.JSONException; import org.json.JSONException;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -42,6 +42,4 @@ public interface ValidatorService {
InterfaceInformation getInterfaceInformation(String baseUrl) throws ValidationServiceException; InterfaceInformation getInterfaceInformation(String baseUrl) throws ValidationServiceException;
List<StoredJob> getJobsSummary(String repoId, int limit) throws ValidatorServiceException, ResourceNotFoundException, JSONException; List<StoredJob> getJobsSummary(String repoId, int limit) throws ValidatorServiceException, ResourceNotFoundException, JSONException;
void onComplete(String repoId, String interfaceId, String jobId, String issuerEmail, boolean isUpdate, boolean isSuccess, int scoreUsage, int scoreContent) throws Exception;
} }

View File

@ -1,21 +1,19 @@
package eu.dnetlib.repo.manager.service; package eu.dnetlib.repo.manager.service;
import eu.dnetlib.api.functionality.ValidatorServiceException; import eu.dnetlib.api.functionality.ValidatorServiceException;
import eu.dnetlib.domain.functionality.validator.JobForValidation; import eu.dnetlib.domain.data.RepositoryInterface;
import eu.dnetlib.domain.functionality.validator.Rule; import eu.dnetlib.domain.functionality.validator.*;
import eu.dnetlib.domain.functionality.validator.RuleSet; import eu.dnetlib.repo.manager.domain.Constants;
import eu.dnetlib.domain.functionality.validator.StoredJob; import eu.dnetlib.repo.manager.domain.InterfaceInformation;
import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.ValidationServiceException;
import eu.dnetlib.repo.manager.exception.ValidationServiceException;
import eu.dnetlib.repo.manager.utils.CrisValidatorUtils; import eu.dnetlib.repo.manager.utils.CrisValidatorUtils;
import eu.dnetlib.repo.manager.utils.OaiTools; import eu.dnetlib.repo.manager.utils.OaiTools;
import gr.uoa.di.driver.util.ServiceLocator; import gr.uoa.di.driver.util.ServiceLocator;
import org.apache.log4j.Logger;
import org.eurocris.openaire.cris.validator.model.Job; import org.eurocris.openaire.cris.validator.model.Job;
import org.eurocris.openaire.cris.validator.service.JobExecutor; import org.eurocris.openaire.cris.validator.service.JobExecutor;
import org.eurocris.openaire.cris.validator.service.MapJobDao; import org.eurocris.openaire.cris.validator.service.MapJobDao;
import org.json.JSONException; import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -27,7 +25,6 @@ import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -55,9 +52,10 @@ public class ValidatorServiceImpl implements ValidatorService {
this.validatorServiceLocator = validatorServiceLocator; this.validatorServiceLocator = validatorServiceLocator;
} }
private final Map<String, List<RuleSet>> rulesetMap = new ConcurrentHashMap<String, List<RuleSet>>(); private Map<String, List<RuleSet>> rulesetMap = new ConcurrentHashMap<String, List<RuleSet>>();
private static final Logger logger = LoggerFactory.getLogger(ValidatorServiceImpl.class); private static final Logger LOGGER = Logger
.getLogger(ValidatorServiceImpl.class);
@Autowired @Autowired
private EmailUtils emailUtils; private EmailUtils emailUtils;
@ -68,30 +66,20 @@ public class ValidatorServiceImpl implements ValidatorService {
@Autowired @Autowired
private MapJobDao crisJobs; private MapJobDao crisJobs;
@Autowired
InterfaceComplianceService interfaceComplianceService;
public static final Pattern OPENAIRE_DATA_REGEX = Pattern.compile("^openaire[1-9].0_data$");
public static final Pattern OPENAIRE_OR_DRIVER_REGEX = Pattern.compile("^(?:openaire[1-9].0|driver)$");
public static final Pattern OPENAIRE_CRIS_REGEX = Pattern.compile("^openaire[1-9].0_cris$");
public static final Pattern FAIR_REGEX = Pattern.compile(".*fair$");
@PostConstruct @PostConstruct
private void loadRules(){ private void loadRules(){
logger.debug("PostConstruct method! Load rules!"); LOGGER.debug("PostConstruct method! Load rules!");
try { try {
for (RuleSet ruleSet : getValidationService().getRuleSets()) { for (RuleSet ruleSet : getValidationService().getRuleSets()) {
if (ruleSet.getVisibility() != null && ruleSet.getVisibility().contains("development")) { if (ruleSet.getVisibility() != null && ruleSet.getVisibility().contains("development")) {
String key = ""; String key = "";
String guidelinesAcronym = ruleSet.getGuidelinesAcronym(); if (ruleSet.getGuidelinesAcronym().matches("^openaire[1-9].0_data$"))
if ( OPENAIRE_DATA_REGEX.matcher(guidelinesAcronym).matches() )
key = Constants.VALIDATION_MODE_DATA; key = Constants.VALIDATION_MODE_DATA;
else if ( OPENAIRE_OR_DRIVER_REGEX.matcher(guidelinesAcronym).matches() ) else if (ruleSet.getGuidelinesAcronym().matches("^openaire[1-9].0$") || ruleSet.getGuidelinesAcronym().equals("driver"))
key = Constants.VALIDATION_MODE_LITERATURE; key = Constants.VALIDATION_MODE_LITERATURE;
else if ( OPENAIRE_CRIS_REGEX.matcher(guidelinesAcronym).matches() ) else if (ruleSet.getGuidelinesAcronym().matches("^openaire[1-9].0_cris$"))
key = Constants.VALIDATION_MODE_CRIS; key = Constants.VALIDATION_MODE_CRIS;
else if ( FAIR_REGEX.matcher(guidelinesAcronym).matches() ) else if (ruleSet.getGuidelinesAcronym().matches(".*fair$"))
key = Constants.VALIDATION_MODE_FAIR; key = Constants.VALIDATION_MODE_FAIR;
if (rulesetMap.containsKey(key)) if (rulesetMap.containsKey(key))
@ -133,23 +121,26 @@ public class ValidatorServiceImpl implements ValidatorService {
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
} catch (ValidatorServiceException e) { } catch (ValidatorServiceException e) {
logger.error(e.getMessage(), e); LOGGER.error(e);
} }
} }
@Override @Override
@PreAuthorize("hasAuthority('REGISTERED_USER')") @PreAuthorize("hasAuthority('REGISTERED_USER') and #jobForValidation.userEmail == authentication.userInfo.email")
public JobForValidation submitJobForValidation(JobForValidation jobForValidation) throws ValidatorServiceException { public JobForValidation submitJobForValidation(JobForValidation jobForValidation) throws ValidatorServiceException {
logger.debug("Submit job for validation with id : {}", jobForValidation.getDatasourceId()); LOGGER.debug("Submit job for validation with id : " + jobForValidation.getDatasourceId());
try {
try { try {
emailUtils.sendSubmitJobForValidationEmail(SecurityContextHolder.getContext().getAuthentication(), jobForValidation); emailUtils.sendSubmitJobForValidationEmail(SecurityContextHolder.getContext().getAuthentication(), jobForValidation);
} catch (Exception e) {
LOGGER.error("Error sending email ", e);
}
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
// FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly // // FIXME: this is a hack for CRIS Jan Dvorak Validator, should be implemented properly //
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
if (jobForValidation.getSelectedContentRules()!=null && jobForValidation.getSelectedContentRules().size() == 1 && if (jobForValidation.getSelectedContentRules()!=null && jobForValidation.getSelectedContentRules().size() == 1 &&
jobForValidation.getSelectedContentRules().contains(-1000) jobForValidation.getSelectedContentRules().contains(-1000)) {
|| jobForValidation.getDesiredCompatibilityLevel().equals("openaire-cris_1.1")) {
crisValidatorExecutor.submit(jobForValidation.getBaseUrl(), jobForValidation.getUserEmail()); crisValidatorExecutor.submit(jobForValidation.getBaseUrl(), jobForValidation.getUserEmail());
} else { } else {
this.getValidationService().submitValidationJob(jobForValidation); this.getValidationService().submitValidationJob(jobForValidation);
@ -157,18 +148,18 @@ public class ValidatorServiceImpl implements ValidatorService {
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
// this.getValidationService().submitValidationJob(jobForValidation); // this.getValidationService().submitValidationJob(jobForValidation);
} catch (Exception e) { // FIXME: replaced exception with log } catch (Exception e) {
// throw new ValidatorServiceException(e); throw new ValidatorServiceException(e);
logger.error(e.getMessage(), e);
} }
return jobForValidation; return jobForValidation;
} }
@Override @Override
@PreAuthorize("hasAuthority('REGISTERED_USER') and #email == authentication.userInfo.email")
public ResponseEntity<Object> reSubmitJobForValidation(String email, public ResponseEntity<Object> reSubmitJobForValidation(String email,
String jobId) throws JSONException, ValidatorServiceException { String jobId) throws JSONException, ValidatorServiceException {
logger.debug("Resubmit validation job with id : {}", jobId); LOGGER.debug("Resubmit validation job with id : " + jobId);
StoredJob job = monitorApi.getJobSummary(jobId, "all"); StoredJob job = monitorApi.getJobSummary(jobId, "all");
Set<Integer> contentRules = new HashSet<Integer>(); Set<Integer> contentRules = new HashSet<Integer>();
Set<Integer> usageRules = new HashSet<Integer>(); Set<Integer> usageRules = new HashSet<Integer>();
@ -185,7 +176,7 @@ public class ValidatorServiceImpl implements ValidatorService {
} }
} }
} }
if (ruleSet != null) { if (ruleSet != null){
for (int ruleId : job.getRules()) { for (int ruleId : job.getRules()) {
if (ruleSet.getContentRulesIds().contains(ruleId)) if (ruleSet.getContentRulesIds().contains(ruleId))
contentRules.add(ruleId); contentRules.add(ruleId);
@ -203,51 +194,51 @@ public class ValidatorServiceImpl implements ValidatorService {
@Override @Override
public List<RuleSet> getRuleSets(String mode) { public List<RuleSet> getRuleSets(String mode) {
logger.info("Getting ruleSets for mode: {}", mode); LOGGER.info("Getting rulesets for mode: " + mode);
return rulesetMap.get(mode); return rulesetMap.get(mode);
} }
@Override @Override
public List<String> getSetsOfRepository(String url) { public List<String> getSetsOfRepository(String url) {
logger.debug("Getting sets of repository with url : {}", url); LOGGER.debug("Getting sets of repository with url : " + url);
List<String> sets = null; List<String> sets = null;
try { try {
sets = OaiTools.getSetsOfRepo(url); sets = OaiTools.getSetsOfRepo(url);
} catch (Exception e) { } catch (Exception e) {
logger.error("Exception on getSetsOfRepository", e); LOGGER.error("Exception on getSetsOfRepository" , e);
} }
return sets; // It may be null.
return sets;
} }
@Override @Override
public boolean identifyRepo(String url) { public boolean identifyRepo(String url) {
logger.debug("Identify repository with url : {}", url); LOGGER.debug("Identify repository with url : " + url);
try { try {
return OaiTools.identifyRepository(url); return OaiTools.identifyRepository(url);
} catch (Exception e) { } catch (Exception e) {
logger.error("Error while identifying repository with url: " + url, e); LOGGER.error("Error while identifying repository with url: " + url, e);
return false; return false;
} }
} }
@Override @Override
public RuleSet getRuleSet(String acronym) { public RuleSet getRuleSet(String acronym) {
logger.debug("Getting ruleset with acronym : {}", acronym); LOGGER.debug("Getting ruleset with acronym : " + acronym);
RuleSet ruleSet = null; RuleSet ruleSet = null;
try { try {
for (List<RuleSet> ruleSets : this.rulesetMap.values()) { for (List<RuleSet> ruleSets : this.rulesetMap.values()) {
for ( RuleSet rSet : ruleSets ) { for (RuleSet rSet : ruleSets)
if ( rSet.getGuidelinesAcronym().equals(acronym) ) { if (rSet.getGuidelinesAcronym().equals(acronym)) {
ruleSet = rSet; ruleSet = rSet;
break; break;
} }
} }
if ( ruleSet != null ) return ruleSet;
break;
}
return ruleSet; // It may be null.
} catch (Exception e) { } catch (Exception e) {
logger.error("Error getting ruleset", e); LOGGER.error("Error getting ruleset", e);
return null; return null;
} }
} }
@ -286,7 +277,7 @@ public class ValidatorServiceImpl implements ValidatorService {
@Override @Override
public InterfaceInformation getInterfaceInformation(String baseUrl) throws ValidationServiceException { public InterfaceInformation getInterfaceInformation(String baseUrl) throws ValidationServiceException {
try { try {
logger.debug("Getting interface information with url: {}", baseUrl); LOGGER.debug("Getting interface information with url: " + baseUrl);
InterfaceInformation interfaceInformation = new InterfaceInformation(); InterfaceInformation interfaceInformation = new InterfaceInformation();
interfaceInformation.setIdentified(this.identifyRepo(baseUrl)); interfaceInformation.setIdentified(this.identifyRepo(baseUrl));
if (interfaceInformation.isIdentified()) if (interfaceInformation.isIdentified())
@ -294,35 +285,14 @@ public class ValidatorServiceImpl implements ValidatorService {
return interfaceInformation; return interfaceInformation;
} catch (Exception e) { } catch (Exception e) {
logger.error("Error getting interface information with url: " + baseUrl, e); LOGGER.error("Error getting interface information with url: " + baseUrl, e);
throw new ValidationServiceException("login.generalError", ValidationServiceException.ErrorCode.GENERAL_ERROR); throw new ValidationServiceException("login.generalError", ValidationServiceException.ErrorCode.GENERAL_ERROR);
} }
} }
@Override @Override
public List<StoredJob> getJobsSummary(String repoId, int limit) throws JSONException, ValidatorServiceException { public List<StoredJob> getJobsSummary(String repoId, int limit) throws JSONException, ValidatorServiceException {
return getValidationService().getJobSummary( return getValidationService().getJobSummary(repositoryService.getRepositoryInterface(repoId).stream().map(RepositoryInterface::getBaseUrl).collect(Collectors.toList()),limit);
repositoryService.getRepositoryInterface(repoId)
.stream()
.map(RepositoryInterface::getBaseurl)
.collect(Collectors.toList()), limit);
}
@Override
public void onComplete(String repoId, String interfaceId, String jobId, String issuerEmail, boolean isUpdate, boolean isSuccess, int scoreUsage, int scoreContent) throws Exception {
InterfaceComplianceRequestId requestId = InterfaceComplianceRequestId.of(repoId, interfaceId);
Optional<InterfaceComplianceRequest> request = interfaceComplianceService.getById(requestId);
String compatibility = null;
if (request.isPresent()) {
compatibility = request.get().getDesiredCompatibilityLevel();
logger.info("Changing compatibility level. Request: {}", request);
if (scoreContent > 50) {
repositoryService.updateInterfaceCompliance(repoId, interfaceId, request.get().getDesiredCompatibilityLevel());
}
interfaceComplianceService.delete(requestId);
}
emailUtils.sendUponJobCompletion(repoId,interfaceId,compatibility,scoreUsage,scoreContent,isSuccess,isUpdate,issuerEmail, jobId);
} }
} }

View File

@ -11,36 +11,28 @@ import java.util.Map;
public interface AaiRegistryService { public interface AaiRegistryService {
/** /**
* 1.1 Get CoPersonId List by authenticated user's Email * 1.1 Get CoPersonId by authenticated user's Email
* *
* @return * @return
*/ */
List<Integer> getCoPersonIdsByEmail(); Integer getCoPersonIdByEmail();
/** /**
* 1.2 Get CoPersonId List by Email * 1.2 Get CoPersonId by Email
*
* @param email
* @return
*/
Integer getCoPersonIdByEmail(String email);
/**
* 1. Get CoPersonId List by Email
* *
* @param email * @param email
* @return * @return
*/ */
List<Integer> getCoPersonIdsByEmail(String email); List<Integer> getCoPersonIdsByEmail(String email);
/**
* 1.3 Get a list of User Identifiers by Email
*
* @param email
* @return
*/
List<String> getUserIdentifiersByEmail(String email);
/**
* 1.3 Get a list of User Identifiers by Email
*
* @param coPersonId
* @return
*/
List<String> getUserIdentifiersByCoPersonId(Integer coPersonId);
/** /**
* 2. Get CoPersonId by AAI identifier * 2. Get CoPersonId by AAI identifier
* *
@ -105,14 +97,6 @@ public interface AaiRegistryService {
*/ */
JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status); JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status);
/**
* 5.3 Get User non admin active roles
*
* @param coPersonIds
* @return
*/
JsonArray getRolesWithStatus(List<Integer> coPersonIds, RoleStatus status);
/** /**
* 6. Get Role id of User base on couId. * 6. Get Role id of User base on couId.
* *
@ -204,8 +188,9 @@ public interface AaiRegistryService {
* *
* @param coPersonId * @param coPersonId
* @param couId * @param couId
* @param id
*/ */
void assignMemberRole(Integer coPersonId, Integer couId); void assignMemberRole(Integer coPersonId, Integer couId, Integer id);
/** /**
* 16. Remove a member role from a User * 16. Remove a member role from a User

View File

@ -3,38 +3,38 @@ package eu.dnetlib.repo.manager.service.aai.registry;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.nimbusds.jose.util.StandardCharset;
import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.Role;
import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.domain.dto.User;
import eu.dnetlib.repo.manager.service.aai.registry.utils.HttpUtils;
import eu.dnetlib.repo.manager.service.aai.registry.utils.RegistryUtils; import eu.dnetlib.repo.manager.service.aai.registry.utils.RegistryUtils;
import eu.dnetlib.repo.manager.utils.HttpUtils;
import org.apache.log4j.Logger;
import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service @Service
public class RegistryCalls implements AaiRegistryService { public class RegistryCalls implements AaiRegistryService {
private static final Logger logger = LoggerFactory.getLogger(RegistryCalls.class); private static final Logger logger = Logger.getLogger(RegistryCalls.class);
private final String coid;
public final HttpUtils httpUtils; public final HttpUtils httpUtils;
public final RegistryUtils jsonUtils; public final RegistryUtils jsonUtils;
private final String coid;
@Autowired @Autowired
RegistryCalls(HttpUtils httpUtils, RegistryUtils registryUtils, @Value("${services.provide.aai.registry.coid}") String coid) { RegistryCalls(@Value("${services.provide.aai.registry.coid:2}") String coid,
HttpUtils httpUtils, RegistryUtils registryUtils) {
this.coid = coid;
this.httpUtils = httpUtils; this.httpUtils = httpUtils;
this.jsonUtils = registryUtils; this.jsonUtils = registryUtils;
this.coid = coid;
} }
private String mapType(String type, boolean communityMap) { private String mapType(String type, boolean communityMap) {
@ -47,39 +47,15 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public List<String> getUserIdentifiersByEmail(String email) { public Integer getCoPersonIdByEmail() {
List<String> ids = new ArrayList<>();
for (Integer coPersonId : getCoPersonIdsByEmail(email)) {
ids.addAll(getUserIdentifiersByCoPersonId(coPersonId));
}
return ids;
}
@Override
public List<String> getUserIdentifiersByCoPersonId(Integer coPersonId) throws RestClientException {
List<String> ids = new ArrayList<>();
Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("identifiers.json", params);
if (response != null) {
JsonArray infos = response.getAsJsonObject().get("Identifiers").getAsJsonArray();
infos.forEach(info -> {
JsonObject jsonInfo = info.getAsJsonObject();
if (!jsonInfo.get("Deleted").getAsBoolean()) {
ids.add(jsonInfo.get("Identifier").getAsString());
}
});
}
return ids;
}
@Override
public List<Integer> getCoPersonIdsByEmail() {
try { try {
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
String email = authentication.getUserInfo().getEmail(); String email = authentication.getUserInfo().getEmail();
return getCoPersonIdsByEmail(email); Map<String, String> params = new HashMap<>();
params.put("coid", coid);
params.put("mail", email);
JsonElement response = httpUtils.get("co_people.json", params);
return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null;
} catch (Exception e) { } catch (Exception e) {
logger.error("Get User info: An error occurred ", e); logger.error("Get User info: An error occurred ", e);
return null; return null;
@ -87,11 +63,26 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public List<Integer> getCoPersonIdsByEmail(String email) throws RestClientException { public Integer getCoPersonIdByEmail(String email) {
Map<String, String> params = new HashMap<>();
params.put("coid", coid);
params.put("mail", email);
JsonElement response = httpUtils.get("co_people.json", params);
if (response != null) {
JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray();
if (coPeople.size() > 0) {
return coPeople.get(0).getAsJsonObject().get("Id").getAsInt();
}
}
return null;
}
@Override
public List<Integer> getCoPersonIdsByEmail(String email) {
List<Integer> coPersonIds = new ArrayList<>(); List<Integer> coPersonIds = new ArrayList<>();
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("mail", email);
params.put("coid", coid); params.put("coid", coid);
params.put("mail", email);
JsonElement response = httpUtils.get("co_people.json", params); JsonElement response = httpUtils.get("co_people.json", params);
if (response != null) { if (response != null) {
JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray(); JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray();
@ -107,31 +98,31 @@ public class RegistryCalls implements AaiRegistryService {
try { try {
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
String sub = authentication.getUserInfo().getSub(); String sub = authentication.getUserInfo().getSub();
return getCoPersonIdByIdentifier(sub); Map<String, String> params = new HashMap<>();
params.put("coid", coid);
params.put("search.identifier", sub);
JsonElement response = httpUtils.get("co_people.json", params);
return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null;
} catch (Exception e) { } catch (Exception e) {
logger.error("Get User info: An error occurred ", e); logger.error("Get User info: An error occurred ", e);
return null; return null;
} }
} }
public Integer getCoPersonIdByIdentifier(String sub) throws RestClientException { public Integer getCoPersonIdByIdentifier(String sub) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("search.identifier", sub);
params.put("coid", coid); params.put("coid", coid);
params.put("search.identifier", sub);
JsonElement response = httpUtils.get("co_people.json", params); JsonElement response = httpUtils.get("co_people.json", params);
return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null;
} }
@Override @Override
public JsonArray getCous(String name) throws RestClientException { public JsonArray getCous(String name) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("coid", coid);
if (name != null) { if (name != null) {
try { params.put("name", URLEncoder.encode(name).toLowerCase());
params.put("name", URLEncoder.encode(name, StandardCharset.UTF_8.name()).toLowerCase());
} catch (UnsupportedEncodingException uee) {
logger.error(uee.getMessage());
return new JsonArray();
}
} }
JsonElement response = httpUtils.get("cous.json", params); JsonElement response = httpUtils.get("cous.json", params);
return (response != null) ? response.getAsJsonObject().get("Cous").getAsJsonArray() : new JsonArray(); return (response != null) ? response.getAsJsonObject().get("Cous").getAsJsonArray() : new JsonArray();
@ -164,9 +155,8 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getRoles(Integer coPersonId) throws RestClientException { public JsonArray getRoles(Integer coPersonId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("coid", coid);
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("co_person_roles.json", params); JsonElement response = httpUtils.get("co_person_roles.json", params);
return (response != null) ? response.getAsJsonObject().get("CoPersonRoles").getAsJsonArray() : new JsonArray(); return (response != null) ? response.getAsJsonObject().get("CoPersonRoles").getAsJsonArray() : new JsonArray();
@ -174,21 +164,16 @@ public class RegistryCalls implements AaiRegistryService {
@Override @Override
public JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status) { public JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status) {
return getRolesWithStatus(Collections.singletonList(coPersonId), status); JsonArray roles = getRoles(coPersonId);
if (status == null) {
return roles;
} }
@Override
public JsonArray getRolesWithStatus(List<Integer> coPersonIds, RoleStatus status) {
JsonArray roles = new JsonArray();
coPersonIds.parallelStream().forEach(coPersonId -> roles.addAll(getRoles(coPersonId)));
JsonArray activeRoles = new JsonArray(); JsonArray activeRoles = new JsonArray();
if (status != null) {
for (JsonElement role : roles) { for (JsonElement role : roles) {
if (role.getAsJsonObject().get("Status").getAsString().equalsIgnoreCase(status.toString())) { if (role.getAsJsonObject().get("Status").getAsString().equalsIgnoreCase(status.toString())) {
activeRoles.add(role); activeRoles.add(role);
} }
} }
}
return activeRoles; return activeRoles;
} }
@ -205,7 +190,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getUserGroups(Integer coPersonId) throws RestClientException { public JsonArray getUserGroups(Integer coPersonId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("co_groups.json", params); JsonElement response = httpUtils.get("co_groups.json", params);
@ -213,7 +198,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonObject getUserAdminGroup(Integer coPersonId, Integer couId) throws RestClientException { public JsonObject getUserAdminGroup(Integer coPersonId, Integer couId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("co_groups.json", params); JsonElement response = httpUtils.get("co_groups.json", params);
@ -230,8 +215,9 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getCouGroups(Integer couId) throws RestClientException { public JsonArray getCouGroups(Integer couId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("coid", coid);
params.put("couid", couId.toString()); params.put("couid", couId.toString());
JsonElement response = httpUtils.get("co_groups.json", params); JsonElement response = httpUtils.get("co_groups.json", params);
return (response != null) ? response.getAsJsonObject().get("CoGroups").getAsJsonArray() : new JsonArray(); return (response != null) ? response.getAsJsonObject().get("CoGroups").getAsJsonArray() : new JsonArray();
@ -249,7 +235,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getGroupMembers(Integer coGroupId) throws RestClientException { public JsonArray getGroupMembers(Integer coGroupId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("cogroupid", coGroupId.toString()); params.put("cogroupid", coGroupId.toString());
JsonElement response = httpUtils.get("co_group_members.json", params); JsonElement response = httpUtils.get("co_group_members.json", params);
@ -258,7 +244,7 @@ public class RegistryCalls implements AaiRegistryService {
@Override @Override
public JsonArray getUserEmailByCouId(Integer couId, boolean admin) throws RestClientException { public JsonArray getUserEmailByCouId(Integer couId, boolean admin) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
if (couId == null) { if (couId == null) {
throw new IllegalArgumentException("Provided 'couId' is null"); throw new IllegalArgumentException("Provided 'couId' is null");
@ -289,7 +275,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getUsersByCouId(Integer couId) throws RestClientException { public JsonArray getUsersByCouId(Integer couId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("couid", couId.toString()); params.put("couid", couId.toString());
JsonElement response = httpUtils.get("co_person_roles.json", params); JsonElement response = httpUtils.get("co_person_roles.json", params);
@ -310,11 +296,8 @@ public class RegistryCalls implements AaiRegistryService {
JsonArray infos = getUserEmailByCouId(couId, false); JsonArray infos = getUserEmailByCouId(couId, false);
infos.forEach(info -> { infos.forEach(info -> {
JsonObject jsonInfo = info.getAsJsonObject();
User user = new User(); User user = new User();
user.setEmail(jsonInfo.get("email").getAsString()); user.setEmail(info.getAsJsonObject().get("email").getAsString());
// TODO: should add firstname and lastname and sub of user
users.add(user); users.add(user);
}); });
@ -322,7 +305,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public JsonArray getUserNamesByCouId(Integer couId, boolean admin) throws RestClientException { public JsonArray getUserNamesByCouId(Integer couId, boolean admin) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("couid", couId.toString()); params.put("couid", couId.toString());
if (admin) { if (admin) {
@ -332,17 +315,16 @@ public class RegistryCalls implements AaiRegistryService {
JsonArray infos = (response != null) ? response.getAsJsonObject().get("Names").getAsJsonArray() : new JsonArray(); JsonArray infos = (response != null) ? response.getAsJsonObject().get("Names").getAsJsonArray() : new JsonArray();
JsonArray names = new JsonArray(); JsonArray names = new JsonArray();
infos.forEach(info -> { infos.forEach(info -> {
JsonObject jsonInfo = info.getAsJsonObject();
JsonObject user = new JsonObject(); JsonObject user = new JsonObject();
user.addProperty("name", jsonInfo.get("Given").getAsString() + " " + jsonInfo.get("Family").getAsString()); user.addProperty("name", info.getAsJsonObject().get("Given").getAsString() + " " + info.getAsJsonObject().get("Family").getAsString());
user.addProperty("memberSince", jsonInfo.get("Created").getAsString()); user.addProperty("memberSince", info.getAsJsonObject().get("Created").getAsString());
names.add(user); names.add(user);
}); });
return names; return names;
} }
@Override @Override
public JsonArray getUserIdByCouId(Integer couId, boolean admin) throws RestClientException { public JsonArray getUserIdByCouId(Integer couId, boolean admin) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("couid", couId.toString()); params.put("couid", couId.toString());
if (admin) { if (admin) {
@ -352,36 +334,38 @@ public class RegistryCalls implements AaiRegistryService {
JsonArray infos = (response != null) ? response.getAsJsonObject().get("Identifiers").getAsJsonArray() : new JsonArray(); JsonArray infos = (response != null) ? response.getAsJsonObject().get("Identifiers").getAsJsonArray() : new JsonArray();
JsonArray emails = new JsonArray(); JsonArray emails = new JsonArray();
infos.forEach(info -> { infos.forEach(info -> {
JsonObject jsonInfo = info.getAsJsonObject();
JsonObject user = new JsonObject(); JsonObject user = new JsonObject();
user.addProperty("id", jsonInfo.get("Identifier").getAsString()); user.addProperty("id", info.getAsJsonObject().get("Identifier").getAsString());
user.addProperty("memberSince", jsonInfo.get("Created").getAsString()); user.addProperty("memberSince", info.getAsJsonObject().get("Created").getAsString());
emails.add(user); emails.add(user);
}); });
return emails; return emails;
} }
@Override @Override
public void assignMemberRole(Integer coPersonId, Integer couId) throws RestClientException { public void assignMemberRole(Integer coPersonId, Integer couId, Integer id) {
if (id != null) {
httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Active"));
} else {
httpUtils.post("co_person_roles.json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); httpUtils.post("co_person_roles.json", jsonUtils.coPersonRoles(coPersonId, couId, "Active"));
} }
}
@Override @Override
public void removeMemberRole(Integer coPersonId, Integer couId, Integer id) throws RestClientException { public void removeMemberRole(Integer coPersonId, Integer couId, Integer id) {
if (id != null) { if (id != null) {
httpUtils.put("co_person_roles/" + id + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Deleted")); httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Deleted"));
} }
} }
@Override @Override
public Integer createRole(Role role) throws RestClientException { public Integer createRole(Role role) {
JsonElement element = httpUtils.post("cous.json", jsonUtils.createNewCou(role)); JsonElement element = httpUtils.post("cous.json", jsonUtils.createNewCou(role));
return element.getAsJsonObject().get("Id").getAsInt(); return element.getAsJsonObject().get("Id").getAsInt();
} }
@Override @Override
public String getUserEmail(Integer coPersonId) throws RestClientException { public String getUserEmail(Integer coPersonId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("email_addresses.json", params); JsonElement response = httpUtils.get("email_addresses.json", params);
@ -390,20 +374,16 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public String getUserNames(Integer coPersonId) throws RestClientException { public String getUserNames(Integer coPersonId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("names.json", params); JsonElement response = httpUtils.get("names.json", params);
JsonObject info = (response != null) ? response.getAsJsonObject().get("Names").getAsJsonArray().get(0).getAsJsonObject() : null; JsonObject info = (response != null) ? response.getAsJsonObject().get("Names").getAsJsonArray().get(0).getAsJsonObject() : null;
if (info != null) { return (info != null) ? info.getAsJsonObject().get("Given").getAsString() + " " + info.getAsJsonObject().get("Family").getAsString() : null;
JsonObject jsonInfo = info.getAsJsonObject();
return jsonInfo.get("Given").getAsString() + " " + jsonInfo.get("Family").getAsString();
} else
return null;
} }
@Override @Override
public String getUserId(Integer coPersonId) throws RestClientException { public String getUserId(Integer coPersonId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("copersonid", coPersonId.toString()); params.put("copersonid", coPersonId.toString());
JsonElement response = httpUtils.get("identifiers.json", params); JsonElement response = httpUtils.get("identifiers.json", params);
@ -412,7 +392,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public void assignAdminRole(Integer coPersonId, Integer couId) throws RestClientException { public void assignAdminRole(Integer coPersonId, Integer couId) {
JsonObject group = getCouAdminGroup(couId); JsonObject group = getCouAdminGroup(couId);
if (group != null) { if (group != null) {
httpUtils.post("co_group_members.json", jsonUtils.coGroupMembers(group.get("Id").getAsInt(), coPersonId, true)); httpUtils.post("co_group_members.json", jsonUtils.coGroupMembers(group.get("Id").getAsInt(), coPersonId, true));
@ -420,7 +400,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
@Override @Override
public void removeAdminRole(Integer coPersonId, Integer couId) throws RestClientException { public void removeAdminRole(Integer coPersonId, Integer couId) {
JsonObject adminGroup = this.getCouAdminGroup(couId); JsonObject adminGroup = this.getCouAdminGroup(couId);
JsonArray admins = this.getGroupMembers(adminGroup.get("Id").getAsInt()); JsonArray admins = this.getGroupMembers(adminGroup.get("Id").getAsInt());
Integer id = null; Integer id = null;
@ -430,7 +410,7 @@ public class RegistryCalls implements AaiRegistryService {
} }
} }
if (id != null) { if (id != null) {
httpUtils.delete("co_group_members/" + id + ".json"); httpUtils.delete("co_group_members/" + id.toString() + ".json");
} }
} }
@ -446,9 +426,8 @@ public class RegistryCalls implements AaiRegistryService {
int total = couIds.size(); int total = couIds.size();
for (JsonElement cou : cous) { for (JsonElement cou : cous) {
if (count < total) { if (count < total) {
JsonObject jsonCou = cou.getAsJsonObject(); if (idNameMap.containsKey(cou.getAsJsonObject().get("Id").getAsInt())) {
if (idNameMap.containsKey(jsonCou.get("Id").getAsInt())) { idNameMap.put(cou.getAsJsonObject().get("Id").getAsInt(), cou.getAsJsonObject().get("Name").getAsString());
idNameMap.put(jsonCou.get("Id").getAsInt(), jsonCou.get("Name").getAsString());
count++; count++;
} }
} else { } else {

View File

@ -6,8 +6,6 @@ import eu.dnetlib.repo.manager.domain.dto.Role;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
@Component @Component
public class RegistryUtils { public class RegistryUtils {
@ -31,11 +29,8 @@ public class RegistryUtils {
coPersonRole.addProperty("Title", ""); coPersonRole.addProperty("Title", "");
coPersonRole.addProperty("O", "Openaire"); coPersonRole.addProperty("O", "Openaire");
coPersonRole.addProperty("Status", status); coPersonRole.addProperty("Status", status);
if(status.equals("Active")) { coPersonRole.addProperty("ValidFrom", "");
coPersonRole.addProperty("ValidFrom", new Date().toString()); coPersonRole.addProperty("ValidThrough", "");
} else {
coPersonRole.addProperty("ValidThrough", new Date().toString());
}
coPersonRoles.add(coPersonRole); coPersonRoles.add(coPersonRole);
role.addProperty("RequestType", "CoPersonRoles"); role.addProperty("RequestType", "CoPersonRoles");
role.addProperty("Version", version); role.addProperty("Version", version);

View File

@ -0,0 +1,48 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class AggregatorsHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate;
String baseAddress;
public AggregatorsHystrixCommand(String baseAddress, RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
String url = baseAddress + "/resources" +
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository Aggregator " +
" or datasourcetypename exact Publication Repository Aggregator )";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) ((Map) rs.getBody()).get("meta");
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,47 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class DataRepositoriesHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate ;
private String baseAddress;
public DataRepositoriesHystrixCommand(String baseAddress,RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() {
String url = baseAddress+"/resources" +
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Data Repository ";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page",0)
.queryParam("size",0)
.queryParam("format","json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
Map metadata = (Map) ((Map)rs.getBody()).get("meta");
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,44 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class DatasetsHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate;
String baseAddress;
public DatasetsHystrixCommand(String baseAddress,RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.restTemplate = restTemplate;
this.baseAddress = baseAddress;
}
@Override
protected String run() throws Exception {
String url = baseAddress+"/datasets/count";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) (rs.getBody());
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,48 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class JournalHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate;
private String baseAddress;
public JournalHystrixCommand(String baseAddress, RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
String url = baseAddress+"/resources"+
"?query= " +
" oaftype exact datasource and " +
" datasourcetypename exact Journal";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) ((Map) rs.getBody()).get("meta");
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,52 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LastYearUsageStatsHystrixCommand extends HystrixCommand<Map> {
RestTemplate restTemplate;
String usagestatsBaseAddress;
public LastYearUsageStatsHystrixCommand(String usagestatsBaseAddress,RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.usagestatsBaseAddress = usagestatsBaseAddress;
this.restTemplate = restTemplate;
}
@Override
protected Map run() throws Exception {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsBaseAddress + "/totals")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
List yearly_stats = (List) ((Map)rs.getBody()).get("yearly_stats");
Map lastYear = (Map) yearly_stats.get(yearly_stats.size()-1);
Integer downloads = (Integer) lastYear.get("downloads");
Integer views = (Integer) lastYear.get("views");
Integer year = (Integer) lastYear.get("year");
Map<String,Object> usagestats = new HashMap<>();
usagestats.put("number",String.valueOf(downloads+views));
usagestats.put("year",year);
return usagestats;
}
@Override
protected Map getFallback() {
return null;
}
}

View File

@ -0,0 +1,49 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class LiteratureHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate;
private String baseAddress;
public LiteratureHystrixCommand(String baseAddress , RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
String url = baseAddress+"/resources"+
"?query= " +
" oaftype exact datasource and " +
" ( datasourcetypename exact Institutional Repository " +
" or datasourcetypename exact Publication Repository )";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) ((Map) rs.getBody()).get("meta");
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,45 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class PublicationHystrixCommand extends HystrixCommand<String> {
RestTemplate restTemplate;
private String baseAddress;
public PublicationHystrixCommand(String baseAddress, RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() throws Exception {
String url = baseAddress + "/publications/count";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) (rs.getBody());
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,44 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class SoftwareHystrixCommand extends HystrixCommand<String> {
String baseAddress;
RestTemplate restTemplate;
public SoftwareHystrixCommand(String baseAddress, RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.baseAddress = baseAddress;
this.restTemplate = restTemplate;
}
@Override
protected String run() {
String url = baseAddress + "/software/count";
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("page", 0)
.queryParam("size", 0)
.queryParam("format", "json")
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
Map metadata = (Map) (rs.getBody());
return String.valueOf(metadata.get("total"));
}
@Override
protected String getFallback() {
return null;
}
}

View File

@ -0,0 +1,43 @@
package eu.dnetlib.repo.manager.service.customHystrixCommands;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
public class UsageStatsTotalHystrixCommand extends HystrixCommand<Integer> {
RestTemplate restTemplate ;
String usagestatsEvents;
public UsageStatsTotalHystrixCommand(String usagestatsEvents,RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
this.usagestatsEvents = usagestatsEvents;
this.restTemplate = restTemplate;
}
@Override
protected Integer run() {
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(usagestatsEvents)
.build().encode();
ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
Map metadata = (Map) ((Map)rs.getBody()).get("totals");
// String rs = restTemplate.getForObject(uriComponents.toUri(), String.class);
// JSONObject resultSet = new JSONObject(rs);
// JSONObject totals = resultSet.getJSONObject("totals");
return (Integer) metadata.get("events");
}
@Override
protected Integer getFallback() {
return null;
}
}

View File

@ -1,14 +1,11 @@
package eu.dnetlib.repo.manager.service.security; package eu.dnetlib.repo.manager.service.security;
import org.slf4j.Logger; import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Collection; import java.util.Collection;
import java.util.Objects; import java.util.Objects;
@ -17,13 +14,26 @@ import java.util.stream.Collectors;
@Service("roleMappingService") @Service("roleMappingService")
public class AaiRoleMappingService implements RoleMappingService { public class AaiRoleMappingService implements RoleMappingService {
private static final Logger logger = LoggerFactory.getLogger(AaiRoleMappingService.class); private static final Logger logger = Logger.getLogger(AaiRoleMappingService.class);
@Value("${services.provide.aai.registry.production:true}") @Value("${services.provide.aai.registry.production:true}")
private boolean production; private boolean production;
private String createRepoRoleName(String prefix, String repoId) {
return prefix + "." + repoId.replace(":", "$");
}
@Override @Override
public String getRepositoryId(String roleId) { public String getRepoNameWithoutType(String fullName, String prefix) {
if (fullName != null && prefix != null && fullName.startsWith(prefix)) {
return fullName.substring(prefix.length());
}
return null;
}
@Override
public String getRepoIdByRoleId(String roleId) {
if (!roleActive(roleId)) { if (!roleActive(roleId)) {
return null; return null;
} }
@ -31,46 +41,43 @@ public class AaiRoleMappingService implements RoleMappingService {
} }
@Override @Override
public Collection<String> getRepositoryIds(Collection<String> roleIds) { public Collection<String> getRepoIdsByRoleIds(Collection<String> roleIds) {
return roleIds return roleIds
.stream() .stream()
.map(this::getRepositoryId) //.filter(this::roleActive) // implicitly executed in the next statement
.map(this::getRepoIdByRoleId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override @Override
public String getRole(String repoId) { public String getRoleIdByRepoId(String repoId) {
String role = null; String roleId = "";
String prefix = (production ? "" : "beta.") + "datasource"; String prefix = (production ? "" : "beta.") + "datasource";
if (repoId != null) { if (repoId != null) {
role = createRole(prefix, repoId); roleId = createRepoRoleName(prefix, repoId);
return roleId;
} else {
return null;
} }
return role;
} }
@Override @Override
public Collection<String> getRoles(Collection<String> repoIds) { public Collection<String> getRoleIdsByRepoIds(Collection<String> repoIds) {
return repoIds return repoIds
.stream() .stream()
.map(this::getRole) .map(this::getRoleIdByRepoId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override @Override
public String authorityToRepositoryId(GrantedAuthority authority) { public String convertAuthorityIdToRepoId(String authorityId) {
String repo = null; String repo = "";
String auth = null; if (authorityId != null && roleActive(authorityId)) {
try { repo = authorityId
auth = URLDecoder.decode(authority.getAuthority(), "UTF-8").toLowerCase(); .replaceFirst(".*datasource\\.", "")
} catch (UnsupportedEncodingException e) {
logger.error("", e);
}
if (auth != null && roleActive(auth)) {
repo = auth
.replaceFirst(".*datasource\\_", "")
.replace("$", ":") .replace("$", ":")
.toLowerCase(); .toLowerCase();
} }
@ -78,26 +85,12 @@ public class AaiRoleMappingService implements RoleMappingService {
} }
@Override @Override
public GrantedAuthority repositoryIdToAuthority(String repoId) { public String convertAuthorityToRepoId(GrantedAuthority authority) {
String role = null; return convertAuthorityIdToRepoId(authority.toString());
try {
role = URLEncoder.encode(convertRepoIdToAuthorityId(repoId), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("", e);
}
return new SimpleGrantedAuthority(role);
} }
private String createRole(String prefix, String repoId) { @Override
return prefix + "." + repoId.replace(":", "$"); public String convertRepoIdToAuthorityId(String repoId) {
}
private boolean roleActive(String roleId) {
return (production && !roleId.toLowerCase().startsWith("beta"))
|| (!production && roleId.toLowerCase().startsWith("beta"));
}
private String convertRepoIdToAuthorityId(String repoId) {
StringBuilder roleBuilder = new StringBuilder(); StringBuilder roleBuilder = new StringBuilder();
String role = ""; String role = "";
if (repoId != null) { if (repoId != null) {
@ -108,4 +101,20 @@ public class AaiRoleMappingService implements RoleMappingService {
} }
return role; return role;
} }
@Override
public String convertRepoIdToEncodedAuthorityId(String repoId) {
return URLEncoder.encode(convertRepoIdToAuthorityId(repoId));
}
@Override
public SimpleGrantedAuthority convertRepoIdToAuthority(String repoId) {
String role = convertRepoIdToEncodedAuthorityId(repoId);
return new SimpleGrantedAuthority(role);
}
private boolean roleActive(String roleId) {
return (production && !roleId.toLowerCase().startsWith("beta."))
|| (!production && roleId.toLowerCase().startsWith("beta."));
}
} }

View File

@ -2,13 +2,10 @@ package eu.dnetlib.repo.manager.service.security;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.nimbusds.jose.util.StandardCharset; import org.apache.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -16,8 +13,8 @@ import java.util.regex.Pattern;
public class AuthoritiesMapper { public class AuthoritiesMapper {
private static final Logger logger = LoggerFactory.getLogger(AuthoritiesMapper.class); private static final Logger logger = Logger.getLogger(AuthoritiesMapper.class);
private static final Pattern ENTITLEMENT_REGEX = Pattern.compile("urn:geant:openaire[.]eu:group:([^:]*):?(.*)?:role=member#aai[.]openaire[.]eu"); private static final String ENTITLEMENT_REGEX = "urn:geant:openaire[.]eu:group:([^:]*):?(.*)?:role=member#aai[.]openaire[.]eu";
private AuthoritiesMapper() { private AuthoritiesMapper() {
} }
@ -28,24 +25,22 @@ public class AuthoritiesMapper {
return authorities; return authorities;
} }
public static List<String> entitlementRoles(JsonArray entitlements) throws UnsupportedEncodingException { public static List<String> entitlementRoles(JsonArray entitlements) {
List<String> roles = new ArrayList<>(); List<String> roles = new ArrayList<>();
if (entitlements != null) { if (entitlements != null) {
for (JsonElement obj : entitlements) { for (JsonElement obj : entitlements) {
Matcher matcher = ENTITLEMENT_REGEX.matcher(obj.getAsString()); Matcher matcher = Pattern.compile(ENTITLEMENT_REGEX).matcher(obj.getAsString());
if (matcher.find()) { if (matcher.find()) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String group1 = matcher.group(1); if (matcher.group(1) != null && matcher.group(1).length() > 0) {
if (group1 != null && group1.length() > 0) { sb.append(matcher.group(1));
sb.append(group1);
} }
String group2 = matcher.group(2); if (matcher.group(2).length() > 0) {
if (group2.length() > 0) {
sb.append(":"); sb.append(":");
sb.append(group2); sb.append(matcher.group(2));
} }
String role = sb.toString().replace("+", " "); String role = sb.toString().replace("+", " ");
roles.add(URLDecoder.decode(role, StandardCharset.UTF_8.name())); roles.add(URLDecoder.decode(role));
} }
} }
} }
@ -55,20 +50,18 @@ public class AuthoritiesMapper {
private static void entityRoles(JsonArray entitlements, Set<GrantedAuthority> authorities) { private static void entityRoles(JsonArray entitlements, Set<GrantedAuthority> authorities) {
if (entitlements != null) { if (entitlements != null) {
for (JsonElement obj : entitlements) { for (JsonElement obj : entitlements) {
Matcher matcher = ENTITLEMENT_REGEX.matcher(obj.getAsString()); Matcher matcher = Pattern.compile(ENTITLEMENT_REGEX).matcher(obj.getAsString());
if (matcher.find()) { if (matcher.find()) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String group1 = matcher.group(1); if (matcher.group(1) != null && matcher.group(1).length() > 0) {
if (group1 != null && group1.length() > 0) { sb.append(matcher.group(1).replace("+-+", "_").replaceAll("[+.]", "_").toUpperCase());
sb.append(group1.replace("+-+", "_").replaceAll("[+.]", "_").toUpperCase());
} }
String group2 = matcher.group(2); if (matcher.group(2).length() > 0) {
if (group2.length() > 0) {
sb.append("_"); sb.append("_");
if (group2.equals("admins")) { if (matcher.group(2).equals("admins")) {
sb.append("MANAGER"); sb.append("MANAGER");
} else { } else {
sb.append(group2.toUpperCase()); sb.append(matcher.group(2).toUpperCase());
} }
} }
authorities.add(new SimpleGrantedAuthority(sb.toString())); authorities.add(new SimpleGrantedAuthority(sb.toString()));

Some files were not shown because too many files have changed in this diff Show More