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: us...@infra.apache.org With regards, Apache Git Services