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.IDateTimeItem;
16  import dev.metaschema.core.metapath.item.atomic.IDateTimeWithTimeZoneItem;
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-dateTime">fn:current-dateTime</a>
22   * function.
23   */
24  public final class FnCurrentDateTime {
25    private static final String NAME = "current-dateTime";
26    @NonNull
27    static final IFunction SIGNATURE = IFunction.builder()
28        .name(NAME)
29        .namespace(MetapathConstants.NS_METAPATH_FUNCTIONS)
30        .deterministic()
31        .contextDependent()
32        .focusIndependent()
33        .returnType(IDateTimeItem.type())
34        .returnOne()
35        .functionHandler(FnCurrentDateTime::execute)
36        .build();
37  
38    private FnCurrentDateTime() {
39      // disable construction
40    }
41  
42    @SuppressWarnings("unused")
43    @NonNull
44    private static ISequence<IDateTimeItem> execute(@NonNull IFunction function,
45        @NonNull List<ISequence<?>> arguments,
46        @NonNull DynamicContext dynamicContext,
47        IItem focus) {
48      return ISequence.of(fnCurrentDateTime(dynamicContext));
49    }
50  
51    /**
52     * Implements <a href=
53     * "https://www.w3.org/TR/xpath-functions-31/#func-current-dateTime">fn:current-dateTime</a>.
54     *
55     * @param dynamicContext
56     *          the dynamic evaluation context
57     * @return the current date
58     */
59    @NonNull
60    public static IDateTimeItem fnCurrentDateTime(@NonNull DynamicContext dynamicContext) {
61      // FIXME: support implicit timezone
62      return IDateTimeWithTimeZoneItem.valueOf(dynamicContext.getCurrentDateTime());
63    }
64  }