/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.flex.utilities.converter.retrievers.download.utils.utils.btree;

import java.io.DataInputStream;

/**
 * Created by christoferdutz on 15.04.17.
 */
public abstract class HFSPlusBTreeNode {

    private HFSPlusBTreeDescriptor nodeDescriptor;

    public HFSPlusBTreeNode(DataInputStream dis) {
        this.nodeDescriptor = new HFSPlusBTreeDescriptor(dis);
    }

    public HFSPlusBTreeDescriptor getNodeDescriptor() {
        return nodeDescriptor;
    }

    @Override
    public String toString() {
        return "HFSPlusBTreeNode{" +
                "nodeDescriptor=" + nodeDescriptor +
                '}';
    }
}
