| /* |
| * |
| * 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.client; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.hbase.HConstants; |
| import org.apache.hadoop.hbase.TableName; |
| import org.apache.hadoop.hbase.client.RegionInfo; |
| import org.apache.hadoop.hbase.client.RegionInfoBuilder; |
| import org.apache.hadoop.hbase.master.RegionState; |
| import org.apache.hadoop.hbase.util.Bytes; |
| import org.apache.yetus.audience.InterfaceAudience; |
| |
| import java.io.IOException; |
| |
| /** |
| * Utility used composing RegionInfo for 'display'; e.g. on the web UI |
| */ |
| @InterfaceAudience.Private |
| public class RegionInfoDisplay { |
| public final static String DISPLAY_KEYS_KEY = "hbase.display.keys"; |
| public final static byte[] HIDDEN_END_KEY = Bytes.toBytes("hidden-end-key"); |
| public final static byte[] HIDDEN_START_KEY = Bytes.toBytes("hidden-start-key"); |
| |
| /** |
| * Get the descriptive name as {@link RegionState} does it but with hidden |
| * startkey optionally |
| * @return descriptive string |
| */ |
| public static String getDescriptiveNameFromRegionStateForDisplay(RegionState state, |
| Configuration conf) { |
| if (conf.getBoolean(DISPLAY_KEYS_KEY, true)) return state.toDescriptiveString(); |
| String descriptiveStringFromState = state.toDescriptiveString(); |
| int idx = descriptiveStringFromState.lastIndexOf(" state="); |
| String regionName = getRegionNameAsStringForDisplay( |
| RegionInfoBuilder.newBuilder(state.getRegion()).build(), conf); |
| return regionName + descriptiveStringFromState.substring(idx); |
| } |
| |
| /** |
| * Get the end key for display. Optionally hide the real end key. |
| * @return the endkey |
| */ |
| public static byte[] getEndKeyForDisplay(RegionInfo ri, Configuration conf) { |
| boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true); |
| if (displayKey) return ri.getEndKey(); |
| return HIDDEN_END_KEY; |
| } |
| |
| /** |
| * Get the start key for display. Optionally hide the real start key. |
| * @param ri |
| * @param conf |
| * @return the startkey |
| */ |
| public static byte[] getStartKeyForDisplay(RegionInfo ri, Configuration conf) { |
| boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true); |
| if (displayKey) return ri.getStartKey(); |
| return HIDDEN_START_KEY; |
| } |
| |
| /** |
| * Get the region name for display. Optionally hide the start key. |
| * @param ri |
| * @param conf |
| * @return region name as String |
| */ |
| public static String getRegionNameAsStringForDisplay(RegionInfo ri, Configuration conf) { |
| return Bytes.toStringBinary(getRegionNameForDisplay(ri, conf)); |
| } |
| |
| /** |
| * Get the region name for display. Optionally hide the start key. |
| * @param ri |
| * @param conf |
| * @return region name bytes |
| */ |
| public static byte[] getRegionNameForDisplay(RegionInfo ri, Configuration conf) { |
| boolean displayKey = conf.getBoolean(DISPLAY_KEYS_KEY, true); |
| if (displayKey || ri.getTable().equals(TableName.META_TABLE_NAME)) { |
| return ri.getRegionName(); |
| } else { |
| // create a modified regionname with the startkey replaced but preserving |
| // the other parts including the encodedname. |
| try { |
| byte[][]regionNameParts = RegionInfo.parseRegionName(ri.getRegionName()); |
| regionNameParts[1] = HIDDEN_START_KEY; //replace the real startkey |
| int len = 0; |
| // get the total length |
| for (byte[] b : regionNameParts) { |
| len += b.length; |
| } |
| byte[] encodedRegionName = |
| Bytes.toBytes(RegionInfo.encodeRegionName(ri.getRegionName())); |
| len += encodedRegionName.length; |
| //allocate some extra bytes for the delimiters and the last '.' |
| byte[] modifiedName = new byte[len + regionNameParts.length + 1]; |
| int lengthSoFar = 0; |
| int loopCount = 0; |
| for (byte[] b : regionNameParts) { |
| System.arraycopy(b, 0, modifiedName, lengthSoFar, b.length); |
| lengthSoFar += b.length; |
| if (loopCount++ == 2) modifiedName[lengthSoFar++] = RegionInfo.REPLICA_ID_DELIMITER; |
| else modifiedName[lengthSoFar++] = HConstants.DELIMITER; |
| } |
| // replace the last comma with '.' |
| modifiedName[lengthSoFar - 1] = RegionInfo.ENC_SEPARATOR; |
| System.arraycopy(encodedRegionName, 0, modifiedName, lengthSoFar, |
| encodedRegionName.length); |
| lengthSoFar += encodedRegionName.length; |
| modifiedName[lengthSoFar] = RegionInfo.ENC_SEPARATOR; |
| return modifiedName; |
| } catch (IOException e) { |
| //LOG.warn("Encountered exception " + e); |
| throw new RuntimeException(e); |
| } |
| } |
| } |
| } |