View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
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 }