risdenk commented on a change in pull request #164: KNOX-2053 - New REST API to
create/read/update/delete service definitions
URL: https://github.com/apache/knox/pull/164#discussion_r335598293
##########
File path:
gateway-server/src/main/java/org/apache/knox/gateway/services/registry/impl/DefaultServiceDefinitionRegistry.java
##########
@@ -82,15 +127,152 @@ public void stop() throws ServiceLifecycleException {
@Override
public ServiceDefEntry getMatchingService(String urlPattern) {
- Matcher<ServiceDefEntry>.Match match = null;
+ readLock.lock();
+ try {
+ Matcher<ServiceDefEntry>.Match match = null;
+ try {
+ match = entries.match(Parser.parseLiteral(urlPattern));
+ } catch (URISyntaxException e) {
+ LOG.failedToParsePath(urlPattern, e);
+ }
+ if (match != null) {
+ return match.getValue();
+ }
+ return null;
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ @Override
+ public Set<ServiceDefinitionPair> getServiceDefinitions() {
+ readLock.lock();
try {
- match = entries.match(Parser.parseLiteral(urlPattern));
- } catch ( URISyntaxException e ) {
- LOG.failedToParsePath(urlPattern, e);
+ return serviceDefinitions;
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ @Override
+ public void saveServiceDefinition(ServiceDefinitionPair serviceDefinition)
throws ServiceDefinitionRegistryException {
+ saveOrUpdateServiceDefinition(serviceDefinition, false);
+ }
+
+ @Override
+ public void saveOrUpdateServiceDefinition(ServiceDefinitionPair
serviceDefinition) throws ServiceDefinitionRegistryException {
+ saveOrUpdateServiceDefinition(serviceDefinition, true);
+ }
+
+ public void saveOrUpdateServiceDefinition(ServiceDefinitionPair
serviceDefinition, boolean allowUpdate) throws
ServiceDefinitionRegistryException {
+ final ServiceDefinition service = serviceDefinition.getService();
+ final Optional<ServiceDefinition> persistedServiceDefinition =
findServiceDefinition(service.getName(), service.getRole(),
service.getVersion());
+ if (persistedServiceDefinition.isPresent() && !allowUpdate) {
+ throw new ServiceDefinitionRegistryException("The requested service
definition (" + serviceDefinition.toString() + ") already exists!");
+ } else {
+ writeLock.lock();
+ try {
+ final Path serviceDefinitionFolderPath =
createServiceDefinitionFolders(service.getName(), service.getVersion());
+ writeOutServiceDefinitionFile(service, serviceDefinitionFolderPath);
+ if (serviceDefinition.getRewriteRules() != null) {
+ writeOutRewriteRules(serviceDefinition.getRewriteRules(),
serviceDefinitionFolderPath);
+ }
+ populateServiceDefinitions();
+ } catch (JAXBException | IOException e) {
+ throw new ServiceDefinitionRegistryException("Error while persisting
service definition " + serviceDefinition.toString(), e);
+ } finally {
+ writeLock.unlock();
+ }
+ notifyListeners(service.getName(), service.getRole(),
service.getVersion());
+ }
+ }
+
+ private Path createServiceDefinitionFolders(String name, String version)
throws IOException {
+ final Path serviceDefinitionPath =
Paths.get(gatewayConfig.getGatewayServicesDir(), name, version);
+ return Files.createDirectories(serviceDefinitionPath);
+ }
+
+ private void writeOutServiceDefinitionFile(ServiceDefinition
serviceDefinition, Path serviceDefinitionFolderPath) throws JAXBException,
IOException {
+ final Marshaller marshaller = getJaxbContext().createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ try (BufferedWriter serviceDefinitionXmlFileWriter =
newBufferedWriter(Paths.get(serviceDefinitionFolderPath.toAbsolutePath().toString(),
SERVICE_DEFINITION_FILE_NAME),
Review comment:
Just for reference, since `serviceDefinitionFolderPath` is a Path object
already, shjould be able to do something like
`serviceDefinitionFolderPath.resolve` or another method that will get the child
path from it. (instead of converting to a string first)
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services