Java tutorial
/* * 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.hadoop.hbase; import java.nio.ByteBuffer; import java.util.Collection; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Strings; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hbase.thirdparty.com.google.common.collect.Lists; import org.apache.hbase.thirdparty.org.apache.commons.collections4.IterableUtils; @InterfaceAudience.Private public class KeyValueTestUtil { public static KeyValue create(String row, String family, String qualifier, long timestamp, String value) { return create(row, family, qualifier, timestamp, KeyValue.Type.Put, value); } public static KeyValue create(String row, String family, String qualifier, long timestamp, KeyValue.Type type, String value) { return new KeyValue(Bytes.toBytes(row), Bytes.toBytes(family), Bytes.toBytes(qualifier), timestamp, type, Bytes.toBytes(value)); } public static ByteBuffer toByteBufferAndRewind(final Iterable<? extends KeyValue> kvs, boolean includeMemstoreTS) { int totalBytes = KeyValueUtil.totalLengthWithMvccVersion(kvs, includeMemstoreTS); ByteBuffer bb = ByteBuffer.allocate(totalBytes); for (KeyValue kv : IterableUtils.emptyIfNull(kvs)) { KeyValueUtil.appendToByteBuffer(bb, kv, includeMemstoreTS); } bb.rewind(); return bb; } /** * Checks whether KeyValues from kvCollection2 are contained in kvCollection1. * * The comparison is made without distinguishing MVCC version of the KeyValues * * @param kvCollection1 * @param kvCollection2 * @return true if KeyValues from kvCollection2 are contained in kvCollection1 */ public static boolean containsIgnoreMvccVersion(Collection<? extends Cell> kvCollection1, Collection<? extends Cell> kvCollection2) { for (Cell kv1 : kvCollection1) { boolean found = false; for (Cell kv2 : kvCollection2) { if (PrivateCellUtil.equalsIgnoreMvccVersion(kv1, kv2)) found = true; } if (!found) return false; } return true; } public static List<KeyValue> rewindThenToList(final ByteBuffer bb, final boolean includesMemstoreTS, final boolean useTags) { bb.rewind(); List<KeyValue> kvs = Lists.newArrayList(); KeyValue kv = null; while (true) { kv = KeyValueUtil.nextShallowCopy(bb, includesMemstoreTS, useTags); if (kv == null) { break; } kvs.add(kv); } return kvs; } /********************* toString ************************************/ public static String toStringWithPadding(final Collection<? extends KeyValue> kvs, final boolean includeMeta) { int maxRowStringLength = 0; int maxFamilyStringLength = 0; int maxQualifierStringLength = 0; int maxTimestampLength = 0; for (KeyValue kv : kvs) { maxRowStringLength = Math.max(maxRowStringLength, getRowString(kv).length()); maxFamilyStringLength = Math.max(maxFamilyStringLength, getFamilyString(kv).length()); maxQualifierStringLength = Math.max(maxQualifierStringLength, getQualifierString(kv).length()); maxTimestampLength = Math.max(maxTimestampLength, Long.valueOf(kv.getTimestamp()).toString().length()); } StringBuilder sb = new StringBuilder(); for (KeyValue kv : kvs) { if (sb.length() > 0) { sb.append("\n"); } String row = toStringWithPadding(kv, maxRowStringLength, maxFamilyStringLength, maxQualifierStringLength, maxTimestampLength, includeMeta); sb.append(row); } return sb.toString(); } protected static String toStringWithPadding(final KeyValue kv, final int maxRowLength, int maxFamilyLength, int maxQualifierLength, int maxTimestampLength, boolean includeMeta) { String leadingLengths = ""; String familyLength = kv.getFamilyLength() + " "; if (includeMeta) { leadingLengths += Strings.padFront(kv.getKeyLength() + "", '0', 4); leadingLengths += " "; leadingLengths += Strings.padFront(kv.getValueLength() + "", '0', 4); leadingLengths += " "; leadingLengths += Strings.padFront(kv.getRowLength() + "", '0', 2); leadingLengths += " "; } int spacesAfterRow = maxRowLength - getRowString(kv).length() + 2; int spacesAfterFamily = maxFamilyLength - getFamilyString(kv).length() + 2; int spacesAfterQualifier = maxQualifierLength - getQualifierString(kv).length() + 1; int spacesAfterTimestamp = maxTimestampLength - Long.valueOf(kv.getTimestamp()).toString().length() + 1; return leadingLengths + getRowString(kv) + StringUtils.repeat(' ', spacesAfterRow) + familyLength + getFamilyString(kv) + StringUtils.repeat(' ', spacesAfterFamily) + getQualifierString(kv) + StringUtils.repeat(' ', spacesAfterQualifier) + getTimestampString(kv) + StringUtils.repeat(' ', spacesAfterTimestamp) + getTypeString(kv) + " " + getValueString(kv); } protected static String getRowString(final KeyValue kv) { return Bytes.toStringBinary(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength()); } protected static String getFamilyString(final KeyValue kv) { return Bytes.toStringBinary(kv.getFamilyArray(), kv.getFamilyOffset(), kv.getFamilyLength()); } protected static String getQualifierString(final KeyValue kv) { return Bytes.toStringBinary(kv.getQualifierArray(), kv.getQualifierOffset(), kv.getQualifierLength()); } protected static String getTimestampString(final KeyValue kv) { return kv.getTimestamp() + ""; } protected static String getTypeString(final KeyValue kv) { return KeyValue.Type.codeToType(kv.getTypeByte()).toString(); } protected static String getValueString(final KeyValue kv) { return Bytes.toStringBinary(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()); } }