| package org.eclipse.basyx.components.registry; |
| |
| import javax.servlet.http.HttpServlet; |
| |
| import org.eclipse.basyx.components.IComponent; |
| import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration; |
| import org.eclipse.basyx.components.configuration.BaSyxMongoDBConfiguration; |
| import org.eclipse.basyx.components.configuration.BaSyxSQLConfiguration; |
| import org.eclipse.basyx.components.registry.configuration.BaSyxRegistryConfiguration; |
| import org.eclipse.basyx.components.registry.configuration.RegistryBackend; |
| import org.eclipse.basyx.components.registry.servlet.InMemoryRegistryServlet; |
| import org.eclipse.basyx.components.registry.servlet.MongoDBRegistryServlet; |
| import org.eclipse.basyx.components.registry.servlet.SQLRegistryServlet; |
| import org.eclipse.basyx.vab.protocol.http.server.AASHTTPServer; |
| import org.eclipse.basyx.vab.protocol.http.server.BaSyxContext; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * Generic registry that can start and stop a registry with different kinds of backends. |
| * Currently supports MongoDB and SQL. For development purposes, the component can also start a |
| * registry without a backend and without persistency. |
| * |
| * @author espen |
| * |
| */ |
| public class RegistryComponent implements IComponent { |
| private static Logger logger = LoggerFactory.getLogger(RegistryComponent.class); |
| |
| // The server with the servlet that will be created |
| private AASHTTPServer server; |
| |
| // The component configuration |
| private BaSyxContextConfiguration contextConfig; |
| private BaSyxRegistryConfiguration registryConfig; |
| |
| // The backend configuration |
| private BaSyxMongoDBConfiguration mongoDBConfig; |
| private BaSyxSQLConfiguration sqlConfig; |
| |
| /** |
| * Default constructor that loads default configurations |
| */ |
| public RegistryComponent() { |
| contextConfig = new BaSyxContextConfiguration(); |
| registryConfig = new BaSyxRegistryConfiguration(); |
| } |
| |
| /** |
| * Constructor with given configuration for the registry and its server context. This constructor will create an |
| * InMemory registry. |
| * |
| * @param contextConfig The context configuration |
| */ |
| public RegistryComponent(BaSyxContextConfiguration contextConfig) { |
| this.contextConfig = contextConfig; |
| this.registryConfig = new BaSyxRegistryConfiguration(RegistryBackend.INMEMORY); |
| } |
| |
| /** |
| * Constructor with given configuration for the registry and its server context. This constructor will create a |
| * registry with a MongoDB backend. |
| * |
| * @param contextConfig The context configuration |
| * @param mongoDBConfig The mongoDB configuration |
| */ |
| public RegistryComponent(BaSyxContextConfiguration contextConfig, BaSyxMongoDBConfiguration mongoDBConfig) { |
| this.contextConfig = contextConfig; |
| this.registryConfig = new BaSyxRegistryConfiguration(RegistryBackend.MONGODB); |
| this.mongoDBConfig = mongoDBConfig; |
| } |
| |
| /** |
| * Constructor with given configuration for the registry and its server context. This constructor will create a |
| * registry with an SQL backend. |
| * |
| * @param contextConfig The context configuration |
| * @param sqlConfig The sql configuration |
| */ |
| public RegistryComponent(BaSyxContextConfiguration contextConfig, BaSyxSQLConfiguration sqlConfig) { |
| this.contextConfig = contextConfig; |
| this.registryConfig = new BaSyxRegistryConfiguration(RegistryBackend.SQL); |
| this.sqlConfig = sqlConfig; |
| } |
| |
| /** |
| * Constructor with given configuration for the registry and its server context. |
| * Will load the backend configuration using the default load process. |
| * |
| * @param contextConfig The context configuration |
| * @param registryConfig The registry configuration |
| */ |
| public RegistryComponent(BaSyxContextConfiguration contextConfig, BaSyxRegistryConfiguration registryConfig) { |
| this.contextConfig = contextConfig; |
| this.registryConfig = registryConfig; |
| } |
| |
| /** |
| * Starts the context at http://${hostName}:${port}/${path} |
| */ |
| @Override |
| public void startComponent() { |
| BaSyxContext context = contextConfig.createBaSyxContext(); |
| context.addServletMapping("/*", loadRegistryServlet()); |
| server = new AASHTTPServer(context); |
| server.start(); |
| logger.info("Registry server started"); |
| } |
| |
| /** |
| * Loads a registry with a backend according to the registryConfig |
| * |
| * @return |
| */ |
| private HttpServlet loadRegistryServlet() { |
| HttpServlet registryServlet = null; |
| RegistryBackend backendType = registryConfig.getRegistryBackend(); |
| switch(backendType) { |
| case MONGODB: |
| registryServlet = loadMongoDBRegistryServlet(); |
| break; |
| case SQL: |
| registryServlet = loadSQLRegistryServlet(); |
| break; |
| case INMEMORY: |
| registryServlet = loadInMemoryRegistryServlet(); |
| break; |
| } |
| return registryServlet; |
| } |
| |
| /** |
| * Creates a registry servlet with an sql backend |
| * |
| * @return |
| */ |
| private HttpServlet loadSQLRegistryServlet() { |
| logger.info("Loading SQLRegistry"); |
| BaSyxSQLConfiguration config; |
| if (this.sqlConfig == null) { |
| config = new BaSyxSQLConfiguration(); |
| config.loadFromDefaultSource(); |
| } else { |
| config = this.sqlConfig; |
| } |
| return new SQLRegistryServlet(config); |
| } |
| |
| /** |
| * Creates a registry servlet with an mongodb backend |
| * |
| * @return |
| */ |
| private HttpServlet loadMongoDBRegistryServlet() { |
| logger.info("Loading MongoDBRegistry"); |
| BaSyxMongoDBConfiguration config; |
| if (this.mongoDBConfig == null) { |
| config = new BaSyxMongoDBConfiguration(); |
| config.loadFromDefaultSource(); |
| } else { |
| config = this.mongoDBConfig; |
| } |
| return new MongoDBRegistryServlet(config); |
| } |
| |
| /** |
| * Creates an registry servlet with in memory data (=> not persistent) |
| * |
| * @return |
| */ |
| private HttpServlet loadInMemoryRegistryServlet() { |
| logger.info("Loading InMemoryRegistry"); |
| return new InMemoryRegistryServlet(); |
| } |
| |
| @Override |
| public void stopComponent() { |
| server.shutdown(); |
| logger.info("Registry server stopped"); |
| } |
| } |