smolnar82 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_r335586160
 
 

 ##########
 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:
   I'll make this change and submit a new patch

----------------------------------------------------------------
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

Reply via email to