METAMODEL-1166: Fixed caching of tenant and data source context
Closes #12
diff --git a/CHANGES.md b/CHANGES.md
index 78c1e34..0d5c6c6 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,5 +3,6 @@
* [METAMODEL-1153] - Added endpoints for deleting data sources.
* [METAMODEL-1147] - Implemented Swagger codegen to build model classes from swagger file.
* [METAMODEL-1149] - File based registry for tenant and data source information.
+* [METAMODEL-1166] - Caching of tenant and data source context information
* [METAMODEL-1154] - Added update and delete capabilities in POST call to table data endpoint.
* Established project source control, structure and build.
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
similarity index 98%
rename from core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
index 1c5db17..00ec8e0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/DataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/DataSourceRegistry.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
import java.util.List;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
similarity index 95%
rename from core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
index 491859f..4d7b470 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/TenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantContext.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
/**
* Represents a context-object containing all the information and services
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
similarity index 96%
rename from core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
index 6a32800..764fbc0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/TenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/TenantRegistry.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry;
import java.util.List;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
similarity index 97%
rename from core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
index b7b5b1e..3a3a478 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/CachedDataSourceRegistryWrapper.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedDataSourceRegistryWrapper.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.cache;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -26,6 +26,7 @@
import org.apache.metamodel.factory.DataContextProperties;
import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
import org.apache.metamodel.util.FileHelper;
import com.google.common.cache.CacheBuilder;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java
new file mode 100644
index 0000000..6ba500f
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/cache/CachedTenantRegistryWrapper.java
@@ -0,0 +1,113 @@
+package org.apache.metamodel.membrane.app.registry.cache;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
+import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.util.FileHelper;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.cache.RemovalListener;
+import com.google.common.cache.RemovalNotification;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+
+public class CachedTenantRegistryWrapper implements TenantRegistry {
+
+ /**
+ * The default timeout (in seconds) before the cache evicts and closes the
+ * created {@link TenantContext}s.
+ */
+ public static final int DEFAULT_TIMEOUT_SECONDS = 10 * 60;
+
+ private final TenantRegistry delegate;
+ private final LoadingCache<String, TenantContext> loadingCache;
+
+ public CachedTenantRegistryWrapper(TenantRegistry delegate) {
+ this(delegate, DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+ }
+
+ public CachedTenantRegistryWrapper(TenantRegistry delegate, final long cacheTimeout,
+ final TimeUnit cacheTimeoutUnit) {
+ this.delegate = delegate;
+ this.loadingCache = CacheBuilder.newBuilder().expireAfterAccess(cacheTimeout, cacheTimeoutUnit).removalListener(
+ createRemovalListener()).build(createCacheLoader());
+ }
+
+ private RemovalListener<String, TenantContext> createRemovalListener() {
+ return new RemovalListener<String, TenantContext>() {
+ @Override
+ public void onRemoval(final RemovalNotification<String, TenantContext> notification) {
+ final TenantContext tenantContext = notification.getValue();
+ // TenantContexts could be closeable - attempt closing it here
+ FileHelper.safeClose(tenantContext);
+ }
+ };
+ }
+
+ private CacheLoader<String, TenantContext> createCacheLoader() {
+ return new CacheLoader<String, TenantContext>() {
+ @Override
+ public TenantContext load(final String key) throws Exception {
+ return delegate.getTenantContext(key);
+ }
+ };
+ }
+
+ @Override
+ public List<String> getTenantIdentifiers() {
+ return delegate.getTenantIdentifiers();
+ }
+
+ @Override
+ public TenantContext getTenantContext(String tenantIdentifier) throws NoSuchTenantException {
+ try {
+ return loadingCache.getUnchecked(tenantIdentifier);
+ } catch (UncheckedExecutionException e) {
+ final Throwable cause = e.getCause();
+ if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ }
+ throw new MetaModelException("Unexpected error happened while getting TenantContext '" + tenantIdentifier
+ + "' from cache", e);
+ }
+ }
+
+ @Override
+ public TenantContext createTenantContext(String tenantIdentifier) throws IllegalArgumentException,
+ TenantAlreadyExistException {
+ final TenantContext tenantContext = delegate.createTenantContext(tenantIdentifier);
+ loadingCache.put(tenantContext.getTenantName(), tenantContext);
+ return tenantContext;
+ }
+
+ @Override
+ public void deleteTenantContext(String tenantIdentifier) throws NoSuchTenantException {
+ delegate.deleteTenantContext(tenantIdentifier);
+ loadingCache.invalidate(tenantIdentifier);
+ }
+
+}
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
index 1a7759d..60c77ae 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedDataSourceRegistry.java
@@ -29,10 +29,10 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.factory.DataContextProperties;
import org.apache.metamodel.membrane.app.DataContextSupplier;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
import org.apache.metamodel.membrane.app.config.JacksonConfig;
import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
index b1bc48c..d830125 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantContext.java
@@ -20,9 +20,9 @@
import java.io.File;
-import org.apache.metamodel.membrane.app.CachedDataSourceRegistryWrapper;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
-import org.apache.metamodel.membrane.app.TenantContext;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.cache.CachedDataSourceRegistryWrapper;
class FileBasedTenantContext implements TenantContext {
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
index 6242038..94acdcd 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/file/FileBasedTenantRegistry.java
@@ -30,10 +30,10 @@
import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import com.google.common.base.Strings;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
similarity index 93%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
index 338ed86..a457ec0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryDataSourceRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryDataSourceRegistry.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
import java.util.LinkedHashMap;
import java.util.List;
@@ -26,8 +26,10 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.factory.DataContextProperties;
+import org.apache.metamodel.membrane.app.DataContextSupplier;
import org.apache.metamodel.membrane.app.exceptions.DataSourceAlreadyExistException;
import org.apache.metamodel.membrane.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
public class InMemoryDataSourceRegistry implements DataSourceRegistry {
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
similarity index 84%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
index 3ecb7fe..08b2fa9 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantContext.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantContext.java
@@ -16,7 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
+
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.cache.CachedDataSourceRegistryWrapper;
public class InMemoryTenantContext implements TenantContext {
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
similarity index 93%
rename from core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java
rename to core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
index 8665819..37586b1 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/InMemoryTenantRegistry.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/registry/memory/InMemoryTenantRegistry.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.metamodel.membrane.app;
+package org.apache.metamodel.membrane.app.registry.memory;
import java.util.LinkedHashMap;
import java.util.List;
@@ -25,6 +25,8 @@
import org.apache.metamodel.membrane.app.exceptions.NoSuchTenantException;
import org.apache.metamodel.membrane.app.exceptions.TenantAlreadyExistException;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
index 5e51a39..a0efb7b 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
@@ -20,8 +20,8 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.GetColumnResponse;
import org.apache.metamodel.membrane.swagger.model.GetColumnResponseMetadata;
import org.apache.metamodel.schema.Column;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
index 0dea52e..21fe39f 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
@@ -30,10 +30,10 @@
import org.apache.metamodel.UpdateableDataContext;
import org.apache.metamodel.factory.DataContextProperties;
import org.apache.metamodel.factory.DataContextPropertiesImpl;
-import org.apache.metamodel.membrane.app.DataSourceRegistry;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.exceptions.InvalidDataSourceException;
+import org.apache.metamodel.membrane.app.registry.DataSourceRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
import org.apache.metamodel.membrane.swagger.model.DeleteDatasourceResponse;
import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponse;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
index 33a0567..7c8a90c 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
@@ -25,8 +25,8 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.data.DataSet;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.QueryResponse;
import org.apache.metamodel.query.Query;
import org.slf4j.Logger;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
index 04d55e1..7be34b9 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
@@ -25,8 +25,8 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.GetSchemaResponse;
import org.apache.metamodel.membrane.swagger.model.GetSchemaResponseTables;
import org.apache.metamodel.schema.Schema;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
index af7decf..5da8bb0 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
@@ -25,8 +25,8 @@
import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.GetTableResponse;
import org.apache.metamodel.membrane.swagger.model.GetTableResponseColumns;
import org.apache.metamodel.schema.Table;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
index f31f690..42ed7ab 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
@@ -34,9 +34,9 @@
import org.apache.metamodel.delete.RowDeletionBuilder;
import org.apache.metamodel.insert.RowInsertionBuilder;
import org.apache.metamodel.membrane.app.DataContextTraverser;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.config.JacksonConfig;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.Operator;
import org.apache.metamodel.membrane.swagger.model.PostDataRequest;
import org.apache.metamodel.membrane.swagger.model.PostDataRequestDelete;
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
index e94983b..d4c72e5 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
@@ -24,8 +24,8 @@
import javax.ws.rs.core.UriBuilder;
-import org.apache.metamodel.membrane.app.TenantContext;
-import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.TenantContext;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
import org.apache.metamodel.membrane.swagger.model.DeleteTenantResponse;
import org.apache.metamodel.membrane.swagger.model.GetTenantResponse;
import org.apache.metamodel.membrane.swagger.model.GetTenantResponseDatasources;
diff --git a/core/src/main/resources/context/application-context.xml b/core/src/main/resources/context/application-context.xml
index b5219ce..542d44d 100644
--- a/core/src/main/resources/context/application-context.xml
+++ b/core/src/main/resources/context/application-context.xml
@@ -33,8 +33,14 @@
<context:component-scan base-package="org.apache.metamodel.membrane.app" />
<bean id="tenantRegistry"
- class="org.apache.metamodel.membrane.app.registry.file.FileBasedTenantRegistry">
- <constructor-arg name="directory" value="${DATA_DIRECTORY}" />
+ class="org.apache.metamodel.membrane.app.registry.cache.CachedTenantRegistryWrapper">
+ <constructor-arg name="delegate">
+ <bean
+ class="org.apache.metamodel.membrane.app.registry.file.FileBasedTenantRegistry">
+ <constructor-arg name="directory" value="${DATA_DIRECTORY}" />
+ </bean>
+ </constructor-arg>
</bean>
+
</beans>
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
index 2a7e240..99a16f8 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/DataSourceControllerTest.java
@@ -20,9 +20,9 @@
import static org.junit.Assert.assertEquals;
-import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
-import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.exceptions.InvalidDataSourceException;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.memory.InMemoryTenantRegistry;
import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponse;
import org.junit.Assert;
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
index 3e0575d..7071548 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
@@ -22,9 +22,9 @@
import java.util.Map;
-import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
-import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.config.JacksonConfig;
+import org.apache.metamodel.membrane.app.registry.TenantRegistry;
+import org.apache.metamodel.membrane.app.registry.memory.InMemoryTenantRegistry;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
diff --git a/postman-tests/Membrane.postman_collection.json b/postman-tests/Membrane.postman_collection.json
index 62e816f..e249ead 100644
--- a/postman-tests/Membrane.postman_collection.json
+++ b/postman-tests/Membrane.postman_collection.json
@@ -2,7 +2,7 @@
"variables": [],
"info": {
"name": "Membrane",
- "_postman_id": "1265d16a-b1fd-26a4-7ea5-d2e4015df97e",
+ "_postman_id": "fc875392-a36c-6ff7-46fb-53eab9cd3c3e",
"description": "",
"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
},
@@ -27,7 +27,10 @@
"url": "{{baseUrl}}/swagger.json",
"method": "GET",
"header": [],
- "body": {},
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
"description": ""
},
"response": []
@@ -43,9 +46,12 @@
"tests[\"Status code is 200\"] = responseCode.code === 200;",
"",
"var jsonData = JSON.parse(responseBody);",
- "tests[\"type is tenant\"] = jsonData.type === \"tenant\";",
+ "var isTenant = jsonData.type === \"tenant\";",
+ "tests[\"type is tenant\"] = isTenant;",
"",
- "postman.setGlobalVariable(\"membrane_tenant\", jsonData.name);",
+ "if (isTenant) {",
+ " postman.setGlobalVariable(\"membrane_tenant\", jsonData.name);",
+ "}",
""
]
}
@@ -89,7 +95,10 @@
"url": "{{baseUrl}}/{{membrane_tenant}}",
"method": "GET",
"header": [],
- "body": {},
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
"description": ""
},
"response": []
@@ -521,7 +530,10 @@
"url": "{{baseUrl}}/{{membrane_tenant}}/{{membrane_data_source}}",
"method": "DELETE",
"header": [],
- "body": {},
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
"description": ""
},
"response": []