// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ObjectValuesInfo.java
// public class ObjectValuesInfo {
// 	private final List<GroupedValuesInfo> valuesByClass;
// 	private final List<ValueInfo> allValues;
// 	private final Class type;
// 
// 	private ObjectValuesInfo(final List<GroupedValuesInfo> valuesByClass, final List<ValueInfo> allValues, final Class type) {
// 		this.valuesByClass = valuesByClass;
// 		this.allValues = allValues;
// 		this.type = type;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties, grouped by their declaring class.
// 	 *
// 	 * @return all values of the object's properties, grouped by their declaring class.
// 	 */
// 	public List<GroupedValuesInfo> getValuesByClass() {
// 		return valuesByClass;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties.
// 	 *
// 	 * @return all values of the object's properties.
// 	 */
// 	public List<ValueInfo> getAllValues() {
// 		return allValues;
// 	}
// 
// 	/**
// 	 * Get the type of the object to format.
// 	 *
// 	 * @return the type of the object to format.
// 	 */
// 	public Class getType() {
// 		return type;
// 	}
// 
// 	static class Builder {
// 		private final List<GroupedValuesInfo> valuesByClass = new ArrayList<>();
// 		private final List<ValueInfo> allValues = new ArrayList<>();
// 		private Class type;
// 
// 		public ObjectValuesInfo buildToStringInfo() {
// 			return new ObjectValuesInfo(
// 					Collections.unmodifiableList(valuesByClass),
// 					Collections.unmodifiableList(allValues),
// 					type);
// 		}
// 
// 		Builder addClassValues(final GroupedValuesInfo groupedValuesInfo) {
// 			valuesByClass.add(groupedValuesInfo);
// 			allValues.addAll(groupedValuesInfo.getValues());
// 			return this;
// 		}
// 
// 		Builder setType(Class type) {
// 			this.type = type;
// 			return this;
// 		}
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ValueInfo.java
// public class ValueInfo {
// 	private final String propertyName;
// 	private final Object value;
// 	private final Class<?> propertyType;
// 
// 	public ValueInfo(final String propertyName, final Object value, final Class<?> propertyType) {
// 		this.propertyName = propertyName;
// 		this.value = value;
// 		this.propertyType = propertyType;
// 	}
// 
// 	/**
// 	 * Get the name of the property.
// 	 *
// 	 * @return the name of the property.
// 	 */
// 	public String getPropertyName() {
// 		return propertyName;
// 	}
// 
// 	/**
// 	 * Get the value of the property.
// 	 *
// 	 * @return the value of the property.
// 	 */
// 	public Object getValue() {
// 		return value;
// 	}
// 
// 	/**
// 	 * Get the type of the property.
// 	 *
// 	 * @return the type of the property.
// 	 */
// 	public Class<?> getPropertyType() {
// 		return propertyType;
// 	}
// 
// 	@Override
// 	public boolean equals(final Object o) {
// 		if (this == o) return true;
// 		if (o == null || getClass() != o.getClass()) return false;
// 
// 		final ValueInfo valueInfo = (ValueInfo) o;
// 
// 		if (propertyName != null ? !propertyName.equals(valueInfo.propertyName) : valueInfo.propertyName != null)
// 			return false;
// 		return value != null ? value.equals(valueInfo.value) : valueInfo.value == null;
// 
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		int result = propertyName != null ? propertyName.hashCode() : 0;
// 		result = 31 * result + (value != null ? value.hashCode() : 0);
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "ValueInfo{" +
// 				"getPropertyName='" + propertyName + '\'' +
// 				", getValue='" + value + '\'' +
// 				'}';
// 	}
// }


import net.davidtanzer.jobjectformatter.valuesinfo.ObjectValuesInfo;
import net.davidtanzer.jobjectformatter.valuesinfo.ValueInfo;
/*
   Copyright 2015 David Tanzer (business@davidtanzer.net / @dtanzer)

   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

       http://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 net.davidtanzer.jobjectformatter.formatter;


/**
 * A formatter that is not configurable and has a very simple output - Used as default formatter when no other formatter is configured.
 *
 * Example output:
 * <pre>
{ firstName=Jane, lastName=Doe, address=[not null] }
 * </pre>
 */
public class SimpleFormatter extends AbstractObjectStringFormatter {
	public SimpleFormatter() {
		super(FormatGrouped.NO);
	}

	@Override
// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ObjectValuesInfo.java
// public class ObjectValuesInfo {
// 	private final List<GroupedValuesInfo> valuesByClass;
// 	private final List<ValueInfo> allValues;
// 	private final Class type;
// 
// 	private ObjectValuesInfo(final List<GroupedValuesInfo> valuesByClass, final List<ValueInfo> allValues, final Class type) {
// 		this.valuesByClass = valuesByClass;
// 		this.allValues = allValues;
// 		this.type = type;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties, grouped by their declaring class.
// 	 *
// 	 * @return all values of the object's properties, grouped by their declaring class.
// 	 */
// 	public List<GroupedValuesInfo> getValuesByClass() {
// 		return valuesByClass;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties.
// 	 *
// 	 * @return all values of the object's properties.
// 	 */
// 	public List<ValueInfo> getAllValues() {
// 		return allValues;
// 	}
// 
// 	/**
// 	 * Get the type of the object to format.
// 	 *
// 	 * @return the type of the object to format.
// 	 */
// 	public Class getType() {
// 		return type;
// 	}
// 
// 	static class Builder {
// 		private final List<GroupedValuesInfo> valuesByClass = new ArrayList<>();
// 		private final List<ValueInfo> allValues = new ArrayList<>();
// 		private Class type;
// 
// 		public ObjectValuesInfo buildToStringInfo() {
// 			return new ObjectValuesInfo(
// 					Collections.unmodifiableList(valuesByClass),
// 					Collections.unmodifiableList(allValues),
// 					type);
// 		}
// 
// 		Builder addClassValues(final GroupedValuesInfo groupedValuesInfo) {
// 			valuesByClass.add(groupedValuesInfo);
// 			allValues.addAll(groupedValuesInfo.getValues());
// 			return this;
// 		}
// 
// 		Builder setType(Class type) {
// 			this.type = type;
// 			return this;
// 		}
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ValueInfo.java
// public class ValueInfo {
// 	private final String propertyName;
// 	private final Object value;
// 	private final Class<?> propertyType;
// 
// 	public ValueInfo(final String propertyName, final Object value, final Class<?> propertyType) {
// 		this.propertyName = propertyName;
// 		this.value = value;
// 		this.propertyType = propertyType;
// 	}
// 
// 	/**
// 	 * Get the name of the property.
// 	 *
// 	 * @return the name of the property.
// 	 */
// 	public String getPropertyName() {
// 		return propertyName;
// 	}
// 
// 	/**
// 	 * Get the value of the property.
// 	 *
// 	 * @return the value of the property.
// 	 */
// 	public Object getValue() {
// 		return value;
// 	}
// 
// 	/**
// 	 * Get the type of the property.
// 	 *
// 	 * @return the type of the property.
// 	 */
// 	public Class<?> getPropertyType() {
// 		return propertyType;
// 	}
// 
// 	@Override
// 	public boolean equals(final Object o) {
// 		if (this == o) return true;
// 		if (o == null || getClass() != o.getClass()) return false;
// 
// 		final ValueInfo valueInfo = (ValueInfo) o;
// 
// 		if (propertyName != null ? !propertyName.equals(valueInfo.propertyName) : valueInfo.propertyName != null)
// 			return false;
// 		return value != null ? value.equals(valueInfo.value) : valueInfo.value == null;
// 
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		int result = propertyName != null ? propertyName.hashCode() : 0;
// 		result = 31 * result + (value != null ? value.hashCode() : 0);
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "ValueInfo{" +
// 				"getPropertyName='" + propertyName + '\'' +
// 				", getValue='" + value + '\'' +
// 				'}';
// 	}
// }


// Path: src/main/java/net/davidtanzer/jobjectformatter/formatter/SimpleFormatter.java
import net.davidtanzer.jobjectformatter.valuesinfo.ObjectValuesInfo;
import net.davidtanzer.jobjectformatter.valuesinfo.ValueInfo;

/*
   Copyright 2015 David Tanzer (business@davidtanzer.net / @dtanzer)

   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

       http://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 net.davidtanzer.jobjectformatter.formatter;


/**
 * A formatter that is not configurable and has a very simple output - Used as default formatter when no other formatter is configured.
 *
 * Example output:
 * <pre>
{ firstName=Jane, lastName=Doe, address=[not null] }
 * </pre>
 */
public class SimpleFormatter extends AbstractObjectStringFormatter {
	public SimpleFormatter() {
		super(FormatGrouped.NO);
	}

	@Override
	protected void startFormattedString(final StringBuilder result, final ObjectValuesInfo info) {