/*
 * 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.beam.runners.flink.translation.wrappers;

import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.flink.core.memory.DataInputView;

/**
 * Wrapper for {@link DataInputView}. We need this because Flink reads data using a {@link
 * org.apache.flink.core.memory.DataInputView} while Beam {@link org.apache.beam.sdk.coders.Coder}s
 * expect an {@link java.io.InputStream}.
 */
public class DataInputViewWrapper extends InputStream {

  private final DataInputView inputView;

  public DataInputViewWrapper(DataInputView inputView) {
    this.inputView = inputView;
  }

  @Override
  public int read() throws IOException {
    try {
      return inputView.readUnsignedByte();
    } catch (EOFException e) {
      // translate between DataInput and InputStream,
      // DataInput signals EOF by exception, InputStream does it by returning -1
      return -1;
    }
  }

  @Override
  public int read(byte[] b, int off, int len) throws IOException {
    return inputView.read(b, off, len);
  }
}
