Made the new REST API use the METAMODEL-1099 based factories Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/11d9a9e8 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/11d9a9e8 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/11d9a9e8
Branch: refs/heads/feature/5.x/swagger-docs Commit: 11d9a9e8ac10f0f1d5da08a091d3b03a4f0a3256 Parents: ba9b4cc Author: Kasper Sørensen <[email protected]> Authored: Sun Jul 10 22:11:22 2016 -0700 Committer: Kasper Sørensen <[email protected]> Committed: Sun Jul 10 22:11:22 2016 -0700 ---------------------------------------------------------------------- .../factory/DataContextPropertiesImpl.java | 3 + .../apache/metamodel/pojo/PojoDataContext.java | 4 +- .../metamodel/pojo/PojoDataContextFactory.java | 71 ++++++++++++ ....apache.metamodel.factory.DataContextFactory | 1 + .../app/CachedDataSourceRegistryWrapper.java | 109 +++++++++++++++++++ .../service/app/DataContextSupplier.java | 59 ++-------- .../service/app/DataSourceDefinition.java | 8 +- .../service/app/DataSourceRegistry.java | 3 +- .../service/app/InMemoryDataSourceRegistry.java | 5 +- .../service/app/InMemoryTenantContext.java | 2 +- .../controllers/DataSourceController.java | 17 ++- .../model/RestDataSourceDefinition.java | 27 +++-- .../TenantInteractionScenarioTest.java | 2 +- 13 files changed, 237 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/core/src/main/java/org/apache/metamodel/factory/DataContextPropertiesImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/factory/DataContextPropertiesImpl.java b/core/src/main/java/org/apache/metamodel/factory/DataContextPropertiesImpl.java index e66a811..13ce9c1 100644 --- a/core/src/main/java/org/apache/metamodel/factory/DataContextPropertiesImpl.java +++ b/core/src/main/java/org/apache/metamodel/factory/DataContextPropertiesImpl.java @@ -288,6 +288,9 @@ public class DataContextPropertiesImpl implements DataContextProperties { @Override public SimpleTableDef[] getTableDefs() { final Object obj = get(PROPERTY_TABLE_DEFS); + if (obj == null) { + return null; + } if (obj instanceof SimpleTableDef[]) { return (SimpleTableDef[]) obj; } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java ---------------------------------------------------------------------- diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java index 9369e96..340228f 100644 --- a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java +++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java @@ -49,6 +49,8 @@ import org.apache.metamodel.util.SimpleTableDef; public class PojoDataContext extends QueryPostprocessDataContext implements UpdateableDataContext, Serializable { private static final long serialVersionUID = 1L; + + public static final String DEFAULT_SCHEMA_NAME = "Schema"; private final Map<String, TableDataProvider<?>> _tables; private final String _schemaName; @@ -68,7 +70,7 @@ public class PojoDataContext extends QueryPostprocessDataContext implements Upda * @param tables */ public PojoDataContext(List<TableDataProvider<?>> tables) { - this("Schema", tables); + this(DEFAULT_SCHEMA_NAME, tables); } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContextFactory.java ---------------------------------------------------------------------- diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContextFactory.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContextFactory.java new file mode 100644 index 0000000..35842bf --- /dev/null +++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContextFactory.java @@ -0,0 +1,71 @@ +/** + * 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. + */ +package org.apache.metamodel.pojo; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.metamodel.ConnectionException; +import org.apache.metamodel.DataContext; +import org.apache.metamodel.factory.DataContextFactory; +import org.apache.metamodel.factory.DataContextProperties; +import org.apache.metamodel.factory.ResourceFactoryRegistry; +import org.apache.metamodel.factory.UnsupportedDataContextPropertiesException; +import org.apache.metamodel.util.SimpleTableDef; + +public class PojoDataContextFactory implements DataContextFactory { + + public static final String PROPERTY_TYPE = "pojo"; + + @Override + public boolean accepts(DataContextProperties properties, ResourceFactoryRegistry resourceFactoryRegistry) { + return PROPERTY_TYPE.equals(properties.getDataContextType()); + } + + @Override + public DataContext create(DataContextProperties properties, ResourceFactoryRegistry resourceFactoryRegistry) + throws UnsupportedDataContextPropertiesException, ConnectionException { + + assert accepts(properties, resourceFactoryRegistry); + + final String schemaName; + if (properties.getDatabaseName() != null) { + schemaName = properties.getDatabaseName(); + } else { + schemaName = "Schema"; + } + + final List<TableDataProvider<?>> tableDataProviders; + + final SimpleTableDef[] tableDefs = properties.getTableDefs(); + if (tableDefs == null) { + tableDataProviders = new ArrayList<>(); + } else { + tableDataProviders = new ArrayList<>(tableDefs.length); + for (int i = 0; i < tableDefs.length; i++) { + final TableDataProvider<?> tableDataProvider = new ArrayTableDataProvider(tableDefs[i], + new ArrayList<Object[]>()); + tableDataProviders.add(tableDataProvider); + } + } + + return new PojoDataContext(schemaName, tableDataProviders); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/pojo/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory ---------------------------------------------------------------------- diff --git a/pojo/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory b/pojo/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory new file mode 100644 index 0000000..76f808d --- /dev/null +++ b/pojo/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory @@ -0,0 +1 @@ +org.apache.metamodel.pojo.PojoDataContextFactory \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/CachedDataSourceRegistryWrapper.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/CachedDataSourceRegistryWrapper.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/CachedDataSourceRegistryWrapper.java new file mode 100644 index 0000000..fffe83d --- /dev/null +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/CachedDataSourceRegistryWrapper.java @@ -0,0 +1,109 @@ +/** + * 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. + */ +package org.apache.metamodel.service.app; + +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import org.apache.metamodel.DataContext; +import org.apache.metamodel.MetaModelException; +import org.apache.metamodel.factory.DataContextProperties; +import org.apache.metamodel.service.app.exceptions.DataSourceAlreadyExistException; +import org.apache.metamodel.service.app.exceptions.NoSuchDataSourceException; +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; + +/** + * A wrapper that adds a cache around a {@link DataSourceRegistry} in order to + * prevent re-connecting all the time to the same data source. + */ +public class CachedDataSourceRegistryWrapper implements DataSourceRegistry { + + /** + * The default timeout (in seconds) before the cache evicts and closes the + * created {@link DataContext}s. + */ + public static final int DEFAULT_TIMEOUT_SECONDS = 60; + + private final DataSourceRegistry delegate; + private final LoadingCache<String, DataContext> loadingCache; + + public CachedDataSourceRegistryWrapper(DataSourceRegistry delegate) { + this(delegate, DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } + + public CachedDataSourceRegistryWrapper(DataSourceRegistry delegate, long cacheTimeout, TimeUnit cacheTimeoutUnit) { + this.delegate = delegate; + this.loadingCache = CacheBuilder.newBuilder().expireAfterAccess(cacheTimeout, cacheTimeoutUnit).removalListener( + createRemovalListener()).build(createCacheLoader()); + } + + private RemovalListener<String, DataContext> createRemovalListener() { + return new RemovalListener<String, DataContext>() { + @Override + public void onRemoval(RemovalNotification<String, DataContext> notification) { + final DataContext dataContext = notification.getValue(); + // some DataContexts are closeable - attempt closing it here + FileHelper.safeClose(dataContext); + } + }; + } + + private CacheLoader<String, DataContext> createCacheLoader() { + return new CacheLoader<String, DataContext>() { + @Override + public DataContext load(String key) throws Exception { + return delegate.openDataContext(key); + } + }; + } + + @Override + public List<String> getDataSourceNames() { + return delegate.getDataSourceNames(); + } + + @Override + public String registerDataSource(String dataContextName, DataContextProperties dataContextProperties) + throws DataSourceAlreadyExistException { + loadingCache.invalidate(dataContextName); + return delegate.registerDataSource(dataContextName, dataContextProperties); + } + + @Override + public DataContext openDataContext(String dataSourceName) throws NoSuchDataSourceException { + try { + return loadingCache.get(dataSourceName); + } catch (ExecutionException e) { + final Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + throw new MetaModelException("Unexpected error happened while getting DataContext '" + dataSourceName + + "' from cache", e); + } + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextSupplier.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextSupplier.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextSupplier.java index a0fb6ec..2f42c6f 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextSupplier.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextSupplier.java @@ -18,68 +18,31 @@ */ package org.apache.metamodel.service.app; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.function.Supplier; -import java.util.stream.Collectors; import org.apache.metamodel.DataContext; -import org.apache.metamodel.pojo.ArrayTableDataProvider; -import org.apache.metamodel.pojo.PojoDataContext; -import org.apache.metamodel.pojo.TableDataProvider; -import org.apache.metamodel.util.SimpleTableDef; -import org.apache.metamodel.util.SimpleTableDefParser; +import org.apache.metamodel.factory.DataContextFactoryRegistryImpl; +import org.apache.metamodel.factory.DataContextProperties; public class DataContextSupplier implements Supplier<DataContext> { private final String dataSourceName; - private final DataSourceDefinition dataSourceDefinition; - private final DataContext eagerLoadedDataContext; + private final DataContextProperties dataContextProperties; - public DataContextSupplier(String dataSourceName, DataSourceDefinition dataSourceDefinition) { + public DataContextSupplier(String dataSourceName, DataContextProperties dataContextProperties) { this.dataSourceName = dataSourceName; - this.dataSourceDefinition = dataSourceDefinition; - this.eagerLoadedDataContext = createDataContext(true); + this.dataContextProperties = dataContextProperties; } @Override public DataContext get() { - if (eagerLoadedDataContext != null) { - return eagerLoadedDataContext; - } - return createDataContext(false); + final DataContext dataContext = DataContextFactoryRegistryImpl.getDefaultInstance().createDataContext( + dataContextProperties); + return dataContext; } - private DataContext createDataContext(boolean eager) { - final String type = dataSourceDefinition.getType(); - switch (type.toLowerCase()) { - case "pojo": - final List<TableDataProvider<?>> tableDataProviders; - - final Object tableDefinitions = dataSourceDefinition.getTableDefinitions(); - if (tableDefinitions == null) { - tableDataProviders = new ArrayList<>(0); - } else if (tableDefinitions instanceof String) { - final SimpleTableDef[] tableDefs = SimpleTableDefParser.parseTableDefs((String) tableDefinitions); - tableDataProviders = Arrays.stream(tableDefs).map((tableDef) -> { - return new ArrayTableDataProvider(tableDef, new ArrayList<Object[]>()); - }).collect(Collectors.toList()); - } else { - throw new UnsupportedOperationException("Unsupported table definition type: " + tableDefinitions); - } - - final String schemaName = dataSourceDefinition.getSchemaName() == null ? dataSourceName - : dataSourceDefinition.getSchemaName(); - - return new PojoDataContext(schemaName, tableDataProviders); - } - - if (eager) { - return null; - } else { - throw new UnsupportedOperationException("Unsupported data source type: " + type); - } + @Override + public String toString() { + return "DataContextSupplier[" + dataSourceName + "]"; } - } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceDefinition.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceDefinition.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceDefinition.java index 11140a7..2aaa8e5 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceDefinition.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceDefinition.java @@ -18,13 +18,11 @@ */ package org.apache.metamodel.service.app; +import java.util.Map; + public interface DataSourceDefinition { public String getType(); - public Object getTableDefinitions(); - - public String getSchemaName(); - - // TODO + public Map<String, Object> getProperties(); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceRegistry.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceRegistry.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceRegistry.java index 3a9ba43..e0c8697 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceRegistry.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataSourceRegistry.java @@ -22,6 +22,7 @@ import java.util.List; import org.apache.metamodel.DataContext; import org.apache.metamodel.UpdateableDataContext; +import org.apache.metamodel.factory.DataContextProperties; import org.apache.metamodel.service.app.exceptions.DataSourceAlreadyExistException; import org.apache.metamodel.service.app.exceptions.DataSourceNotUpdateableException; import org.apache.metamodel.service.app.exceptions.NoSuchDataSourceException; @@ -33,7 +34,7 @@ public interface DataSourceRegistry { public List<String> getDataSourceNames(); - public String registerDataSource(String dataContextName, DataSourceDefinition dataSourceDef) throws DataSourceAlreadyExistException; + public String registerDataSource(String dataContextName, DataContextProperties dataContextProperties) throws DataSourceAlreadyExistException; public DataContext openDataContext(String dataSourceName) throws NoSuchDataSourceException; http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryDataSourceRegistry.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryDataSourceRegistry.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryDataSourceRegistry.java index b99c6e7..386232a 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryDataSourceRegistry.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryDataSourceRegistry.java @@ -25,6 +25,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import org.apache.metamodel.DataContext; +import org.apache.metamodel.factory.DataContextProperties; import org.apache.metamodel.service.app.exceptions.DataSourceAlreadyExistException; import org.apache.metamodel.service.app.exceptions.NoSuchDataSourceException; @@ -37,13 +38,13 @@ public class InMemoryDataSourceRegistry implements DataSourceRegistry { } @Override - public String registerDataSource(final String name, final DataSourceDefinition dataSourceDef) + public String registerDataSource(final String name, final DataContextProperties dataContextProperties) throws DataSourceAlreadyExistException { if (dataSources.containsKey(name)) { throw new DataSourceAlreadyExistException(name); } - dataSources.put(name, new DataContextSupplier(name, dataSourceDef)); + dataSources.put(name, new DataContextSupplier(name, dataContextProperties)); return name; } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryTenantContext.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryTenantContext.java b/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryTenantContext.java index 04fb708..022ab28 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryTenantContext.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/app/InMemoryTenantContext.java @@ -25,7 +25,7 @@ public class InMemoryTenantContext implements TenantContext { public InMemoryTenantContext(String tenantIdentifier) { this.tenantIdentifier = tenantIdentifier; - this.dataContextRegistry = new InMemoryDataSourceRegistry(); + this.dataContextRegistry = new CachedDataSourceRegistryWrapper(new InMemoryDataSourceRegistry()); } @Override http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java index 9c678ff..6ac0c43 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java @@ -19,6 +19,7 @@ package org.apache.metamodel.service.controllers; import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -29,6 +30,8 @@ import javax.ws.rs.core.UriBuilder; import org.apache.metamodel.DataContext; import org.apache.metamodel.UpdateableDataContext; +import org.apache.metamodel.factory.DataContextProperties; +import org.apache.metamodel.factory.DataContextPropertiesImpl; import org.apache.metamodel.service.app.TenantContext; import org.apache.metamodel.service.app.TenantRegistry; import org.apache.metamodel.service.controllers.model.RestDataSourceDefinition; @@ -58,8 +61,20 @@ public class DataSourceController { public Map<String, Object> put(@PathVariable("tenant") String tenantId, @PathVariable("datasource") String dataSourceId, @Valid @RequestBody RestDataSourceDefinition dataContextDefinition) { + + final Map<String, Object> map = new HashMap<>(); + map.putAll(dataContextDefinition.getProperties()); + map.put(DataContextPropertiesImpl.PROPERTY_DATA_CONTEXT_TYPE, dataContextDefinition.getType()); + + if (!map.containsKey(DataContextPropertiesImpl.PROPERTY_DATABASE)) { + // add the data source ID as database name if it is not already set. + map.put(DataContextPropertiesImpl.PROPERTY_DATABASE, dataSourceId); + } + + final DataContextProperties properties = new DataContextPropertiesImpl(map); + final String dataContextIdentifier = tenantRegistry.getTenantContext(tenantId).getDataSourceRegistry() - .registerDataSource(dataSourceId, dataContextDefinition); + .registerDataSource(dataSourceId, properties); return get(tenantId, dataContextIdentifier); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/main/java/org/apache/metamodel/service/controllers/model/RestDataSourceDefinition.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/model/RestDataSourceDefinition.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/model/RestDataSourceDefinition.java index 48c5926..b6fdb28 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/model/RestDataSourceDefinition.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/model/RestDataSourceDefinition.java @@ -18,39 +18,38 @@ */ package org.apache.metamodel.service.controllers.model; +import java.util.HashMap; +import java.util.Map; + import javax.validation.constraints.NotNull; import org.apache.metamodel.service.app.DataSourceDefinition; -import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; public class RestDataSourceDefinition implements DataSourceDefinition { + private final Map<String, Object> properties = new HashMap<>(); + @JsonProperty(value = "type", required = true) @NotNull private String type; - @JsonProperty(value = "table-definitions", required = false) - @JsonInclude(JsonInclude.Include.NON_NULL) - private Object tableDefinitions; - - @JsonProperty(value = "schema-name", required = false) - @JsonInclude(JsonInclude.Include.NON_NULL) - private String schemaName; - @Override public String getType() { return type; } + @JsonAnyGetter @Override - public Object getTableDefinitions() { - return tableDefinitions; + public Map<String, Object> getProperties() { + return properties; } - @Override - public String getSchemaName() { - return schemaName; + @JsonAnySetter + public void set(String name, Object value) { + properties.put(name, value); } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11d9a9e8/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java b/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java index 793f88c..01bc7f5 100644 --- a/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java +++ b/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java @@ -72,7 +72,7 @@ public class TenantInteractionScenarioTest { // create datasource { final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/tenant1/mydata").content( - "{'type':'pojo','table-definitions':'hello_world (greeting VARCHAR, who VARCHAR); foo (bar INTEGER, baz DATE);'}" + "{'type':'pojo','table-defs':'hello_world (greeting VARCHAR, who VARCHAR); foo (bar INTEGER, baz DATE);'}" .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect( MockMvcResultMatchers.status().isOk()).andReturn();
