/**
 * 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.hcatalog.hbase;

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.mapred.TableOutputFormat;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobContext;
import org.apache.hadoop.mapred.OutputCommitter;
import org.apache.hadoop.mapred.RecordWriter;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TaskAttemptContext;
import org.apache.hadoop.util.Progressable;
import org.apache.hcatalog.hbase.snapshot.RevisionManager;
import org.apache.hcatalog.hbase.snapshot.Transaction;

/**
 * "Direct" implementation of OutputFormat for HBase. Uses HTable client's put
 * API to write each row to HBase one a time. Presently it is just using
 * TableOutputFormat as the underlying implementation in the future we can tune
 * this to make the writes faster such as permanently disabling WAL, caching,
 * etc.
 */
class HBaseDirectOutputFormat extends HBaseBaseOutputFormat {

    private TableOutputFormat outputFormat;

    public HBaseDirectOutputFormat() {
        this.outputFormat = new TableOutputFormat();
    }

    @Override
    public RecordWriter<WritableComparable<?>, Put> getRecordWriter(FileSystem ignored,
                                                                    JobConf job, String name, Progressable progress)
        throws IOException {
        long version = HBaseRevisionManagerUtil.getOutputRevision(job);
        return new HBaseDirectRecordWriter(outputFormat.getRecordWriter(ignored, job, name,
            progress), version);
    }

    @Override
    public void checkOutputSpecs(FileSystem ignored, JobConf job)
        throws IOException {
        outputFormat.checkOutputSpecs(ignored, job);
        HBaseUtil.addHBaseDelegationToken(job);
    }

    private static class HBaseDirectRecordWriter implements
        RecordWriter<WritableComparable<?>, Put> {

        private RecordWriter<WritableComparable<?>, Put> baseWriter;
        private final Long outputVersion;

        public HBaseDirectRecordWriter(
            RecordWriter<WritableComparable<?>, Put> baseWriter,
            Long outputVersion) {
            this.baseWriter = baseWriter;
            this.outputVersion = outputVersion;
        }

        @Override
        public void write(WritableComparable<?> key, Put value)
            throws IOException {
            Put put = value;
            if (outputVersion != null) {
                put = new Put(value.getRow(), outputVersion.longValue());
                for (List<KeyValue> row : value.getFamilyMap().values()) {
                    for (KeyValue el : row) {
                        put.add(el.getFamily(), el.getQualifier(), el.getValue());
                    }
                }
            }
            baseWriter.write(key, put);
        }

        @Override
        public void close(Reporter reporter) throws IOException {
            baseWriter.close(reporter);
        }

    }

    public static class HBaseDirectOutputCommitter extends OutputCommitter {

        public HBaseDirectOutputCommitter() throws IOException {
        }

        @Override
        public void abortTask(TaskAttemptContext taskContext)
            throws IOException {
        }

        @Override
        public void commitTask(TaskAttemptContext taskContext)
            throws IOException {
        }

        @Override
        public boolean needsTaskCommit(TaskAttemptContext taskContext)
            throws IOException {
            return false;
        }

        @Override
        public void setupJob(JobContext jobContext) throws IOException {
        }

        @Override
        public void setupTask(TaskAttemptContext taskContext)
            throws IOException {
        }

        @Override
        public void abortJob(JobContext jobContext, int status)
            throws IOException {
            super.abortJob(jobContext, status);
            RevisionManager rm = null;
            try {
                rm = HBaseRevisionManagerUtil
                    .getOpenedRevisionManager(jobContext.getConfiguration());
                Transaction writeTransaction = HBaseRevisionManagerUtil
                    .getWriteTransaction(jobContext.getConfiguration());
                rm.abortWriteTransaction(writeTransaction);
            } finally {
                if (rm != null)
                    rm.close();
            }
        }

        @Override
        public void commitJob(JobContext jobContext) throws IOException {
            RevisionManager rm = null;
            try {
                rm = HBaseRevisionManagerUtil
                    .getOpenedRevisionManager(jobContext.getConfiguration());
                rm.commitWriteTransaction(HBaseRevisionManagerUtil.getWriteTransaction(jobContext
                    .getConfiguration()));
            } finally {
                if (rm != null)
                    rm.close();
            }
        }
    }
}
