aQute.lib.json.ObjectHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biz.aQute.bndlib Show documentation
Show all versions of biz.aQute.bndlib Show documentation
bndlib: A Swiss Army Knife for OSGi
package aQute.lib.json;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class ObjectHandler extends Handler {
@SuppressWarnings("rawtypes")
final Class rawClass;
final Field fields[];
final Type types[];
final Object defaults[];
final Field extra;
ObjectHandler(JSONCodec codec, Class< ? > c) throws Exception {
rawClass = c;
List fields = new ArrayList();
for (Field f : c.getFields()) {
if (Modifier.isStatic(f.getModifiers()))
continue;
fields.add(f);
}
this.fields = fields.toArray(new Field[0]);
// Sort the fields so the output is canonical
Arrays.sort(this.fields, new Comparator() {
public int compare(Field o1, Field o2) {
return o1.getName().compareTo(o2.getName());
}
});
types = new Type[this.fields.length];
defaults = new Object[this.fields.length];
Field x = null;
for (int i = 0; i < this.fields.length; i++) {
if (this.fields[i].getName().equals("__extra"))
x = this.fields[i];
types[i] = this.fields[i].getGenericType();
}
if (x != null && Map.class.isAssignableFrom(x.getType()))
extra = x;
else
extra = null;
try {
Object template = c.getConstructor().newInstance();
for (int i = 0; i < this.fields.length; i++) {
defaults[i] = this.fields[i].get(template);
}
} catch (Exception e) {
// Ignore
}
}
@Override
public void encode(Encoder app, Object object, Map