1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.function.library;
7   
8   import java.util.List;
9   
10  import dev.metaschema.core.metapath.DynamicContext;
11  import dev.metaschema.core.metapath.MetapathConstants;
12  import dev.metaschema.core.metapath.function.IFunction;
13  import dev.metaschema.core.metapath.item.IItem;
14  import dev.metaschema.core.metapath.item.ISequence;
15  import dev.metaschema.core.metapath.item.atomic.IDateItem;
16  import dev.metaschema.core.metapath.item.atomic.IDateWithTimeZoneItem;
17  import edu.umd.cs.findbugs.annotations.NonNull;
18  
19  /**
20   * Implements the XPath 3.1 <a href=
21   * "https://www.w3.org/TR/xpath-functions-31/#func-current-date">fn:current-date</a>
22   * function.
23   */
24  public final class FnCurrentDate {
25    @NonNull
26    private static final String NAME = "current-date";
27    @NonNull
28    static final IFunction SIGNATURE = IFunction.builder()
29        .name(NAME)
30        .namespace(MetapathConstants.NS_METAPATH_FUNCTIONS)
31        .deterministic()
32        .contextDependent()
33        .focusIndependent()
34        .returnType(IDateItem.type())
35        .returnOne()
36        .functionHandler(FnCurrentDate::execute)
37        .build();
38  
39    private FnCurrentDate() {
40      // disable construction
41    }
42  
43    @SuppressWarnings("unused")
44    @NonNull
45    private static ISequence<IDateItem> execute(@NonNull IFunction function,
46        @NonNull List<ISequence<?>> arguments,
47        @NonNull DynamicContext dynamicContext,
48        IItem focus) {
49      return ISequence.of(fnCurrentDate(dynamicContext));
50    }
51  
52    /**
53     * Implements <a href=
54     * "https://www.w3.org/TR/xpath-functions-31/#func-current-date">fn:current-date</a>.
55     *
56     * @param dynamicContext
57     *          the dynamic evaluation context
58     * @return the current date
59     */
60    @NonNull
61    public static IDateItem fnCurrentDate(@NonNull DynamicContext dynamicContext) {
62      // FIXME: support implicit timezone
63      return IDateWithTimeZoneItem.valueOf(dynamicContext.getCurrentDateTime());
64    }
65  }