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 Wed, 07 Aug 2013 11:27:33 GMT
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