ToStringer

Generic (reflection) toString helper

License

License

Categories

Categories

Ant Build Tools
GroupId

GroupId

com.github.antonsjava
ArtifactId

ArtifactId

tostringer
Last Version

Last Version

1.2
Release Date

Release Date

Type

Type

bundle
Description

Description

ToStringer
Generic (reflection) toString helper
Project URL

Project URL

https://github.com/antonsjava/tostringer
Source Code Management

Source Code Management

https://github.com/antonsjava/tostringer

Download tostringer

Dependencies

test (1)

Group / Artifact Type Version
junit : junit jar 4.12

Project Modules

There are no modules declared in this project.

ToStringer

ToStringer is helper class for generating structured toString representations for classes you don't have in control. It is possible to use ToStringer also for your own classes. If you want to have simple toStrings and only wants to have structured output only for some debug purposes.

ClassProperty

This class represents class porperty and ability to resolve the property from given object.

There are provided two implementations MethodClassProperty and FieldClassProperty which resolves properties using public members of java class.

ClassPropertyResolver

Resolves list of class properties for given class. There is provided implementation FieldScanClassPropertyResolver which scan class for public properties or public getters for thyis properties.

Class implementation limits this scanning only for classes which names start by specified list of prefixes.

ToStringerFactory

The class produces commonly used ToStringer instamces.

public class PrettyPrinter {
    private static ToStringer tostringer = 
		ToStringerFactory.simpleField("org.foo.client", "org.foo.server");
    
    public static String toString(Object object) {
        return tostringer.toString(object);
    }    
}

Example

This example shows how to create class PrettyPrint which uses ToStringer for classes from tvo packages and for Element class.

public class PrettyPrinter {
    private static ToStringer tostringer = new ToStringer(
        new ClassPropertyResolver[] {
            new FieldScanClassPropertyResolver(
                "org.foo.client.message"
                , "org.foo.client.responses"
            )
            , new ElementClassPropertyResolver()
        }
    );
    
    public static String toString(Object object) {
        return tostringer.toString(object);
    }    

    public static class ElementClassPropertyResolver implements ClassPropertyResolver {

        public boolean isSupportedClass(Class type) {
            if(type == null) return false;
            return Element.class.isAssignableFrom(type);
        }
        
        private static ClassProperty[] props = new ClassProperty[]{
            new ElementClassProperty("element")
            , new ElementClassProperty("attrs")
            , new ElementClassProperty("value")
            , new ElementClassProperty("subelement")
        };

        public ClassProperty[] properties(Class type) {
            return props;
        }
    }
    
    public static class ElementClassProperty extends ClassProperty {
        public ElementClassProperty(String name) {
            super(name);
        }

        @Override
        public Object valueFrom(Object o) {
            if(o == null) return null;
            if(!(o instanceof Element)) return null;
            Element elem = (Element)o;
            String name = getName();
            if("element".equals(name)) {
                return elem.getLocalName();
            } else if("attrs".equals(name)) {
                NamedNodeMap nnmap = elem.getAttributes();
                ...
            } else if("subelement".equals(name)) {
                NodeList nl = elem.getChildNodes();
                ...
            } else if("value".equals(name)) {
                NodeList nl = elem.getChildNodes();
                ...
												} else {
                return null;
            }
        }

    }
}

ToStackTracer

The class produces shorter stack traces. It is usefull whne you want to see only own packages in stack trace.

public class PrettyPrinter {
    private static ToStackTracer tostacktracer = 
		ToStackTracer.instance("org.foo");
    
    public static String st(Throwable t) {
        return tostacktracer.ts(t);
    }    
}

it produces stack traces like this where are visible org.foo packages and two line context

18:54:28 ERR - Unable to call get request to http://localhost:8080/mocka - /client_exist/6608271230 because of org.springframework.web.client.HttpClientErrorException: 404 null
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
	at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
	at ...
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680)
	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600)
	at org.foo.integration.common.rest.JsonRestClient.getRequest(JsonRestClient.java:48)
	at org.foo.integration.proj.client.impl.RestProjClient.clientExist(RestProjClient.java:53)
	at org.foo.integration.proj.controller.ProjController.sendApplication(ProjController.java:106)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at ...
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.foo.integration.common.web.RRDumpFilter.doFilterInternal(RRDumpFilter.java:69)
	at org.foo.integration.common.web.RRDumpFilter.doFilterInternal(RRDumpFilter.java:54)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at ... 

Maven usage

   <dependency>
      <groupId>com.github.antonsjava</groupId>
      <artifactId>tostringer</artifactId>
      <version>1.2</version>
   </dependency>

OSGI usage (Karaf)

   bundle:install mvn:com.github.antonsjava/tostringer/1.2
   bundle:start com.github.antonsjava.tostringer/1.2.0

Versions

Version
1.2
1.1
1.0