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 <[email protected]>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 <[email protected]>:
> > 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 <[email protected]>:
> >> 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 <[email protected]
> >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 <[email protected]>:
> >>> > 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)
> >>>
>

Reply via email to