001
002package io.vrap.rmf.base.client;
003
004import java.time.ZonedDateTime;
005import java.util.HashSet;
006import java.util.Set;
007
008import org.apache.commons.lang3.builder.RecursiveToStringStyle;
009import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
010import org.apache.commons.lang3.builder.ToStringStyle;
011
012public interface ModelBase {
013
014    class FilteredRecursiveToStringStyle extends RecursiveToStringStyle {
015        static Set<Class<?>> filter;
016        static {
017            filter = new HashSet<>();
018            filter.add(ZonedDateTime.class);
019            filter.add(Enum.class);
020        }
021
022        public FilteredRecursiveToStringStyle() {
023            this.setUseShortClassName(true);
024            this.setUseIdentityHashCode(false);
025        }
026
027        @Override
028        protected boolean accept(Class<?> clazz) {
029            return filter.stream().noneMatch(aClass -> aClass.isAssignableFrom(clazz));
030        }
031    }
032
033    default public String reflectionString() {
034        return ReflectionToStringBuilder.reflectionToString(this, new FilteredRecursiveToStringStyle());
035    }
036
037    default public String reflectionString(ToStringStyle toStringStyle) {
038        return ReflectionToStringBuilder.reflectionToString(this, toStringStyle);
039    }
040
041    static ModelBase asModelBase(Object object) {
042        if (!(object instanceof ModelBase)) {
043            throw new IllegalArgumentException("argument must be of type " + ModelBase.class);
044        }
045        return (ModelBase) object;
046    }
047
048    static String reflectionString(Object object) {
049        return ReflectionToStringBuilder.reflectionToString(object, new FilteredRecursiveToStringStyle());
050    }
051
052    static String reflectionString(Object object, ToStringStyle toStringStyle) {
053        return ReflectionToStringBuilder.reflectionToString(object, toStringStyle);
054    }
055}