private static void collectInstanceFields(Class<? extends Object> clazz, List<NodeFieldAccessor> fieldsList) { if (clazz.getSuperclass() != null) { collectInstanceFields(clazz.getSuperclass(), fieldsList); } Field[] declaredFields = clazz.getDeclaredFields(); for (Field field : declaredFields) { if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) { continue; } NodeFieldAccessor nodeField; if (field.getDeclaringClass() == Node.class && (field.getName().equals("parent") || field.getName().equals("nodeClass"))) { continue; } else if (field.getAnnotation(Child.class) != null) { checkChildField(field); nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.CHILD, field); } else if (field.getAnnotation(Children.class) != null) { checkChildrenField(field); nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.CHILDREN, field); } else { nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.DATA, field); } fieldsList.add(nodeField); } }
private static void collectInstanceFields(Class<? extends Object> clazz, List<NodeFieldAccessor> fieldsList) { if (clazz.getSuperclass() != null) { collectInstanceFields(clazz.getSuperclass(), fieldsList); } Field[] declaredFields = clazz.getDeclaredFields(); for (Field field : declaredFields) { if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) { continue; } NodeFieldAccessor nodeField; if (field.getDeclaringClass() == Node.class && (field.getName().equals("parent") || field.getName().equals("nodeClass"))) { continue; } else if (field.getAnnotation(Child.class) != null) { checkChildField(field); nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.CHILD, field); } else if (field.getAnnotation(Children.class) != null) { checkChildrenField(field); nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.CHILDREN, field); } else { nodeField = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.DATA, field); } fieldsList.add(nodeField); } }
NodeClassImpl(Class<? extends Node> clazz) { super(clazz); if (!Node.class.isAssignableFrom(clazz)) { throw new IllegalArgumentException(); } List<NodeFieldAccessor> fieldsList = new ArrayList<>(); NodeFieldAccessor parentFieldTmp = null; try { Field field = Node.class.getDeclaredField("parent"); assert Node.class.isAssignableFrom(field.getType()); parentFieldTmp = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.PARENT, field); } catch (NoSuchFieldException e) { throw new AssertionError("Node field not found", e); } collectInstanceFields(clazz, fieldsList); Collections.sort(fieldsList, new Comparator<NodeFieldAccessor>() { public int compare(NodeFieldAccessor o1, NodeFieldAccessor o2) { return Integer.compare(order(o1), order(o2)); } private int order(NodeFieldAccessor nodeField) { return isChildField(nodeField) ? 0 : (isChildrenField(nodeField) ? 0 : (isCloneableField(nodeField) ? 1 : 2)); } }); this.fields = fieldsList.toArray(EMPTY_NODE_FIELD_ARRAY); this.parentField = parentFieldTmp; this.clazz = clazz; }
NodeClassImpl(Class<? extends Node> clazz) { super(clazz); if (!Node.class.isAssignableFrom(clazz)) { throw new IllegalArgumentException(); } List<NodeFieldAccessor> fieldsList = new ArrayList<>(); NodeFieldAccessor parentFieldTmp = null; try { Field field = Node.class.getDeclaredField("parent"); assert Node.class.isAssignableFrom(field.getType()); parentFieldTmp = NodeFieldAccessor.create(NodeFieldAccessor.NodeFieldKind.PARENT, field); } catch (NoSuchFieldException e) { throw new AssertionError("Node field not found", e); } collectInstanceFields(clazz, fieldsList); Collections.sort(fieldsList, new Comparator<NodeFieldAccessor>() { public int compare(NodeFieldAccessor o1, NodeFieldAccessor o2) { return Integer.compare(order(o1), order(o2)); } private int order(NodeFieldAccessor nodeField) { return isChildField(nodeField) ? 0 : (isChildrenField(nodeField) ? 0 : (isCloneableField(nodeField) ? 1 : 2)); } }); this.fields = fieldsList.toArray(EMPTY_NODE_FIELD_ARRAY); this.parentField = parentFieldTmp; this.clazz = clazz; }
if (field.getDeclaringClass() == Node.class && field.getName().equals("parent")) { assert Node.class.isAssignableFrom(field.getType()); nodeField = NodeFieldAccessor.create(NodeFieldKind.PARENT, field); parentFieldTmp = nodeField; } else if (field.getDeclaringClass() == Node.class && field.getName().equals("nodeClass")) { assert NodeClass.class.isAssignableFrom(field.getType()); nodeField = NodeFieldAccessor.create(NodeFieldKind.NODE_CLASS, field); nodeClassFieldTmp = nodeField; } else if (field.getAnnotation(Child.class) != null) { checkChildField(field); nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILD, field); childFieldList.add(nodeField); } else if (field.getAnnotation(Children.class) != null) { checkChildrenField(field); nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILDREN, field); childrenFieldList.add(nodeField); } else { nodeField = NodeFieldAccessor.create(NodeFieldKind.DATA, field); if (NodeCloneable.class.isAssignableFrom(field.getType())) { cloneableFieldList.add(nodeField);