/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.params.extractor;
import org.geotools.util.logging.Logging;
import java.io.Closeable;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
public final class Utils {
private static final Logger LOGGER = Logging.getLogger(Utils.class);
private Utils() {
}
public static void info(Logger logger, String message, Object... messageArguments) {
logger.info(() -> String.format(message, messageArguments));
}
public static void debug(Logger logger, String message, Object... messageArguments) {
logger.fine(() -> String.format(message, messageArguments));
}
public static void error(Logger logger, Throwable cause, String message, Object... messageArguments) {
logger.log(Level.SEVERE, cause, () -> String.format(message, messageArguments));
}
public static void checkCondition(boolean condition, String failMessage, Object... failMessageArguments) {
if (!condition) {
throw exception(failMessage, failMessageArguments);
}
}
public static <T> T withDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
public static ParamsExtractorException exception(String message, Object... messageArguments) {
return new ParamsExtractorException(null, message, messageArguments);
}
public static ParamsExtractorException exception(Throwable cause, String message, Object... messageArguments) {
return new ParamsExtractorException(cause, message, messageArguments);
}
private final static class ParamsExtractorException extends RuntimeException {
public ParamsExtractorException(Throwable cause, String message, Object... messageArguments) {
super(String.format(message, messageArguments), cause);
}
}
public static <T extends Closeable> void closeQuietly(T closable) {
try {
closable.close();
} catch (Exception exception) {
Utils.error(LOGGER, exception, "Something bad happen when closing.");
}
}
public static Map<String, String[]> parseParameters(Optional<String> queryString) {
Map<String, String[]> parameters = new HashMap<>();
if (!queryString.isPresent()) {
return parameters;
}
final String[] parametersParts = queryString.get().split("&");
for (String parametersPart : parametersParts) {
String[] parameterParts = parametersPart.split("=");
if (parameterParts.length < 2) {
continue;
}
String name = URLDecoder.decode(parameterParts[0]);
String value = URLDecoder.decode(parameterParts[1]);
String[] values = parameters.get(name);
if (values == null) {
parameters.put(name, new String[]{value});
} else {
values = Arrays.copyOf(values, value.length() + 1);
values[value.length()] = value;
parameters.put(name, values);
}
}
return parameters;
}
public static Map.Entry caseInsensitiveSearch(String key, Map<?, ?> map) {
for (Map.Entry entry : map.entrySet()) {
if (entry.getKey() instanceof String && ((String) entry.getKey()).toLowerCase().equals(key.toLowerCase())) {
return entry;
}
}
return null;
}
}