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();
 

Reply via email to