All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.core.style.SimpleValueStyler Maven / Gradle / Ivy

/*
 * Copyright 2002-2022 the original author or authors.
 *
 * Licensed 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
 *
 *      https://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.springframework.core.style;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.StringJoiner;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * {@link ValueStyler} that converts objects to String form — generally for
 * debugging purposes — using simple styling conventions that mimic the
 * {@code toString()} styling conventions for standard JDK implementations of
 * collections, maps, and arrays.
 *
 * 

Uses the reflective visitor pattern underneath the hood to nicely * encapsulate styling algorithms for each type of styled object. * *

Favor {@link SimpleValueStyler} over {@link DefaultValueStyler} when you * wish to use styling similar to the JDK or when you need configurable control * over the styling of classes and methods. * * @author Sam Brannen * @since 6.0 */ public class SimpleValueStyler extends DefaultValueStyler { /** * Default {@link Class} styling function: {@link Class#getCanonicalName()}. */ public static final Function, String> DEFAULT_CLASS_STYLER = Class::getCanonicalName; /** * Default {@link Method} styling function: converts the supplied {@link Method} * to a simple string representation of the method's signature in the form of * {@code ()}, where {@code } * is a comma-separated list of the {@linkplain Class#getSimpleName() simple names} * of the parameter types. *

For example, if the supplied method is a reference to * {@link String#getBytes(java.nio.charset.Charset)}, this function will * return {@code "getBytes(Charset)"}. */ public static final Function DEFAULT_METHOD_STYLER = SimpleValueStyler::toSimpleMethodSignature; private final Function, String> classStyler; private final Function methodStyler; /** * Create a {@code SimpleValueStyler} using the {@link #DEFAULT_CLASS_STYLER} * and {@link #DEFAULT_METHOD_STYLER}. */ public SimpleValueStyler() { this(DEFAULT_CLASS_STYLER, DEFAULT_METHOD_STYLER); } /** * Create a {@code SimpleValueStyler} using the supplied class and method stylers. * @param classStyler a function that applies styling to a {@link Class} * @param methodStyler a function that applies styling to a {@link Method} */ public SimpleValueStyler(Function, String> classStyler, Function methodStyler) { this.classStyler = classStyler; this.methodStyler = methodStyler; } @Override protected String styleNull() { return "null"; } @Override protected String styleString(String str) { return "\"" + str + "\""; } @Override protected String styleClass(Class clazz) { return this.classStyler.apply(clazz); } @Override protected String styleMethod(Method method) { return this.methodStyler.apply(method); } @Override protected String styleMap(Map map) { StringJoiner result = new StringJoiner(", ", "{", "}"); for (Map.Entry entry : map.entrySet()) { result.add(style(entry)); } return result.toString(); } @Override protected String styleCollection(Collection collection) { StringJoiner result = new StringJoiner(", ", "[", "]"); for (Object element : collection) { result.add(style(element)); } return result.toString(); } @Override protected String styleArray(Object[] array) { StringJoiner result = new StringJoiner(", ", "[", "]"); for (Object element : array) { result.add(style(element)); } return result.toString(); } private static String toSimpleMethodSignature(Method method) { String parameterList = Arrays.stream(method.getParameterTypes()) .map(Class::getSimpleName) .collect(Collectors.joining(", ")); return String.format("%s(%s)", method.getName(), parameterList); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy