From aafaa8f12793373085d10ffb58664f868fa397d4 Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Sat, 12 Nov 2011 02:56:39 +0000 Subject: [PATCH] some tweaks, fixes, and tests for unsupported values git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@592 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../complex/ComplexValueForeignKey.java | 13 +++- .../complex/UnsupportedColumnInfo.java | 14 ++-- .../V2007/unsupportedFieldsTestV2007.accdb | Bin 0 -> 622592 bytes .../jackcess/ComplexColumnTest.java | 60 +++++++++++++++++- .../jackcess/DatabaseTest.java | 38 +++++++++++ .../jackcess/JetFormatTest.java | 3 +- 6 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 test/data/V2007/unsupportedFieldsTestV2007.accdb diff --git a/src/java/com/healthmarketscience/jackcess/complex/ComplexValueForeignKey.java b/src/java/com/healthmarketscience/jackcess/complex/ComplexValueForeignKey.java index d236afe..ba31a3b 100644 --- a/src/java/com/healthmarketscience/jackcess/complex/ComplexValueForeignKey.java +++ b/src/java/com/healthmarketscience/jackcess/complex/ComplexValueForeignKey.java @@ -167,6 +167,16 @@ public class ComplexValueForeignKey extends Number return (List)getValues(); } + @SuppressWarnings("unchecked") + public List getUnsupportedValues() + throws IOException + { + if(getComplexType() != ComplexDataType.UNSUPPORTED) { + throw new UnsupportedOperationException(); + } + return (List)getValues(); + } + public void reset() { // discard any cached values _values = null; @@ -246,7 +256,8 @@ public class ComplexValueForeignKey extends Number return value; } - public UnsupportedValue addUnsupportedValue(Map values) + public UnsupportedValue addUnsupportedValue( + Map values) throws IOException { reset(); diff --git a/src/java/com/healthmarketscience/jackcess/complex/UnsupportedColumnInfo.java b/src/java/com/healthmarketscience/jackcess/complex/UnsupportedColumnInfo.java index 7275511..27ee434 100644 --- a/src/java/com/healthmarketscience/jackcess/complex/UnsupportedColumnInfo.java +++ b/src/java/com/healthmarketscience/jackcess/complex/UnsupportedColumnInfo.java @@ -59,8 +59,10 @@ public class UnsupportedColumnInfo extends ComplexColumnInfo { int id = (Integer)getPrimaryKeyColumn().getRowValue(rawValue); - Map values = new LinkedHashMap(rawValue); - values.remove(getPrimaryKeyColumn().getName()); + Map values = new LinkedHashMap(); + for(Column col : getValueColumns()) { + col.setRowValue(values, col.getRowValue(rawValue)); + } return new UnsupportedValueImpl(id, complexValueFk, values); } @@ -77,13 +79,15 @@ public class UnsupportedColumnInfo extends ComplexColumnInfo return row; } - public static UnsupportedValue newValue(Map values) { + public static UnsupportedValue newValue(Map values) { return newValue(INVALID_COMPLEX_VALUE_ID, values); } public static UnsupportedValue newValue( - ComplexValueForeignKey complexValueFk, Map values) { - return new UnsupportedValueImpl(INVALID_ID, complexValueFk, values); + ComplexValueForeignKey complexValueFk, + Map values) { + return new UnsupportedValueImpl(INVALID_ID, complexValueFk, + new LinkedHashMap(values)); } private static class UnsupportedValueImpl extends ComplexValueImpl diff --git a/test/data/V2007/unsupportedFieldsTestV2007.accdb b/test/data/V2007/unsupportedFieldsTestV2007.accdb new file mode 100644 index 0000000000000000000000000000000000000000..c7b1dea8ccbdc6b0dda6a4234f311a117608a814 GIT binary patch literal 622592 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 SfC!9B;Pkj5HxMwTO#UBfpi9O8 literal 0 HcmV?d00001 diff --git a/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java index f9f4445..09ec547 100644 --- a/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java @@ -24,12 +24,13 @@ import java.util.Date; import java.util.List; import java.util.Map; -import static com.healthmarketscience.jackcess.JetFormatTest.*; import static com.healthmarketscience.jackcess.DatabaseTest.*; +import static com.healthmarketscience.jackcess.JetFormatTest.*; import com.healthmarketscience.jackcess.complex.Attachment; import com.healthmarketscience.jackcess.complex.ComplexDataType; import com.healthmarketscience.jackcess.complex.ComplexValueForeignKey; import com.healthmarketscience.jackcess.complex.SingleValue; +import com.healthmarketscience.jackcess.complex.UnsupportedValue; import com.healthmarketscience.jackcess.complex.Version; import junit.framework.TestCase; @@ -155,7 +156,6 @@ public class ComplexColumnTest extends TestCase for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.COMPLEX)) { Database db = openCopy(testDB); - db.setTimeZone(TEST_TZ); Table t1 = db.getTable("Table1"); Column col = t1.getColumn("attach-data"); @@ -231,7 +231,6 @@ public class ComplexColumnTest extends TestCase for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.COMPLEX)) { Database db = openCopy(testDB); - db.setTimeZone(TEST_TZ); Table t1 = db.getTable("Table1"); Column col = t1.getColumn("multi-value-data"); @@ -298,6 +297,38 @@ public class ComplexColumnTest extends TestCase } } + public void testUnsupported() throws Exception + { + for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.UNSUPPORTED)) { + + Database db = openCopy(testDB); + + Table t1 = db.getTable("Test"); + Column col = t1.getColumn("UnknownComplex"); + assertEquals(ComplexDataType.UNSUPPORTED, + col.getComplexInfo().getType()); + + for(Map row : t1) { + Integer rowId = (Integer)row.get("ID"); + ComplexValueForeignKey complexValueFk = + (ComplexValueForeignKey)col.getRowValue(row); + + if(rowId.equals(1)) { + checkUnsupportedValues(1, complexValueFk, + "RawData: FF FE 62 61 7A"); + } else if(rowId.equals(2)) { + checkUnsupportedValues(2, complexValueFk, "RawData: FF FE 66 6F 6F", "RawData: FF FE 62 61 7A"); + } else if(rowId.equals(3)) { + checkUnsupportedValues(3, complexValueFk); + } else { + assertTrue(false); + } + } + + db.close(); + } + } + private static void checkVersions( int cValId, ComplexValueForeignKey complexValueFk, String curValue, Object... versionInfos) @@ -365,6 +396,29 @@ public class ComplexColumnTest extends TestCase } } + private static void checkUnsupportedValues( + int cValId, ComplexValueForeignKey complexValueFk, + String... expectedValues) + throws Exception + { + assertEquals(cValId, complexValueFk.get()); + + List values = complexValueFk.getUnsupportedValues(); + if(expectedValues.length == 0) { + assertTrue(values.isEmpty()); + } else { + assertEquals(expectedValues.length, values.size()); + for(int i = 0; i < expectedValues.length; ++i) { + String value = expectedValues[i]; + UnsupportedValue v = values.get(i); + assertEquals(1, v.getValues().size()); + Object rv = v.get("Value"); + assertTrue(Column.isRawData(rv)); + assertEquals(value, rv.toString()); + } + } + } + private static byte[] getFileBytes(String fname) throws Exception { if("test_data.txt".equals(fname)) { diff --git a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java index 1f118ca..2c70a19 100644 --- a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java @@ -1157,6 +1157,44 @@ public class DatabaseTest extends TestCase { db.close(); } } + + public void testUnsupportedColumns() throws Exception { + for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.UNSUPPORTED)) { + + Database db = open(testDB); + Table t = db.getTable("Test"); + Column varCol = t.getColumn("UnknownVar"); + assertEquals(DataType.UNSUPPORTED_VARLEN, varCol.getType()); + Column fixCol = t.getColumn("UnknownFix"); + assertEquals(DataType.UNSUPPORTED_FIXEDLEN, fixCol.getType()); + + List varVals = Arrays.asList( + "RawData: FF FE 73 6F 6D 65 64 61 74 61", + "RawData: FF FE 6F 74 68 65 72 20 64 61 74 61", + null); + List fixVals = Arrays.asList("RawData: 37 00 00 00", + "RawData: F3 FF FF FF", + "RawData: 02 00 00 00"); + + int idx = 0; + for(Map row : t) { + checkRawValue(varVals.get(idx), varCol.getRowValue(row)); + checkRawValue(fixVals.get(idx), fixCol.getRowValue(row)); + ++idx; + } + db.close(); + } + } + + private void checkRawValue(String expected, Object val) + { + if(expected != null) { + assertTrue(Column.isRawData(val)); + assertEquals(expected, val.toString()); + } else { + assertNull(val); + } + } static Object[] createTestRow(String col1Val) { return new Object[] {col1Val, "R", "McCune", 1234, (byte) 0xad, 555.66d, diff --git a/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java b/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java index 22dff2d..ec11dce 100644 --- a/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java @@ -42,7 +42,8 @@ public class JetFormatTest extends TestCase { INDEX_CODES("testIndexCodes"), INDEX_PROPERTIES("testIndexProperties"), PROMOTION("testPromotion"), - COMPLEX("complexDataTest"); + COMPLEX("complexDataTest"), + UNSUPPORTED("unsupportedFieldsTest"); private final String _basename; -- 2.39.5