/
V2ApiUtils.java
123 lines (109 loc) · 4.42 KB
/
V2ApiUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.handler.api;
import static org.apache.solr.client.solrj.impl.BinaryResponseParser.BINARY_CONTENT_TYPE_V2;
import static org.apache.solr.common.params.CommonParams.WT;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.solr.common.MapWriter.EntryWriter;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.jersey.JacksonReflectMapWriter;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
/** Utilities helpful for common V2 API declaration tasks. */
public class V2ApiUtils {
private V2ApiUtils() {
/* Private ctor prevents instantiation */
}
public static boolean isEnabled() {
return !"true".equals(System.getProperty("disable.v2.api", "false"));
}
public static void flattenMapWithPrefix(
Map<String, Object> toFlatten, Map<String, Object> destination, String additionalPrefix) {
if (toFlatten == null || toFlatten.isEmpty() || destination == null) {
return;
}
toFlatten.forEach((k, v) -> destination.put(additionalPrefix + k, v));
}
public static void flattenToCommaDelimitedString(
Map<String, Object> destination, List<String> toFlatten, String newKey) {
final String flattenedStr = String.join(",", toFlatten);
destination.put(newKey, flattenedStr);
}
/**
* Convert a JacksonReflectMapWriter (typically a {@link
* org.apache.solr.jersey.SolrJerseyResponse}) into the NamedList on a SolrQueryResponse, omitting
* the response header
*
* @param rsp the response to attach the resulting NamedList to
* @param mw the input object to be converted into a NamedList
*/
public static void squashIntoSolrResponseWithoutHeader(
SolrQueryResponse rsp, JacksonReflectMapWriter mw) {
squashIntoNamedList(rsp.getValues(), mw, true);
}
/**
* Convert a JacksonReflectMapWriter (typically a {@link
* org.apache.solr.jersey.SolrJerseyResponse}) into the NamedList on a SolrQueryResponse,
* including the response header
*
* @param rsp the response to attach the resulting NamedList to
* @param mw the input object to be converted into a NamedList
*/
public static void squashIntoSolrResponseWithHeader(
SolrQueryResponse rsp, JacksonReflectMapWriter mw) {
squashIntoNamedList(rsp.getValues(), mw, false);
}
public static void squashIntoNamedList(
NamedList<Object> destination, JacksonReflectMapWriter mw) {
squashIntoNamedList(destination, mw, false);
}
public static String getMediaTypeFromWtParam(
SolrQueryRequest solrQueryRequest, String defaultMediaType) {
final String wtParam = solrQueryRequest.getParams().get(WT);
if (wtParam == null) return "application/json";
// The only currently-supported response-formats for JAX-RS v2 endpoints.
switch (wtParam) {
case "xml":
return "application/xml";
case "javabin":
return BINARY_CONTENT_TYPE_V2;
default:
return defaultMediaType;
}
}
private static void squashIntoNamedList(
NamedList<Object> destination, JacksonReflectMapWriter mw, boolean trimHeader) {
try {
mw.writeMap(
new EntryWriter() {
@Override
public EntryWriter put(CharSequence key, Object value) {
var kStr = key.toString();
if (trimHeader && kStr.equals("responseHeader")) {
return null;
}
destination.add(kStr, value);
return this; // returning "this" means we can't use a lambda :-(
}
});
} catch (IOException e) {
throw new RuntimeException(e); // impossible
}
}
}