Skip to content

Instantly share code, notes, and snippets.

@kaspersorensen
Created August 23, 2013 13:34
Show Gist options
  • Select an option

  • Save kaspersorensen/6319391 to your computer and use it in GitHub Desktop.

Select an option

Save kaspersorensen/6319391 to your computer and use it in GitHub Desktop.
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: ");
@vinsjee
Copy link

vinsjee commented Aug 23, 2013

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment