public LeafNodeObject Build(List<ObjectGroupDataElementData> objectGroupList,
                                    ObjectGroupObjectData dataObj,
                                    ExGuid intermediateGuid) throws TikaException, IOException {
            AtomicReference<LeafNodeObject> node = new AtomicReference<>();
            AtomicReference<IntermediateNodeObject> rootNode = new AtomicReference<>();

            AtomicInteger index = new AtomicInteger(0);
            if (StreamObject.tryGetCurrent(ByteUtil.toByteArray(dataObj.data.content), index, node,
                    LeafNodeObject.class)) {
                if (dataObj.objectExGUIDArray == null) {
                    throw new TikaException(
                            "Failed to build intermediate node because the object extend GUID array does not exist.");
                }

                node.get().exGuid = intermediateGuid;

                // Contain a single Data Node Object.
                if (dataObj.objectExGUIDArray.count.getDecodedValue() == 1) {
                    AtomicReference<ObjectGroupObjectDeclare> dataNodeDeclare =
                            new AtomicReference<>();
                    ObjectGroupObjectData dataNodeData = this.FindByExGuid(objectGroupList,
                            dataObj.objectExGUIDArray.content.get(0), dataNodeDeclare);
                    BinaryItem data = dataNodeData.data;

                    node.get().dataNodeObjectData =
                            new DataNodeObjectData(ByteUtil.toByteArray(data.content), 0,
                                    (int) data.length.getDecodedValue());
                    node.get().dataNodeObjectData.exGuid = dataObj.objectExGUIDArray.content.get(0);
                    node.get().intermediateNodeObjectList = null;
                } else {
                    // Contain a list of LeafNodeObjectData
                    node.get().intermediateNodeObjectList = new ArrayList<LeafNodeObject>();
                    node.get().dataNodeObjectData = null;
                    for (ExGuid extGuid : dataObj.objectExGUIDArray.content) {
                        AtomicReference<ObjectGroupObjectDeclare> intermediateDeclare =
                                new AtomicReference<>();
                        ObjectGroupObjectData intermediateData =
                                this.FindByExGuid(objectGroupList, extGuid, intermediateDeclare);
                        node.get().intermediateNodeObjectList.add(
                                new IntermediateNodeObjectBuilder().Build(objectGroupList,
                                        intermediateData, extGuid));
                    }
                }
            } else if (StreamObject.tryGetCurrent(ByteUtil.toByteArray(dataObj.data.content), index,
                    rootNode, IntermediateNodeObject.class)) {
                // In Sub chunking for larger than 1MB zip file, MOSS2010 could return IntermediateNodeObject.
                // For easy further process, the rootNode will be replaced by intermediate node instead.
                node.set(new LeafNodeObject());
                node.get().intermediateNodeObjectList = new ArrayList<LeafNodeObject>();
                node.get().dataSize = rootNode.get().dataSize;
                node.get().exGuid = rootNode.get().exGuid;
                node.get().signature = rootNode.get().signature;
                node.get().dataNodeObjectData = null;
                for (ExGuid extGuid : dataObj.objectExGUIDArray.content) {
                    AtomicReference<ObjectGroupObjectDeclare> intermediateDeclare =
                            new AtomicReference<>();
                    ObjectGroupObjectData intermediateData =
                            this.FindByExGuid(objectGroupList, extGuid, intermediateDeclare);
                    node.get().intermediateNodeObjectList.add(
                            new IntermediateNodeObjectBuilder().Build(objectGroupList,
                                    intermediateData, extGuid));
                }
            } else {
                throw new TikaException(
                        "In the ObjectGroupDataElement cannot only contain the " +
                                "IntermediateNodeObject or IntermediateNodeObject.");
            }

            return node.get();
        }
This method is used to build intermediate node object from an list of object group data element

@param objectGroupList  Specify the list of object group data elements.
@param dataObj          Specify the object group object.
@param intermediateGuid Specify the intermediate extended GUID.
@return Return the intermediate node object.
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/streamobj/LeafNodeObject.java