Skip to content
Snippets Groups Projects
Verified Commit 25323dbb authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: make repositories configurable

parent ce331b23
No related branches found
No related tags found
No related merge requests found
Pipeline #48661 passed
......@@ -3,3 +3,4 @@
.project
.m2/
target/
repositories/*
package com.indiscale.fdo.manager.service;
import com.indiscale.fdo.DefaultManager;
import com.indiscale.fdo.DefaultProfileRegistry;
import com.indiscale.fdo.DefaultRepositoryRegistry;
import com.indiscale.fdo.DelegatorManager;
import com.indiscale.fdo.api.FdoProfile;
import com.indiscale.fdo.api.Manager;
import com.indiscale.fdo.api.RepositoryConfig;
import com.indiscale.fdo.api.UnknownRepositoryTypeException;
import com.indiscale.fdo.doip.DoipRepositoryFactory;
import com.indiscale.fdo.manager.service.mock.MockManager;
import com.indiscale.fdo.profiles.GenericFdoProfile;
import com.indiscale.fdo.util.Util;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
......@@ -17,6 +31,60 @@ import stormpot.Timeout;
@Service
public class ManagerPool {
private static DefaultRepositoryRegistry registry = null;
private static List<RepositoryConfig> getConfig()
throws IOException, UnknownRepositoryTypeException {
List<RepositoryConfig> result = new ArrayList<>();
String repositoriesProperty = System.getProperty("repositoriesDir", "repositories");
File repositoriesDir = new File(repositoriesProperty);
if (repositoriesDir.isDirectory()) {
for (File repo :
repositoriesDir.listFiles(
new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".json") && !new File(dir, name).isDirectory();
}
})) {
RepositoryConfig config = Util.jsonToRepositoryConfig(repo);
registry.registerRepository(config);
}
} else {
throw new IOException(
"ERROR: cannot read repository config directory: " + repositoriesProperty);
}
return result;
}
private static DefaultRepositoryRegistry getRepositoryRegistry() {
if (registry == null) {
registry = new DefaultRepositoryRegistry(new DoipRepositoryFactory());
try {
for (RepositoryConfig config : getConfig()) {
registry.registerRepository(config);
}
} catch (IOException | UnknownRepositoryTypeException e) {
e.printStackTrace();
}
}
return registry;
}
private static DefaultManager createManager() {
DefaultManager result = new DefaultManager(getRepositoryRegistry(), getProfileRegistry());
return result;
}
private static DefaultProfileRegistry<FdoProfile> getProfileRegistry() {
DefaultProfileRegistry<FdoProfile> result = new DefaultProfileRegistry<>();
result.registerProfile(new GenericFdoProfile());
return result;
}
public static class PooledManager extends DelegatorManager implements Poolable {
private Slot slot;
......@@ -72,7 +140,11 @@ public class ManagerPool {
@Override
public Manager create() {
return new MockManager();
if (System.getProperty("mock", "false").equals("true")) {
return new MockManager();
} else {
return createManager();
}
}
}))
.build();
......
......@@ -6,8 +6,10 @@ import com.indiscale.fdo.DefaultData;
import com.indiscale.fdo.DefaultMetadat;
import com.indiscale.fdo.api.DigitalObject;
import com.indiscale.fdo.api.FDO;
import com.indiscale.fdo.api.FdoProfile;
import com.indiscale.fdo.api.InputStreamSource;
import com.indiscale.fdo.api.Manager;
import com.indiscale.fdo.api.PidUnresolvableException;
import com.indiscale.fdo.api.RepositoryConnection;
import com.indiscale.fdo.api.UnknownRepositoryException;
import com.indiscale.fdo.api.ValidationException;
......@@ -16,6 +18,7 @@ import com.indiscale.fdo.manager.service.api.model.Links;
import com.indiscale.fdo.manager.service.api.model.ResolvePID200Response;
import com.indiscale.fdo.manager.service.api.model.TargetRepositories;
import com.indiscale.fdo.manager.service.api.operation.FdoApi;
import com.indiscale.fdo.profiles.GenericFdoProfile;
import jakarta.validation.Valid;
import java.io.IOException;
import java.io.InputStream;
......@@ -84,7 +87,10 @@ public class FDOApiImpl extends BaseController implements FdoApi {
try (Manager manager = getManager()) {
RepositoryConnection repository =
manager.getRepositoryRegistry().createRepositoryConnection(repositories.getFdo());
FDO fdo = manager.createFDO(repository, new DataWrapper(data), new MetadataWrapper(metadata));
FdoProfile profile = manager.getProfileRegistry().getProfile(GenericFdoProfile.ID);
FDO fdo =
manager.createFDO(
profile, repository, new DataWrapper(data), new MetadataWrapper(metadata));
getLogger().createFDO(fdo, repository);
URI location = linkTo(getOperations(FDOApiImpl.class).resolvePID(fdo.getPID())).toUri();
return ResponseEntity.created(location).build();
......@@ -99,12 +105,10 @@ public class FDOApiImpl extends BaseController implements FdoApi {
public ResponseEntity<ResolvePID200Response> resolvePID(String pid) {
try (Manager manager = getManager()) {
DigitalObject resolved = manager.resolvePID(pid);
if (resolved == null) {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "Not found. Could not resolve PID.");
}
return ResponseEntity.ok(createResponse(resolved));
} catch (PidUnresolvableException e) {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "Not found. Could not resolve PID " + e.getPid());
}
}
......
......@@ -2,10 +2,13 @@ package com.indiscale.fdo.manager.service.mock;
import com.indiscale.fdo.DelegatorFdo;
import com.indiscale.fdo.api.FDO;
import com.indiscale.fdo.api.FdoComponent;
import com.indiscale.fdo.api.FdoUpdate;
import com.indiscale.fdo.api.RepositoryConfig;
import com.indiscale.fdo.api.RepositoryConnection;
import com.indiscale.fdo.api.RepositoryConnectionFactory;
import com.indiscale.fdo.api.RepositoryType;
import com.indiscale.fdo.api.TokenAuthenticationInfo;
import com.indiscale.fdo.api.ValidationException;
import java.util.UUID;
......@@ -56,6 +59,28 @@ class MockRepository implements RepositoryConnection {
public FDO createFDO(FDO fdo) throws ValidationException {
return new MockFDO(fdo);
}
@Override
public <T extends FdoComponent> T copyFdoComponent(T component) {
// TODO Auto-generated method stub
return null;
}
@Override
public FDO updateFdo(FdoUpdate fdo) {
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteFdoComponent(FdoComponent oldComponent, String newPid) {
// TODO Auto-generated method stub
}
@Override
public void setTokenAuthenticationInfo(TokenAuthenticationInfo authentication) {
// TODO Auto-generated method stub
}
}
public class MockRepositoryFactory implements RepositoryConnectionFactory {
......
# Repositories
You can define your repositories in this directory. Do so by putting `*.json`
files into this directory containing the repository's details, e.g
```json
{
"type": "DOIP",
"id": "linkahead",
"attributes": {
"typeDo": "0.TYPE/DO",
"typeFdo": "21.T11969/FDO_TYPE",
"typeDataRef": "21.T11969/867134e94b3ec5afc6fe",
"typeMDRef": "21.T11969/a02253b264a9f2f1cf9a",
"host": "localhost",
"port": "8888",
"serviceId": "Unknown",
"publicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmhq6sx/A430Fd8YgOcL4coD2mmcIgh1UroTjY+Z87QadCKnDlTrat8wDGTH+MJzRorT+RyKv/2gEyxTO9R1Kp9ARkNWasWIh/gLuQkFxbTWAEKLzOnNnl9MP7Cupapm//Pi7u5O1KHPVZ2cMh0sYloHOM/i0RZ6/yBIBkhgz0S1UeHb4CNF7rPVxXwnCDK6WhWzhwp/SqSXyoQ7qnX6DunECuX0HJ9HJ0NbJqFRlXnA8U6EbOlfQWpaUFxzKGi6+DpQNeLKUAFhkrau5AnP93GagYG72uwGBLQpu1QxPyQSTfGpyCQHER9kqeI6Yg/WszsAXEEdlVgCj/IcKSqnk6QIDAQAB"
}
}
```
You can change the repository by setting the `repositoriesDir` java property at
start up (e.g. with
```shell
java -DrepositoriesDir="/path/to/repositoriesDir" -jar fdo-manager-service.jar`
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment