/*
 * 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.
 */
#pragma once
#include <jni.h>
#include <IO/BufferWithOwnMemory.h>
#include <IO/WriteBuffer.h>

namespace local_engine
{
class WriteBufferFromJavaOutputStream : public DB::BufferWithOwnMemory<DB::WriteBuffer>
{
public:
    static jclass output_stream_class;
    static jmethodID output_stream_write;
    static jmethodID output_stream_flush;

    WriteBufferFromJavaOutputStream(jobject output_stream, jbyteArray buffer, size_t customize_buffer_size);
    ~WriteBufferFromJavaOutputStream() override;

private:
    void nextImpl() override;

protected:
    void finalizeImpl() override;

private:
    jobject output_stream;
    jbyteArray buffer;
    size_t buffer_size;
};
}
