Created
August 23, 2013 13:34
-
-
Save kaspersorensen/6319391 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java | |
| index f5e9340..0806d21 100644 | |
| --- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java | |
| +++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java | |
| @@ -21,6 +21,7 @@ package org.apache.metamodel.salesforce; | |
| import java.text.SimpleDateFormat; | |
| import java.util.Date; | |
| import java.util.List; | |
| +import java.util.Locale; | |
| import java.util.TimeZone; | |
| import org.apache.metamodel.MetaModelException; | |
| @@ -279,19 +280,22 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement | |
| } else if (operand instanceof Date) { | |
| final SimpleDateFormat dateFormat; | |
| switch (selectItem.getExpectedColumnType()) { | |
| - case TIME: | |
| - dateFormat = new SimpleDateFormat(SOQL_TIME_FORMAT_OUT); | |
| - break; | |
| case DATE: | |
| + // note: we don't apply the timezone for DATE fields, since they | |
| + // don't contain time-of-day information. | |
| dateFormat = new SimpleDateFormat(SOQL_DATE_FORMAT_OUT); | |
| break; | |
| + case TIME: | |
| + dateFormat = new SimpleDateFormat(SOQL_TIME_FORMAT_OUT, Locale.ENGLISH); | |
| + dateFormat.setTimeZone(SOQL_TIMEZONE); | |
| + break; | |
| case TIMESTAMP: | |
| default: | |
| - dateFormat = new SimpleDateFormat(SOQL_DATE_TIME_FORMAT_OUT); | |
| + dateFormat = new SimpleDateFormat(SOQL_DATE_TIME_FORMAT_OUT, Locale.ENGLISH); | |
| + dateFormat.setTimeZone(SOQL_TIMEZONE); | |
| break; | |
| } | |
| - dateFormat.setTimeZone(SOQL_TIMEZONE); | |
| String str = dateFormat.format((Date) operand); | |
| logger.debug("Date '{}' formatted as: {}", operand, str); | |
| sb.append(str); | |
| diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java | |
| index 0070296..4bab4bc 100644 | |
| --- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java | |
| +++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java | |
| @@ -20,6 +20,7 @@ package org.apache.metamodel.salesforce; | |
| import java.text.ParseException; | |
| import java.text.SimpleDateFormat; | |
| +import java.util.Locale; | |
| import java.util.concurrent.atomic.AtomicInteger; | |
| import org.apache.metamodel.data.AbstractDataSet; | |
| @@ -112,19 +113,22 @@ final class SalesforceDataSet extends AbstractDataSet { | |
| if (columnType.isTimeBased()) { | |
| final SimpleDateFormat dateFormat; | |
| switch (columnType) { | |
| - case TIME: | |
| - dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_TIME_FORMAT_IN); | |
| - break; | |
| case DATE: | |
| - dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_DATE_FORMAT_IN); | |
| + // note: we don't apply the timezone for DATE fields, since | |
| + // they don't contain time-of-day information. | |
| + dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_DATE_FORMAT_IN, Locale.ENGLISH); | |
| + break; | |
| + case TIME: | |
| + dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_TIME_FORMAT_IN, Locale.ENGLISH); | |
| + dateFormat.setTimeZone(SalesforceDataContext.SOQL_TIMEZONE); | |
| break; | |
| case TIMESTAMP: | |
| default: | |
| - dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_DATE_TIME_FORMAT_IN); | |
| + dateFormat = new SimpleDateFormat(SalesforceDataContext.SOQL_DATE_TIME_FORMAT_IN, Locale.ENGLISH); | |
| + dateFormat.setTimeZone(SalesforceDataContext.SOQL_TIMEZONE); | |
| break; | |
| } | |
| - dateFormat.setTimeZone(SalesforceDataContext.SOQL_TIMEZONE); | |
| try { | |
| return dateFormat.parse(value.toString()); | |
| } catch (ParseException e) { | |
| diff --git a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java | |
| index 4bd3954..a68f25c 100644 | |
| --- a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java | |
| +++ b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java | |
| @@ -19,6 +19,7 @@ | |
| package org.apache.metamodel.salesforce; | |
| import java.sql.Timestamp; | |
| +import java.text.SimpleDateFormat; | |
| import java.util.ArrayList; | |
| import java.util.Arrays; | |
| import java.util.Calendar; | |
| @@ -30,6 +31,7 @@ import org.apache.metamodel.UpdateCallback; | |
| import org.apache.metamodel.UpdateScript; | |
| import org.apache.metamodel.data.DataSet; | |
| import org.apache.metamodel.data.Row; | |
| +import org.apache.metamodel.delete.DeleteFrom; | |
| import org.apache.metamodel.query.FilterItem; | |
| import org.apache.metamodel.query.OperatorType; | |
| import org.apache.metamodel.query.Query; | |
| @@ -270,6 +272,59 @@ public class SalesforceDataContextTest extends SalesforceTestCase { | |
| ds.close(); | |
| } | |
| + public void testInsertInContactsWithBirthdate() throws Exception { | |
| + if (!isConfigured()) { | |
| + System.err.println(getInvalidConfigurationMessage()); | |
| + return; | |
| + } | |
| + | |
| + SalesforceDataContext dc = new SalesforceDataContext(getUsername(), getPassword(), getSecurityToken()); | |
| + | |
| + final String tableName = "Contact"; | |
| + final String firstName = "MetaModelJohn"; | |
| + final String lastName = "MetaModelDoe"; | |
| + final String dateString = "1980-08-08 05:10:22"; | |
| + | |
| + final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| + final Date dateValue = dateFormat.parse(dateString); | |
| + assertEquals("1980-08-08 05:10:22", dateFormat.format(dateValue)); | |
| + | |
| + final Table table = dc.getTableByQualifiedLabel(tableName); | |
| + | |
| + dc.executeUpdate(new UpdateScript() { | |
| + @Override | |
| + public void run(UpdateCallback callback) { | |
| + callback.insertInto(table).value("FirstName", firstName).value("LastName", lastName) | |
| + .value("BirthDate", dateValue).execute(); | |
| + } | |
| + }); | |
| + | |
| + final DataSet dataSet = dc.query().from(table).select("Id", "BirthDate").where("FirstName").eq(firstName) | |
| + .where("LastName").eq(lastName).execute(); | |
| + | |
| + int rows = 0; | |
| + | |
| + while (dataSet.next()) { | |
| + final String id = (String) dataSet.getRow().getValue(0); | |
| + try { | |
| + assertNotNull(id); | |
| + | |
| + final Object dateValueFromDataSet = dataSet.getRow().getValue(1); | |
| + assertTrue(dateValueFromDataSet instanceof Date); | |
| + assertEquals("1980-08-08 00:00:00", dateFormat.format(dateValueFromDataSet)); | |
| + | |
| + } finally { | |
| + // clean up | |
| + dc.executeUpdate(new DeleteFrom(table).where("Id").eq(id)); | |
| + } | |
| + | |
| + rows++; | |
| + } | |
| + | |
| + assertEquals(1, rows); | |
| + | |
| + } | |
| + | |
| public void testRewriteWhereItem() throws Exception { | |
| final StringBuilder sb = new StringBuilder("FOOBAR: "); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
My only concern with this fix is that we are restricting users to use Locale as English . We rather should have a way for a user to set the locale for the complete metamodel ( e.g. dataContext.setLocale(Locale.XYZ) ) and then we can use that Locale over here. Also default Locale can be set as Locale.english