Author: jsorel Date: Tue Apr 10 15:20:09 2018 New Revision: 1828826 URL: http://svn.apache.org/viewvc?rev=1828826&view=rev Log: SQL : add SQLQuery, prepare query feature set, start postgres implementation
Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQuery.java sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQueryFeatureSet.java sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresDialect.java sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresProvider.java sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresStore.java Modified: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/internal/sql/reverse/DataBaseModel.java sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/AbstractSQLStore.java Modified: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/internal/sql/reverse/DataBaseModel.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/internal/sql/reverse/DataBaseModel.java?rev=1828826&r1=1828825&r2=1828826&view=diff ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/internal/sql/reverse/DataBaseModel.java [UTF-8] (original) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/internal/sql/reverse/DataBaseModel.java [UTF-8] Tue Apr 10 15:20:09 2018 @@ -34,6 +34,7 @@ import java.util.Objects; import java.util.Set; import java.util.function.Predicate; import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.sis.feature.builder.AttributeRole; import org.apache.sis.feature.builder.AttributeTypeBuilder; import org.apache.sis.feature.builder.FeatureTypeBuilder; @@ -86,12 +87,15 @@ public final class DataBaseModel { } private final AbstractSQLStore store; + private final Logger logger; + private final String databaseSchema; + private final String databaseTable; + private FeatureNaming<PrimaryKey> pkIndex = new FeatureNaming<>(); private Set<GenericName> typeNames = new HashSet<>(); private FeatureNaming<FeatureType> typeIndex = new FeatureNaming<>(); private Map<String,SchemaMetaModel> schemas; private Set<GenericName> nameCache; - private final boolean simpleTypes; //various cache while analyzing model private DatabaseMetaData metadata; @@ -107,13 +111,11 @@ public final class DataBaseModel { private Set<String> requieredSchemas; - public DataBaseModel(final AbstractSQLStore store, final boolean simpleTypes){ + public DataBaseModel(final AbstractSQLStore store, Logger logger, String schema, String table){ this.store = store; - this.simpleTypes = simpleTypes; - } - - public boolean isSimpleTypes() { - return simpleTypes; + this.logger = logger; + this.databaseSchema = schema; + this.databaseTable = table; } public Collection<SchemaMetaModel> getSchemaMetaModels() throws DataStoreException { @@ -186,7 +188,6 @@ public final class DataBaseModel { clearCache(); schemas = new HashMap<>(); final SQLDialect dialect = store.getDialect(); - final String databaseSchema = store.getDatabaseSchema(); visitedSchemas = new HashSet<>(); requieredSchemas = new HashSet<>(); @@ -313,7 +314,7 @@ public final class DataBaseModel { //build indexes--------------------------------------------------------- - final String baseSchemaName = store.getDatabaseSchema(); + final String baseSchemaName = databaseSchema; final Collection<SchemaMetaModel> candidates; if (baseSchemaName == null) { @@ -327,12 +328,7 @@ public final class DataBaseModel { if (schema != null) { for (TableMetaModel table : schema.tables.values()) { - final FeatureTypeBuilder ft; - if (simpleTypes) { - ft = table.getType(TableMetaModel.View.SIMPLE_FEATURE_TYPE); - } else { - ft = table.getType(TableMetaModel.View.COMPLEX_FEATURE_TYPE); - } + final FeatureTypeBuilder ft = table.getType(TableMetaModel.View.SIMPLE_FEATURE_TYPE); final GenericName name = ft.getName(); pkIndex.add(store, name, table.key); if (table.isSubType()) { @@ -352,7 +348,6 @@ public final class DataBaseModel { private SchemaMetaModel analyzeSchema(final String schemaName, final Connection cx) throws DataStoreException { final SchemaMetaModel schema = new SchemaMetaModel(schemaName); - final String databaseTable = store.getDatabaseTable(); try { for (Map<String,Object> info : cacheTables.records()) { @@ -409,7 +404,7 @@ public final class DataBaseModel { Class<?> columnType = dialect.getJavaType(sqlType, sqlTypeName); if (columnType == null) { - store.getLogger().log(Level.WARNING, "No class for sql type {0}", sqlType); + logger.log(Level.WARNING, "No class for sql type {0}", sqlType); columnType = Object.class; } @@ -515,7 +510,7 @@ public final class DataBaseModel { if (cols.isEmpty()) { if (Table.VALUE_TYPE_TABLE.equals(tableType)) { - store.getLogger().log(Level.INFO, "No primary key found for {0}.", tableName); + logger.log(Level.INFO, "No primary key found for {0}.", tableName); } } table.key = new PrimaryKey(tableName, cols); @@ -691,7 +686,7 @@ public final class DataBaseModel { atb.setMaximumOccurs(1); atb.setName(columnLabel); - try (Connection cx = store.getDataSource().getConnection()) { + try (Connection cx = store.getDataSource().getConnection()) { final Class<?> type = dialect.getJavaType(sqlType, sqlTypeName); //TODO : avoid jts, global geometry interface common to all ? // if (type.equals(Geometry.class)) { @@ -750,13 +745,13 @@ public final class DataBaseModel { Integer srid = null; CoordinateReferenceSystem crs = null; try { - srid = dialect.getGeometrySRID(store.getDatabaseSchema(), tableName, name, metas, cx); + srid = dialect.getGeometrySRID(databaseSchema, tableName, name, metas, cx); if (srid != null) { crs = dialect.createCRS(srid, cx); } } catch (SQLException e) { String msg = "Error occured determing srid for " + tableName + "."+ name; - store.getLogger().log(Level.WARNING, msg, e); + logger.log(Level.WARNING, msg, e); } atb.setCRS(crs); @@ -781,13 +776,13 @@ public final class DataBaseModel { Integer srid = null; CoordinateReferenceSystem crs = null; try { - srid = dialect.getGeometrySRID(store.getDatabaseSchema(), tableName, name, metas, cx); + srid = dialect.getGeometrySRID(databaseSchema, tableName, name, metas, cx); if (srid != null) { crs = dialect.createCRS(srid, cx); } } catch (SQLException e) { String msg = "Error occured determing srid for " + tableName + "."+ name; - store.getLogger().log(Level.WARNING, msg, e); + logger.log(Level.WARNING, msg, e); } atb.setCRS(crs); Modified: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/AbstractSQLStore.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/AbstractSQLStore.java?rev=1828826&r1=1828825&r2=1828826&view=diff ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/AbstractSQLStore.java [UTF-8] (original) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/AbstractSQLStore.java [UTF-8] Tue Apr 10 15:20:09 2018 @@ -16,13 +16,11 @@ */ package org.apache.sis.sql; -import java.util.logging.Logger; import javax.sql.DataSource; -import org.apache.sis.feature.builder.FeatureTypeBuilder; -import org.apache.sis.internal.sql.reverse.RelationMetaModel; +import org.apache.sis.internal.sql.reverse.DataBaseModel; import org.apache.sis.sql.dialect.SQLDialect; import org.apache.sis.storage.DataStore; -import org.opengis.feature.AttributeType; +import org.apache.sis.storage.FeatureSet; /** * Parent store class for DataStore implementation using java JDBC backend. @@ -41,12 +39,18 @@ public abstract class AbstractSQLStore e */ public abstract SQLDialect getDialect(); - public abstract Logger getLogger(); - public abstract DataSource getDataSource(); - public abstract String getDatabaseSchema(); + public abstract DataBaseModel getDatabaseModel(); - public abstract String getDatabaseTable(); + /** + * Execute a query directly on the database. + * + * @param query , not null + * @return resulting features from given query. + */ + public FeatureSet query(SQLQuery query) { + return new SQLQueryFeatureSet(this, query); + } } Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQuery.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQuery.java?rev=1828826&view=auto ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQuery.java (added) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQuery.java Tue Apr 10 15:20:09 2018 @@ -0,0 +1,68 @@ +/* + * 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.sis.sql; + +import org.apache.sis.storage.Query; +import org.apache.sis.util.ArgumentChecks; + +/** + * An SQL query executed directly on the database. + * Such query should be transfered to the JDBC without or with minimum modifications. + * + * @author Johann Sorel (Geomatys) + * @version 1.0 + * @since 1.0 + * @module + */ +public class SQLQuery implements Query { + + private final String statement; + private final String name; + + /** + * Create a new SQL query object. + * + * @param statement SQL query text, not null + * @param name common name, used for returned feature types, not null + */ + public SQLQuery(String statement, String name) { + ArgumentChecks.ensureNonNull("statement", statement); + ArgumentChecks.ensureNonNull("name", name); + this.statement = statement; + this.name = name; + } + + /** + * Returns the query text. + * Example : SELECT * FROM Road + * + * @return SQL query text, not null + */ + public String getStatement() { + return statement; + } + + /** + * Returns the query name. + * This name is used to build the returned feature type. + * + * @return common query name + */ + public String getName() { + return name; + } +} Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQueryFeatureSet.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQueryFeatureSet.java?rev=1828826&view=auto ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQueryFeatureSet.java (added) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/SQLQueryFeatureSet.java Tue Apr 10 15:20:09 2018 @@ -0,0 +1,90 @@ +/* + * 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.sis.sql; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.stream.Stream; +import org.apache.sis.storage.DataStoreException; +import org.apache.sis.storage.FeatureSet; +import org.apache.sis.storage.event.ChangeEvent; +import org.apache.sis.storage.event.ChangeListener; +import org.opengis.feature.Feature; +import org.opengis.feature.FeatureType; +import org.opengis.geometry.Envelope; +import org.opengis.metadata.Metadata; + +/** + * A FeatureSet above a custom SQL query. + * + * @author Johann Sorel (Geomatys) + * @version 1.0 + * @since 1.0 + * @module + */ +final class SQLQueryFeatureSet implements FeatureSet { + + private final AbstractSQLStore store; + private final SQLQuery query; + private FeatureType type; + + public SQLQueryFeatureSet(AbstractSQLStore store, SQLQuery query) { + this.store = store; + this.query = query; + } + + @Override + public FeatureType getType() throws DataStoreException { + if (type == null) { + final String sql = query.getStatement(); + try (Connection cnx = store.getDataSource().getConnection(); + Statement stmt = cnx.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + type = store.getDatabaseModel().analyzeResult(rs, query.getName()); + } catch (SQLException ex) { + throw new DataStoreException(ex); + } + } + return type; + } + + @Override + public Stream<Feature> features(boolean parallel) throws DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Envelope getEnvelope() throws DataStoreException { + return null; + } + + @Override + public Metadata getMetadata() throws DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public <T extends ChangeEvent> void addListener(ChangeListener<? super T> listener, Class<T> eventType) { + } + + @Override + public <T extends ChangeEvent> void removeListener(ChangeListener<? super T> listener, Class<T> eventType) { + } + +} Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresDialect.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresDialect.java?rev=1828826&view=auto ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresDialect.java (added) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresDialect.java Tue Apr 10 15:20:09 2018 @@ -0,0 +1,107 @@ +/* + * 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.sis.sql.postgres; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.sis.internal.sql.SingleAttributeTypeBuilder; +import org.apache.sis.internal.sql.reverse.ColumnMetaModel; +import org.apache.sis.sql.dialect.SQLDialect; +import org.apache.sis.storage.DataStoreException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; + +/** + * + * @author Johann Sorel (Geomatys) + * @version 1.0 + * @since 1.0 + * @module + */ +class PostgresDialect implements SQLDialect { + + private static final Set<String> IGNORE_TABLES = new HashSet<>(); + static { + //postgis 1+ geometry and referencing + IGNORE_TABLES.add("spatial_ref_sys"); + IGNORE_TABLES.add("geometry_columns"); + IGNORE_TABLES.add("geography_columns"); + //postgis 2 raster + IGNORE_TABLES.add("raster_columns"); + IGNORE_TABLES.add("raster_overviews"); + } + + + @Override + public boolean supportGlobalMetadata() { + return true; + } + + @Override + public boolean ignoreTable(String name) { + return IGNORE_TABLES.contains(name.toLowerCase()); + } + + @Override + public Class<?> getJavaType(int sqlType, String sqlTypeName) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void encodeColumnName(StringBuilder sql, String name) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void encodeSchemaAndTableName(StringBuilder sql, String databaseSchema, String tableName) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Object nextValue(ColumnMetaModel column, Connection cx) throws SQLException, DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public String getColumnSequence(Connection cx, String schemaName, String tableName, String columnName) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void decodeColumnType(SingleAttributeTypeBuilder atb, Connection cx, String typeName, int datatype, String schemaName, String tableName, String columnName) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void decodeGeometryColumnType(SingleAttributeTypeBuilder atb, Connection cx, ResultSet rs, int columnIndex, boolean customquery) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Integer getGeometrySRID(String schemaName, String tableName, String columnName, Map<String, Object> metas, Connection cx) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public CoordinateReferenceSystem createCRS(int srid, Connection cx) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + +} Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresProvider.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresProvider.java?rev=1828826&view=auto ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresProvider.java (added) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresProvider.java Tue Apr 10 15:20:09 2018 @@ -0,0 +1,57 @@ +/* + * 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.sis.sql.postgres; + +import org.apache.sis.storage.DataStore; +import org.apache.sis.storage.DataStoreException; +import org.apache.sis.storage.DataStoreProvider; +import org.apache.sis.storage.ProbeResult; +import org.apache.sis.storage.StorageConnector; +import org.opengis.parameter.ParameterDescriptorGroup; + +/** + * + * @author Johann Sorel (Geomatys) + * @version 1.0 + * @since 1.0 + * @module + */ +public class PostgresProvider extends DataStoreProvider { + + public static final String NAME = "postgres"; + + @Override + public String getShortName() { + return NAME; + } + + @Override + public ParameterDescriptorGroup getOpenParameters() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public ProbeResult probeContent(StorageConnector connector) throws DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public DataStore open(StorageConnector connector) throws DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + +} Added: sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresStore.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresStore.java?rev=1828826&view=auto ============================================================================== --- sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresStore.java (added) +++ sis/branches/JDK8/storage/sis-sql/src/main/java/org/apache/sis/sql/postgres/PostgresStore.java Tue Apr 10 15:20:09 2018 @@ -0,0 +1,94 @@ +/* + * 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.sis.sql.postgres; + +import java.util.logging.Logger; +import javax.sql.DataSource; +import org.apache.sis.internal.sql.reverse.DataBaseModel; +import org.apache.sis.sql.AbstractSQLStore; +import org.apache.sis.sql.dialect.SQLDialect; +import org.apache.sis.storage.DataStoreException; +import org.apache.sis.storage.event.ChangeEvent; +import org.apache.sis.storage.event.ChangeListener; +import org.apache.sis.util.logging.Logging; +import org.opengis.metadata.Metadata; +import org.opengis.parameter.ParameterValueGroup; + +/** + * + * @author Johann Sorel (Geomatys) + * @version 1.0 + * @since 1.0 + * @module + */ +class PostgresStore extends AbstractSQLStore { + + private static final Logger LOGGER = Logging.getLogger("org.apache.sis.sql"); + + private final PostgresDialect dialect = new PostgresDialect(); + + private final DataSource source; + private final String schema; + private final String table; + + private final DataBaseModel model; + + public PostgresStore(DataSource source, String schema, String table) { + this.source = source; + this.schema = schema; + this.table = table; + this.model = new DataBaseModel(this, LOGGER, schema, table); + } + + @Override + public SQLDialect getDialect() { + return dialect; + } + + @Override + public DataSource getDataSource() { + return source; + } + + @Override + public DataBaseModel getDatabaseModel() { + return model; + } + + @Override + public ParameterValueGroup getOpenParameters() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Metadata getMetadata() throws DataStoreException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void close() throws DataStoreException { + } + + @Override + public <T extends ChangeEvent> void addListener(ChangeListener<? super T> listener, Class<T> eventType) { + } + + @Override + public <T extends ChangeEvent> void removeListener(ChangeListener<? super T> listener, Class<T> eventType) { + } + +}