All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.camel.component.hbase.HBaseProducer Maven / Gradle / Ivy

There is a newer version: 3.22.2
Show newest version
/*
 * 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.camel.component.hbase;

import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.apache.camel.Exchange;
import org.apache.camel.component.hbase.filters.ModelAwareFilter;
import org.apache.camel.component.hbase.mapping.CellMappingStrategy;
import org.apache.camel.component.hbase.model.HBaseCell;
import org.apache.camel.component.hbase.model.HBaseData;
import org.apache.camel.component.hbase.model.HBaseRow;
import org.apache.camel.support.DefaultProducer;
import org.apache.camel.util.ObjectHelper;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Append;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;

/**
 * The HBase producer.
 */
public class HBaseProducer extends DefaultProducer {

    private HBaseEndpoint endpoint;
    private HBaseRow rowModel;

    public HBaseProducer(HBaseEndpoint endpoint) {
        super(endpoint);
        this.endpoint = endpoint;
        this.rowModel = endpoint.getRowModel();
    }

    @Override
    public void process(Exchange exchange) throws Exception {
        try (Table table = endpoint.getTable()) {
            updateHeaders(exchange);
            String operation = (String) exchange.getIn().getHeader(HBaseConstants.OPERATION);

            Integer maxScanResult = exchange.getIn().getHeader(HBaseConstants.HBASE_MAX_SCAN_RESULTS, Integer.class);
            String fromRowId = (String) exchange.getIn().getHeader(HBaseConstants.FROM_ROW);
            String stopRowId = (String) exchange.getIn().getHeader(HBaseConstants.STOP_ROW);
            CellMappingStrategy mappingStrategy = endpoint.getCellMappingStrategyFactory().getStrategy(exchange.getIn());

            HBaseData data = mappingStrategy.resolveModel(exchange.getIn());

            List putOperations = new LinkedList<>();
            List appendOperations = new LinkedList<>();
            List incrementOperations = new LinkedList<>();
            List deleteOperations = new LinkedList<>();
            List getOperationResult = new LinkedList<>();
            List scanOperationResult = new LinkedList<>();

            for (HBaseRow hRow : data.getRows()) {
                hRow.apply(rowModel);
                if (HBaseConstants.PUT.equals(operation)) {
                    putOperations.add(createPut(hRow));
                } else if (HBaseConstants.APPEND.equals(operation)) {
                    appendOperations.add(createAppend(hRow));
                } else if (HBaseConstants.INCREMENT.equals(operation)) {
                    incrementOperations.add(createIncrement(hRow));
                } else if (HBaseConstants.GET.equals(operation)) {
                    HBaseRow getResultRow = getCells(table, hRow);
                    getOperationResult.add(getResultRow);
                } else if (HBaseConstants.DELETE.equals(operation)) {
                    deleteOperations.add(createDeleteRow(hRow));
                } else if (HBaseConstants.SCAN.equals(operation)) {
                    scanOperationResult = scanCells(table, hRow, fromRowId, stopRowId, maxScanResult, endpoint.getFilters());
                }
            }

            //Check if we have something to add.
            if (!putOperations.isEmpty()) {
                table.put(putOperations);
            } else if (!appendOperations.isEmpty()) {
                for (Append appendOperation : appendOperations) {
                    table.append(appendOperation);
                }
            } else if (!incrementOperations.isEmpty()) {
                for (Increment incrementOperation : incrementOperations) {
                    table.increment(incrementOperation);
                }
            } else if (!deleteOperations.isEmpty()) {
                table.delete(deleteOperations);
            } else if (!getOperationResult.isEmpty()) {
                mappingStrategy.applyGetResults(exchange.getMessage(), new HBaseData(getOperationResult));
            } else if (!scanOperationResult.isEmpty()) {
                mappingStrategy.applyScanResults(exchange.getMessage(), new HBaseData(scanOperationResult));
            }
        }
    }

    /**
     * Creates an HBase {@link Put} on a specific row, using a collection of values (family/column/value pairs).
     */
    private Put createPut(HBaseRow hRow) {
        ObjectHelper.notNull(hRow, "HBase row");
        ObjectHelper.notNull(hRow.getId(), "HBase row id");
        ObjectHelper.notNull(hRow.getCells(), "HBase cells");

        Put put = new Put(endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, hRow.getId()));
        Set cells = hRow.getCells();
        for (HBaseCell cell : cells) {
            String family = cell.getFamily();
            String column = cell.getQualifier();
            Object value = cell.getValue();

            ObjectHelper.notNull(family, "HBase column family", cell);
            ObjectHelper.notNull(column, "HBase column", cell);
            put.addColumn(
                    HBaseHelper.getHBaseFieldAsBytes(family),
                    HBaseHelper.getHBaseFieldAsBytes(column),
                    endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, value));
        }
        return put;
    }

    /**
     * Creates an HBase {@link Append} on a specific row, using a collection of values (family/column/value pairs).
     */
    private Append createAppend(HBaseRow hRow) {
        ObjectHelper.notNull(hRow, "HBase row");
        ObjectHelper.notNull(hRow.getId(), "HBase row id");
        ObjectHelper.notNull(hRow.getCells(), "HBase cells");

        Append append = new Append(endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, hRow.getId()));
        Set cells = hRow.getCells();
        for (HBaseCell cell : cells) {
            String family = cell.getFamily();
            String column = cell.getQualifier();
            Object value = cell.getValue();

            ObjectHelper.notNull(family, "HBase column family", cell);
            ObjectHelper.notNull(column, "HBase column", cell);
            append.addColumn(
                    HBaseHelper.getHBaseFieldAsBytes(family),
                    HBaseHelper.getHBaseFieldAsBytes(column),
                    endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, value));
        }
        return append;
    }

    /**
     * Creates an HBase {@link Increment} on a specific row, using a collection of values (family/column/value pairs).
     */
    private Increment createIncrement(HBaseRow hRow) {
        ObjectHelper.notNull(hRow, "HBase row");
        ObjectHelper.notNull(hRow.getId(), "HBase row id");
        ObjectHelper.notNull(hRow.getCells(), "HBase cells");

        Increment increment
                = new Increment(endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, hRow.getId()));
        Set cells = hRow.getCells();
        for (HBaseCell cell : cells) {
            String family = cell.getFamily();
            String column = cell.getQualifier();
            Object value = cell.getValue();

            ObjectHelper.notNull(family, "HBase column family", cell);
            ObjectHelper.notNull(column, "HBase column", cell);
            increment.addColumn(
                    HBaseHelper.getHBaseFieldAsBytes(family),
                    HBaseHelper.getHBaseFieldAsBytes(column),
                    endpoint.getCamelContext().getTypeConverter().convertTo(Long.class, value));
        }
        return increment;
    }

    /**
     * Performs an HBase {@link Get} on a specific row, using a collection of values (family/column/value pairs). The
     * result is
     * 

* the most recent entry *

* for each column. */ private HBaseRow getCells(Table table, HBaseRow hRow) throws Exception { HBaseRow resultRow = new HBaseRow(); ObjectHelper.notNull(hRow, "HBase row"); ObjectHelper.notNull(hRow.getId(), "HBase row id"); ObjectHelper.notNull(hRow.getCells(), "HBase cells"); resultRow.setId(hRow.getId()); Get get = new Get(endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, hRow.getId())); Set cellModels = hRow.getCells(); for (HBaseCell cellModel : cellModels) { String family = cellModel.getFamily(); String column = cellModel.getQualifier(); ObjectHelper.notNull(family, "HBase column family", cellModel); ObjectHelper.notNull(column, "HBase column", cellModel); get.addColumn(HBaseHelper.getHBaseFieldAsBytes(family), HBaseHelper.getHBaseFieldAsBytes(column)); } Result result = table.get(get); if (!result.isEmpty()) { resultRow.setTimestamp(result.rawCells()[0].getTimestamp()); } for (HBaseCell cellModel : cellModels) { HBaseCell resultCell = new HBaseCell(); String family = cellModel.getFamily(); String column = cellModel.getQualifier(); resultCell.setFamily(family); resultCell.setQualifier(column); List kvs = result.getColumnCells(HBaseHelper.getHBaseFieldAsBytes(family), HBaseHelper.getHBaseFieldAsBytes(column)); if (kvs != null && !kvs.isEmpty()) { //Return the most recent entry. resultCell.setValue(endpoint.getCamelContext().getTypeConverter().convertTo(cellModel.getValueType(), CellUtil.cloneValue(kvs.get(0)))); resultCell.setTimestamp(kvs.get(0).getTimestamp()); } resultRow.getCells().add(resultCell); } return resultRow; } /** * Creates an HBase {@link Delete} on a specific row, using a collection of values (family/column/value pairs). */ private Delete createDeleteRow(HBaseRow hRow) { ObjectHelper.notNull(hRow, "HBase row"); ObjectHelper.notNull(hRow.getId(), "HBase row id"); return new Delete(endpoint.getCamelContext().getTypeConverter().convertTo(byte[].class, hRow.getId())); } /** * Performs an HBase {@link Get} on a specific row, using a collection of values (family/column/value pairs). The * result is *

* the most recent entry *

* for each column. */ private List scanCells( Table table, HBaseRow model, String start, String stop, Integer maxRowScan, List filters) throws Exception { List rowSet = new LinkedList<>(); // unused //HBaseRow startRow = new HBaseRow(model.getCells()); //startRow.setId(start); Scan scan = new Scan(); if (start != null) { scan.withStartRow(Bytes.toBytes(start)); } if (ObjectHelper.isNotEmpty(stop)) { scan.withStopRow(Bytes.toBytes(stop)); } if (filters != null && !filters.isEmpty()) { for (int i = 0; i < filters.size(); i++) { ((ModelAwareFilter) filters.get(i)).apply(endpoint.getCamelContext(), model); scan.setFilter(new FilterList( FilterList.Operator.MUST_PASS_ALL, ((ModelAwareFilter) filters.get(i)).getFilteredList())); } } Set cellModels = model.getCells(); for (HBaseCell cellModel : cellModels) { String family = cellModel.getFamily(); String column = cellModel.getQualifier(); if (ObjectHelper.isNotEmpty(family) && ObjectHelper.isNotEmpty(column)) { scan.addColumn(HBaseHelper.getHBaseFieldAsBytes(family), HBaseHelper.getHBaseFieldAsBytes(column)); } } ResultScanner resultScanner = table.getScanner(scan); int count = 0; Result result = resultScanner.next(); while (result != null && count < maxRowScan) { HBaseRow resultRow = new HBaseRow(); resultRow.setId(endpoint.getCamelContext().getTypeConverter().convertTo(model.getRowType(), result.getRow())); resultRow.setTimestamp(result.rawCells()[0].getTimestamp()); cellModels = model.getCells(); for (HBaseCell modelCell : cellModels) { HBaseCell resultCell = new HBaseCell(); String family = modelCell.getFamily(); String column = modelCell.getQualifier(); resultRow.setId(endpoint.getCamelContext().getTypeConverter().convertTo( model.getRowType(), result.getRow())); resultCell.setValue(endpoint.getCamelContext().getTypeConverter().convertTo( modelCell.getValueType(), result.getValue(HBaseHelper.getHBaseFieldAsBytes(family), HBaseHelper.getHBaseFieldAsBytes(column)))); resultCell.setFamily(modelCell.getFamily()); resultCell.setQualifier(modelCell.getQualifier()); Cell cell = result.getColumnLatestCell(HBaseHelper.getHBaseFieldAsBytes(family), HBaseHelper.getHBaseFieldAsBytes(column)); if (cell != null) { resultCell.setTimestamp(cell.getTimestamp()); } resultRow.getCells().add(resultCell); } rowSet.add(resultRow); count++; result = resultScanner.next(); } return rowSet; } /** * This methods fill possible gaps in the {@link Exchange} headers, with values passed from the Endpoint. */ private void updateHeaders(Exchange exchange) { if (exchange != null && exchange.getIn() != null) { if (endpoint.getMaxResults() != 0 && exchange.getIn().getHeader(HBaseConstants.HBASE_MAX_SCAN_RESULTS) == null) { exchange.getIn().setHeader(HBaseConstants.HBASE_MAX_SCAN_RESULTS, endpoint.getMaxResults()); } if (endpoint.getMappingStrategyName() != null && exchange.getIn().getHeader(HBaseConstants.STRATEGY) == null) { exchange.getIn().setHeader(HBaseConstants.STRATEGY, endpoint.getMappingStrategyName()); } if (endpoint.getMappingStrategyName() != null && exchange.getIn().getHeader(HBaseConstants.STRATEGY_CLASS_NAME) == null) { exchange.getIn().setHeader(HBaseConstants.STRATEGY_CLASS_NAME, endpoint.getMappingStrategyClassName()); } if (endpoint.getOperation() != null && exchange.getIn().getHeader(HBaseConstants.OPERATION) == null) { exchange.getIn().setHeader(HBaseConstants.OPERATION, endpoint.getOperation()); } else if (endpoint.getOperation() == null && exchange.getIn().getHeader(HBaseConstants.OPERATION) == null) { exchange.getIn().setHeader(HBaseConstants.OPERATION, HBaseConstants.PUT); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy