[ 
https://issues.apache.org/jira/browse/CALCITE-5477?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17677581#comment-17677581
 ] 

Gian Merlino commented on CALCITE-5477:
---------------------------------------

The situation is a little awkward due to the new overloads. I believe the 
possible solutions are:
 - The one in the linked PR, involving an additional level of indirection.
 - Build release builds of Calcite using an older version of Guava (prior to 
20.0). People could always drop in a newer version instead, but this may be 
annoying for downstream consumers.
 - Avoiding the new overloads, using {{forbidden-apis}} plus some code changes.

With the third approach, code changes are needed because the new overloads 
capture calls that previously went to a varags {{Object...}} method. An example 
of the problem is this call in DateString:

{code:java}
Preconditions.checkArgument(PATTERN.matcher(v).matches(),
    "Invalid date format:", v);
{code}

{{v}} is a {{{}Object{}}}. If built against Guava prior to 20.0, this goes to 
{{{}checkArgument(boolean, String, Object...){}}}. However, when building 
against later versions of Guava, this goes to {{{}checkArgument(boolean, 
String, Object){}}}. This method doesn't exist in Guava prior to 20.0, which 
leads to a method-not-found error at runtime.

So, to solve that, all such calls would need to be replaced with explicit 
{{Object[]}} creation, such as:
{code:java}
Preconditions.checkArgument(PATTERN.matcher(v).matches(),
    "Invalid date format:", new Object[]{v});
{code}

Definitely open to any solution that seems best.

> Prefer Util.checkArgument over Preconditions.checkArgument
> ----------------------------------------------------------
>
>                 Key: CALCITE-5477
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5477
>             Project: Calcite
>          Issue Type: Improvement
>            Reporter: Gian Merlino
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Related to CALCITE-5428.
> Preconditions.checkArgument gained new overloads in Guava 20.0, which 
> prevents code built using Guava 20.0 from running properly with earlier 
> versions of Guava. (When building against a later version of Guava, as 
> Calcite does by default, the Java compiler generates calls to methods that 
> don't exist in those earlier versions.)
> Example: in Guava 20.0 there is {{checkArgument(boolean, String, int)}}; in 
> earlier versions this would be handled by {{checkArgument(boolean, String, 
> Object...)}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to