private static Map<String, Object> findMembers(Object o, Predicate<Field> fieldPredicate) throws IllegalArgumentException, IllegalAccessException { Map<String, Object> result = Maps.newLinkedHashMap(); Class<?> clazz = (o != null) ? o.getClass() : null; if (o instanceof Iterable) { int i = 0; for (Object member : (Iterable) o) { result.put("member" + (i++), member); } } else if (o instanceof Map) { int i = 0; Map<?, ?> m = (Map<?, ?>) o; for (Map.Entry<?, ?> entry : m.entrySet()) { result.put("member" + (i++), new Entry(entry.getKey(), entry.getValue())); } } else { for (Field field : FlagUtils.getAllFields(clazz, fieldPredicate)) { field.setAccessible(true); String fieldName = field.getName(); Object fieldVal = field.get(o); result.put(fieldName, fieldVal); } } return result; }
public static void logUnserializableChains(Object root) throws IllegalArgumentException, IllegalAccessException { final Map<List<Object>, Class<?>> unserializablePaths = Maps.newLinkedHashMap(); Visitor visitor = new Visitor() { @Override public boolean visit(Object o, Iterable<Object> refChain) { try { Serializers.reconstitute(o); return true; } catch (Exception e) { // not serializable in some way: report ImmutableList<Object> refChainList = ImmutableList.copyOf(refChain); // First strip out any less specific paths for (Iterator<List<Object>> iter = unserializablePaths.keySet().iterator(); iter.hasNext(); ) { List<Object> existing = iter.next(); if (refChainList.size() >= existing.size() && refChainList.subList(0, existing.size()).equals(existing)) { iter.remove(); } } // Then add this list unserializablePaths.put(ImmutableList.copyOf(refChainList), o.getClass()); return false; } } }; deepVisitInternal( root, SERIALIZED_FIELD_PREDICATE, Lists.newArrayList(), new LinkedList<Object>(), visitor); StringBuilder msg = new StringBuilder("Not serializable: \n"); for (Map.Entry<List<Object>, Class<?>> entry : unserializablePaths.entrySet()) { msg.append("\ttype=" + entry.getValue() + "; chain=" + entry.getKey() + "\n"); } LOG.warn(msg.toString()); }