View Javadoc
1   package de.dlr.shepard.context.semantic.services;
2   
3   import de.dlr.shepard.auth.users.entities.User;
4   import de.dlr.shepard.auth.users.services.UserService;
5   import de.dlr.shepard.common.exceptions.InvalidBodyException;
6   import de.dlr.shepard.common.exceptions.InvalidPathException;
7   import de.dlr.shepard.common.util.DateHelper;
8   import de.dlr.shepard.common.util.QueryParamHelper;
9   import de.dlr.shepard.context.semantic.SemanticRepositoryConnectorFactory;
10  import de.dlr.shepard.context.semantic.daos.SemanticRepositoryDAO;
11  import de.dlr.shepard.context.semantic.entities.SemanticRepository;
12  import de.dlr.shepard.context.semantic.io.SemanticRepositoryIO;
13  import io.quarkus.logging.Log;
14  import jakarta.enterprise.context.RequestScoped;
15  import jakarta.inject.Inject;
16  import java.net.MalformedURLException;
17  import java.net.URL;
18  import java.util.List;
19  
20  @RequestScoped
21  public class SemanticRepositoryService {
22  
23    @Inject
24    SemanticRepositoryDAO semanticRepositoryDAO;
25  
26    @Inject
27    UserService userService;
28  
29    @Inject
30    DateHelper dateHelper;
31  
32    @Inject
33    SemanticRepositoryConnectorFactory semanticRepositoryConnectorFactory;
34  
35    public List<SemanticRepository> getAllRepositories(QueryParamHelper params) {
36      var repositories = semanticRepositoryDAO.findAllSemanticRepositories(params);
37      return repositories;
38    }
39  
40    /**
41     * Returns a semantic repository by Id
42     * @param id
43     * @return SemanticRepository
44     * @throws InvalidPathException if repository could not be found
45     */
46    public SemanticRepository getRepository(long id) {
47      var repository = semanticRepositoryDAO.findByNeo4jId(id);
48      if (repository == null || repository.isDeleted()) {
49        String errorMsg = String.format("ID ERROR - Semantic Repository with id %s is null or deleted", id);
50        Log.error(errorMsg);
51        throw new InvalidPathException(errorMsg);
52      }
53  
54      return repository;
55    }
56  
57    public SemanticRepository createRepository(SemanticRepositoryIO repositoryIO) {
58      User user = userService.getCurrentUser();
59      var toCreate = new SemanticRepository();
60      validateRepository(repositoryIO);
61  
62      toCreate.setCreatedAt(dateHelper.getDate());
63      toCreate.setCreatedBy(user);
64      toCreate.setName(repositoryIO.getName());
65      toCreate.setType(repositoryIO.getType());
66      toCreate.setEndpoint(repositoryIO.getEndpoint());
67  
68      var created = semanticRepositoryDAO.createOrUpdate(toCreate);
69      return created;
70    }
71  
72    /**
73     * Deletes a semantic repository by Id
74     *
75     * @param repositoryId
76     * @throws InvalidPathException if repository with repositoryId does not exist
77     */
78    public void deleteRepository(long repositoryId) {
79      SemanticRepository repository = getRepository(repositoryId);
80  
81      User user = userService.getCurrentUser();
82      repository.setDeleted(true);
83      repository.setUpdatedAt(dateHelper.getDate());
84      repository.setUpdatedBy(user);
85      semanticRepositoryDAO.createOrUpdate(repository);
86    }
87  
88    private void validateRepository(SemanticRepositoryIO repository) {
89      try {
90        new URL(repository.getEndpoint());
91      } catch (MalformedURLException e) {
92        Log.errorf("Malformed URL: %s", repository.getEndpoint());
93        throw new InvalidBodyException("Invalid endpoint");
94      }
95      var src = semanticRepositoryConnectorFactory.getRepositoryService(repository.getType(), repository.getEndpoint());
96      var alive = src.healthCheck();
97      if (!alive) {
98        Log.errorf("Endpoint not alive: %s", repository.getEndpoint());
99        throw new InvalidBodyException("Invalid endpoint");
100     }
101   }
102 }