Skip to content

Commit e64b50c

Browse files
authored
Merge pull request #594 from ngeorges-cnrs/multi_api
Update architecture for internal API, remove vip-api.conf
2 parents fef854f + 221eaa7 commit e64b50c

File tree

79 files changed

+655
-662
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+655
-662
lines changed

vip-api/pom.xml

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -78,43 +78,6 @@ knowledge of the CeCILL-B license and that you accept its terms.
7878
<artifactId>spring-webmvc</artifactId>
7979
<version>${spring-framework.version}</version>
8080
</dependency>
81-
<dependency>
82-
<groupId>org.springframework.security</groupId>
83-
<artifactId>spring-security-config</artifactId>
84-
<version>${springsecurity.version}</version>
85-
</dependency>
86-
<dependency>
87-
<groupId>org.springframework.security</groupId>
88-
<artifactId>spring-security-oauth2-client</artifactId>
89-
<version>${springoauth.version}</version>
90-
</dependency>
91-
<dependency>
92-
<groupId>org.springframework.security</groupId>
93-
<artifactId>spring-security-oauth2-jose</artifactId>
94-
<version>${springoauth.version}</version>
95-
</dependency>
96-
<dependency>
97-
<groupId>org.springframework.security</groupId>
98-
<artifactId>spring-security-web</artifactId>
99-
<version>${springsecurity.version}</version>
100-
</dependency>
101-
<dependency>
102-
<groupId>org.springframework.security</groupId>
103-
<artifactId>spring-security-oauth2-resource-server</artifactId>
104-
<version>${springoauth.version}</version>
105-
</dependency>
106-
107-
<!-- Validation implementation -->
108-
<dependency>
109-
<groupId>org.hibernate.validator</groupId>
110-
<artifactId>hibernate-validator</artifactId>
111-
<version>8.0.1.Final</version>
112-
</dependency>
113-
<dependency>
114-
<groupId>org.glassfish</groupId>
115-
<artifactId>jakarta.el</artifactId>
116-
<version>4.0.2</version>
117-
</dependency>
11881

11982
<!-- Test dependencies -->
12083

vip-api/src/main/java/fr/insalyon/creatis/vip/api/ApiPropertiesInitializer.java

Lines changed: 0 additions & 120 deletions
This file was deleted.

vip-api/src/main/java/fr/insalyon/creatis/vip/api/SpringWebConfig.java renamed to vip-api/src/main/java/fr/insalyon/creatis/vip/api/SpringRestApiConfig.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@
3434
import fr.insalyon.creatis.vip.api.business.VipConfigurer;
3535
import org.springframework.beans.factory.annotation.Autowired;
3636
import org.springframework.context.annotation.Configuration;
37-
import org.springframework.core.env.Environment;
3837
import org.springframework.web.servlet.config.annotation.*;
38+
import org.springframework.context.annotation.ComponentScan;
39+
import org.springframework.context.annotation.FilterType;
40+
import org.springframework.web.bind.annotation.RestController;
3941

4042
import java.util.Collections;
4143

42-
import static fr.insalyon.creatis.vip.api.CarminProperties.CORS_AUTHORIZED_DOMAINS;
44+
import fr.insalyon.creatis.vip.core.server.business.Server;
4345

4446
/**
4547
* Configure the spring mvc DispatcherServlet. Few things to do, as the
@@ -52,14 +54,19 @@
5254
*/
5355
@EnableWebMvc
5456
@Configuration
55-
public class SpringWebConfig implements WebMvcConfigurer {
57+
// Scan all controllers in vip-api (other vip-api beans are already scanned by SpringCoreConfig)
58+
@ComponentScan(
59+
basePackages = "fr.insalyon.creatis.vip.api",
60+
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = RestController.class)}
61+
)
62+
public class SpringRestApiConfig implements WebMvcConfigurer {
5663

57-
private final Environment env;
64+
private final Server server;
5865
private final VipConfigurer vipConfigurer;
5966

6067
@Autowired
61-
public SpringWebConfig(Environment env, VipConfigurer vipConfigurer) {
62-
this.env = env;
68+
public SpringRestApiConfig(Server server, VipConfigurer vipConfigurer) {
69+
this.server = server;
6370
this.vipConfigurer = vipConfigurer;
6471
}
6572

@@ -85,7 +92,7 @@ public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
8592
public void addCorsMappings(CorsRegistry registry) {
8693
registry.addMapping("/**")
8794
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
88-
.allowedOrigins(env.getRequiredProperty(CORS_AUTHORIZED_DOMAINS, String[].class));
95+
.allowedOrigins(server.getCarminCorsAuthorizedDomains());
8996
}
9097

9198
/*

vip-api/src/main/java/fr/insalyon/creatis/vip/api/business/ApiBusiness.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
package fr.insalyon.creatis.vip.api.business;
22

3-
import fr.insalyon.creatis.vip.api.CarminProperties;
4-
import fr.insalyon.creatis.vip.api.exception.ApiException;
3+
import fr.insalyon.creatis.vip.core.server.exception.ApiException;
54
import fr.insalyon.creatis.vip.api.model.AuthenticationCredentials;
65
import fr.insalyon.creatis.vip.api.model.AuthenticationInfo;
76
import fr.insalyon.creatis.vip.core.client.bean.User;
87
import fr.insalyon.creatis.vip.core.client.view.CoreConstants;
8+
import fr.insalyon.creatis.vip.core.server.business.Server;
99
import fr.insalyon.creatis.vip.core.server.business.BusinessException;
1010
import fr.insalyon.creatis.vip.core.server.business.ConfigurationBusiness;
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
13-
import org.springframework.core.env.Environment;
1413
import org.springframework.stereotype.Service;
1514

1615
@Service
1716
public class ApiBusiness {
1817

1918
private final Logger logger = LoggerFactory.getLogger(getClass());
2019

21-
private final Environment env;
20+
private final Server server;
2221
private final ConfigurationBusiness configurationBusiness;
2322

24-
public ApiBusiness(Environment env, ConfigurationBusiness configurationBusiness) {
25-
this.env = env;
23+
public ApiBusiness(Server server, ConfigurationBusiness configurationBusiness) {
24+
this.server = server;
2625
this.configurationBusiness = configurationBusiness;
2726
}
2827

@@ -45,7 +44,7 @@ public AuthenticationInfo authenticate(AuthenticationCredentials authCreds, bool
4544
authInfo.setHttpHeader(CoreConstants.COOKIES_SESSION);
4645
authInfo.setHttpHeaderValue(user.getSession());
4746
} else {
48-
authInfo.setHttpHeader(env.getProperty(CarminProperties.APIKEY_HEADER_NAME));
47+
authInfo.setHttpHeader(server.getApikeyHeaderName());
4948
String apikey = getAnApikeyForUser(username); // the username is an email
5049
authInfo.setHttpHeaderValue(apikey);
5150
}
@@ -68,8 +67,7 @@ private User signin(String username, String password) throws ApiException {
6867
}
6968

7069
private String getAnApikeyForUser(String email) throws ApiException {
71-
boolean generateNewApiKey = env.getRequiredProperty(
72-
CarminProperties.APIKEY_GENERATE_NEW_EACH_TIME, Boolean.class);
70+
boolean generateNewApiKey = server.getCarminApikeyGenerateNewEachTime();
7371
try {
7472
if (generateNewApiKey) {
7573
logger.info("generating a new apikey for " + email);

vip-api/src/main/java/fr/insalyon/creatis/vip/api/business/ApiUserBusiness.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package fr.insalyon.creatis.vip.api.business;
22

3-
import fr.insalyon.creatis.vip.api.exception.ApiException;
3+
import fr.insalyon.creatis.vip.core.server.exception.ApiException;
44
import fr.insalyon.creatis.vip.core.client.bean.User;
55
import fr.insalyon.creatis.vip.core.server.business.BusinessException;
66
import fr.insalyon.creatis.vip.core.server.business.ConfigurationBusiness;

vip-api/src/main/java/fr/insalyon/creatis/vip/api/business/DataApiBusiness.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@
3131
*/
3232
package fr.insalyon.creatis.vip.api.business;
3333

34-
import fr.insalyon.creatis.vip.api.CarminProperties;
35-
import fr.insalyon.creatis.vip.api.exception.ApiException;
36-
import fr.insalyon.creatis.vip.api.exception.ApiException.ApiError;
34+
import fr.insalyon.creatis.vip.core.server.exception.ApiException;
35+
import fr.insalyon.creatis.vip.core.server.exception.ApiException.ApiError;
3736
import fr.insalyon.creatis.vip.api.model.PathProperties;
3837
import fr.insalyon.creatis.vip.api.model.UploadData;
3938
import fr.insalyon.creatis.vip.api.model.UploadDataType;
@@ -54,7 +53,6 @@
5453
import org.slf4j.Logger;
5554
import org.slf4j.LoggerFactory;
5655
import org.springframework.beans.factory.annotation.Autowired;
57-
import org.springframework.core.env.Environment;
5856
import org.springframework.stereotype.Service;
5957

6058
import jakarta.annotation.PreDestroy;
@@ -85,7 +83,7 @@ public class DataApiBusiness {
8583

8684
private final Logger logger = LoggerFactory.getLogger(getClass());
8785

88-
private final Environment env;
86+
private final Server server;
8987
private final Supplier<User> currentUserProvider;
9088

9189
private final LFCBusiness lfcBusiness;
@@ -97,11 +95,11 @@ public class DataApiBusiness {
9795

9896
@Autowired
9997
public DataApiBusiness(
100-
Environment env, Supplier<User> currentUserProvider,
98+
Server server, Supplier<User> currentUserProvider,
10199
LFCBusiness lfcBusiness, TransferPoolBusiness transferPoolBusiness,
102100
LFCPermissionBusiness lfcPermissionBusiness,
103-
DataManagerBusiness dataManagerBusiness, Server server) {
104-
this.env = env;
101+
DataManagerBusiness dataManagerBusiness) {
102+
this.server = server;
105103
this.currentUserProvider = currentUserProvider;
106104
this.lfcBusiness = lfcBusiness;
107105
this.transferPoolBusiness = transferPoolBusiness;
@@ -170,7 +168,7 @@ public PathProperties getPathProperties(String path ) throws ApiException {
170168
pathProperties.setSize((long) fileData.size());
171169
pathProperties.setLastModificationDate(
172170
baseGetFileModificationDate(path) / 1000);
173-
pathProperties.setMimeType(env.getProperty(CarminProperties.API_DIRECTORY_MIME_TYPE));
171+
pathProperties.setMimeType(server.getCarminApiDirectoryMimeType());
174172
}
175173
return pathProperties;
176174
}
@@ -288,7 +286,7 @@ private void checkDownloadPermission(String path) throws ApiException {
288286
}
289287
// path exists and is a file: check its size
290288
List<Data> fileData = baseGetFileData(path);
291-
Long maxSize = env.getRequiredProperty(CarminProperties.API_DATA_TRANSFERT_MAX_SIZE, Long.class);
289+
Long maxSize = server.getCarminApiDataTransfertMaxSize();
292290
if (fileData.get(0).getLength() > maxSize) {
293291
logger.error("Trying to download a file too big ({})", path);
294292
throw new ApiException("Illegal data API access");
@@ -372,11 +370,11 @@ private void timeoutOperationCompletionFuture (
372370
}
373371

374372
private Integer getRetryDelay() {
375-
return env.getProperty(CarminProperties.API_DOWNLOAD_RETRY_IN_SECONDS, Integer.class);
373+
return server.getCarminApiDownloadRetryInSeconds();
376374
}
377375

378376
private Integer getTimeout() {
379-
return env.getProperty(CarminProperties.API_DOWNLOAD_TIMEOUT_IN_SECONDS, Integer.class);
377+
return server.getCarminApiDownloadTimeoutInSeconds();
380378
}
381379

382380
private boolean isOperationOver(String operationId, User user)
@@ -441,7 +439,7 @@ private boolean saveInputStreamToFile(InputStream is, String path) throws ApiExc
441439
private PathProperties getRootPathProperties() {
442440
PathProperties rootPathProperties = new PathProperties();
443441
rootPathProperties.setExists(true);
444-
rootPathProperties.setMimeType(env.getProperty(CarminProperties.API_DIRECTORY_MIME_TYPE));
442+
rootPathProperties.setMimeType(server.getCarminApiDirectoryMimeType());
445443
rootPathProperties.setIsDirectory(true);
446444
rootPathProperties.setSize((long) getRootDirectoriesName().size());
447445
rootPathProperties.setPath(ROOT);
@@ -470,7 +468,7 @@ private List<String> getRootDirectoriesName() {
470468
private PathProperties getRootSubDirPathProperties(String name) {
471469
PathProperties rootPathProperties = new PathProperties();
472470
rootPathProperties.setExists(true);
473-
rootPathProperties.setMimeType(env.getProperty(CarminProperties.API_DIRECTORY_MIME_TYPE));
471+
rootPathProperties.setMimeType(server.getCarminApiDirectoryMimeType());
474472
rootPathProperties.setIsDirectory(true);
475473
// TODO : size ?
476474
rootPathProperties.setPath(ROOT + "/" + name);
@@ -489,7 +487,7 @@ private PathProperties buildPathFromLfcData(String path, Data lfcData) {
489487
|| lfcData.getType().equals(Data.Type.folderSync);
490488
pathProperties.setIsDirectory(isDirectory);
491489
if (isDirectory) {
492-
pathProperties.setMimeType(env.getProperty(CarminProperties.API_DIRECTORY_MIME_TYPE));
490+
pathProperties.setMimeType(server.getCarminApiDirectoryMimeType());
493491
} else {
494492
pathProperties.setMimeType(getMimeType(lfcData.getName()));
495493
}
@@ -512,9 +510,7 @@ private Long getTimeStampFromGridaFormatDate(String gridaFormatDate) {
512510
private String getMimeType(String path) {
513511
try {
514512
String contentType = Files.probeContentType(Paths.get(path));
515-
return contentType == null ?
516-
env.getProperty(CarminProperties.API_DEFAULT_MIME_TYPE) :
517-
contentType;
513+
return contentType == null ? server.getCarminApiDefaultMimeType() : contentType;
518514
} catch (IOException e) {
519515
logger.warn("Cant detect mime type of {}. Ignoring and returning application/octet-stream",
520516
path, e);

0 commit comments

Comments
 (0)