blob: 3c8afcdd37995378eebb6e259990847fa26fd8c7 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (17) -->
<title>Source code</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="source: package: org.apache.hadoop.hbase.shaded.protobuf, class: ProtobufUtil">
<meta name="generator" content="javadoc/SourceToHTMLConverter">
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body class="source-page">
<main role="main">
<div class="source-container">
<pre><span class="source-line-no">001</span><span id="line-1">/*</span>
<span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span>
<span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span>
<span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span>
<span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span>
<span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span>
<span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span>
<span class="source-line-no">009</span><span id="line-9"> *</span>
<span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="source-line-no">011</span><span id="line-11"> *</span>
<span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span>
<span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span>
<span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span>
<span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span>
<span class="source-line-no">017</span><span id="line-17"> */</span>
<span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.shaded.protobuf;</span>
<span class="source-line-no">019</span><span id="line-19"></span>
<span class="source-line-no">020</span><span id="line-20">import static org.apache.hadoop.hbase.protobuf.ProtobufMagic.PB_MAGIC;</span>
<span class="source-line-no">021</span><span id="line-21"></span>
<span class="source-line-no">022</span><span id="line-22">import java.io.ByteArrayOutputStream;</span>
<span class="source-line-no">023</span><span id="line-23">import java.io.EOFException;</span>
<span class="source-line-no">024</span><span id="line-24">import java.io.IOException;</span>
<span class="source-line-no">025</span><span id="line-25">import java.io.InputStream;</span>
<span class="source-line-no">026</span><span id="line-26">import java.lang.reflect.Constructor;</span>
<span class="source-line-no">027</span><span id="line-27">import java.lang.reflect.InvocationTargetException;</span>
<span class="source-line-no">028</span><span id="line-28">import java.lang.reflect.Method;</span>
<span class="source-line-no">029</span><span id="line-29">import java.nio.ByteBuffer;</span>
<span class="source-line-no">030</span><span id="line-30">import java.security.AccessController;</span>
<span class="source-line-no">031</span><span id="line-31">import java.security.PrivilegedAction;</span>
<span class="source-line-no">032</span><span id="line-32">import java.util.ArrayList;</span>
<span class="source-line-no">033</span><span id="line-33">import java.util.Collection;</span>
<span class="source-line-no">034</span><span id="line-34">import java.util.Collections;</span>
<span class="source-line-no">035</span><span id="line-35">import java.util.HashMap;</span>
<span class="source-line-no">036</span><span id="line-36">import java.util.List;</span>
<span class="source-line-no">037</span><span id="line-37">import java.util.Locale;</span>
<span class="source-line-no">038</span><span id="line-38">import java.util.Map;</span>
<span class="source-line-no">039</span><span id="line-39">import java.util.Map.Entry;</span>
<span class="source-line-no">040</span><span id="line-40">import java.util.NavigableSet;</span>
<span class="source-line-no">041</span><span id="line-41">import java.util.Objects;</span>
<span class="source-line-no">042</span><span id="line-42">import java.util.Optional;</span>
<span class="source-line-no">043</span><span id="line-43">import java.util.Set;</span>
<span class="source-line-no">044</span><span id="line-44">import java.util.concurrent.Callable;</span>
<span class="source-line-no">045</span><span id="line-45">import java.util.concurrent.TimeUnit;</span>
<span class="source-line-no">046</span><span id="line-46">import java.util.function.Function;</span>
<span class="source-line-no">047</span><span id="line-47">import java.util.regex.Pattern;</span>
<span class="source-line-no">048</span><span id="line-48">import java.util.stream.Collectors;</span>
<span class="source-line-no">049</span><span id="line-49">import org.apache.hadoop.conf.Configuration;</span>
<span class="source-line-no">050</span><span id="line-50">import org.apache.hadoop.fs.Path;</span>
<span class="source-line-no">051</span><span id="line-51">import org.apache.hadoop.hbase.ByteBufferExtendedCell;</span>
<span class="source-line-no">052</span><span id="line-52">import org.apache.hadoop.hbase.CacheEvictionStats;</span>
<span class="source-line-no">053</span><span id="line-53">import org.apache.hadoop.hbase.CacheEvictionStatsBuilder;</span>
<span class="source-line-no">054</span><span id="line-54">import org.apache.hadoop.hbase.Cell;</span>
<span class="source-line-no">055</span><span id="line-55">import org.apache.hadoop.hbase.CellBuilderType;</span>
<span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.CellScanner;</span>
<span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.CellUtil;</span>
<span class="source-line-no">058</span><span id="line-58">import org.apache.hadoop.hbase.CompareOperator;</span>
<span class="source-line-no">059</span><span id="line-59">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
<span class="source-line-no">060</span><span id="line-60">import org.apache.hadoop.hbase.ExtendedCell;</span>
<span class="source-line-no">061</span><span id="line-61">import org.apache.hadoop.hbase.ExtendedCellBuilder;</span>
<span class="source-line-no">062</span><span id="line-62">import org.apache.hadoop.hbase.ExtendedCellBuilderFactory;</span>
<span class="source-line-no">063</span><span id="line-63">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.hbase.HBaseIOException;</span>
<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.HConstants;</span>
<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.HRegionLocation;</span>
<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.KeyValue;</span>
<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.NamespaceDescriptor;</span>
<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.ServerName;</span>
<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.ServerTask;</span>
<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.ServerTaskBuilder;</span>
<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.TableName;</span>
<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.client.Append;</span>
<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.client.BalanceRequest;</span>
<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.client.BalanceResponse;</span>
<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.client.BalancerDecision;</span>
<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.client.BalancerRejection;</span>
<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.client.ClientUtil;</span>
<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;</span>
<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;</span>
<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.client.CompactionState;</span>
<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.hbase.client.Consistency;</span>
<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.hbase.client.Cursor;</span>
<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.hbase.client.Delete;</span>
<span class="source-line-no">086</span><span id="line-86">import org.apache.hadoop.hbase.client.Durability;</span>
<span class="source-line-no">087</span><span id="line-87">import org.apache.hadoop.hbase.client.Get;</span>
<span class="source-line-no">088</span><span id="line-88">import org.apache.hadoop.hbase.client.Increment;</span>
<span class="source-line-no">089</span><span id="line-89">import org.apache.hadoop.hbase.client.LogEntry;</span>
<span class="source-line-no">090</span><span id="line-90">import org.apache.hadoop.hbase.client.Mutation;</span>
<span class="source-line-no">091</span><span id="line-91">import org.apache.hadoop.hbase.client.OnlineLogRecord;</span>
<span class="source-line-no">092</span><span id="line-92">import org.apache.hadoop.hbase.client.PackagePrivateFieldAccessor;</span>
<span class="source-line-no">093</span><span id="line-93">import org.apache.hadoop.hbase.client.Put;</span>
<span class="source-line-no">094</span><span id="line-94">import org.apache.hadoop.hbase.client.RegionInfoBuilder;</span>
<span class="source-line-no">095</span><span id="line-95">import org.apache.hadoop.hbase.client.RegionLoadStats;</span>
<span class="source-line-no">096</span><span id="line-96">import org.apache.hadoop.hbase.client.RegionReplicaUtil;</span>
<span class="source-line-no">097</span><span id="line-97">import org.apache.hadoop.hbase.client.RegionStatesCount;</span>
<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.client.Result;</span>
<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.client.RowMutations;</span>
<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.client.Scan;</span>
<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.client.SlowLogParams;</span>
<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.client.SnapshotDescription;</span>
<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.client.SnapshotType;</span>
<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.client.TableDescriptor;</span>
<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.client.TableDescriptorBuilder;</span>
<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.client.metrics.ScanMetrics;</span>
<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.client.security.SecurityCapability;</span>
<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.exceptions.DeserializationException;</span>
<span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.hbase.filter.BinaryComparator;</span>
<span class="source-line-no">110</span><span id="line-110">import org.apache.hadoop.hbase.filter.ByteArrayComparable;</span>
<span class="source-line-no">111</span><span id="line-111">import org.apache.hadoop.hbase.filter.Filter;</span>
<span class="source-line-no">112</span><span id="line-112">import org.apache.hadoop.hbase.io.TimeRange;</span>
<span class="source-line-no">113</span><span id="line-113">import org.apache.hadoop.hbase.master.RegionState;</span>
<span class="source-line-no">114</span><span id="line-114">import org.apache.hadoop.hbase.net.Address;</span>
<span class="source-line-no">115</span><span id="line-115">import org.apache.hadoop.hbase.protobuf.ProtobufMagic;</span>
<span class="source-line-no">116</span><span id="line-116">import org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter;</span>
<span class="source-line-no">117</span><span id="line-117">import org.apache.hadoop.hbase.quotas.QuotaScope;</span>
<span class="source-line-no">118</span><span id="line-118">import org.apache.hadoop.hbase.quotas.QuotaType;</span>
<span class="source-line-no">119</span><span id="line-119">import org.apache.hadoop.hbase.quotas.SpaceViolationPolicy;</span>
<span class="source-line-no">120</span><span id="line-120">import org.apache.hadoop.hbase.quotas.ThrottleType;</span>
<span class="source-line-no">121</span><span id="line-121">import org.apache.hadoop.hbase.replication.ReplicationLoadSink;</span>
<span class="source-line-no">122</span><span id="line-122">import org.apache.hadoop.hbase.replication.ReplicationLoadSource;</span>
<span class="source-line-no">123</span><span id="line-123">import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;</span>
<span class="source-line-no">124</span><span id="line-124">import org.apache.hadoop.hbase.security.visibility.Authorizations;</span>
<span class="source-line-no">125</span><span id="line-125">import org.apache.hadoop.hbase.security.visibility.CellVisibility;</span>
<span class="source-line-no">126</span><span id="line-126">import org.apache.hadoop.hbase.util.Addressing;</span>
<span class="source-line-no">127</span><span id="line-127">import org.apache.hadoop.hbase.util.Bytes;</span>
<span class="source-line-no">128</span><span id="line-128">import org.apache.hadoop.hbase.util.DynamicClassLoader;</span>
<span class="source-line-no">129</span><span id="line-129">import org.apache.hadoop.hbase.util.ExceptionUtil;</span>
<span class="source-line-no">130</span><span id="line-130">import org.apache.hadoop.hbase.util.Methods;</span>
<span class="source-line-no">131</span><span id="line-131">import org.apache.hadoop.hbase.util.ReflectedFunctionCache;</span>
<span class="source-line-no">132</span><span id="line-132">import org.apache.hadoop.hbase.util.VersionInfo;</span>
<span class="source-line-no">133</span><span id="line-133">import org.apache.hadoop.ipc.RemoteException;</span>
<span class="source-line-no">134</span><span id="line-134">import org.apache.yetus.audience.InterfaceAudience;</span>
<span class="source-line-no">135</span><span id="line-135">import org.slf4j.Logger;</span>
<span class="source-line-no">136</span><span id="line-136">import org.slf4j.LoggerFactory;</span>
<span class="source-line-no">137</span><span id="line-137"></span>
<span class="source-line-no">138</span><span id="line-138">import org.apache.hbase.thirdparty.com.google.common.io.ByteStreams;</span>
<span class="source-line-no">139</span><span id="line-139">import org.apache.hbase.thirdparty.com.google.gson.JsonArray;</span>
<span class="source-line-no">140</span><span id="line-140">import org.apache.hbase.thirdparty.com.google.gson.JsonElement;</span>
<span class="source-line-no">141</span><span id="line-141">import org.apache.hbase.thirdparty.com.google.protobuf.ByteString;</span>
<span class="source-line-no">142</span><span id="line-142">import org.apache.hbase.thirdparty.com.google.protobuf.CodedInputStream;</span>
<span class="source-line-no">143</span><span id="line-143">import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;</span>
<span class="source-line-no">144</span><span id="line-144">import org.apache.hbase.thirdparty.com.google.protobuf.Message;</span>
<span class="source-line-no">145</span><span id="line-145">import org.apache.hbase.thirdparty.com.google.protobuf.Parser;</span>
<span class="source-line-no">146</span><span id="line-146">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
<span class="source-line-no">147</span><span id="line-147">import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;</span>
<span class="source-line-no">148</span><span id="line-148">import org.apache.hbase.thirdparty.com.google.protobuf.Service;</span>
<span class="source-line-no">149</span><span id="line-149">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
<span class="source-line-no">150</span><span id="line-150">import org.apache.hbase.thirdparty.com.google.protobuf.TextFormat;</span>
<span class="source-line-no">151</span><span id="line-151">import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;</span>
<span class="source-line-no">152</span><span id="line-152">import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils;</span>
<span class="source-line-no">153</span><span id="line-153"></span>
<span class="source-line-no">154</span><span id="line-154">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;</span>
<span class="source-line-no">155</span><span id="line-155">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;</span>
<span class="source-line-no">156</span><span id="line-156">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearSlowLogResponses;</span>
<span class="source-line-no">157</span><span id="line-157">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;</span>
<span class="source-line-no">158</span><span id="line-158">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;</span>
<span class="source-line-no">159</span><span id="line-159">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;</span>
<span class="source-line-no">160</span><span id="line-160">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;</span>
<span class="source-line-no">161</span><span id="line-161">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;</span>
<span class="source-line-no">162</span><span id="line-162">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;</span>
<span class="source-line-no">163</span><span id="line-163">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse;</span>
<span class="source-line-no">164</span><span id="line-164">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoRequest;</span>
<span class="source-line-no">165</span><span id="line-165">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoResponse;</span>
<span class="source-line-no">166</span><span id="line-166">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileRequest;</span>
<span class="source-line-no">167</span><span id="line-167">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileResponse;</span>
<span class="source-line-no">168</span><span id="line-168">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest;</span>
<span class="source-line-no">169</span><span id="line-169">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ServerInfo;</span>
<span class="source-line-no">170</span><span id="line-170">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest;</span>
<span class="source-line-no">171</span><span id="line-171">import org.apache.hadoop.hbase.shaded.protobuf.generated.CellProtos;</span>
<span class="source-line-no">172</span><span id="line-172">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;</span>
<span class="source-line-no">173</span><span id="line-173">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Column;</span>
<span class="source-line-no">174</span><span id="line-174">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceRequest;</span>
<span class="source-line-no">175</span><span id="line-175">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.GetRequest;</span>
<span class="source-line-no">176</span><span id="line-176">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest;</span>
<span class="source-line-no">177</span><span id="line-177">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutateRequest;</span>
<span class="source-line-no">178</span><span id="line-178">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto;</span>
<span class="source-line-no">179</span><span id="line-179">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue;</span>
<span class="source-line-no">180</span><span id="line-180">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.ColumnValue.QualifierValue;</span>
<span class="source-line-no">181</span><span id="line-181">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.DeleteType;</span>
<span class="source-line-no">182</span><span id="line-182">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MutationProto.MutationType;</span>
<span class="source-line-no">183</span><span id="line-183">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction;</span>
<span class="source-line-no">184</span><span id="line-184">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest;</span>
<span class="source-line-no">185</span><span id="line-185">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos;</span>
<span class="source-line-no">186</span><span id="line-186">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad;</span>
<span class="source-line-no">187</span><span id="line-187">import org.apache.hadoop.hbase.shaded.protobuf.generated.ComparatorProtos;</span>
<span class="source-line-no">188</span><span id="line-188">import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;</span>
<span class="source-line-no">189</span><span id="line-189">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;</span>
<span class="source-line-no">190</span><span id="line-190">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.BytesBytesPair;</span>
<span class="source-line-no">191</span><span id="line-191">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ColumnFamilySchema;</span>
<span class="source-line-no">192</span><span id="line-192">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameBytesPair;</span>
<span class="source-line-no">193</span><span id="line-193">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameStringPair;</span>
<span class="source-line-no">194</span><span id="line-194">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription;</span>
<span class="source-line-no">195</span><span id="line-195">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionExceptionMessage;</span>
<span class="source-line-no">196</span><span id="line-196">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionInfo;</span>
<span class="source-line-no">197</span><span id="line-197">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier;</span>
<span class="source-line-no">198</span><span id="line-198">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;</span>
<span class="source-line-no">199</span><span id="line-199">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.TableSchema;</span>
<span class="source-line-no">200</span><span id="line-200">import org.apache.hadoop.hbase.shaded.protobuf.generated.HFileProtos;</span>
<span class="source-line-no">201</span><span id="line-201">import org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos;</span>
<span class="source-line-no">202</span><span id="line-202">import org.apache.hadoop.hbase.shaded.protobuf.generated.MapReduceProtos;</span>
<span class="source-line-no">203</span><span id="line-203">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;</span>
<span class="source-line-no">204</span><span id="line-204">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest;</span>
<span class="source-line-no">205</span><span id="line-205">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsResponse;</span>
<span class="source-line-no">206</span><span id="line-206">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsResponse;</span>
<span class="source-line-no">207</span><span id="line-207">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListNamespaceDescriptorsResponse;</span>
<span class="source-line-no">208</span><span id="line-208">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByNamespaceResponse;</span>
<span class="source-line-no">209</span><span id="line-209">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByStateResponse;</span>
<span class="source-line-no">210</span><span id="line-210">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse;</span>
<span class="source-line-no">211</span><span id="line-211">import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;</span>
<span class="source-line-no">212</span><span id="line-212">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos;</span>
<span class="source-line-no">213</span><span id="line-213">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos;</span>
<span class="source-line-no">214</span><span id="line-214">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupProtos;</span>
<span class="source-line-no">215</span><span id="line-215">import org.apache.hadoop.hbase.shaded.protobuf.generated.RecentLogs;</span>
<span class="source-line-no">216</span><span id="line-216">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerReportRequest;</span>
<span class="source-line-no">217</span><span id="line-217">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupRequest;</span>
<span class="source-line-no">218</span><span id="line-218">import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos;</span>
<span class="source-line-no">219</span><span id="line-219">import org.apache.hadoop.hbase.shaded.protobuf.generated.TooSlowLog;</span>
<span class="source-line-no">220</span><span id="line-220">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;</span>
<span class="source-line-no">221</span><span id="line-221">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor;</span>
<span class="source-line-no">222</span><span id="line-222">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor;</span>
<span class="source-line-no">223</span><span id="line-223">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor;</span>
<span class="source-line-no">224</span><span id="line-224">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction;</span>
<span class="source-line-no">225</span><span id="line-225">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor;</span>
<span class="source-line-no">226</span><span id="line-226">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor.EventType;</span>
<span class="source-line-no">227</span><span id="line-227">import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;</span>
<span class="source-line-no">228</span><span id="line-228">import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;</span>
<span class="source-line-no">229</span><span id="line-229"></span>
<span class="source-line-no">230</span><span id="line-230">/**</span>
<span class="source-line-no">231</span><span id="line-231"> * Protobufs utility. Be aware that a class named org.apache.hadoop.hbase.protobuf.ProtobufUtil</span>
<span class="source-line-no">232</span><span id="line-232"> * (i.e. no 'shaded' in the package name) carries a COPY of a subset of this class for non-shaded</span>
<span class="source-line-no">233</span><span id="line-233"> * users; e.g. Coprocessor Endpoints. If you make change in here, be sure to make change in the</span>
<span class="source-line-no">234</span><span id="line-234"> * companion class too (not the end of the world, especially if you are adding new functionality but</span>
<span class="source-line-no">235</span><span id="line-235"> * something to be aware of.</span>
<span class="source-line-no">236</span><span id="line-236"> */</span>
<span class="source-line-no">237</span><span id="line-237">@InterfaceAudience.Private // TODO: some clients (Hive, etc) use this class</span>
<span class="source-line-no">238</span><span id="line-238">public final class ProtobufUtil {</span>
<span class="source-line-no">239</span><span id="line-239"></span>
<span class="source-line-no">240</span><span id="line-240"> private static final Logger LOG = LoggerFactory.getLogger(ProtobufUtil.class.getName());</span>
<span class="source-line-no">241</span><span id="line-241"></span>
<span class="source-line-no">242</span><span id="line-242"> private ProtobufUtil() {</span>
<span class="source-line-no">243</span><span id="line-243"> }</span>
<span class="source-line-no">244</span><span id="line-244"></span>
<span class="source-line-no">245</span><span id="line-245"> /**</span>
<span class="source-line-no">246</span><span id="line-246"> * Many results are simple: no cell, exists true or false. To save on object creations, we reuse</span>
<span class="source-line-no">247</span><span id="line-247"> * them across calls.</span>
<span class="source-line-no">248</span><span id="line-248"> */</span>
<span class="source-line-no">249</span><span id="line-249"> private final static ExtendedCell[] EMPTY_CELL_ARRAY = new ExtendedCell[0];</span>
<span class="source-line-no">250</span><span id="line-250"> private final static Result EMPTY_RESULT = Result.create(EMPTY_CELL_ARRAY);</span>
<span class="source-line-no">251</span><span id="line-251"> final static Result EMPTY_RESULT_EXISTS_TRUE = Result.create(null, true);</span>
<span class="source-line-no">252</span><span id="line-252"> final static Result EMPTY_RESULT_EXISTS_FALSE = Result.create(null, false);</span>
<span class="source-line-no">253</span><span id="line-253"> private final static Result EMPTY_RESULT_STALE = Result.create(EMPTY_CELL_ARRAY, null, true);</span>
<span class="source-line-no">254</span><span id="line-254"> private final static Result EMPTY_RESULT_EXISTS_TRUE_STALE =</span>
<span class="source-line-no">255</span><span id="line-255"> Result.create((Cell[]) null, true, true);</span>
<span class="source-line-no">256</span><span id="line-256"> private final static Result EMPTY_RESULT_EXISTS_FALSE_STALE =</span>
<span class="source-line-no">257</span><span id="line-257"> Result.create((Cell[]) null, false, true);</span>
<span class="source-line-no">258</span><span id="line-258"></span>
<span class="source-line-no">259</span><span id="line-259"> private final static ClientProtos.Result EMPTY_RESULT_PB;</span>
<span class="source-line-no">260</span><span id="line-260"> private final static ClientProtos.Result EMPTY_RESULT_PB_EXISTS_TRUE;</span>
<span class="source-line-no">261</span><span id="line-261"> private final static ClientProtos.Result EMPTY_RESULT_PB_EXISTS_FALSE;</span>
<span class="source-line-no">262</span><span id="line-262"> private final static ClientProtos.Result EMPTY_RESULT_PB_STALE;</span>
<span class="source-line-no">263</span><span id="line-263"> private final static ClientProtos.Result EMPTY_RESULT_PB_EXISTS_TRUE_STALE;</span>
<span class="source-line-no">264</span><span id="line-264"> private final static ClientProtos.Result EMPTY_RESULT_PB_EXISTS_FALSE_STALE;</span>
<span class="source-line-no">265</span><span id="line-265"></span>
<span class="source-line-no">266</span><span id="line-266"> static {</span>
<span class="source-line-no">267</span><span id="line-267"> ClientProtos.Result.Builder builder = ClientProtos.Result.newBuilder();</span>
<span class="source-line-no">268</span><span id="line-268"></span>
<span class="source-line-no">269</span><span id="line-269"> builder.setExists(true);</span>
<span class="source-line-no">270</span><span id="line-270"> builder.setAssociatedCellCount(0);</span>
<span class="source-line-no">271</span><span id="line-271"> EMPTY_RESULT_PB_EXISTS_TRUE = builder.build();</span>
<span class="source-line-no">272</span><span id="line-272"></span>
<span class="source-line-no">273</span><span id="line-273"> builder.setStale(true);</span>
<span class="source-line-no">274</span><span id="line-274"> EMPTY_RESULT_PB_EXISTS_TRUE_STALE = builder.build();</span>
<span class="source-line-no">275</span><span id="line-275"> builder.clear();</span>
<span class="source-line-no">276</span><span id="line-276"></span>
<span class="source-line-no">277</span><span id="line-277"> builder.setExists(false);</span>
<span class="source-line-no">278</span><span id="line-278"> builder.setAssociatedCellCount(0);</span>
<span class="source-line-no">279</span><span id="line-279"> EMPTY_RESULT_PB_EXISTS_FALSE = builder.build();</span>
<span class="source-line-no">280</span><span id="line-280"> builder.setStale(true);</span>
<span class="source-line-no">281</span><span id="line-281"> EMPTY_RESULT_PB_EXISTS_FALSE_STALE = builder.build();</span>
<span class="source-line-no">282</span><span id="line-282"></span>
<span class="source-line-no">283</span><span id="line-283"> builder.clear();</span>
<span class="source-line-no">284</span><span id="line-284"> builder.setAssociatedCellCount(0);</span>
<span class="source-line-no">285</span><span id="line-285"> EMPTY_RESULT_PB = builder.build();</span>
<span class="source-line-no">286</span><span id="line-286"> builder.setStale(true);</span>
<span class="source-line-no">287</span><span id="line-287"> EMPTY_RESULT_PB_STALE = builder.build();</span>
<span class="source-line-no">288</span><span id="line-288"> }</span>
<span class="source-line-no">289</span><span id="line-289"></span>
<span class="source-line-no">290</span><span id="line-290"> private static volatile boolean classLoaderLoaded = false;</span>
<span class="source-line-no">291</span><span id="line-291"></span>
<span class="source-line-no">292</span><span id="line-292"> /**</span>
<span class="source-line-no">293</span><span id="line-293"> * Dynamic class loader to load filter/comparators</span>
<span class="source-line-no">294</span><span id="line-294"> */</span>
<span class="source-line-no">295</span><span id="line-295"> private final static class ClassLoaderHolder {</span>
<span class="source-line-no">296</span><span id="line-296"> private final static ClassLoader CLASS_LOADER;</span>
<span class="source-line-no">297</span><span id="line-297"></span>
<span class="source-line-no">298</span><span id="line-298"> static {</span>
<span class="source-line-no">299</span><span id="line-299"> ClassLoader parent = ProtobufUtil.class.getClassLoader();</span>
<span class="source-line-no">300</span><span id="line-300"> Configuration conf = HBaseConfiguration.create();</span>
<span class="source-line-no">301</span><span id="line-301"> CLASS_LOADER = AccessController</span>
<span class="source-line-no">302</span><span id="line-302"> .doPrivileged((PrivilegedAction&lt;ClassLoader&gt;) () -&gt; new DynamicClassLoader(conf, parent));</span>
<span class="source-line-no">303</span><span id="line-303"> classLoaderLoaded = true;</span>
<span class="source-line-no">304</span><span id="line-304"> }</span>
<span class="source-line-no">305</span><span id="line-305"> }</span>
<span class="source-line-no">306</span><span id="line-306"></span>
<span class="source-line-no">307</span><span id="line-307"> public static boolean isClassLoaderLoaded() {</span>
<span class="source-line-no">308</span><span id="line-308"> return classLoaderLoaded;</span>
<span class="source-line-no">309</span><span id="line-309"> }</span>
<span class="source-line-no">310</span><span id="line-310"></span>
<span class="source-line-no">311</span><span id="line-311"> private static final String PARSE_FROM = "parseFrom";</span>
<span class="source-line-no">312</span><span id="line-312"></span>
<span class="source-line-no">313</span><span id="line-313"> // We don't bother using the dynamic CLASS_LOADER above, because currently we can't support</span>
<span class="source-line-no">314</span><span id="line-314"> // optimizing dynamically loaded classes. We can do it once we build for java9+, see the todo</span>
<span class="source-line-no">315</span><span id="line-315"> // in ReflectedFunctionCache</span>
<span class="source-line-no">316</span><span id="line-316"> private static final ReflectedFunctionCache&lt;byte[], Filter&gt; FILTERS =</span>
<span class="source-line-no">317</span><span id="line-317"> new ReflectedFunctionCache&lt;&gt;(Filter.class, byte[].class, PARSE_FROM);</span>
<span class="source-line-no">318</span><span id="line-318"> private static final ReflectedFunctionCache&lt;byte[], ByteArrayComparable&gt; COMPARATORS =</span>
<span class="source-line-no">319</span><span id="line-319"> new ReflectedFunctionCache&lt;&gt;(ByteArrayComparable.class, byte[].class, PARSE_FROM);</span>
<span class="source-line-no">320</span><span id="line-320"></span>
<span class="source-line-no">321</span><span id="line-321"> private static volatile boolean ALLOW_FAST_REFLECTION_FALLTHROUGH = true;</span>
<span class="source-line-no">322</span><span id="line-322"></span>
<span class="source-line-no">323</span><span id="line-323"> // Visible for tests</span>
<span class="source-line-no">324</span><span id="line-324"> public static void setAllowFastReflectionFallthrough(boolean val) {</span>
<span class="source-line-no">325</span><span id="line-325"> ALLOW_FAST_REFLECTION_FALLTHROUGH = val;</span>
<span class="source-line-no">326</span><span id="line-326"> }</span>
<span class="source-line-no">327</span><span id="line-327"></span>
<span class="source-line-no">328</span><span id="line-328"> /**</span>
<span class="source-line-no">329</span><span id="line-329"> * Prepend the passed bytes with four bytes of magic, {@link ProtobufMagic#PB_MAGIC}, to flag what</span>
<span class="source-line-no">330</span><span id="line-330"> * follows as a protobuf in hbase. Prepend these bytes to all content written to znodes, etc.</span>
<span class="source-line-no">331</span><span id="line-331"> * @param bytes Bytes to decorate</span>
<span class="source-line-no">332</span><span id="line-332"> * @return The passed &lt;code&gt;bytes&lt;/code&gt; with magic prepended (Creates a new byte array that is</span>
<span class="source-line-no">333</span><span id="line-333"> * &lt;code&gt;bytes.length&lt;/code&gt; plus {@link ProtobufMagic#PB_MAGIC}.length.</span>
<span class="source-line-no">334</span><span id="line-334"> */</span>
<span class="source-line-no">335</span><span id="line-335"> public static byte[] prependPBMagic(final byte[] bytes) {</span>
<span class="source-line-no">336</span><span id="line-336"> return Bytes.add(PB_MAGIC, bytes);</span>
<span class="source-line-no">337</span><span id="line-337"> }</span>
<span class="source-line-no">338</span><span id="line-338"></span>
<span class="source-line-no">339</span><span id="line-339"> /** Returns True if passed &lt;code&gt;bytes&lt;/code&gt; has {@link ProtobufMagic#PB_MAGIC} for a prefix. */</span>
<span class="source-line-no">340</span><span id="line-340"> public static boolean isPBMagicPrefix(final byte[] bytes) {</span>
<span class="source-line-no">341</span><span id="line-341"> return ProtobufMagic.isPBMagicPrefix(bytes);</span>
<span class="source-line-no">342</span><span id="line-342"> }</span>
<span class="source-line-no">343</span><span id="line-343"></span>
<span class="source-line-no">344</span><span id="line-344"> /** Returns True if passed &lt;code&gt;bytes&lt;/code&gt; has {@link ProtobufMagic#PB_MAGIC} for a prefix. */</span>
<span class="source-line-no">345</span><span id="line-345"> public static boolean isPBMagicPrefix(final byte[] bytes, int offset, int len) {</span>
<span class="source-line-no">346</span><span id="line-346"> return ProtobufMagic.isPBMagicPrefix(bytes, offset, len);</span>
<span class="source-line-no">347</span><span id="line-347"> }</span>
<span class="source-line-no">348</span><span id="line-348"></span>
<span class="source-line-no">349</span><span id="line-349"> /**</span>
<span class="source-line-no">350</span><span id="line-350"> * Expect the {@link ProtobufMagic#PB_MAGIC} or throw an exception.</span>
<span class="source-line-no">351</span><span id="line-351"> * @param bytes bytes to check</span>
<span class="source-line-no">352</span><span id="line-352"> * @throws DeserializationException if we are missing the pb magic prefix</span>
<span class="source-line-no">353</span><span id="line-353"> */</span>
<span class="source-line-no">354</span><span id="line-354"> public static void expectPBMagicPrefix(final byte[] bytes) throws DeserializationException {</span>
<span class="source-line-no">355</span><span id="line-355"> if (!isPBMagicPrefix(bytes)) {</span>
<span class="source-line-no">356</span><span id="line-356"> String bytesPrefix = bytes == null ? "null" : Bytes.toStringBinary(bytes, 0, PB_MAGIC.length);</span>
<span class="source-line-no">357</span><span id="line-357"> throw new DeserializationException(</span>
<span class="source-line-no">358</span><span id="line-358"> "Missing pb magic " + Bytes.toString(PB_MAGIC) + " prefix" + ", bytes: " + bytesPrefix);</span>
<span class="source-line-no">359</span><span id="line-359"> }</span>
<span class="source-line-no">360</span><span id="line-360"> }</span>
<span class="source-line-no">361</span><span id="line-361"></span>
<span class="source-line-no">362</span><span id="line-362"> /** Returns Length of {@link ProtobufMagic#lengthOfPBMagic()} */</span>
<span class="source-line-no">363</span><span id="line-363"> public static int lengthOfPBMagic() {</span>
<span class="source-line-no">364</span><span id="line-364"> return ProtobufMagic.lengthOfPBMagic();</span>
<span class="source-line-no">365</span><span id="line-365"> }</span>
<span class="source-line-no">366</span><span id="line-366"></span>
<span class="source-line-no">367</span><span id="line-367"> public static ComparatorProtos.ByteArrayComparable toByteArrayComparable(final byte[] value) {</span>
<span class="source-line-no">368</span><span id="line-368"> ComparatorProtos.ByteArrayComparable.Builder builder =</span>
<span class="source-line-no">369</span><span id="line-369"> ComparatorProtos.ByteArrayComparable.newBuilder();</span>
<span class="source-line-no">370</span><span id="line-370"> if (value != null) builder.setValue(UnsafeByteOperations.unsafeWrap(value));</span>
<span class="source-line-no">371</span><span id="line-371"> return builder.build();</span>
<span class="source-line-no">372</span><span id="line-372"> }</span>
<span class="source-line-no">373</span><span id="line-373"></span>
<span class="source-line-no">374</span><span id="line-374"> /**</span>
<span class="source-line-no">375</span><span id="line-375"> * Return the IOException thrown by the remote server wrapped in ServiceException as cause.</span>
<span class="source-line-no">376</span><span id="line-376"> * @param se ServiceException that wraps IO exception thrown by the server</span>
<span class="source-line-no">377</span><span id="line-377"> * @return Exception wrapped in ServiceException or a new IOException that wraps the unexpected</span>
<span class="source-line-no">378</span><span id="line-378"> * ServiceException.</span>
<span class="source-line-no">379</span><span id="line-379"> */</span>
<span class="source-line-no">380</span><span id="line-380"> public static IOException getRemoteException(ServiceException se) {</span>
<span class="source-line-no">381</span><span id="line-381"> return makeIOExceptionOfException(se);</span>
<span class="source-line-no">382</span><span id="line-382"> }</span>
<span class="source-line-no">383</span><span id="line-383"></span>
<span class="source-line-no">384</span><span id="line-384"> /**</span>
<span class="source-line-no">385</span><span id="line-385"> * Like {@link #getRemoteException(ServiceException)} but more generic, able to handle more than</span>
<span class="source-line-no">386</span><span id="line-386"> * just {@link ServiceException}. Prefer this method to</span>
<span class="source-line-no">387</span><span id="line-387"> * {@link #getRemoteException(ServiceException)} because trying to contain direct protobuf</span>
<span class="source-line-no">388</span><span id="line-388"> * references.</span>
<span class="source-line-no">389</span><span id="line-389"> */</span>
<span class="source-line-no">390</span><span id="line-390"> public static IOException handleRemoteException(Throwable e) {</span>
<span class="source-line-no">391</span><span id="line-391"> return makeIOExceptionOfException(e);</span>
<span class="source-line-no">392</span><span id="line-392"> }</span>
<span class="source-line-no">393</span><span id="line-393"></span>
<span class="source-line-no">394</span><span id="line-394"> private static IOException makeIOExceptionOfException(Throwable e) {</span>
<span class="source-line-no">395</span><span id="line-395"> Throwable t = e;</span>
<span class="source-line-no">396</span><span id="line-396"> if (e instanceof ServiceException) {</span>
<span class="source-line-no">397</span><span id="line-397"> t = e.getCause();</span>
<span class="source-line-no">398</span><span id="line-398"> }</span>
<span class="source-line-no">399</span><span id="line-399"> if (ExceptionUtil.isInterrupt(t)) {</span>
<span class="source-line-no">400</span><span id="line-400"> return ExceptionUtil.asInterrupt(t);</span>
<span class="source-line-no">401</span><span id="line-401"> }</span>
<span class="source-line-no">402</span><span id="line-402"> if (t instanceof RemoteException) {</span>
<span class="source-line-no">403</span><span id="line-403"> t = ((RemoteException) t).unwrapRemoteException();</span>
<span class="source-line-no">404</span><span id="line-404"> }</span>
<span class="source-line-no">405</span><span id="line-405"> return t instanceof IOException ? (IOException) t : new HBaseIOException(t);</span>
<span class="source-line-no">406</span><span id="line-406"> }</span>
<span class="source-line-no">407</span><span id="line-407"></span>
<span class="source-line-no">408</span><span id="line-408"> /**</span>
<span class="source-line-no">409</span><span id="line-409"> * Convert a ServerName to a protocol buffer ServerName</span>
<span class="source-line-no">410</span><span id="line-410"> * @param serverName the ServerName to convert</span>
<span class="source-line-no">411</span><span id="line-411"> * @return the converted protocol buffer ServerName</span>
<span class="source-line-no">412</span><span id="line-412"> * @see #toServerName(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName)</span>
<span class="source-line-no">413</span><span id="line-413"> */</span>
<span class="source-line-no">414</span><span id="line-414"> public static HBaseProtos.ServerName toServerName(final ServerName serverName) {</span>
<span class="source-line-no">415</span><span id="line-415"> if (serverName == null) {</span>
<span class="source-line-no">416</span><span id="line-416"> return null;</span>
<span class="source-line-no">417</span><span id="line-417"> }</span>
<span class="source-line-no">418</span><span id="line-418"> HBaseProtos.ServerName.Builder builder = HBaseProtos.ServerName.newBuilder();</span>
<span class="source-line-no">419</span><span id="line-419"> builder.setHostName(serverName.getHostname());</span>
<span class="source-line-no">420</span><span id="line-420"> if (serverName.getPort() &gt;= 0) {</span>
<span class="source-line-no">421</span><span id="line-421"> builder.setPort(serverName.getPort());</span>
<span class="source-line-no">422</span><span id="line-422"> }</span>
<span class="source-line-no">423</span><span id="line-423"> if (serverName.getStartcode() &gt;= 0) {</span>
<span class="source-line-no">424</span><span id="line-424"> builder.setStartCode(serverName.getStartcode());</span>
<span class="source-line-no">425</span><span id="line-425"> }</span>
<span class="source-line-no">426</span><span id="line-426"> return builder.build();</span>
<span class="source-line-no">427</span><span id="line-427"> }</span>
<span class="source-line-no">428</span><span id="line-428"></span>
<span class="source-line-no">429</span><span id="line-429"> /**</span>
<span class="source-line-no">430</span><span id="line-430"> * Convert a protocol buffer ServerName to a ServerName</span>
<span class="source-line-no">431</span><span id="line-431"> * @param proto the protocol buffer ServerName to convert</span>
<span class="source-line-no">432</span><span id="line-432"> * @return the converted ServerName</span>
<span class="source-line-no">433</span><span id="line-433"> */</span>
<span class="source-line-no">434</span><span id="line-434"> public static ServerName toServerName(final HBaseProtos.ServerName proto) {</span>
<span class="source-line-no">435</span><span id="line-435"> if (proto == null) return null;</span>
<span class="source-line-no">436</span><span id="line-436"> String hostName = proto.getHostName();</span>
<span class="source-line-no">437</span><span id="line-437"> long startCode = -1;</span>
<span class="source-line-no">438</span><span id="line-438"> int port = -1;</span>
<span class="source-line-no">439</span><span id="line-439"> if (proto.hasPort()) {</span>
<span class="source-line-no">440</span><span id="line-440"> port = proto.getPort();</span>
<span class="source-line-no">441</span><span id="line-441"> }</span>
<span class="source-line-no">442</span><span id="line-442"> if (proto.hasStartCode()) {</span>
<span class="source-line-no">443</span><span id="line-443"> startCode = proto.getStartCode();</span>
<span class="source-line-no">444</span><span id="line-444"> }</span>
<span class="source-line-no">445</span><span id="line-445"> return ServerName.valueOf(hostName, port, startCode);</span>
<span class="source-line-no">446</span><span id="line-446"> }</span>
<span class="source-line-no">447</span><span id="line-447"></span>
<span class="source-line-no">448</span><span id="line-448"> /**</span>
<span class="source-line-no">449</span><span id="line-449"> * Get a ServerName from the passed in data bytes.</span>
<span class="source-line-no">450</span><span id="line-450"> * @param data Data with a serialize server name in it; can handle the old style servername where</span>
<span class="source-line-no">451</span><span id="line-451"> * servername was host and port. Works too with data that begins w/ the pb 'PBUF'</span>
<span class="source-line-no">452</span><span id="line-452"> * magic and that is then followed by a protobuf that has a serialized</span>
<span class="source-line-no">453</span><span id="line-453"> * {@link ServerName} in it.</span>
<span class="source-line-no">454</span><span id="line-454"> * @return Returns null if &lt;code&gt;data&lt;/code&gt; is null else converts passed data to a ServerName</span>
<span class="source-line-no">455</span><span id="line-455"> * instance.</span>
<span class="source-line-no">456</span><span id="line-456"> */</span>
<span class="source-line-no">457</span><span id="line-457"> public static ServerName toServerName(final byte[] data) throws DeserializationException {</span>
<span class="source-line-no">458</span><span id="line-458"> if (data == null || data.length &lt;= 0) {</span>
<span class="source-line-no">459</span><span id="line-459"> return null;</span>
<span class="source-line-no">460</span><span id="line-460"> }</span>
<span class="source-line-no">461</span><span id="line-461"> if (ProtobufMagic.isPBMagicPrefix(data)) {</span>
<span class="source-line-no">462</span><span id="line-462"> int prefixLen = ProtobufMagic.lengthOfPBMagic();</span>
<span class="source-line-no">463</span><span id="line-463"> try {</span>
<span class="source-line-no">464</span><span id="line-464"> ZooKeeperProtos.Master rss =</span>
<span class="source-line-no">465</span><span id="line-465"> ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);</span>
<span class="source-line-no">466</span><span id="line-466"> HBaseProtos.ServerName sn = rss.getMaster();</span>
<span class="source-line-no">467</span><span id="line-467"> return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode());</span>
<span class="source-line-no">468</span><span id="line-468"> } catch (/* InvalidProtocolBufferException */IOException e) {</span>
<span class="source-line-no">469</span><span id="line-469"> // A failed parse of the znode is pretty catastrophic. Rather than loop</span>
<span class="source-line-no">470</span><span id="line-470"> // retrying hoping the bad bytes will changes, and rather than change</span>
<span class="source-line-no">471</span><span id="line-471"> // the signature on this method to add an IOE which will send ripples all</span>
<span class="source-line-no">472</span><span id="line-472"> // over the code base, throw a RuntimeException. This should "never" happen.</span>
<span class="source-line-no">473</span><span id="line-473"> // Fail fast if it does.</span>
<span class="source-line-no">474</span><span id="line-474"> throw new DeserializationException(e);</span>
<span class="source-line-no">475</span><span id="line-475"> }</span>
<span class="source-line-no">476</span><span id="line-476"> }</span>
<span class="source-line-no">477</span><span id="line-477"> // The str returned could be old style -- pre hbase-1502 -- which was</span>
<span class="source-line-no">478</span><span id="line-478"> // hostname and port seperated by a colon rather than hostname, port and</span>
<span class="source-line-no">479</span><span id="line-479"> // startcode delimited by a ','.</span>
<span class="source-line-no">480</span><span id="line-480"> String str = Bytes.toString(data);</span>
<span class="source-line-no">481</span><span id="line-481"> int index = str.indexOf(ServerName.SERVERNAME_SEPARATOR);</span>
<span class="source-line-no">482</span><span id="line-482"> if (index != -1) {</span>
<span class="source-line-no">483</span><span id="line-483"> // Presume its ServerName serialized with versioned bytes.</span>
<span class="source-line-no">484</span><span id="line-484"> return ServerName.parseVersionedServerName(data);</span>
<span class="source-line-no">485</span><span id="line-485"> }</span>
<span class="source-line-no">486</span><span id="line-486"> // Presume it a hostname:port format.</span>
<span class="source-line-no">487</span><span id="line-487"> String hostname = Addressing.parseHostname(str);</span>
<span class="source-line-no">488</span><span id="line-488"> int port = Addressing.parsePort(str);</span>
<span class="source-line-no">489</span><span id="line-489"> return ServerName.valueOf(hostname, port, -1L);</span>
<span class="source-line-no">490</span><span id="line-490"> }</span>
<span class="source-line-no">491</span><span id="line-491"></span>
<span class="source-line-no">492</span><span id="line-492"> /**</span>
<span class="source-line-no">493</span><span id="line-493"> * Convert a list of protocol buffer ServerName to a list of ServerName</span>
<span class="source-line-no">494</span><span id="line-494"> * @param proto protocol buffer ServerNameList</span>
<span class="source-line-no">495</span><span id="line-495"> * @return a list of ServerName</span>
<span class="source-line-no">496</span><span id="line-496"> */</span>
<span class="source-line-no">497</span><span id="line-497"> public static List&lt;ServerName&gt; toServerNameList(List&lt;HBaseProtos.ServerName&gt; proto) {</span>
<span class="source-line-no">498</span><span id="line-498"> return proto.stream().map(ProtobufUtil::toServerName).collect(Collectors.toList());</span>
<span class="source-line-no">499</span><span id="line-499"> }</span>
<span class="source-line-no">500</span><span id="line-500"></span>
<span class="source-line-no">501</span><span id="line-501"> /**</span>
<span class="source-line-no">502</span><span id="line-502"> * Get a list of NamespaceDescriptor from ListNamespaceDescriptorsResponse protobuf</span>
<span class="source-line-no">503</span><span id="line-503"> * @param proto the ListNamespaceDescriptorsResponse</span>
<span class="source-line-no">504</span><span id="line-504"> * @return a list of NamespaceDescriptor</span>
<span class="source-line-no">505</span><span id="line-505"> */</span>
<span class="source-line-no">506</span><span id="line-506"> public static List&lt;NamespaceDescriptor&gt;</span>
<span class="source-line-no">507</span><span id="line-507"> toNamespaceDescriptorList(ListNamespaceDescriptorsResponse proto) {</span>
<span class="source-line-no">508</span><span id="line-508"> return proto.getNamespaceDescriptorList().stream().map(ProtobufUtil::toNamespaceDescriptor)</span>
<span class="source-line-no">509</span><span id="line-509"> .collect(Collectors.toList());</span>
<span class="source-line-no">510</span><span id="line-510"> }</span>
<span class="source-line-no">511</span><span id="line-511"></span>
<span class="source-line-no">512</span><span id="line-512"> /**</span>
<span class="source-line-no">513</span><span id="line-513"> * Get a list of TableDescriptor from GetTableDescriptorsResponse protobuf</span>
<span class="source-line-no">514</span><span id="line-514"> * @param proto the GetTableDescriptorsResponse</span>
<span class="source-line-no">515</span><span id="line-515"> * @return a list of TableDescriptor</span>
<span class="source-line-no">516</span><span id="line-516"> */</span>
<span class="source-line-no">517</span><span id="line-517"> public static List&lt;TableDescriptor&gt; toTableDescriptorList(GetTableDescriptorsResponse proto) {</span>
<span class="source-line-no">518</span><span id="line-518"> if (proto == null) {</span>
<span class="source-line-no">519</span><span id="line-519"> return new ArrayList&lt;&gt;();</span>
<span class="source-line-no">520</span><span id="line-520"> }</span>
<span class="source-line-no">521</span><span id="line-521"> return proto.getTableSchemaList().stream().map(ProtobufUtil::toTableDescriptor)</span>
<span class="source-line-no">522</span><span id="line-522"> .collect(Collectors.toList());</span>
<span class="source-line-no">523</span><span id="line-523"> }</span>
<span class="source-line-no">524</span><span id="line-524"></span>
<span class="source-line-no">525</span><span id="line-525"> /**</span>
<span class="source-line-no">526</span><span id="line-526"> * Get a list of TableDescriptor from ListTableDescriptorsByNamespaceResponse protobuf</span>
<span class="source-line-no">527</span><span id="line-527"> * @param proto the ListTableDescriptorsByNamespaceResponse</span>
<span class="source-line-no">528</span><span id="line-528"> * @return a list of TableDescriptor</span>
<span class="source-line-no">529</span><span id="line-529"> */</span>
<span class="source-line-no">530</span><span id="line-530"> public static List&lt;TableDescriptor&gt;</span>
<span class="source-line-no">531</span><span id="line-531"> toTableDescriptorList(ListTableDescriptorsByNamespaceResponse proto) {</span>
<span class="source-line-no">532</span><span id="line-532"> if (proto == null) return new ArrayList&lt;&gt;();</span>
<span class="source-line-no">533</span><span id="line-533"> return proto.getTableSchemaList().stream().map(ProtobufUtil::toTableDescriptor)</span>
<span class="source-line-no">534</span><span id="line-534"> .collect(Collectors.toList());</span>
<span class="source-line-no">535</span><span id="line-535"> }</span>
<span class="source-line-no">536</span><span id="line-536"></span>
<span class="source-line-no">537</span><span id="line-537"> /**</span>
<span class="source-line-no">538</span><span id="line-538"> * Get a list of TableDescriptor from ListTableDescriptorsByNamespaceResponse protobuf</span>
<span class="source-line-no">539</span><span id="line-539"> * @param proto the ListTableDescriptorsByNamespaceResponse</span>
<span class="source-line-no">540</span><span id="line-540"> * @return a list of TableDescriptor</span>
<span class="source-line-no">541</span><span id="line-541"> */</span>
<span class="source-line-no">542</span><span id="line-542"> public static List&lt;TableDescriptor&gt;</span>
<span class="source-line-no">543</span><span id="line-543"> toTableDescriptorList(ListTableDescriptorsByStateResponse proto) {</span>
<span class="source-line-no">544</span><span id="line-544"> if (proto == null) return new ArrayList&lt;&gt;();</span>
<span class="source-line-no">545</span><span id="line-545"> return proto.getTableSchemaList().stream().map(ProtobufUtil::toTableDescriptor)</span>
<span class="source-line-no">546</span><span id="line-546"> .collect(Collectors.toList());</span>
<span class="source-line-no">547</span><span id="line-547"> }</span>
<span class="source-line-no">548</span><span id="line-548"></span>
<span class="source-line-no">549</span><span id="line-549"> /**</span>
<span class="source-line-no">550</span><span id="line-550"> * get the split keys in form "byte [][]" from a CreateTableRequest proto</span>
<span class="source-line-no">551</span><span id="line-551"> * @param proto the CreateTableRequest</span>
<span class="source-line-no">552</span><span id="line-552"> * @return the split keys</span>
<span class="source-line-no">553</span><span id="line-553"> */</span>
<span class="source-line-no">554</span><span id="line-554"> public static byte[][] getSplitKeysArray(final CreateTableRequest proto) {</span>
<span class="source-line-no">555</span><span id="line-555"> byte[][] splitKeys = new byte[proto.getSplitKeysCount()][];</span>
<span class="source-line-no">556</span><span id="line-556"> for (int i = 0; i &lt; proto.getSplitKeysCount(); ++i) {</span>
<span class="source-line-no">557</span><span id="line-557"> splitKeys[i] = proto.getSplitKeys(i).toByteArray();</span>
<span class="source-line-no">558</span><span id="line-558"> }</span>
<span class="source-line-no">559</span><span id="line-559"> return splitKeys;</span>
<span class="source-line-no">560</span><span id="line-560"> }</span>
<span class="source-line-no">561</span><span id="line-561"></span>
<span class="source-line-no">562</span><span id="line-562"> /**</span>
<span class="source-line-no">563</span><span id="line-563"> * Convert a protobuf Durability into a client Durability</span>
<span class="source-line-no">564</span><span id="line-564"> */</span>
<span class="source-line-no">565</span><span id="line-565"> public static Durability toDurability(final ClientProtos.MutationProto.Durability proto) {</span>
<span class="source-line-no">566</span><span id="line-566"> switch (proto) {</span>
<span class="source-line-no">567</span><span id="line-567"> case USE_DEFAULT:</span>
<span class="source-line-no">568</span><span id="line-568"> return Durability.USE_DEFAULT;</span>
<span class="source-line-no">569</span><span id="line-569"> case SKIP_WAL:</span>
<span class="source-line-no">570</span><span id="line-570"> return Durability.SKIP_WAL;</span>
<span class="source-line-no">571</span><span id="line-571"> case ASYNC_WAL:</span>
<span class="source-line-no">572</span><span id="line-572"> return Durability.ASYNC_WAL;</span>
<span class="source-line-no">573</span><span id="line-573"> case SYNC_WAL:</span>
<span class="source-line-no">574</span><span id="line-574"> return Durability.SYNC_WAL;</span>
<span class="source-line-no">575</span><span id="line-575"> case FSYNC_WAL:</span>
<span class="source-line-no">576</span><span id="line-576"> return Durability.FSYNC_WAL;</span>
<span class="source-line-no">577</span><span id="line-577"> default:</span>
<span class="source-line-no">578</span><span id="line-578"> return Durability.USE_DEFAULT;</span>
<span class="source-line-no">579</span><span id="line-579"> }</span>
<span class="source-line-no">580</span><span id="line-580"> }</span>
<span class="source-line-no">581</span><span id="line-581"></span>
<span class="source-line-no">582</span><span id="line-582"> /**</span>
<span class="source-line-no">583</span><span id="line-583"> * Convert a client Durability into a protbuf Durability</span>
<span class="source-line-no">584</span><span id="line-584"> */</span>
<span class="source-line-no">585</span><span id="line-585"> public static ClientProtos.MutationProto.Durability toDurability(final Durability d) {</span>
<span class="source-line-no">586</span><span id="line-586"> switch (d) {</span>
<span class="source-line-no">587</span><span id="line-587"> case USE_DEFAULT:</span>
<span class="source-line-no">588</span><span id="line-588"> return ClientProtos.MutationProto.Durability.USE_DEFAULT;</span>
<span class="source-line-no">589</span><span id="line-589"> case SKIP_WAL:</span>
<span class="source-line-no">590</span><span id="line-590"> return ClientProtos.MutationProto.Durability.SKIP_WAL;</span>
<span class="source-line-no">591</span><span id="line-591"> case ASYNC_WAL:</span>
<span class="source-line-no">592</span><span id="line-592"> return ClientProtos.MutationProto.Durability.ASYNC_WAL;</span>
<span class="source-line-no">593</span><span id="line-593"> case SYNC_WAL:</span>
<span class="source-line-no">594</span><span id="line-594"> return ClientProtos.MutationProto.Durability.SYNC_WAL;</span>
<span class="source-line-no">595</span><span id="line-595"> case FSYNC_WAL:</span>
<span class="source-line-no">596</span><span id="line-596"> return ClientProtos.MutationProto.Durability.FSYNC_WAL;</span>
<span class="source-line-no">597</span><span id="line-597"> default:</span>
<span class="source-line-no">598</span><span id="line-598"> return ClientProtos.MutationProto.Durability.USE_DEFAULT;</span>
<span class="source-line-no">599</span><span id="line-599"> }</span>
<span class="source-line-no">600</span><span id="line-600"> }</span>
<span class="source-line-no">601</span><span id="line-601"></span>
<span class="source-line-no">602</span><span id="line-602"> /**</span>
<span class="source-line-no">603</span><span id="line-603"> * Convert a protocol buffer Get to a client Get</span>
<span class="source-line-no">604</span><span id="line-604"> * @param proto the protocol buffer Get to convert</span>
<span class="source-line-no">605</span><span id="line-605"> * @return the converted client Get</span>
<span class="source-line-no">606</span><span id="line-606"> */</span>
<span class="source-line-no">607</span><span id="line-607"> public static Get toGet(final ClientProtos.Get proto) throws IOException {</span>
<span class="source-line-no">608</span><span id="line-608"> if (proto == null) return null;</span>
<span class="source-line-no">609</span><span id="line-609"> byte[] row = proto.getRow().toByteArray();</span>
<span class="source-line-no">610</span><span id="line-610"> Get get = new Get(row);</span>
<span class="source-line-no">611</span><span id="line-611"> if (proto.hasCacheBlocks()) {</span>
<span class="source-line-no">612</span><span id="line-612"> get.setCacheBlocks(proto.getCacheBlocks());</span>
<span class="source-line-no">613</span><span id="line-613"> }</span>
<span class="source-line-no">614</span><span id="line-614"> if (proto.hasMaxVersions()) {</span>
<span class="source-line-no">615</span><span id="line-615"> get.readVersions(proto.getMaxVersions());</span>
<span class="source-line-no">616</span><span id="line-616"> }</span>
<span class="source-line-no">617</span><span id="line-617"> if (proto.hasStoreLimit()) {</span>
<span class="source-line-no">618</span><span id="line-618"> get.setMaxResultsPerColumnFamily(proto.getStoreLimit());</span>
<span class="source-line-no">619</span><span id="line-619"> }</span>
<span class="source-line-no">620</span><span id="line-620"> if (proto.hasStoreOffset()) {</span>
<span class="source-line-no">621</span><span id="line-621"> get.setRowOffsetPerColumnFamily(proto.getStoreOffset());</span>
<span class="source-line-no">622</span><span id="line-622"> }</span>
<span class="source-line-no">623</span><span id="line-623"> if (proto.getCfTimeRangeCount() &gt; 0) {</span>
<span class="source-line-no">624</span><span id="line-624"> for (HBaseProtos.ColumnFamilyTimeRange cftr : proto.getCfTimeRangeList()) {</span>
<span class="source-line-no">625</span><span id="line-625"> TimeRange timeRange = toTimeRange(cftr.getTimeRange());</span>
<span class="source-line-no">626</span><span id="line-626"> get.setColumnFamilyTimeRange(cftr.getColumnFamily().toByteArray(), timeRange.getMin(),</span>
<span class="source-line-no">627</span><span id="line-627"> timeRange.getMax());</span>
<span class="source-line-no">628</span><span id="line-628"> }</span>
<span class="source-line-no">629</span><span id="line-629"> }</span>
<span class="source-line-no">630</span><span id="line-630"> if (proto.hasTimeRange()) {</span>
<span class="source-line-no">631</span><span id="line-631"> TimeRange timeRange = toTimeRange(proto.getTimeRange());</span>
<span class="source-line-no">632</span><span id="line-632"> get.setTimeRange(timeRange.getMin(), timeRange.getMax());</span>
<span class="source-line-no">633</span><span id="line-633"> }</span>
<span class="source-line-no">634</span><span id="line-634"> if (proto.hasFilter()) {</span>
<span class="source-line-no">635</span><span id="line-635"> FilterProtos.Filter filter = proto.getFilter();</span>
<span class="source-line-no">636</span><span id="line-636"> get.setFilter(ProtobufUtil.toFilter(filter));</span>
<span class="source-line-no">637</span><span id="line-637"> }</span>
<span class="source-line-no">638</span><span id="line-638"> for (NameBytesPair attribute : proto.getAttributeList()) {</span>
<span class="source-line-no">639</span><span id="line-639"> get.setAttribute(attribute.getName(), attribute.getValue().toByteArray());</span>
<span class="source-line-no">640</span><span id="line-640"> }</span>
<span class="source-line-no">641</span><span id="line-641"> if (proto.getColumnCount() &gt; 0) {</span>
<span class="source-line-no">642</span><span id="line-642"> for (Column column : proto.getColumnList()) {</span>
<span class="source-line-no">643</span><span id="line-643"> byte[] family = column.getFamily().toByteArray();</span>
<span class="source-line-no">644</span><span id="line-644"> if (column.getQualifierCount() &gt; 0) {</span>
<span class="source-line-no">645</span><span id="line-645"> for (ByteString qualifier : column.getQualifierList()) {</span>
<span class="source-line-no">646</span><span id="line-646"> get.addColumn(family, qualifier.toByteArray());</span>
<span class="source-line-no">647</span><span id="line-647"> }</span>
<span class="source-line-no">648</span><span id="line-648"> } else {</span>
<span class="source-line-no">649</span><span id="line-649"> get.addFamily(family);</span>
<span class="source-line-no">650</span><span id="line-650"> }</span>
<span class="source-line-no">651</span><span id="line-651"> }</span>
<span class="source-line-no">652</span><span id="line-652"> }</span>
<span class="source-line-no">653</span><span id="line-653"> if (proto.hasExistenceOnly() &amp;&amp; proto.getExistenceOnly()) {</span>
<span class="source-line-no">654</span><span id="line-654"> get.setCheckExistenceOnly(true);</span>
<span class="source-line-no">655</span><span id="line-655"> }</span>
<span class="source-line-no">656</span><span id="line-656"> if (proto.hasConsistency()) {</span>
<span class="source-line-no">657</span><span id="line-657"> get.setConsistency(toConsistency(proto.getConsistency()));</span>
<span class="source-line-no">658</span><span id="line-658"> }</span>
<span class="source-line-no">659</span><span id="line-659"> if (proto.hasLoadColumnFamiliesOnDemand()) {</span>
<span class="source-line-no">660</span><span id="line-660"> get.setLoadColumnFamiliesOnDemand(proto.getLoadColumnFamiliesOnDemand());</span>
<span class="source-line-no">661</span><span id="line-661"> }</span>
<span class="source-line-no">662</span><span id="line-662"> return get;</span>
<span class="source-line-no">663</span><span id="line-663"> }</span>
<span class="source-line-no">664</span><span id="line-664"></span>
<span class="source-line-no">665</span><span id="line-665"> public static Consistency toConsistency(ClientProtos.Consistency consistency) {</span>
<span class="source-line-no">666</span><span id="line-666"> switch (consistency) {</span>
<span class="source-line-no">667</span><span id="line-667"> case STRONG:</span>
<span class="source-line-no">668</span><span id="line-668"> return Consistency.STRONG;</span>
<span class="source-line-no">669</span><span id="line-669"> case TIMELINE:</span>
<span class="source-line-no">670</span><span id="line-670"> return Consistency.TIMELINE;</span>
<span class="source-line-no">671</span><span id="line-671"> default:</span>
<span class="source-line-no">672</span><span id="line-672"> return Consistency.STRONG;</span>
<span class="source-line-no">673</span><span id="line-673"> }</span>
<span class="source-line-no">674</span><span id="line-674"> }</span>
<span class="source-line-no">675</span><span id="line-675"></span>
<span class="source-line-no">676</span><span id="line-676"> public static ClientProtos.Consistency toConsistency(Consistency consistency) {</span>
<span class="source-line-no">677</span><span id="line-677"> switch (consistency) {</span>
<span class="source-line-no">678</span><span id="line-678"> case STRONG:</span>
<span class="source-line-no">679</span><span id="line-679"> return ClientProtos.Consistency.STRONG;</span>
<span class="source-line-no">680</span><span id="line-680"> case TIMELINE:</span>
<span class="source-line-no">681</span><span id="line-681"> return ClientProtos.Consistency.TIMELINE;</span>
<span class="source-line-no">682</span><span id="line-682"> default:</span>
<span class="source-line-no">683</span><span id="line-683"> return ClientProtos.Consistency.STRONG;</span>
<span class="source-line-no">684</span><span id="line-684"> }</span>
<span class="source-line-no">685</span><span id="line-685"> }</span>
<span class="source-line-no">686</span><span id="line-686"></span>
<span class="source-line-no">687</span><span id="line-687"> /**</span>
<span class="source-line-no">688</span><span id="line-688"> * Convert a protocol buffer Mutate to a Put.</span>
<span class="source-line-no">689</span><span id="line-689"> * @param proto The protocol buffer MutationProto to convert</span>
<span class="source-line-no">690</span><span id="line-690"> * @return A client Put.</span>
<span class="source-line-no">691</span><span id="line-691"> */</span>
<span class="source-line-no">692</span><span id="line-692"> public static Put toPut(final MutationProto proto) throws IOException {</span>
<span class="source-line-no">693</span><span id="line-693"> return toPut(proto, null);</span>
<span class="source-line-no">694</span><span id="line-694"> }</span>
<span class="source-line-no">695</span><span id="line-695"></span>
<span class="source-line-no">696</span><span id="line-696"> /**</span>
<span class="source-line-no">697</span><span id="line-697"> * Convert a protocol buffer Mutate to a Put.</span>
<span class="source-line-no">698</span><span id="line-698"> * @param proto The protocol buffer MutationProto to convert</span>
<span class="source-line-no">699</span><span id="line-699"> * @param cellScanner If non-null, the Cell data that goes with this proto.</span>
<span class="source-line-no">700</span><span id="line-700"> * @return A client Put.</span>
<span class="source-line-no">701</span><span id="line-701"> */</span>
<span class="source-line-no">702</span><span id="line-702"> public static Put toPut(final MutationProto proto, final CellScanner cellScanner)</span>
<span class="source-line-no">703</span><span id="line-703"> throws IOException {</span>
<span class="source-line-no">704</span><span id="line-704"> // TODO: Server-side at least why do we convert back to the Client types? Why not just pb it?</span>
<span class="source-line-no">705</span><span id="line-705"> MutationType type = proto.getMutateType();</span>
<span class="source-line-no">706</span><span id="line-706"> assert type == MutationType.PUT : type.name();</span>
<span class="source-line-no">707</span><span id="line-707"> long timestamp = proto.hasTimestamp() ? proto.getTimestamp() : HConstants.LATEST_TIMESTAMP;</span>
<span class="source-line-no">708</span><span id="line-708"> Put put = proto.hasRow() ? new Put(proto.getRow().toByteArray(), timestamp) : null;</span>
<span class="source-line-no">709</span><span id="line-709"> int cellCount = proto.hasAssociatedCellCount() ? proto.getAssociatedCellCount() : 0;</span>
<span class="source-line-no">710</span><span id="line-710"> if (cellCount &gt; 0) {</span>
<span class="source-line-no">711</span><span id="line-711"> // The proto has metadata only and the data is separate to be found in the cellScanner.</span>
<span class="source-line-no">712</span><span id="line-712"> if (cellScanner == null) {</span>
<span class="source-line-no">713</span><span id="line-713"> throw new DoNotRetryIOException(</span>
<span class="source-line-no">714</span><span id="line-714"> "Cell count of " + cellCount + " but no cellScanner: " + toShortString(proto));</span>
<span class="source-line-no">715</span><span id="line-715"> }</span>
<span class="source-line-no">716</span><span id="line-716"> for (int i = 0; i &lt; cellCount; i++) {</span>
<span class="source-line-no">717</span><span id="line-717"> if (!cellScanner.advance()) {</span>
<span class="source-line-no">718</span><span id="line-718"> throw new DoNotRetryIOException("Cell count of " + cellCount + " but at index " + i</span>
<span class="source-line-no">719</span><span id="line-719"> + " no cell returned: " + toShortString(proto));</span>
<span class="source-line-no">720</span><span id="line-720"> }</span>
<span class="source-line-no">721</span><span id="line-721"> Cell cell = cellScanner.current();</span>
<span class="source-line-no">722</span><span id="line-722"> if (put == null) {</span>
<span class="source-line-no">723</span><span id="line-723"> put = new Put(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), timestamp);</span>
<span class="source-line-no">724</span><span id="line-724"> }</span>
<span class="source-line-no">725</span><span id="line-725"> put.add(cell);</span>
<span class="source-line-no">726</span><span id="line-726"> }</span>
<span class="source-line-no">727</span><span id="line-727"> } else {</span>
<span class="source-line-no">728</span><span id="line-728"> if (put == null) {</span>
<span class="source-line-no">729</span><span id="line-729"> throw new IllegalArgumentException("row cannot be null");</span>
<span class="source-line-no">730</span><span id="line-730"> }</span>
<span class="source-line-no">731</span><span id="line-731"> // The proto has the metadata and the data itself</span>
<span class="source-line-no">732</span><span id="line-732"> ExtendedCellBuilder cellBuilder =</span>
<span class="source-line-no">733</span><span id="line-733"> ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);</span>
<span class="source-line-no">734</span><span id="line-734"> for (ColumnValue column : proto.getColumnValueList()) {</span>
<span class="source-line-no">735</span><span id="line-735"> byte[] family = column.getFamily().toByteArray();</span>
<span class="source-line-no">736</span><span id="line-736"> for (QualifierValue qv : column.getQualifierValueList()) {</span>
<span class="source-line-no">737</span><span id="line-737"> if (!qv.hasValue()) {</span>
<span class="source-line-no">738</span><span id="line-738"> throw new DoNotRetryIOException("Missing required field: qualifier value");</span>
<span class="source-line-no">739</span><span id="line-739"> }</span>
<span class="source-line-no">740</span><span id="line-740"> long ts = timestamp;</span>
<span class="source-line-no">741</span><span id="line-741"> if (qv.hasTimestamp()) {</span>
<span class="source-line-no">742</span><span id="line-742"> ts = qv.getTimestamp();</span>
<span class="source-line-no">743</span><span id="line-743"> }</span>
<span class="source-line-no">744</span><span id="line-744"> byte[] allTagsBytes;</span>
<span class="source-line-no">745</span><span id="line-745"> if (qv.hasTags()) {</span>
<span class="source-line-no">746</span><span id="line-746"> allTagsBytes = qv.getTags().toByteArray();</span>
<span class="source-line-no">747</span><span id="line-747"> if (qv.hasDeleteType()) {</span>
<span class="source-line-no">748</span><span id="line-748"> put.add(cellBuilder.clear().setRow(proto.getRow().toByteArray()).setFamily(family)</span>
<span class="source-line-no">749</span><span id="line-749"> .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)</span>
<span class="source-line-no">750</span><span id="line-750"> .setTimestamp(ts).setType(fromDeleteType(qv.getDeleteType()).getCode())</span>
<span class="source-line-no">751</span><span id="line-751"> .setTags(allTagsBytes).build());</span>
<span class="source-line-no">752</span><span id="line-752"> } else {</span>
<span class="source-line-no">753</span><span id="line-753"> put.add(cellBuilder.clear().setRow(put.getRow()).setFamily(family)</span>
<span class="source-line-no">754</span><span id="line-754"> .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)</span>
<span class="source-line-no">755</span><span id="line-755"> .setTimestamp(ts).setType(Cell.Type.Put)</span>
<span class="source-line-no">756</span><span id="line-756"> .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null).setTags(allTagsBytes)</span>
<span class="source-line-no">757</span><span id="line-757"> .build());</span>
<span class="source-line-no">758</span><span id="line-758"> }</span>
<span class="source-line-no">759</span><span id="line-759"> } else {</span>
<span class="source-line-no">760</span><span id="line-760"> if (qv.hasDeleteType()) {</span>
<span class="source-line-no">761</span><span id="line-761"> put.add(cellBuilder.clear().setRow(put.getRow()).setFamily(family)</span>
<span class="source-line-no">762</span><span id="line-762"> .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)</span>
<span class="source-line-no">763</span><span id="line-763"> .setTimestamp(ts).setType(fromDeleteType(qv.getDeleteType()).getCode()).build());</span>
<span class="source-line-no">764</span><span id="line-764"> } else {</span>
<span class="source-line-no">765</span><span id="line-765"> put.add(cellBuilder.clear().setRow(put.getRow()).setFamily(family)</span>
<span class="source-line-no">766</span><span id="line-766"> .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)</span>
<span class="source-line-no">767</span><span id="line-767"> .setTimestamp(ts).setType(Cell.Type.Put)</span>
<span class="source-line-no">768</span><span id="line-768"> .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null).build());</span>
<span class="source-line-no">769</span><span id="line-769"> }</span>
<span class="source-line-no">770</span><span id="line-770"> }</span>
<span class="source-line-no">771</span><span id="line-771"> }</span>
<span class="source-line-no">772</span><span id="line-772"> }</span>
<span class="source-line-no">773</span><span id="line-773"> }</span>
<span class="source-line-no">774</span><span id="line-774"> put.setDurability(toDurability(proto.getDurability()));</span>
<span class="source-line-no">775</span><span id="line-775"> for (NameBytesPair attribute : proto.getAttributeList()) {</span>
<span class="source-line-no">776</span><span id="line-776"> put.setAttribute(attribute.getName(), attribute.getValue().toByteArray());</span>
<span class="source-line-no">777</span><span id="line-777"> }</span>
<span class="source-line-no">778</span><span id="line-778"> return put;</span>
<span class="source-line-no">779</span><span id="line-779"> }</span>
<span class="source-line-no">780</span><span id="line-780"></span>
<span class="source-line-no">781</span><span id="line-781"> /**</span>
<span class="source-line-no">782</span><span id="line-782"> * Convert a protocol buffer Mutate to a Delete</span>
<span class="source-line-no">783</span><span id="line-783"> * @param proto the protocol buffer Mutate to convert</span>
<span class="source-line-no">784</span><span id="line-784"> * @return the converted client Delete</span>
<span class="source-line-no">785</span><span id="line-785"> */</span>
<span class="source-line-no">786</span><span id="line-786"> public static Delete toDelete(final MutationProto proto) throws IOException {</span>
<span class="source-line-no">787</span><span id="line-787"> return toDelete(proto, null);</span>
<span class="source-line-no">788</span><span id="line-788"> }</span>
<span class="source-line-no">789</span><span id="line-789"></span>
<span class="source-line-no">790</span><span id="line-790"> /**</span>
<span class="source-line-no">791</span><span id="line-791"> * Convert a protocol buffer Mutate to a Delete</span>
<span class="source-line-no">792</span><span id="line-792"> * @param proto the protocol buffer Mutate to convert</span>
<span class="source-line-no">793</span><span id="line-793"> * @param cellScanner if non-null, the data that goes with this delete.</span>
<span class="source-line-no">794</span><span id="line-794"> * @return the converted client Delete</span>
<span class="source-line-no">795</span><span id="line-795"> */</span>
<span class="source-line-no">796</span><span id="line-796"> public static Delete toDelete(final MutationProto proto, final CellScanner cellScanner)</span>
<span class="source-line-no">797</span><span id="line-797"> throws IOException {</span>
<span class="source-line-no">798</span><span id="line-798"> MutationType type = proto.getMutateType();</span>
<span class="source-line-no">799</span><span id="line-799"> assert type == MutationType.DELETE : type.name();</span>
<span class="source-line-no">800</span><span id="line-800"> long timestamp = proto.hasTimestamp() ? proto.getTimestamp() : HConstants.LATEST_TIMESTAMP;</span>
<span class="source-line-no">801</span><span id="line-801"> Delete delete = proto.hasRow() ? new Delete(proto.getRow().toByteArray(), timestamp) : null;</span>
<span class="source-line-no">802</span><span id="line-802"> int cellCount = proto.hasAssociatedCellCount() ? proto.getAssociatedCellCount() : 0;</span>
<span class="source-line-no">803</span><span id="line-803"> if (cellCount &gt; 0) {</span>
<span class="source-line-no">804</span><span id="line-804"> // The proto has metadata only and the data is separate to be found in the cellScanner.</span>
<span class="source-line-no">805</span><span id="line-805"> if (cellScanner == null) {</span>
<span class="source-line-no">806</span><span id="line-806"> // TextFormat should be fine for a Delete since it carries no data, just coordinates.</span>
<span class="source-line-no">807</span><span id="line-807"> throw new DoNotRetryIOException("Cell count of " + cellCount + " but no cellScanner: "</span>
<span class="source-line-no">808</span><span id="line-808"> + TextFormat.shortDebugString(proto));</span>
<span class="source-line-no">809</span><span id="line-809"> }</span>
<span class="source-line-no">810</span><span id="line-810"> for (int i = 0; i &lt; cellCount; i++) {</span>
<span class="source-line-no">811</span><span id="line-811"> if (!cellScanner.advance()) {</span>
<span class="source-line-no">812</span><span id="line-812"> // TextFormat should be fine for a Delete since it carries no data, just coordinates.</span>
<span class="source-line-no">813</span><span id="line-813"> throw new DoNotRetryIOException("Cell count of " + cellCount + " but at index " + i</span>
<span class="source-line-no">814</span><span id="line-814"> + " no cell returned: " + TextFormat.shortDebugString(proto));</span>
<span class="source-line-no">815</span><span id="line-815"> }</span>
<span class="source-line-no">816</span><span id="line-816"> Cell cell = cellScanner.current();</span>
<span class="source-line-no">817</span><span id="line-817"> if (delete == null) {</span>
<span class="source-line-no">818</span><span id="line-818"> delete =</span>
<span class="source-line-no">819</span><span id="line-819"> new Delete(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), timestamp);</span>
<span class="source-line-no">820</span><span id="line-820"> }</span>
<span class="source-line-no">821</span><span id="line-821"> delete.add(cell);</span>
<span class="source-line-no">822</span><span id="line-822"> }</span>
<span class="source-line-no">823</span><span id="line-823"> } else {</span>
<span class="source-line-no">824</span><span id="line-824"> if (delete == null) {</span>
<span class="source-line-no">825</span><span id="line-825"> throw new IllegalArgumentException("row cannot be null");</span>
<span class="source-line-no">826</span><span id="line-826"> }</span>
<span class="source-line-no">827</span><span id="line-827"> for (ColumnValue column : proto.getColumnValueList()) {</span>
<span class="source-line-no">828</span><span id="line-828"> byte[] family = column.getFamily().toByteArray();</span>
<span class="source-line-no">829</span><span id="line-829"> for (QualifierValue qv : column.getQualifierValueList()) {</span>
<span class="source-line-no">830</span><span id="line-830"> DeleteType deleteType = qv.getDeleteType();</span>
<span class="source-line-no">831</span><span id="line-831"> byte[] qualifier = null;</span>
<span class="source-line-no">832</span><span id="line-832"> if (qv.hasQualifier()) {</span>
<span class="source-line-no">833</span><span id="line-833"> qualifier = qv.getQualifier().toByteArray();</span>
<span class="source-line-no">834</span><span id="line-834"> }</span>
<span class="source-line-no">835</span><span id="line-835"> long ts = cellTimestampOrLatest(qv);</span>
<span class="source-line-no">836</span><span id="line-836"> if (deleteType == DeleteType.DELETE_ONE_VERSION) {</span>
<span class="source-line-no">837</span><span id="line-837"> delete.addColumn(family, qualifier, ts);</span>
<span class="source-line-no">838</span><span id="line-838"> } else if (deleteType == DeleteType.DELETE_MULTIPLE_VERSIONS) {</span>
<span class="source-line-no">839</span><span id="line-839"> delete.addColumns(family, qualifier, ts);</span>
<span class="source-line-no">840</span><span id="line-840"> } else if (deleteType == DeleteType.DELETE_FAMILY_VERSION) {</span>
<span class="source-line-no">841</span><span id="line-841"> delete.addFamilyVersion(family, ts);</span>
<span class="source-line-no">842</span><span id="line-842"> } else {</span>
<span class="source-line-no">843</span><span id="line-843"> delete.addFamily(family, ts);</span>
<span class="source-line-no">844</span><span id="line-844"> }</span>
<span class="source-line-no">845</span><span id="line-845"> }</span>
<span class="source-line-no">846</span><span id="line-846"> }</span>
<span class="source-line-no">847</span><span id="line-847"> }</span>
<span class="source-line-no">848</span><span id="line-848"> delete.setDurability(toDurability(proto.getDurability()));</span>
<span class="source-line-no">849</span><span id="line-849"> for (NameBytesPair attribute : proto.getAttributeList()) {</span>
<span class="source-line-no">850</span><span id="line-850"> delete.setAttribute(attribute.getName(), attribute.getValue().toByteArray());</span>
<span class="source-line-no">851</span><span id="line-851"> }</span>
<span class="source-line-no">852</span><span id="line-852"> return delete;</span>
<span class="source-line-no">853</span><span id="line-853"> }</span>
<span class="source-line-no">854</span><span id="line-854"></span>
<span class="source-line-no">855</span><span id="line-855"> @FunctionalInterface</span>
<span class="source-line-no">856</span><span id="line-856"> private interface ConsumerWithException&lt;T, U&gt; {</span>
<span class="source-line-no">857</span><span id="line-857"> void accept(T t, U u) throws IOException;</span>
<span class="source-line-no">858</span><span id="line-858"> }</span>
<span class="source-line-no">859</span><span id="line-859"></span>
<span class="source-line-no">860</span><span id="line-860"> private static &lt;T extends Mutation&gt; T toDelta(Function&lt;Bytes, T&gt; supplier,</span>
<span class="source-line-no">861</span><span id="line-861"> ConsumerWithException&lt;T, Cell&gt; consumer, final MutationProto proto,</span>
<span class="source-line-no">862</span><span id="line-862"> final CellScanner cellScanner) throws IOException {</span>
<span class="source-line-no">863</span><span id="line-863"> byte[] row = proto.hasRow() ? proto.getRow().toByteArray() : null;</span>
<span class="source-line-no">864</span><span id="line-864"> T mutation = row == null ? null : supplier.apply(new Bytes(row));</span>
<span class="source-line-no">865</span><span id="line-865"> int cellCount = proto.hasAssociatedCellCount() ? proto.getAssociatedCellCount() : 0;</span>
<span class="source-line-no">866</span><span id="line-866"> if (cellCount &gt; 0) {</span>
<span class="source-line-no">867</span><span id="line-867"> // The proto has metadata only and the data is separate to be found in the cellScanner.</span>
<span class="source-line-no">868</span><span id="line-868"> if (cellScanner == null) {</span>
<span class="source-line-no">869</span><span id="line-869"> throw new DoNotRetryIOException(</span>
<span class="source-line-no">870</span><span id="line-870"> "Cell count of " + cellCount + " but no cellScanner: " + toShortString(proto));</span>
<span class="source-line-no">871</span><span id="line-871"> }</span>
<span class="source-line-no">872</span><span id="line-872"> for (int i = 0; i &lt; cellCount; i++) {</span>
<span class="source-line-no">873</span><span id="line-873"> if (!cellScanner.advance()) {</span>
<span class="source-line-no">874</span><span id="line-874"> throw new DoNotRetryIOException("Cell count of " + cellCount + " but at index " + i</span>
<span class="source-line-no">875</span><span id="line-875"> + " no cell returned: " + toShortString(proto));</span>
<span class="source-line-no">876</span><span id="line-876"> }</span>
<span class="source-line-no">877</span><span id="line-877"> Cell cell = cellScanner.current();</span>
<span class="source-line-no">878</span><span id="line-878"> if (mutation == null) {</span>
<span class="source-line-no">879</span><span id="line-879"> mutation =</span>
<span class="source-line-no">880</span><span id="line-880"> supplier.apply(new Bytes(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));</span>
<span class="source-line-no">881</span><span id="line-881"> }</span>
<span class="source-line-no">882</span><span id="line-882"> consumer.accept(mutation, cell);</span>
<span class="source-line-no">883</span><span id="line-883"> }</span>
<span class="source-line-no">884</span><span id="line-884"> } else {</span>
<span class="source-line-no">885</span><span id="line-885"> if (mutation == null) {</span>
<span class="source-line-no">886</span><span id="line-886"> throw new IllegalArgumentException("row cannot be null");</span>
<span class="source-line-no">887</span><span id="line-887"> }</span>
<span class="source-line-no">888</span><span id="line-888"> for (ColumnValue column : proto.getColumnValueList()) {</span>
<span class="source-line-no">889</span><span id="line-889"> byte[] family = column.getFamily().toByteArray();</span>
<span class="source-line-no">890</span><span id="line-890"> for (QualifierValue qv : column.getQualifierValueList()) {</span>
<span class="source-line-no">891</span><span id="line-891"> byte[] qualifier = qv.getQualifier().toByteArray();</span>
<span class="source-line-no">892</span><span id="line-892"> if (!qv.hasValue()) {</span>
<span class="source-line-no">893</span><span id="line-893"> throw new DoNotRetryIOException("Missing required field: qualifier value");</span>
<span class="source-line-no">894</span><span id="line-894"> }</span>
<span class="source-line-no">895</span><span id="line-895"> byte[] value = qv.getValue().toByteArray();</span>
<span class="source-line-no">896</span><span id="line-896"> byte[] tags = null;</span>
<span class="source-line-no">897</span><span id="line-897"> if (qv.hasTags()) {</span>
<span class="source-line-no">898</span><span id="line-898"> tags = qv.getTags().toByteArray();</span>
<span class="source-line-no">899</span><span id="line-899"> }</span>
<span class="source-line-no">900</span><span id="line-900"> consumer.accept(mutation,</span>
<span class="source-line-no">901</span><span id="line-901"> ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)</span>
<span class="source-line-no">902</span><span id="line-902"> .setRow(mutation.getRow()).setFamily(family).setQualifier(qualifier)</span>
<span class="source-line-no">903</span><span id="line-903"> .setTimestamp(cellTimestampOrLatest(qv)).setType(KeyValue.Type.Put.getCode())</span>
<span class="source-line-no">904</span><span id="line-904"> .setValue(value).setTags(tags).build());</span>
<span class="source-line-no">905</span><span id="line-905"> }</span>
<span class="source-line-no">906</span><span id="line-906"> }</span>
<span class="source-line-no">907</span><span id="line-907"> }</span>
<span class="source-line-no">908</span><span id="line-908"> mutation.setDurability(toDurability(proto.getDurability()));</span>
<span class="source-line-no">909</span><span id="line-909"> for (NameBytesPair attribute : proto.getAttributeList()) {</span>
<span class="source-line-no">910</span><span id="line-910"> mutation.setAttribute(attribute.getName(), attribute.getValue().toByteArray());</span>
<span class="source-line-no">911</span><span id="line-911"> }</span>
<span class="source-line-no">912</span><span id="line-912"> return mutation;</span>
<span class="source-line-no">913</span><span id="line-913"> }</span>
<span class="source-line-no">914</span><span id="line-914"></span>
<span class="source-line-no">915</span><span id="line-915"> private static long cellTimestampOrLatest(QualifierValue cell) {</span>
<span class="source-line-no">916</span><span id="line-916"> if (cell.hasTimestamp()) {</span>
<span class="source-line-no">917</span><span id="line-917"> return cell.getTimestamp();</span>
<span class="source-line-no">918</span><span id="line-918"> } else {</span>
<span class="source-line-no">919</span><span id="line-919"> return HConstants.LATEST_TIMESTAMP;</span>
<span class="source-line-no">920</span><span id="line-920"> }</span>
<span class="source-line-no">921</span><span id="line-921"> }</span>
<span class="source-line-no">922</span><span id="line-922"></span>
<span class="source-line-no">923</span><span id="line-923"> /**</span>
<span class="source-line-no">924</span><span id="line-924"> * Convert a protocol buffer Mutate to an Append</span>
<span class="source-line-no">925</span><span id="line-925"> * @param proto the protocol buffer Mutate to convert</span>
<span class="source-line-no">926</span><span id="line-926"> * @return the converted client Append</span>
<span class="source-line-no">927</span><span id="line-927"> */</span>
<span class="source-line-no">928</span><span id="line-928"> public static Append toAppend(final MutationProto proto, final CellScanner cellScanner)</span>
<span class="source-line-no">929</span><span id="line-929"> throws IOException {</span>
<span class="source-line-no">930</span><span id="line-930"> MutationType type = proto.getMutateType();</span>
<span class="source-line-no">931</span><span id="line-931"> assert type == MutationType.APPEND : type.name();</span>
<span class="source-line-no">932</span><span id="line-932"> Append append = toDelta((Bytes row) -&gt; new Append(row.get(), row.getOffset(), row.getLength()),</span>
<span class="source-line-no">933</span><span id="line-933"> Append::add, proto, cellScanner);</span>
<span class="source-line-no">934</span><span id="line-934"> if (proto.hasTimeRange()) {</span>
<span class="source-line-no">935</span><span id="line-935"> TimeRange timeRange = toTimeRange(proto.getTimeRange());</span>
<span class="source-line-no">936</span><span id="line-936"> append.setTimeRange(timeRange.getMin(), timeRange.getMax());</span>
<span class="source-line-no">937</span><span id="line-937"> }</span>
<span class="source-line-no">938</span><span id="line-938"> return append;</span>
<span class="source-line-no">939</span><span id="line-939"> }</span>
<span class="source-line-no">940</span><span id="line-940"></span>
<span class="source-line-no">941</span><span id="line-941"> /**</span>
<span class="source-line-no">942</span><span id="line-942"> * Convert a protocol buffer Mutate to an Increment</span>
<span class="source-line-no">943</span><span id="line-943"> * @param proto the protocol buffer Mutate to convert</span>
<span class="source-line-no">944</span><span id="line-944"> * @return the converted client Increment</span>
<span class="source-line-no">945</span><span id="line-945"> */</span>
<span class="source-line-no">946</span><span id="line-946"> public static Increment toIncrement(final MutationProto proto, final CellScanner cellScanner)</span>
<span class="source-line-no">947</span><span id="line-947"> throws IOException {</span>
<span class="source-line-no">948</span><span id="line-948"> MutationType type = proto.getMutateType();</span>
<span class="source-line-no">949</span><span id="line-949"> assert type == MutationType.INCREMENT : type.name();</span>
<span class="source-line-no">950</span><span id="line-950"> Increment increment =</span>
<span class="source-line-no">951</span><span id="line-951"> toDelta((Bytes row) -&gt; new Increment(row.get(), row.getOffset(), row.getLength()),</span>
<span class="source-line-no">952</span><span id="line-952"> Increment::add, proto, cellScanner);</span>
<span class="source-line-no">953</span><span id="line-953"> if (proto.hasTimeRange()) {</span>
<span class="source-line-no">954</span><span id="line-954"> TimeRange timeRange = toTimeRange(proto.getTimeRange());</span>
<span class="source-line-no">955</span><span id="line-955"> increment.setTimeRange(timeRange.getMin(), timeRange.getMax());</span>
<span class="source-line-no">956</span><span id="line-956"> }</span>
<span class="source-line-no">957</span><span id="line-957"> return increment;</span>
<span class="source-line-no">958</span><span id="line-958"> }</span>
<span class="source-line-no">959</span><span id="line-959"></span>
<span class="source-line-no">960</span><span id="line-960"> /**</span>
<span class="source-line-no">961</span><span id="line-961"> * Convert a MutateRequest to Mutation</span>
<span class="source-line-no">962</span><span id="line-962"> * @param proto the protocol buffer Mutate to convert</span>
<span class="source-line-no">963</span><span id="line-963"> * @return the converted Mutation</span>
<span class="source-line-no">964</span><span id="line-964"> */</span>
<span class="source-line-no">965</span><span id="line-965"> public static Mutation toMutation(final MutationProto proto) throws IOException {</span>
<span class="source-line-no">966</span><span id="line-966"> MutationType type = proto.getMutateType();</span>
<span class="source-line-no">967</span><span id="line-967"> if (type == MutationType.INCREMENT) {</span>
<span class="source-line-no">968</span><span id="line-968"> return toIncrement(proto, null);</span>
<span class="source-line-no">969</span><span id="line-969"> }</span>
<span class="source-line-no">970</span><span id="line-970"> if (type == MutationType.APPEND) {</span>
<span class="source-line-no">971</span><span id="line-971"> return toAppend(proto, null);</span>
<span class="source-line-no">972</span><span id="line-972"> }</span>
<span class="source-line-no">973</span><span id="line-973"> if (type == MutationType.DELETE) {</span>
<span class="source-line-no">974</span><span id="line-974"> return toDelete(proto, null);</span>
<span class="source-line-no">975</span><span id="line-975"> }</span>
<span class="source-line-no">976</span><span id="line-976"> if (type == MutationType.PUT) {</span>
<span class="source-line-no">977</span><span id="line-977"> return toPut(proto, null);</span>
<span class="source-line-no">978</span><span id="line-978"> }</span>
<span class="source-line-no">979</span><span id="line-979"> throw new IOException("Unknown mutation type " + type);</span>
<span class="source-line-no">980</span><span id="line-980"> }</span>
<span class="source-line-no">981</span><span id="line-981"></span>
<span class="source-line-no">982</span><span id="line-982"> public static ClientProtos.Scan.ReadType toReadType(Scan.ReadType readType) {</span>
<span class="source-line-no">983</span><span id="line-983"> switch (readType) {</span>
<span class="source-line-no">984</span><span id="line-984"> case DEFAULT:</span>
<span class="source-line-no">985</span><span id="line-985"> return ClientProtos.Scan.ReadType.DEFAULT;</span>
<span class="source-line-no">986</span><span id="line-986"> case STREAM:</span>
<span class="source-line-no">987</span><span id="line-987"> return ClientProtos.Scan.ReadType.STREAM;</span>
<span class="source-line-no">988</span><span id="line-988"> case PREAD:</span>
<span class="source-line-no">989</span><span id="line-989"> return ClientProtos.Scan.ReadType.PREAD;</span>
<span class="source-line-no">990</span><span id="line-990"> default:</span>
<span class="source-line-no">991</span><span id="line-991"> throw new IllegalArgumentException("Unknown ReadType: " + readType);</span>
<span class="source-line-no">992</span><span id="line-992"> }</span>
<span class="source-line-no">993</span><span id="line-993"> }</span>
<span class="source-line-no">994</span><span id="line-994"></span>
<span class="source-line-no">995</span><span id="line-995"> public static Scan.ReadType toReadType(ClientProtos.Scan.ReadType readType) {</span>
<span class="source-line-no">996</span><span id="line-996"> switch (readType) {</span>
<span class="source-line-no">997</span><span id="line-997"> case DEFAULT:</span>
<span class="source-line-no">998</span><span id="line-998"> return Scan.ReadType.DEFAULT;</span>
<span class="source-line-no">999</span><span id="line-999"> case STREAM:</span>
<span class="source-line-no">1000</span><span id="line-1000"> return Scan.ReadType.STREAM;</span>
<span class="source-line-no">1001</span><span id="line-1001"> case PREAD:</span>
<span class="source-line-no">1002</span><span id="line-1002"> return Scan.ReadType.PREAD;</span>
<span class="source-line-no">1003</span><span id="line-1003"> default:</span>
<span class="source-line-no">1004</span><span id="line-1004"> throw new IllegalArgumentException("Unknown ReadType: " + readType);</span>
<span class="source-line-no">1005</span><span id="line-1005"> }</span>
<span class="source-line-no">1006</span><span id="line-1006"> }</span>
<span class="source-line-no">1007</span><span id="line-1007"></span>
<span class="source-line-no">1008</span><span id="line-1008"> /**</span>
<span class="source-line-no">1009</span><span id="line-1009"> * Convert a client Scan to a protocol buffer Scan</span>
<span class="source-line-no">1010</span><span id="line-1010"> * @param scan the client Scan to convert</span>
<span class="source-line-no">1011</span><span id="line-1011"> * @return the converted protocol buffer Scan</span>
<span class="source-line-no">1012</span><span id="line-1012"> */</span>
<span class="source-line-no">1013</span><span id="line-1013"> public static ClientProtos.Scan toScan(final Scan scan) throws IOException {</span>
<span class="source-line-no">1014</span><span id="line-1014"> ClientProtos.Scan.Builder scanBuilder = ClientProtos.Scan.newBuilder();</span>
<span class="source-line-no">1015</span><span id="line-1015"> scanBuilder.setCacheBlocks(scan.getCacheBlocks());</span>
<span class="source-line-no">1016</span><span id="line-1016"> if (scan.getBatch() &gt; 0) {</span>
<span class="source-line-no">1017</span><span id="line-1017"> scanBuilder.setBatchSize(scan.getBatch());</span>
<span class="source-line-no">1018</span><span id="line-1018"> }</span>
<span class="source-line-no">1019</span><span id="line-1019"> if (scan.getMaxResultSize() &gt; 0) {</span>
<span class="source-line-no">1020</span><span id="line-1020"> scanBuilder.setMaxResultSize(scan.getMaxResultSize());</span>
<span class="source-line-no">1021</span><span id="line-1021"> }</span>
<span class="source-line-no">1022</span><span id="line-1022"> if (scan.getAllowPartialResults()) {</span>
<span class="source-line-no">1023</span><span id="line-1023"> scanBuilder.setAllowPartialResults(scan.getAllowPartialResults());</span>
<span class="source-line-no">1024</span><span id="line-1024"> }</span>
<span class="source-line-no">1025</span><span id="line-1025"> Boolean loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();</span>
<span class="source-line-no">1026</span><span id="line-1026"> if (loadColumnFamiliesOnDemand != null) {</span>
<span class="source-line-no">1027</span><span id="line-1027"> scanBuilder.setLoadColumnFamiliesOnDemand(loadColumnFamiliesOnDemand);</span>
<span class="source-line-no">1028</span><span id="line-1028"> }</span>
<span class="source-line-no">1029</span><span id="line-1029"> scanBuilder.setMaxVersions(scan.getMaxVersions());</span>
<span class="source-line-no">1030</span><span id="line-1030"> scan.getColumnFamilyTimeRange().forEach((cf, timeRange) -&gt; {</span>
<span class="source-line-no">1031</span><span id="line-1031"> scanBuilder.addCfTimeRange(HBaseProtos.ColumnFamilyTimeRange.newBuilder()</span>
<span class="source-line-no">1032</span><span id="line-1032"> .setColumnFamily(UnsafeByteOperations.unsafeWrap(cf)).setTimeRange(toTimeRange(timeRange))</span>
<span class="source-line-no">1033</span><span id="line-1033"> .build());</span>
<span class="source-line-no">1034</span><span id="line-1034"> });</span>
<span class="source-line-no">1035</span><span id="line-1035"> scanBuilder.setTimeRange(ProtobufUtil.toTimeRange(scan.getTimeRange()));</span>
<span class="source-line-no">1036</span><span id="line-1036"> Map&lt;String, byte[]&gt; attributes = scan.getAttributesMap();</span>
<span class="source-line-no">1037</span><span id="line-1037"> if (!attributes.isEmpty()) {</span>
<span class="source-line-no">1038</span><span id="line-1038"> NameBytesPair.Builder attributeBuilder = NameBytesPair.newBuilder();</span>
<span class="source-line-no">1039</span><span id="line-1039"> for (Map.Entry&lt;String, byte[]&gt; attribute : attributes.entrySet()) {</span>
<span class="source-line-no">1040</span><span id="line-1040"> attributeBuilder.setName(attribute.getKey());</span>
<span class="source-line-no">1041</span><span id="line-1041"> attributeBuilder.setValue(UnsafeByteOperations.unsafeWrap(attribute.getValue()));</span>
<span class="source-line-no">1042</span><span id="line-1042"> scanBuilder.addAttribute(attributeBuilder.build());</span>
<span class="source-line-no">1043</span><span id="line-1043"> }</span>
<span class="source-line-no">1044</span><span id="line-1044"> }</span>
<span class="source-line-no">1045</span><span id="line-1045"> byte[] startRow = scan.getStartRow();</span>
<span class="source-line-no">1046</span><span id="line-1046"> if (startRow != null &amp;&amp; startRow.length &gt; 0) {</span>
<span class="source-line-no">1047</span><span id="line-1047"> scanBuilder.setStartRow(UnsafeByteOperations.unsafeWrap(startRow));</span>
<span class="source-line-no">1048</span><span id="line-1048"> }</span>
<span class="source-line-no">1049</span><span id="line-1049"> byte[] stopRow = scan.getStopRow();</span>
<span class="source-line-no">1050</span><span id="line-1050"> if (stopRow != null &amp;&amp; stopRow.length &gt; 0) {</span>
<span class="source-line-no">1051</span><span id="line-1051"> scanBuilder.setStopRow(UnsafeByteOperations.unsafeWrap(stopRow));</span>
<span class="source-line-no">1052</span><span id="line-1052"> }</span>
<span class="source-line-no">1053</span><span id="line-1053"> if (scan.hasFilter()) {</span>
<span class="source-line-no">1054</span><span id="line-1054"> scanBuilder.setFilter(ProtobufUtil.toFilter(scan.getFilter()));</span>
<span class="source-line-no">1055</span><span id="line-1055"> }</span>
<span class="source-line-no">1056</span><span id="line-1056"> if (scan.hasFamilies()) {</span>
<span class="source-line-no">1057</span><span id="line-1057"> Column.Builder columnBuilder = Column.newBuilder();</span>
<span class="source-line-no">1058</span><span id="line-1058"> for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; family : scan.getFamilyMap().entrySet()) {</span>
<span class="source-line-no">1059</span><span id="line-1059"> columnBuilder.setFamily(UnsafeByteOperations.unsafeWrap(family.getKey()));</span>
<span class="source-line-no">1060</span><span id="line-1060"> NavigableSet&lt;byte[]&gt; qualifiers = family.getValue();</span>
<span class="source-line-no">1061</span><span id="line-1061"> columnBuilder.clearQualifier();</span>
<span class="source-line-no">1062</span><span id="line-1062"> if (qualifiers != null &amp;&amp; qualifiers.size() &gt; 0) {</span>
<span class="source-line-no">1063</span><span id="line-1063"> for (byte[] qualifier : qualifiers) {</span>
<span class="source-line-no">1064</span><span id="line-1064"> columnBuilder.addQualifier(UnsafeByteOperations.unsafeWrap(qualifier));</span>
<span class="source-line-no">1065</span><span id="line-1065"> }</span>
<span class="source-line-no">1066</span><span id="line-1066"> }</span>
<span class="source-line-no">1067</span><span id="line-1067"> scanBuilder.addColumn(columnBuilder.build());</span>
<span class="source-line-no">1068</span><span id="line-1068"> }</span>
<span class="source-line-no">1069</span><span id="line-1069"> }</span>
<span class="source-line-no">1070</span><span id="line-1070"> if (scan.getMaxResultsPerColumnFamily() &gt;= 0) {</span>
<span class="source-line-no">1071</span><span id="line-1071"> scanBuilder.setStoreLimit(scan.getMaxResultsPerColumnFamily());</span>
<span class="source-line-no">1072</span><span id="line-1072"> }</span>
<span class="source-line-no">1073</span><span id="line-1073"> if (scan.getRowOffsetPerColumnFamily() &gt; 0) {</span>
<span class="source-line-no">1074</span><span id="line-1074"> scanBuilder.setStoreOffset(scan.getRowOffsetPerColumnFamily());</span>
<span class="source-line-no">1075</span><span id="line-1075"> }</span>
<span class="source-line-no">1076</span><span id="line-1076"> if (scan.isReversed()) {</span>
<span class="source-line-no">1077</span><span id="line-1077"> scanBuilder.setReversed(scan.isReversed());</span>
<span class="source-line-no">1078</span><span id="line-1078"> }</span>
<span class="source-line-no">1079</span><span id="line-1079"> if (scan.getConsistency() == Consistency.TIMELINE) {</span>
<span class="source-line-no">1080</span><span id="line-1080"> scanBuilder.setConsistency(toConsistency(scan.getConsistency()));</span>
<span class="source-line-no">1081</span><span id="line-1081"> }</span>
<span class="source-line-no">1082</span><span id="line-1082"> if (scan.getCaching() &gt; 0) {</span>
<span class="source-line-no">1083</span><span id="line-1083"> scanBuilder.setCaching(scan.getCaching());</span>
<span class="source-line-no">1084</span><span id="line-1084"> }</span>
<span class="source-line-no">1085</span><span id="line-1085"> long mvccReadPoint = PackagePrivateFieldAccessor.getMvccReadPoint(scan);</span>
<span class="source-line-no">1086</span><span id="line-1086"> if (mvccReadPoint &gt; 0) {</span>
<span class="source-line-no">1087</span><span id="line-1087"> scanBuilder.setMvccReadPoint(mvccReadPoint);</span>
<span class="source-line-no">1088</span><span id="line-1088"> }</span>
<span class="source-line-no">1089</span><span id="line-1089"> if (!scan.includeStartRow()) {</span>
<span class="source-line-no">1090</span><span id="line-1090"> scanBuilder.setIncludeStartRow(false);</span>
<span class="source-line-no">1091</span><span id="line-1091"> }</span>
<span class="source-line-no">1092</span><span id="line-1092"> scanBuilder.setIncludeStopRow(scan.includeStopRow());</span>
<span class="source-line-no">1093</span><span id="line-1093"> if (scan.getReadType() != Scan.ReadType.DEFAULT) {</span>
<span class="source-line-no">1094</span><span id="line-1094"> scanBuilder.setReadType(toReadType(scan.getReadType()));</span>
<span class="source-line-no">1095</span><span id="line-1095"> }</span>
<span class="source-line-no">1096</span><span id="line-1096"> if (scan.isNeedCursorResult()) {</span>
<span class="source-line-no">1097</span><span id="line-1097"> scanBuilder.setNeedCursorResult(true);</span>
<span class="source-line-no">1098</span><span id="line-1098"> }</span>
<span class="source-line-no">1099</span><span id="line-1099"> return scanBuilder.build();</span>
<span class="source-line-no">1100</span><span id="line-1100"> }</span>
<span class="source-line-no">1101</span><span id="line-1101"></span>
<span class="source-line-no">1102</span><span id="line-1102"> /**</span>
<span class="source-line-no">1103</span><span id="line-1103"> * Convert a protocol buffer Scan to a client Scan</span>
<span class="source-line-no">1104</span><span id="line-1104"> * @param proto the protocol buffer Scan to convert</span>
<span class="source-line-no">1105</span><span id="line-1105"> * @return the converted client Scan</span>
<span class="source-line-no">1106</span><span id="line-1106"> */</span>
<span class="source-line-no">1107</span><span id="line-1107"> public static Scan toScan(final ClientProtos.Scan proto) throws IOException {</span>
<span class="source-line-no">1108</span><span id="line-1108"> byte[] startRow = HConstants.EMPTY_START_ROW;</span>
<span class="source-line-no">1109</span><span id="line-1109"> byte[] stopRow = HConstants.EMPTY_END_ROW;</span>
<span class="source-line-no">1110</span><span id="line-1110"> boolean includeStartRow = true;</span>
<span class="source-line-no">1111</span><span id="line-1111"> boolean includeStopRow = false;</span>
<span class="source-line-no">1112</span><span id="line-1112"> if (proto.hasStartRow()) {</span>
<span class="source-line-no">1113</span><span id="line-1113"> startRow = proto.getStartRow().toByteArray();</span>
<span class="source-line-no">1114</span><span id="line-1114"> }</span>
<span class="source-line-no">1115</span><span id="line-1115"> if (proto.hasStopRow()) {</span>
<span class="source-line-no">1116</span><span id="line-1116"> stopRow = proto.getStopRow().toByteArray();</span>
<span class="source-line-no">1117</span><span id="line-1117"> }</span>
<span class="source-line-no">1118</span><span id="line-1118"> if (proto.hasIncludeStartRow()) {</span>
<span class="source-line-no">1119</span><span id="line-1119"> includeStartRow = proto.getIncludeStartRow();</span>
<span class="source-line-no">1120</span><span id="line-1120"> }</span>
<span class="source-line-no">1121</span><span id="line-1121"> if (proto.hasIncludeStopRow()) {</span>
<span class="source-line-no">1122</span><span id="line-1122"> includeStopRow = proto.getIncludeStopRow();</span>
<span class="source-line-no">1123</span><span id="line-1123"> } else {</span>
<span class="source-line-no">1124</span><span id="line-1124"> // old client without this flag, we should consider start=end as a get.</span>
<span class="source-line-no">1125</span><span id="line-1125"> if (ClientUtil.areScanStartRowAndStopRowEqual(startRow, stopRow)) {</span>
<span class="source-line-no">1126</span><span id="line-1126"> includeStopRow = true;</span>
<span class="source-line-no">1127</span><span id="line-1127"> }</span>
<span class="source-line-no">1128</span><span id="line-1128"> }</span>
<span class="source-line-no">1129</span><span id="line-1129"> Scan scan =</span>
<span class="source-line-no">1130</span><span id="line-1130"> new Scan().withStartRow(startRow, includeStartRow).withStopRow(stopRow, includeStopRow);</span>
<span class="source-line-no">1131</span><span id="line-1131"> if (proto.hasCacheBlocks()) {</span>
<span class="source-line-no">1132</span><span id="line-1132"> scan.setCacheBlocks(proto.getCacheBlocks());</span>
<span class="source-line-no">1133</span><span id="line-1133"> }</span>
<span class="source-line-no">1134</span><span id="line-1134"> if (proto.hasMaxVersions()) {</span>
<span class="source-line-no">1135</span><span id="line-1135"> scan.readVersions(proto.getMaxVersions());</span>
<span class="source-line-no">1136</span><span id="line-1136"> }</span>
<span class="source-line-no">1137</span><span id="line-1137"> if (proto.hasStoreLimit()) {</span>
<span class="source-line-no">1138</span><span id="line-1138"> scan.setMaxResultsPerColumnFamily(proto.getStoreLimit());</span>
<span class="source-line-no">1139</span><span id="line-1139"> }</span>
<span class="source-line-no">1140</span><span id="line-1140"> if (proto.hasStoreOffset()) {</span>
<span class="source-line-no">1141</span><span id="line-1141"> scan.setRowOffsetPerColumnFamily(proto.getStoreOffset());</span>
<span class="source-line-no">1142</span><span id="line-1142"> }</span>
<span class="source-line-no">1143</span><span id="line-1143"> if (proto.hasLoadColumnFamiliesOnDemand()) {</span>
<span class="source-line-no">1144</span><span id="line-1144"> scan.setLoadColumnFamiliesOnDemand(proto.getLoadColumnFamiliesOnDemand());</span>
<span class="source-line-no">1145</span><span id="line-1145"> }</span>
<span class="source-line-no">1146</span><span id="line-1146"> if (proto.getCfTimeRangeCount() &gt; 0) {</span>
<span class="source-line-no">1147</span><span id="line-1147"> for (HBaseProtos.ColumnFamilyTimeRange cftr : proto.getCfTimeRangeList()) {</span>
<span class="source-line-no">1148</span><span id="line-1148"> TimeRange timeRange = toTimeRange(cftr.getTimeRange());</span>
<span class="source-line-no">1149</span><span id="line-1149"> scan.setColumnFamilyTimeRange(cftr.getColumnFamily().toByteArray(), timeRange.getMin(),</span>
<span class="source-line-no">1150</span><span id="line-1150"> timeRange.getMax());</span>
<span class="source-line-no">1151</span><span id="line-1151"> }</span>
<span class="source-line-no">1152</span><span id="line-1152"> }</span>
<span class="source-line-no">1153</span><span id="line-1153"> if (proto.hasTimeRange()) {</span>
<span class="source-line-no">1154</span><span id="line-1154"> TimeRange timeRange = toTimeRange(proto.getTimeRange());</span>
<span class="source-line-no">1155</span><span id="line-1155"> scan.setTimeRange(timeRange.getMin(), timeRange.getMax());</span>
<span class="source-line-no">1156</span><span id="line-1156"> }</span>
<span class="source-line-no">1157</span><span id="line-1157"> if (proto.hasFilter()) {</span>
<span class="source-line-no">1158</span><span id="line-1158"> FilterProtos.Filter filter = proto.getFilter();</span>
<span class="source-line-no">1159</span><span id="line-1159"> scan.setFilter(ProtobufUtil.toFilter(filter));</span>
<span class="source-line-no">1160</span><span id="line-1160"> }</span>
<span class="source-line-no">1161</span><span id="line-1161"> if (proto.hasBatchSize()) {</span>
<span class="source-line-no">1162</span><span id="line-1162"> scan.setBatch(proto.getBatchSize());</span>
<span class="source-line-no">1163</span><span id="line-1163"> }</span>
<span class="source-line-no">1164</span><span id="line-1164"> if (proto.hasMaxResultSize()) {</span>
<span class="source-line-no">1165</span><span id="line-1165"> scan.setMaxResultSize(proto.getMaxResultSize());</span>
<span class="source-line-no">1166</span><span id="line-1166"> }</span>
<span class="source-line-no">1167</span><span id="line-1167"> if (proto.hasAllowPartialResults()) {</span>
<span class="source-line-no">1168</span><span id="line-1168"> scan.setAllowPartialResults(proto.getAllowPartialResults());</span>
<span class="source-line-no">1169</span><span id="line-1169"> }</span>
<span class="source-line-no">1170</span><span id="line-1170"> for (NameBytesPair attribute : proto.getAttributeList()) {</span>
<span class="source-line-no">1171</span><span id="line-1171"> scan.setAttribute(attribute.getName(), attribute.getValue().toByteArray());</span>
<span class="source-line-no">1172</span><span id="line-1172"> }</span>
<span class="source-line-no">1173</span><span id="line-1173"> if (proto.getColumnCount() &gt; 0) {</span>
<span class="source-line-no">1174</span><span id="line-1174"> for (Column column : proto.getColumnList()) {</span>
<span class="source-line-no">1175</span><span id="line-1175"> byte[] family = column.getFamily().toByteArray();</span>
<span class="source-line-no">1176</span><span id="line-1176"> if (column.getQualifierCount() &gt; 0) {</span>
<span class="source-line-no">1177</span><span id="line-1177"> for (ByteString qualifier : column.getQualifierList()) {</span>
<span class="source-line-no">1178</span><span id="line-1178"> scan.addColumn(family, qualifier.toByteArray());</span>
<span class="source-line-no">1179</span><span id="line-1179"> }</span>
<span class="source-line-no">1180</span><span id="line-1180"> } else {</span>
<span class="source-line-no">1181</span><span id="line-1181"> scan.addFamily(family);</span>
<span class="source-line-no">1182</span><span id="line-1182"> }</span>
<span class="source-line-no">1183</span><span id="line-1183"> }</span>
<span class="source-line-no">1184</span><span id="line-1184"> }</span>
<span class="source-line-no">1185</span><span id="line-1185"> if (proto.hasReversed()) {</span>
<span class="source-line-no">1186</span><span id="line-1186"> scan.setReversed(proto.getReversed());</span>
<span class="source-line-no">1187</span><span id="line-1187"> }</span>
<span class="source-line-no">1188</span><span id="line-1188"> if (proto.hasConsistency()) {</span>
<span class="source-line-no">1189</span><span id="line-1189"> scan.setConsistency(toConsistency(proto.getConsistency()));</span>
<span class="source-line-no">1190</span><span id="line-1190"> }</span>
<span class="source-line-no">1191</span><span id="line-1191"> if (proto.hasCaching()) {</span>
<span class="source-line-no">1192</span><span id="line-1192"> scan.setCaching(proto.getCaching());</span>
<span class="source-line-no">1193</span><span id="line-1193"> }</span>
<span class="source-line-no">1194</span><span id="line-1194"> if (proto.hasMvccReadPoint()) {</span>
<span class="source-line-no">1195</span><span id="line-1195"> PackagePrivateFieldAccessor.setMvccReadPoint(scan, proto.getMvccReadPoint());</span>
<span class="source-line-no">1196</span><span id="line-1196"> }</span>
<span class="source-line-no">1197</span><span id="line-1197"> if (proto.hasReadType()) {</span>
<span class="source-line-no">1198</span><span id="line-1198"> scan.setReadType(toReadType(proto.getReadType()));</span>
<span class="source-line-no">1199</span><span id="line-1199"> }</span>
<span class="source-line-no">1200</span><span id="line-1200"> if (proto.getNeedCursorResult()) {</span>
<span class="source-line-no">1201</span><span id="line-1201"> scan.setNeedCursorResult(true);</span>
<span class="source-line-no">1202</span><span id="line-1202"> }</span>
<span class="source-line-no">1203</span><span id="line-1203"> return scan;</span>
<span class="source-line-no">1204</span><span id="line-1204"> }</span>
<span class="source-line-no">1205</span><span id="line-1205"></span>
<span class="source-line-no">1206</span><span id="line-1206"> public static ClientProtos.Cursor toCursor(Cursor cursor) {</span>
<span class="source-line-no">1207</span><span id="line-1207"> ClientProtos.Cursor.Builder builder = ClientProtos.Cursor.newBuilder();</span>
<span class="source-line-no">1208</span><span id="line-1208"> ClientProtos.Cursor.newBuilder().setRow(ByteString.copyFrom(cursor.getRow()));</span>
<span class="source-line-no">1209</span><span id="line-1209"> return builder.build();</span>
<span class="source-line-no">1210</span><span id="line-1210"> }</span>
<span class="source-line-no">1211</span><span id="line-1211"></span>
<span class="source-line-no">1212</span><span id="line-1212"> public static ClientProtos.Cursor toCursor(Cell cell) {</span>
<span class="source-line-no">1213</span><span id="line-1213"> return ClientProtos.Cursor.newBuilder()</span>
<span class="source-line-no">1214</span><span id="line-1214"> .setRow(ByteString.copyFrom(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()))</span>
<span class="source-line-no">1215</span><span id="line-1215"> .build();</span>
<span class="source-line-no">1216</span><span id="line-1216"> }</span>
<span class="source-line-no">1217</span><span id="line-1217"></span>
<span class="source-line-no">1218</span><span id="line-1218"> public static Cursor toCursor(ClientProtos.Cursor cursor) {</span>
<span class="source-line-no">1219</span><span id="line-1219"> return ClientUtil.createCursor(cursor.getRow().toByteArray());</span>
<span class="source-line-no">1220</span><span id="line-1220"> }</span>
<span class="source-line-no">1221</span><span id="line-1221"></span>
<span class="source-line-no">1222</span><span id="line-1222"> /**</span>
<span class="source-line-no">1223</span><span id="line-1223"> * Create a protocol buffer Get based on a client Get.</span>
<span class="source-line-no">1224</span><span id="line-1224"> * @param get the client Get</span>
<span class="source-line-no">1225</span><span id="line-1225"> * @return a protocol buffer Get</span>
<span class="source-line-no">1226</span><span id="line-1226"> */</span>
<span class="source-line-no">1227</span><span id="line-1227"> public static ClientProtos.Get toGet(final Get get) throws IOException {</span>
<span class="source-line-no">1228</span><span id="line-1228"> ClientProtos.Get.Builder builder = ClientProtos.Get.newBuilder();</span>
<span class="source-line-no">1229</span><span id="line-1229"> builder.setRow(UnsafeByteOperations.unsafeWrap(get.getRow()));</span>
<span class="source-line-no">1230</span><span id="line-1230"> builder.setCacheBlocks(get.getCacheBlocks());</span>
<span class="source-line-no">1231</span><span id="line-1231"> builder.setMaxVersions(get.getMaxVersions());</span>
<span class="source-line-no">1232</span><span id="line-1232"> if (get.getFilter() != null) {</span>
<span class="source-line-no">1233</span><span id="line-1233"> builder.setFilter(ProtobufUtil.toFilter(get.getFilter()));</span>
<span class="source-line-no">1234</span><span id="line-1234"> }</span>
<span class="source-line-no">1235</span><span id="line-1235"> get.getColumnFamilyTimeRange().forEach((cf, timeRange) -&gt; {</span>
<span class="source-line-no">1236</span><span id="line-1236"> builder.addCfTimeRange(HBaseProtos.ColumnFamilyTimeRange.newBuilder()</span>
<span class="source-line-no">1237</span><span id="line-1237"> .setColumnFamily(UnsafeByteOperations.unsafeWrap(cf)).setTimeRange(toTimeRange(timeRange))</span>
<span class="source-line-no">1238</span><span id="line-1238"> .build());</span>
<span class="source-line-no">1239</span><span id="line-1239"> });</span>
<span class="source-line-no">1240</span><span id="line-1240"> builder.setTimeRange(ProtobufUtil.toTimeRange(get.getTimeRange()));</span>
<span class="source-line-no">1241</span><span id="line-1241"> Map&lt;String, byte[]&gt; attributes = get.getAttributesMap();</span>
<span class="source-line-no">1242</span><span id="line-1242"> if (!attributes.isEmpty()) {</span>
<span class="source-line-no">1243</span><span id="line-1243"> NameBytesPair.Builder attributeBuilder = NameBytesPair.newBuilder();</span>
<span class="source-line-no">1244</span><span id="line-1244"> for (Map.Entry&lt;String, byte[]&gt; attribute : attributes.entrySet()) {</span>
<span class="source-line-no">1245</span><span id="line-1245"> attributeBuilder.setName(attribute.getKey());</span>
<span class="source-line-no">1246</span><span id="line-1246"> attributeBuilder.setValue(UnsafeByteOperations.unsafeWrap(attribute.getValue()));</span>
<span class="source-line-no">1247</span><span id="line-1247"> builder.addAttribute(attributeBuilder.build());</span>
<span class="source-line-no">1248</span><span id="line-1248"> }</span>
<span class="source-line-no">1249</span><span id="line-1249"> }</span>
<span class="source-line-no">1250</span><span id="line-1250"> if (get.hasFamilies()) {</span>
<span class="source-line-no">1251</span><span id="line-1251"> Column.Builder columnBuilder = Column.newBuilder();</span>
<span class="source-line-no">1252</span><span id="line-1252"> Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; families = get.getFamilyMap();</span>
<span class="source-line-no">1253</span><span id="line-1253"> for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; family : families.entrySet()) {</span>
<span class="source-line-no">1254</span><span id="line-1254"> NavigableSet&lt;byte[]&gt; qualifiers = family.getValue();</span>
<span class="source-line-no">1255</span><span id="line-1255"> columnBuilder.setFamily(UnsafeByteOperations.unsafeWrap(family.getKey()));</span>
<span class="source-line-no">1256</span><span id="line-1256"> columnBuilder.clearQualifier();</span>
<span class="source-line-no">1257</span><span id="line-1257"> if (qualifiers != null &amp;&amp; qualifiers.size() &gt; 0) {</span>
<span class="source-line-no">1258</span><span id="line-1258"> for (byte[] qualifier : qualifiers) {</span>
<span class="source-line-no">1259</span><span id="line-1259"> columnBuilder.addQualifier(UnsafeByteOperations.unsafeWrap(qualifier));</span>
<span class="source-line-no">1260</span><span id="line-1260"> }</span>
<span class="source-line-no">1261</span><span id="line-1261"> }</span>
<span class="source-line-no">1262</span><span id="line-1262"> builder.addColumn(columnBuilder.build());</span>
<span class="source-line-no">1263</span><span id="line-1263"> }</span>
<span class="source-line-no">1264</span><span id="line-1264"> }</span>
<span class="source-line-no">1265</span><span id="line-1265"> if (get.getMaxResultsPerColumnFamily() &gt;= 0) {</span>
<span class="source-line-no">1266</span><span id="line-1266"> builder.setStoreLimit(get.getMaxResultsPerColumnFamily());</span>
<span class="source-line-no">1267</span><span id="line-1267"> }</span>
<span class="source-line-no">1268</span><span id="line-1268"> if (get.getRowOffsetPerColumnFamily() &gt; 0) {</span>
<span class="source-line-no">1269</span><span id="line-1269"> builder.setStoreOffset(get.getRowOffsetPerColumnFamily());</span>
<span class="source-line-no">1270</span><span id="line-1270"> }</span>
<span class="source-line-no">1271</span><span id="line-1271"> if (get.isCheckExistenceOnly()) {</span>
<span class="source-line-no">1272</span><span id="line-1272"> builder.setExistenceOnly(true);</span>
<span class="source-line-no">1273</span><span id="line-1273"> }</span>
<span class="source-line-no">1274</span><span id="line-1274"> if (get.getConsistency() != null &amp;&amp; get.getConsistency() != Consistency.STRONG) {</span>
<span class="source-line-no">1275</span><span id="line-1275"> builder.setConsistency(toConsistency(get.getConsistency()));</span>
<span class="source-line-no">1276</span><span id="line-1276"> }</span>
<span class="source-line-no">1277</span><span id="line-1277"></span>
<span class="source-line-no">1278</span><span id="line-1278"> Boolean loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();</span>
<span class="source-line-no">1279</span><span id="line-1279"> if (loadColumnFamiliesOnDemand != null) {</span>
<span class="source-line-no">1280</span><span id="line-1280"> builder.setLoadColumnFamiliesOnDemand(loadColumnFamiliesOnDemand);</span>
<span class="source-line-no">1281</span><span id="line-1281"> }</span>
<span class="source-line-no">1282</span><span id="line-1282"> return builder.build();</span>
<span class="source-line-no">1283</span><span id="line-1283"> }</span>
<span class="source-line-no">1284</span><span id="line-1284"></span>
<span class="source-line-no">1285</span><span id="line-1285"> public static MutationProto toMutation(final MutationType type, final Mutation mutation)</span>
<span class="source-line-no">1286</span><span id="line-1286"> throws IOException {</span>
<span class="source-line-no">1287</span><span id="line-1287"> return toMutation(type, mutation, HConstants.NO_NONCE);</span>
<span class="source-line-no">1288</span><span id="line-1288"> }</span>
<span class="source-line-no">1289</span><span id="line-1289"></span>
<span class="source-line-no">1290</span><span id="line-1290"> /**</span>
<span class="source-line-no">1291</span><span id="line-1291"> * Create a protocol buffer Mutate based on a client Mutation</span>
<span class="source-line-no">1292</span><span id="line-1292"> * @return a protobuf'd Mutation</span>
<span class="source-line-no">1293</span><span id="line-1293"> */</span>
<span class="source-line-no">1294</span><span id="line-1294"> public static MutationProto toMutation(final MutationType type, final Mutation mutation,</span>
<span class="source-line-no">1295</span><span id="line-1295"> final long nonce) throws IOException {</span>
<span class="source-line-no">1296</span><span id="line-1296"> return toMutation(type, mutation, MutationProto.newBuilder(), nonce);</span>
<span class="source-line-no">1297</span><span id="line-1297"> }</span>
<span class="source-line-no">1298</span><span id="line-1298"></span>
<span class="source-line-no">1299</span><span id="line-1299"> public static MutationProto toMutation(final MutationType type, final Mutation mutation,</span>
<span class="source-line-no">1300</span><span id="line-1300"> MutationProto.Builder builder) throws IOException {</span>
<span class="source-line-no">1301</span><span id="line-1301"> return toMutation(type, mutation, builder, HConstants.NO_NONCE);</span>
<span class="source-line-no">1302</span><span id="line-1302"> }</span>
<span class="source-line-no">1303</span><span id="line-1303"></span>
<span class="source-line-no">1304</span><span id="line-1304"> public static MutationProto toMutation(final MutationType type, final Mutation mutation,</span>
<span class="source-line-no">1305</span><span id="line-1305"> MutationProto.Builder builder, long nonce) throws IOException {</span>
<span class="source-line-no">1306</span><span id="line-1306"> builder = getMutationBuilderAndSetCommonFields(type, mutation, builder);</span>
<span class="source-line-no">1307</span><span id="line-1307"> if (nonce != HConstants.NO_NONCE) {</span>
<span class="source-line-no">1308</span><span id="line-1308"> builder.setNonce(nonce);</span>
<span class="source-line-no">1309</span><span id="line-1309"> }</span>
<span class="source-line-no">1310</span><span id="line-1310"> if (type == MutationType.INCREMENT) {</span>
<span class="source-line-no">1311</span><span id="line-1311"> builder.setTimeRange(ProtobufUtil.toTimeRange(((Increment) mutation).getTimeRange()));</span>
<span class="source-line-no">1312</span><span id="line-1312"> }</span>
<span class="source-line-no">1313</span><span id="line-1313"> if (type == MutationType.APPEND) {</span>
<span class="source-line-no">1314</span><span id="line-1314"> builder.setTimeRange(ProtobufUtil.toTimeRange(((Append) mutation).getTimeRange()));</span>
<span class="source-line-no">1315</span><span id="line-1315"> }</span>
<span class="source-line-no">1316</span><span id="line-1316"> ColumnValue.Builder columnBuilder = ColumnValue.newBuilder();</span>
<span class="source-line-no">1317</span><span id="line-1317"> QualifierValue.Builder valueBuilder = QualifierValue.newBuilder();</span>
<span class="source-line-no">1318</span><span id="line-1318"> for (Map.Entry&lt;byte[], List&lt;Cell&gt;&gt; family : mutation.getFamilyCellMap().entrySet()) {</span>
<span class="source-line-no">1319</span><span id="line-1319"> columnBuilder.clear();</span>
<span class="source-line-no">1320</span><span id="line-1320"> columnBuilder.setFamily(UnsafeByteOperations.unsafeWrap(family.getKey()));</span>
<span class="source-line-no">1321</span><span id="line-1321"> for (Cell cell : family.getValue()) {</span>
<span class="source-line-no">1322</span><span id="line-1322"> valueBuilder.clear();</span>
<span class="source-line-no">1323</span><span id="line-1323"> valueBuilder.setQualifier(UnsafeByteOperations.unsafeWrap(cell.getQualifierArray(),</span>
<span class="source-line-no">1324</span><span id="line-1324"> cell.getQualifierOffset(), cell.getQualifierLength()));</span>
<span class="source-line-no">1325</span><span id="line-1325"> valueBuilder.setValue(UnsafeByteOperations.unsafeWrap(cell.getValueArray(),</span>
<span class="source-line-no">1326</span><span id="line-1326"> cell.getValueOffset(), cell.getValueLength()));</span>
<span class="source-line-no">1327</span><span id="line-1327"> valueBuilder.setTimestamp(cell.getTimestamp());</span>
<span class="source-line-no">1328</span><span id="line-1328"> if (type == MutationType.DELETE || (type == MutationType.PUT &amp;&amp; CellUtil.isDelete(cell))) {</span>
<span class="source-line-no">1329</span><span id="line-1329"> KeyValue.Type keyValueType = KeyValue.Type.codeToType(cell.getTypeByte());</span>
<span class="source-line-no">1330</span><span id="line-1330"> valueBuilder.setDeleteType(toDeleteType(keyValueType));</span>
<span class="source-line-no">1331</span><span id="line-1331"> }</span>
<span class="source-line-no">1332</span><span id="line-1332"> columnBuilder.addQualifierValue(valueBuilder.build());</span>
<span class="source-line-no">1333</span><span id="line-1333"> }</span>
<span class="source-line-no">1334</span><span id="line-1334"> builder.addColumnValue(columnBuilder.build());</span>
<span class="source-line-no">1335</span><span id="line-1335"> }</span>
<span class="source-line-no">1336</span><span id="line-1336"> return builder.build();</span>
<span class="source-line-no">1337</span><span id="line-1337"> }</span>
<span class="source-line-no">1338</span><span id="line-1338"></span>
<span class="source-line-no">1339</span><span id="line-1339"> /**</span>
<span class="source-line-no">1340</span><span id="line-1340"> * Create a protocol buffer MutationProto based on a client Mutation. Does NOT include data.</span>
<span class="source-line-no">1341</span><span id="line-1341"> * Understanding is that the Cell will be transported other than via protobuf.</span>
<span class="source-line-no">1342</span><span id="line-1342"> * @return a protobuf'd Mutation</span>
<span class="source-line-no">1343</span><span id="line-1343"> */</span>
<span class="source-line-no">1344</span><span id="line-1344"> public static MutationProto toMutationNoData(final MutationType type, final Mutation mutation,</span>
<span class="source-line-no">1345</span><span id="line-1345"> final MutationProto.Builder builder) throws IOException {</span>
<span class="source-line-no">1346</span><span id="line-1346"> return toMutationNoData(type, mutation, builder, HConstants.NO_NONCE);</span>
<span class="source-line-no">1347</span><span id="line-1347"> }</span>
<span class="source-line-no">1348</span><span id="line-1348"></span>
<span class="source-line-no">1349</span><span id="line-1349"> /**</span>
<span class="source-line-no">1350</span><span id="line-1350"> * Create a protocol buffer MutationProto based on a client Mutation. Does NOT include data.</span>
<span class="source-line-no">1351</span><span id="line-1351"> * Understanding is that the Cell will be transported other than via protobuf.</span>
<span class="source-line-no">1352</span><span id="line-1352"> * @return a protobuf'd Mutation</span>
<span class="source-line-no">1353</span><span id="line-1353"> */</span>
<span class="source-line-no">1354</span><span id="line-1354"> public static MutationProto toMutationNoData(final MutationType type, final Mutation mutation)</span>
<span class="source-line-no">1355</span><span id="line-1355"> throws IOException {</span>
<span class="source-line-no">1356</span><span id="line-1356"> MutationProto.Builder builder = MutationProto.newBuilder();</span>
<span class="source-line-no">1357</span><span id="line-1357"> return toMutationNoData(type, mutation, builder);</span>
<span class="source-line-no">1358</span><span id="line-1358"> }</span>
<span class="source-line-no">1359</span><span id="line-1359"></span>
<span class="source-line-no">1360</span><span id="line-1360"> public static MutationProto toMutationNoData(final MutationType type, final Mutation mutation,</span>
<span class="source-line-no">1361</span><span id="line-1361"> final MutationProto.Builder builder, long nonce) throws IOException {</span>
<span class="source-line-no">1362</span><span id="line-1362"> getMutationBuilderAndSetCommonFields(type, mutation, builder);</span>
<span class="source-line-no">1363</span><span id="line-1363"> builder.setAssociatedCellCount(mutation.size());</span>
<span class="source-line-no">1364</span><span id="line-1364"> if (mutation instanceof Increment) {</span>
<span class="source-line-no">1365</span><span id="line-1365"> builder.setTimeRange(ProtobufUtil.toTimeRange(((Increment) mutation).getTimeRange()));</span>
<span class="source-line-no">1366</span><span id="line-1366"> }</span>
<span class="source-line-no">1367</span><span id="line-1367"> if (mutation instanceof Append) {</span>
<span class="source-line-no">1368</span><span id="line-1368"> builder.setTimeRange(ProtobufUtil.toTimeRange(((Append) mutation).getTimeRange()));</span>
<span class="source-line-no">1369</span><span id="line-1369"> }</span>
<span class="source-line-no">1370</span><span id="line-1370"> if (nonce != HConstants.NO_NONCE) {</span>
<span class="source-line-no">1371</span><span id="line-1371"> builder.setNonce(nonce);</span>
<span class="source-line-no">1372</span><span id="line-1372"> }</span>
<span class="source-line-no">1373</span><span id="line-1373"> return builder.build();</span>
<span class="source-line-no">1374</span><span id="line-1374"> }</span>
<span class="source-line-no">1375</span><span id="line-1375"></span>
<span class="source-line-no">1376</span><span id="line-1376"> /**</span>
<span class="source-line-no">1377</span><span id="line-1377"> * Code shared by {@link #toMutation(MutationType, Mutation)} and</span>
<span class="source-line-no">1378</span><span id="line-1378"> * {@link #toMutationNoData(MutationType, Mutation)}</span>
<span class="source-line-no">1379</span><span id="line-1379"> * @return A partly-filled out protobuf'd Mutation.</span>
<span class="source-line-no">1380</span><span id="line-1380"> */</span>
<span class="source-line-no">1381</span><span id="line-1381"> private static MutationProto.Builder getMutationBuilderAndSetCommonFields(final MutationType type,</span>
<span class="source-line-no">1382</span><span id="line-1382"> final Mutation mutation, MutationProto.Builder builder) {</span>
<span class="source-line-no">1383</span><span id="line-1383"> builder.setRow(UnsafeByteOperations.unsafeWrap(mutation.getRow()));</span>
<span class="source-line-no">1384</span><span id="line-1384"> builder.setMutateType(type);</span>
<span class="source-line-no">1385</span><span id="line-1385"> builder.setDurability(toDurability(mutation.getDurability()));</span>
<span class="source-line-no">1386</span><span id="line-1386"> builder.setTimestamp(mutation.getTimestamp());</span>
<span class="source-line-no">1387</span><span id="line-1387"> Map&lt;String, byte[]&gt; attributes = mutation.getAttributesMap();</span>
<span class="source-line-no">1388</span><span id="line-1388"> if (!attributes.isEmpty()) {</span>
<span class="source-line-no">1389</span><span id="line-1389"> NameBytesPair.Builder attributeBuilder = NameBytesPair.newBuilder();</span>
<span class="source-line-no">1390</span><span id="line-1390"> for (Map.Entry&lt;String, byte[]&gt; attribute : attributes.entrySet()) {</span>
<span class="source-line-no">1391</span><span id="line-1391"> attributeBuilder.setName(attribute.getKey());</span>
<span class="source-line-no">1392</span><span id="line-1392"> attributeBuilder.setValue(UnsafeByteOperations.unsafeWrap(attribute.getValue()));</span>
<span class="source-line-no">1393</span><span id="line-1393"> builder.addAttribute(attributeBuilder.build());</span>
<span class="source-line-no">1394</span><span id="line-1394"> }</span>
<span class="source-line-no">1395</span><span id="line-1395"> }</span>
<span class="source-line-no">1396</span><span id="line-1396"> return builder;</span>
<span class="source-line-no">1397</span><span id="line-1397"> }</span>
<span class="source-line-no">1398</span><span id="line-1398"></span>
<span class="source-line-no">1399</span><span id="line-1399"> /**</span>
<span class="source-line-no">1400</span><span id="line-1400"> * Convert a client Result to a protocol buffer Result</span>
<span class="source-line-no">1401</span><span id="line-1401"> * @param result the client Result to convert</span>
<span class="source-line-no">1402</span><span id="line-1402"> * @return the converted protocol buffer Result</span>
<span class="source-line-no">1403</span><span id="line-1403"> */</span>
<span class="source-line-no">1404</span><span id="line-1404"> public static ClientProtos.Result toResult(final Result result) {</span>
<span class="source-line-no">1405</span><span id="line-1405"> return toResult(result, false);</span>
<span class="source-line-no">1406</span><span id="line-1406"> }</span>
<span class="source-line-no">1407</span><span id="line-1407"></span>
<span class="source-line-no">1408</span><span id="line-1408"> /**</span>
<span class="source-line-no">1409</span><span id="line-1409"> * Convert a client Result to a protocol buffer Result</span>
<span class="source-line-no">1410</span><span id="line-1410"> * @param result the client Result to convert</span>
<span class="source-line-no">1411</span><span id="line-1411"> * @param encodeTags whether to includeTags in converted protobuf result or not When @encodeTags</span>
<span class="source-line-no">1412</span><span id="line-1412"> * is set to true, it will return all the tags in the response. These tags may</span>
<span class="source-line-no">1413</span><span id="line-1413"> * contain some sensitive data like acl permissions, etc. Only the tools like</span>
<span class="source-line-no">1414</span><span id="line-1414"> * Export, Import which needs to take backup needs to set it to true so that</span>
<span class="source-line-no">1415</span><span id="line-1415"> * cell tags are persisted in backup. Refer to HBASE-25246 for more context.</span>
<span class="source-line-no">1416</span><span id="line-1416"> * @return the converted protocol buffer Result</span>
<span class="source-line-no">1417</span><span id="line-1417"> */</span>
<span class="source-line-no">1418</span><span id="line-1418"> public static ClientProtos.Result toResult(final Result result, boolean encodeTags) {</span>
<span class="source-line-no">1419</span><span id="line-1419"> if (result.getExists() != null) {</span>
<span class="source-line-no">1420</span><span id="line-1420"> return toResult(result.getExists(), result.isStale());</span>
<span class="source-line-no">1421</span><span id="line-1421"> }</span>
<span class="source-line-no">1422</span><span id="line-1422"></span>
<span class="source-line-no">1423</span><span id="line-1423"> Cell[] cells = result.rawCells();</span>
<span class="source-line-no">1424</span><span id="line-1424"> if (cells == null || cells.length == 0) {</span>
<span class="source-line-no">1425</span><span id="line-1425"> return result.isStale() ? EMPTY_RESULT_PB_STALE : EMPTY_RESULT_PB;</span>
<span class="source-line-no">1426</span><span id="line-1426"> }</span>
<span class="source-line-no">1427</span><span id="line-1427"></span>
<span class="source-line-no">1428</span><span id="line-1428"> ClientProtos.Result.Builder builder = ClientProtos.Result.newBuilder();</span>
<span class="source-line-no">1429</span><span id="line-1429"> for (Cell c : cells) {</span>
<span class="source-line-no">1430</span><span id="line-1430"> builder.addCell(toCell(c, encodeTags));</span>
<span class="source-line-no">1431</span><span id="line-1431"> }</span>
<span class="source-line-no">1432</span><span id="line-1432"></span>
<span class="source-line-no">1433</span><span id="line-1433"> builder.setStale(result.isStale());</span>
<span class="source-line-no">1434</span><span id="line-1434"> builder.setPartial(result.mayHaveMoreCellsInRow());</span>
<span class="source-line-no">1435</span><span id="line-1435"></span>
<span class="source-line-no">1436</span><span id="line-1436"> return builder.build();</span>
<span class="source-line-no">1437</span><span id="line-1437"> }</span>
<span class="source-line-no">1438</span><span id="line-1438"></span>
<span class="source-line-no">1439</span><span id="line-1439"> /**</span>
<span class="source-line-no">1440</span><span id="line-1440"> * Convert a client Result to a protocol buffer Result</span>
<span class="source-line-no">1441</span><span id="line-1441"> * @param existence the client existence to send</span>
<span class="source-line-no">1442</span><span id="line-1442"> * @return the converted protocol buffer Result</span>
<span class="source-line-no">1443</span><span id="line-1443"> */</span>
<span class="source-line-no">1444</span><span id="line-1444"> public static ClientProtos.Result toResult(final boolean existence, boolean stale) {</span>
<span class="source-line-no">1445</span><span id="line-1445"> if (stale) {</span>
<span class="source-line-no">1446</span><span id="line-1446"> return existence ? EMPTY_RESULT_PB_EXISTS_TRUE_STALE : EMPTY_RESULT_PB_EXISTS_FALSE_STALE;</span>
<span class="source-line-no">1447</span><span id="line-1447"> } else {</span>
<span class="source-line-no">1448</span><span id="line-1448"> return existence ? EMPTY_RESULT_PB_EXISTS_TRUE : EMPTY_RESULT_PB_EXISTS_FALSE;</span>
<span class="source-line-no">1449</span><span id="line-1449"> }</span>
<span class="source-line-no">1450</span><span id="line-1450"> }</span>
<span class="source-line-no">1451</span><span id="line-1451"></span>
<span class="source-line-no">1452</span><span id="line-1452"> /**</span>
<span class="source-line-no">1453</span><span id="line-1453"> * Convert a client Result to a protocol buffer Result. The pb Result does not include the Cell</span>
<span class="source-line-no">1454</span><span id="line-1454"> * data. That is for transport otherwise.</span>
<span class="source-line-no">1455</span><span id="line-1455"> * @param result the client Result to convert</span>
<span class="source-line-no">1456</span><span id="line-1456"> * @return the converted protocol buffer Result</span>
<span class="source-line-no">1457</span><span id="line-1457"> */</span>
<span class="source-line-no">1458</span><span id="line-1458"> public static ClientProtos.Result toResultNoData(final Result result) {</span>
<span class="source-line-no">1459</span><span id="line-1459"> if (result.getExists() != null) return toResult(result.getExists(), result.isStale());</span>
<span class="source-line-no">1460</span><span id="line-1460"> int size = result.size();</span>
<span class="source-line-no">1461</span><span id="line-1461"> if (size == 0) return result.isStale() ? EMPTY_RESULT_PB_STALE : EMPTY_RESULT_PB;</span>
<span class="source-line-no">1462</span><span id="line-1462"> ClientProtos.Result.Builder builder = ClientProtos.Result.newBuilder();</span>
<span class="source-line-no">1463</span><span id="line-1463"> builder.setAssociatedCellCount(size);</span>
<span class="source-line-no">1464</span><span id="line-1464"> builder.setStale(result.isStale());</span>
<span class="source-line-no">1465</span><span id="line-1465"> return builder.build();</span>
<span class="source-line-no">1466</span><span id="line-1466"> }</span>
<span class="source-line-no">1467</span><span id="line-1467"></span>
<span class="source-line-no">1468</span><span id="line-1468"> /**</span>
<span class="source-line-no">1469</span><span id="line-1469"> * Convert a protocol buffer Result to a client Result</span>
<span class="source-line-no">1470</span><span id="line-1470"> * @param proto the protocol buffer Result to convert</span>
<span class="source-line-no">1471</span><span id="line-1471"> * @return the converted client Result</span>
<span class="source-line-no">1472</span><span id="line-1472"> */</span>
<span class="source-line-no">1473</span><span id="line-1473"> public static Result toResult(final ClientProtos.Result proto) {</span>
<span class="source-line-no">1474</span><span id="line-1474"> return toResult(proto, false);</span>
<span class="source-line-no">1475</span><span id="line-1475"> }</span>
<span class="source-line-no">1476</span><span id="line-1476"></span>
<span class="source-line-no">1477</span><span id="line-1477"> /**</span>
<span class="source-line-no">1478</span><span id="line-1478"> * Convert a protocol buffer Result to a client Result</span>
<span class="source-line-no">1479</span><span id="line-1479"> * @param proto the protocol buffer Result to convert</span>
<span class="source-line-no">1480</span><span id="line-1480"> * @param decodeTags whether to decode tags into converted client Result When @decodeTags is set</span>
<span class="source-line-no">1481</span><span id="line-1481"> * to true, it will decode all the tags from the response. These tags may</span>
<span class="source-line-no">1482</span><span id="line-1482"> * contain some sensitive data like acl permissions, etc. Only the tools like</span>
<span class="source-line-no">1483</span><span id="line-1483"> * Export, Import which needs to take backup needs to set it to true so that</span>
<span class="source-line-no">1484</span><span id="line-1484"> * cell tags are persisted in backup. Refer to HBASE-25246 for more context.</span>
<span class="source-line-no">1485</span><span id="line-1485"> * @return the converted client Result</span>
<span class="source-line-no">1486</span><span id="line-1486"> */</span>
<span class="source-line-no">1487</span><span id="line-1487"> public static Result toResult(final ClientProtos.Result proto, boolean decodeTags) {</span>
<span class="source-line-no">1488</span><span id="line-1488"> if (proto.hasExists()) {</span>
<span class="source-line-no">1489</span><span id="line-1489"> if (proto.getStale()) {</span>
<span class="source-line-no">1490</span><span id="line-1490"> return proto.getExists() ? EMPTY_RESULT_EXISTS_TRUE_STALE : EMPTY_RESULT_EXISTS_FALSE_STALE;</span>
<span class="source-line-no">1491</span><span id="line-1491"> }</span>
<span class="source-line-no">1492</span><span id="line-1492"> return proto.getExists() ? EMPTY_RESULT_EXISTS_TRUE : EMPTY_RESULT_EXISTS_FALSE;</span>
<span class="source-line-no">1493</span><span id="line-1493"> }</span>
<span class="source-line-no">1494</span><span id="line-1494"></span>
<span class="source-line-no">1495</span><span id="line-1495"> List&lt;CellProtos.Cell&gt; values = proto.getCellList();</span>
<span class="source-line-no">1496</span><span id="line-1496"> if (values.isEmpty()) {</span>
<span class="source-line-no">1497</span><span id="line-1497"> return proto.getStale() ? EMPTY_RESULT_STALE : EMPTY_RESULT;</span>
<span class="source-line-no">1498</span><span id="line-1498"> }</span>
<span class="source-line-no">1499</span><span id="line-1499"></span>
<span class="source-line-no">1500</span><span id="line-1500"> List&lt;Cell&gt; cells = new ArrayList&lt;&gt;(values.size());</span>
<span class="source-line-no">1501</span><span id="line-1501"> ExtendedCellBuilder builder = ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);</span>
<span class="source-line-no">1502</span><span id="line-1502"> for (CellProtos.Cell c : values) {</span>
<span class="source-line-no">1503</span><span id="line-1503"> cells.add(toCell(builder, c, decodeTags));</span>
<span class="source-line-no">1504</span><span id="line-1504"> }</span>
<span class="source-line-no">1505</span><span id="line-1505"> return Result.create(cells, null, proto.getStale(), proto.getPartial());</span>
<span class="source-line-no">1506</span><span id="line-1506"> }</span>
<span class="source-line-no">1507</span><span id="line-1507"></span>
<span class="source-line-no">1508</span><span id="line-1508"> /**</span>
<span class="source-line-no">1509</span><span id="line-1509"> * Convert a protocol buffer Result to a client Result</span>
<span class="source-line-no">1510</span><span id="line-1510"> * @param proto the protocol buffer Result to convert</span>
<span class="source-line-no">1511</span><span id="line-1511"> * @param scanner Optional cell scanner.</span>
<span class="source-line-no">1512</span><span id="line-1512"> * @return the converted client Result</span>
<span class="source-line-no">1513</span><span id="line-1513"> */</span>
<span class="source-line-no">1514</span><span id="line-1514"> public static Result toResult(final ClientProtos.Result proto, final CellScanner scanner)</span>
<span class="source-line-no">1515</span><span id="line-1515"> throws IOException {</span>
<span class="source-line-no">1516</span><span id="line-1516"> List&lt;CellProtos.Cell&gt; values = proto.getCellList();</span>
<span class="source-line-no">1517</span><span id="line-1517"></span>
<span class="source-line-no">1518</span><span id="line-1518"> if (proto.hasExists()) {</span>
<span class="source-line-no">1519</span><span id="line-1519"> if (</span>
<span class="source-line-no">1520</span><span id="line-1520"> (values != null &amp;&amp; !values.isEmpty())</span>
<span class="source-line-no">1521</span><span id="line-1521"> || (proto.hasAssociatedCellCount() &amp;&amp; proto.getAssociatedCellCount() &gt; 0)</span>
<span class="source-line-no">1522</span><span id="line-1522"> ) {</span>
<span class="source-line-no">1523</span><span id="line-1523"> throw new IllegalArgumentException("bad proto: exists with cells is no allowed " + proto);</span>
<span class="source-line-no">1524</span><span id="line-1524"> }</span>
<span class="source-line-no">1525</span><span id="line-1525"> if (proto.getStale()) {</span>
<span class="source-line-no">1526</span><span id="line-1526"> return proto.getExists() ? EMPTY_RESULT_EXISTS_TRUE_STALE : EMPTY_RESULT_EXISTS_FALSE_STALE;</span>
<span class="source-line-no">1527</span><span id="line-1527"> }</span>
<span class="source-line-no">1528</span><span id="line-1528"> return proto.getExists() ? EMPTY_RESULT_EXISTS_TRUE : EMPTY_RESULT_EXISTS_FALSE;</span>
<span class="source-line-no">1529</span><span id="line-1529"> }</span>
<span class="source-line-no">1530</span><span id="line-1530"></span>
<span class="source-line-no">1531</span><span id="line-1531"> // TODO: Unit test that has some Cells in scanner and some in the proto.</span>
<span class="source-line-no">1532</span><span id="line-1532"> List&lt;Cell&gt; cells = null;</span>
<span class="source-line-no">1533</span><span id="line-1533"> if (proto.hasAssociatedCellCount()) {</span>
<span class="source-line-no">1534</span><span id="line-1534"> int count = proto.getAssociatedCellCount();</span>
<span class="source-line-no">1535</span><span id="line-1535"> cells = new ArrayList&lt;&gt;(count + values.size());</span>
<span class="source-line-no">1536</span><span id="line-1536"> for (int i = 0; i &lt; count; i++) {</span>
<span class="source-line-no">1537</span><span id="line-1537"> if (!scanner.advance()) throw new IOException("Failed get " + i + " of " + count);</span>
<span class="source-line-no">1538</span><span id="line-1538"> cells.add(scanner.current());</span>
<span class="source-line-no">1539</span><span id="line-1539"> }</span>
<span class="source-line-no">1540</span><span id="line-1540"> }</span>
<span class="source-line-no">1541</span><span id="line-1541"></span>
<span class="source-line-no">1542</span><span id="line-1542"> if (!values.isEmpty()) {</span>
<span class="source-line-no">1543</span><span id="line-1543"> if (cells == null) cells = new ArrayList&lt;&gt;(values.size());</span>
<span class="source-line-no">1544</span><span id="line-1544"> ExtendedCellBuilder builder = ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);</span>
<span class="source-line-no">1545</span><span id="line-1545"> for (CellProtos.Cell c : values) {</span>
<span class="source-line-no">1546</span><span id="line-1546"> cells.add(toCell(builder, c, false));</span>
<span class="source-line-no">1547</span><span id="line-1547"> }</span>
<span class="source-line-no">1548</span><span id="line-1548"> }</span>
<span class="source-line-no">1549</span><span id="line-1549"></span>
<span class="source-line-no">1550</span><span id="line-1550"> return (cells == null || cells.isEmpty())</span>
<span class="source-line-no">1551</span><span id="line-1551"> ? (proto.getStale() ? EMPTY_RESULT_STALE : EMPTY_RESULT)</span>
<span class="source-line-no">1552</span><span id="line-1552"> : Result.create(cells, null, proto.getStale());</span>
<span class="source-line-no">1553</span><span id="line-1553"> }</span>
<span class="source-line-no">1554</span><span id="line-1554"></span>
<span class="source-line-no">1555</span><span id="line-1555"> /**</span>
<span class="source-line-no">1556</span><span id="line-1556"> * Convert a ByteArrayComparable to a protocol buffer Comparator</span>
<span class="source-line-no">1557</span><span id="line-1557"> * @param comparator the ByteArrayComparable to convert</span>
<span class="source-line-no">1558</span><span id="line-1558"> * @return the converted protocol buffer Comparator</span>
<span class="source-line-no">1559</span><span id="line-1559"> */</span>
<span class="source-line-no">1560</span><span id="line-1560"> public static ComparatorProtos.Comparator toComparator(ByteArrayComparable comparator) {</span>
<span class="source-line-no">1561</span><span id="line-1561"> ComparatorProtos.Comparator.Builder builder = ComparatorProtos.Comparator.newBuilder();</span>
<span class="source-line-no">1562</span><span id="line-1562"> builder.setName(comparator.getClass().getName());</span>
<span class="source-line-no">1563</span><span id="line-1563"> builder.setSerializedComparator(UnsafeByteOperations.unsafeWrap(comparator.toByteArray()));</span>
<span class="source-line-no">1564</span><span id="line-1564"> return builder.build();</span>
<span class="source-line-no">1565</span><span id="line-1565"> }</span>
<span class="source-line-no">1566</span><span id="line-1566"></span>
<span class="source-line-no">1567</span><span id="line-1567"> /**</span>
<span class="source-line-no">1568</span><span id="line-1568"> * Convert a protocol buffer Comparator to a ByteArrayComparable</span>
<span class="source-line-no">1569</span><span id="line-1569"> * @param proto the protocol buffer Comparator to convert</span>
<span class="source-line-no">1570</span><span id="line-1570"> * @return the converted ByteArrayComparable</span>
<span class="source-line-no">1571</span><span id="line-1571"> */</span>
<span class="source-line-no">1572</span><span id="line-1572"> @SuppressWarnings("unchecked")</span>
<span class="source-line-no">1573</span><span id="line-1573"> public static ByteArrayComparable toComparator(ComparatorProtos.Comparator proto)</span>
<span class="source-line-no">1574</span><span id="line-1574"> throws IOException {</span>
<span class="source-line-no">1575</span><span id="line-1575"> String type = proto.getName();</span>
<span class="source-line-no">1576</span><span id="line-1576"> byte[] value = proto.getSerializedComparator().toByteArray();</span>
<span class="source-line-no">1577</span><span id="line-1577"></span>
<span class="source-line-no">1578</span><span id="line-1578"> try {</span>
<span class="source-line-no">1579</span><span id="line-1579"> ByteArrayComparable result = COMPARATORS.getAndCallByName(type, value);</span>
<span class="source-line-no">1580</span><span id="line-1580"> if (result != null) {</span>
<span class="source-line-no">1581</span><span id="line-1581"> return result;</span>
<span class="source-line-no">1582</span><span id="line-1582"> }</span>
<span class="source-line-no">1583</span><span id="line-1583"></span>
<span class="source-line-no">1584</span><span id="line-1584"> if (!ALLOW_FAST_REFLECTION_FALLTHROUGH) {</span>
<span class="source-line-no">1585</span><span id="line-1585"> throw new IllegalStateException("Failed to deserialize comparator " + type</span>
<span class="source-line-no">1586</span><span id="line-1586"> + " because fast reflection returned null and fallthrough is disabled");</span>
<span class="source-line-no">1587</span><span id="line-1587"> }</span>
<span class="source-line-no">1588</span><span id="line-1588"></span>
<span class="source-line-no">1589</span><span id="line-1589"> Class&lt;?&gt; c = Class.forName(type, true, ClassLoaderHolder.CLASS_LOADER);</span>
<span class="source-line-no">1590</span><span id="line-1590"> Method parseFrom = c.getMethod(PARSE_FROM, byte[].class);</span>
<span class="source-line-no">1591</span><span id="line-1591"> if (parseFrom == null) {</span>
<span class="source-line-no">1592</span><span id="line-1592"> throw new IOException("Unable to locate function: " + PARSE_FROM + " in type: " + type);</span>
<span class="source-line-no">1593</span><span id="line-1593"> }</span>
<span class="source-line-no">1594</span><span id="line-1594"> return (ByteArrayComparable) parseFrom.invoke(null, value);</span>
<span class="source-line-no">1595</span><span id="line-1595"> } catch (Exception e) {</span>
<span class="source-line-no">1596</span><span id="line-1596"> throw new IOException(e);</span>
<span class="source-line-no">1597</span><span id="line-1597"> }</span>
<span class="source-line-no">1598</span><span id="line-1598"> }</span>
<span class="source-line-no">1599</span><span id="line-1599"></span>
<span class="source-line-no">1600</span><span id="line-1600"> /**</span>
<span class="source-line-no">1601</span><span id="line-1601"> * Convert a protocol buffer Filter to a client Filter</span>
<span class="source-line-no">1602</span><span id="line-1602"> * @param proto the protocol buffer Filter to convert</span>
<span class="source-line-no">1603</span><span id="line-1603"> * @return the converted Filter</span>
<span class="source-line-no">1604</span><span id="line-1604"> */</span>
<span class="source-line-no">1605</span><span id="line-1605"> @SuppressWarnings("unchecked")</span>
<span class="source-line-no">1606</span><span id="line-1606"> public static Filter toFilter(FilterProtos.Filter proto) throws IOException {</span>
<span class="source-line-no">1607</span><span id="line-1607"> String type = proto.getName();</span>
<span class="source-line-no">1608</span><span id="line-1608"> final byte[] value = proto.getSerializedFilter().toByteArray();</span>
<span class="source-line-no">1609</span><span id="line-1609"></span>
<span class="source-line-no">1610</span><span id="line-1610"> try {</span>
<span class="source-line-no">1611</span><span id="line-1611"> Filter result = FILTERS.getAndCallByName(type, value);</span>
<span class="source-line-no">1612</span><span id="line-1612"> if (result != null) {</span>
<span class="source-line-no">1613</span><span id="line-1613"> return result;</span>
<span class="source-line-no">1614</span><span id="line-1614"> }</span>
<span class="source-line-no">1615</span><span id="line-1615"></span>
<span class="source-line-no">1616</span><span id="line-1616"> if (!ALLOW_FAST_REFLECTION_FALLTHROUGH) {</span>
<span class="source-line-no">1617</span><span id="line-1617"> throw new IllegalStateException("Failed to deserialize comparator " + type</span>
<span class="source-line-no">1618</span><span id="line-1618"> + " because fast reflection returned null and fallthrough is disabled");</span>
<span class="source-line-no">1619</span><span id="line-1619"> }</span>
<span class="source-line-no">1620</span><span id="line-1620"></span>
<span class="source-line-no">1621</span><span id="line-1621"> Class&lt;?&gt; c = Class.forName(type, true, ClassLoaderHolder.CLASS_LOADER);</span>
<span class="source-line-no">1622</span><span id="line-1622"> Method parseFrom = c.getMethod(PARSE_FROM, byte[].class);</span>
<span class="source-line-no">1623</span><span id="line-1623"> if (parseFrom == null) {</span>
<span class="source-line-no">1624</span><span id="line-1624"> throw new IOException("Unable to locate function: " + PARSE_FROM + " in type: " + type);</span>
<span class="source-line-no">1625</span><span id="line-1625"> }</span>
<span class="source-line-no">1626</span><span id="line-1626"> return (Filter) parseFrom.invoke(c, value);</span>
<span class="source-line-no">1627</span><span id="line-1627"> } catch (Exception e) {</span>
<span class="source-line-no">1628</span><span id="line-1628"> // Either we couldn't instantiate the method object, or "parseFrom" failed.</span>
<span class="source-line-no">1629</span><span id="line-1629"> // In either case, let's not retry.</span>
<span class="source-line-no">1630</span><span id="line-1630"> throw new DoNotRetryIOException(e);</span>
<span class="source-line-no">1631</span><span id="line-1631"> }</span>
<span class="source-line-no">1632</span><span id="line-1632"> }</span>
<span class="source-line-no">1633</span><span id="line-1633"></span>
<span class="source-line-no">1634</span><span id="line-1634"> /**</span>
<span class="source-line-no">1635</span><span id="line-1635"> * Convert a client Filter to a protocol buffer Filter</span>
<span class="source-line-no">1636</span><span id="line-1636"> * @param filter the Filter to convert</span>
<span class="source-line-no">1637</span><span id="line-1637"> * @return the converted protocol buffer Filter</span>
<span class="source-line-no">1638</span><span id="line-1638"> */</span>
<span class="source-line-no">1639</span><span id="line-1639"> public static FilterProtos.Filter toFilter(Filter filter) throws IOException {</span>
<span class="source-line-no">1640</span><span id="line-1640"> FilterProtos.Filter.Builder builder = FilterProtos.Filter.newBuilder();</span>
<span class="source-line-no">1641</span><span id="line-1641"> builder.setName(filter.getClass().getName());</span>
<span class="source-line-no">1642</span><span id="line-1642"> builder.setSerializedFilter(UnsafeByteOperations.unsafeWrap(filter.toByteArray()));</span>
<span class="source-line-no">1643</span><span id="line-1643"> return builder.build();</span>
<span class="source-line-no">1644</span><span id="line-1644"> }</span>
<span class="source-line-no">1645</span><span id="line-1645"></span>
<span class="source-line-no">1646</span><span id="line-1646"> /**</span>
<span class="source-line-no">1647</span><span id="line-1647"> * Convert a delete KeyValue type to protocol buffer DeleteType.</span>
<span class="source-line-no">1648</span><span id="line-1648"> * @return protocol buffer DeleteType</span>
<span class="source-line-no">1649</span><span id="line-1649"> */</span>
<span class="source-line-no">1650</span><span id="line-1650"> public static DeleteType toDeleteType(KeyValue.Type type) throws IOException {</span>
<span class="source-line-no">1651</span><span id="line-1651"> switch (type) {</span>
<span class="source-line-no">1652</span><span id="line-1652"> case Delete:</span>
<span class="source-line-no">1653</span><span id="line-1653"> return DeleteType.DELETE_ONE_VERSION;</span>
<span class="source-line-no">1654</span><span id="line-1654"> case DeleteColumn:</span>
<span class="source-line-no">1655</span><span id="line-1655"> return DeleteType.DELETE_MULTIPLE_VERSIONS;</span>
<span class="source-line-no">1656</span><span id="line-1656"> case DeleteFamily:</span>
<span class="source-line-no">1657</span><span id="line-1657"> return DeleteType.DELETE_FAMILY;</span>
<span class="source-line-no">1658</span><span id="line-1658"> case DeleteFamilyVersion:</span>
<span class="source-line-no">1659</span><span id="line-1659"> return DeleteType.DELETE_FAMILY_VERSION;</span>
<span class="source-line-no">1660</span><span id="line-1660"> default:</span>
<span class="source-line-no">1661</span><span id="line-1661"> throw new IOException("Unknown delete type: " + type);</span>
<span class="source-line-no">1662</span><span id="line-1662"> }</span>
<span class="source-line-no">1663</span><span id="line-1663"> }</span>
<span class="source-line-no">1664</span><span id="line-1664"></span>
<span class="source-line-no">1665</span><span id="line-1665"> /**</span>
<span class="source-line-no">1666</span><span id="line-1666"> * Convert a protocol buffer DeleteType to delete KeyValue type.</span>
<span class="source-line-no">1667</span><span id="line-1667"> * @param type The DeleteType</span>
<span class="source-line-no">1668</span><span id="line-1668"> * @return The type.</span>
<span class="source-line-no">1669</span><span id="line-1669"> */</span>
<span class="source-line-no">1670</span><span id="line-1670"> public static KeyValue.Type fromDeleteType(DeleteType type) throws IOException {</span>
<span class="source-line-no">1671</span><span id="line-1671"> switch (type) {</span>
<span class="source-line-no">1672</span><span id="line-1672"> case DELETE_ONE_VERSION:</span>
<span class="source-line-no">1673</span><span id="line-1673"> return KeyValue.Type.Delete;</span>
<span class="source-line-no">1674</span><span id="line-1674"> case DELETE_MULTIPLE_VERSIONS:</span>
<span class="source-line-no">1675</span><span id="line-1675"> return KeyValue.Type.DeleteColumn;</span>
<span class="source-line-no">1676</span><span id="line-1676"> case DELETE_FAMILY:</span>
<span class="source-line-no">1677</span><span id="line-1677"> return KeyValue.Type.DeleteFamily;</span>
<span class="source-line-no">1678</span><span id="line-1678"> case DELETE_FAMILY_VERSION:</span>
<span class="source-line-no">1679</span><span id="line-1679"> return KeyValue.Type.DeleteFamilyVersion;</span>
<span class="source-line-no">1680</span><span id="line-1680"> default:</span>
<span class="source-line-no">1681</span><span id="line-1681"> throw new IOException("Unknown delete type: " + type);</span>
<span class="source-line-no">1682</span><span id="line-1682"> }</span>
<span class="source-line-no">1683</span><span id="line-1683"> }</span>
<span class="source-line-no">1684</span><span id="line-1684"></span>
<span class="source-line-no">1685</span><span id="line-1685"> /**</span>
<span class="source-line-no">1686</span><span id="line-1686"> * Convert a stringified protocol buffer exception Parameter to a Java Exception</span>
<span class="source-line-no">1687</span><span id="line-1687"> * @param parameter the protocol buffer Parameter to convert</span>
<span class="source-line-no">1688</span><span id="line-1688"> * @return the converted Exception</span>
<span class="source-line-no">1689</span><span id="line-1689"> * @throws IOException if failed to deserialize the parameter</span>
<span class="source-line-no">1690</span><span id="line-1690"> */</span>
<span class="source-line-no">1691</span><span id="line-1691"> @SuppressWarnings("unchecked")</span>
<span class="source-line-no">1692</span><span id="line-1692"> public static Throwable toException(final NameBytesPair parameter) throws IOException {</span>
<span class="source-line-no">1693</span><span id="line-1693"> if (parameter == null || !parameter.hasValue()) return null;</span>
<span class="source-line-no">1694</span><span id="line-1694"> String desc = parameter.getValue().toStringUtf8();</span>
<span class="source-line-no">1695</span><span id="line-1695"> String type = parameter.getName();</span>
<span class="source-line-no">1696</span><span id="line-1696"> try {</span>
<span class="source-line-no">1697</span><span id="line-1697"> Class&lt;? extends Throwable&gt; c =</span>
<span class="source-line-no">1698</span><span id="line-1698"> (Class&lt;? extends Throwable&gt;) Class.forName(type, true, ClassLoaderHolder.CLASS_LOADER);</span>
<span class="source-line-no">1699</span><span id="line-1699"> Constructor&lt;? extends Throwable&gt; cn = null;</span>
<span class="source-line-no">1700</span><span id="line-1700"> try {</span>
<span class="source-line-no">1701</span><span id="line-1701"> cn = c.getDeclaredConstructor(String.class);</span>
<span class="source-line-no">1702</span><span id="line-1702"> return cn.newInstance(desc);</span>
<span class="source-line-no">1703</span><span id="line-1703"> } catch (NoSuchMethodException e) {</span>
<span class="source-line-no">1704</span><span id="line-1704"> // Could be a raw RemoteException. See HBASE-8987.</span>
<span class="source-line-no">1705</span><span id="line-1705"> cn = c.getDeclaredConstructor(String.class, String.class);</span>
<span class="source-line-no">1706</span><span id="line-1706"> return cn.newInstance(type, desc);</span>
<span class="source-line-no">1707</span><span id="line-1707"> }</span>
<span class="source-line-no">1708</span><span id="line-1708"> } catch (Exception e) {</span>
<span class="source-line-no">1709</span><span id="line-1709"> throw new IOException(e);</span>
<span class="source-line-no">1710</span><span id="line-1710"> }</span>
<span class="source-line-no">1711</span><span id="line-1711"> }</span>
<span class="source-line-no">1712</span><span id="line-1712"></span>
<span class="source-line-no">1713</span><span id="line-1713"> // Start helpers for Client</span>
<span class="source-line-no">1714</span><span id="line-1714"></span>
<span class="source-line-no">1715</span><span id="line-1715"> @SuppressWarnings("unchecked")</span>
<span class="source-line-no">1716</span><span id="line-1716"> public static &lt;T extends Service&gt; T newServiceStub(Class&lt;T&gt; service, RpcChannel channel)</span>
<span class="source-line-no">1717</span><span id="line-1717"> throws Exception {</span>
<span class="source-line-no">1718</span><span id="line-1718"> return (T) Methods.call(service, null, "newStub", new Class[] { RpcChannel.class },</span>
<span class="source-line-no">1719</span><span id="line-1719"> new Object[] { channel });</span>
<span class="source-line-no">1720</span><span id="line-1720"> }</span>
<span class="source-line-no">1721</span><span id="line-1721"></span>
<span class="source-line-no">1722</span><span id="line-1722"> // End helpers for Client</span>
<span class="source-line-no">1723</span><span id="line-1723"> // Start helpers for Admin</span>
<span class="source-line-no">1724</span><span id="line-1724"></span>
<span class="source-line-no">1725</span><span id="line-1725"> /**</span>
<span class="source-line-no">1726</span><span id="line-1726"> * A helper to retrieve region info given a region name or an encoded region name using admin</span>
<span class="source-line-no">1727</span><span id="line-1727"> * protocol.</span>
<span class="source-line-no">1728</span><span id="line-1728"> * @return the retrieved region info</span>
<span class="source-line-no">1729</span><span id="line-1729"> */</span>
<span class="source-line-no">1730</span><span id="line-1730"> public static org.apache.hadoop.hbase.client.RegionInfo getRegionInfo(</span>
<span class="source-line-no">1731</span><span id="line-1731"> final RpcController controller, final AdminService.BlockingInterface admin,</span>
<span class="source-line-no">1732</span><span id="line-1732"> final byte[] regionName) throws IOException {</span>
<span class="source-line-no">1733</span><span id="line-1733"> try {</span>
<span class="source-line-no">1734</span><span id="line-1734"> GetRegionInfoResponse response =</span>
<span class="source-line-no">1735</span><span id="line-1735"> admin.getRegionInfo(controller, getGetRegionInfoRequest(regionName));</span>
<span class="source-line-no">1736</span><span id="line-1736"> return toRegionInfo(response.getRegionInfo());</span>
<span class="source-line-no">1737</span><span id="line-1737"> } catch (ServiceException se) {</span>
<span class="source-line-no">1738</span><span id="line-1738"> throw getRemoteException(se);</span>
<span class="source-line-no">1739</span><span id="line-1739"> }</span>
<span class="source-line-no">1740</span><span id="line-1740"> }</span>
<span class="source-line-no">1741</span><span id="line-1741"></span>
<span class="source-line-no">1742</span><span id="line-1742"> /** Returns A GetRegionInfoRequest for the passed in regionName. */</span>
<span class="source-line-no">1743</span><span id="line-1743"> public static GetRegionInfoRequest getGetRegionInfoRequest(final byte[] regionName)</span>
<span class="source-line-no">1744</span><span id="line-1744"> throws IOException {</span>
<span class="source-line-no">1745</span><span id="line-1745"> return org.apache.hadoop.hbase.client.RegionInfo.isEncodedRegionName(regionName)</span>
<span class="source-line-no">1746</span><span id="line-1746"> ? GetRegionInfoRequest.newBuilder()</span>
<span class="source-line-no">1747</span><span id="line-1747"> .setRegion(RequestConverter.buildRegionSpecifier(RegionSpecifierType.ENCODED_REGION_NAME,</span>
<span class="source-line-no">1748</span><span id="line-1748"> regionName))</span>
<span class="source-line-no">1749</span><span id="line-1749"> .build()</span>
<span class="source-line-no">1750</span><span id="line-1750"> : RequestConverter.buildGetRegionInfoRequest(regionName);</span>
<span class="source-line-no">1751</span><span id="line-1751"> }</span>
<span class="source-line-no">1752</span><span id="line-1752"></span>
<span class="source-line-no">1753</span><span id="line-1753"> /**</span>
<span class="source-line-no">1754</span><span id="line-1754"> * A helper to close a region given a region name using admin protocol.</span>
<span class="source-line-no">1755</span><span id="line-1755"> */</span>
<span class="source-line-no">1756</span><span id="line-1756"> public static void closeRegion(final RpcController controller,</span>
<span class="source-line-no">1757</span><span id="line-1757"> final AdminService.BlockingInterface admin, final ServerName server, final byte[] regionName)</span>
<span class="source-line-no">1758</span><span id="line-1758"> throws IOException {</span>
<span class="source-line-no">1759</span><span id="line-1759"> CloseRegionRequest closeRegionRequest =</span>
<span class="source-line-no">1760</span><span id="line-1760"> ProtobufUtil.buildCloseRegionRequest(server, regionName);</span>
<span class="source-line-no">1761</span><span id="line-1761"> try {</span>
<span class="source-line-no">1762</span><span id="line-1762"> admin.closeRegion(controller, closeRegionRequest);</span>
<span class="source-line-no">1763</span><span id="line-1763"> } catch (ServiceException se) {</span>
<span class="source-line-no">1764</span><span id="line-1764"> throw getRemoteException(se);</span>
<span class="source-line-no">1765</span><span id="line-1765"> }</span>
<span class="source-line-no">1766</span><span id="line-1766"> }</span>
<span class="source-line-no">1767</span><span id="line-1767"></span>
<span class="source-line-no">1768</span><span id="line-1768"> /**</span>
<span class="source-line-no">1769</span><span id="line-1769"> * A helper to warmup a region given a region name using admin protocol</span>
<span class="source-line-no">1770</span><span id="line-1770"> */</span>
<span class="source-line-no">1771</span><span id="line-1771"> public static void warmupRegion(final RpcController controller,</span>
<span class="source-line-no">1772</span><span id="line-1772"> final AdminService.BlockingInterface admin,</span>
<span class="source-line-no">1773</span><span id="line-1773"> final org.apache.hadoop.hbase.client.RegionInfo regionInfo) throws IOException {</span>
<span class="source-line-no">1774</span><span id="line-1774"></span>
<span class="source-line-no">1775</span><span id="line-1775"> try {</span>
<span class="source-line-no">1776</span><span id="line-1776"> WarmupRegionRequest warmupRegionRequest =</span>
<span class="source-line-no">1777</span><span id="line-1777"> RequestConverter.buildWarmupRegionRequest(regionInfo);</span>
<span class="source-line-no">1778</span><span id="line-1778"></span>
<span class="source-line-no">1779</span><span id="line-1779"> admin.warmupRegion(controller, warmupRegionRequest);</span>
<span class="source-line-no">1780</span><span id="line-1780"> } catch (ServiceException e) {</span>
<span class="source-line-no">1781</span><span id="line-1781"> throw getRemoteException(e);</span>
<span class="source-line-no">1782</span><span id="line-1782"> }</span>
<span class="source-line-no">1783</span><span id="line-1783"> }</span>
<span class="source-line-no">1784</span><span id="line-1784"></span>
<span class="source-line-no">1785</span><span id="line-1785"> /**</span>
<span class="source-line-no">1786</span><span id="line-1786"> * A helper to open a region using admin protocol.</span>
<span class="source-line-no">1787</span><span id="line-1787"> */</span>
<span class="source-line-no">1788</span><span id="line-1788"> public static void openRegion(final RpcController controller,</span>
<span class="source-line-no">1789</span><span id="line-1789"> final AdminService.BlockingInterface admin, ServerName server,</span>
<span class="source-line-no">1790</span><span id="line-1790"> final org.apache.hadoop.hbase.client.RegionInfo region) throws IOException {</span>
<span class="source-line-no">1791</span><span id="line-1791"> OpenRegionRequest request = RequestConverter.buildOpenRegionRequest(server, region, null);</span>
<span class="source-line-no">1792</span><span id="line-1792"> try {</span>
<span class="source-line-no">1793</span><span id="line-1793"> admin.openRegion(controller, request);</span>
<span class="source-line-no">1794</span><span id="line-1794"> } catch (ServiceException se) {</span>
<span class="source-line-no">1795</span><span id="line-1795"> throw ProtobufUtil.getRemoteException(se);</span>
<span class="source-line-no">1796</span><span id="line-1796"> }</span>
<span class="source-line-no">1797</span><span id="line-1797"> }</span>
<span class="source-line-no">1798</span><span id="line-1798"></span>
<span class="source-line-no">1799</span><span id="line-1799"> /**</span>
<span class="source-line-no">1800</span><span id="line-1800"> * A helper to get the all the online regions on a region server using admin protocol.</span>
<span class="source-line-no">1801</span><span id="line-1801"> * @return a list of online region info</span>
<span class="source-line-no">1802</span><span id="line-1802"> */</span>
<span class="source-line-no">1803</span><span id="line-1803"> public static List&lt;org.apache.hadoop.hbase.client.RegionInfo&gt;</span>
<span class="source-line-no">1804</span><span id="line-1804"> getOnlineRegions(final AdminService.BlockingInterface admin) throws IOException {</span>
<span class="source-line-no">1805</span><span id="line-1805"> return getOnlineRegions(null, admin);</span>
<span class="source-line-no">1806</span><span id="line-1806"> }</span>
<span class="source-line-no">1807</span><span id="line-1807"></span>
<span class="source-line-no">1808</span><span id="line-1808"> /**</span>
<span class="source-line-no">1809</span><span id="line-1809"> * A helper to get the all the online regions on a region server using admin protocol.</span>
<span class="source-line-no">1810</span><span id="line-1810"> * @return a list of online region info</span>
<span class="source-line-no">1811</span><span id="line-1811"> */</span>
<span class="source-line-no">1812</span><span id="line-1812"> public static List&lt;org.apache.hadoop.hbase.client.RegionInfo&gt; getOnlineRegions(</span>
<span class="source-line-no">1813</span><span id="line-1813"> final RpcController controller, final AdminService.BlockingInterface admin) throws IOException {</span>
<span class="source-line-no">1814</span><span id="line-1814"> GetOnlineRegionRequest request = RequestConverter.buildGetOnlineRegionRequest();</span>
<span class="source-line-no">1815</span><span id="line-1815"> GetOnlineRegionResponse response = null;</span>
<span class="source-line-no">1816</span><span id="line-1816"> try {</span>
<span class="source-line-no">1817</span><span id="line-1817"> response = admin.getOnlineRegion(controller, request);</span>
<span class="source-line-no">1818</span><span id="line-1818"> } catch (ServiceException se) {</span>
<span class="source-line-no">1819</span><span id="line-1819"> throw getRemoteException(se);</span>
<span class="source-line-no">1820</span><span id="line-1820"> }</span>
<span class="source-line-no">1821</span><span id="line-1821"> return getRegionInfos(response);</span>
<span class="source-line-no">1822</span><span id="line-1822"> }</span>
<span class="source-line-no">1823</span><span id="line-1823"></span>
<span class="source-line-no">1824</span><span id="line-1824"> /**</span>
<span class="source-line-no">1825</span><span id="line-1825"> * Get the list of cached files</span>
<span class="source-line-no">1826</span><span id="line-1826"> */</span>
<span class="source-line-no">1827</span><span id="line-1827"> public static List&lt;String&gt; getCachedFilesList(final RpcController controller,</span>
<span class="source-line-no">1828</span><span id="line-1828"> final AdminService.BlockingInterface admin) throws IOException {</span>
<span class="source-line-no">1829</span><span id="line-1829"> GetCachedFilesListRequest request = GetCachedFilesListRequest.newBuilder().build();</span>
<span class="source-line-no">1830</span><span id="line-1830"> GetCachedFilesListResponse response = null;</span>
<span class="source-line-no">1831</span><span id="line-1831"> try {</span>
<span class="source-line-no">1832</span><span id="line-1832"> response = admin.getCachedFilesList(controller, request);</span>
<span class="source-line-no">1833</span><span id="line-1833"> } catch (ServiceException se) {</span>
<span class="source-line-no">1834</span><span id="line-1834"> throw getRemoteException(se);</span>
<span class="source-line-no">1835</span><span id="line-1835"> }</span>
<span class="source-line-no">1836</span><span id="line-1836"> return new ArrayList&lt;&gt;(response.getCachedFilesList());</span>
<span class="source-line-no">1837</span><span id="line-1837"> }</span>
<span class="source-line-no">1838</span><span id="line-1838"></span>
<span class="source-line-no">1839</span><span id="line-1839"> /**</span>
<span class="source-line-no">1840</span><span id="line-1840"> * Get the list of region info from a GetOnlineRegionResponse</span>
<span class="source-line-no">1841</span><span id="line-1841"> * @param proto the GetOnlineRegionResponse</span>
<span class="source-line-no">1842</span><span id="line-1842"> * @return the list of region info or empty if &lt;code&gt;proto&lt;/code&gt; is null</span>
<span class="source-line-no">1843</span><span id="line-1843"> */</span>
<span class="source-line-no">1844</span><span id="line-1844"> public static List&lt;org.apache.hadoop.hbase.client.RegionInfo&gt;</span>
<span class="source-line-no">1845</span><span id="line-1845"> getRegionInfos(final GetOnlineRegionResponse proto) {</span>
<span class="source-line-no">1846</span><span id="line-1846"> if (proto == null) return Collections.EMPTY_LIST;</span>
<span class="source-line-no">1847</span><span id="line-1847"> List&lt;org.apache.hadoop.hbase.client.RegionInfo&gt; regionInfos =</span>
<span class="source-line-no">1848</span><span id="line-1848"> new ArrayList&lt;&gt;(proto.getRegionInfoList().size());</span>
<span class="source-line-no">1849</span><span id="line-1849"> for (RegionInfo regionInfo : proto.getRegionInfoList()) {</span>
<span class="source-line-no">1850</span><span id="line-1850"> regionInfos.add(toRegionInfo(regionInfo));</span>
<span class="source-line-no">1851</span><span id="line-1851"> }</span>
<span class="source-line-no">1852</span><span id="line-1852"> return regionInfos;</span>
<span class="source-line-no">1853</span><span id="line-1853"> }</span>
<span class="source-line-no">1854</span><span id="line-1854"></span>
<span class="source-line-no">1855</span><span id="line-1855"> /**</span>
<span class="source-line-no">1856</span><span id="line-1856"> * A helper to get the info of a region server using admin protocol.</span>
<span class="source-line-no">1857</span><span id="line-1857"> * @return the server name</span>
<span class="source-line-no">1858</span><span id="line-1858"> */</span>
<span class="source-line-no">1859</span><span id="line-1859"> public static ServerInfo getServerInfo(final RpcController controller,</span>
<span class="source-line-no">1860</span><span id="line-1860"> final AdminService.BlockingInterface admin) throws IOException {</span>
<span class="source-line-no">1861</span><span id="line-1861"> GetServerInfoRequest request = RequestConverter.buildGetServerInfoRequest();</span>
<span class="source-line-no">1862</span><span id="line-1862"> try {</span>
<span class="source-line-no">1863</span><span id="line-1863"> GetServerInfoResponse response = admin.getServerInfo(controller, request);</span>
<span class="source-line-no">1864</span><span id="line-1864"> return response.getServerInfo();</span>
<span class="source-line-no">1865</span><span id="line-1865"> } catch (ServiceException se) {</span>
<span class="source-line-no">1866</span><span id="line-1866"> throw getRemoteException(se);</span>
<span class="source-line-no">1867</span><span id="line-1867"> }</span>
<span class="source-line-no">1868</span><span id="line-1868"> }</span>
<span class="source-line-no">1869</span><span id="line-1869"></span>
<span class="source-line-no">1870</span><span id="line-1870"> /**</span>
<span class="source-line-no">1871</span><span id="line-1871"> * A helper to get the list of files of a column family on a given region using admin protocol.</span>
<span class="source-line-no">1872</span><span id="line-1872"> * @return the list of store files</span>
<span class="source-line-no">1873</span><span id="line-1873"> */</span>
<span class="source-line-no">1874</span><span id="line-1874"> public static List&lt;String&gt; getStoreFiles(final AdminService.BlockingInterface admin,</span>
<span class="source-line-no">1875</span><span id="line-1875"> final byte[] regionName, final byte[] family) throws IOException {</span>
<span class="source-line-no">1876</span><span id="line-1876"> return getStoreFiles(null, admin, regionName, family);</span>
<span class="source-line-no">1877</span><span id="line-1877"> }</span>
<span class="source-line-no">1878</span><span id="line-1878"></span>
<span class="source-line-no">1879</span><span id="line-1879"> /**</span>
<span class="source-line-no">1880</span><span id="line-1880"> * A helper to get the list of files of a column family on a given region using admin protocol.</span>
<span class="source-line-no">1881</span><span id="line-1881"> * @return the list of store files</span>
<span class="source-line-no">1882</span><span id="line-1882"> */</span>
<span class="source-line-no">1883</span><span id="line-1883"> public static List&lt;String&gt; getStoreFiles(final RpcController controller,</span>
<span class="source-line-no">1884</span><span id="line-1884"> final AdminService.BlockingInterface admin, final byte[] regionName, final byte[] family)</span>
<span class="source-line-no">1885</span><span id="line-1885"> throws IOException {</span>
<span class="source-line-no">1886</span><span id="line-1886"> GetStoreFileRequest request = ProtobufUtil.buildGetStoreFileRequest(regionName, family);</span>
<span class="source-line-no">1887</span><span id="line-1887"> try {</span>
<span class="source-line-no">1888</span><span id="line-1888"> GetStoreFileResponse response = admin.getStoreFile(controller, request);</span>
<span class="source-line-no">1889</span><span id="line-1889"> return response.getStoreFileList();</span>
<span class="source-line-no">1890</span><span id="line-1890"> } catch (ServiceException se) {</span>
<span class="source-line-no">1891</span><span id="line-1891"> throw ProtobufUtil.getRemoteException(se);</span>
<span class="source-line-no">1892</span><span id="line-1892"> }</span>
<span class="source-line-no">1893</span><span id="line-1893"> }</span>
<span class="source-line-no">1894</span><span id="line-1894"></span>
<span class="source-line-no">1895</span><span id="line-1895"> // End helpers for Admin</span>
<span class="source-line-no">1896</span><span id="line-1896"></span>
<span class="source-line-no">1897</span><span id="line-1897"> /*</span>
<span class="source-line-no">1898</span><span id="line-1898"> * Get the total (read + write) requests from a RegionLoad pb</span>
<span class="source-line-no">1899</span><span id="line-1899"> * @param rl - RegionLoad pb</span>
<span class="source-line-no">1900</span><span id="line-1900"> * @return total (read + write) requests</span>
<span class="source-line-no">1901</span><span id="line-1901"> */</span>
<span class="source-line-no">1902</span><span id="line-1902"> public static long getTotalRequestsCount(RegionLoad rl) {</span>
<span class="source-line-no">1903</span><span id="line-1903"> if (rl == null) {</span>
<span class="source-line-no">1904</span><span id="line-1904"> return 0;</span>
<span class="source-line-no">1905</span><span id="line-1905"> }</span>
<span class="source-line-no">1906</span><span id="line-1906"></span>
<span class="source-line-no">1907</span><span id="line-1907"> return rl.getReadRequestsCount() + rl.getWriteRequestsCount();</span>
<span class="source-line-no">1908</span><span id="line-1908"> }</span>
<span class="source-line-no">1909</span><span id="line-1909"></span>
<span class="source-line-no">1910</span><span id="line-1910"> public static byte[] toDelimitedByteArray(final Message m) throws IOException {</span>
<span class="source-line-no">1911</span><span id="line-1911"> // Allocate arbitrary big size so we avoid resizing.</span>
<span class="source-line-no">1912</span><span id="line-1912"> ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);</span>
<span class="source-line-no">1913</span><span id="line-1913"> baos.write(PB_MAGIC);</span>
<span class="source-line-no">1914</span><span id="line-1914"> m.writeDelimitedTo(baos);</span>
<span class="source-line-no">1915</span><span id="line-1915"> return baos.toByteArray();</span>
<span class="source-line-no">1916</span><span id="line-1916"> }</span>
<span class="source-line-no">1917</span><span id="line-1917"></span>
<span class="source-line-no">1918</span><span id="line-1918"> /**</span>
<span class="source-line-no">1919</span><span id="line-1919"> * Find the HRegion encoded name based on a region specifier</span>
<span class="source-line-no">1920</span><span id="line-1920"> * @param regionSpecifier the region specifier</span>
<span class="source-line-no">1921</span><span id="line-1921"> * @return the corresponding region's encoded name</span>
<span class="source-line-no">1922</span><span id="line-1922"> * @throws DoNotRetryIOException if the specifier type is unsupported</span>
<span class="source-line-no">1923</span><span id="line-1923"> */</span>
<span class="source-line-no">1924</span><span id="line-1924"> public static String getRegionEncodedName(final RegionSpecifier regionSpecifier)</span>
<span class="source-line-no">1925</span><span id="line-1925"> throws DoNotRetryIOException {</span>
<span class="source-line-no">1926</span><span id="line-1926"> ByteString value = regionSpecifier.getValue();</span>
<span class="source-line-no">1927</span><span id="line-1927"> RegionSpecifierType type = regionSpecifier.getType();</span>
<span class="source-line-no">1928</span><span id="line-1928"> switch (type) {</span>
<span class="source-line-no">1929</span><span id="line-1929"> case REGION_NAME:</span>
<span class="source-line-no">1930</span><span id="line-1930"> return org.apache.hadoop.hbase.client.RegionInfo.encodeRegionName(value.toByteArray());</span>
<span class="source-line-no">1931</span><span id="line-1931"> case ENCODED_REGION_NAME:</span>
<span class="source-line-no">1932</span><span id="line-1932"> return value.toStringUtf8();</span>
<span class="source-line-no">1933</span><span id="line-1933"> default:</span>
<span class="source-line-no">1934</span><span id="line-1934"> throw new DoNotRetryIOException("Unsupported region specifier type: " + type);</span>
<span class="source-line-no">1935</span><span id="line-1935"> }</span>
<span class="source-line-no">1936</span><span id="line-1936"> }</span>
<span class="source-line-no">1937</span><span id="line-1937"></span>
<span class="source-line-no">1938</span><span id="line-1938"> public static ScanMetrics toScanMetrics(final byte[] bytes) {</span>
<span class="source-line-no">1939</span><span id="line-1939"> MapReduceProtos.ScanMetrics pScanMetrics = null;</span>
<span class="source-line-no">1940</span><span id="line-1940"> try {</span>
<span class="source-line-no">1941</span><span id="line-1941"> pScanMetrics = MapReduceProtos.ScanMetrics.parseFrom(bytes);</span>
<span class="source-line-no">1942</span><span id="line-1942"> } catch (InvalidProtocolBufferException e) {</span>
<span class="source-line-no">1943</span><span id="line-1943"> // Ignored there are just no key values to add.</span>
<span class="source-line-no">1944</span><span id="line-1944"> }</span>
<span class="source-line-no">1945</span><span id="line-1945"> ScanMetrics scanMetrics = new ScanMetrics();</span>
<span class="source-line-no">1946</span><span id="line-1946"> if (pScanMetrics != null) {</span>
<span class="source-line-no">1947</span><span id="line-1947"> for (HBaseProtos.NameInt64Pair pair : pScanMetrics.getMetricsList()) {</span>
<span class="source-line-no">1948</span><span id="line-1948"> if (pair.hasName() &amp;&amp; pair.hasValue()) {</span>
<span class="source-line-no">1949</span><span id="line-1949"> scanMetrics.setCounter(pair.getName(), pair.getValue());</span>
<span class="source-line-no">1950</span><span id="line-1950"> }</span>
<span class="source-line-no">1951</span><span id="line-1951"> }</span>
<span class="source-line-no">1952</span><span id="line-1952"> }</span>
<span class="source-line-no">1953</span><span id="line-1953"> return scanMetrics;</span>
<span class="source-line-no">1954</span><span id="line-1954"> }</span>
<span class="source-line-no">1955</span><span id="line-1955"></span>
<span class="source-line-no">1956</span><span id="line-1956"> public static MapReduceProtos.ScanMetrics toScanMetrics(ScanMetrics scanMetrics, boolean reset) {</span>
<span class="source-line-no">1957</span><span id="line-1957"> MapReduceProtos.ScanMetrics.Builder builder = MapReduceProtos.ScanMetrics.newBuilder();</span>
<span class="source-line-no">1958</span><span id="line-1958"> Map&lt;String, Long&gt; metrics = scanMetrics.getMetricsMap(reset);</span>
<span class="source-line-no">1959</span><span id="line-1959"> for (Entry&lt;String, Long&gt; e : metrics.entrySet()) {</span>
<span class="source-line-no">1960</span><span id="line-1960"> HBaseProtos.NameInt64Pair nameInt64Pair =</span>
<span class="source-line-no">1961</span><span id="line-1961"> HBaseProtos.NameInt64Pair.newBuilder().setName(e.getKey()).setValue(e.getValue()).build();</span>
<span class="source-line-no">1962</span><span id="line-1962"> builder.addMetrics(nameInt64Pair);</span>
<span class="source-line-no">1963</span><span id="line-1963"> }</span>
<span class="source-line-no">1964</span><span id="line-1964"> return builder.build();</span>
<span class="source-line-no">1965</span><span id="line-1965"> }</span>
<span class="source-line-no">1966</span><span id="line-1966"></span>
<span class="source-line-no">1967</span><span id="line-1967"> /**</span>
<span class="source-line-no">1968</span><span id="line-1968"> * Unwraps an exception from a protobuf service into the underlying (expected) IOException. This</span>
<span class="source-line-no">1969</span><span id="line-1969"> * method will &lt;strong&gt;always&lt;/strong&gt; throw an exception.</span>
<span class="source-line-no">1970</span><span id="line-1970"> * @param se the {@code ServiceException} instance to convert into an {@code IOException}</span>
<span class="source-line-no">1971</span><span id="line-1971"> * @throws NullPointerException if {@code se} is {@code null}</span>
<span class="source-line-no">1972</span><span id="line-1972"> */</span>
<span class="source-line-no">1973</span><span id="line-1973"> public static void toIOException(ServiceException se) throws IOException {</span>
<span class="source-line-no">1974</span><span id="line-1974"> Objects.requireNonNull(se, "Service exception cannot be null");</span>
<span class="source-line-no">1975</span><span id="line-1975"></span>
<span class="source-line-no">1976</span><span id="line-1976"> Throwable cause = se.getCause();</span>
<span class="source-line-no">1977</span><span id="line-1977"> if (cause != null &amp;&amp; cause instanceof IOException) {</span>
<span class="source-line-no">1978</span><span id="line-1978"> throw (IOException) cause;</span>
<span class="source-line-no">1979</span><span id="line-1979"> }</span>
<span class="source-line-no">1980</span><span id="line-1980"> throw new IOException(se);</span>
<span class="source-line-no">1981</span><span id="line-1981"> }</span>
<span class="source-line-no">1982</span><span id="line-1982"></span>
<span class="source-line-no">1983</span><span id="line-1983"> public static CellProtos.Cell toCell(final Cell kv, boolean encodeTags) {</span>
<span class="source-line-no">1984</span><span id="line-1984"> // Doing this is going to kill us if we do it for all data passed.</span>
<span class="source-line-no">1985</span><span id="line-1985"> // St.Ack 20121205</span>
<span class="source-line-no">1986</span><span id="line-1986"> CellProtos.Cell.Builder kvbuilder = CellProtos.Cell.newBuilder();</span>
<span class="source-line-no">1987</span><span id="line-1987"> if (kv instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">1988</span><span id="line-1988"> kvbuilder.setRow(wrap(((ByteBufferExtendedCell) kv).getRowByteBuffer(),</span>
<span class="source-line-no">1989</span><span id="line-1989"> ((ByteBufferExtendedCell) kv).getRowPosition(), kv.getRowLength()));</span>
<span class="source-line-no">1990</span><span id="line-1990"> kvbuilder.setFamily(wrap(((ByteBufferExtendedCell) kv).getFamilyByteBuffer(),</span>
<span class="source-line-no">1991</span><span id="line-1991"> ((ByteBufferExtendedCell) kv).getFamilyPosition(), kv.getFamilyLength()));</span>
<span class="source-line-no">1992</span><span id="line-1992"> kvbuilder.setQualifier(wrap(((ByteBufferExtendedCell) kv).getQualifierByteBuffer(),</span>
<span class="source-line-no">1993</span><span id="line-1993"> ((ByteBufferExtendedCell) kv).getQualifierPosition(), kv.getQualifierLength()));</span>
<span class="source-line-no">1994</span><span id="line-1994"> kvbuilder.setCellType(CellProtos.CellType.valueOf(kv.getTypeByte()));</span>
<span class="source-line-no">1995</span><span id="line-1995"> kvbuilder.setTimestamp(kv.getTimestamp());</span>
<span class="source-line-no">1996</span><span id="line-1996"> kvbuilder.setValue(wrap(((ByteBufferExtendedCell) kv).getValueByteBuffer(),</span>
<span class="source-line-no">1997</span><span id="line-1997"> ((ByteBufferExtendedCell) kv).getValuePosition(), kv.getValueLength()));</span>
<span class="source-line-no">1998</span><span id="line-1998"> if (encodeTags) {</span>
<span class="source-line-no">1999</span><span id="line-1999"> kvbuilder.setTags(wrap(((ByteBufferExtendedCell) kv).getTagsByteBuffer(),</span>
<span class="source-line-no">2000</span><span id="line-2000"> ((ByteBufferExtendedCell) kv).getTagsPosition(), kv.getTagsLength()));</span>
<span class="source-line-no">2001</span><span id="line-2001"> }</span>
<span class="source-line-no">2002</span><span id="line-2002"> } else {</span>
<span class="source-line-no">2003</span><span id="line-2003"> kvbuilder.setRow(</span>
<span class="source-line-no">2004</span><span id="line-2004"> UnsafeByteOperations.unsafeWrap(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength()));</span>
<span class="source-line-no">2005</span><span id="line-2005"> kvbuilder.setFamily(UnsafeByteOperations.unsafeWrap(kv.getFamilyArray(), kv.getFamilyOffset(),</span>
<span class="source-line-no">2006</span><span id="line-2006"> kv.getFamilyLength()));</span>
<span class="source-line-no">2007</span><span id="line-2007"> kvbuilder.setQualifier(UnsafeByteOperations.unsafeWrap(kv.getQualifierArray(),</span>
<span class="source-line-no">2008</span><span id="line-2008"> kv.getQualifierOffset(), kv.getQualifierLength()));</span>
<span class="source-line-no">2009</span><span id="line-2009"> kvbuilder.setCellType(CellProtos.CellType.valueOf(kv.getTypeByte()));</span>
<span class="source-line-no">2010</span><span id="line-2010"> kvbuilder.setTimestamp(kv.getTimestamp());</span>
<span class="source-line-no">2011</span><span id="line-2011"> kvbuilder.setValue(UnsafeByteOperations.unsafeWrap(kv.getValueArray(), kv.getValueOffset(),</span>
<span class="source-line-no">2012</span><span id="line-2012"> kv.getValueLength()));</span>
<span class="source-line-no">2013</span><span id="line-2013"> if (encodeTags) {</span>
<span class="source-line-no">2014</span><span id="line-2014"> kvbuilder.setTags(UnsafeByteOperations.unsafeWrap(kv.getTagsArray(), kv.getTagsOffset(),</span>
<span class="source-line-no">2015</span><span id="line-2015"> kv.getTagsLength()));</span>
<span class="source-line-no">2016</span><span id="line-2016"> }</span>
<span class="source-line-no">2017</span><span id="line-2017"> }</span>
<span class="source-line-no">2018</span><span id="line-2018"> return kvbuilder.build();</span>
<span class="source-line-no">2019</span><span id="line-2019"> }</span>
<span class="source-line-no">2020</span><span id="line-2020"></span>
<span class="source-line-no">2021</span><span id="line-2021"> private static ByteString wrap(ByteBuffer b, int offset, int length) {</span>
<span class="source-line-no">2022</span><span id="line-2022"> ByteBuffer dup = b.duplicate();</span>
<span class="source-line-no">2023</span><span id="line-2023"> dup.position(offset);</span>
<span class="source-line-no">2024</span><span id="line-2024"> dup.limit(offset + length);</span>
<span class="source-line-no">2025</span><span id="line-2025"> return UnsafeByteOperations.unsafeWrap(dup);</span>
<span class="source-line-no">2026</span><span id="line-2026"> }</span>
<span class="source-line-no">2027</span><span id="line-2027"></span>
<span class="source-line-no">2028</span><span id="line-2028"> public static ExtendedCell toCell(ExtendedCellBuilder cellBuilder, final CellProtos.Cell cell,</span>
<span class="source-line-no">2029</span><span id="line-2029"> boolean decodeTags) {</span>
<span class="source-line-no">2030</span><span id="line-2030"> ExtendedCellBuilder builder = cellBuilder.clear().setRow(cell.getRow().toByteArray())</span>
<span class="source-line-no">2031</span><span id="line-2031"> .setFamily(cell.getFamily().toByteArray()).setQualifier(cell.getQualifier().toByteArray())</span>
<span class="source-line-no">2032</span><span id="line-2032"> .setTimestamp(cell.getTimestamp()).setType((byte) cell.getCellType().getNumber())</span>
<span class="source-line-no">2033</span><span id="line-2033"> .setValue(cell.getValue().toByteArray());</span>
<span class="source-line-no">2034</span><span id="line-2034"> if (decodeTags &amp;&amp; cell.hasTags()) {</span>
<span class="source-line-no">2035</span><span id="line-2035"> builder.setTags(cell.getTags().toByteArray());</span>
<span class="source-line-no">2036</span><span id="line-2036"> }</span>
<span class="source-line-no">2037</span><span id="line-2037"> return builder.build();</span>
<span class="source-line-no">2038</span><span id="line-2038"> }</span>
<span class="source-line-no">2039</span><span id="line-2039"></span>
<span class="source-line-no">2040</span><span id="line-2040"> public static HBaseProtos.NamespaceDescriptor toProtoNamespaceDescriptor(NamespaceDescriptor ns) {</span>
<span class="source-line-no">2041</span><span id="line-2041"> HBaseProtos.NamespaceDescriptor.Builder b =</span>
<span class="source-line-no">2042</span><span id="line-2042"> HBaseProtos.NamespaceDescriptor.newBuilder().setName(ByteString.copyFromUtf8(ns.getName()));</span>
<span class="source-line-no">2043</span><span id="line-2043"> for (Map.Entry&lt;String, String&gt; entry : ns.getConfiguration().entrySet()) {</span>
<span class="source-line-no">2044</span><span id="line-2044"> b.addConfiguration(</span>
<span class="source-line-no">2045</span><span id="line-2045"> HBaseProtos.NameStringPair.newBuilder().setName(entry.getKey()).setValue(entry.getValue()));</span>
<span class="source-line-no">2046</span><span id="line-2046"> }</span>
<span class="source-line-no">2047</span><span id="line-2047"> return b.build();</span>
<span class="source-line-no">2048</span><span id="line-2048"> }</span>
<span class="source-line-no">2049</span><span id="line-2049"></span>
<span class="source-line-no">2050</span><span id="line-2050"> public static NamespaceDescriptor toNamespaceDescriptor(HBaseProtos.NamespaceDescriptor desc) {</span>
<span class="source-line-no">2051</span><span id="line-2051"> NamespaceDescriptor.Builder b = NamespaceDescriptor.create(desc.getName().toStringUtf8());</span>
<span class="source-line-no">2052</span><span id="line-2052"> for (HBaseProtos.NameStringPair prop : desc.getConfigurationList()) {</span>
<span class="source-line-no">2053</span><span id="line-2053"> b.addConfiguration(prop.getName(), prop.getValue());</span>
<span class="source-line-no">2054</span><span id="line-2054"> }</span>
<span class="source-line-no">2055</span><span id="line-2055"> return b.build();</span>
<span class="source-line-no">2056</span><span id="line-2056"> }</span>
<span class="source-line-no">2057</span><span id="line-2057"></span>
<span class="source-line-no">2058</span><span id="line-2058"> public static CompactionDescriptor toCompactionDescriptor(</span>
<span class="source-line-no">2059</span><span id="line-2059"> org.apache.hadoop.hbase.client.RegionInfo info, byte[] family, List&lt;Path&gt; inputPaths,</span>
<span class="source-line-no">2060</span><span id="line-2060"> List&lt;Path&gt; outputPaths, Path storeDir) {</span>
<span class="source-line-no">2061</span><span id="line-2061"> return toCompactionDescriptor(info, null, family, inputPaths, outputPaths, storeDir);</span>
<span class="source-line-no">2062</span><span id="line-2062"> }</span>
<span class="source-line-no">2063</span><span id="line-2063"></span>
<span class="source-line-no">2064</span><span id="line-2064"> public static CompactionDescriptor toCompactionDescriptor(</span>
<span class="source-line-no">2065</span><span id="line-2065"> org.apache.hadoop.hbase.client.RegionInfo info, byte[] regionName, byte[] family,</span>
<span class="source-line-no">2066</span><span id="line-2066"> List&lt;Path&gt; inputPaths, List&lt;Path&gt; outputPaths, Path storeDir) {</span>
<span class="source-line-no">2067</span><span id="line-2067"> // compaction descriptor contains relative paths.</span>
<span class="source-line-no">2068</span><span id="line-2068"> // input / output paths are relative to the store dir</span>
<span class="source-line-no">2069</span><span id="line-2069"> // store dir is relative to region dir</span>
<span class="source-line-no">2070</span><span id="line-2070"> CompactionDescriptor.Builder builder = CompactionDescriptor.newBuilder()</span>
<span class="source-line-no">2071</span><span id="line-2071"> .setTableName(UnsafeByteOperations.unsafeWrap(info.getTable().toBytes()))</span>
<span class="source-line-no">2072</span><span id="line-2072"> .setEncodedRegionName(UnsafeByteOperations</span>
<span class="source-line-no">2073</span><span id="line-2073"> .unsafeWrap(regionName == null ? info.getEncodedNameAsBytes() : regionName))</span>
<span class="source-line-no">2074</span><span id="line-2074"> .setFamilyName(UnsafeByteOperations.unsafeWrap(family)).setStoreHomeDir(storeDir.getName()); // make</span>
<span class="source-line-no">2075</span><span id="line-2075"> // relative</span>
<span class="source-line-no">2076</span><span id="line-2076"> for (Path inputPath : inputPaths) {</span>
<span class="source-line-no">2077</span><span id="line-2077"> builder.addCompactionInput(inputPath.getName()); // relative path</span>
<span class="source-line-no">2078</span><span id="line-2078"> }</span>
<span class="source-line-no">2079</span><span id="line-2079"> for (Path outputPath : outputPaths) {</span>
<span class="source-line-no">2080</span><span id="line-2080"> builder.addCompactionOutput(outputPath.getName());</span>
<span class="source-line-no">2081</span><span id="line-2081"> }</span>
<span class="source-line-no">2082</span><span id="line-2082"> builder.setRegionName(UnsafeByteOperations.unsafeWrap(info.getRegionName()));</span>
<span class="source-line-no">2083</span><span id="line-2083"> return builder.build();</span>
<span class="source-line-no">2084</span><span id="line-2084"> }</span>
<span class="source-line-no">2085</span><span id="line-2085"></span>
<span class="source-line-no">2086</span><span id="line-2086"> public static FlushDescriptor toFlushDescriptor(FlushAction action,</span>
<span class="source-line-no">2087</span><span id="line-2087"> org.apache.hadoop.hbase.client.RegionInfo hri, long flushSeqId,</span>
<span class="source-line-no">2088</span><span id="line-2088"> Map&lt;byte[], List&lt;Path&gt;&gt; committedFiles) {</span>
<span class="source-line-no">2089</span><span id="line-2089"> FlushDescriptor.Builder desc = FlushDescriptor.newBuilder().setAction(action)</span>
<span class="source-line-no">2090</span><span id="line-2090"> .setEncodedRegionName(UnsafeByteOperations.unsafeWrap(hri.getEncodedNameAsBytes()))</span>
<span class="source-line-no">2091</span><span id="line-2091"> .setRegionName(UnsafeByteOperations.unsafeWrap(hri.getRegionName()))</span>
<span class="source-line-no">2092</span><span id="line-2092"> .setFlushSequenceNumber(flushSeqId)</span>
<span class="source-line-no">2093</span><span id="line-2093"> .setTableName(UnsafeByteOperations.unsafeWrap(hri.getTable().getName()));</span>
<span class="source-line-no">2094</span><span id="line-2094"></span>
<span class="source-line-no">2095</span><span id="line-2095"> for (Map.Entry&lt;byte[], List&lt;Path&gt;&gt; entry : committedFiles.entrySet()) {</span>
<span class="source-line-no">2096</span><span id="line-2096"> WALProtos.FlushDescriptor.StoreFlushDescriptor.Builder builder =</span>
<span class="source-line-no">2097</span><span id="line-2097"> WALProtos.FlushDescriptor.StoreFlushDescriptor.newBuilder()</span>
<span class="source-line-no">2098</span><span id="line-2098"> .setFamilyName(UnsafeByteOperations.unsafeWrap(entry.getKey()))</span>
<span class="source-line-no">2099</span><span id="line-2099"> .setStoreHomeDir(Bytes.toString(entry.getKey())); // relative to region</span>
<span class="source-line-no">2100</span><span id="line-2100"> if (entry.getValue() != null) {</span>
<span class="source-line-no">2101</span><span id="line-2101"> for (Path path : entry.getValue()) {</span>
<span class="source-line-no">2102</span><span id="line-2102"> builder.addFlushOutput(path.getName());</span>
<span class="source-line-no">2103</span><span id="line-2103"> }</span>
<span class="source-line-no">2104</span><span id="line-2104"> }</span>
<span class="source-line-no">2105</span><span id="line-2105"> desc.addStoreFlushes(builder);</span>
<span class="source-line-no">2106</span><span id="line-2106"> }</span>
<span class="source-line-no">2107</span><span id="line-2107"> return desc.build();</span>
<span class="source-line-no">2108</span><span id="line-2108"> }</span>
<span class="source-line-no">2109</span><span id="line-2109"></span>
<span class="source-line-no">2110</span><span id="line-2110"> public static RegionEventDescriptor toRegionEventDescriptor(EventType eventType,</span>
<span class="source-line-no">2111</span><span id="line-2111"> org.apache.hadoop.hbase.client.RegionInfo hri, long seqId, ServerName server,</span>
<span class="source-line-no">2112</span><span id="line-2112"> Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles) {</span>
<span class="source-line-no">2113</span><span id="line-2113"> final byte[] tableNameAsBytes = hri.getTable().getName();</span>
<span class="source-line-no">2114</span><span id="line-2114"> final byte[] encodedNameAsBytes = hri.getEncodedNameAsBytes();</span>
<span class="source-line-no">2115</span><span id="line-2115"> final byte[] regionNameAsBytes = hri.getRegionName();</span>
<span class="source-line-no">2116</span><span id="line-2116"> return toRegionEventDescriptor(eventType, tableNameAsBytes, encodedNameAsBytes,</span>
<span class="source-line-no">2117</span><span id="line-2117"> regionNameAsBytes, seqId,</span>
<span class="source-line-no">2118</span><span id="line-2118"></span>
<span class="source-line-no">2119</span><span id="line-2119"> server, storeFiles);</span>
<span class="source-line-no">2120</span><span id="line-2120"> }</span>
<span class="source-line-no">2121</span><span id="line-2121"></span>
<span class="source-line-no">2122</span><span id="line-2122"> public static RegionEventDescriptor toRegionEventDescriptor(EventType eventType,</span>
<span class="source-line-no">2123</span><span id="line-2123"> byte[] tableNameAsBytes, byte[] encodedNameAsBytes, byte[] regionNameAsBytes, long seqId,</span>
<span class="source-line-no">2124</span><span id="line-2124"></span>
<span class="source-line-no">2125</span><span id="line-2125"> ServerName server, Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles) {</span>
<span class="source-line-no">2126</span><span id="line-2126"> RegionEventDescriptor.Builder desc = RegionEventDescriptor.newBuilder().setEventType(eventType)</span>
<span class="source-line-no">2127</span><span id="line-2127"> .setTableName(UnsafeByteOperations.unsafeWrap(tableNameAsBytes))</span>
<span class="source-line-no">2128</span><span id="line-2128"> .setEncodedRegionName(UnsafeByteOperations.unsafeWrap(encodedNameAsBytes))</span>
<span class="source-line-no">2129</span><span id="line-2129"> .setRegionName(UnsafeByteOperations.unsafeWrap(regionNameAsBytes)).setLogSequenceNumber(seqId)</span>
<span class="source-line-no">2130</span><span id="line-2130"> .setServer(toServerName(server));</span>
<span class="source-line-no">2131</span><span id="line-2131"></span>
<span class="source-line-no">2132</span><span id="line-2132"> for (Entry&lt;byte[], List&lt;Path&gt;&gt; entry : storeFiles.entrySet()) {</span>
<span class="source-line-no">2133</span><span id="line-2133"> StoreDescriptor.Builder builder =</span>
<span class="source-line-no">2134</span><span id="line-2134"> StoreDescriptor.newBuilder().setFamilyName(UnsafeByteOperations.unsafeWrap(entry.getKey()))</span>
<span class="source-line-no">2135</span><span id="line-2135"> .setStoreHomeDir(Bytes.toString(entry.getKey()));</span>
<span class="source-line-no">2136</span><span id="line-2136"> for (Path path : entry.getValue()) {</span>
<span class="source-line-no">2137</span><span id="line-2137"> builder.addStoreFile(path.getName());</span>
<span class="source-line-no">2138</span><span id="line-2138"> }</span>
<span class="source-line-no">2139</span><span id="line-2139"></span>
<span class="source-line-no">2140</span><span id="line-2140"> desc.addStores(builder);</span>
<span class="source-line-no">2141</span><span id="line-2141"> }</span>
<span class="source-line-no">2142</span><span id="line-2142"> return desc.build();</span>
<span class="source-line-no">2143</span><span id="line-2143"> }</span>
<span class="source-line-no">2144</span><span id="line-2144"></span>
<span class="source-line-no">2145</span><span id="line-2145"> /**</span>
<span class="source-line-no">2146</span><span id="line-2146"> * Return short version of Message toString'd, shorter than TextFormat#shortDebugString. Tries to</span>
<span class="source-line-no">2147</span><span id="line-2147"> * NOT print out data both because it can be big but also so we do not have data in our logs. Use</span>
<span class="source-line-no">2148</span><span id="line-2148"> * judiciously.</span>
<span class="source-line-no">2149</span><span id="line-2149"> * @return toString of passed &lt;code&gt;m&lt;/code&gt;</span>
<span class="source-line-no">2150</span><span id="line-2150"> */</span>
<span class="source-line-no">2151</span><span id="line-2151"> public static String getShortTextFormat(Message m) {</span>
<span class="source-line-no">2152</span><span id="line-2152"> if (m == null) return "null";</span>
<span class="source-line-no">2153</span><span id="line-2153"> if (m instanceof ScanRequest) {</span>
<span class="source-line-no">2154</span><span id="line-2154"> // This should be small and safe to output. No data.</span>
<span class="source-line-no">2155</span><span id="line-2155"> return TextFormat.shortDebugString(m);</span>
<span class="source-line-no">2156</span><span id="line-2156"> } else if (m instanceof RegionServerReportRequest) {</span>
<span class="source-line-no">2157</span><span id="line-2157"> // Print a short message only, just the servername and the requests, not the full load.</span>
<span class="source-line-no">2158</span><span id="line-2158"> RegionServerReportRequest r = (RegionServerReportRequest) m;</span>
<span class="source-line-no">2159</span><span id="line-2159"> return "server " + TextFormat.shortDebugString(r.getServer()) + " load { numberOfRequests: "</span>
<span class="source-line-no">2160</span><span id="line-2160"> + r.getLoad().getNumberOfRequests() + " }";</span>
<span class="source-line-no">2161</span><span id="line-2161"> } else if (m instanceof RegionServerStartupRequest) {</span>
<span class="source-line-no">2162</span><span id="line-2162"> // Should be small enough.</span>
<span class="source-line-no">2163</span><span id="line-2163"> return TextFormat.shortDebugString(m);</span>
<span class="source-line-no">2164</span><span id="line-2164"> } else if (m instanceof MutationProto) {</span>
<span class="source-line-no">2165</span><span id="line-2165"> return toShortString((MutationProto) m);</span>
<span class="source-line-no">2166</span><span id="line-2166"> } else if (m instanceof GetRequest) {</span>
<span class="source-line-no">2167</span><span id="line-2167"> GetRequest r = (GetRequest) m;</span>
<span class="source-line-no">2168</span><span id="line-2168"> return "region= " + getStringForByteString(r.getRegion().getValue()) + ", row="</span>
<span class="source-line-no">2169</span><span id="line-2169"> + getStringForByteString(r.getGet().getRow());</span>
<span class="source-line-no">2170</span><span id="line-2170"> } else if (m instanceof ClientProtos.MultiRequest) {</span>
<span class="source-line-no">2171</span><span id="line-2171"> ClientProtos.MultiRequest r = (ClientProtos.MultiRequest) m;</span>
<span class="source-line-no">2172</span><span id="line-2172"></span>
<span class="source-line-no">2173</span><span id="line-2173"> // Get the number of Actions</span>
<span class="source-line-no">2174</span><span id="line-2174"> int actionsCount =</span>
<span class="source-line-no">2175</span><span id="line-2175"> r.getRegionActionList().stream().mapToInt(ClientProtos.RegionAction::getActionCount).sum();</span>
<span class="source-line-no">2176</span><span id="line-2176"></span>
<span class="source-line-no">2177</span><span id="line-2177"> // Get first set of Actions.</span>
<span class="source-line-no">2178</span><span id="line-2178"> ClientProtos.RegionAction actions = r.getRegionActionList().get(0);</span>
<span class="source-line-no">2179</span><span id="line-2179"> String row = actions.getActionCount() &lt;= 0</span>
<span class="source-line-no">2180</span><span id="line-2180"> ? ""</span>
<span class="source-line-no">2181</span><span id="line-2181"> : getStringForByteString(actions.getAction(0).hasGet()</span>
<span class="source-line-no">2182</span><span id="line-2182"> ? actions.getAction(0).getGet().getRow()</span>
<span class="source-line-no">2183</span><span id="line-2183"> : actions.getAction(0).getMutation().getRow());</span>
<span class="source-line-no">2184</span><span id="line-2184"> return "region= " + getStringForByteString(actions.getRegion().getValue()) + ", for "</span>
<span class="source-line-no">2185</span><span id="line-2185"> + actionsCount + " action(s) and 1st row key=" + row;</span>
<span class="source-line-no">2186</span><span id="line-2186"> } else if (m instanceof ClientProtos.MutateRequest) {</span>
<span class="source-line-no">2187</span><span id="line-2187"> ClientProtos.MutateRequest r = (ClientProtos.MutateRequest) m;</span>
<span class="source-line-no">2188</span><span id="line-2188"> return "region= " + getStringForByteString(r.getRegion().getValue()) + ", row="</span>
<span class="source-line-no">2189</span><span id="line-2189"> + getStringForByteString(r.getMutation().getRow());</span>
<span class="source-line-no">2190</span><span id="line-2190"> } else if (m instanceof ClientProtos.CoprocessorServiceRequest) {</span>
<span class="source-line-no">2191</span><span id="line-2191"> ClientProtos.CoprocessorServiceRequest r = (ClientProtos.CoprocessorServiceRequest) m;</span>
<span class="source-line-no">2192</span><span id="line-2192"> return "coprocessorService= " + r.getCall().getServiceName() + ":"</span>
<span class="source-line-no">2193</span><span id="line-2193"> + r.getCall().getMethodName();</span>
<span class="source-line-no">2194</span><span id="line-2194"> }</span>
<span class="source-line-no">2195</span><span id="line-2195"> return "TODO: " + m.getClass().toString();</span>
<span class="source-line-no">2196</span><span id="line-2196"> }</span>
<span class="source-line-no">2197</span><span id="line-2197"></span>
<span class="source-line-no">2198</span><span id="line-2198"> private static String getStringForByteString(ByteString bs) {</span>
<span class="source-line-no">2199</span><span id="line-2199"> return Bytes.toStringBinary(bs.toByteArray());</span>
<span class="source-line-no">2200</span><span id="line-2200"> }</span>
<span class="source-line-no">2201</span><span id="line-2201"></span>
<span class="source-line-no">2202</span><span id="line-2202"> /**</span>
<span class="source-line-no">2203</span><span id="line-2203"> * Return SlowLogParams to maintain recent online slowlog responses</span>
<span class="source-line-no">2204</span><span id="line-2204"> * @param message Message object {@link Message}</span>
<span class="source-line-no">2205</span><span id="line-2205"> * @return SlowLogParams with regionName(for filter queries) and params</span>
<span class="source-line-no">2206</span><span id="line-2206"> */</span>
<span class="source-line-no">2207</span><span id="line-2207"> public static SlowLogParams getSlowLogParams(Message message, boolean slowLogScanPayloadEnabled) {</span>
<span class="source-line-no">2208</span><span id="line-2208"> if (message == null) {</span>
<span class="source-line-no">2209</span><span id="line-2209"> return null;</span>
<span class="source-line-no">2210</span><span id="line-2210"> }</span>
<span class="source-line-no">2211</span><span id="line-2211"> if (message instanceof ScanRequest) {</span>
<span class="source-line-no">2212</span><span id="line-2212"> ScanRequest scanRequest = (ScanRequest) message;</span>
<span class="source-line-no">2213</span><span id="line-2213"> String regionName = getStringForByteString(scanRequest.getRegion().getValue());</span>
<span class="source-line-no">2214</span><span id="line-2214"> String params = TextFormat.shortDebugString(message);</span>
<span class="source-line-no">2215</span><span id="line-2215"> if (slowLogScanPayloadEnabled) {</span>
<span class="source-line-no">2216</span><span id="line-2216"> return new SlowLogParams(regionName, params, scanRequest.getScan());</span>
<span class="source-line-no">2217</span><span id="line-2217"> } else {</span>
<span class="source-line-no">2218</span><span id="line-2218"> return new SlowLogParams(regionName, params);</span>
<span class="source-line-no">2219</span><span id="line-2219"> }</span>
<span class="source-line-no">2220</span><span id="line-2220"> } else if (message instanceof MutationProto) {</span>
<span class="source-line-no">2221</span><span id="line-2221"> MutationProto mutationProto = (MutationProto) message;</span>
<span class="source-line-no">2222</span><span id="line-2222"> String params = "type= " + mutationProto.getMutateType().toString() + ", row= "</span>
<span class="source-line-no">2223</span><span id="line-2223"> + getStringForByteString(mutationProto.getRow());</span>
<span class="source-line-no">2224</span><span id="line-2224"> return new SlowLogParams(params);</span>
<span class="source-line-no">2225</span><span id="line-2225"> } else if (message instanceof GetRequest) {</span>
<span class="source-line-no">2226</span><span id="line-2226"> GetRequest getRequest = (GetRequest) message;</span>
<span class="source-line-no">2227</span><span id="line-2227"> String regionName = getStringForByteString(getRequest.getRegion().getValue());</span>
<span class="source-line-no">2228</span><span id="line-2228"> String params =</span>
<span class="source-line-no">2229</span><span id="line-2229"> "region= " + regionName + ", row= " + getStringForByteString(getRequest.getGet().getRow());</span>
<span class="source-line-no">2230</span><span id="line-2230"> return new SlowLogParams(regionName, params);</span>
<span class="source-line-no">2231</span><span id="line-2231"> } else if (message instanceof MultiRequest) {</span>
<span class="source-line-no">2232</span><span id="line-2232"> MultiRequest multiRequest = (MultiRequest) message;</span>
<span class="source-line-no">2233</span><span id="line-2233"> int actionsCount = multiRequest.getRegionActionList().stream()</span>
<span class="source-line-no">2234</span><span id="line-2234"> .mapToInt(ClientProtos.RegionAction::getActionCount).sum();</span>
<span class="source-line-no">2235</span><span id="line-2235"> RegionAction actions = multiRequest.getRegionActionList().get(0);</span>
<span class="source-line-no">2236</span><span id="line-2236"> String regionName = getStringForByteString(actions.getRegion().getValue());</span>
<span class="source-line-no">2237</span><span id="line-2237"> String params = "region= " + regionName + ", for " + actionsCount + " action(s)";</span>
<span class="source-line-no">2238</span><span id="line-2238"> return new SlowLogParams(regionName, params);</span>
<span class="source-line-no">2239</span><span id="line-2239"> } else if (message instanceof MutateRequest) {</span>
<span class="source-line-no">2240</span><span id="line-2240"> MutateRequest mutateRequest = (MutateRequest) message;</span>
<span class="source-line-no">2241</span><span id="line-2241"> String regionName = getStringForByteString(mutateRequest.getRegion().getValue());</span>
<span class="source-line-no">2242</span><span id="line-2242"> String params = "region= " + regionName + ", row= "</span>
<span class="source-line-no">2243</span><span id="line-2243"> + getStringForByteString(mutateRequest.getMutation().getRow());</span>
<span class="source-line-no">2244</span><span id="line-2244"> return new SlowLogParams(regionName, params);</span>
<span class="source-line-no">2245</span><span id="line-2245"> } else if (message instanceof CoprocessorServiceRequest) {</span>
<span class="source-line-no">2246</span><span id="line-2246"> CoprocessorServiceRequest coprocessorServiceRequest = (CoprocessorServiceRequest) message;</span>
<span class="source-line-no">2247</span><span id="line-2247"> String params = "coprocessorService= " + coprocessorServiceRequest.getCall().getServiceName()</span>
<span class="source-line-no">2248</span><span id="line-2248"> + ":" + coprocessorServiceRequest.getCall().getMethodName();</span>
<span class="source-line-no">2249</span><span id="line-2249"> return new SlowLogParams(params);</span>
<span class="source-line-no">2250</span><span id="line-2250"> }</span>
<span class="source-line-no">2251</span><span id="line-2251"> String params = message.getClass().toString();</span>
<span class="source-line-no">2252</span><span id="line-2252"> return new SlowLogParams(params);</span>
<span class="source-line-no">2253</span><span id="line-2253"> }</span>
<span class="source-line-no">2254</span><span id="line-2254"></span>
<span class="source-line-no">2255</span><span id="line-2255"> /**</span>
<span class="source-line-no">2256</span><span id="line-2256"> * Convert a list of NameBytesPair to a more readable CSV</span>
<span class="source-line-no">2257</span><span id="line-2257"> */</span>
<span class="source-line-no">2258</span><span id="line-2258"> public static String convertAttributesToCsv(List&lt;NameBytesPair&gt; attributes) {</span>
<span class="source-line-no">2259</span><span id="line-2259"> if (attributes.isEmpty()) {</span>
<span class="source-line-no">2260</span><span id="line-2260"> return HConstants.EMPTY_STRING;</span>
<span class="source-line-no">2261</span><span id="line-2261"> }</span>
<span class="source-line-no">2262</span><span id="line-2262"> return deserializeAttributes(convertNameBytesPairsToMap(attributes)).entrySet().stream()</span>
<span class="source-line-no">2263</span><span id="line-2263"> .map(entry -&gt; entry.getKey() + " = " + entry.getValue()).collect(Collectors.joining(", "));</span>
<span class="source-line-no">2264</span><span id="line-2264"> }</span>
<span class="source-line-no">2265</span><span id="line-2265"></span>
<span class="source-line-no">2266</span><span id="line-2266"> /**</span>
<span class="source-line-no">2267</span><span id="line-2267"> * Convert a map of byte array attributes to a more readable map of binary string representations</span>
<span class="source-line-no">2268</span><span id="line-2268"> */</span>
<span class="source-line-no">2269</span><span id="line-2269"> public static Map&lt;String, String&gt; deserializeAttributes(Map&lt;String, byte[]&gt; attributes) {</span>
<span class="source-line-no">2270</span><span id="line-2270"> return attributes.entrySet().stream().collect(</span>
<span class="source-line-no">2271</span><span id="line-2271"> Collectors.toMap(Map.Entry::getKey, entry -&gt; Bytes.toStringBinary(entry.getValue())));</span>
<span class="source-line-no">2272</span><span id="line-2272"> }</span>
<span class="source-line-no">2273</span><span id="line-2273"></span>
<span class="source-line-no">2274</span><span id="line-2274"> /**</span>
<span class="source-line-no">2275</span><span id="line-2275"> * Print out some subset of a MutationProto rather than all of it and its data</span>
<span class="source-line-no">2276</span><span id="line-2276"> * @param proto Protobuf to print out</span>
<span class="source-line-no">2277</span><span id="line-2277"> * @return Short String of mutation proto</span>
<span class="source-line-no">2278</span><span id="line-2278"> */</span>
<span class="source-line-no">2279</span><span id="line-2279"> static String toShortString(final MutationProto proto) {</span>
<span class="source-line-no">2280</span><span id="line-2280"> return "row=" + Bytes.toString(proto.getRow().toByteArray()) + ", type="</span>
<span class="source-line-no">2281</span><span id="line-2281"> + proto.getMutateType().toString();</span>
<span class="source-line-no">2282</span><span id="line-2282"> }</span>
<span class="source-line-no">2283</span><span id="line-2283"></span>
<span class="source-line-no">2284</span><span id="line-2284"> public static TableName toTableName(HBaseProtos.TableName tableNamePB) {</span>
<span class="source-line-no">2285</span><span id="line-2285"> return TableName.valueOf(tableNamePB.getNamespace().asReadOnlyByteBuffer(),</span>
<span class="source-line-no">2286</span><span id="line-2286"> tableNamePB.getQualifier().asReadOnlyByteBuffer());</span>
<span class="source-line-no">2287</span><span id="line-2287"> }</span>
<span class="source-line-no">2288</span><span id="line-2288"></span>
<span class="source-line-no">2289</span><span id="line-2289"> public static HBaseProtos.TableName toProtoTableName(TableName tableName) {</span>
<span class="source-line-no">2290</span><span id="line-2290"> return HBaseProtos.TableName.newBuilder()</span>
<span class="source-line-no">2291</span><span id="line-2291"> .setNamespace(UnsafeByteOperations.unsafeWrap(tableName.getNamespace()))</span>
<span class="source-line-no">2292</span><span id="line-2292"> .setQualifier(UnsafeByteOperations.unsafeWrap(tableName.getQualifier())).build();</span>
<span class="source-line-no">2293</span><span id="line-2293"> }</span>
<span class="source-line-no">2294</span><span id="line-2294"></span>
<span class="source-line-no">2295</span><span id="line-2295"> public static List&lt;HBaseProtos.TableName&gt; toProtoTableNameList(List&lt;TableName&gt; tableNameList) {</span>
<span class="source-line-no">2296</span><span id="line-2296"> if (tableNameList == null) {</span>
<span class="source-line-no">2297</span><span id="line-2297"> return new ArrayList&lt;&gt;();</span>
<span class="source-line-no">2298</span><span id="line-2298"> }</span>
<span class="source-line-no">2299</span><span id="line-2299"> return tableNameList.stream().map(ProtobufUtil::toProtoTableName).collect(Collectors.toList());</span>
<span class="source-line-no">2300</span><span id="line-2300"> }</span>
<span class="source-line-no">2301</span><span id="line-2301"></span>
<span class="source-line-no">2302</span><span id="line-2302"> public static List&lt;TableName&gt; toTableNameList(List&lt;HBaseProtos.TableName&gt; tableNamesList) {</span>
<span class="source-line-no">2303</span><span id="line-2303"> if (tableNamesList == null) {</span>
<span class="source-line-no">2304</span><span id="line-2304"> return new ArrayList&lt;&gt;();</span>
<span class="source-line-no">2305</span><span id="line-2305"> }</span>
<span class="source-line-no">2306</span><span id="line-2306"> return tableNamesList.stream().map(ProtobufUtil::toTableName).collect(Collectors.toList());</span>
<span class="source-line-no">2307</span><span id="line-2307"> }</span>
<span class="source-line-no">2308</span><span id="line-2308"></span>
<span class="source-line-no">2309</span><span id="line-2309"> public static TableName[] getTableNameArray(List&lt;HBaseProtos.TableName&gt; tableNamesList) {</span>
<span class="source-line-no">2310</span><span id="line-2310"> if (tableNamesList == null) {</span>
<span class="source-line-no">2311</span><span id="line-2311"> return new TableName[0];</span>
<span class="source-line-no">2312</span><span id="line-2312"> }</span>
<span class="source-line-no">2313</span><span id="line-2313"> TableName[] tableNames = new TableName[tableNamesList.size()];</span>
<span class="source-line-no">2314</span><span id="line-2314"> for (int i = 0; i &lt; tableNamesList.size(); i++) {</span>
<span class="source-line-no">2315</span><span id="line-2315"> tableNames[i] = toTableName(tableNamesList.get(i));</span>
<span class="source-line-no">2316</span><span id="line-2316"> }</span>
<span class="source-line-no">2317</span><span id="line-2317"> return tableNames;</span>
<span class="source-line-no">2318</span><span id="line-2318"> }</span>
<span class="source-line-no">2319</span><span id="line-2319"></span>
<span class="source-line-no">2320</span><span id="line-2320"> /**</span>
<span class="source-line-no">2321</span><span id="line-2321"> * Convert a protocol buffer CellVisibility to a client CellVisibility</span>
<span class="source-line-no">2322</span><span id="line-2322"> * @return the converted client CellVisibility</span>
<span class="source-line-no">2323</span><span id="line-2323"> */</span>
<span class="source-line-no">2324</span><span id="line-2324"> public static CellVisibility toCellVisibility(ClientProtos.CellVisibility proto) {</span>
<span class="source-line-no">2325</span><span id="line-2325"> if (proto == null) return null;</span>
<span class="source-line-no">2326</span><span id="line-2326"> return new CellVisibility(proto.getExpression());</span>
<span class="source-line-no">2327</span><span id="line-2327"> }</span>
<span class="source-line-no">2328</span><span id="line-2328"></span>
<span class="source-line-no">2329</span><span id="line-2329"> /**</span>
<span class="source-line-no">2330</span><span id="line-2330"> * Convert a protocol buffer CellVisibility bytes to a client CellVisibility</span>
<span class="source-line-no">2331</span><span id="line-2331"> * @return the converted client CellVisibility</span>
<span class="source-line-no">2332</span><span id="line-2332"> */</span>
<span class="source-line-no">2333</span><span id="line-2333"> public static CellVisibility toCellVisibility(byte[] protoBytes) throws DeserializationException {</span>
<span class="source-line-no">2334</span><span id="line-2334"> if (protoBytes == null) return null;</span>
<span class="source-line-no">2335</span><span id="line-2335"> ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();</span>
<span class="source-line-no">2336</span><span id="line-2336"> ClientProtos.CellVisibility proto = null;</span>
<span class="source-line-no">2337</span><span id="line-2337"> try {</span>
<span class="source-line-no">2338</span><span id="line-2338"> ProtobufUtil.mergeFrom(builder, protoBytes);</span>
<span class="source-line-no">2339</span><span id="line-2339"> proto = builder.build();</span>
<span class="source-line-no">2340</span><span id="line-2340"> } catch (IOException e) {</span>
<span class="source-line-no">2341</span><span id="line-2341"> throw new DeserializationException(e);</span>
<span class="source-line-no">2342</span><span id="line-2342"> }</span>
<span class="source-line-no">2343</span><span id="line-2343"> return toCellVisibility(proto);</span>
<span class="source-line-no">2344</span><span id="line-2344"> }</span>
<span class="source-line-no">2345</span><span id="line-2345"></span>
<span class="source-line-no">2346</span><span id="line-2346"> /**</span>
<span class="source-line-no">2347</span><span id="line-2347"> * Create a protocol buffer CellVisibility based on a client CellVisibility.</span>
<span class="source-line-no">2348</span><span id="line-2348"> * @return a protocol buffer CellVisibility</span>
<span class="source-line-no">2349</span><span id="line-2349"> */</span>
<span class="source-line-no">2350</span><span id="line-2350"> public static ClientProtos.CellVisibility toCellVisibility(CellVisibility cellVisibility) {</span>
<span class="source-line-no">2351</span><span id="line-2351"> ClientProtos.CellVisibility.Builder builder = ClientProtos.CellVisibility.newBuilder();</span>
<span class="source-line-no">2352</span><span id="line-2352"> builder.setExpression(cellVisibility.getExpression());</span>
<span class="source-line-no">2353</span><span id="line-2353"> return builder.build();</span>
<span class="source-line-no">2354</span><span id="line-2354"> }</span>
<span class="source-line-no">2355</span><span id="line-2355"></span>
<span class="source-line-no">2356</span><span id="line-2356"> /**</span>
<span class="source-line-no">2357</span><span id="line-2357"> * Convert a protocol buffer Authorizations to a client Authorizations</span>
<span class="source-line-no">2358</span><span id="line-2358"> * @return the converted client Authorizations</span>
<span class="source-line-no">2359</span><span id="line-2359"> */</span>
<span class="source-line-no">2360</span><span id="line-2360"> public static Authorizations toAuthorizations(ClientProtos.Authorizations proto) {</span>
<span class="source-line-no">2361</span><span id="line-2361"> if (proto == null) return null;</span>
<span class="source-line-no">2362</span><span id="line-2362"> return new Authorizations(proto.getLabelList());</span>
<span class="source-line-no">2363</span><span id="line-2363"> }</span>
<span class="source-line-no">2364</span><span id="line-2364"></span>
<span class="source-line-no">2365</span><span id="line-2365"> /**</span>
<span class="source-line-no">2366</span><span id="line-2366"> * Convert a protocol buffer Authorizations bytes to a client Authorizations</span>
<span class="source-line-no">2367</span><span id="line-2367"> * @return the converted client Authorizations</span>
<span class="source-line-no">2368</span><span id="line-2368"> */</span>
<span class="source-line-no">2369</span><span id="line-2369"> public static Authorizations toAuthorizations(byte[] protoBytes) throws DeserializationException {</span>
<span class="source-line-no">2370</span><span id="line-2370"> if (protoBytes == null) return null;</span>
<span class="source-line-no">2371</span><span id="line-2371"> ClientProtos.Authorizations.Builder builder = ClientProtos.Authorizations.newBuilder();</span>
<span class="source-line-no">2372</span><span id="line-2372"> ClientProtos.Authorizations proto = null;</span>
<span class="source-line-no">2373</span><span id="line-2373"> try {</span>
<span class="source-line-no">2374</span><span id="line-2374"> ProtobufUtil.mergeFrom(builder, protoBytes);</span>
<span class="source-line-no">2375</span><span id="line-2375"> proto = builder.build();</span>
<span class="source-line-no">2376</span><span id="line-2376"> } catch (IOException e) {</span>
<span class="source-line-no">2377</span><span id="line-2377"> throw new DeserializationException(e);</span>
<span class="source-line-no">2378</span><span id="line-2378"> }</span>
<span class="source-line-no">2379</span><span id="line-2379"> return toAuthorizations(proto);</span>
<span class="source-line-no">2380</span><span id="line-2380"> }</span>
<span class="source-line-no">2381</span><span id="line-2381"></span>
<span class="source-line-no">2382</span><span id="line-2382"> /**</span>
<span class="source-line-no">2383</span><span id="line-2383"> * Create a protocol buffer Authorizations based on a client Authorizations.</span>
<span class="source-line-no">2384</span><span id="line-2384"> * @return a protocol buffer Authorizations</span>
<span class="source-line-no">2385</span><span id="line-2385"> */</span>
<span class="source-line-no">2386</span><span id="line-2386"> public static ClientProtos.Authorizations toAuthorizations(Authorizations authorizations) {</span>
<span class="source-line-no">2387</span><span id="line-2387"> ClientProtos.Authorizations.Builder builder = ClientProtos.Authorizations.newBuilder();</span>
<span class="source-line-no">2388</span><span id="line-2388"> for (String label : authorizations.getLabels()) {</span>
<span class="source-line-no">2389</span><span id="line-2389"> builder.addLabel(label);</span>
<span class="source-line-no">2390</span><span id="line-2390"> }</span>
<span class="source-line-no">2391</span><span id="line-2391"> return builder.build();</span>
<span class="source-line-no">2392</span><span id="line-2392"> }</span>
<span class="source-line-no">2393</span><span id="line-2393"></span>
<span class="source-line-no">2394</span><span id="line-2394"> /**</span>
<span class="source-line-no">2395</span><span id="line-2395"> * Convert a protocol buffer TimeUnit to a client TimeUnit</span>
<span class="source-line-no">2396</span><span id="line-2396"> * @return the converted client TimeUnit</span>
<span class="source-line-no">2397</span><span id="line-2397"> */</span>
<span class="source-line-no">2398</span><span id="line-2398"> public static TimeUnit toTimeUnit(final HBaseProtos.TimeUnit proto) {</span>
<span class="source-line-no">2399</span><span id="line-2399"> switch (proto) {</span>
<span class="source-line-no">2400</span><span id="line-2400"> case NANOSECONDS:</span>
<span class="source-line-no">2401</span><span id="line-2401"> return TimeUnit.NANOSECONDS;</span>
<span class="source-line-no">2402</span><span id="line-2402"> case MICROSECONDS:</span>
<span class="source-line-no">2403</span><span id="line-2403"> return TimeUnit.MICROSECONDS;</span>
<span class="source-line-no">2404</span><span id="line-2404"> case MILLISECONDS:</span>
<span class="source-line-no">2405</span><span id="line-2405"> return TimeUnit.MILLISECONDS;</span>
<span class="source-line-no">2406</span><span id="line-2406"> case SECONDS:</span>
<span class="source-line-no">2407</span><span id="line-2407"> return TimeUnit.SECONDS;</span>
<span class="source-line-no">2408</span><span id="line-2408"> case MINUTES:</span>
<span class="source-line-no">2409</span><span id="line-2409"> return TimeUnit.MINUTES;</span>
<span class="source-line-no">2410</span><span id="line-2410"> case HOURS:</span>
<span class="source-line-no">2411</span><span id="line-2411"> return TimeUnit.HOURS;</span>
<span class="source-line-no">2412</span><span id="line-2412"> case DAYS:</span>
<span class="source-line-no">2413</span><span id="line-2413"> return TimeUnit.DAYS;</span>
<span class="source-line-no">2414</span><span id="line-2414"> }</span>
<span class="source-line-no">2415</span><span id="line-2415"> throw new RuntimeException("Invalid TimeUnit " + proto);</span>
<span class="source-line-no">2416</span><span id="line-2416"> }</span>
<span class="source-line-no">2417</span><span id="line-2417"></span>
<span class="source-line-no">2418</span><span id="line-2418"> /**</span>
<span class="source-line-no">2419</span><span id="line-2419"> * Convert a client TimeUnit to a protocol buffer TimeUnit</span>
<span class="source-line-no">2420</span><span id="line-2420"> * @return the converted protocol buffer TimeUnit</span>
<span class="source-line-no">2421</span><span id="line-2421"> */</span>
<span class="source-line-no">2422</span><span id="line-2422"> public static HBaseProtos.TimeUnit toProtoTimeUnit(final TimeUnit timeUnit) {</span>
<span class="source-line-no">2423</span><span id="line-2423"> switch (timeUnit) {</span>
<span class="source-line-no">2424</span><span id="line-2424"> case NANOSECONDS:</span>
<span class="source-line-no">2425</span><span id="line-2425"> return HBaseProtos.TimeUnit.NANOSECONDS;</span>
<span class="source-line-no">2426</span><span id="line-2426"> case MICROSECONDS:</span>
<span class="source-line-no">2427</span><span id="line-2427"> return HBaseProtos.TimeUnit.MICROSECONDS;</span>
<span class="source-line-no">2428</span><span id="line-2428"> case MILLISECONDS:</span>
<span class="source-line-no">2429</span><span id="line-2429"> return HBaseProtos.TimeUnit.MILLISECONDS;</span>
<span class="source-line-no">2430</span><span id="line-2430"> case SECONDS:</span>
<span class="source-line-no">2431</span><span id="line-2431"> return HBaseProtos.TimeUnit.SECONDS;</span>
<span class="source-line-no">2432</span><span id="line-2432"> case MINUTES:</span>
<span class="source-line-no">2433</span><span id="line-2433"> return HBaseProtos.TimeUnit.MINUTES;</span>
<span class="source-line-no">2434</span><span id="line-2434"> case HOURS:</span>
<span class="source-line-no">2435</span><span id="line-2435"> return HBaseProtos.TimeUnit.HOURS;</span>
<span class="source-line-no">2436</span><span id="line-2436"> case DAYS:</span>
<span class="source-line-no">2437</span><span id="line-2437"> return HBaseProtos.TimeUnit.DAYS;</span>
<span class="source-line-no">2438</span><span id="line-2438"> }</span>
<span class="source-line-no">2439</span><span id="line-2439"> throw new RuntimeException("Invalid TimeUnit " + timeUnit);</span>
<span class="source-line-no">2440</span><span id="line-2440"> }</span>
<span class="source-line-no">2441</span><span id="line-2441"></span>
<span class="source-line-no">2442</span><span id="line-2442"> /**</span>
<span class="source-line-no">2443</span><span id="line-2443"> * Convert a protocol buffer ThrottleType to a client ThrottleType</span>
<span class="source-line-no">2444</span><span id="line-2444"> * @return the converted client ThrottleType</span>
<span class="source-line-no">2445</span><span id="line-2445"> */</span>
<span class="source-line-no">2446</span><span id="line-2446"> public static ThrottleType toThrottleType(final QuotaProtos.ThrottleType proto) {</span>
<span class="source-line-no">2447</span><span id="line-2447"> switch (proto) {</span>
<span class="source-line-no">2448</span><span id="line-2448"> case REQUEST_NUMBER:</span>
<span class="source-line-no">2449</span><span id="line-2449"> return ThrottleType.REQUEST_NUMBER;</span>
<span class="source-line-no">2450</span><span id="line-2450"> case REQUEST_SIZE:</span>
<span class="source-line-no">2451</span><span id="line-2451"> return ThrottleType.REQUEST_SIZE;</span>
<span class="source-line-no">2452</span><span id="line-2452"> case REQUEST_CAPACITY_UNIT:</span>
<span class="source-line-no">2453</span><span id="line-2453"> return ThrottleType.REQUEST_CAPACITY_UNIT;</span>
<span class="source-line-no">2454</span><span id="line-2454"> case WRITE_NUMBER:</span>
<span class="source-line-no">2455</span><span id="line-2455"> return ThrottleType.WRITE_NUMBER;</span>
<span class="source-line-no">2456</span><span id="line-2456"> case WRITE_SIZE:</span>
<span class="source-line-no">2457</span><span id="line-2457"> return ThrottleType.WRITE_SIZE;</span>
<span class="source-line-no">2458</span><span id="line-2458"> case READ_NUMBER:</span>
<span class="source-line-no">2459</span><span id="line-2459"> return ThrottleType.READ_NUMBER;</span>
<span class="source-line-no">2460</span><span id="line-2460"> case READ_SIZE:</span>
<span class="source-line-no">2461</span><span id="line-2461"> return ThrottleType.READ_SIZE;</span>
<span class="source-line-no">2462</span><span id="line-2462"> case READ_CAPACITY_UNIT:</span>
<span class="source-line-no">2463</span><span id="line-2463"> return ThrottleType.READ_CAPACITY_UNIT;</span>
<span class="source-line-no">2464</span><span id="line-2464"> case WRITE_CAPACITY_UNIT:</span>
<span class="source-line-no">2465</span><span id="line-2465"> return ThrottleType.WRITE_CAPACITY_UNIT;</span>
<span class="source-line-no">2466</span><span id="line-2466"> default:</span>
<span class="source-line-no">2467</span><span id="line-2467"> throw new RuntimeException("Invalid ThrottleType " + proto);</span>
<span class="source-line-no">2468</span><span id="line-2468"> }</span>
<span class="source-line-no">2469</span><span id="line-2469"> }</span>
<span class="source-line-no">2470</span><span id="line-2470"></span>
<span class="source-line-no">2471</span><span id="line-2471"> /**</span>
<span class="source-line-no">2472</span><span id="line-2472"> * Convert a client ThrottleType to a protocol buffer ThrottleType</span>
<span class="source-line-no">2473</span><span id="line-2473"> * @return the converted protocol buffer ThrottleType</span>
<span class="source-line-no">2474</span><span id="line-2474"> */</span>
<span class="source-line-no">2475</span><span id="line-2475"> public static QuotaProtos.ThrottleType toProtoThrottleType(final ThrottleType type) {</span>
<span class="source-line-no">2476</span><span id="line-2476"> switch (type) {</span>
<span class="source-line-no">2477</span><span id="line-2477"> case REQUEST_NUMBER:</span>
<span class="source-line-no">2478</span><span id="line-2478"> return QuotaProtos.ThrottleType.REQUEST_NUMBER;</span>
<span class="source-line-no">2479</span><span id="line-2479"> case REQUEST_SIZE:</span>
<span class="source-line-no">2480</span><span id="line-2480"> return QuotaProtos.ThrottleType.REQUEST_SIZE;</span>
<span class="source-line-no">2481</span><span id="line-2481"> case WRITE_NUMBER:</span>
<span class="source-line-no">2482</span><span id="line-2482"> return QuotaProtos.ThrottleType.WRITE_NUMBER;</span>
<span class="source-line-no">2483</span><span id="line-2483"> case WRITE_SIZE:</span>
<span class="source-line-no">2484</span><span id="line-2484"> return QuotaProtos.ThrottleType.WRITE_SIZE;</span>
<span class="source-line-no">2485</span><span id="line-2485"> case READ_NUMBER:</span>
<span class="source-line-no">2486</span><span id="line-2486"> return QuotaProtos.ThrottleType.READ_NUMBER;</span>
<span class="source-line-no">2487</span><span id="line-2487"> case READ_SIZE:</span>
<span class="source-line-no">2488</span><span id="line-2488"> return QuotaProtos.ThrottleType.READ_SIZE;</span>
<span class="source-line-no">2489</span><span id="line-2489"> case REQUEST_CAPACITY_UNIT:</span>
<span class="source-line-no">2490</span><span id="line-2490"> return QuotaProtos.ThrottleType.REQUEST_CAPACITY_UNIT;</span>
<span class="source-line-no">2491</span><span id="line-2491"> case READ_CAPACITY_UNIT:</span>
<span class="source-line-no">2492</span><span id="line-2492"> return QuotaProtos.ThrottleType.READ_CAPACITY_UNIT;</span>
<span class="source-line-no">2493</span><span id="line-2493"> case WRITE_CAPACITY_UNIT:</span>
<span class="source-line-no">2494</span><span id="line-2494"> return QuotaProtos.ThrottleType.WRITE_CAPACITY_UNIT;</span>
<span class="source-line-no">2495</span><span id="line-2495"> default:</span>
<span class="source-line-no">2496</span><span id="line-2496"> throw new RuntimeException("Invalid ThrottleType " + type);</span>
<span class="source-line-no">2497</span><span id="line-2497"> }</span>
<span class="source-line-no">2498</span><span id="line-2498"> }</span>
<span class="source-line-no">2499</span><span id="line-2499"></span>
<span class="source-line-no">2500</span><span id="line-2500"> /**</span>
<span class="source-line-no">2501</span><span id="line-2501"> * Convert a protocol buffer QuotaScope to a client QuotaScope</span>
<span class="source-line-no">2502</span><span id="line-2502"> * @return the converted client QuotaScope</span>
<span class="source-line-no">2503</span><span id="line-2503"> */</span>
<span class="source-line-no">2504</span><span id="line-2504"> public static QuotaScope toQuotaScope(final QuotaProtos.QuotaScope proto) {</span>
<span class="source-line-no">2505</span><span id="line-2505"> switch (proto) {</span>
<span class="source-line-no">2506</span><span id="line-2506"> case CLUSTER:</span>
<span class="source-line-no">2507</span><span id="line-2507"> return QuotaScope.CLUSTER;</span>
<span class="source-line-no">2508</span><span id="line-2508"> case MACHINE:</span>
<span class="source-line-no">2509</span><span id="line-2509"> return QuotaScope.MACHINE;</span>
<span class="source-line-no">2510</span><span id="line-2510"> }</span>
<span class="source-line-no">2511</span><span id="line-2511"> throw new RuntimeException("Invalid QuotaScope " + proto);</span>
<span class="source-line-no">2512</span><span id="line-2512"> }</span>
<span class="source-line-no">2513</span><span id="line-2513"></span>
<span class="source-line-no">2514</span><span id="line-2514"> /**</span>
<span class="source-line-no">2515</span><span id="line-2515"> * Convert a client QuotaScope to a protocol buffer QuotaScope</span>
<span class="source-line-no">2516</span><span id="line-2516"> * @return the converted protocol buffer QuotaScope</span>
<span class="source-line-no">2517</span><span id="line-2517"> */</span>
<span class="source-line-no">2518</span><span id="line-2518"> public static QuotaProtos.QuotaScope toProtoQuotaScope(final QuotaScope scope) {</span>
<span class="source-line-no">2519</span><span id="line-2519"> switch (scope) {</span>
<span class="source-line-no">2520</span><span id="line-2520"> case CLUSTER:</span>
<span class="source-line-no">2521</span><span id="line-2521"> return QuotaProtos.QuotaScope.CLUSTER;</span>
<span class="source-line-no">2522</span><span id="line-2522"> case MACHINE:</span>
<span class="source-line-no">2523</span><span id="line-2523"> return QuotaProtos.QuotaScope.MACHINE;</span>
<span class="source-line-no">2524</span><span id="line-2524"> }</span>
<span class="source-line-no">2525</span><span id="line-2525"> throw new RuntimeException("Invalid QuotaScope " + scope);</span>
<span class="source-line-no">2526</span><span id="line-2526"> }</span>
<span class="source-line-no">2527</span><span id="line-2527"></span>
<span class="source-line-no">2528</span><span id="line-2528"> /**</span>
<span class="source-line-no">2529</span><span id="line-2529"> * Convert a protocol buffer QuotaType to a client QuotaType</span>
<span class="source-line-no">2530</span><span id="line-2530"> * @return the converted client QuotaType</span>
<span class="source-line-no">2531</span><span id="line-2531"> */</span>
<span class="source-line-no">2532</span><span id="line-2532"> public static QuotaType toQuotaScope(final QuotaProtos.QuotaType proto) {</span>
<span class="source-line-no">2533</span><span id="line-2533"> switch (proto) {</span>
<span class="source-line-no">2534</span><span id="line-2534"> case THROTTLE:</span>
<span class="source-line-no">2535</span><span id="line-2535"> return QuotaType.THROTTLE;</span>
<span class="source-line-no">2536</span><span id="line-2536"> case SPACE:</span>
<span class="source-line-no">2537</span><span id="line-2537"> return QuotaType.SPACE;</span>
<span class="source-line-no">2538</span><span id="line-2538"> }</span>
<span class="source-line-no">2539</span><span id="line-2539"> throw new RuntimeException("Invalid QuotaType " + proto);</span>
<span class="source-line-no">2540</span><span id="line-2540"> }</span>
<span class="source-line-no">2541</span><span id="line-2541"></span>
<span class="source-line-no">2542</span><span id="line-2542"> /**</span>
<span class="source-line-no">2543</span><span id="line-2543"> * Convert a client QuotaType to a protocol buffer QuotaType</span>
<span class="source-line-no">2544</span><span id="line-2544"> * @return the converted protocol buffer QuotaType</span>
<span class="source-line-no">2545</span><span id="line-2545"> */</span>
<span class="source-line-no">2546</span><span id="line-2546"> public static QuotaProtos.QuotaType toProtoQuotaScope(final QuotaType type) {</span>
<span class="source-line-no">2547</span><span id="line-2547"> switch (type) {</span>
<span class="source-line-no">2548</span><span id="line-2548"> case THROTTLE:</span>
<span class="source-line-no">2549</span><span id="line-2549"> return QuotaProtos.QuotaType.THROTTLE;</span>
<span class="source-line-no">2550</span><span id="line-2550"> case SPACE:</span>
<span class="source-line-no">2551</span><span id="line-2551"> return QuotaProtos.QuotaType.SPACE;</span>
<span class="source-line-no">2552</span><span id="line-2552"> default:</span>
<span class="source-line-no">2553</span><span id="line-2553"> throw new RuntimeException("Invalid QuotaType " + type);</span>
<span class="source-line-no">2554</span><span id="line-2554"> }</span>
<span class="source-line-no">2555</span><span id="line-2555"> }</span>
<span class="source-line-no">2556</span><span id="line-2556"></span>
<span class="source-line-no">2557</span><span id="line-2557"> /**</span>
<span class="source-line-no">2558</span><span id="line-2558"> * Converts a protocol buffer SpaceViolationPolicy to a client SpaceViolationPolicy.</span>
<span class="source-line-no">2559</span><span id="line-2559"> * @param proto The protocol buffer space violation policy.</span>
<span class="source-line-no">2560</span><span id="line-2560"> * @return The corresponding client SpaceViolationPolicy.</span>
<span class="source-line-no">2561</span><span id="line-2561"> */</span>
<span class="source-line-no">2562</span><span id="line-2562"> public static SpaceViolationPolicy</span>
<span class="source-line-no">2563</span><span id="line-2563"> toViolationPolicy(final QuotaProtos.SpaceViolationPolicy proto) {</span>
<span class="source-line-no">2564</span><span id="line-2564"> switch (proto) {</span>
<span class="source-line-no">2565</span><span id="line-2565"> case DISABLE:</span>
<span class="source-line-no">2566</span><span id="line-2566"> return SpaceViolationPolicy.DISABLE;</span>
<span class="source-line-no">2567</span><span id="line-2567"> case NO_WRITES_COMPACTIONS:</span>
<span class="source-line-no">2568</span><span id="line-2568"> return SpaceViolationPolicy.NO_WRITES_COMPACTIONS;</span>
<span class="source-line-no">2569</span><span id="line-2569"> case NO_WRITES:</span>
<span class="source-line-no">2570</span><span id="line-2570"> return SpaceViolationPolicy.NO_WRITES;</span>
<span class="source-line-no">2571</span><span id="line-2571"> case NO_INSERTS:</span>
<span class="source-line-no">2572</span><span id="line-2572"> return SpaceViolationPolicy.NO_INSERTS;</span>
<span class="source-line-no">2573</span><span id="line-2573"> }</span>
<span class="source-line-no">2574</span><span id="line-2574"> throw new RuntimeException("Invalid SpaceViolationPolicy " + proto);</span>
<span class="source-line-no">2575</span><span id="line-2575"> }</span>
<span class="source-line-no">2576</span><span id="line-2576"></span>
<span class="source-line-no">2577</span><span id="line-2577"> /**</span>
<span class="source-line-no">2578</span><span id="line-2578"> * Converts a client SpaceViolationPolicy to a protocol buffer SpaceViolationPolicy.</span>
<span class="source-line-no">2579</span><span id="line-2579"> * @param policy The client SpaceViolationPolicy object.</span>
<span class="source-line-no">2580</span><span id="line-2580"> * @return The corresponding protocol buffer SpaceViolationPolicy.</span>
<span class="source-line-no">2581</span><span id="line-2581"> */</span>
<span class="source-line-no">2582</span><span id="line-2582"> public static QuotaProtos.SpaceViolationPolicy</span>
<span class="source-line-no">2583</span><span id="line-2583"> toProtoViolationPolicy(final SpaceViolationPolicy policy) {</span>
<span class="source-line-no">2584</span><span id="line-2584"> switch (policy) {</span>
<span class="source-line-no">2585</span><span id="line-2585"> case DISABLE:</span>
<span class="source-line-no">2586</span><span id="line-2586"> return QuotaProtos.SpaceViolationPolicy.DISABLE;</span>
<span class="source-line-no">2587</span><span id="line-2587"> case NO_WRITES_COMPACTIONS:</span>
<span class="source-line-no">2588</span><span id="line-2588"> return QuotaProtos.SpaceViolationPolicy.NO_WRITES_COMPACTIONS;</span>
<span class="source-line-no">2589</span><span id="line-2589"> case NO_WRITES:</span>
<span class="source-line-no">2590</span><span id="line-2590"> return QuotaProtos.SpaceViolationPolicy.NO_WRITES;</span>
<span class="source-line-no">2591</span><span id="line-2591"> case NO_INSERTS:</span>
<span class="source-line-no">2592</span><span id="line-2592"> return QuotaProtos.SpaceViolationPolicy.NO_INSERTS;</span>
<span class="source-line-no">2593</span><span id="line-2593"> }</span>
<span class="source-line-no">2594</span><span id="line-2594"> throw new RuntimeException("Invalid SpaceViolationPolicy " + policy);</span>
<span class="source-line-no">2595</span><span id="line-2595"> }</span>
<span class="source-line-no">2596</span><span id="line-2596"></span>
<span class="source-line-no">2597</span><span id="line-2597"> /**</span>
<span class="source-line-no">2598</span><span id="line-2598"> * Build a protocol buffer TimedQuota</span>
<span class="source-line-no">2599</span><span id="line-2599"> * @param limit the allowed number of request/data per timeUnit</span>
<span class="source-line-no">2600</span><span id="line-2600"> * @param timeUnit the limit time unit</span>
<span class="source-line-no">2601</span><span id="line-2601"> * @param scope the quota scope</span>
<span class="source-line-no">2602</span><span id="line-2602"> * @return the protocol buffer TimedQuota</span>
<span class="source-line-no">2603</span><span id="line-2603"> */</span>
<span class="source-line-no">2604</span><span id="line-2604"> public static QuotaProtos.TimedQuota toTimedQuota(final long limit, final TimeUnit timeUnit,</span>
<span class="source-line-no">2605</span><span id="line-2605"> final QuotaScope scope) {</span>
<span class="source-line-no">2606</span><span id="line-2606"> return QuotaProtos.TimedQuota.newBuilder().setSoftLimit(limit)</span>
<span class="source-line-no">2607</span><span id="line-2607"> .setTimeUnit(toProtoTimeUnit(timeUnit)).setScope(toProtoQuotaScope(scope)).build();</span>
<span class="source-line-no">2608</span><span id="line-2608"> }</span>
<span class="source-line-no">2609</span><span id="line-2609"></span>
<span class="source-line-no">2610</span><span id="line-2610"> /**</span>
<span class="source-line-no">2611</span><span id="line-2611"> * Builds a protocol buffer SpaceQuota.</span>
<span class="source-line-no">2612</span><span id="line-2612"> * @param limit The maximum space usage for the quota in bytes.</span>
<span class="source-line-no">2613</span><span id="line-2613"> * @param violationPolicy The policy to apply when the quota is violated.</span>
<span class="source-line-no">2614</span><span id="line-2614"> * @return The protocol buffer SpaceQuota.</span>
<span class="source-line-no">2615</span><span id="line-2615"> */</span>
<span class="source-line-no">2616</span><span id="line-2616"> public static QuotaProtos.SpaceQuota toProtoSpaceQuota(final long limit,</span>
<span class="source-line-no">2617</span><span id="line-2617"> final SpaceViolationPolicy violationPolicy) {</span>
<span class="source-line-no">2618</span><span id="line-2618"> return QuotaProtos.SpaceQuota.newBuilder().setSoftLimit(limit)</span>
<span class="source-line-no">2619</span><span id="line-2619"> .setViolationPolicy(toProtoViolationPolicy(violationPolicy)).build();</span>
<span class="source-line-no">2620</span><span id="line-2620"> }</span>
<span class="source-line-no">2621</span><span id="line-2621"></span>
<span class="source-line-no">2622</span><span id="line-2622"> /**</span>
<span class="source-line-no">2623</span><span id="line-2623"> * Generates a marker for the WAL so that we propagate the notion of a bulk region load throughout</span>
<span class="source-line-no">2624</span><span id="line-2624"> * the WAL.</span>
<span class="source-line-no">2625</span><span id="line-2625"> * @param tableName The tableName into which the bulk load is being imported into.</span>
<span class="source-line-no">2626</span><span id="line-2626"> * @param encodedRegionName Encoded region name of the region which is being bulk loaded.</span>
<span class="source-line-no">2627</span><span id="line-2627"> * @param storeFiles A set of store files of a column family are bulk loaded.</span>
<span class="source-line-no">2628</span><span id="line-2628"> * @param storeFilesSize Map of store files and their lengths</span>
<span class="source-line-no">2629</span><span id="line-2629"> * @param bulkloadSeqId sequence ID (by a force flush) used to create bulk load hfile name</span>
<span class="source-line-no">2630</span><span id="line-2630"> * @return The WAL log marker for bulk loads.</span>
<span class="source-line-no">2631</span><span id="line-2631"> */</span>
<span class="source-line-no">2632</span><span id="line-2632"> public static WALProtos.BulkLoadDescriptor toBulkLoadDescriptor(TableName tableName,</span>
<span class="source-line-no">2633</span><span id="line-2633"> ByteString encodedRegionName, Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles,</span>
<span class="source-line-no">2634</span><span id="line-2634"> Map&lt;String, Long&gt; storeFilesSize, long bulkloadSeqId) {</span>
<span class="source-line-no">2635</span><span id="line-2635"> return toBulkLoadDescriptor(tableName, encodedRegionName, storeFiles, storeFilesSize,</span>
<span class="source-line-no">2636</span><span id="line-2636"> bulkloadSeqId, null, true);</span>
<span class="source-line-no">2637</span><span id="line-2637"> }</span>
<span class="source-line-no">2638</span><span id="line-2638"></span>
<span class="source-line-no">2639</span><span id="line-2639"> public static WALProtos.BulkLoadDescriptor toBulkLoadDescriptor(TableName tableName,</span>
<span class="source-line-no">2640</span><span id="line-2640"> ByteString encodedRegionName, Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles,</span>
<span class="source-line-no">2641</span><span id="line-2641"> Map&lt;String, Long&gt; storeFilesSize, long bulkloadSeqId, List&lt;String&gt; clusterIds,</span>
<span class="source-line-no">2642</span><span id="line-2642"> boolean replicate) {</span>
<span class="source-line-no">2643</span><span id="line-2643"> BulkLoadDescriptor.Builder desc =</span>
<span class="source-line-no">2644</span><span id="line-2644"> BulkLoadDescriptor.newBuilder().setTableName(ProtobufUtil.toProtoTableName(tableName))</span>
<span class="source-line-no">2645</span><span id="line-2645"> .setEncodedRegionName(encodedRegionName).setBulkloadSeqNum(bulkloadSeqId)</span>
<span class="source-line-no">2646</span><span id="line-2646"> .setReplicate(replicate);</span>
<span class="source-line-no">2647</span><span id="line-2647"> if (clusterIds != null) {</span>
<span class="source-line-no">2648</span><span id="line-2648"> desc.addAllClusterIds(clusterIds);</span>
<span class="source-line-no">2649</span><span id="line-2649"> }</span>
<span class="source-line-no">2650</span><span id="line-2650"></span>
<span class="source-line-no">2651</span><span id="line-2651"> for (Map.Entry&lt;byte[], List&lt;Path&gt;&gt; entry : storeFiles.entrySet()) {</span>
<span class="source-line-no">2652</span><span id="line-2652"> WALProtos.StoreDescriptor.Builder builder =</span>
<span class="source-line-no">2653</span><span id="line-2653"> StoreDescriptor.newBuilder().setFamilyName(UnsafeByteOperations.unsafeWrap(entry.getKey()))</span>
<span class="source-line-no">2654</span><span id="line-2654"> .setStoreHomeDir(Bytes.toString(entry.getKey())); // relative to region</span>
<span class="source-line-no">2655</span><span id="line-2655"> for (Path path : entry.getValue()) {</span>
<span class="source-line-no">2656</span><span id="line-2656"> String name = path.getName();</span>
<span class="source-line-no">2657</span><span id="line-2657"> builder.addStoreFile(name);</span>
<span class="source-line-no">2658</span><span id="line-2658"> Long size = storeFilesSize.get(name) == null ? (Long) 0L : storeFilesSize.get(name);</span>
<span class="source-line-no">2659</span><span id="line-2659"> builder.setStoreFileSizeBytes(size);</span>
<span class="source-line-no">2660</span><span id="line-2660"> }</span>
<span class="source-line-no">2661</span><span id="line-2661"> desc.addStores(builder);</span>
<span class="source-line-no">2662</span><span id="line-2662"> }</span>
<span class="source-line-no">2663</span><span id="line-2663"></span>
<span class="source-line-no">2664</span><span id="line-2664"> return desc.build();</span>
<span class="source-line-no">2665</span><span id="line-2665"> }</span>
<span class="source-line-no">2666</span><span id="line-2666"></span>
<span class="source-line-no">2667</span><span id="line-2667"> /**</span>
<span class="source-line-no">2668</span><span id="line-2668"> * This version of protobuf's mergeDelimitedFrom avoid the hard-coded 64MB limit for decoding</span>
<span class="source-line-no">2669</span><span id="line-2669"> * buffers</span>
<span class="source-line-no">2670</span><span id="line-2670"> * @param builder current message builder</span>
<span class="source-line-no">2671</span><span id="line-2671"> * @param in Inputsream with delimited protobuf data</span>
<span class="source-line-no">2672</span><span id="line-2672"> */</span>
<span class="source-line-no">2673</span><span id="line-2673"> public static void mergeDelimitedFrom(Message.Builder builder, InputStream in)</span>
<span class="source-line-no">2674</span><span id="line-2674"> throws IOException {</span>
<span class="source-line-no">2675</span><span id="line-2675"> // This used to be builder.mergeDelimitedFrom(in);</span>
<span class="source-line-no">2676</span><span id="line-2676"> // but is replaced to allow us to bump the protobuf size limit.</span>
<span class="source-line-no">2677</span><span id="line-2677"> final int firstByte = in.read();</span>
<span class="source-line-no">2678</span><span id="line-2678"> if (firstByte != -1) {</span>
<span class="source-line-no">2679</span><span id="line-2679"> final int size = CodedInputStream.readRawVarint32(firstByte, in);</span>
<span class="source-line-no">2680</span><span id="line-2680"> final InputStream limitedInput = ByteStreams.limit(in, size);</span>
<span class="source-line-no">2681</span><span id="line-2681"> final CodedInputStream codedInput = CodedInputStream.newInstance(limitedInput);</span>
<span class="source-line-no">2682</span><span id="line-2682"> codedInput.setSizeLimit(size);</span>
<span class="source-line-no">2683</span><span id="line-2683"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2684</span><span id="line-2684"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2685</span><span id="line-2685"> }</span>
<span class="source-line-no">2686</span><span id="line-2686"> }</span>
<span class="source-line-no">2687</span><span id="line-2687"></span>
<span class="source-line-no">2688</span><span id="line-2688"> /**</span>
<span class="source-line-no">2689</span><span id="line-2689"> * This version of protobuf's mergeFrom avoids the hard-coded 64MB limit for decoding buffers</span>
<span class="source-line-no">2690</span><span id="line-2690"> * where the message size is known</span>
<span class="source-line-no">2691</span><span id="line-2691"> * @param builder current message builder</span>
<span class="source-line-no">2692</span><span id="line-2692"> * @param in InputStream containing protobuf data</span>
<span class="source-line-no">2693</span><span id="line-2693"> * @param size known size of protobuf data</span>
<span class="source-line-no">2694</span><span id="line-2694"> */</span>
<span class="source-line-no">2695</span><span id="line-2695"> public static void mergeFrom(Message.Builder builder, InputStream in, int size)</span>
<span class="source-line-no">2696</span><span id="line-2696"> throws IOException {</span>
<span class="source-line-no">2697</span><span id="line-2697"> final CodedInputStream codedInput = CodedInputStream.newInstance(in);</span>
<span class="source-line-no">2698</span><span id="line-2698"> codedInput.setSizeLimit(size);</span>
<span class="source-line-no">2699</span><span id="line-2699"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2700</span><span id="line-2700"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2701</span><span id="line-2701"> }</span>
<span class="source-line-no">2702</span><span id="line-2702"></span>
<span class="source-line-no">2703</span><span id="line-2703"> /**</span>
<span class="source-line-no">2704</span><span id="line-2704"> * This version of protobuf's mergeFrom avoids the hard-coded 64MB limit for decoding buffers</span>
<span class="source-line-no">2705</span><span id="line-2705"> * where the message size is not known</span>
<span class="source-line-no">2706</span><span id="line-2706"> * @param builder current message builder</span>
<span class="source-line-no">2707</span><span id="line-2707"> * @param in InputStream containing protobuf data</span>
<span class="source-line-no">2708</span><span id="line-2708"> */</span>
<span class="source-line-no">2709</span><span id="line-2709"> public static void mergeFrom(Message.Builder builder, InputStream in) throws IOException {</span>
<span class="source-line-no">2710</span><span id="line-2710"> final CodedInputStream codedInput = CodedInputStream.newInstance(in);</span>
<span class="source-line-no">2711</span><span id="line-2711"> codedInput.setSizeLimit(Integer.MAX_VALUE);</span>
<span class="source-line-no">2712</span><span id="line-2712"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2713</span><span id="line-2713"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2714</span><span id="line-2714"> }</span>
<span class="source-line-no">2715</span><span id="line-2715"></span>
<span class="source-line-no">2716</span><span id="line-2716"> /**</span>
<span class="source-line-no">2717</span><span id="line-2717"> * This version of protobuf's mergeFrom avoids the hard-coded 64MB limit for decoding buffers when</span>
<span class="source-line-no">2718</span><span id="line-2718"> * working with ByteStrings</span>
<span class="source-line-no">2719</span><span id="line-2719"> * @param builder current message builder</span>
<span class="source-line-no">2720</span><span id="line-2720"> * @param bs ByteString containing the</span>
<span class="source-line-no">2721</span><span id="line-2721"> */</span>
<span class="source-line-no">2722</span><span id="line-2722"> public static void mergeFrom(Message.Builder builder, ByteString bs) throws IOException {</span>
<span class="source-line-no">2723</span><span id="line-2723"> final CodedInputStream codedInput = bs.newCodedInput();</span>
<span class="source-line-no">2724</span><span id="line-2724"> codedInput.setSizeLimit(bs.size());</span>
<span class="source-line-no">2725</span><span id="line-2725"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2726</span><span id="line-2726"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2727</span><span id="line-2727"> }</span>
<span class="source-line-no">2728</span><span id="line-2728"></span>
<span class="source-line-no">2729</span><span id="line-2729"> /**</span>
<span class="source-line-no">2730</span><span id="line-2730"> * This version of protobuf's mergeFrom avoids the hard-coded 64MB limit for decoding buffers when</span>
<span class="source-line-no">2731</span><span id="line-2731"> * working with byte arrays</span>
<span class="source-line-no">2732</span><span id="line-2732"> * @param builder current message builder</span>
<span class="source-line-no">2733</span><span id="line-2733"> * @param b byte array</span>
<span class="source-line-no">2734</span><span id="line-2734"> */</span>
<span class="source-line-no">2735</span><span id="line-2735"> public static void mergeFrom(Message.Builder builder, byte[] b) throws IOException {</span>
<span class="source-line-no">2736</span><span id="line-2736"> final CodedInputStream codedInput = CodedInputStream.newInstance(b);</span>
<span class="source-line-no">2737</span><span id="line-2737"> codedInput.setSizeLimit(b.length);</span>
<span class="source-line-no">2738</span><span id="line-2738"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2739</span><span id="line-2739"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2740</span><span id="line-2740"> }</span>
<span class="source-line-no">2741</span><span id="line-2741"></span>
<span class="source-line-no">2742</span><span id="line-2742"> /**</span>
<span class="source-line-no">2743</span><span id="line-2743"> * This version of protobuf's mergeFrom avoids the hard-coded 64MB limit for decoding buffers when</span>
<span class="source-line-no">2744</span><span id="line-2744"> * working with byte arrays</span>
<span class="source-line-no">2745</span><span id="line-2745"> * @param builder current message builder</span>
<span class="source-line-no">2746</span><span id="line-2746"> * @param b byte array</span>
<span class="source-line-no">2747</span><span id="line-2747"> */</span>
<span class="source-line-no">2748</span><span id="line-2748"> public static void mergeFrom(Message.Builder builder, byte[] b, int offset, int length)</span>
<span class="source-line-no">2749</span><span id="line-2749"> throws IOException {</span>
<span class="source-line-no">2750</span><span id="line-2750"> final CodedInputStream codedInput = CodedInputStream.newInstance(b, offset, length);</span>
<span class="source-line-no">2751</span><span id="line-2751"> codedInput.setSizeLimit(length);</span>
<span class="source-line-no">2752</span><span id="line-2752"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2753</span><span id="line-2753"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2754</span><span id="line-2754"> }</span>
<span class="source-line-no">2755</span><span id="line-2755"></span>
<span class="source-line-no">2756</span><span id="line-2756"> public static void mergeFrom(Message.Builder builder, CodedInputStream codedInput, int length)</span>
<span class="source-line-no">2757</span><span id="line-2757"> throws IOException {</span>
<span class="source-line-no">2758</span><span id="line-2758"> codedInput.resetSizeCounter();</span>
<span class="source-line-no">2759</span><span id="line-2759"> int prevLimit = codedInput.setSizeLimit(length);</span>
<span class="source-line-no">2760</span><span id="line-2760"></span>
<span class="source-line-no">2761</span><span id="line-2761"> int limit = codedInput.pushLimit(length);</span>
<span class="source-line-no">2762</span><span id="line-2762"> builder.mergeFrom(codedInput);</span>
<span class="source-line-no">2763</span><span id="line-2763"> codedInput.popLimit(limit);</span>
<span class="source-line-no">2764</span><span id="line-2764"></span>
<span class="source-line-no">2765</span><span id="line-2765"> codedInput.checkLastTagWas(0);</span>
<span class="source-line-no">2766</span><span id="line-2766"> codedInput.setSizeLimit(prevLimit);</span>
<span class="source-line-no">2767</span><span id="line-2767"> }</span>
<span class="source-line-no">2768</span><span id="line-2768"></span>
<span class="source-line-no">2769</span><span id="line-2769"> public static ReplicationLoadSink</span>
<span class="source-line-no">2770</span><span id="line-2770"> toReplicationLoadSink(ClusterStatusProtos.ReplicationLoadSink rls) {</span>
<span class="source-line-no">2771</span><span id="line-2771"> ReplicationLoadSink.ReplicationLoadSinkBuilder builder = ReplicationLoadSink.newBuilder();</span>
<span class="source-line-no">2772</span><span id="line-2772"> builder.setAgeOfLastAppliedOp(rls.getAgeOfLastAppliedOp())</span>
<span class="source-line-no">2773</span><span id="line-2773"> .setTimestampsOfLastAppliedOp(rls.getTimeStampsOfLastAppliedOp())</span>
<span class="source-line-no">2774</span><span id="line-2774"> .setTimestampStarted(rls.hasTimestampStarted() ? rls.getTimestampStarted() : -1L)</span>
<span class="source-line-no">2775</span><span id="line-2775"> .setTotalOpsProcessed(rls.hasTotalOpsProcessed() ? rls.getTotalOpsProcessed() : -1L);</span>
<span class="source-line-no">2776</span><span id="line-2776"> return builder.build();</span>
<span class="source-line-no">2777</span><span id="line-2777"> }</span>
<span class="source-line-no">2778</span><span id="line-2778"></span>
<span class="source-line-no">2779</span><span id="line-2779"> public static ReplicationLoadSource</span>
<span class="source-line-no">2780</span><span id="line-2780"> toReplicationLoadSource(ClusterStatusProtos.ReplicationLoadSource rls) {</span>
<span class="source-line-no">2781</span><span id="line-2781"> ReplicationLoadSource.ReplicationLoadSourceBuilder builder = ReplicationLoadSource.newBuilder();</span>
<span class="source-line-no">2782</span><span id="line-2782"> builder.setPeerID(rls.getPeerID()).setAgeOfLastShippedOp(rls.getAgeOfLastShippedOp())</span>
<span class="source-line-no">2783</span><span id="line-2783"> .setSizeOfLogQueue(rls.getSizeOfLogQueue())</span>
<span class="source-line-no">2784</span><span id="line-2784"> .setTimestampOfLastShippedOp(rls.getTimeStampOfLastShippedOp())</span>
<span class="source-line-no">2785</span><span id="line-2785"> .setTimeStampOfNextToReplicate(rls.getTimeStampOfNextToReplicate())</span>
<span class="source-line-no">2786</span><span id="line-2786"> .setReplicationLag(rls.getReplicationLag()).setQueueId(rls.getQueueId())</span>
<span class="source-line-no">2787</span><span id="line-2787"> .setRecovered(rls.getRecovered()).setRunning(rls.getRunning())</span>
<span class="source-line-no">2788</span><span id="line-2788"> .setEditsSinceRestart(rls.getEditsSinceRestart()).setEditsRead(rls.getEditsRead())</span>
<span class="source-line-no">2789</span><span id="line-2789"> .setoPsShipped(rls.getOPsShipped());</span>
<span class="source-line-no">2790</span><span id="line-2790"> return builder.build();</span>
<span class="source-line-no">2791</span><span id="line-2791"> }</span>
<span class="source-line-no">2792</span><span id="line-2792"></span>
<span class="source-line-no">2793</span><span id="line-2793"> /**</span>
<span class="source-line-no">2794</span><span id="line-2794"> * Get a protocol buffer VersionInfo</span>
<span class="source-line-no">2795</span><span id="line-2795"> * @return the converted protocol buffer VersionInfo</span>
<span class="source-line-no">2796</span><span id="line-2796"> */</span>
<span class="source-line-no">2797</span><span id="line-2797"> public static HBaseProtos.VersionInfo getVersionInfo() {</span>
<span class="source-line-no">2798</span><span id="line-2798"> HBaseProtos.VersionInfo.Builder builder = HBaseProtos.VersionInfo.newBuilder();</span>
<span class="source-line-no">2799</span><span id="line-2799"> String version = VersionInfo.getVersion();</span>
<span class="source-line-no">2800</span><span id="line-2800"> builder.setVersion(version);</span>
<span class="source-line-no">2801</span><span id="line-2801"> String[] components = version.split("\\.");</span>
<span class="source-line-no">2802</span><span id="line-2802"> if (components != null &amp;&amp; components.length &gt; 2) {</span>
<span class="source-line-no">2803</span><span id="line-2803"> builder.setVersionMajor(Integer.parseInt(components[0]));</span>
<span class="source-line-no">2804</span><span id="line-2804"> builder.setVersionMinor(Integer.parseInt(components[1]));</span>
<span class="source-line-no">2805</span><span id="line-2805"> }</span>
<span class="source-line-no">2806</span><span id="line-2806"> builder.setUrl(VersionInfo.getUrl());</span>
<span class="source-line-no">2807</span><span id="line-2807"> builder.setRevision(VersionInfo.getRevision());</span>
<span class="source-line-no">2808</span><span id="line-2808"> builder.setUser(VersionInfo.getUser());</span>
<span class="source-line-no">2809</span><span id="line-2809"> builder.setDate(VersionInfo.getDate());</span>
<span class="source-line-no">2810</span><span id="line-2810"> builder.setSrcChecksum(VersionInfo.getSrcChecksum());</span>
<span class="source-line-no">2811</span><span id="line-2811"> return builder.build();</span>
<span class="source-line-no">2812</span><span id="line-2812"> }</span>
<span class="source-line-no">2813</span><span id="line-2813"></span>
<span class="source-line-no">2814</span><span id="line-2814"> /**</span>
<span class="source-line-no">2815</span><span id="line-2815"> * Convert SecurityCapabilitiesResponse.Capability to SecurityCapability</span>
<span class="source-line-no">2816</span><span id="line-2816"> * @param capabilities capabilities returned in the SecurityCapabilitiesResponse message</span>
<span class="source-line-no">2817</span><span id="line-2817"> * @return the converted list of SecurityCapability elements</span>
<span class="source-line-no">2818</span><span id="line-2818"> */</span>
<span class="source-line-no">2819</span><span id="line-2819"> public static List&lt;SecurityCapability&gt; toSecurityCapabilityList(</span>
<span class="source-line-no">2820</span><span id="line-2820"> List&lt;MasterProtos.SecurityCapabilitiesResponse.Capability&gt; capabilities) {</span>
<span class="source-line-no">2821</span><span id="line-2821"> List&lt;SecurityCapability&gt; scList = new ArrayList&lt;&gt;(capabilities.size());</span>
<span class="source-line-no">2822</span><span id="line-2822"> for (MasterProtos.SecurityCapabilitiesResponse.Capability c : capabilities) {</span>
<span class="source-line-no">2823</span><span id="line-2823"> try {</span>
<span class="source-line-no">2824</span><span id="line-2824"> scList.add(SecurityCapability.valueOf(c.getNumber()));</span>
<span class="source-line-no">2825</span><span id="line-2825"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">2826</span><span id="line-2826"> // Unknown capability, just ignore it. We don't understand the new capability</span>
<span class="source-line-no">2827</span><span id="line-2827"> // but don't care since by definition we cannot take advantage of it.</span>
<span class="source-line-no">2828</span><span id="line-2828"> }</span>
<span class="source-line-no">2829</span><span id="line-2829"> }</span>
<span class="source-line-no">2830</span><span id="line-2830"> return scList;</span>
<span class="source-line-no">2831</span><span id="line-2831"> }</span>
<span class="source-line-no">2832</span><span id="line-2832"></span>
<span class="source-line-no">2833</span><span id="line-2833"> public static TimeRange toTimeRange(HBaseProtos.TimeRange timeRange) {</span>
<span class="source-line-no">2834</span><span id="line-2834"> if (timeRange == null) {</span>
<span class="source-line-no">2835</span><span id="line-2835"> return TimeRange.allTime();</span>
<span class="source-line-no">2836</span><span id="line-2836"> }</span>
<span class="source-line-no">2837</span><span id="line-2837"> if (timeRange.hasFrom()) {</span>
<span class="source-line-no">2838</span><span id="line-2838"> if (timeRange.hasTo()) {</span>
<span class="source-line-no">2839</span><span id="line-2839"> return TimeRange.between(timeRange.getFrom(), timeRange.getTo());</span>
<span class="source-line-no">2840</span><span id="line-2840"> } else {</span>
<span class="source-line-no">2841</span><span id="line-2841"> return TimeRange.from(timeRange.getFrom());</span>
<span class="source-line-no">2842</span><span id="line-2842"> }</span>
<span class="source-line-no">2843</span><span id="line-2843"> } else {</span>
<span class="source-line-no">2844</span><span id="line-2844"> return TimeRange.until(timeRange.getTo());</span>
<span class="source-line-no">2845</span><span id="line-2845"> }</span>
<span class="source-line-no">2846</span><span id="line-2846"> }</span>
<span class="source-line-no">2847</span><span id="line-2847"></span>
<span class="source-line-no">2848</span><span id="line-2848"> /**</span>
<span class="source-line-no">2849</span><span id="line-2849"> * Converts an ColumnFamilyDescriptor to ColumnFamilySchema</span>
<span class="source-line-no">2850</span><span id="line-2850"> * @param hcd the ColumnFamilySchema</span>
<span class="source-line-no">2851</span><span id="line-2851"> * @return Convert this instance to a the pb column family type</span>
<span class="source-line-no">2852</span><span id="line-2852"> */</span>
<span class="source-line-no">2853</span><span id="line-2853"> public static ColumnFamilySchema toColumnFamilySchema(ColumnFamilyDescriptor hcd) {</span>
<span class="source-line-no">2854</span><span id="line-2854"> ColumnFamilySchema.Builder builder = ColumnFamilySchema.newBuilder();</span>
<span class="source-line-no">2855</span><span id="line-2855"> builder.setName(UnsafeByteOperations.unsafeWrap(hcd.getName()));</span>
<span class="source-line-no">2856</span><span id="line-2856"> for (Map.Entry&lt;Bytes, Bytes&gt; e : hcd.getValues().entrySet()) {</span>
<span class="source-line-no">2857</span><span id="line-2857"> BytesBytesPair.Builder aBuilder = BytesBytesPair.newBuilder();</span>
<span class="source-line-no">2858</span><span id="line-2858"> aBuilder.setFirst(UnsafeByteOperations.unsafeWrap(e.getKey().get()));</span>
<span class="source-line-no">2859</span><span id="line-2859"> aBuilder.setSecond(UnsafeByteOperations.unsafeWrap(e.getValue().get()));</span>
<span class="source-line-no">2860</span><span id="line-2860"> builder.addAttributes(aBuilder.build());</span>
<span class="source-line-no">2861</span><span id="line-2861"> }</span>
<span class="source-line-no">2862</span><span id="line-2862"> for (Map.Entry&lt;String, String&gt; e : hcd.getConfiguration().entrySet()) {</span>
<span class="source-line-no">2863</span><span id="line-2863"> NameStringPair.Builder aBuilder = NameStringPair.newBuilder();</span>
<span class="source-line-no">2864</span><span id="line-2864"> aBuilder.setName(e.getKey());</span>
<span class="source-line-no">2865</span><span id="line-2865"> aBuilder.setValue(e.getValue());</span>
<span class="source-line-no">2866</span><span id="line-2866"> builder.addConfiguration(aBuilder.build());</span>
<span class="source-line-no">2867</span><span id="line-2867"> }</span>
<span class="source-line-no">2868</span><span id="line-2868"> return builder.build();</span>
<span class="source-line-no">2869</span><span id="line-2869"> }</span>
<span class="source-line-no">2870</span><span id="line-2870"></span>
<span class="source-line-no">2871</span><span id="line-2871"> /**</span>
<span class="source-line-no">2872</span><span id="line-2872"> * Converts a ColumnFamilySchema to ColumnFamilyDescriptor</span>
<span class="source-line-no">2873</span><span id="line-2873"> * @param cfs the ColumnFamilySchema</span>
<span class="source-line-no">2874</span><span id="line-2874"> * @return An {@link ColumnFamilyDescriptor} made from the passed in &lt;code&gt;cfs&lt;/code&gt;</span>
<span class="source-line-no">2875</span><span id="line-2875"> */</span>
<span class="source-line-no">2876</span><span id="line-2876"> public static ColumnFamilyDescriptor toColumnFamilyDescriptor(final ColumnFamilySchema cfs) {</span>
<span class="source-line-no">2877</span><span id="line-2877"> // Use the empty constructor so we preserve the initial values set on construction for things</span>
<span class="source-line-no">2878</span><span id="line-2878"> // like maxVersion. Otherwise, we pick up wrong values on deserialization which makes for</span>
<span class="source-line-no">2879</span><span id="line-2879"> // unrelated-looking test failures that are hard to trace back to here.</span>
<span class="source-line-no">2880</span><span id="line-2880"> ColumnFamilyDescriptorBuilder builder =</span>
<span class="source-line-no">2881</span><span id="line-2881"> ColumnFamilyDescriptorBuilder.newBuilder(cfs.getName().toByteArray());</span>
<span class="source-line-no">2882</span><span id="line-2882"> cfs.getAttributesList()</span>
<span class="source-line-no">2883</span><span id="line-2883"> .forEach(a -&gt; builder.setValue(a.getFirst().toByteArray(), a.getSecond().toByteArray()));</span>
<span class="source-line-no">2884</span><span id="line-2884"> cfs.getConfigurationList().forEach(a -&gt; builder.setConfiguration(a.getName(), a.getValue()));</span>
<span class="source-line-no">2885</span><span id="line-2885"> return builder.build();</span>
<span class="source-line-no">2886</span><span id="line-2886"> }</span>
<span class="source-line-no">2887</span><span id="line-2887"></span>
<span class="source-line-no">2888</span><span id="line-2888"> /**</span>
<span class="source-line-no">2889</span><span id="line-2889"> * Converts an TableDescriptor to TableSchema</span>
<span class="source-line-no">2890</span><span id="line-2890"> * @param htd the TableDescriptor</span>
<span class="source-line-no">2891</span><span id="line-2891"> * @return Convert the current {@link TableDescriptor} into a pb TableSchema instance.</span>
<span class="source-line-no">2892</span><span id="line-2892"> */</span>
<span class="source-line-no">2893</span><span id="line-2893"> public static TableSchema toTableSchema(TableDescriptor htd) {</span>
<span class="source-line-no">2894</span><span id="line-2894"> TableSchema.Builder builder = TableSchema.newBuilder();</span>
<span class="source-line-no">2895</span><span id="line-2895"> builder.setTableName(toProtoTableName(htd.getTableName()));</span>
<span class="source-line-no">2896</span><span id="line-2896"> for (Map.Entry&lt;Bytes, Bytes&gt; e : htd.getValues().entrySet()) {</span>
<span class="source-line-no">2897</span><span id="line-2897"> BytesBytesPair.Builder aBuilder = BytesBytesPair.newBuilder();</span>
<span class="source-line-no">2898</span><span id="line-2898"> aBuilder.setFirst(UnsafeByteOperations.unsafeWrap(e.getKey().get()));</span>
<span class="source-line-no">2899</span><span id="line-2899"> aBuilder.setSecond(UnsafeByteOperations.unsafeWrap(e.getValue().get()));</span>
<span class="source-line-no">2900</span><span id="line-2900"> builder.addAttributes(aBuilder.build());</span>
<span class="source-line-no">2901</span><span id="line-2901"> }</span>
<span class="source-line-no">2902</span><span id="line-2902"> for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {</span>
<span class="source-line-no">2903</span><span id="line-2903"> builder.addColumnFamilies(toColumnFamilySchema(hcd));</span>
<span class="source-line-no">2904</span><span id="line-2904"> }</span>
<span class="source-line-no">2905</span><span id="line-2905"> return builder.build();</span>
<span class="source-line-no">2906</span><span id="line-2906"> }</span>
<span class="source-line-no">2907</span><span id="line-2907"></span>
<span class="source-line-no">2908</span><span id="line-2908"> /**</span>
<span class="source-line-no">2909</span><span id="line-2909"> * Converts a TableSchema to TableDescriptor</span>
<span class="source-line-no">2910</span><span id="line-2910"> * @param ts A pb TableSchema instance.</span>
<span class="source-line-no">2911</span><span id="line-2911"> * @return An {@link TableDescriptor} made from the passed in pb &lt;code&gt;ts&lt;/code&gt;.</span>
<span class="source-line-no">2912</span><span id="line-2912"> */</span>
<span class="source-line-no">2913</span><span id="line-2913"> public static TableDescriptor toTableDescriptor(final TableSchema ts) {</span>
<span class="source-line-no">2914</span><span id="line-2914"> TableDescriptorBuilder builder =</span>
<span class="source-line-no">2915</span><span id="line-2915"> TableDescriptorBuilder.newBuilder(ProtobufUtil.toTableName(ts.getTableName()));</span>
<span class="source-line-no">2916</span><span id="line-2916"> ts.getColumnFamiliesList().stream().map(ProtobufUtil::toColumnFamilyDescriptor)</span>
<span class="source-line-no">2917</span><span id="line-2917"> .forEach(builder::setColumnFamily);</span>
<span class="source-line-no">2918</span><span id="line-2918"> ts.getAttributesList()</span>
<span class="source-line-no">2919</span><span id="line-2919"> .forEach(a -&gt; builder.setValue(a.getFirst().toByteArray(), a.getSecond().toByteArray()));</span>
<span class="source-line-no">2920</span><span id="line-2920"> ts.getConfigurationList().forEach(a -&gt; builder.setValue(a.getName(), a.getValue()));</span>
<span class="source-line-no">2921</span><span id="line-2921"> return builder.build();</span>
<span class="source-line-no">2922</span><span id="line-2922"> }</span>
<span class="source-line-no">2923</span><span id="line-2923"></span>
<span class="source-line-no">2924</span><span id="line-2924"> /**</span>
<span class="source-line-no">2925</span><span id="line-2925"> * Creates {@link CompactionState} from {@link GetRegionInfoResponse.CompactionState} state</span>
<span class="source-line-no">2926</span><span id="line-2926"> * @param state the protobuf CompactionState</span>
<span class="source-line-no">2927</span><span id="line-2927"> */</span>
<span class="source-line-no">2928</span><span id="line-2928"> public static CompactionState createCompactionState(GetRegionInfoResponse.CompactionState state) {</span>
<span class="source-line-no">2929</span><span id="line-2929"> return CompactionState.valueOf(state.toString());</span>
<span class="source-line-no">2930</span><span id="line-2930"> }</span>
<span class="source-line-no">2931</span><span id="line-2931"></span>
<span class="source-line-no">2932</span><span id="line-2932"> public static GetRegionInfoResponse.CompactionState createCompactionState(CompactionState state) {</span>
<span class="source-line-no">2933</span><span id="line-2933"> return GetRegionInfoResponse.CompactionState.valueOf(state.toString());</span>
<span class="source-line-no">2934</span><span id="line-2934"> }</span>
<span class="source-line-no">2935</span><span id="line-2935"></span>
<span class="source-line-no">2936</span><span id="line-2936"> /**</span>
<span class="source-line-no">2937</span><span id="line-2937"> * Creates {@link CompactionState} from {@link RegionLoad.CompactionState} state</span>
<span class="source-line-no">2938</span><span id="line-2938"> * @param state the protobuf CompactionState</span>
<span class="source-line-no">2939</span><span id="line-2939"> */</span>
<span class="source-line-no">2940</span><span id="line-2940"> public static CompactionState</span>
<span class="source-line-no">2941</span><span id="line-2941"> createCompactionStateForRegionLoad(RegionLoad.CompactionState state) {</span>
<span class="source-line-no">2942</span><span id="line-2942"> return CompactionState.valueOf(state.toString());</span>
<span class="source-line-no">2943</span><span id="line-2943"> }</span>
<span class="source-line-no">2944</span><span id="line-2944"></span>
<span class="source-line-no">2945</span><span id="line-2945"> public static RegionLoad.CompactionState</span>
<span class="source-line-no">2946</span><span id="line-2946"> createCompactionStateForRegionLoad(CompactionState state) {</span>
<span class="source-line-no">2947</span><span id="line-2947"> return RegionLoad.CompactionState.valueOf(state.toString());</span>
<span class="source-line-no">2948</span><span id="line-2948"> }</span>
<span class="source-line-no">2949</span><span id="line-2949"></span>
<span class="source-line-no">2950</span><span id="line-2950"> public static Optional&lt;Long&gt; toOptionalTimestamp(MajorCompactionTimestampResponse resp) {</span>
<span class="source-line-no">2951</span><span id="line-2951"> long timestamp = resp.getCompactionTimestamp();</span>
<span class="source-line-no">2952</span><span id="line-2952"> return timestamp == 0 ? Optional.empty() : Optional.of(timestamp);</span>
<span class="source-line-no">2953</span><span id="line-2953"> }</span>
<span class="source-line-no">2954</span><span id="line-2954"></span>
<span class="source-line-no">2955</span><span id="line-2955"> /**</span>
<span class="source-line-no">2956</span><span id="line-2956"> * Creates {@link SnapshotProtos.SnapshotDescription.Type} from {@link SnapshotType}</span>
<span class="source-line-no">2957</span><span id="line-2957"> * @param type the SnapshotDescription type</span>
<span class="source-line-no">2958</span><span id="line-2958"> * @return the protobuf SnapshotDescription type</span>
<span class="source-line-no">2959</span><span id="line-2959"> */</span>
<span class="source-line-no">2960</span><span id="line-2960"> public static SnapshotProtos.SnapshotDescription.Type</span>
<span class="source-line-no">2961</span><span id="line-2961"> createProtosSnapShotDescType(SnapshotType type) {</span>
<span class="source-line-no">2962</span><span id="line-2962"> return SnapshotProtos.SnapshotDescription.Type.valueOf(type.name());</span>
<span class="source-line-no">2963</span><span id="line-2963"> }</span>
<span class="source-line-no">2964</span><span id="line-2964"></span>
<span class="source-line-no">2965</span><span id="line-2965"> /**</span>
<span class="source-line-no">2966</span><span id="line-2966"> * Creates {@link SnapshotProtos.SnapshotDescription.Type} from the type of SnapshotDescription</span>
<span class="source-line-no">2967</span><span id="line-2967"> * string</span>
<span class="source-line-no">2968</span><span id="line-2968"> * @param snapshotDesc string representing the snapshot description type</span>
<span class="source-line-no">2969</span><span id="line-2969"> * @return the protobuf SnapshotDescription type</span>
<span class="source-line-no">2970</span><span id="line-2970"> */</span>
<span class="source-line-no">2971</span><span id="line-2971"> public static SnapshotProtos.SnapshotDescription.Type</span>
<span class="source-line-no">2972</span><span id="line-2972"> createProtosSnapShotDescType(String snapshotDesc) {</span>
<span class="source-line-no">2973</span><span id="line-2973"> return SnapshotProtos.SnapshotDescription.Type.valueOf(snapshotDesc.toUpperCase(Locale.ROOT));</span>
<span class="source-line-no">2974</span><span id="line-2974"> }</span>
<span class="source-line-no">2975</span><span id="line-2975"></span>
<span class="source-line-no">2976</span><span id="line-2976"> /**</span>
<span class="source-line-no">2977</span><span id="line-2977"> * Creates {@link SnapshotType} from the {@link SnapshotProtos.SnapshotDescription.Type}</span>
<span class="source-line-no">2978</span><span id="line-2978"> * @param type the snapshot description type</span>
<span class="source-line-no">2979</span><span id="line-2979"> * @return the protobuf SnapshotDescription type</span>
<span class="source-line-no">2980</span><span id="line-2980"> */</span>
<span class="source-line-no">2981</span><span id="line-2981"> public static SnapshotType createSnapshotType(SnapshotProtos.SnapshotDescription.Type type) {</span>
<span class="source-line-no">2982</span><span id="line-2982"> return SnapshotType.valueOf(type.toString());</span>
<span class="source-line-no">2983</span><span id="line-2983"> }</span>
<span class="source-line-no">2984</span><span id="line-2984"></span>
<span class="source-line-no">2985</span><span id="line-2985"> /**</span>
<span class="source-line-no">2986</span><span id="line-2986"> * Convert from {@link SnapshotDescription} to {@link SnapshotProtos.SnapshotDescription}</span>
<span class="source-line-no">2987</span><span id="line-2987"> * @param snapshotDesc the POJO SnapshotDescription</span>
<span class="source-line-no">2988</span><span id="line-2988"> * @return the protobuf SnapshotDescription</span>
<span class="source-line-no">2989</span><span id="line-2989"> */</span>
<span class="source-line-no">2990</span><span id="line-2990"> public static SnapshotProtos.SnapshotDescription</span>
<span class="source-line-no">2991</span><span id="line-2991"> createHBaseProtosSnapshotDesc(SnapshotDescription snapshotDesc) {</span>
<span class="source-line-no">2992</span><span id="line-2992"> SnapshotProtos.SnapshotDescription.Builder builder =</span>
<span class="source-line-no">2993</span><span id="line-2993"> SnapshotProtos.SnapshotDescription.newBuilder();</span>
<span class="source-line-no">2994</span><span id="line-2994"> if (snapshotDesc.getTableName() != null) {</span>
<span class="source-line-no">2995</span><span id="line-2995"> builder.setTable(snapshotDesc.getTableNameAsString());</span>
<span class="source-line-no">2996</span><span id="line-2996"> }</span>
<span class="source-line-no">2997</span><span id="line-2997"> if (snapshotDesc.getName() != null) {</span>
<span class="source-line-no">2998</span><span id="line-2998"> builder.setName(snapshotDesc.getName());</span>
<span class="source-line-no">2999</span><span id="line-2999"> }</span>
<span class="source-line-no">3000</span><span id="line-3000"> if (snapshotDesc.getOwner() != null) {</span>
<span class="source-line-no">3001</span><span id="line-3001"> builder.setOwner(snapshotDesc.getOwner());</span>
<span class="source-line-no">3002</span><span id="line-3002"> }</span>
<span class="source-line-no">3003</span><span id="line-3003"> if (snapshotDesc.getCreationTime() != -1L) {</span>
<span class="source-line-no">3004</span><span id="line-3004"> builder.setCreationTime(snapshotDesc.getCreationTime());</span>
<span class="source-line-no">3005</span><span id="line-3005"> }</span>
<span class="source-line-no">3006</span><span id="line-3006"> if (</span>
<span class="source-line-no">3007</span><span id="line-3007"> snapshotDesc.getTtl() != -1L</span>
<span class="source-line-no">3008</span><span id="line-3008"> &amp;&amp; snapshotDesc.getTtl() &lt; TimeUnit.MILLISECONDS.toSeconds(Long.MAX_VALUE)</span>
<span class="source-line-no">3009</span><span id="line-3009"> ) {</span>
<span class="source-line-no">3010</span><span id="line-3010"> builder.setTtl(snapshotDesc.getTtl());</span>
<span class="source-line-no">3011</span><span id="line-3011"> }</span>
<span class="source-line-no">3012</span><span id="line-3012"> if (snapshotDesc.getVersion() != -1) {</span>
<span class="source-line-no">3013</span><span id="line-3013"> builder.setVersion(snapshotDesc.getVersion());</span>
<span class="source-line-no">3014</span><span id="line-3014"> }</span>
<span class="source-line-no">3015</span><span id="line-3015"> if (snapshotDesc.getMaxFileSize() != -1) {</span>
<span class="source-line-no">3016</span><span id="line-3016"> builder.setMaxFileSize(snapshotDesc.getMaxFileSize());</span>
<span class="source-line-no">3017</span><span id="line-3017"> }</span>
<span class="source-line-no">3018</span><span id="line-3018"> builder.setType(ProtobufUtil.createProtosSnapShotDescType(snapshotDesc.getType()));</span>
<span class="source-line-no">3019</span><span id="line-3019"> return builder.build();</span>
<span class="source-line-no">3020</span><span id="line-3020"> }</span>
<span class="source-line-no">3021</span><span id="line-3021"></span>
<span class="source-line-no">3022</span><span id="line-3022"> /**</span>
<span class="source-line-no">3023</span><span id="line-3023"> * Convert from {@link SnapshotProtos.SnapshotDescription} to {@link SnapshotDescription}</span>
<span class="source-line-no">3024</span><span id="line-3024"> * @param snapshotDesc the protobuf SnapshotDescription</span>
<span class="source-line-no">3025</span><span id="line-3025"> * @return the POJO SnapshotDescription</span>
<span class="source-line-no">3026</span><span id="line-3026"> */</span>
<span class="source-line-no">3027</span><span id="line-3027"> public static SnapshotDescription</span>
<span class="source-line-no">3028</span><span id="line-3028"> createSnapshotDesc(SnapshotProtos.SnapshotDescription snapshotDesc) {</span>
<span class="source-line-no">3029</span><span id="line-3029"> final Map&lt;String, Object&gt; snapshotProps = new HashMap&lt;&gt;();</span>
<span class="source-line-no">3030</span><span id="line-3030"> snapshotProps.put("TTL", snapshotDesc.getTtl());</span>
<span class="source-line-no">3031</span><span id="line-3031"> snapshotProps.put(TableDescriptorBuilder.MAX_FILESIZE, snapshotDesc.getMaxFileSize());</span>
<span class="source-line-no">3032</span><span id="line-3032"> return new SnapshotDescription(snapshotDesc.getName(),</span>
<span class="source-line-no">3033</span><span id="line-3033"> snapshotDesc.hasTable() ? TableName.valueOf(snapshotDesc.getTable()) : null,</span>
<span class="source-line-no">3034</span><span id="line-3034"> createSnapshotType(snapshotDesc.getType()), snapshotDesc.getOwner(),</span>
<span class="source-line-no">3035</span><span id="line-3035"> snapshotDesc.getCreationTime(), snapshotDesc.getVersion(), snapshotProps);</span>
<span class="source-line-no">3036</span><span id="line-3036"> }</span>
<span class="source-line-no">3037</span><span id="line-3037"></span>
<span class="source-line-no">3038</span><span id="line-3038"> public static RegionLoadStats createRegionLoadStats(ClientProtos.RegionLoadStats stats) {</span>
<span class="source-line-no">3039</span><span id="line-3039"> return new RegionLoadStats(stats.getMemStoreLoad(), stats.getHeapOccupancy(),</span>
<span class="source-line-no">3040</span><span id="line-3040"> stats.getCompactionPressure());</span>
<span class="source-line-no">3041</span><span id="line-3041"> }</span>
<span class="source-line-no">3042</span><span id="line-3042"></span>
<span class="source-line-no">3043</span><span id="line-3043"> /** Returns A String version of the passed in &lt;code&gt;msg&lt;/code&gt; */</span>
<span class="source-line-no">3044</span><span id="line-3044"> public static String toText(Message msg) {</span>
<span class="source-line-no">3045</span><span id="line-3045"> return TextFormat.shortDebugString(msg);</span>
<span class="source-line-no">3046</span><span id="line-3046"> }</span>
<span class="source-line-no">3047</span><span id="line-3047"></span>
<span class="source-line-no">3048</span><span id="line-3048"> public static byte[] toBytes(ByteString bs) {</span>
<span class="source-line-no">3049</span><span id="line-3049"> return bs.toByteArray();</span>
<span class="source-line-no">3050</span><span id="line-3050"> }</span>
<span class="source-line-no">3051</span><span id="line-3051"></span>
<span class="source-line-no">3052</span><span id="line-3052"> /**</span>
<span class="source-line-no">3053</span><span id="line-3053"> * Contain ServiceException inside here. Take a callable that is doing our pb rpc and run it.</span>
<span class="source-line-no">3054</span><span id="line-3054"> */</span>
<span class="source-line-no">3055</span><span id="line-3055"> public static &lt;T&gt; T call(Callable&lt;T&gt; callable) throws IOException {</span>
<span class="source-line-no">3056</span><span id="line-3056"> try {</span>
<span class="source-line-no">3057</span><span id="line-3057"> return callable.call();</span>
<span class="source-line-no">3058</span><span id="line-3058"> } catch (Exception e) {</span>
<span class="source-line-no">3059</span><span id="line-3059"> throw ProtobufUtil.handleRemoteException(e);</span>
<span class="source-line-no">3060</span><span id="line-3060"> }</span>
<span class="source-line-no">3061</span><span id="line-3061"> }</span>
<span class="source-line-no">3062</span><span id="line-3062"></span>
<span class="source-line-no">3063</span><span id="line-3063"> /**</span>
<span class="source-line-no">3064</span><span id="line-3064"> * Create a protocol buffer GetStoreFileRequest for a given region name</span>
<span class="source-line-no">3065</span><span id="line-3065"> * @param regionName the name of the region to get info</span>
<span class="source-line-no">3066</span><span id="line-3066"> * @param family the family to get store file list</span>
<span class="source-line-no">3067</span><span id="line-3067"> * @return a protocol buffer GetStoreFileRequest</span>
<span class="source-line-no">3068</span><span id="line-3068"> */</span>
<span class="source-line-no">3069</span><span id="line-3069"> public static GetStoreFileRequest buildGetStoreFileRequest(final byte[] regionName,</span>
<span class="source-line-no">3070</span><span id="line-3070"> final byte[] family) {</span>
<span class="source-line-no">3071</span><span id="line-3071"> GetStoreFileRequest.Builder builder = GetStoreFileRequest.newBuilder();</span>
<span class="source-line-no">3072</span><span id="line-3072"> RegionSpecifier region =</span>
<span class="source-line-no">3073</span><span id="line-3073"> RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName);</span>
<span class="source-line-no">3074</span><span id="line-3074"> builder.setRegion(region);</span>
<span class="source-line-no">3075</span><span id="line-3075"> builder.addFamily(UnsafeByteOperations.unsafeWrap(family));</span>
<span class="source-line-no">3076</span><span id="line-3076"> return builder.build();</span>
<span class="source-line-no">3077</span><span id="line-3077"> }</span>
<span class="source-line-no">3078</span><span id="line-3078"></span>
<span class="source-line-no">3079</span><span id="line-3079"> /**</span>
<span class="source-line-no">3080</span><span id="line-3080"> * Create a CloseRegionRequest for a given region name</span>
<span class="source-line-no">3081</span><span id="line-3081"> * @param regionName the name of the region to close</span>
<span class="source-line-no">3082</span><span id="line-3082"> * @return a CloseRegionRequest</span>
<span class="source-line-no">3083</span><span id="line-3083"> */</span>
<span class="source-line-no">3084</span><span id="line-3084"> public static CloseRegionRequest buildCloseRegionRequest(ServerName server, byte[] regionName) {</span>
<span class="source-line-no">3085</span><span id="line-3085"> return ProtobufUtil.buildCloseRegionRequest(server, regionName, null);</span>
<span class="source-line-no">3086</span><span id="line-3086"> }</span>
<span class="source-line-no">3087</span><span id="line-3087"></span>
<span class="source-line-no">3088</span><span id="line-3088"> public static CloseRegionRequest buildCloseRegionRequest(ServerName server, byte[] regionName,</span>
<span class="source-line-no">3089</span><span id="line-3089"> ServerName destinationServer) {</span>
<span class="source-line-no">3090</span><span id="line-3090"> return buildCloseRegionRequest(server, regionName, destinationServer, -1);</span>
<span class="source-line-no">3091</span><span id="line-3091"> }</span>
<span class="source-line-no">3092</span><span id="line-3092"></span>
<span class="source-line-no">3093</span><span id="line-3093"> public static CloseRegionRequest buildCloseRegionRequest(ServerName server, byte[] regionName,</span>
<span class="source-line-no">3094</span><span id="line-3094"> ServerName destinationServer, long closeProcId) {</span>
<span class="source-line-no">3095</span><span id="line-3095"> return ProtobufUtil.getBuilder(server, regionName, destinationServer, closeProcId).build();</span>
<span class="source-line-no">3096</span><span id="line-3096"> }</span>
<span class="source-line-no">3097</span><span id="line-3097"></span>
<span class="source-line-no">3098</span><span id="line-3098"> public static CloseRegionRequest buildCloseRegionRequest(ServerName server, byte[] regionName,</span>
<span class="source-line-no">3099</span><span id="line-3099"> ServerName destinationServer, long closeProcId, boolean evictCache) {</span>
<span class="source-line-no">3100</span><span id="line-3100"> CloseRegionRequest.Builder builder =</span>
<span class="source-line-no">3101</span><span id="line-3101"> getBuilder(server, regionName, destinationServer, closeProcId);</span>
<span class="source-line-no">3102</span><span id="line-3102"> builder.setEvictCache(evictCache);</span>
<span class="source-line-no">3103</span><span id="line-3103"> return builder.build();</span>
<span class="source-line-no">3104</span><span id="line-3104"> }</span>
<span class="source-line-no">3105</span><span id="line-3105"></span>
<span class="source-line-no">3106</span><span id="line-3106"> public static CloseRegionRequest.Builder getBuilder(ServerName server, byte[] regionName,</span>
<span class="source-line-no">3107</span><span id="line-3107"> ServerName destinationServer, long closeProcId) {</span>
<span class="source-line-no">3108</span><span id="line-3108"> CloseRegionRequest.Builder builder = CloseRegionRequest.newBuilder();</span>
<span class="source-line-no">3109</span><span id="line-3109"> RegionSpecifier region =</span>
<span class="source-line-no">3110</span><span id="line-3110"> RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName);</span>
<span class="source-line-no">3111</span><span id="line-3111"> builder.setRegion(region);</span>
<span class="source-line-no">3112</span><span id="line-3112"> if (destinationServer != null) {</span>
<span class="source-line-no">3113</span><span id="line-3113"> builder.setDestinationServer(toServerName(destinationServer));</span>
<span class="source-line-no">3114</span><span id="line-3114"> }</span>
<span class="source-line-no">3115</span><span id="line-3115"> if (server != null) {</span>
<span class="source-line-no">3116</span><span id="line-3116"> builder.setServerStartCode(server.getStartcode());</span>
<span class="source-line-no">3117</span><span id="line-3117"> }</span>
<span class="source-line-no">3118</span><span id="line-3118"> builder.setCloseProcId(closeProcId);</span>
<span class="source-line-no">3119</span><span id="line-3119"> return builder;</span>
<span class="source-line-no">3120</span><span id="line-3120"> }</span>
<span class="source-line-no">3121</span><span id="line-3121"></span>
<span class="source-line-no">3122</span><span id="line-3122"> public static ProcedureDescription buildProcedureDescription(String signature, String instance,</span>
<span class="source-line-no">3123</span><span id="line-3123"> Map&lt;String, String&gt; props) {</span>
<span class="source-line-no">3124</span><span id="line-3124"> ProcedureDescription.Builder builder =</span>
<span class="source-line-no">3125</span><span id="line-3125"> ProcedureDescription.newBuilder().setSignature(signature).setInstance(instance);</span>
<span class="source-line-no">3126</span><span id="line-3126"> if (props != null &amp;&amp; !props.isEmpty()) {</span>
<span class="source-line-no">3127</span><span id="line-3127"> props.entrySet().forEach(entry -&gt; builder.addConfiguration(</span>
<span class="source-line-no">3128</span><span id="line-3128"> NameStringPair.newBuilder().setName(entry.getKey()).setValue(entry.getValue()).build()));</span>
<span class="source-line-no">3129</span><span id="line-3129"> }</span>
<span class="source-line-no">3130</span><span id="line-3130"> return builder.build();</span>
<span class="source-line-no">3131</span><span id="line-3131"> }</span>
<span class="source-line-no">3132</span><span id="line-3132"></span>
<span class="source-line-no">3133</span><span id="line-3133"> /**</span>
<span class="source-line-no">3134</span><span id="line-3134"> * Get the Meta region state from the passed data bytes. Can handle both old and new style server</span>
<span class="source-line-no">3135</span><span id="line-3135"> * names.</span>
<span class="source-line-no">3136</span><span id="line-3136"> * @param data protobuf serialized data with meta server name.</span>
<span class="source-line-no">3137</span><span id="line-3137"> * @param replicaId replica ID for this region</span>
<span class="source-line-no">3138</span><span id="line-3138"> * @return RegionState instance corresponding to the serialized data.</span>
<span class="source-line-no">3139</span><span id="line-3139"> * @throws DeserializationException if the data is invalid.</span>
<span class="source-line-no">3140</span><span id="line-3140"> */</span>
<span class="source-line-no">3141</span><span id="line-3141"> public static RegionState parseMetaRegionStateFrom(final byte[] data, int replicaId)</span>
<span class="source-line-no">3142</span><span id="line-3142"> throws DeserializationException {</span>
<span class="source-line-no">3143</span><span id="line-3143"> RegionState.State state = RegionState.State.OPEN;</span>
<span class="source-line-no">3144</span><span id="line-3144"> ServerName serverName;</span>
<span class="source-line-no">3145</span><span id="line-3145"> if (data != null &amp;&amp; data.length &gt; 0 &amp;&amp; ProtobufUtil.isPBMagicPrefix(data)) {</span>
<span class="source-line-no">3146</span><span id="line-3146"> try {</span>
<span class="source-line-no">3147</span><span id="line-3147"> int prefixLen = ProtobufUtil.lengthOfPBMagic();</span>
<span class="source-line-no">3148</span><span id="line-3148"> ZooKeeperProtos.MetaRegionServer rl = ZooKeeperProtos.MetaRegionServer.parser()</span>
<span class="source-line-no">3149</span><span id="line-3149"> .parseFrom(data, prefixLen, data.length - prefixLen);</span>
<span class="source-line-no">3150</span><span id="line-3150"> if (rl.hasState()) {</span>
<span class="source-line-no">3151</span><span id="line-3151"> state = RegionState.State.convert(rl.getState());</span>
<span class="source-line-no">3152</span><span id="line-3152"> }</span>
<span class="source-line-no">3153</span><span id="line-3153"> HBaseProtos.ServerName sn = rl.getServer();</span>
<span class="source-line-no">3154</span><span id="line-3154"> serverName = ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode());</span>
<span class="source-line-no">3155</span><span id="line-3155"> } catch (InvalidProtocolBufferException e) {</span>
<span class="source-line-no">3156</span><span id="line-3156"> throw new DeserializationException("Unable to parse meta region location");</span>
<span class="source-line-no">3157</span><span id="line-3157"> }</span>
<span class="source-line-no">3158</span><span id="line-3158"> } else {</span>
<span class="source-line-no">3159</span><span id="line-3159"> // old style of meta region location?</span>
<span class="source-line-no">3160</span><span id="line-3160"> serverName = parseServerNameFrom(data);</span>
<span class="source-line-no">3161</span><span id="line-3161"> }</span>
<span class="source-line-no">3162</span><span id="line-3162"> if (serverName == null) {</span>
<span class="source-line-no">3163</span><span id="line-3163"> state = RegionState.State.OFFLINE;</span>
<span class="source-line-no">3164</span><span id="line-3164"> }</span>
<span class="source-line-no">3165</span><span id="line-3165"> return new RegionState(</span>
<span class="source-line-no">3166</span><span id="line-3166"> RegionReplicaUtil.getRegionInfoForReplica(RegionInfoBuilder.FIRST_META_REGIONINFO, replicaId),</span>
<span class="source-line-no">3167</span><span id="line-3167"> state, serverName);</span>
<span class="source-line-no">3168</span><span id="line-3168"> }</span>
<span class="source-line-no">3169</span><span id="line-3169"></span>
<span class="source-line-no">3170</span><span id="line-3170"> /**</span>
<span class="source-line-no">3171</span><span id="line-3171"> * Get a ServerName from the passed in data bytes.</span>
<span class="source-line-no">3172</span><span id="line-3172"> * @param data Data with a serialize server name in it; can handle the old style servername where</span>
<span class="source-line-no">3173</span><span id="line-3173"> * servername was host and port. Works too with data that begins w/ the pb 'PBUF'</span>
<span class="source-line-no">3174</span><span id="line-3174"> * magic and that is then followed by a protobuf that has a serialized</span>
<span class="source-line-no">3175</span><span id="line-3175"> * {@link ServerName} in it.</span>
<span class="source-line-no">3176</span><span id="line-3176"> * @return Returns null if &lt;code&gt;data&lt;/code&gt; is null else converts passed data to a ServerName</span>
<span class="source-line-no">3177</span><span id="line-3177"> * instance.</span>
<span class="source-line-no">3178</span><span id="line-3178"> */</span>
<span class="source-line-no">3179</span><span id="line-3179"> public static ServerName parseServerNameFrom(final byte[] data) throws DeserializationException {</span>
<span class="source-line-no">3180</span><span id="line-3180"> if (data == null || data.length &lt;= 0) return null;</span>
<span class="source-line-no">3181</span><span id="line-3181"> if (ProtobufMagic.isPBMagicPrefix(data)) {</span>
<span class="source-line-no">3182</span><span id="line-3182"> int prefixLen = ProtobufMagic.lengthOfPBMagic();</span>
<span class="source-line-no">3183</span><span id="line-3183"> try {</span>
<span class="source-line-no">3184</span><span id="line-3184"> ZooKeeperProtos.Master rss =</span>
<span class="source-line-no">3185</span><span id="line-3185"> ZooKeeperProtos.Master.parser().parseFrom(data, prefixLen, data.length - prefixLen);</span>
<span class="source-line-no">3186</span><span id="line-3186"> org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName sn =</span>
<span class="source-line-no">3187</span><span id="line-3187"> rss.getMaster();</span>
<span class="source-line-no">3188</span><span id="line-3188"> return ServerName.valueOf(sn.getHostName(), sn.getPort(), sn.getStartCode());</span>
<span class="source-line-no">3189</span><span id="line-3189"> } catch (/* InvalidProtocolBufferException */IOException e) {</span>
<span class="source-line-no">3190</span><span id="line-3190"> // A failed parse of the znode is pretty catastrophic. Rather than loop</span>
<span class="source-line-no">3191</span><span id="line-3191"> // retrying hoping the bad bytes will changes, and rather than change</span>
<span class="source-line-no">3192</span><span id="line-3192"> // the signature on this method to add an IOE which will send ripples all</span>
<span class="source-line-no">3193</span><span id="line-3193"> // over the code base, throw a RuntimeException. This should "never" happen.</span>
<span class="source-line-no">3194</span><span id="line-3194"> // Fail fast if it does.</span>
<span class="source-line-no">3195</span><span id="line-3195"> throw new DeserializationException(e);</span>
<span class="source-line-no">3196</span><span id="line-3196"> }</span>
<span class="source-line-no">3197</span><span id="line-3197"> }</span>
<span class="source-line-no">3198</span><span id="line-3198"> // The str returned could be old style -- pre hbase-1502 -- which was</span>
<span class="source-line-no">3199</span><span id="line-3199"> // hostname and port seperated by a colon rather than hostname, port and</span>
<span class="source-line-no">3200</span><span id="line-3200"> // startcode delimited by a ','.</span>
<span class="source-line-no">3201</span><span id="line-3201"> String str = Bytes.toString(data);</span>
<span class="source-line-no">3202</span><span id="line-3202"> int index = str.indexOf(ServerName.SERVERNAME_SEPARATOR);</span>
<span class="source-line-no">3203</span><span id="line-3203"> if (index != -1) {</span>
<span class="source-line-no">3204</span><span id="line-3204"> // Presume its ServerName serialized with versioned bytes.</span>
<span class="source-line-no">3205</span><span id="line-3205"> return ServerName.parseVersionedServerName(data);</span>
<span class="source-line-no">3206</span><span id="line-3206"> }</span>
<span class="source-line-no">3207</span><span id="line-3207"> // Presume it a hostname:port format.</span>
<span class="source-line-no">3208</span><span id="line-3208"> String hostname = Addressing.parseHostname(str);</span>
<span class="source-line-no">3209</span><span id="line-3209"> int port = Addressing.parsePort(str);</span>
<span class="source-line-no">3210</span><span id="line-3210"> return ServerName.valueOf(hostname, port, -1L);</span>
<span class="source-line-no">3211</span><span id="line-3211"> }</span>
<span class="source-line-no">3212</span><span id="line-3212"></span>
<span class="source-line-no">3213</span><span id="line-3213"> /**</span>
<span class="source-line-no">3214</span><span id="line-3214"> * Helper to convert the protobuf Procedure to JSON String</span>
<span class="source-line-no">3215</span><span id="line-3215"> * @return Convert the current Protocol Buffers Procedure to JSON String</span>
<span class="source-line-no">3216</span><span id="line-3216"> */</span>
<span class="source-line-no">3217</span><span id="line-3217"> public static String toProcedureJson(List&lt;ProcedureProtos.Procedure&gt; procProtos) {</span>
<span class="source-line-no">3218</span><span id="line-3218"> JsonArray procJsons = new JsonArray(procProtos.size());</span>
<span class="source-line-no">3219</span><span id="line-3219"> for (ProcedureProtos.Procedure procProto : procProtos) {</span>
<span class="source-line-no">3220</span><span id="line-3220"> try {</span>
<span class="source-line-no">3221</span><span id="line-3221"> JsonElement procJson = ProtobufMessageConverter.toJsonElement(procProto);</span>
<span class="source-line-no">3222</span><span id="line-3222"> procJsons.add(procJson);</span>
<span class="source-line-no">3223</span><span id="line-3223"> } catch (InvalidProtocolBufferException e) {</span>
<span class="source-line-no">3224</span><span id="line-3224"> procJsons.add(e.toString());</span>
<span class="source-line-no">3225</span><span id="line-3225"> }</span>
<span class="source-line-no">3226</span><span id="line-3226"> }</span>
<span class="source-line-no">3227</span><span id="line-3227"> return procJsons.toString();</span>
<span class="source-line-no">3228</span><span id="line-3228"> }</span>
<span class="source-line-no">3229</span><span id="line-3229"></span>
<span class="source-line-no">3230</span><span id="line-3230"> public static String toLockJson(List&lt;LockServiceProtos.LockedResource&gt; lockedResourceProtos) {</span>
<span class="source-line-no">3231</span><span id="line-3231"> JsonArray lockedResourceJsons = new JsonArray(lockedResourceProtos.size());</span>
<span class="source-line-no">3232</span><span id="line-3232"> for (LockServiceProtos.LockedResource lockedResourceProto : lockedResourceProtos) {</span>
<span class="source-line-no">3233</span><span id="line-3233"> try {</span>
<span class="source-line-no">3234</span><span id="line-3234"> JsonElement lockedResourceJson =</span>
<span class="source-line-no">3235</span><span id="line-3235"> ProtobufMessageConverter.toJsonElement(lockedResourceProto);</span>
<span class="source-line-no">3236</span><span id="line-3236"> lockedResourceJsons.add(lockedResourceJson);</span>
<span class="source-line-no">3237</span><span id="line-3237"> } catch (InvalidProtocolBufferException e) {</span>
<span class="source-line-no">3238</span><span id="line-3238"> lockedResourceJsons.add(e.toString());</span>
<span class="source-line-no">3239</span><span id="line-3239"> }</span>
<span class="source-line-no">3240</span><span id="line-3240"> }</span>
<span class="source-line-no">3241</span><span id="line-3241"> return lockedResourceJsons.toString();</span>
<span class="source-line-no">3242</span><span id="line-3242"> }</span>
<span class="source-line-no">3243</span><span id="line-3243"></span>
<span class="source-line-no">3244</span><span id="line-3244"> /**</span>
<span class="source-line-no">3245</span><span id="line-3245"> * Convert a RegionInfo to a Proto RegionInfo</span>
<span class="source-line-no">3246</span><span id="line-3246"> * @param info the RegionInfo to convert</span>
<span class="source-line-no">3247</span><span id="line-3247"> * @return the converted Proto RegionInfo</span>
<span class="source-line-no">3248</span><span id="line-3248"> */</span>
<span class="source-line-no">3249</span><span id="line-3249"> public static HBaseProtos.RegionInfo</span>
<span class="source-line-no">3250</span><span id="line-3250"> toRegionInfo(final org.apache.hadoop.hbase.client.RegionInfo info) {</span>
<span class="source-line-no">3251</span><span id="line-3251"> if (info == null) {</span>
<span class="source-line-no">3252</span><span id="line-3252"> return null;</span>
<span class="source-line-no">3253</span><span id="line-3253"> }</span>
<span class="source-line-no">3254</span><span id="line-3254"> HBaseProtos.RegionInfo.Builder builder = HBaseProtos.RegionInfo.newBuilder();</span>
<span class="source-line-no">3255</span><span id="line-3255"> builder.setTableName(ProtobufUtil.toProtoTableName(info.getTable()));</span>
<span class="source-line-no">3256</span><span id="line-3256"> builder.setRegionId(info.getRegionId());</span>
<span class="source-line-no">3257</span><span id="line-3257"> if (info.getStartKey() != null) {</span>
<span class="source-line-no">3258</span><span id="line-3258"> builder.setStartKey(UnsafeByteOperations.unsafeWrap(info.getStartKey()));</span>
<span class="source-line-no">3259</span><span id="line-3259"> }</span>
<span class="source-line-no">3260</span><span id="line-3260"> if (info.getEndKey() != null) {</span>
<span class="source-line-no">3261</span><span id="line-3261"> builder.setEndKey(UnsafeByteOperations.unsafeWrap(info.getEndKey()));</span>
<span class="source-line-no">3262</span><span id="line-3262"> }</span>
<span class="source-line-no">3263</span><span id="line-3263"> builder.setOffline(info.isOffline());</span>
<span class="source-line-no">3264</span><span id="line-3264"> builder.setSplit(info.isSplit());</span>
<span class="source-line-no">3265</span><span id="line-3265"> builder.setReplicaId(info.getReplicaId());</span>
<span class="source-line-no">3266</span><span id="line-3266"> return builder.build();</span>
<span class="source-line-no">3267</span><span id="line-3267"> }</span>
<span class="source-line-no">3268</span><span id="line-3268"></span>
<span class="source-line-no">3269</span><span id="line-3269"> /**</span>
<span class="source-line-no">3270</span><span id="line-3270"> * Convert HBaseProto.RegionInfo to a RegionInfo</span>
<span class="source-line-no">3271</span><span id="line-3271"> * @param proto the RegionInfo to convert</span>
<span class="source-line-no">3272</span><span id="line-3272"> * @return the converted RegionInfo</span>
<span class="source-line-no">3273</span><span id="line-3273"> */</span>
<span class="source-line-no">3274</span><span id="line-3274"> public static org.apache.hadoop.hbase.client.RegionInfo</span>
<span class="source-line-no">3275</span><span id="line-3275"> toRegionInfo(final HBaseProtos.RegionInfo proto) {</span>
<span class="source-line-no">3276</span><span id="line-3276"> if (proto == null) {</span>
<span class="source-line-no">3277</span><span id="line-3277"> return null;</span>
<span class="source-line-no">3278</span><span id="line-3278"> }</span>
<span class="source-line-no">3279</span><span id="line-3279"> TableName tableName = ProtobufUtil.toTableName(proto.getTableName());</span>
<span class="source-line-no">3280</span><span id="line-3280"> long regionId = proto.getRegionId();</span>
<span class="source-line-no">3281</span><span id="line-3281"> int defaultReplicaId = org.apache.hadoop.hbase.client.RegionInfo.DEFAULT_REPLICA_ID;</span>
<span class="source-line-no">3282</span><span id="line-3282"> int replicaId = proto.hasReplicaId() ? proto.getReplicaId() : defaultReplicaId;</span>
<span class="source-line-no">3283</span><span id="line-3283"> if (tableName.equals(TableName.META_TABLE_NAME) &amp;&amp; replicaId == defaultReplicaId) {</span>
<span class="source-line-no">3284</span><span id="line-3284"> return RegionInfoBuilder.FIRST_META_REGIONINFO;</span>
<span class="source-line-no">3285</span><span id="line-3285"> }</span>
<span class="source-line-no">3286</span><span id="line-3286"> byte[] startKey = null;</span>
<span class="source-line-no">3287</span><span id="line-3287"> byte[] endKey = null;</span>
<span class="source-line-no">3288</span><span id="line-3288"> if (proto.hasStartKey()) {</span>
<span class="source-line-no">3289</span><span id="line-3289"> startKey = proto.getStartKey().toByteArray();</span>
<span class="source-line-no">3290</span><span id="line-3290"> }</span>
<span class="source-line-no">3291</span><span id="line-3291"> if (proto.hasEndKey()) {</span>
<span class="source-line-no">3292</span><span id="line-3292"> endKey = proto.getEndKey().toByteArray();</span>
<span class="source-line-no">3293</span><span id="line-3293"> }</span>
<span class="source-line-no">3294</span><span id="line-3294"> boolean split = false;</span>
<span class="source-line-no">3295</span><span id="line-3295"> if (proto.hasSplit()) {</span>
<span class="source-line-no">3296</span><span id="line-3296"> split = proto.getSplit();</span>
<span class="source-line-no">3297</span><span id="line-3297"> }</span>
<span class="source-line-no">3298</span><span id="line-3298"> RegionInfoBuilder rib = RegionInfoBuilder.newBuilder(tableName).setStartKey(startKey)</span>
<span class="source-line-no">3299</span><span id="line-3299"> .setEndKey(endKey).setRegionId(regionId).setReplicaId(replicaId).setSplit(split);</span>
<span class="source-line-no">3300</span><span id="line-3300"> if (proto.hasOffline()) {</span>
<span class="source-line-no">3301</span><span id="line-3301"> rib.setOffline(proto.getOffline());</span>
<span class="source-line-no">3302</span><span id="line-3302"> }</span>
<span class="source-line-no">3303</span><span id="line-3303"> return rib.build();</span>
<span class="source-line-no">3304</span><span id="line-3304"> }</span>
<span class="source-line-no">3305</span><span id="line-3305"></span>
<span class="source-line-no">3306</span><span id="line-3306"> public static HBaseProtos.RegionLocation toRegionLocation(HRegionLocation loc) {</span>
<span class="source-line-no">3307</span><span id="line-3307"> HBaseProtos.RegionLocation.Builder builder = HBaseProtos.RegionLocation.newBuilder();</span>
<span class="source-line-no">3308</span><span id="line-3308"> builder.setRegionInfo(toRegionInfo(loc.getRegion()));</span>
<span class="source-line-no">3309</span><span id="line-3309"> if (loc.getServerName() != null) {</span>
<span class="source-line-no">3310</span><span id="line-3310"> builder.setServerName(toServerName(loc.getServerName()));</span>
<span class="source-line-no">3311</span><span id="line-3311"> }</span>
<span class="source-line-no">3312</span><span id="line-3312"> builder.setSeqNum(loc.getSeqNum());</span>
<span class="source-line-no">3313</span><span id="line-3313"> return builder.build();</span>
<span class="source-line-no">3314</span><span id="line-3314"> }</span>
<span class="source-line-no">3315</span><span id="line-3315"></span>
<span class="source-line-no">3316</span><span id="line-3316"> public static HRegionLocation toRegionLocation(HBaseProtos.RegionLocation proto) {</span>
<span class="source-line-no">3317</span><span id="line-3317"> org.apache.hadoop.hbase.client.RegionInfo regionInfo = toRegionInfo(proto.getRegionInfo());</span>
<span class="source-line-no">3318</span><span id="line-3318"> ServerName serverName = proto.hasServerName() ? toServerName(proto.getServerName()) : null;</span>
<span class="source-line-no">3319</span><span id="line-3319"> return new HRegionLocation(regionInfo, serverName, proto.getSeqNum());</span>
<span class="source-line-no">3320</span><span id="line-3320"> }</span>
<span class="source-line-no">3321</span><span id="line-3321"></span>
<span class="source-line-no">3322</span><span id="line-3322"> public static List&lt;SnapshotDescription&gt;</span>
<span class="source-line-no">3323</span><span id="line-3323"> toSnapshotDescriptionList(GetCompletedSnapshotsResponse response, Pattern pattern) {</span>
<span class="source-line-no">3324</span><span id="line-3324"> return response.getSnapshotsList().stream().map(ProtobufUtil::createSnapshotDesc)</span>
<span class="source-line-no">3325</span><span id="line-3325"> .filter(snap -&gt; pattern != null ? pattern.matcher(snap.getName()).matches() : true)</span>
<span class="source-line-no">3326</span><span id="line-3326"> .collect(Collectors.toList());</span>
<span class="source-line-no">3327</span><span id="line-3327"> }</span>
<span class="source-line-no">3328</span><span id="line-3328"></span>
<span class="source-line-no">3329</span><span id="line-3329"> public static CacheEvictionStats toCacheEvictionStats(HBaseProtos.CacheEvictionStats stats)</span>
<span class="source-line-no">3330</span><span id="line-3330"> throws IOException {</span>
<span class="source-line-no">3331</span><span id="line-3331"> CacheEvictionStatsBuilder builder = CacheEvictionStats.builder();</span>
<span class="source-line-no">3332</span><span id="line-3332"> builder.withEvictedBlocks(stats.getEvictedBlocks()).withMaxCacheSize(stats.getMaxCacheSize());</span>
<span class="source-line-no">3333</span><span id="line-3333"> if (stats.getExceptionCount() &gt; 0) {</span>
<span class="source-line-no">3334</span><span id="line-3334"> for (HBaseProtos.RegionExceptionMessage exception : stats.getExceptionList()) {</span>
<span class="source-line-no">3335</span><span id="line-3335"> HBaseProtos.RegionSpecifier rs = exception.getRegion();</span>
<span class="source-line-no">3336</span><span id="line-3336"> byte[] regionName = rs.getValue().toByteArray();</span>
<span class="source-line-no">3337</span><span id="line-3337"> builder.addException(regionName, ProtobufUtil.toException(exception.getException()));</span>
<span class="source-line-no">3338</span><span id="line-3338"> }</span>
<span class="source-line-no">3339</span><span id="line-3339"> }</span>
<span class="source-line-no">3340</span><span id="line-3340"> return builder.build();</span>
<span class="source-line-no">3341</span><span id="line-3341"> }</span>
<span class="source-line-no">3342</span><span id="line-3342"></span>
<span class="source-line-no">3343</span><span id="line-3343"> public static HBaseProtos.CacheEvictionStats</span>
<span class="source-line-no">3344</span><span id="line-3344"> toCacheEvictionStats(CacheEvictionStats cacheEvictionStats) {</span>
<span class="source-line-no">3345</span><span id="line-3345"> HBaseProtos.CacheEvictionStats.Builder builder = HBaseProtos.CacheEvictionStats.newBuilder();</span>
<span class="source-line-no">3346</span><span id="line-3346"> for (Map.Entry&lt;byte[], Throwable&gt; entry : cacheEvictionStats.getExceptions().entrySet()) {</span>
<span class="source-line-no">3347</span><span id="line-3347"> builder.addException(RegionExceptionMessage.newBuilder()</span>
<span class="source-line-no">3348</span><span id="line-3348"> .setRegion(</span>
<span class="source-line-no">3349</span><span id="line-3349"> RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME, entry.getKey()))</span>
<span class="source-line-no">3350</span><span id="line-3350"> .setException(ResponseConverter.buildException(entry.getValue())).build());</span>
<span class="source-line-no">3351</span><span id="line-3351"> }</span>
<span class="source-line-no">3352</span><span id="line-3352"> return builder.setEvictedBlocks(cacheEvictionStats.getEvictedBlocks())</span>
<span class="source-line-no">3353</span><span id="line-3353"> .setMaxCacheSize(cacheEvictionStats.getMaxCacheSize()).build();</span>
<span class="source-line-no">3354</span><span id="line-3354"> }</span>
<span class="source-line-no">3355</span><span id="line-3355"></span>
<span class="source-line-no">3356</span><span id="line-3356"> public static ClusterStatusProtos.ReplicationLoadSource</span>
<span class="source-line-no">3357</span><span id="line-3357"> toReplicationLoadSource(ReplicationLoadSource rls) {</span>
<span class="source-line-no">3358</span><span id="line-3358"> return ClusterStatusProtos.ReplicationLoadSource.newBuilder().setPeerID(rls.getPeerID())</span>
<span class="source-line-no">3359</span><span id="line-3359"> .setAgeOfLastShippedOp(rls.getAgeOfLastShippedOp())</span>
<span class="source-line-no">3360</span><span id="line-3360"> .setSizeOfLogQueue((int) rls.getSizeOfLogQueue())</span>
<span class="source-line-no">3361</span><span id="line-3361"> .setTimeStampOfLastShippedOp(rls.getTimestampOfLastShippedOp())</span>
<span class="source-line-no">3362</span><span id="line-3362"> .setReplicationLag(rls.getReplicationLag()).setQueueId(rls.getQueueId())</span>
<span class="source-line-no">3363</span><span id="line-3363"> .setRecovered(rls.isRecovered()).setRunning(rls.isRunning())</span>
<span class="source-line-no">3364</span><span id="line-3364"> .setEditsSinceRestart(rls.hasEditsSinceRestart())</span>
<span class="source-line-no">3365</span><span id="line-3365"> .setTimeStampOfNextToReplicate(rls.getTimeStampOfNextToReplicate())</span>
<span class="source-line-no">3366</span><span id="line-3366"> .setOPsShipped(rls.getOPsShipped()).setEditsRead(rls.getEditsRead()).build();</span>
<span class="source-line-no">3367</span><span id="line-3367"> }</span>
<span class="source-line-no">3368</span><span id="line-3368"></span>
<span class="source-line-no">3369</span><span id="line-3369"> public static ClusterStatusProtos.ReplicationLoadSink</span>
<span class="source-line-no">3370</span><span id="line-3370"> toReplicationLoadSink(ReplicationLoadSink rls) {</span>
<span class="source-line-no">3371</span><span id="line-3371"> return ClusterStatusProtos.ReplicationLoadSink.newBuilder()</span>
<span class="source-line-no">3372</span><span id="line-3372"> .setAgeOfLastAppliedOp(rls.getAgeOfLastAppliedOp())</span>
<span class="source-line-no">3373</span><span id="line-3373"> .setTimeStampsOfLastAppliedOp(rls.getTimestampsOfLastAppliedOp())</span>
<span class="source-line-no">3374</span><span id="line-3374"> .setTimestampStarted(rls.getTimestampStarted())</span>
<span class="source-line-no">3375</span><span id="line-3375"> .setTotalOpsProcessed(rls.getTotalOpsProcessed()).build();</span>
<span class="source-line-no">3376</span><span id="line-3376"> }</span>
<span class="source-line-no">3377</span><span id="line-3377"></span>
<span class="source-line-no">3378</span><span id="line-3378"> public static HBaseProtos.TimeRange toTimeRange(TimeRange timeRange) {</span>
<span class="source-line-no">3379</span><span id="line-3379"> if (timeRange == null) {</span>
<span class="source-line-no">3380</span><span id="line-3380"> timeRange = TimeRange.allTime();</span>
<span class="source-line-no">3381</span><span id="line-3381"> }</span>
<span class="source-line-no">3382</span><span id="line-3382"> return HBaseProtos.TimeRange.newBuilder().setFrom(timeRange.getMin()).setTo(timeRange.getMax())</span>
<span class="source-line-no">3383</span><span id="line-3383"> .build();</span>
<span class="source-line-no">3384</span><span id="line-3384"> }</span>
<span class="source-line-no">3385</span><span id="line-3385"></span>
<span class="source-line-no">3386</span><span id="line-3386"> public static byte[] toCompactionEventTrackerBytes(Set&lt;String&gt; storeFiles) {</span>
<span class="source-line-no">3387</span><span id="line-3387"> HFileProtos.CompactionEventTracker.Builder builder =</span>
<span class="source-line-no">3388</span><span id="line-3388"> HFileProtos.CompactionEventTracker.newBuilder();</span>
<span class="source-line-no">3389</span><span id="line-3389"> storeFiles.forEach(sf -&gt; builder.addCompactedStoreFile(ByteString.copyFromUtf8(sf)));</span>
<span class="source-line-no">3390</span><span id="line-3390"> return ProtobufUtil.prependPBMagic(builder.build().toByteArray());</span>
<span class="source-line-no">3391</span><span id="line-3391"> }</span>
<span class="source-line-no">3392</span><span id="line-3392"></span>
<span class="source-line-no">3393</span><span id="line-3393"> public static Set&lt;String&gt; toCompactedStoreFiles(byte[] bytes) throws IOException {</span>
<span class="source-line-no">3394</span><span id="line-3394"> if (bytes != null &amp;&amp; ProtobufUtil.isPBMagicPrefix(bytes)) {</span>
<span class="source-line-no">3395</span><span id="line-3395"> int pbLen = ProtobufUtil.lengthOfPBMagic();</span>
<span class="source-line-no">3396</span><span id="line-3396"> HFileProtos.CompactionEventTracker.Builder builder =</span>
<span class="source-line-no">3397</span><span id="line-3397"> HFileProtos.CompactionEventTracker.newBuilder();</span>
<span class="source-line-no">3398</span><span id="line-3398"> ProtobufUtil.mergeFrom(builder, bytes, pbLen, bytes.length - pbLen);</span>
<span class="source-line-no">3399</span><span id="line-3399"> HFileProtos.CompactionEventTracker compactionEventTracker = builder.build();</span>
<span class="source-line-no">3400</span><span id="line-3400"> List&lt;ByteString&gt; compactedStoreFiles = compactionEventTracker.getCompactedStoreFileList();</span>
<span class="source-line-no">3401</span><span id="line-3401"> if (compactedStoreFiles != null &amp;&amp; compactedStoreFiles.size() != 0) {</span>
<span class="source-line-no">3402</span><span id="line-3402"> return compactedStoreFiles.stream().map(ByteString::toStringUtf8)</span>
<span class="source-line-no">3403</span><span id="line-3403"> .collect(Collectors.toSet());</span>
<span class="source-line-no">3404</span><span id="line-3404"> }</span>
<span class="source-line-no">3405</span><span id="line-3405"> }</span>
<span class="source-line-no">3406</span><span id="line-3406"> return Collections.emptySet();</span>
<span class="source-line-no">3407</span><span id="line-3407"> }</span>
<span class="source-line-no">3408</span><span id="line-3408"></span>
<span class="source-line-no">3409</span><span id="line-3409"> public static ClusterStatusProtos.RegionStatesCount</span>
<span class="source-line-no">3410</span><span id="line-3410"> toTableRegionStatesCount(RegionStatesCount regionStatesCount) {</span>
<span class="source-line-no">3411</span><span id="line-3411"> int openRegions = 0;</span>
<span class="source-line-no">3412</span><span id="line-3412"> int splitRegions = 0;</span>
<span class="source-line-no">3413</span><span id="line-3413"> int closedRegions = 0;</span>
<span class="source-line-no">3414</span><span id="line-3414"> int regionsInTransition = 0;</span>
<span class="source-line-no">3415</span><span id="line-3415"> int totalRegions = 0;</span>
<span class="source-line-no">3416</span><span id="line-3416"> if (regionStatesCount != null) {</span>
<span class="source-line-no">3417</span><span id="line-3417"> openRegions = regionStatesCount.getOpenRegions();</span>
<span class="source-line-no">3418</span><span id="line-3418"> splitRegions = regionStatesCount.getSplitRegions();</span>
<span class="source-line-no">3419</span><span id="line-3419"> closedRegions = regionStatesCount.getClosedRegions();</span>
<span class="source-line-no">3420</span><span id="line-3420"> regionsInTransition = regionStatesCount.getRegionsInTransition();</span>
<span class="source-line-no">3421</span><span id="line-3421"> totalRegions = regionStatesCount.getTotalRegions();</span>
<span class="source-line-no">3422</span><span id="line-3422"> }</span>
<span class="source-line-no">3423</span><span id="line-3423"> return ClusterStatusProtos.RegionStatesCount.newBuilder().setOpenRegions(openRegions)</span>
<span class="source-line-no">3424</span><span id="line-3424"> .setSplitRegions(splitRegions).setClosedRegions(closedRegions)</span>
<span class="source-line-no">3425</span><span id="line-3425"> .setRegionsInTransition(regionsInTransition).setTotalRegions(totalRegions).build();</span>
<span class="source-line-no">3426</span><span id="line-3426"> }</span>
<span class="source-line-no">3427</span><span id="line-3427"></span>
<span class="source-line-no">3428</span><span id="line-3428"> public static RegionStatesCount</span>
<span class="source-line-no">3429</span><span id="line-3429"> toTableRegionStatesCount(ClusterStatusProtos.RegionStatesCount regionStatesCount) {</span>
<span class="source-line-no">3430</span><span id="line-3430"> int openRegions = 0;</span>
<span class="source-line-no">3431</span><span id="line-3431"> int splitRegions = 0;</span>
<span class="source-line-no">3432</span><span id="line-3432"> int closedRegions = 0;</span>
<span class="source-line-no">3433</span><span id="line-3433"> int regionsInTransition = 0;</span>
<span class="source-line-no">3434</span><span id="line-3434"> int totalRegions = 0;</span>
<span class="source-line-no">3435</span><span id="line-3435"> if (regionStatesCount != null) {</span>
<span class="source-line-no">3436</span><span id="line-3436"> closedRegions = regionStatesCount.getClosedRegions();</span>
<span class="source-line-no">3437</span><span id="line-3437"> regionsInTransition = regionStatesCount.getRegionsInTransition();</span>
<span class="source-line-no">3438</span><span id="line-3438"> openRegions = regionStatesCount.getOpenRegions();</span>
<span class="source-line-no">3439</span><span id="line-3439"> splitRegions = regionStatesCount.getSplitRegions();</span>
<span class="source-line-no">3440</span><span id="line-3440"> totalRegions = regionStatesCount.getTotalRegions();</span>
<span class="source-line-no">3441</span><span id="line-3441"> }</span>
<span class="source-line-no">3442</span><span id="line-3442"> return new RegionStatesCount.RegionStatesCountBuilder().setOpenRegions(openRegions)</span>
<span class="source-line-no">3443</span><span id="line-3443"> .setSplitRegions(splitRegions).setClosedRegions(closedRegions)</span>
<span class="source-line-no">3444</span><span id="line-3444"> .setRegionsInTransition(regionsInTransition).setTotalRegions(totalRegions).build();</span>
<span class="source-line-no">3445</span><span id="line-3445"> }</span>
<span class="source-line-no">3446</span><span id="line-3446"></span>
<span class="source-line-no">3447</span><span id="line-3447"> /**</span>
<span class="source-line-no">3448</span><span id="line-3448"> * Convert Protobuf class</span>
<span class="source-line-no">3449</span><span id="line-3449"> * {@link org.apache.hadoop.hbase.shaded.protobuf.generated.TooSlowLog.SlowLogPayload} To client</span>
<span class="source-line-no">3450</span><span id="line-3450"> * SlowLog Payload class {@link OnlineLogRecord}</span>
<span class="source-line-no">3451</span><span id="line-3451"> * @param slowLogPayload SlowLog Payload protobuf instance</span>
<span class="source-line-no">3452</span><span id="line-3452"> * @return SlowLog Payload for client usecase</span>
<span class="source-line-no">3453</span><span id="line-3453"> */</span>
<span class="source-line-no">3454</span><span id="line-3454"> private static LogEntry getSlowLogRecord(final TooSlowLog.SlowLogPayload slowLogPayload) {</span>
<span class="source-line-no">3455</span><span id="line-3455"> OnlineLogRecord.OnlineLogRecordBuilder onlineLogRecord =</span>
<span class="source-line-no">3456</span><span id="line-3456"> new OnlineLogRecord.OnlineLogRecordBuilder().setCallDetails(slowLogPayload.getCallDetails())</span>
<span class="source-line-no">3457</span><span id="line-3457"> .setClientAddress(slowLogPayload.getClientAddress())</span>
<span class="source-line-no">3458</span><span id="line-3458"> .setMethodName(slowLogPayload.getMethodName())</span>
<span class="source-line-no">3459</span><span id="line-3459"> .setMultiGetsCount(slowLogPayload.getMultiGets())</span>
<span class="source-line-no">3460</span><span id="line-3460"> .setMultiMutationsCount(slowLogPayload.getMultiMutations())</span>
<span class="source-line-no">3461</span><span id="line-3461"> .setMultiServiceCalls(slowLogPayload.getMultiServiceCalls())</span>
<span class="source-line-no">3462</span><span id="line-3462"> .setParam(slowLogPayload.getParam()).setProcessingTime(slowLogPayload.getProcessingTime())</span>
<span class="source-line-no">3463</span><span id="line-3463"> .setQueueTime(slowLogPayload.getQueueTime()).setRegionName(slowLogPayload.getRegionName())</span>
<span class="source-line-no">3464</span><span id="line-3464"> .setResponseSize(slowLogPayload.getResponseSize())</span>
<span class="source-line-no">3465</span><span id="line-3465"> .setBlockBytesScanned(slowLogPayload.getBlockBytesScanned())</span>
<span class="source-line-no">3466</span><span id="line-3466"> .setFsReadTime(slowLogPayload.getFsReadTime())</span>
<span class="source-line-no">3467</span><span id="line-3467"> .setServerClass(slowLogPayload.getServerClass()).setStartTime(slowLogPayload.getStartTime())</span>
<span class="source-line-no">3468</span><span id="line-3468"> .setUserName(slowLogPayload.getUserName())</span>
<span class="source-line-no">3469</span><span id="line-3469"> .setRequestAttributes(convertNameBytesPairsToMap(slowLogPayload.getRequestAttributeList()))</span>
<span class="source-line-no">3470</span><span id="line-3470"> .setConnectionAttributes(</span>
<span class="source-line-no">3471</span><span id="line-3471"> convertNameBytesPairsToMap(slowLogPayload.getConnectionAttributeList()));</span>
<span class="source-line-no">3472</span><span id="line-3472"> if (slowLogPayload.hasScan()) {</span>
<span class="source-line-no">3473</span><span id="line-3473"> try {</span>
<span class="source-line-no">3474</span><span id="line-3474"> onlineLogRecord.setScan(ProtobufUtil.toScan(slowLogPayload.getScan()));</span>
<span class="source-line-no">3475</span><span id="line-3475"> } catch (Exception e) {</span>
<span class="source-line-no">3476</span><span id="line-3476"> LOG.warn("Failed to convert Scan proto {}", slowLogPayload.getScan(), e);</span>
<span class="source-line-no">3477</span><span id="line-3477"> }</span>
<span class="source-line-no">3478</span><span id="line-3478"> }</span>
<span class="source-line-no">3479</span><span id="line-3479"> return onlineLogRecord.build();</span>
<span class="source-line-no">3480</span><span id="line-3480"> }</span>
<span class="source-line-no">3481</span><span id="line-3481"></span>
<span class="source-line-no">3482</span><span id="line-3482"> private static Map&lt;String, byte[]&gt;</span>
<span class="source-line-no">3483</span><span id="line-3483"> convertNameBytesPairsToMap(List&lt;NameBytesPair&gt; nameBytesPairs) {</span>
<span class="source-line-no">3484</span><span id="line-3484"> return nameBytesPairs.stream().collect(Collectors.toMap(NameBytesPair::getName,</span>
<span class="source-line-no">3485</span><span id="line-3485"> nameBytesPair -&gt; nameBytesPair.getValue().toByteArray()));</span>
<span class="source-line-no">3486</span><span id="line-3486"> }</span>
<span class="source-line-no">3487</span><span id="line-3487"></span>
<span class="source-line-no">3488</span><span id="line-3488"> /**</span>
<span class="source-line-no">3489</span><span id="line-3489"> * Convert AdminProtos#SlowLogResponses to list of {@link OnlineLogRecord}</span>
<span class="source-line-no">3490</span><span id="line-3490"> * @param logEntry slowlog response protobuf instance</span>
<span class="source-line-no">3491</span><span id="line-3491"> * @return list of SlowLog payloads for client usecase</span>
<span class="source-line-no">3492</span><span id="line-3492"> */</span>
<span class="source-line-no">3493</span><span id="line-3493"> public static List&lt;LogEntry&gt; toSlowLogPayloads(final HBaseProtos.LogEntry logEntry) {</span>
<span class="source-line-no">3494</span><span id="line-3494"> try {</span>
<span class="source-line-no">3495</span><span id="line-3495"> final String logClassName = logEntry.getLogClassName();</span>
<span class="source-line-no">3496</span><span id="line-3496"> Class&lt;?&gt; logClass = Class.forName(logClassName).asSubclass(Message.class);</span>
<span class="source-line-no">3497</span><span id="line-3497"> Method method = logClass.getMethod("parseFrom", ByteString.class);</span>
<span class="source-line-no">3498</span><span id="line-3498"> if (logClassName.contains("SlowLogResponses")) {</span>
<span class="source-line-no">3499</span><span id="line-3499"> AdminProtos.SlowLogResponses slowLogResponses =</span>
<span class="source-line-no">3500</span><span id="line-3500"> (AdminProtos.SlowLogResponses) method.invoke(null, logEntry.getLogMessage());</span>
<span class="source-line-no">3501</span><span id="line-3501"> return slowLogResponses.getSlowLogPayloadsList().stream()</span>
<span class="source-line-no">3502</span><span id="line-3502"> .map(ProtobufUtil::getSlowLogRecord).collect(Collectors.toList());</span>
<span class="source-line-no">3503</span><span id="line-3503"> }</span>
<span class="source-line-no">3504</span><span id="line-3504"> } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException</span>
<span class="source-line-no">3505</span><span id="line-3505"> | InvocationTargetException e) {</span>
<span class="source-line-no">3506</span><span id="line-3506"> throw new RuntimeException("Error while retrieving response from server");</span>
<span class="source-line-no">3507</span><span id="line-3507"> }</span>
<span class="source-line-no">3508</span><span id="line-3508"> throw new RuntimeException("Invalid response from server");</span>
<span class="source-line-no">3509</span><span id="line-3509"> }</span>
<span class="source-line-no">3510</span><span id="line-3510"></span>
<span class="source-line-no">3511</span><span id="line-3511"> /**</span>
<span class="source-line-no">3512</span><span id="line-3512"> * Convert {@link ClearSlowLogResponses} to boolean</span>
<span class="source-line-no">3513</span><span id="line-3513"> * @param clearSlowLogResponses Clear slowlog response protobuf instance</span>
<span class="source-line-no">3514</span><span id="line-3514"> * @return boolean representing clear slowlog response</span>
<span class="source-line-no">3515</span><span id="line-3515"> */</span>
<span class="source-line-no">3516</span><span id="line-3516"> public static boolean toClearSlowLogPayload(final ClearSlowLogResponses clearSlowLogResponses) {</span>
<span class="source-line-no">3517</span><span id="line-3517"> return clearSlowLogResponses.getIsCleaned();</span>
<span class="source-line-no">3518</span><span id="line-3518"> }</span>
<span class="source-line-no">3519</span><span id="line-3519"></span>
<span class="source-line-no">3520</span><span id="line-3520"> public static void populateBalanceRSGroupResponse(</span>
<span class="source-line-no">3521</span><span id="line-3521"> RSGroupAdminProtos.BalanceRSGroupResponse.Builder responseBuilder, BalanceResponse response) {</span>
<span class="source-line-no">3522</span><span id="line-3522"> responseBuilder.setBalanceRan(response.isBalancerRan())</span>
<span class="source-line-no">3523</span><span id="line-3523"> .setMovesCalculated(response.getMovesCalculated())</span>
<span class="source-line-no">3524</span><span id="line-3524"> .setMovesExecuted(response.getMovesExecuted());</span>
<span class="source-line-no">3525</span><span id="line-3525"> }</span>
<span class="source-line-no">3526</span><span id="line-3526"></span>
<span class="source-line-no">3527</span><span id="line-3527"> public static BalanceResponse</span>
<span class="source-line-no">3528</span><span id="line-3528"> toBalanceResponse(RSGroupAdminProtos.BalanceRSGroupResponse response) {</span>
<span class="source-line-no">3529</span><span id="line-3529"> return BalanceResponse.newBuilder().setBalancerRan(response.getBalanceRan())</span>
<span class="source-line-no">3530</span><span id="line-3530"> .setMovesExecuted(response.hasMovesExecuted() ? response.getMovesExecuted() : 0)</span>
<span class="source-line-no">3531</span><span id="line-3531"> .setMovesCalculated(response.hasMovesCalculated() ? response.getMovesCalculated() : 0)</span>
<span class="source-line-no">3532</span><span id="line-3532"> .build();</span>
<span class="source-line-no">3533</span><span id="line-3533"> }</span>
<span class="source-line-no">3534</span><span id="line-3534"></span>
<span class="source-line-no">3535</span><span id="line-3535"> public static RSGroupAdminProtos.BalanceRSGroupRequest</span>
<span class="source-line-no">3536</span><span id="line-3536"> createBalanceRSGroupRequest(String groupName, BalanceRequest request) {</span>
<span class="source-line-no">3537</span><span id="line-3537"> return RSGroupAdminProtos.BalanceRSGroupRequest.newBuilder().setRSGroupName(groupName)</span>
<span class="source-line-no">3538</span><span id="line-3538"> .setDryRun(request.isDryRun()).setIgnoreRit(request.isIgnoreRegionsInTransition()).build();</span>
<span class="source-line-no">3539</span><span id="line-3539"> }</span>
<span class="source-line-no">3540</span><span id="line-3540"></span>
<span class="source-line-no">3541</span><span id="line-3541"> public static BalanceRequest toBalanceRequest(RSGroupAdminProtos.BalanceRSGroupRequest request) {</span>
<span class="source-line-no">3542</span><span id="line-3542"> return BalanceRequest.newBuilder().setDryRun(request.hasDryRun() &amp;&amp; request.getDryRun())</span>
<span class="source-line-no">3543</span><span id="line-3543"> .setIgnoreRegionsInTransition(request.hasIgnoreRit() &amp;&amp; request.getIgnoreRit()).build();</span>
<span class="source-line-no">3544</span><span id="line-3544"> }</span>
<span class="source-line-no">3545</span><span id="line-3545"></span>
<span class="source-line-no">3546</span><span id="line-3546"> public static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) {</span>
<span class="source-line-no">3547</span><span id="line-3547"> RSGroupInfo rsGroupInfo = new RSGroupInfo(proto.getName());</span>
<span class="source-line-no">3548</span><span id="line-3548"></span>
<span class="source-line-no">3549</span><span id="line-3549"> Collection&lt;Address&gt; addresses = proto.getServersList().parallelStream()</span>
<span class="source-line-no">3550</span><span id="line-3550"> .map(serverName -&gt; Address.fromParts(serverName.getHostName(), serverName.getPort()))</span>
<span class="source-line-no">3551</span><span id="line-3551"> .collect(Collectors.toList());</span>
<span class="source-line-no">3552</span><span id="line-3552"> rsGroupInfo.addAllServers(addresses);</span>
<span class="source-line-no">3553</span><span id="line-3553"></span>
<span class="source-line-no">3554</span><span id="line-3554"> Collection&lt;TableName&gt; tables = proto.getTablesList().parallelStream()</span>
<span class="source-line-no">3555</span><span id="line-3555"> .map(ProtobufUtil::toTableName).collect(Collectors.toList());</span>
<span class="source-line-no">3556</span><span id="line-3556"> rsGroupInfo.addAllTables(tables);</span>
<span class="source-line-no">3557</span><span id="line-3557"></span>
<span class="source-line-no">3558</span><span id="line-3558"> proto.getConfigurationList()</span>
<span class="source-line-no">3559</span><span id="line-3559"> .forEach(pair -&gt; rsGroupInfo.setConfiguration(pair.getName(), pair.getValue()));</span>
<span class="source-line-no">3560</span><span id="line-3560"> return rsGroupInfo;</span>
<span class="source-line-no">3561</span><span id="line-3561"> }</span>
<span class="source-line-no">3562</span><span id="line-3562"></span>
<span class="source-line-no">3563</span><span id="line-3563"> public static RSGroupProtos.RSGroupInfo toProtoGroupInfo(RSGroupInfo pojo) {</span>
<span class="source-line-no">3564</span><span id="line-3564"> List&lt;HBaseProtos.TableName&gt; tables = new ArrayList&lt;&gt;(pojo.getTables().size());</span>
<span class="source-line-no">3565</span><span id="line-3565"> for (TableName arg : pojo.getTables()) {</span>
<span class="source-line-no">3566</span><span id="line-3566"> tables.add(ProtobufUtil.toProtoTableName(arg));</span>
<span class="source-line-no">3567</span><span id="line-3567"> }</span>
<span class="source-line-no">3568</span><span id="line-3568"> List&lt;HBaseProtos.ServerName&gt; hostports = new ArrayList&lt;&gt;(pojo.getServers().size());</span>
<span class="source-line-no">3569</span><span id="line-3569"> for (Address el : pojo.getServers()) {</span>
<span class="source-line-no">3570</span><span id="line-3570"> hostports.add(HBaseProtos.ServerName.newBuilder().setHostName(el.getHostname())</span>
<span class="source-line-no">3571</span><span id="line-3571"> .setPort(el.getPort()).build());</span>
<span class="source-line-no">3572</span><span id="line-3572"> }</span>
<span class="source-line-no">3573</span><span id="line-3573"> List&lt;</span>
<span class="source-line-no">3574</span><span id="line-3574"> NameStringPair&gt; configuration =</span>
<span class="source-line-no">3575</span><span id="line-3575"> pojo</span>
<span class="source-line-no">3576</span><span id="line-3576"> .getConfiguration().entrySet().stream().map(entry -&gt; NameStringPair.newBuilder()</span>
<span class="source-line-no">3577</span><span id="line-3577"> .setName(entry.getKey()).setValue(entry.getValue()).build())</span>
<span class="source-line-no">3578</span><span id="line-3578"> .collect(Collectors.toList());</span>
<span class="source-line-no">3579</span><span id="line-3579"> return RSGroupProtos.RSGroupInfo.newBuilder().setName(pojo.getName()).addAllServers(hostports)</span>
<span class="source-line-no">3580</span><span id="line-3580"> .addAllTables(tables).addAllConfiguration(configuration).build();</span>
<span class="source-line-no">3581</span><span id="line-3581"> }</span>
<span class="source-line-no">3582</span><span id="line-3582"></span>
<span class="source-line-no">3583</span><span id="line-3583"> public static CheckAndMutate toCheckAndMutate(ClientProtos.Condition condition,</span>
<span class="source-line-no">3584</span><span id="line-3584"> MutationProto mutation, CellScanner cellScanner) throws IOException {</span>
<span class="source-line-no">3585</span><span id="line-3585"> byte[] row = condition.getRow().toByteArray();</span>
<span class="source-line-no">3586</span><span id="line-3586"> CheckAndMutate.Builder builder = CheckAndMutate.newBuilder(row);</span>
<span class="source-line-no">3587</span><span id="line-3587"> Filter filter = condition.hasFilter() ? ProtobufUtil.toFilter(condition.getFilter()) : null;</span>
<span class="source-line-no">3588</span><span id="line-3588"> if (filter != null) {</span>
<span class="source-line-no">3589</span><span id="line-3589"> builder.ifMatches(filter);</span>
<span class="source-line-no">3590</span><span id="line-3590"> } else {</span>
<span class="source-line-no">3591</span><span id="line-3591"> builder.ifMatches(condition.getFamily().toByteArray(), condition.getQualifier().toByteArray(),</span>
<span class="source-line-no">3592</span><span id="line-3592"> CompareOperator.valueOf(condition.getCompareType().name()),</span>
<span class="source-line-no">3593</span><span id="line-3593"> ProtobufUtil.toComparator(condition.getComparator()).getValue());</span>
<span class="source-line-no">3594</span><span id="line-3594"> }</span>
<span class="source-line-no">3595</span><span id="line-3595"> TimeRange timeRange = condition.hasTimeRange()</span>
<span class="source-line-no">3596</span><span id="line-3596"> ? ProtobufUtil.toTimeRange(condition.getTimeRange())</span>
<span class="source-line-no">3597</span><span id="line-3597"> : TimeRange.allTime();</span>
<span class="source-line-no">3598</span><span id="line-3598"> builder.timeRange(timeRange);</span>
<span class="source-line-no">3599</span><span id="line-3599"></span>
<span class="source-line-no">3600</span><span id="line-3600"> try {</span>
<span class="source-line-no">3601</span><span id="line-3601"> MutationType type = mutation.getMutateType();</span>
<span class="source-line-no">3602</span><span id="line-3602"> switch (type) {</span>
<span class="source-line-no">3603</span><span id="line-3603"> case PUT:</span>
<span class="source-line-no">3604</span><span id="line-3604"> return builder.build(ProtobufUtil.toPut(mutation, cellScanner));</span>
<span class="source-line-no">3605</span><span id="line-3605"> case DELETE:</span>
<span class="source-line-no">3606</span><span id="line-3606"> return builder.build(ProtobufUtil.toDelete(mutation, cellScanner));</span>
<span class="source-line-no">3607</span><span id="line-3607"> case INCREMENT:</span>
<span class="source-line-no">3608</span><span id="line-3608"> return builder.build(ProtobufUtil.toIncrement(mutation, cellScanner));</span>
<span class="source-line-no">3609</span><span id="line-3609"> case APPEND:</span>
<span class="source-line-no">3610</span><span id="line-3610"> return builder.build(ProtobufUtil.toAppend(mutation, cellScanner));</span>
<span class="source-line-no">3611</span><span id="line-3611"> default:</span>
<span class="source-line-no">3612</span><span id="line-3612"> throw new DoNotRetryIOException("Unsupported mutate type: " + type.name());</span>
<span class="source-line-no">3613</span><span id="line-3613"> }</span>
<span class="source-line-no">3614</span><span id="line-3614"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">3615</span><span id="line-3615"> throw new DoNotRetryIOException(e.getMessage());</span>
<span class="source-line-no">3616</span><span id="line-3616"> }</span>
<span class="source-line-no">3617</span><span id="line-3617"> }</span>
<span class="source-line-no">3618</span><span id="line-3618"></span>
<span class="source-line-no">3619</span><span id="line-3619"> public static CheckAndMutate toCheckAndMutate(ClientProtos.Condition condition,</span>
<span class="source-line-no">3620</span><span id="line-3620"> List&lt;Mutation&gt; mutations) throws IOException {</span>
<span class="source-line-no">3621</span><span id="line-3621"> assert mutations.size() &gt; 0;</span>
<span class="source-line-no">3622</span><span id="line-3622"> byte[] row = condition.getRow().toByteArray();</span>
<span class="source-line-no">3623</span><span id="line-3623"> CheckAndMutate.Builder builder = CheckAndMutate.newBuilder(row);</span>
<span class="source-line-no">3624</span><span id="line-3624"> Filter filter = condition.hasFilter() ? ProtobufUtil.toFilter(condition.getFilter()) : null;</span>
<span class="source-line-no">3625</span><span id="line-3625"> if (filter != null) {</span>
<span class="source-line-no">3626</span><span id="line-3626"> builder.ifMatches(filter);</span>
<span class="source-line-no">3627</span><span id="line-3627"> } else {</span>
<span class="source-line-no">3628</span><span id="line-3628"> builder.ifMatches(condition.getFamily().toByteArray(), condition.getQualifier().toByteArray(),</span>
<span class="source-line-no">3629</span><span id="line-3629"> CompareOperator.valueOf(condition.getCompareType().name()),</span>
<span class="source-line-no">3630</span><span id="line-3630"> ProtobufUtil.toComparator(condition.getComparator()).getValue());</span>
<span class="source-line-no">3631</span><span id="line-3631"> }</span>
<span class="source-line-no">3632</span><span id="line-3632"> TimeRange timeRange = condition.hasTimeRange()</span>
<span class="source-line-no">3633</span><span id="line-3633"> ? ProtobufUtil.toTimeRange(condition.getTimeRange())</span>
<span class="source-line-no">3634</span><span id="line-3634"> : TimeRange.allTime();</span>
<span class="source-line-no">3635</span><span id="line-3635"> builder.timeRange(timeRange);</span>
<span class="source-line-no">3636</span><span id="line-3636"></span>
<span class="source-line-no">3637</span><span id="line-3637"> try {</span>
<span class="source-line-no">3638</span><span id="line-3638"> if (mutations.size() == 1) {</span>
<span class="source-line-no">3639</span><span id="line-3639"> Mutation m = mutations.get(0);</span>
<span class="source-line-no">3640</span><span id="line-3640"> if (m instanceof Put) {</span>
<span class="source-line-no">3641</span><span id="line-3641"> return builder.build((Put) m);</span>
<span class="source-line-no">3642</span><span id="line-3642"> } else if (m instanceof Delete) {</span>
<span class="source-line-no">3643</span><span id="line-3643"> return builder.build((Delete) m);</span>
<span class="source-line-no">3644</span><span id="line-3644"> } else if (m instanceof Increment) {</span>
<span class="source-line-no">3645</span><span id="line-3645"> return builder.build((Increment) m);</span>
<span class="source-line-no">3646</span><span id="line-3646"> } else if (m instanceof Append) {</span>
<span class="source-line-no">3647</span><span id="line-3647"> return builder.build((Append) m);</span>
<span class="source-line-no">3648</span><span id="line-3648"> } else {</span>
<span class="source-line-no">3649</span><span id="line-3649"> throw new DoNotRetryIOException(</span>
<span class="source-line-no">3650</span><span id="line-3650"> "Unsupported mutate type: " + m.getClass().getSimpleName().toUpperCase());</span>
<span class="source-line-no">3651</span><span id="line-3651"> }</span>
<span class="source-line-no">3652</span><span id="line-3652"> } else {</span>
<span class="source-line-no">3653</span><span id="line-3653"> return builder.build(new RowMutations(mutations.get(0).getRow()).add(mutations));</span>
<span class="source-line-no">3654</span><span id="line-3654"> }</span>
<span class="source-line-no">3655</span><span id="line-3655"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">3656</span><span id="line-3656"> throw new DoNotRetryIOException(e.getMessage());</span>
<span class="source-line-no">3657</span><span id="line-3657"> }</span>
<span class="source-line-no">3658</span><span id="line-3658"> }</span>
<span class="source-line-no">3659</span><span id="line-3659"></span>
<span class="source-line-no">3660</span><span id="line-3660"> public static ClientProtos.Condition toCondition(final byte[] row, final byte[] family,</span>
<span class="source-line-no">3661</span><span id="line-3661"> final byte[] qualifier, final CompareOperator op, final byte[] value, final Filter filter,</span>
<span class="source-line-no">3662</span><span id="line-3662"> final TimeRange timeRange) throws IOException {</span>
<span class="source-line-no">3663</span><span id="line-3663"></span>
<span class="source-line-no">3664</span><span id="line-3664"> ClientProtos.Condition.Builder builder =</span>
<span class="source-line-no">3665</span><span id="line-3665"> ClientProtos.Condition.newBuilder().setRow(UnsafeByteOperations.unsafeWrap(row));</span>
<span class="source-line-no">3666</span><span id="line-3666"></span>
<span class="source-line-no">3667</span><span id="line-3667"> if (filter != null) {</span>
<span class="source-line-no">3668</span><span id="line-3668"> builder.setFilter(ProtobufUtil.toFilter(filter));</span>
<span class="source-line-no">3669</span><span id="line-3669"> } else {</span>
<span class="source-line-no">3670</span><span id="line-3670"> builder.setFamily(UnsafeByteOperations.unsafeWrap(family))</span>
<span class="source-line-no">3671</span><span id="line-3671"> .setQualifier(UnsafeByteOperations</span>
<span class="source-line-no">3672</span><span id="line-3672"> .unsafeWrap(qualifier == null ? HConstants.EMPTY_BYTE_ARRAY : qualifier))</span>
<span class="source-line-no">3673</span><span id="line-3673"> .setComparator(ProtobufUtil.toComparator(new BinaryComparator(value)))</span>
<span class="source-line-no">3674</span><span id="line-3674"> .setCompareType(HBaseProtos.CompareType.valueOf(op.name()));</span>
<span class="source-line-no">3675</span><span id="line-3675"> }</span>
<span class="source-line-no">3676</span><span id="line-3676"></span>
<span class="source-line-no">3677</span><span id="line-3677"> return builder.setTimeRange(ProtobufUtil.toTimeRange(timeRange)).build();</span>
<span class="source-line-no">3678</span><span id="line-3678"> }</span>
<span class="source-line-no">3679</span><span id="line-3679"></span>
<span class="source-line-no">3680</span><span id="line-3680"> public static ClientProtos.Condition toCondition(final byte[] row, final Filter filter,</span>
<span class="source-line-no">3681</span><span id="line-3681"> final TimeRange timeRange) throws IOException {</span>
<span class="source-line-no">3682</span><span id="line-3682"> return toCondition(row, null, null, null, null, filter, timeRange);</span>
<span class="source-line-no">3683</span><span id="line-3683"> }</span>
<span class="source-line-no">3684</span><span id="line-3684"></span>
<span class="source-line-no">3685</span><span id="line-3685"> public static ClientProtos.Condition toCondition(final byte[] row, final byte[] family,</span>
<span class="source-line-no">3686</span><span id="line-3686"> final byte[] qualifier, final CompareOperator op, final byte[] value, final TimeRange timeRange)</span>
<span class="source-line-no">3687</span><span id="line-3687"> throws IOException {</span>
<span class="source-line-no">3688</span><span id="line-3688"> return toCondition(row, family, qualifier, op, value, null, timeRange);</span>
<span class="source-line-no">3689</span><span id="line-3689"> }</span>
<span class="source-line-no">3690</span><span id="line-3690"></span>
<span class="source-line-no">3691</span><span id="line-3691"> public static List&lt;LogEntry&gt; toBalancerDecisionResponse(HBaseProtos.LogEntry logEntry) {</span>
<span class="source-line-no">3692</span><span id="line-3692"> try {</span>
<span class="source-line-no">3693</span><span id="line-3693"> final String logClassName = logEntry.getLogClassName();</span>
<span class="source-line-no">3694</span><span id="line-3694"> Class&lt;?&gt; logClass = Class.forName(logClassName).asSubclass(Message.class);</span>
<span class="source-line-no">3695</span><span id="line-3695"> Method method = logClass.getMethod("parseFrom", ByteString.class);</span>
<span class="source-line-no">3696</span><span id="line-3696"> if (logClassName.contains("BalancerDecisionsResponse")) {</span>
<span class="source-line-no">3697</span><span id="line-3697"> MasterProtos.BalancerDecisionsResponse response =</span>
<span class="source-line-no">3698</span><span id="line-3698"> (MasterProtos.BalancerDecisionsResponse) method.invoke(null, logEntry.getLogMessage());</span>
<span class="source-line-no">3699</span><span id="line-3699"> return getBalancerDecisionEntries(response);</span>
<span class="source-line-no">3700</span><span id="line-3700"> }</span>
<span class="source-line-no">3701</span><span id="line-3701"> } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException</span>
<span class="source-line-no">3702</span><span id="line-3702"> | InvocationTargetException e) {</span>
<span class="source-line-no">3703</span><span id="line-3703"> throw new RuntimeException("Error while retrieving response from server");</span>
<span class="source-line-no">3704</span><span id="line-3704"> }</span>
<span class="source-line-no">3705</span><span id="line-3705"> throw new RuntimeException("Invalid response from server");</span>
<span class="source-line-no">3706</span><span id="line-3706"> }</span>
<span class="source-line-no">3707</span><span id="line-3707"></span>
<span class="source-line-no">3708</span><span id="line-3708"> public static List&lt;LogEntry&gt; toBalancerRejectionResponse(HBaseProtos.LogEntry logEntry) {</span>
<span class="source-line-no">3709</span><span id="line-3709"> try {</span>
<span class="source-line-no">3710</span><span id="line-3710"> final String logClassName = logEntry.getLogClassName();</span>
<span class="source-line-no">3711</span><span id="line-3711"> Class&lt;?&gt; logClass = Class.forName(logClassName).asSubclass(Message.class);</span>
<span class="source-line-no">3712</span><span id="line-3712"> Method method = logClass.getMethod("parseFrom", ByteString.class);</span>
<span class="source-line-no">3713</span><span id="line-3713"> if (logClassName.contains("BalancerRejectionsResponse")) {</span>
<span class="source-line-no">3714</span><span id="line-3714"> MasterProtos.BalancerRejectionsResponse response =</span>
<span class="source-line-no">3715</span><span id="line-3715"> (MasterProtos.BalancerRejectionsResponse) method.invoke(null, logEntry.getLogMessage());</span>
<span class="source-line-no">3716</span><span id="line-3716"> return getBalancerRejectionEntries(response);</span>
<span class="source-line-no">3717</span><span id="line-3717"> }</span>
<span class="source-line-no">3718</span><span id="line-3718"> } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException</span>
<span class="source-line-no">3719</span><span id="line-3719"> | InvocationTargetException e) {</span>
<span class="source-line-no">3720</span><span id="line-3720"> throw new RuntimeException("Error while retrieving response from server");</span>
<span class="source-line-no">3721</span><span id="line-3721"> }</span>
<span class="source-line-no">3722</span><span id="line-3722"> throw new RuntimeException("Invalid response from server");</span>
<span class="source-line-no">3723</span><span id="line-3723"> }</span>
<span class="source-line-no">3724</span><span id="line-3724"></span>
<span class="source-line-no">3725</span><span id="line-3725"> public static List&lt;LogEntry&gt;</span>
<span class="source-line-no">3726</span><span id="line-3726"> getBalancerDecisionEntries(MasterProtos.BalancerDecisionsResponse response) {</span>
<span class="source-line-no">3727</span><span id="line-3727"> List&lt;RecentLogs.BalancerDecision&gt; balancerDecisions = response.getBalancerDecisionList();</span>
<span class="source-line-no">3728</span><span id="line-3728"> if (CollectionUtils.isEmpty(balancerDecisions)) {</span>
<span class="source-line-no">3729</span><span id="line-3729"> return Collections.emptyList();</span>
<span class="source-line-no">3730</span><span id="line-3730"> }</span>
<span class="source-line-no">3731</span><span id="line-3731"> return balancerDecisions.stream()</span>
<span class="source-line-no">3732</span><span id="line-3732"> .map(balancerDecision -&gt; new BalancerDecision.Builder()</span>
<span class="source-line-no">3733</span><span id="line-3733"> .setInitTotalCost(balancerDecision.getInitTotalCost())</span>
<span class="source-line-no">3734</span><span id="line-3734"> .setInitialFunctionCosts(balancerDecision.getInitialFunctionCosts())</span>
<span class="source-line-no">3735</span><span id="line-3735"> .setComputedTotalCost(balancerDecision.getComputedTotalCost())</span>
<span class="source-line-no">3736</span><span id="line-3736"> .setFinalFunctionCosts(balancerDecision.getFinalFunctionCosts())</span>
<span class="source-line-no">3737</span><span id="line-3737"> .setComputedSteps(balancerDecision.getComputedSteps())</span>
<span class="source-line-no">3738</span><span id="line-3738"> .setRegionPlans(balancerDecision.getRegionPlansList()).build())</span>
<span class="source-line-no">3739</span><span id="line-3739"> .collect(Collectors.toList());</span>
<span class="source-line-no">3740</span><span id="line-3740"> }</span>
<span class="source-line-no">3741</span><span id="line-3741"></span>
<span class="source-line-no">3742</span><span id="line-3742"> public static List&lt;LogEntry&gt;</span>
<span class="source-line-no">3743</span><span id="line-3743"> getBalancerRejectionEntries(MasterProtos.BalancerRejectionsResponse response) {</span>
<span class="source-line-no">3744</span><span id="line-3744"> List&lt;RecentLogs.BalancerRejection&gt; balancerRejections = response.getBalancerRejectionList();</span>
<span class="source-line-no">3745</span><span id="line-3745"> if (CollectionUtils.isEmpty(balancerRejections)) {</span>
<span class="source-line-no">3746</span><span id="line-3746"> return Collections.emptyList();</span>
<span class="source-line-no">3747</span><span id="line-3747"> }</span>
<span class="source-line-no">3748</span><span id="line-3748"> return balancerRejections.stream()</span>
<span class="source-line-no">3749</span><span id="line-3749"> .map(balancerRejection -&gt; new BalancerRejection.Builder()</span>
<span class="source-line-no">3750</span><span id="line-3750"> .setReason(balancerRejection.getReason())</span>
<span class="source-line-no">3751</span><span id="line-3751"> .setCostFuncInfoList(balancerRejection.getCostFuncInfoList()).build())</span>
<span class="source-line-no">3752</span><span id="line-3752"> .collect(Collectors.toList());</span>
<span class="source-line-no">3753</span><span id="line-3753"> }</span>
<span class="source-line-no">3754</span><span id="line-3754"></span>
<span class="source-line-no">3755</span><span id="line-3755"> public static HBaseProtos.LogRequest toBalancerDecisionRequest(int limit) {</span>
<span class="source-line-no">3756</span><span id="line-3756"> MasterProtos.BalancerDecisionsRequest balancerDecisionsRequest =</span>
<span class="source-line-no">3757</span><span id="line-3757"> MasterProtos.BalancerDecisionsRequest.newBuilder().setLimit(limit).build();</span>
<span class="source-line-no">3758</span><span id="line-3758"> return HBaseProtos.LogRequest.newBuilder()</span>
<span class="source-line-no">3759</span><span id="line-3759"> .setLogClassName(balancerDecisionsRequest.getClass().getName())</span>
<span class="source-line-no">3760</span><span id="line-3760"> .setLogMessage(balancerDecisionsRequest.toByteString()).build();</span>
<span class="source-line-no">3761</span><span id="line-3761"> }</span>
<span class="source-line-no">3762</span><span id="line-3762"></span>
<span class="source-line-no">3763</span><span id="line-3763"> public static HBaseProtos.LogRequest toBalancerRejectionRequest(int limit) {</span>
<span class="source-line-no">3764</span><span id="line-3764"> MasterProtos.BalancerRejectionsRequest balancerRejectionsRequest =</span>
<span class="source-line-no">3765</span><span id="line-3765"> MasterProtos.BalancerRejectionsRequest.newBuilder().setLimit(limit).build();</span>
<span class="source-line-no">3766</span><span id="line-3766"> return HBaseProtos.LogRequest.newBuilder()</span>
<span class="source-line-no">3767</span><span id="line-3767"> .setLogClassName(balancerRejectionsRequest.getClass().getName())</span>
<span class="source-line-no">3768</span><span id="line-3768"> .setLogMessage(balancerRejectionsRequest.toByteString()).build();</span>
<span class="source-line-no">3769</span><span id="line-3769"> }</span>
<span class="source-line-no">3770</span><span id="line-3770"></span>
<span class="source-line-no">3771</span><span id="line-3771"> public static MasterProtos.BalanceRequest toBalanceRequest(BalanceRequest request) {</span>
<span class="source-line-no">3772</span><span id="line-3772"> return MasterProtos.BalanceRequest.newBuilder().setDryRun(request.isDryRun())</span>
<span class="source-line-no">3773</span><span id="line-3773"> .setIgnoreRit(request.isIgnoreRegionsInTransition()).build();</span>
<span class="source-line-no">3774</span><span id="line-3774"> }</span>
<span class="source-line-no">3775</span><span id="line-3775"></span>
<span class="source-line-no">3776</span><span id="line-3776"> public static BalanceRequest toBalanceRequest(MasterProtos.BalanceRequest request) {</span>
<span class="source-line-no">3777</span><span id="line-3777"> return BalanceRequest.newBuilder().setDryRun(request.hasDryRun() &amp;&amp; request.getDryRun())</span>
<span class="source-line-no">3778</span><span id="line-3778"> .setIgnoreRegionsInTransition(request.hasIgnoreRit() &amp;&amp; request.getIgnoreRit()).build();</span>
<span class="source-line-no">3779</span><span id="line-3779"> }</span>
<span class="source-line-no">3780</span><span id="line-3780"></span>
<span class="source-line-no">3781</span><span id="line-3781"> public static MasterProtos.BalanceResponse toBalanceResponse(BalanceResponse response) {</span>
<span class="source-line-no">3782</span><span id="line-3782"> return MasterProtos.BalanceResponse.newBuilder().setBalancerRan(response.isBalancerRan())</span>
<span class="source-line-no">3783</span><span id="line-3783"> .setMovesCalculated(response.getMovesCalculated())</span>
<span class="source-line-no">3784</span><span id="line-3784"> .setMovesExecuted(response.getMovesExecuted()).build();</span>
<span class="source-line-no">3785</span><span id="line-3785"> }</span>
<span class="source-line-no">3786</span><span id="line-3786"></span>
<span class="source-line-no">3787</span><span id="line-3787"> public static BalanceResponse toBalanceResponse(MasterProtos.BalanceResponse response) {</span>
<span class="source-line-no">3788</span><span id="line-3788"> return BalanceResponse.newBuilder()</span>
<span class="source-line-no">3789</span><span id="line-3789"> .setBalancerRan(response.hasBalancerRan() &amp;&amp; response.getBalancerRan())</span>
<span class="source-line-no">3790</span><span id="line-3790"> .setMovesCalculated(response.hasMovesCalculated() ? response.getMovesExecuted() : 0)</span>
<span class="source-line-no">3791</span><span id="line-3791"> .setMovesExecuted(response.hasMovesExecuted() ? response.getMovesExecuted() : 0).build();</span>
<span class="source-line-no">3792</span><span id="line-3792"> }</span>
<span class="source-line-no">3793</span><span id="line-3793"></span>
<span class="source-line-no">3794</span><span id="line-3794"> public static ServerTask getServerTask(ClusterStatusProtos.ServerTask task) {</span>
<span class="source-line-no">3795</span><span id="line-3795"> return ServerTaskBuilder.newBuilder().setDescription(task.getDescription())</span>
<span class="source-line-no">3796</span><span id="line-3796"> .setStatus(task.getStatus()).setState(ServerTask.State.valueOf(task.getState().name()))</span>
<span class="source-line-no">3797</span><span id="line-3797"> .setStartTime(task.getStartTime()).setCompletionTime(task.getCompletionTime()).build();</span>
<span class="source-line-no">3798</span><span id="line-3798"> }</span>
<span class="source-line-no">3799</span><span id="line-3799"></span>
<span class="source-line-no">3800</span><span id="line-3800"> public static ClusterStatusProtos.ServerTask toServerTask(ServerTask task) {</span>
<span class="source-line-no">3801</span><span id="line-3801"> return ClusterStatusProtos.ServerTask.newBuilder().setDescription(task.getDescription())</span>
<span class="source-line-no">3802</span><span id="line-3802"> .setStatus(task.getStatus())</span>
<span class="source-line-no">3803</span><span id="line-3803"> .setState(ClusterStatusProtos.ServerTask.State.valueOf(task.getState().name()))</span>
<span class="source-line-no">3804</span><span id="line-3804"> .setStartTime(task.getStartTime()).setCompletionTime(task.getCompletionTime()).build();</span>
<span class="source-line-no">3805</span><span id="line-3805"> }</span>
<span class="source-line-no">3806</span><span id="line-3806"></span>
<span class="source-line-no">3807</span><span id="line-3807"> /**</span>
<span class="source-line-no">3808</span><span id="line-3808"> * Check whether this IPBE indicates EOF or not.</span>
<span class="source-line-no">3809</span><span id="line-3809"> * &lt;p/&gt;</span>
<span class="source-line-no">3810</span><span id="line-3810"> * We will check the exception message, if it is likely the one of</span>
<span class="source-line-no">3811</span><span id="line-3811"> * InvalidProtocolBufferException.truncatedMessage, we will consider it as EOF, otherwise not.</span>
<span class="source-line-no">3812</span><span id="line-3812"> */</span>
<span class="source-line-no">3813</span><span id="line-3813"> public static boolean isEOF(InvalidProtocolBufferException e) {</span>
<span class="source-line-no">3814</span><span id="line-3814"> return e.getMessage().contains("input has been truncated");</span>
<span class="source-line-no">3815</span><span id="line-3815"> }</span>
<span class="source-line-no">3816</span><span id="line-3816"></span>
<span class="source-line-no">3817</span><span id="line-3817"> /**</span>
<span class="source-line-no">3818</span><span id="line-3818"> * This is a wrapper of the PB message's parseDelimitedFrom. The difference is, if we can not</span>
<span class="source-line-no">3819</span><span id="line-3819"> * determine whether there are enough bytes in stream, i.e, the available method does not have a</span>
<span class="source-line-no">3820</span><span id="line-3820"> * valid return value, we will try to read all the bytes to a byte array first, and then parse the</span>
<span class="source-line-no">3821</span><span id="line-3821"> * pb message with {@link Parser#parseFrom(byte[])} instead of call</span>
<span class="source-line-no">3822</span><span id="line-3822"> * {@link Parser#parseDelimitedFrom(InputStream)} directly. This is because even if the bytes are</span>
<span class="source-line-no">3823</span><span id="line-3823"> * not enough bytes, {@link Parser#parseDelimitedFrom(InputStream)} could still return without any</span>
<span class="source-line-no">3824</span><span id="line-3824"> * errors but just leave us a partial PB message.</span>
<span class="source-line-no">3825</span><span id="line-3825"> * @return The PB message if we can parse it successfully, otherwise there will always be an</span>
<span class="source-line-no">3826</span><span id="line-3826"> * exception thrown, will never return {@code null}.</span>
<span class="source-line-no">3827</span><span id="line-3827"> */</span>
<span class="source-line-no">3828</span><span id="line-3828"> public static &lt;T extends Message&gt; T parseDelimitedFrom(InputStream in, Parser&lt;T&gt; parser)</span>
<span class="source-line-no">3829</span><span id="line-3829"> throws IOException {</span>
<span class="source-line-no">3830</span><span id="line-3830"> int firstByte = in.read();</span>
<span class="source-line-no">3831</span><span id="line-3831"> if (firstByte &lt; 0) {</span>
<span class="source-line-no">3832</span><span id="line-3832"> throw new EOFException("EOF while reading message size");</span>
<span class="source-line-no">3833</span><span id="line-3833"> }</span>
<span class="source-line-no">3834</span><span id="line-3834"> int size = CodedInputStream.readRawVarint32(firstByte, in);</span>
<span class="source-line-no">3835</span><span id="line-3835"> int available = in.available();</span>
<span class="source-line-no">3836</span><span id="line-3836"> if (available &gt; 0) {</span>
<span class="source-line-no">3837</span><span id="line-3837"> if (available &lt; size) {</span>
<span class="source-line-no">3838</span><span id="line-3838"> throw new EOFException("Available bytes not enough for parsing PB message, expect at least "</span>
<span class="source-line-no">3839</span><span id="line-3839"> + size + " bytes, but only " + available + " bytes available");</span>
<span class="source-line-no">3840</span><span id="line-3840"> }</span>
<span class="source-line-no">3841</span><span id="line-3841"> // this piece of code is copied from GeneratedMessageV3.parseFrom</span>
<span class="source-line-no">3842</span><span id="line-3842"> try {</span>
<span class="source-line-no">3843</span><span id="line-3843"> return parser.parseFrom(ByteStreams.limit(in, size));</span>
<span class="source-line-no">3844</span><span id="line-3844"> } catch (InvalidProtocolBufferException e) {</span>
<span class="source-line-no">3845</span><span id="line-3845"> throw e.unwrapIOException();</span>
<span class="source-line-no">3846</span><span id="line-3846"> }</span>
<span class="source-line-no">3847</span><span id="line-3847"> } else {</span>
<span class="source-line-no">3848</span><span id="line-3848"> // this usually means the stream does not have a proper available implementation, let's read</span>
<span class="source-line-no">3849</span><span id="line-3849"> // the content to an byte array before parsing.</span>
<span class="source-line-no">3850</span><span id="line-3850"> byte[] bytes = new byte[size];</span>
<span class="source-line-no">3851</span><span id="line-3851"> ByteStreams.readFully(in, bytes);</span>
<span class="source-line-no">3852</span><span id="line-3852"> return parser.parseFrom(bytes);</span>
<span class="source-line-no">3853</span><span id="line-3853"> }</span>
<span class="source-line-no">3854</span><span id="line-3854"> }</span>
<span class="source-line-no">3855</span><span id="line-3855">}</span>
</pre>
</div>
</main>
</body>
</html>