예제 #1
0
  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;
  }
예제 #2
0
  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());
  }