blob: 58e55cfa23a0bdd922ae88f1a62f66a02cee1a3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.utils;
import com.google.common.base.Joiner;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Utility method useable on any {@link Object}.
* <p>
* Mostly answers the same interfaces as Guava's "Objects", but re-implemented here to avoid deprecation
* issues.
* </p>
*
* @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
* @since 3.5
*/
public final class Objects {
/** hides default constructor. */
private Objects() {
// prevents instantiation
}
/**
* Creates a builder for the {@code toString()} of the given object.
*
* @param object
* The object we'll need a string representation of.
* @return A builder for the {@code toString()} of the given object.
*/
public static ToStringHelper toStringHelper(Object object) {
return new ToStringHelper(object);
}
/**
* Fluent interface to build a String representation of an object following the same format as guava's
* Objects.toStringHelper().
* <p>
* Resulting toString() will look like &lt;className>{attribute=value, attribute1=value1} according to the
* number of attributes that have been {@link #add(String, String) added}.
* </p>
*/
public static class ToStringHelper {
/** Target of this toString builder. */
private Object target;
/** attribute=>value mappings that we'll add to the string representation. */
private Map<String, String> values;
/**
* Builds a toStringHelper for the given target object.
*
* @param target
* Object for which we'll need a string representation.
*/
public ToStringHelper(Object target) {
this.target = target;
this.values = new LinkedHashMap<>();
}
/**
* Adds the given key/value pair that needs to appear in the final string representation.
* <p>
* Key/value pairs will appear in the final representation in the same order they have been added
* through here.
* </p>
*
* @param name
* Name of the pair.
* @param value
* Value of the pair.
* @return {@code this} instance.
*/
public ToStringHelper add(String name, Object value) {
if (value == null) {
values.put(name, "null");
} else {
values.put(name, value.toString());
}
return this;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append(target.getClass().getName());
result.append('{');
Joiner.on(',').withKeyValueSeparator("=").appendTo(result, values);
result.append('}');
return result.toString();
}
}
}