Trouble with using Freemarker to formate Date for GeoServer GetFeatureInfo

690 Views Asked by At

I'm having some trouble while trying to use the Freemarker Template to display dates in the desired format.

I store points with a date information in a PostGIS database written through an FME-process in an ISO format (%Y-%m-%d) to use them in an time-enabled WMS with GeoServer.

When calling the GetFeatureInfo, the date is displayed in the following format 10/4/12 12:00 AM, where it should be 2012-10-04. We allready changened the server setting to -Dorg.geotools.localDateTimeHandling=true -Duser.country=DE -Duser.timezone=GMT -Duser.language=de.

Since this didn't give the desired outcome, we tried it with the Freemarker Template. The idea was to check the attributes for date format and format them accordingly. Somehow, I can't make it work. I tried this:

<#if attribute.is_unknown_date_like>
${attribute.value?string("YYYY-MM-DD")}
<#else>
${attribute.value}
</#if>

I get an error message for the line where the condition starts:

freemarker.core.ParseException

How can I make this condition statement work?

2

There are 2 best solutions below

0
ddekany On

Updated: Added parsing to the #else branch, etc.

You could do this if you don't know if attribute.value will be java.lang.String or a java.util.Date:

<#if attribute.value?is_date_like>
${attribute.value?date?string.iso}
<#else>
${attribute.value?date("M/d/yy hh:mm a")?string.iso}
</#if>

If you know the type of attribute.value, then you only have to do what's inside the #if, or the #else.

If you are using a really old version of FreeMarker, then instead of ?string.iso, you have to use ?string("yyyy-MM-dd"). Also then ?is_date_like might not be available yet, and you had to use attribute.value?is_unknown_date_like || attribute.value?is_datetime || attribute.value?is_date.

By the way, if you typically output date/time values with ISO format, then someone should just set the date_format/time_format/datetime_format configuration settings to iso, and then you can omit ?string.iso. (Or, these can be set in the template too, like <#setting date_format='iso'>, etc.)

1
ErikBoehm On

@ddekany, you are rigth, I am sorry. I will keep that in mind for the future!

So I tried your suggestion, and as statet above using a ? still gives back a errror message but it gets more significant.

2020-07-01 08:19:02,521 ERROR [geoserver.ows] - freemarker.core.ParseException: Error on line 29, column 46, in template content.ftl Found is_date_like, expecting one of: is_directive, parent, js_string, j_string, uncap_first, is_transform, number, is_hash, trim, children, has_content, iso_ms, xml, iso_utc, byte, double, left_pad, matches, capitalize, number_to_datetime, contains, size, iso_local_h_nz, iso_utc_ms, iso_local_m_nz, is_collection, long, default, iso_utc_h_nz, iso_local_ms, is_boolean, last_index_of, c, iso_utc_m_nz, is_macro, rtf, iso_utc_nz, upper_case, node_name, reverse, cap_first, url, is_hash_ex, iso_nz, is_enumerable, exists, number_to_date, first, iso_local, date, iso, replace, float, right_pad, datetime, node_type, split, iso_ms_nz, number_to_time, is_sequence, iso_utc_m, html, ancestors, iso_utc_h, iso_local_ms_nz, new, last, sort, eval, lower_case, web_safe, is_date, is_string, iso_local_nz, word_list, seq_last_index_of, node_namespace, string, keys, iso_m_nz, values, seq_index_of, chunk, sort_by, iso_m, starts_with, substring, index_of, iso_h, root, floor, iso_h_nz, ceiling, if_exists, chop_linebreak, iso_local_h, length, is_indexable, groups, is_node, iso_local_m, int, iso_utc_ms_nz, xhtml, ends_with, round, interpret, is_method, namespace, short, seq_contains, time, is_number in content.ftl

So, the problem seems to lie within the built-in. As statet in the error message, Freemarker expects is_date instead of is_date_like, eventhough in the Freemarker documentation it is states that is_date_like should be uses instead of is_date link. So I tried your suggestion with is_date.

Now, no error message appears, but the date format is unchanged.