From 6c78bc61cf3c459e4ac2335413baf1dbcf7e6975 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Sat, 23 May 2015 21:43:19 +0530 Subject: [PATCH 1/2] METAMODEL-143 fix --- .../create/AbstractTableCreationBuilder.java | 18 ++++++++ .../apache/metamodel/create/ContextType.java | 45 +++++++++++++++++++ .../metamodel/MockUpdateableDataContext.java | 10 ++++- .../AbstractCreateTableBuilderTest.java | 16 +++++++ 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/apache/metamodel/create/ContextType.java diff --git a/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java b/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java index 401be9f6a..18808d458 100644 --- a/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java +++ b/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java @@ -18,6 +18,9 @@ */ package org.apache.metamodel.create; +import java.util.Map; +import java.util.Map.Entry; + import org.apache.metamodel.UpdateCallback; import org.apache.metamodel.schema.Column; import org.apache.metamodel.schema.ColumnType; @@ -81,6 +84,10 @@ public TableCreationBuilder like(Table table) { @Override public ColumnCreationBuilder withColumn(String name) { + if(getUpdateCallback() != null) { + String dataContext = getUpdateCallback().getDataContext().getClass().getSimpleName(); + name = removeInvalidChars(name, ContextType.getContext(dataContext)); + } logger.debug("withColumn({})", name); MutableColumn col = (MutableColumn) _table.getColumnByName(name); if (col == null) { @@ -89,6 +96,17 @@ public ColumnCreationBuilder withColumn(String name) { } return new ColumnCreationBuilderImpl(this, col); } + + private String removeInvalidChars(String str, ContextType ctx) { + if(ctx == null) { + return str; + } + Map charMap = ctx.getCharMap(); + for(Entry charTuple : charMap.entrySet()) { + str = str.replaceAll(charTuple.getKey(), charTuple.getValue()); + } + return str; + } @Override public String toString() { diff --git a/core/src/main/java/org/apache/metamodel/create/ContextType.java b/core/src/main/java/org/apache/metamodel/create/ContextType.java new file mode 100644 index 000000000..4cae14850 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/create/ContextType.java @@ -0,0 +1,45 @@ +package org.apache.metamodel.create; + +import java.util.HashMap; +import java.util.Map; + +public enum ContextType { + + JdbcDataContext { + void updateCharMap() { + charMap.put(" ", "_"); + charMap.put(";", "_"); + } + }, + CsvDataContext { + void updateCharMap() { + charMap.put(";",""); + } + }, + MockUpdateableDataContext { + void updateCharMap() { + charMap.put(" ", "_"); + charMap.put("'", ""); + } + }; + + Map charMap = new HashMap(); + + private ContextType() { + updateCharMap(); + } + + public Map getCharMap() { + return new HashMap(charMap); + } + + public static ContextType getContext(String contextName) { + try { + return ContextType.valueOf(contextName); + } catch(IllegalArgumentException exp) { + return null; + } + } + + abstract void updateCharMap(); +} diff --git a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java index b006a7cf3..916746181 100644 --- a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java +++ b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.List; +import org.apache.metamodel.create.AbstractTableCreationBuilder; import org.apache.metamodel.create.TableCreationBuilder; import org.apache.metamodel.data.CachingDataSetHeader; import org.apache.metamodel.data.DataSet; @@ -151,7 +152,14 @@ public TableDropBuilder dropTable(Table table) throws IllegalArgumentException, @Override public TableCreationBuilder createTable(Schema schema, String name) throws IllegalArgumentException, IllegalStateException { - throw new UnsupportedOperationException(); + return new AbstractTableCreationBuilder(this,schema,name) { + + @Override + public Table execute() throws MetaModelException { + throw new UnsupportedOperationException(); + } + + }; } }); } diff --git a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java index c4d320c01..727f64104 100644 --- a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java +++ b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java @@ -21,7 +21,10 @@ import junit.framework.TestCase; import org.apache.metamodel.MetaModelException; +import org.apache.metamodel.MockUpdateableDataContext; import org.apache.metamodel.UpdateCallback; +import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.schema.ColumnType; import org.apache.metamodel.schema.MutableColumn; import org.apache.metamodel.schema.MutableSchema; @@ -104,4 +107,17 @@ public Table execute() throws MetaModelException { assertEquals("Column[name=baz,columnNumber=2,type=null,nullable=null,nativeType=null,columnSize=null]", table.getColumns()[2].toString()); } + + public void testInvalidCharReplacement() { + UpdateableDataContext context = new MockUpdateableDataContext(); + context.executeUpdate(new UpdateScript() { + + @Override + public void run(UpdateCallback callback) { + ColumnCreationBuilder builder = callback.createTable("schema", "test").withColumn("ID NO").ofType(ColumnType.NUMBER). + withColumn("person'sname").ofType(ColumnType.VARCHAR); + assertEquals("CREATE TABLE schema.test (ID_NO NUMBER,personsname VARCHAR)", builder.toSql()); + } + }); + } } From 230f5c8a41f41f178a4365c99cd5041c3b851299 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Sat, 23 May 2015 21:48:42 +0530 Subject: [PATCH 2/2] METAMODEL-143 fix --- core/src/main/java/org/apache/metamodel/create/ContextType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/metamodel/create/ContextType.java b/core/src/main/java/org/apache/metamodel/create/ContextType.java index 4cae14850..43071356f 100644 --- a/core/src/main/java/org/apache/metamodel/create/ContextType.java +++ b/core/src/main/java/org/apache/metamodel/create/ContextType.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -public enum ContextType { +enum ContextType { JdbcDataContext { void updateCharMap() {