/**
 * 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.gora.mapreduce;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

import org.apache.avro.Schema;
import org.apache.avro.io.Decoder;
import org.apache.avro.io.ResolvingDecoder;
import org.apache.avro.io.parsing.Symbol;
import org.apache.avro.util.Utf8;

/**
 * Avro uses a ResolvingDecoder which resolves two schemas and converts records 
 * written by one to the other, and validates the input. However, Gora needs to 
 * write extra information along with the data, so the validation is not consistent 
 * with the grammer generated by Avro. So we need to fake the ResolvingDecoder (which
 * is sadly hard codec into GenericDatumReader) until we can write our own GrammerGenerator
 * extending ResolvingGrammerGenerator of avro.
 */
public class FakeResolvingDecoder extends ResolvingDecoder {

  public FakeResolvingDecoder(Schema schema, Decoder in) throws IOException {
    super(schema, schema, in);
  }
  
  @Override
  public long arrayNext() throws IOException {
    return in.arrayNext();
  }
  
  @Override
  public Symbol doAction(Symbol input, Symbol top) throws IOException {
    return null;
  }
  
  @Override
  public void init(InputStream in) throws IOException {
    this.in.init(in);
  }
  
  @Override
  public long mapNext() throws IOException {
    return in.mapNext();
  }

  @Override
  public double readDouble() throws IOException {
    return in.readDouble();
  }

  @Override
  public int readEnum() throws IOException {
    return in.readEnum();
  }

  @Override
  public int readIndex() throws IOException {
    return in.readIndex();
  }

  @Override
  public long readLong() throws IOException {
    return in.readLong();
  }

  @Override
  public void skipAction() throws IOException {
  }

  @Override
  public long readArrayStart() throws IOException {
    return in.readArrayStart();
  }

  @Override
  public boolean readBoolean() throws IOException {
    return in.readBoolean();
  }

  @Override
  public ByteBuffer readBytes(ByteBuffer old) throws IOException {
    return in.readBytes(old);
  }

  @Override
  public void readFixed(byte[] bytes, int start, int len) throws IOException {
    in.readFixed(bytes, start, len);
  }

  @Override
  public float readFloat() throws IOException {
    return in.readFloat();
  }

  @Override
  public int readInt() throws IOException {
    return in.readInt();
  }

  @Override
  public long readMapStart() throws IOException {
    return in.readMapStart();
  }

  @Override
  public void readNull() throws IOException {
    in.readNull();
  }

  @Override
  public Utf8 readString(Utf8 old) throws IOException {
    return in.readString(old);
  }

  @Override
  public long skipArray() throws IOException {
    return in.skipArray();
  }

  @Override
  public void skipBytes() throws IOException {
    in.skipBytes();
  }

  @Override
  protected void skipFixed() throws IOException {
  }

  @Override
  public void skipFixed(int length) throws IOException {
    in.skipFixed(length);
  }

  @Override
  public long skipMap() throws IOException {
    return in.skipMap();
  }

  @Override
  public void skipString() throws IOException {
  }

  @Override
  public void skipTopSymbol() throws IOException {
  }

  @Override
  public void readFixed(byte[] bytes) throws IOException {
    in.readFixed(bytes);
  }
}
