- private static Collection<DataTreeCandidateNode> readChildren(final NormalizedNodeDataInput in) throws IOException {
- final int size = in.readInt();
- if (size != 0) {
- final Collection<DataTreeCandidateNode> ret = new ArrayList<>(size);
- for (int i = 0; i < size; ++i) {
- final DataTreeCandidateNode child = readNode(in);
- if (child != null) {
- ret.add(child);
- }
- }
- return ret;
- } else {
- return Collections.emptyList();
- }
- }
-
- private static DataTreeCandidateNode readModifiedNode(final ModificationType type,
- final NormalizedNodeDataInput in) throws IOException {
-
- final PathArgument identifier = in.readPathArgument();
- final Collection<DataTreeCandidateNode> children = readChildren(in);
- if (children.isEmpty()) {
- LOG.debug("Modified node {} does not have any children, not instantiating it", identifier);
- return null;
- } else {
- return ModifiedDataTreeCandidateNode.create(identifier, type, children);
- }
- }
-
- private static DataTreeCandidateNode readNode(final NormalizedNodeDataInput in) throws IOException {
- final byte type = in.readByte();
- switch (type) {
- case APPEARED:
- return readModifiedNode(ModificationType.APPEARED, in);
- case DELETE:
- return DeletedDataTreeCandidateNode.create(in.readPathArgument());
- case DISAPPEARED:
- return readModifiedNode(ModificationType.DISAPPEARED, in);
- case SUBTREE_MODIFIED:
- return readModifiedNode(ModificationType.SUBTREE_MODIFIED, in);
- case UNMODIFIED:
- return null;
- case WRITE:
- return DataTreeCandidateNodes.fromNormalizedNode(in.readNormalizedNode());
- default:
- throw new IllegalArgumentException("Unhandled node type " + type);
- }
- }
-
- private static DataTreeCandidate parseCandidate(final ByteArrayDataInput in) throws IOException {
- final NormalizedNodeDataInput reader = new NormalizedNodeInputStreamReader(in);
- final YangInstanceIdentifier rootPath = reader.readYangInstanceIdentifier();
- final byte type = reader.readByte();
-
- final DataTreeCandidateNode rootNode;
- switch (type) {
- case DELETE:
- rootNode = DeletedDataTreeCandidateNode.create();
- break;
- case SUBTREE_MODIFIED:
- rootNode = ModifiedDataTreeCandidateNode.create(readChildren(reader));
- break;
- case WRITE:
- rootNode = DataTreeCandidateNodes.fromNormalizedNode(reader.readNormalizedNode());
- break;
- default:
- throw new IllegalArgumentException("Unhandled node type " + type);
- }
-
- return DataTreeCandidates.newDataTreeCandidate(rootPath, rootNode);
- }
-
- DataTreeCandidate getCandidate() throws IOException {
- return parseCandidate(ByteStreams.newDataInput(serialized));
- }