package org.sef4j.core.helpers.proptree.printers;
import java.io.PrintWriter;
import java.util.Map;
/**
*
*/
public abstract class AbstractPropTreePrinter extends PropTreePrinter {
protected Map<String,PropTreeValuePrinter<?>> propPerNamePrinter;
protected Map<Class<?>,PropTreeValuePrinter<?>> propPerTypePrinter;
protected PropTreeValuePrinter<?> propDefaultPrinter;
// ------------------------------------------------------------------------
protected AbstractPropTreePrinter(PrintWriter out, Builder builder) {
super(out);
this.propPerNamePrinter = builder.propPerNamePrinter;
this.propPerTypePrinter = builder.propPerTypePrinter;
this.propDefaultPrinter = builder.propDefaultPrinter;
}
// ------------------------------------------------------------------------
@SuppressWarnings("unchecked")
protected PropTreeValuePrinter<Object> resolvePropValuePrinter(String propName, Object propValue) {
PropTreeValuePrinter<?> valuePrinter = null;
if (propPerNamePrinter != null) {
valuePrinter = propPerNamePrinter.get(propName);
}
if (valuePrinter == null
&& propPerTypePrinter != null && !propPerTypePrinter.isEmpty()) {
// search by type
Class<?> propClss = propValue.getClass();
valuePrinter = propPerTypePrinter.get(propClss);
// when not found, find by parent class type... until Object.class
while(valuePrinter == null && propClss != Object.class) {
propClss = propClss.getSuperclass();
valuePrinter = propPerTypePrinter.get(propClss);
}
}
if (valuePrinter == null
&& propDefaultPrinter != null) {
propDefaultPrinter = valuePrinter;
}
return (PropTreeValuePrinter<Object>) valuePrinter;
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "CallTreePrinter["
+ ((propPerNamePrinter != null)? "propNames:" + propPerNamePrinter.keySet() + ", " : "")
+ ((propPerTypePrinter != null)? "propTypes:" + propPerTypePrinter.keySet() + ", " : "")
+ ((propDefaultPrinter != null)? "propDefault, " : "")
+ "]";
}
// ------------------------------------------------------------------------
/**
* Builder design-pattern
*/
protected static abstract class Builder {
protected Map<String,PropTreeValuePrinter<?>> propPerNamePrinter;
protected Map<Class<?>,PropTreeValuePrinter<?>> propPerTypePrinter;
protected PropTreeValuePrinter<?> propDefaultPrinter;
public Builder withPropPerNamePrinter(Map<String, PropTreeValuePrinter<?>> propPerNamePrinter) {
this.propPerNamePrinter = propPerNamePrinter;
return this;
}
public Builder withPropPerTypePrinter(Map<Class<?>, PropTreeValuePrinter<?>> propPerTypePrinter) {
this.propPerTypePrinter = propPerTypePrinter;
return this;
}
public Builder withPropDefaultPrinter(PropTreeValuePrinter<?> propDefaultPrinter) {
this.propDefaultPrinter = propDefaultPrinter;
return this;
}
}
}