1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.util;
17
18 import java.io.UnsupportedEncodingException;
19 import java.net.URLEncoder;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.Date;
23 import java.util.List;
24 import java.util.Map;
25
26 import javax.servlet.http.HttpServletRequest;
27
28 import org.codelibs.fess.Constants;
29 import org.codelibs.fess.crawler.util.CharUtil;
30 import org.codelibs.fess.taglib.FessFunctions;
31 import org.lastaflute.web.util.LaRequestUtil;
32
33 public final class DocumentUtil {
34
35 private DocumentUtil() {
36 }
37
38 public static <T> T getValue(final Map<String, Object> doc, final String key, final Class<T> clazz, final T defaultValue) {
39 final T value = getValue(doc, key, clazz);
40 if (value == null) {
41 return defaultValue;
42 }
43 return value;
44 }
45
46 @SuppressWarnings("unchecked")
47 public static <T> T getValue(final Map<String, Object> doc, final String key, final Class<T> clazz) {
48 if (doc == null || key == null) {
49 return null;
50 }
51
52 final Object value = doc.get(key);
53 if (value == null) {
54 return null;
55 }
56
57 if (value instanceof List) {
58 if (clazz.isAssignableFrom(List.class)) {
59 return (T) value;
60 }
61 if (clazz.isAssignableFrom(String[].class)) {
62 return (T) ((List<?>) value).stream().filter(s -> s != null).map(Object::toString).toArray(n -> new String[n]);
63 }
64
65 if (((List<?>) value).isEmpty()) {
66 return null;
67 }
68
69 return convertObj(((List<?>) value).get(0), clazz);
70 }
71 if (value instanceof String[]) {
72 if (clazz.isAssignableFrom(String[].class)) {
73 return (T) value;
74 }
75 if (clazz.isAssignableFrom(List.class)) {
76 final List<String> list = new ArrayList<>();
77 Collections.addAll(list, (String[]) value);
78 return (T) list;
79 }
80
81 if (((String[]) value).length == 0) {
82 return null;
83 }
84
85 return convertObj(((String[]) value)[0], clazz);
86 }
87
88 return convertObj(value, clazz);
89 }
90
91 @SuppressWarnings("unchecked")
92 private static <T> T convertObj(final Object value, final Class<T> clazz) {
93 if (value == null) {
94 return null;
95 }
96
97 if (clazz.isAssignableFrom(String.class)) {
98 return (T) value.toString();
99 }
100 if (clazz.isAssignableFrom(Date.class)) {
101 if (value instanceof Date) {
102 return (T) value;
103 } else {
104 return (T) FessFunctions.parseDate(value.toString());
105 }
106 }
107 if (clazz.isAssignableFrom(Long.class)) {
108 if (value instanceof Long) {
109 return (T) value;
110 } else {
111 return (T) Long.valueOf(value.toString());
112 }
113 } else if (clazz.isAssignableFrom(Integer.class)) {
114 if (value instanceof Integer) {
115 return (T) value;
116 } else {
117 return (T) Integer.valueOf(value.toString());
118 }
119 } else if (clazz.isAssignableFrom(Double.class)) {
120 if (value instanceof Double) {
121 return (T) value;
122 } else {
123 return (T) Double.valueOf(value.toString());
124 }
125 } else if (clazz.isAssignableFrom(Float.class)) {
126 if (value instanceof Float) {
127 return (T) value;
128 } else {
129 return (T) Float.valueOf(value.toString());
130 }
131 } else if (clazz.isAssignableFrom(Boolean.class)) {
132 if (value instanceof Boolean) {
133 return (T) value;
134 } else {
135 return (T) Boolean.valueOf(value.toString());
136 }
137 }
138 return null;
139 }
140
141 public static String encodeUrl(final String url) {
142 final String enc = LaRequestUtil.getOptionalRequest().filter(req -> req.getCharacterEncoding() != null)
143 .map(HttpServletRequest::getCharacterEncoding).orElse(Constants.UTF_8);
144 final StringBuilder buf = new StringBuilder(url.length() + 100);
145 for (final char c : url.toCharArray()) {
146 if (CharUtil.isUrlChar(c)) {
147 buf.append(c);
148 } else {
149 try {
150 buf.append(URLEncoder.encode(String.valueOf(c), enc));
151 } catch (final UnsupportedEncodingException e) {
152 buf.append(c);
153 }
154 }
155 }
156 return buf.toString();
157 }
158 }