Repository: metamodel
Updated Branches:
  refs/heads/master 8156d76fd -> 3c4c12673


METAMODEL-152: Fixed
Fixes #30

Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/3c4c1267
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/3c4c1267
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/3c4c1267

Branch: refs/heads/master
Commit: 3c4c1267309475a185d103508b63921f61ceef57
Parents: 8156d76
Author: Kasper Sørensen <[email protected]>
Authored: Thu Jun 18 15:25:27 2015 +0200
Committer: Kasper Sørensen <[email protected]>
Committed: Thu Jun 18 15:25:27 2015 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |  1 +
 .../apache/metamodel/AbstractDataContext.java   | 15 +++++++++---
 .../metamodel/QueryPostprocessDataContext.java  | 24 ++++++++++----------
 excel/pom.xml                                   |  2 +-
 .../metamodel/excel/ExcelDataContext.java       | 19 +++++++++++-----
 .../metamodel/excel/ExcelDataContextTest.java   | 10 +++++---
 6 files changed, 46 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index c6c6f80..d463e99 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,7 @@
 ### Apache MetaModel (unreleased work)
 
  * [METAMODEL-148] - Added a 'hadoop' module with a HdfsResource class to 
allow CSV, Excel and Fixed-width file access on HDFS.
+ * [METAMODEL-152] - Fixed an issue of not clearing schema cache when 
refreshSchemas() is invoked.
  * [METAMODEL-149] - Added support for COUNTER data type in Cassandra.
  * [METAMODEL-151] - Added support for DOUBLE data type mapping in PostgreSQL
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java 
b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
index 0c00186..a42d7f6 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
@@ -54,10 +54,19 @@ public abstract class AbstractDataContext implements 
DataContext {
     public final DataContext refreshSchemas() {
         _schemaCache.clear();
         _schemaNameCache = null;
+        onSchemaCacheRefreshed();
         return this;
     }
 
     /**
+     * Method invoked when schemas have been refreshed using
+     * {@link #refreshSchemas()}. Can be overridden to add callback
+     * functionality in subclasses.
+     */
+    protected void onSchemaCacheRefreshed() {
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -111,12 +120,12 @@ public abstract class AbstractDataContext implements 
DataContext {
     @Override
     public final Schema getDefaultSchema() throws MetaModelException {
         Schema result = null;
-        String defaultSchemaName = getDefaultSchemaName();
+        final String defaultSchemaName = getDefaultSchemaName();
         if (defaultSchemaName != null) {
             result = getSchemaByName(defaultSchemaName);
         }
         if (result == null) {
-            Schema[] schemas = getSchemas();
+            final Schema[] schemas = getSchemas();
             if (schemas.length == 1) {
                 result = schemas[0];
             } else {
@@ -126,7 +135,7 @@ public abstract class AbstractDataContext implements 
DataContext {
                     String name = schema.getName();
                     if (schema != null) {
                         name = name.toLowerCase();
-                        boolean isInformationSchema = 
name.startsWith("information") && name.endsWith("schema");
+                        final boolean isInformationSchema = 
name.startsWith("information") && name.endsWith("schema");
                         if (!isInformationSchema && schema.getTableCount() > 
highestTableCount) {
                             highestTableCount = schema.getTableCount();
                             result = schema;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java 
b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
index 0cdbe8b..872a7dd 100644
--- a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
@@ -76,8 +76,6 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
 
     private final Map<Column, TypeConverter<?, ?>> _converters;
 
-    private Schema _mainSchema;
-
     public QueryPostprocessDataContext() {
         super();
         _converters = new HashMap<Column, TypeConverter<?, ?>>();
@@ -432,7 +430,7 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
         schemaNames[1] = getMainSchemaName();
         return schemaNames;
     }
-
+    
     @Override
     protected String getDefaultSchemaName() throws MetaModelException {
         return getMainSchemaName();
@@ -449,7 +447,7 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
         }
 
         if (name.equalsIgnoreCase(mainSchemaName)) {
-            return getMainSchemaInternal();
+            return getMainSchema();
         } else if (name.equals(INFORMATION_SCHEMA_NAME)) {
             return getInformationSchema();
         }
@@ -513,7 +511,7 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
         final String tableName = table.getName();
         final SelectItem[] columnSelectItems = 
MetaModelHelper.createSelectItems(table.getColumns());
         final SimpleDataSetHeader header = new 
SimpleDataSetHeader(columnSelectItems);
-        final Table[] tables = getMainSchemaInternal().getTables();
+        final Table[] tables = getDefaultSchema().getTables();
         final List<Row> data = new ArrayList<Row>();
         if ("tables".equals(tableName)) {
             // "tables" columns: name, type, num_columns, remarks
@@ -541,7 +539,7 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
         } else if ("relationships".equals(tableName)) {
             // "relationships" columns: primary_table, primary_column,
             // foreign_table, foreign_column
-            for (Relationship r : getMainSchemaInternal().getRelationships()) {
+            for (Relationship r : getDefaultSchema().getRelationships()) {
                 Column[] primaryColumns = r.getPrimaryColumns();
                 Column[] foreignColumns = r.getForeignColumns();
                 Table pTable = r.getPrimaryTable();
@@ -571,13 +569,15 @@ public abstract class QueryPostprocessDataContext extends 
AbstractDataContext im
         return dataSet;
     }
 
+    /**
+     * 
+     * @return
+     * 
+     * @deprecated use {@link #getDefaultSchema()} instead
+     */
+    @Deprecated
     protected Schema getMainSchemaInternal() {
-        Schema schema = _mainSchema;
-        if (schema == null) {
-            schema = getMainSchema();
-            _mainSchema = schema;
-        }
-        return schema;
+        return getDefaultSchema();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/pom.xml
----------------------------------------------------------------------
diff --git a/excel/pom.xml b/excel/pom.xml
index c600f5d..d829c74 100644
--- a/excel/pom.xml
+++ b/excel/pom.xml
@@ -40,7 +40,7 @@ under the License.
                <dependency>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi-ooxml</artifactId>
-                       <version>3.9</version>
+                       <version>3.12</version>
                        <exclusions>
                                <exclusion>
                                        <groupId>commons-logging</groupId>

http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
----------------------------------------------------------------------
diff --git 
a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java 
b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
index 2342e3c..5963e69 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
@@ -74,9 +74,9 @@ public final class ExcelDataContext extends 
QueryPostprocessDataContext implemen
      * Constructs an Excel DataContext based on a resource and a custom
      * configuration.
      *
-     * The file provided can be either existing or non-existing. In the
-     * case of non-existing files, a file will be automatically created
-     * when a CREATE TABLE update is executed on the DataContext.
+     * The file provided can be either existing or non-existing. In the case of
+     * non-existing files, a file will be automatically created when a CREATE
+     * TABLE update is executed on the DataContext.
      * 
      * @param file
      * @param configuration
@@ -151,10 +151,10 @@ public final class ExcelDataContext extends 
QueryPostprocessDataContext implemen
         try {
             SpreadsheetReaderDelegate delegate = 
getSpreadsheetReaderDelegate(inputStreamRef);
             inputStream = inputStreamRef.get();
-            
+
             // METAMODEL-47: Ensure that we have loaded the schema at this 
point
             getDefaultSchema();
-            
+
             DataSet dataSet = delegate.executeQuery(inputStream, table, 
columns, maxRows);
             return dataSet;
         } catch (Exception e) {
@@ -191,6 +191,12 @@ public final class ExcelDataContext extends 
QueryPostprocessDataContext implemen
         }
     }
 
+    @Override
+    protected void onSchemaCacheRefreshed() {
+        super.onSchemaCacheRefreshed();
+        _spreadsheetReaderDelegate = null;
+    }
+
     /**
      * Convenient method for testing and inspecting internal state.
      * 
@@ -203,7 +209,8 @@ public final class ExcelDataContext extends 
QueryPostprocessDataContext implemen
         return null;
     }
 
-    private SpreadsheetReaderDelegate 
getSpreadsheetReaderDelegate(Ref<InputStream> inputStream) throws 
MetaModelException {
+    private SpreadsheetReaderDelegate 
getSpreadsheetReaderDelegate(Ref<InputStream> inputStream)
+            throws MetaModelException {
         if (_spreadsheetReaderDelegate == null) {
             synchronized (this) {
                 if (_spreadsheetReaderDelegate == null) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
----------------------------------------------------------------------
diff --git 
a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java 
b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
index f553ddf..c7c3696 100644
--- a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
+++ b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
@@ -586,10 +586,15 @@ public class ExcelDataContextTest extends TestCase {
         assertFalse(ds.next());
     }
 
-    public void testCreateTable() throws Exception {
+    public void testCreateTableXls() throws Exception {
         // run the same test with both XLS and XLSX (because of different
         // workbook implementations)
         runCreateTableTest(new File("target/xls_people_created.xls"));
+    }
+
+    public void testCreateTableXlsx() throws Exception {
+        // run the same test with both XLS and XLSX (because of different
+        // workbook implementations)
         runCreateTableTest(new File("target/xls_people_created.xlsx"));
     }
 
@@ -680,8 +685,7 @@ public class ExcelDataContextTest extends TestCase {
 
         dc.refreshSchemas();
 
-        assertEquals("[my_table_2]", Arrays.toString(schema.getTableNames()));
-
+        assertEquals("[my_table_2]", 
Arrays.toString(dc.getDefaultSchema().getTableNames()));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
     }
 

Reply via email to