All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.microcks.minion.async.SchemaRegistry Maven / Gradle / Ivy

/*
 * Copyright The Microcks Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.github.microcks.minion.async;

import io.github.microcks.domain.Resource;
import io.github.microcks.domain.ResourceType;
import io.github.microcks.domain.Service;
import io.github.microcks.minion.async.client.MicrocksAPIConnector;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.logging.Logger;

import jakarta.enterprise.context.ApplicationScoped;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * This is a simple and local registry for Async APIs schemas. It is used as a local proxy to Services Resources that
 * are available within Microcks instance. This registry uses the MicrocksAPIConnector to retrieve
 * resources/schemas from instance.
 * @author laurent
 */
@ApplicationScoped
public class SchemaRegistry {

   /** Get a JBoss logging logger. */
   private final Logger logger = Logger.getLogger(getClass());

   private final MicrocksAPIConnector microcksAPIConnector;

   /**
    * Create a new SchemaRegistry instance.
    * @param microcksAPIConnector The MicrocksAPIConnector to use for retrieving resources
    */
   public SchemaRegistry(@RestClient MicrocksAPIConnector microcksAPIConnector) {
      this.microcksAPIConnector = microcksAPIConnector;
   }

   /** The internal map backing schemas storage. This is an in-memory map. */
   private Map> schemaEntries = new HashMap<>();

   /**
    * Updating the registry with resources attached to specified service.
    * @param service The Service to retrieve resources for and update registry with
    */
   public void updateRegistryForService(Service service) {
      clearRegistryForService(service);
      List resources = microcksAPIConnector.getResources(service.getId());
      logger.infof("Updating schema registry for '%s - %s' with %d entries", service.getName(), service.getVersion(),
            resources.size());
      schemaEntries.put(service.getId(), resources.stream().map(SchemaEntry::new).toList());
   }

   /**
    * Updating the registry with resources attached to specified service.
    * @param serviceId The Id of service to retrieve resources for and update registry with
    */
   public void updateRegistryForService(String serviceId) {
      clearRegistryForService(serviceId);
      List resources = microcksAPIConnector.getResources(serviceId);
      logger.infof("Updating schema registry for Service '%s' with %d entries", serviceId, resources.size());
      schemaEntries.put(serviceId, resources.stream().map(SchemaEntry::new).toList());
   }

   /**
    * Retrieve the schema entries for a specified Service.
    * @param service The Service to get schema entries for
    * @return A list of {@code SchemaEntry}
    */
   public List getSchemaEntries(Service service) {
      return getSchemaEntries(service.getId());
   }

   /**
    * Retrieve the schema entries for a specified Service.
    * @param serviceId The Id of service to get schema entries for
    * @return A list of {@code SchemaEntry}
    */
   public List getSchemaEntries(String serviceId) {
      // Do we have local entries already ? If not, retrieve them.
      List entries = schemaEntries.get(serviceId);
      if (entries == null) {
         updateRegistryForService(serviceId);
         entries = schemaEntries.get(serviceId);
      }
      return entries;
   }

   /**
    * Get the content (ie. actual schema specification) of a Schema entry in the scope of a specified service.
    * @param service    The Service to get schema for
    * @param schemaName The name of the Schema entry to retrieve content for
    * @return The schema entry content or null if not found.
    */
   public String getSchemaEntryContent(Service service, String schemaName) {
      // Do we have local entries already ? If not, retrieve them.
      List entries = schemaEntries.get(service.getId());
      if (entries == null) {
         updateRegistryForService(service);
         entries = schemaEntries.get(service.getId());
      }
      // We have to look for entry matching schemaName.
      SchemaEntry correspondingEntry = null;
      for (SchemaEntry entry : entries) {
         if (entry.getName().equals(schemaName)) {
            correspondingEntry = entry;
            break;
         }
      }
      // Return the entry content if found.
      if (correspondingEntry != null) {
         return correspondingEntry.getContent();
      }
      return null;
   }

   /**
    * Clear the registry for specified service.
    * @param service The Service whose schema entries should be removed from registry.
    */
   public void clearRegistryForService(Service service) {
      schemaEntries.remove(service.getId());
   }

   /**
    * Clear the registry for specified service.
    * @param serviceId The identifier of Service whose schema entries should be removed from registry.
    */
   public void clearRegistryForService(String serviceId) {
      schemaEntries.remove(serviceId);
   }

   /**
    * SchemaEntry represents an image of remote resources and allow access to content. For now, content remains
    * in-memory but a future direction for handling load could be to manage overflow to local files.
    */
   public class SchemaEntry {
      private String name;
      private String serviceId;
      private String path;
      private ResourceType type;
      private String content;
      private Set operations;

      public SchemaEntry(Resource resource) {
         this.name = resource.getName();
         this.serviceId = resource.getServiceId();
         this.path = resource.getPath();
         this.type = resource.getType();
         this.content = resource.getContent();
         this.operations = resource.getOperations();
      }

      public String getName() {
         return name;
      }

      public String getServiceId() {
         return serviceId;
      }

      public String getPath() {
         return path;
      }

      public ResourceType getType() {
         return type;
      }

      public String getContent() {
         return content;
      }

      public Set getOperations() {
         return operations;
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy