• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

evolvedbinary / elemental / 982

29 Apr 2025 08:34PM UTC coverage: 56.409% (+0.007%) from 56.402%
982

push

circleci

adamretter
[feature] Improve README.md badges

28451 of 55847 branches covered (50.94%)

Branch coverage included in aggregate %.

77468 of 131924 relevant lines covered (58.72%)

0.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.22
/exist-core/src/main/java/org/exist/xquery/functions/fn/FunTrace.java
1
/*
2
 * Elemental
3
 * Copyright (C) 2024, Evolved Binary Ltd
4
 *
5
 * admin@evolvedbinary.com
6
 * https://www.evolvedbinary.com | https://www.elemental.xyz
7
 *
8
 * Use of this software is governed by the Business Source License 1.1
9
 * included in the LICENSE file and at www.mariadb.com/bsl11.
10
 *
11
 * Change Date: 2028-04-27
12
 *
13
 * On the date above, in accordance with the Business Source License, use
14
 * of this software will be governed by the Apache License, Version 2.0.
15
 *
16
 * Additional Use Grant: Production use of the Licensed Work for a permitted
17
 * purpose. A Permitted Purpose is any purpose other than a Competing Use.
18
 * A Competing Use means making the Software available to others in a commercial
19
 * product or service that: substitutes for the Software; substitutes for any
20
 * other product or service we offer using the Software that exists as of the
21
 * date we make the Software available; or offers the same or substantially
22
 * similar functionality as the Software.
23
 *
24
 * NOTE: Parts of this file contain code from 'The eXist-db Authors'.
25
 *       The original license header is included below.
26
 *
27
 * =====================================================================
28
 *
29
 * eXist-db Open Source Native XML Database
30
 * Copyright (C) 2001 The eXist-db Authors
31
 *
32
 * info@exist-db.org
33
 * http://www.exist-db.org
34
 *
35
 * This library is free software; you can redistribute it and/or
36
 * modify it under the terms of the GNU Lesser General Public
37
 * License as published by the Free Software Foundation; either
38
 * version 2.1 of the License, or (at your option) any later version.
39
 *
40
 * This library is distributed in the hope that it will be useful,
41
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
43
 * Lesser General Public License for more details.
44
 *
45
 * You should have received a copy of the GNU Lesser General Public
46
 * License along with this library; if not, write to the Free Software
47
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
48
 */
49
package org.exist.xquery.functions.fn;
50

51
import org.exist.util.serializer.XQuerySerializer;
52
import org.exist.xquery.*;
53
import org.exist.xquery.value.*;
54
import org.xml.sax.SAXException;
55

56
import javax.xml.transform.OutputKeys;
57
import java.io.IOException;
58
import java.io.StringWriter;
59
import java.util.Properties;
60

61
import static org.exist.util.StringUtil.notNullOrEmptyOrWs;
62
import static org.exist.xquery.FunctionDSL.*;
63
import static org.exist.xquery.functions.fn.FnModule.functionSignature;
64

65
/**
66
 * @author Dannes Wessels
67
 * @author <a href="mailto:wolfgang@exist-db.org">Wolfgang Meier</a>
68
 */
69
public class FunTrace extends BasicFunction {
70

71

72
    private static final FunctionParameterSequenceType FS_PARAM_VALUE = optManyParam("value", Type.ITEM, "The values");
1✔
73
    private static final FunctionParameterSequenceType FS_PARAM_LABEL = param("label", Type.STRING, "The label in the log file");
1✔
74

75
    private static final String FS_TRACE_NAME = "trace";
76

77
    static final FunctionSignature FS_TRACE1 = functionSignature(
1✔
78
            FS_TRACE_NAME,
1✔
79
            "This function is intended to be used in debugging queries by "
1✔
80
                    + "providing a trace of their execution. The input $value is "
81
                    + "returned, unchanged, as the result of the function. "
82
                    + "In addition, the inputs $value is serialized with adaptive settings "
83
                    + "and is written into the eXist log files.",
84
            returnsOptMany(Type.ITEM, "The unlabelled $value in the log"),
1✔
85
            FS_PARAM_VALUE
1✔
86
    );
87

88
    static final FunctionSignature FS_TRACE2 = functionSignature(
1✔
89
            FS_TRACE_NAME,
1✔
90
            "This function is intended to be used in debugging queries by "
1✔
91
                    + "providing a trace of their execution. The input $value is "
92
                    + "returned, unchanged, as the result of the function. "
93
                    + "In addition, the inputs $value is serialized with adaptive settings "
94
                    + "and is written together with $label into the eXist log files.",
95
            returnsOptMany(Type.ITEM, "The labelled $value in the log"),
1✔
96
            FS_PARAM_VALUE,
1✔
97
            FS_PARAM_LABEL
1✔
98
    );
1✔
99

100
    public FunTrace(final XQueryContext context, final FunctionSignature signature) {
101
        super(context, signature);
1✔
102
    }
1✔
103

104
/*
105
 * (non-Javadoc)
106
 * @see org.exist.xquery.BasicFunction#eval(Sequence[], Sequence)
107
 */
108
public Sequence eval(final Sequence[] args, final Sequence contextSequence) throws XPathException {
109

110
    // Get value for label, default to "-"
111
    final String label = (args.length == 2) ? notNullOrEmptyOrWs(args[1].getStringValue(), "-") : "-";
1✔
112

113
    final Sequence result;
114

115
    if (args[0].isEmpty()) {
1✔
116
        // Write to log
117
        LOG.debug("{} [{}] [{}]: {}", label, "-", Type.getTypeName(Type.EMPTY_SEQUENCE), "-");
1✔
118
        result = Sequence.EMPTY_SEQUENCE;
1✔
119

120
        } else {
1✔
121
            // Copy all Items from input to output sequence
122
            result = new ValueSequence();
1✔
123

124
            int position = 0;
1✔
125

126
            // Force adaptive serialization
127
            final Properties props = new Properties();
1✔
128
            props.setProperty(OutputKeys.METHOD, "adaptive");
1✔
129

130
            for (final SequenceIterator i = args[0].iterate(); i.hasNext();) {
1✔
131

132
                // Get item
133
                final Item next = i.nextItem();
1✔
134

135
                // Only write if logger is set to debug mode
136
                if (LOG.isDebugEnabled()) {
1!
137

138
                    position++;
×
139

140
                    try (final StringWriter writer = new StringWriter()) {
×
141
                        final XQuerySerializer xqs = new XQuerySerializer(context.getBroker(), props, writer);
×
142
                        xqs.serialize(next.toSequence());
×
143

144
                        // Write to log
145
                        LOG.debug("{} [{}] [{}]: {}", label, position, Type.getTypeName(next.getType()), writer.toString());
×
146

147
                    } catch (final IOException | SAXException e) {
×
148
                        throw new XPathException(this, e.getMessage());
×
149
                    }
150

151
                }
152

153
                // Add to result
154
                result.add(next);
1✔
155
            }
156
        }
157

158
        return result;
1✔
159
    }
160
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc