metamodel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kasper Sørensen <i.am.kasper.soren...@gmail.com>
Subject Re: SalesforceDataSet is throwing exception for insert sql of record having date/time.
Date Thu, 08 Aug 2013 12:56:03 GMT
OK I think we've spend sufficient time by now for people to vote and
perform lazy concensus. Commensing with a commit..

2013/8/8 Balendra Singh <balendrasingh@gmail.com>:
> Yes Kapser,
> I made the changes, mentioned by you and it is working in my machine as well.
> I am fine with the patch updates so +1 for my side for the fix.
>
>
> Thanks,
> Balendra
>
> On 07/08/2013, Kasper Sørensen <i.am.kasper.sorensen@gmail.com> wrote:
>> Hmm seems this is caused because of a time zone conflict in the call
>> to DateUtils.get(year,month,date) ...
>>
>> If you replace
>>
>>         cal.setTime(DateUtils.get(2013, Month.JANUARY, 23));
>>         cal.setTimeZone(TimeZone.getTimeZone("GMT+1"));
>>
>> with this:
>>
>>         cal.setTimeZone(TimeZone.getTimeZone("GMT+1"));
>>         cal.setTimeInMillis(0);
>>         cal.set(Calendar.HOUR, 0);
>>         cal.set(Calendar.MINUTE, 0);
>>         cal.set(Calendar.SECOND, 0);
>>         cal.set(Calendar.MILLISECOND, 0);
>>         cal.set(Calendar.HOUR, 0);
>>         cal.set(Calendar.MINUTE, 0);
>>         cal.set(Calendar.YEAR, 2013);
>>         cal.set(Calendar.MONTH, Calendar.JANUARY);
>>         cal.set(Calendar.DAY_OF_MONTH, 23);
>>
>> Then I believe it works, right? (At least did for me if I changed my
>> machines time zone).
>>
>> Java date handling, sigh :-(
>>
>> 2013/8/7 Balendra Singh <balendrasingh@gmail.com>:
>>> Kasper,
>>>
>>> I agree with your updates on the patch.I have a doubt regarding the
>>>  SalesforceDataContextTest.testRewriteWhereItem. This test is failing as
>>> time returned is something different from the assert value. Thats why I
>>> had
>>> to update the assert values in updated patch.
>>> Please provide your inputs on this.
>>>
>>>
>>> Thanks,
>>> Balendra
>>>
>>>
>>> On 7 August 2013 15:06, Kasper Sørensen
>>> <i.am.kasper.sorensen@gmail.com>wrote:
>>>
>>>> I checked the updated patch and it looks good. I did make a few minor
>>>> changes, the primary one is to check against the ColumnType in the
>>>> rewriteFilterItem(...) method, instead of checking against the operand
>>>> type. The reason is that a java.util.Date can be passed as both a DATE
>>>> or as a TIMESTAMP value. Even as a TIME value. So the evaluation of
>>>> which date format to use should be on the basis of the column metadata
>>>> instead of the object that is passed in by the user.
>>>>
>>>> Uploaded the patch with my additions to JIRA as well. Please let me
>>>> know if you agree to the adjustments.
>>>>
>>>> 2013/8/7 Balendra Singh <balendrasingh@gmail.com>:
>>>> > Hi Kasper,
>>>> >
>>>> > * In SalesforceDataSet, replaced tabs by spaces.
>>>> > * In the test SalesforceDataContextTest.testRewriteWhereItem - I
>>>> > changed
>>>> > the timezone to previous GMT+1 but with this also, it was failing so
I
>>>> had
>>>> > to change dateTime value to *2013-01-22T18:30:00+0000.*
>>>> > Added the updated patch on the issue.
>>>> > Please provide your inputs.
>>>> >
>>>> >
>>>> > Thanks,
>>>> > Balendra
>>>> > *
>>>> > *
>>>> > *
>>>> > *
>>>> >
>>>> >
>>>> > On 7 August 2013 12:56, Kasper Sørensen
>>>> > <i.am.kasper.sorensen@gmail.com
>>>> >wrote:
>>>> >
>>>> >> Sorry for the late reply Balendra, I just now realized the new JIRA
>>>> >> ticket with the patch [1].
>>>> >>
>>>> >> I looked at the patch and it looks good except for two small doubts
>>>> >> from my side:
>>>> >>
>>>> >>  * In the SalesforceDataSet all the spaces have been replaced by
>>>> >> tabs.
>>>> >> We do use spaces in MM, and changing it makes it harder to see the
>>>> >> diff.
>>>> >>  * In the test SalesforceDataContextTest.testRewriteWhereItem you've
>>>> >> changed the example input timezone from GMT+1 to UTC. Is there a
>>>> >> reason for this? I see you also changed the subsequent assertions,
>>>> >> but
>>>> >> I doubt why this was necesary at all?
>>>> >>
>>>> >> If you can maybe fix/answer these points, then I am good to give
it
>>>> >> my
>>>> +1.
>>>> >>
>>>> >> And a remark for everyone: The patch is made against the org.eobjects
>>>> >> codebase. Obviously we will apply it to both codebases. Since this
is
>>>> >> a bugfix, I imagine it will also go into a bugfix release of the
old
>>>> >> MetaModel.
>>>> >>
>>>> >> [1] https://issues.apache.org/jira/browse/METAMODEL-9
>>>> >>
>>>> >> 2013/8/2 Kasper Sørensen <i.am.kasper.sorensen@gmail.com>:
>>>> >> > Hi Balendra,
>>>> >> >
>>>> >> > Is it possible for you to post it as a patch file. Either upload
it
>>>> >> > to
>>>> >> > the MM JIRA [1] or simply make a gist [2] or so.
>>>> >> >
>>>> >> > [1] https://issues.apache.org/jira/browse/METAMODEL
>>>> >> > [2] https://gist.github.com/
>>>> >> >
>>>> >> > 2013/8/2 Balendra Singh <balendrasingh@gmail.com>:
>>>> >> >> Hi,
>>>> >> >>
>>>> >> >> In my case field type is date. SalesforceTable is returning
>>>> >> ColumnType.DATE
>>>> >> >> for date, datetime and time. In SalesforceDataSet, it is
using a
>>>> >> datetime
>>>> >> >> format to format my date value field and was throwing exception.
>>>> >> >>
>>>> >> >> I made the following fixes for this issue -
>>>> >> >>
>>>> >> >> 1. In SalesforceDataSet.convert(Object value, ColumnType
>>>> >> >> columnType)
>>>> >> >>
>>>> >> >> private Object convert(Object value, ColumnType columnType)
{
>>>> >> >> if (value instanceof String && !columnType.isLiteral())
{
>>>> >> >> if (columnType.isBoolean()) {
>>>> >> >> return BooleanComparator.toBoolean(value);
>>>> >> >> }
>>>> >> >> if (columnType.isNumber()) {
>>>> >> >> return NumberComparator.toNumber(columnType.isNumber());
>>>> >> >> }
>>>> >> >> if (columnType.isTimeBased()) {
>>>> >> >>
>>>> >> >> SimpleDateFormat format;
>>>> >> >> *if (columnType == ColumnType.DATE) {*
>>>> >> >> *
>>>> >> >> *
>>>> >> >> * format = new SimpleDateFormat(*
>>>> >> >> * SalesforceDataContext.SOQL_DATE_FORMAT_IN);*
>>>> >> >> * } else if (columnType == ColumnType.TIMESTAMP) {*
>>>> >> >> * format = new SimpleDateFormat(*
>>>> >> >> * SalesforceDataContext.SOQL_DATE_TIME_FORMAT_IN);*
>>>> >> >> * } else {*
>>>> >> >> * format = new SimpleDateFormat(*
>>>> >> >> * SalesforceDataContext.SOQL_TIME_FORMAT_IN);*
>>>> >> >> * }*
>>>> >> >> format.setTimeZone(SalesforceDataContext.SOQL_TIMEZONE);
>>>> >> >> try {
>>>> >> >> return format.parse(value.toString());
>>>> >> >> } catch (ParseException e) {
>>>> >> >> throw new IllegalStateException(
>>>> >> >> "Unable to parse date/time value: " + value);
>>>> >> >> }
>>>> >> >> }
>>>> >> >> }
>>>> >> >> return value;
>>>> >> >> }
>>>> >> >>
>>>> >> >>
>>>> >> >> 2. In SalesforceDataContext added the following date format
strings
>>>> >> >> -
>>>> >> >>
>>>> >> >>     public static final String SOQL_DATE_FORMAT_IN = "yyyy-MM-dd";
>>>> >> >>     public static final String SOQL_DATE_FORMAT_OUT =
>>>> >> >> "yyyy-MM-dd";
>>>> >> >>     public static final String SOQL_DATE_TIME_FORMAT_IN
=
>>>> >> >> "yyyy-MM-dd'T'HH:mm:ss.SSS";
>>>> >> >>     public static final String SOQL_DATE_TIME_FORMAT_OUT
=
>>>> >> >> "yyyy-MM-dd'T'HH:mm:ssZZZ";
>>>> >> >>     public static final String SOQL_TIME_FORMAT_IN =
>>>> >> >> "HH:mm:ss.SSS";
>>>> >> >>     public static final String SOQL_TIME_FORMAT_OUT =
>>>> >> >> "HH:mm:ssZZZ";
>>>> >> >>
>>>> >> >> 3. In SalesforceTable.toColumnType - I have returned specific
date
>>>> >> >> datatypes
>>>> >> >>
>>>> >> >>
>>>> >> >>  protected static ColumnType toColumnType(FieldType type)
{
>>>> >> >>         switch (type) {
>>>> >> >>         case _boolean:
>>>> >> >>             return ColumnType.BOOLEAN;
>>>> >> >>         case _int:
>>>> >> >>             return ColumnType.INTEGER;
>>>> >> >>         case _double:
>>>> >> >>             return ColumnType.DOUBLE;
>>>> >> >> *        case date:*
>>>> >> >> *        return ColumnType.DATE;*
>>>> >> >> *        case datetime:*
>>>> >> >> *        return ColumnType.TIMESTAMP;*
>>>> >> >> *        case time:*
>>>> >> >> *            return ColumnType.TIME;*
>>>> >> >>         case string:
>>>> >> >>         case email:
>>>> >> >>         case url:
>>>> >> >>         case phone:
>>>> >> >>         case reference:
>>>> >> >>         case textarea:
>>>> >> >>         case encryptedstring:
>>>> >> >>         case base64:
>>>> >> >>         case currency:
>>>> >> >>         case id:
>>>> >> >>         case picklist:
>>>> >> >>             return ColumnType.VARCHAR;
>>>> >> >>         }
>>>> >> >>         return ColumnType.OTHER;
>>>> >> >>     }
>>>> >> >>
>>>> >> >> Please validate the code changes for the issue.
>>>> >> >>
>>>> >> >>
>>>> >> >> Thanks,
>>>> >> >> Balendra
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> On 1 August 2013 18:41, Kasper Sørensen <
>>>> i.am.kasper.sorensen@gmail.com
>>>> >> >wrote:
>>>> >> >>
>>>> >> >>> Strange, it seems that Salesforce sends dates back
in not just a
>>>> >> >>> single, but various formats. Usually we have seen the
format
>>>> >> >>> "yyyy-MM-dd'T'HH:mm:ss.SSS" (Represented by
>>>> >> >>> SalesforceDataContext.SOQL_DATE_FORMAT_IN). In your
case it seems
>>>> >> >>> it
>>>> >> >>> simply sent a date in the format yyyy-MM-dd. Do you
happen to
>>>> >> >>> know
>>>> >> >>> what field this failed for, and what datatype it had?
Maybe this
>>>> >> >>> is
>>>> a
>>>> >> >>> simple case that we need to distinguish in a more detailed
manner
>>>> for
>>>> >> >>> e.g. DATE vs DATETIME vs TIMESTAMP types...
>>>> >> >>>
>>>> >> >>> Anyways, the fix shouldn't be too hard. Simplest solution
would
>>>> >> >>> be
>>>> to
>>>> >> >>> simply make a "convertToDate(String)" method in SalesforceUtils
>>>> >> >>> and
>>>> >> >>> probe the incoming string to select a proper date format.
>>>> >> >>>
>>>> >> >>> 2013/8/1 Balendra Singh <balendrasingh@gmail.com>:
>>>> >> >>> > While using metamodel in our project we found
the following
>>>> >> exception -
>>>> >> >>> >
>>>> >> >>> > In salesforce, if date value is provided then
>>>> >> >>> > SalesforceDataSet<http://eobjects.org/trac/wiki/SalesforceDataSet
>>>> >
>>>> >> is
>>>> >> >>> > throwing following exception while inserting this
record to
>>>> >> >>> > some
>>>> >> other
>>>> >> >>> > database.
>>>> >> >>> >
>>>> >> >>> > *Stacktrace*
>>>> >> >>> >
>>>> >> >>> > Job execution FAILURE - Unable to parse date/time
value:
>>>> 2012-08-02 (
>>>> >> >>> > IllegalStateException <
>>>> >> >>> http://eobjects.org/trac/wiki/IllegalStateException>)
>>>> >> >>> > - Exception stacktrace of failure condition:
>>>> >> >>> > java.lang.IllegalStateException<
>>>> >> >>> http://eobjects.org/trac/wiki/IllegalStateException>:
>>>> >> >>> > Unable to parse date/time value: 2012-08-02 at
>>>> >> >>> > org.eobjects.metamodel.salesforce.SalesforceDataSet<
>>>> >> >>> http://eobjects.org/trac/wiki/SalesforceDataSet>.
>>>> >> >>> > convert(SalesforceDataSet
>>>> >> >>> > <http://eobjects.org/trac/wiki/SalesforceDataSet>.java:119)
>>>> >> >>> > at org.eobjects.metamodel.salesforce.SalesforceDataSet<
>>>> >> >>> http://eobjects.org/trac/wiki/SalesforceDataSet>
>>>> >> >>> > .getRow(SalesforceDataSet
>>>> >> >>> > <http://eobjects.org/trac/wiki/SalesforceDataSet>.java:98)
>>>> >> >>> > at org.eobjects.analyzer.job.runner.
>>>> >> >>> > RowProcessingPublisher<
>>>> >> >>> http://eobjects.org/trac/wiki/RowProcessingPublisher>
>>>> >> >>> > .processRows(RowProcessingPublisher<
>>>> >> >>> http://eobjects.org/trac/wiki/RowProcessingPublisher>.java:295)
>>>> >> >>> > at
>>>> >> >>> > org.eobjects.analyzer.job.tasks.RunRowProcessingPublisherTask?<
>>>> >> >>> http://eobjects.org/trac/wiki/RunRowProcessingPublisherTask>
>>>> >> >>> > .execute(RunRowProcessingPublisherTask?<
>>>> >> >>> http://eobjects.org/trac/wiki/RunRowProcessingPublisherTask>
>>>> >> >>> > .java:43)
>>>> >> >>> >
>>>> >> >>> > at org.eobjects.analyzer.job.concurrent.TaskRunnable<
>>>> >> >>> http://eobjects.org/trac/wiki/TaskRunnable>
>>>> >> >>> > .run(TaskRunnable <http://eobjects.org/trac/wiki/TaskRunnable
>>>> >> >.java:63)
>>>> >> >>> at
>>>> >> >>> > java.util.concurrent.ThreadPoolExecutor<
>>>> >> >>> http://eobjects.org/trac/wiki/ThreadPoolExecutor>
>>>> >> >>> > $Worker.runTask(ThreadPoolExecutor<
>>>> >> >>> http://eobjects.org/trac/wiki/ThreadPoolExecutor>.java:886)
>>>> >> >>> > at java.util.concurrent.ThreadPoolExecutor<
>>>> >> >>> http://eobjects.org/trac/wiki/ThreadPoolExecutor>
>>>> >> >>> > $Worker.run(ThreadPoolExecutor?<
>>>> >> >>> http://eobjects.org/trac/wiki/ThreadPoolExecutor>.java:908)
>>>> >> >>> > at java.lang.Thread.run(Thread.java:662)
>>>> >> >>>
>>>> >>
>>>>
>>

Mime
View raw message