in tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/ObjectInterner.java [69:133]
public static int internFields(Object obj) {
if (obj == null)
return 0;
Field[] fields = obj.getClass().getDeclaredFields();
AtomicInteger compressed = new AtomicInteger();
for (Field field : fields) {
if(Modifier.isStatic(field.getModifiers()))
continue;
field.setAccessible(true);
try {
Object fldVal = field.get(obj);
if (fldVal == null)
continue;
if(!Modifier.isFinal(field.getModifiers())) {
if (fldVal instanceof String) {
String exist = (String)fldVal;
String intern = internString(exist);
//noinspection StringEquality
if (intern != exist) {
compressed.incrementAndGet();
field.set(obj, intern);
}
continue;
}
}
if (fldVal.getClass().getPackage().getName().startsWith("org.apache.ignite.ci"))
compressed.addAndGet(internFields(fldVal));
else if (fldVal instanceof Collection) {
Collection collection = (Collection)fldVal;
for (Object next : collection) {
if (next.getClass().getPackage().getName().startsWith("org.apache.ignite.ci"))
compressed.addAndGet(internFields(next));
}
}
else if(fldVal instanceof Map) {
Map map = (Map)fldVal;
Set<Map.Entry> set = map.entrySet();
for (Map.Entry nextEntry : set) {
Object val = nextEntry.getValue();
if (val.getClass().getPackage().getName().startsWith("org.apache.ignite.ci"))
compressed.addAndGet(internFields(val));
}
}
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return compressed.get();
}