001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.hadoop.hdfs.protocolPB;
019    
020    import static com.google.common.base.Preconditions.checkNotNull;
021    
022    import java.io.EOFException;
023    import java.io.IOException;
024    import java.io.InputStream;
025    import java.util.ArrayList;
026    import java.util.Arrays;
027    import java.util.EnumSet;
028    import java.util.List;
029    
030    import com.google.common.base.Preconditions;
031    import org.apache.hadoop.fs.CacheFlag;
032    import org.apache.hadoop.fs.ContentSummary;
033    import org.apache.hadoop.fs.CreateFlag;
034    import org.apache.hadoop.fs.FsServerDefaults;
035    import org.apache.hadoop.fs.Path;
036    import org.apache.hadoop.fs.permission.AclEntry;
037    import org.apache.hadoop.fs.permission.AclEntryScope;
038    import org.apache.hadoop.fs.permission.AclEntryType;
039    import org.apache.hadoop.fs.permission.AclStatus;
040    import org.apache.hadoop.fs.permission.FsAction;
041    import org.apache.hadoop.fs.permission.FsPermission;
042    import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
043    import org.apache.hadoop.hdfs.DFSUtil;
044    import org.apache.hadoop.hdfs.ShortCircuitShm.ShmId;
045    import org.apache.hadoop.hdfs.ShortCircuitShm.SlotId;
046    import org.apache.hadoop.hdfs.StorageType;
047    import org.apache.hadoop.hdfs.protocol.Block;
048    import org.apache.hadoop.hdfs.protocol.CacheDirectiveEntry;
049    import org.apache.hadoop.hdfs.protocol.CacheDirectiveInfo;
050    import org.apache.hadoop.hdfs.protocol.CacheDirectiveStats;
051    import org.apache.hadoop.hdfs.protocol.CachePoolEntry;
052    import org.apache.hadoop.hdfs.protocol.CachePoolInfo;
053    import org.apache.hadoop.hdfs.protocol.CachePoolStats;
054    import org.apache.hadoop.hdfs.protocol.ClientProtocol;
055    import org.apache.hadoop.hdfs.protocol.CorruptFileBlocks;
056    import org.apache.hadoop.hdfs.protocol.DatanodeID;
057    import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
058    import org.apache.hadoop.hdfs.protocol.DatanodeInfo.AdminStates;
059    import org.apache.hadoop.hdfs.protocol.DatanodeLocalInfo;
060    import org.apache.hadoop.hdfs.protocol.DirectoryListing;
061    import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
062    import org.apache.hadoop.hdfs.protocol.FsAclPermission;
063    import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType;
064    import org.apache.hadoop.hdfs.protocol.HdfsConstants.RollingUpgradeAction;
065    import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction;
066    import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
067    import org.apache.hadoop.hdfs.protocol.HdfsLocatedFileStatus;
068    import org.apache.hadoop.hdfs.protocol.LocatedBlock;
069    import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
070    import org.apache.hadoop.hdfs.protocol.RollingUpgradeInfo;
071    import org.apache.hadoop.hdfs.protocol.RollingUpgradeStatus;
072    import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport;
073    import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport.DiffReportEntry;
074    import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport.DiffType;
075    import org.apache.hadoop.hdfs.protocol.SnapshottableDirectoryStatus;
076    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.AclEntryProto;
077    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.AclStatusProto;
078    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.AclEntryProto.AclEntryScopeProto;
079    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.AclEntryProto.AclEntryTypeProto;
080    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.AclEntryProto.FsActionProto;
081    import org.apache.hadoop.hdfs.protocol.proto.AclProtos.GetAclStatusResponseProto;
082    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos;
083    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheDirectiveEntryProto;
084    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheDirectiveInfoExpirationProto;
085    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheDirectiveInfoProto;
086    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheDirectiveStatsProto;
087    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheFlagProto;
088    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CachePoolEntryProto;
089    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CachePoolInfoProto;
090    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CachePoolStatsProto;
091    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CreateFlagProto;
092    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.DatanodeReportTypeProto;
093    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFsStatsResponseProto;
094    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollingUpgradeActionProto;
095    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollingUpgradeInfoProto;
096    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SafeModeActionProto;
097    import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CacheDirectiveInfoProto;
098    import org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.ShortCircuitShmSlotProto;
099    import org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.ShortCircuitShmIdProto;
100    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BalancerBandwidthCommandProto;
101    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockCommandProto;
102    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockIdCommandProto;
103    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockRecoveryCommandProto;
104    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.DatanodeCommandProto;
105    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.DatanodeRegistrationProto;
106    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.DatanodeStorageProto;
107    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.DatanodeStorageProto.StorageState;
108    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.FinalizeCommandProto;
109    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.KeyUpdateCommandProto;
110    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.NNHAStatusHeartbeatProto;
111    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReceivedDeletedBlockInfoProto;
112    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterCommandProto;
113    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReportProto;
114    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos;
115    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.BlockKeyProto;
116    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.BlockProto;
117    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.BlockWithLocationsProto;
118    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.BlocksWithLocationsProto;
119    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.CheckpointCommandProto;
120    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.CheckpointSignatureProto;
121    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.ContentSummaryProto;
122    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.CorruptFileBlocksProto;
123    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DataEncryptionKeyProto;
124    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeIDProto;
125    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeInfoProto;
126    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeInfoProto.AdminState;
127    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeInfosProto;
128    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeLocalInfoProto;
129    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DirectoryListingProto;
130    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.ExportedBlockKeysProto;
131    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.ExtendedBlockProto;
132    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.FsPermissionProto;
133    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.FsServerDefaultsProto;
134    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.HdfsFileStatusProto;
135    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.HdfsFileStatusProto.FileType;
136    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlockProto;
137    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlockProto.Builder;
138    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlocksProto;
139    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.NamenodeCommandProto;
140    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.NamenodeRegistrationProto;
141    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.NamenodeRegistrationProto.NamenodeRoleProto;
142    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.NamespaceInfoProto;
143    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.RecoveringBlockProto;
144    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.RemoteEditLogManifestProto;
145    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.RemoteEditLogProto;
146    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.ReplicaStateProto;
147    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.RollingUpgradeStatusProto;
148    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.SnapshotDiffReportEntryProto;
149    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.SnapshotDiffReportProto;
150    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.SnapshottableDirectoryListingProto;
151    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.SnapshottableDirectoryStatusProto;
152    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.StorageInfoProto;
153    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.StorageTypeProto;
154    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.StorageUuidsProto;
155    import org.apache.hadoop.hdfs.protocol.proto.JournalProtocolProtos.JournalInfoProto;
156    import org.apache.hadoop.hdfs.security.token.block.BlockKey;
157    import org.apache.hadoop.hdfs.security.token.block.BlockTokenIdentifier;
158    import org.apache.hadoop.hdfs.security.token.block.DataEncryptionKey;
159    import org.apache.hadoop.hdfs.security.token.block.ExportedBlockKeys;
160    import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier;
161    import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NamenodeRole;
162    import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NodeType;
163    import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
164    import org.apache.hadoop.hdfs.server.common.StorageInfo;
165    import org.apache.hadoop.hdfs.server.namenode.CheckpointSignature;
166    import org.apache.hadoop.hdfs.server.namenode.INodeId;
167    import org.apache.hadoop.hdfs.server.protocol.BalancerBandwidthCommand;
168    import org.apache.hadoop.hdfs.server.protocol.BlockCommand;
169    import org.apache.hadoop.hdfs.server.protocol.BlockIdCommand;
170    import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand;
171    import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
172    import org.apache.hadoop.hdfs.server.protocol.BlocksWithLocations;
173    import org.apache.hadoop.hdfs.server.protocol.BlocksWithLocations.BlockWithLocations;
174    import org.apache.hadoop.hdfs.server.protocol.CheckpointCommand;
175    import org.apache.hadoop.hdfs.server.protocol.DatanodeCommand;
176    import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
177    import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
178    import org.apache.hadoop.hdfs.server.protocol.DatanodeStorage;
179    import org.apache.hadoop.hdfs.server.protocol.DatanodeStorage.State;
180    import org.apache.hadoop.hdfs.server.protocol.FinalizeCommand;
181    import org.apache.hadoop.hdfs.server.protocol.JournalInfo;
182    import org.apache.hadoop.hdfs.server.protocol.KeyUpdateCommand;
183    import org.apache.hadoop.hdfs.server.protocol.NNHAStatusHeartbeat;
184    import org.apache.hadoop.hdfs.server.protocol.NamenodeCommand;
185    import org.apache.hadoop.hdfs.server.protocol.NamenodeRegistration;
186    import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
187    import org.apache.hadoop.hdfs.server.protocol.ReceivedDeletedBlockInfo;
188    import org.apache.hadoop.hdfs.server.protocol.ReceivedDeletedBlockInfo.BlockStatus;
189    import org.apache.hadoop.hdfs.server.protocol.RegisterCommand;
190    import org.apache.hadoop.hdfs.server.protocol.RemoteEditLog;
191    import org.apache.hadoop.hdfs.server.protocol.RemoteEditLogManifest;
192    import org.apache.hadoop.hdfs.server.protocol.StorageReport;
193    import org.apache.hadoop.hdfs.util.ExactSizeInputStream;
194    import org.apache.hadoop.io.EnumSetWritable;
195    import org.apache.hadoop.io.Text;
196    import org.apache.hadoop.security.proto.SecurityProtos.TokenProto;
197    import org.apache.hadoop.security.token.Token;
198    import org.apache.hadoop.util.DataChecksum;
199    
200    import com.google.common.base.Preconditions;
201    import com.google.common.collect.Lists;
202    import com.google.common.primitives.Shorts;
203    import com.google.protobuf.ByteString;
204    import com.google.protobuf.CodedInputStream;
205    
206    /**
207     * Utilities for converting protobuf classes to and from implementation classes
208     * and other helper utilities to help in dealing with protobuf.
209     * 
210     * Note that when converting from an internal type to protobuf type, the
211     * converter never return null for protobuf type. The check for internal type
212     * being null must be done before calling the convert() method.
213     */
214    public class PBHelper {
215      private static final RegisterCommandProto REG_CMD_PROTO = 
216          RegisterCommandProto.newBuilder().build();
217      private static final RegisterCommand REG_CMD = new RegisterCommand();
218    
219      private static final AclEntryScope[] ACL_ENTRY_SCOPE_VALUES =
220          AclEntryScope.values();
221      private static final AclEntryType[] ACL_ENTRY_TYPE_VALUES =
222          AclEntryType.values();
223      private static final FsAction[] FSACTION_VALUES =
224          FsAction.values();
225    
226      private PBHelper() {
227        /** Hidden constructor */
228      }
229    
230      public static ByteString getByteString(byte[] bytes) {
231        return ByteString.copyFrom(bytes);
232      }
233    
234      private static <T extends Enum<T>, U extends Enum<U>> U castEnum(T from, U[] to) {
235        return to[from.ordinal()];
236      }
237    
238      public static NamenodeRole convert(NamenodeRoleProto role) {
239        switch (role) {
240        case NAMENODE:
241          return NamenodeRole.NAMENODE;
242        case BACKUP:
243          return NamenodeRole.BACKUP;
244        case CHECKPOINT:
245          return NamenodeRole.CHECKPOINT;
246        }
247        return null;
248      }
249    
250      public static NamenodeRoleProto convert(NamenodeRole role) {
251        switch (role) {
252        case NAMENODE:
253          return NamenodeRoleProto.NAMENODE;
254        case BACKUP:
255          return NamenodeRoleProto.BACKUP;
256        case CHECKPOINT:
257          return NamenodeRoleProto.CHECKPOINT;
258        }
259        return null;
260      }
261    
262      public static StorageInfoProto convert(StorageInfo info) {
263        return StorageInfoProto.newBuilder().setClusterID(info.getClusterID())
264            .setCTime(info.getCTime()).setLayoutVersion(info.getLayoutVersion())
265            .setNamespceID(info.getNamespaceID()).build();
266      }
267    
268      public static StorageInfo convert(StorageInfoProto info, NodeType type) {
269        return new StorageInfo(info.getLayoutVersion(), info.getNamespceID(),
270            info.getClusterID(), info.getCTime(), type);
271      }
272    
273      public static NamenodeRegistrationProto convert(NamenodeRegistration reg) {
274        return NamenodeRegistrationProto.newBuilder()
275            .setHttpAddress(reg.getHttpAddress()).setRole(convert(reg.getRole()))
276            .setRpcAddress(reg.getAddress())
277            .setStorageInfo(convert((StorageInfo) reg)).build();
278      }
279    
280      public static NamenodeRegistration convert(NamenodeRegistrationProto reg) {
281        StorageInfo si = convert(reg.getStorageInfo(), NodeType.NAME_NODE);
282        return new NamenodeRegistration(reg.getRpcAddress(), reg.getHttpAddress(),
283            si, convert(reg.getRole()));
284      }
285    
286      // DatanodeId
287      public static DatanodeID convert(DatanodeIDProto dn) {
288        return new DatanodeID(dn.getIpAddr(), dn.getHostName(), dn.getDatanodeUuid(),
289            dn.getXferPort(), dn.getInfoPort(), dn.hasInfoSecurePort() ? dn
290            .getInfoSecurePort() : 0, dn.getIpcPort());
291      }
292    
293      public static DatanodeIDProto convert(DatanodeID dn) {
294        // For wire compatibility with older versions we transmit the StorageID
295        // which is the same as the DatanodeUuid. Since StorageID is a required
296        // field we pass the empty string if the DatanodeUuid is not yet known.
297        return DatanodeIDProto.newBuilder()
298            .setIpAddr(dn.getIpAddr())
299            .setHostName(dn.getHostName())
300            .setXferPort(dn.getXferPort())
301            .setDatanodeUuid(dn.getDatanodeUuid() != null ? dn.getDatanodeUuid() : "")
302            .setInfoPort(dn.getInfoPort())
303            .setInfoSecurePort(dn.getInfoSecurePort())
304            .setIpcPort(dn.getIpcPort()).build();
305      }
306    
307      // Arrays of DatanodeId
308      public static DatanodeIDProto[] convert(DatanodeID[] did) {
309        if (did == null)
310          return null;
311        final int len = did.length;
312        DatanodeIDProto[] result = new DatanodeIDProto[len];
313        for (int i = 0; i < len; ++i) {
314          result[i] = convert(did[i]);
315        }
316        return result;
317      }
318      
319      public static DatanodeID[] convert(DatanodeIDProto[] did) {
320        if (did == null) return null;
321        final int len = did.length;
322        DatanodeID[] result = new DatanodeID[len];
323        for (int i = 0; i < len; ++i) {
324          result[i] = convert(did[i]);
325        }
326        return result;
327      }
328      
329      // Block
330      public static BlockProto convert(Block b) {
331        return BlockProto.newBuilder().setBlockId(b.getBlockId())
332            .setGenStamp(b.getGenerationStamp()).setNumBytes(b.getNumBytes())
333            .build();
334      }
335    
336      public static Block convert(BlockProto b) {
337        return new Block(b.getBlockId(), b.getNumBytes(), b.getGenStamp());
338      }
339    
340      public static BlockWithLocationsProto convert(BlockWithLocations blk) {
341        return BlockWithLocationsProto.newBuilder()
342            .setBlock(convert(blk.getBlock()))
343            .addAllDatanodeUuids(Arrays.asList(blk.getDatanodeUuids()))
344            .addAllStorageUuids(Arrays.asList(blk.getStorageIDs())).build();
345      }
346    
347      public static BlockWithLocations convert(BlockWithLocationsProto b) {
348        final List<String> datanodeUuids = b.getDatanodeUuidsList();
349        final List<String> storageUuids = b.getStorageUuidsList();
350        return new BlockWithLocations(convert(b.getBlock()),
351            datanodeUuids.toArray(new String[datanodeUuids.size()]),
352            storageUuids.toArray(new String[storageUuids.size()]));
353      }
354    
355      public static BlocksWithLocationsProto convert(BlocksWithLocations blks) {
356        BlocksWithLocationsProto.Builder builder = BlocksWithLocationsProto
357            .newBuilder();
358        for (BlockWithLocations b : blks.getBlocks()) {
359          builder.addBlocks(convert(b));
360        }
361        return builder.build();
362      }
363    
364      public static BlocksWithLocations convert(BlocksWithLocationsProto blocks) {
365        List<BlockWithLocationsProto> b = blocks.getBlocksList();
366        BlockWithLocations[] ret = new BlockWithLocations[b.size()];
367        int i = 0;
368        for (BlockWithLocationsProto entry : b) {
369          ret[i++] = convert(entry);
370        }
371        return new BlocksWithLocations(ret);
372      }
373    
374      public static BlockKeyProto convert(BlockKey key) {
375        byte[] encodedKey = key.getEncodedKey();
376        ByteString keyBytes = ByteString.copyFrom(encodedKey == null ? 
377            DFSUtil.EMPTY_BYTES : encodedKey);
378        return BlockKeyProto.newBuilder().setKeyId(key.getKeyId())
379            .setKeyBytes(keyBytes).setExpiryDate(key.getExpiryDate()).build();
380      }
381    
382      public static BlockKey convert(BlockKeyProto k) {
383        return new BlockKey(k.getKeyId(), k.getExpiryDate(), k.getKeyBytes()
384            .toByteArray());
385      }
386    
387      public static ExportedBlockKeysProto convert(ExportedBlockKeys keys) {
388        ExportedBlockKeysProto.Builder builder = ExportedBlockKeysProto
389            .newBuilder();
390        builder.setIsBlockTokenEnabled(keys.isBlockTokenEnabled())
391            .setKeyUpdateInterval(keys.getKeyUpdateInterval())
392            .setTokenLifeTime(keys.getTokenLifetime())
393            .setCurrentKey(convert(keys.getCurrentKey()));
394        for (BlockKey k : keys.getAllKeys()) {
395          builder.addAllKeys(convert(k));
396        }
397        return builder.build();
398      }
399    
400      public static ExportedBlockKeys convert(ExportedBlockKeysProto keys) {
401        return new ExportedBlockKeys(keys.getIsBlockTokenEnabled(),
402            keys.getKeyUpdateInterval(), keys.getTokenLifeTime(),
403            convert(keys.getCurrentKey()), convertBlockKeys(keys.getAllKeysList()));
404      }
405    
406      public static CheckpointSignatureProto convert(CheckpointSignature s) {
407        return CheckpointSignatureProto.newBuilder()
408            .setBlockPoolId(s.getBlockpoolID())
409            .setCurSegmentTxId(s.getCurSegmentTxId())
410            .setMostRecentCheckpointTxId(s.getMostRecentCheckpointTxId())
411            .setStorageInfo(PBHelper.convert((StorageInfo) s)).build();
412      }
413    
414      public static CheckpointSignature convert(CheckpointSignatureProto s) {
415        StorageInfo si = PBHelper.convert(s.getStorageInfo(), NodeType.NAME_NODE);
416        return new CheckpointSignature(si, s.getBlockPoolId(),
417            s.getMostRecentCheckpointTxId(), s.getCurSegmentTxId());
418      }
419    
420      public static RemoteEditLogProto convert(RemoteEditLog log) {
421        return RemoteEditLogProto.newBuilder()
422            .setStartTxId(log.getStartTxId())
423            .setEndTxId(log.getEndTxId())
424            .setIsInProgress(log.isInProgress()).build();
425      }
426    
427      public static RemoteEditLog convert(RemoteEditLogProto l) {
428        return new RemoteEditLog(l.getStartTxId(), l.getEndTxId(),
429            l.getIsInProgress());
430      }
431    
432      public static RemoteEditLogManifestProto convert(
433          RemoteEditLogManifest manifest) {
434        RemoteEditLogManifestProto.Builder builder = RemoteEditLogManifestProto
435            .newBuilder();
436        for (RemoteEditLog log : manifest.getLogs()) {
437          builder.addLogs(convert(log));
438        }
439        return builder.build();
440      }
441    
442      public static RemoteEditLogManifest convert(
443          RemoteEditLogManifestProto manifest) {
444        List<RemoteEditLog> logs = new ArrayList<RemoteEditLog>(manifest
445            .getLogsList().size());
446        for (RemoteEditLogProto l : manifest.getLogsList()) {
447          logs.add(convert(l));
448        }
449        return new RemoteEditLogManifest(logs);
450      }
451    
452      public static CheckpointCommandProto convert(CheckpointCommand cmd) {
453        return CheckpointCommandProto.newBuilder()
454            .setSignature(convert(cmd.getSignature()))
455            .setNeedToReturnImage(cmd.needToReturnImage()).build();
456      }
457    
458      public static NamenodeCommandProto convert(NamenodeCommand cmd) {
459        if (cmd instanceof CheckpointCommand) {
460          return NamenodeCommandProto.newBuilder().setAction(cmd.getAction())
461              .setType(NamenodeCommandProto.Type.CheckPointCommand)
462              .setCheckpointCmd(convert((CheckpointCommand) cmd)).build();
463        }
464        return NamenodeCommandProto.newBuilder()
465            .setType(NamenodeCommandProto.Type.NamenodeCommand)
466            .setAction(cmd.getAction()).build();
467      }
468    
469      public static BlockKey[] convertBlockKeys(List<BlockKeyProto> list) {
470        BlockKey[] ret = new BlockKey[list.size()];
471        int i = 0;
472        for (BlockKeyProto k : list) {
473          ret[i++] = convert(k);
474        }
475        return ret;
476      }
477    
478      public static NamespaceInfo convert(NamespaceInfoProto info) {
479        StorageInfoProto storage = info.getStorageInfo();
480        return new NamespaceInfo(storage.getNamespceID(), storage.getClusterID(),
481            info.getBlockPoolID(), storage.getCTime(), info.getBuildVersion(),
482            info.getSoftwareVersion());
483      }
484    
485      public static NamenodeCommand convert(NamenodeCommandProto cmd) {
486        if (cmd == null) return null;
487        switch (cmd.getType()) {
488        case CheckPointCommand:
489          CheckpointCommandProto chkPt = cmd.getCheckpointCmd();
490          return new CheckpointCommand(PBHelper.convert(chkPt.getSignature()),
491              chkPt.getNeedToReturnImage());
492        default:
493          return new NamenodeCommand(cmd.getAction());
494        }
495      }
496      
497      public static ExtendedBlock convert(ExtendedBlockProto eb) {
498        if (eb == null) return null;
499        return new ExtendedBlock( eb.getPoolId(),  eb.getBlockId(),   eb.getNumBytes(),
500           eb.getGenerationStamp());
501      }
502      
503      public static ExtendedBlockProto convert(final ExtendedBlock b) {
504        if (b == null) return null;
505       return ExtendedBlockProto.newBuilder().
506          setPoolId(b.getBlockPoolId()).
507          setBlockId(b.getBlockId()).
508          setNumBytes(b.getNumBytes()).
509          setGenerationStamp(b.getGenerationStamp()).
510          build();
511      }
512      
513      public static RecoveringBlockProto convert(RecoveringBlock b) {
514        if (b == null) {
515          return null;
516        }
517        LocatedBlockProto lb = PBHelper.convert((LocatedBlock)b);
518        return RecoveringBlockProto.newBuilder().setBlock(lb)
519            .setNewGenStamp(b.getNewGenerationStamp()).build();
520      }
521    
522      public static RecoveringBlock convert(RecoveringBlockProto b) {
523        ExtendedBlock block = convert(b.getBlock().getB());
524        DatanodeInfo[] locs = convert(b.getBlock().getLocsList());
525        return new RecoveringBlock(block, locs, b.getNewGenStamp());
526      }
527      
528      public static DatanodeInfoProto.AdminState convert(
529          final DatanodeInfo.AdminStates inAs) {
530        switch (inAs) {
531        case NORMAL: return  DatanodeInfoProto.AdminState.NORMAL;
532        case DECOMMISSION_INPROGRESS: 
533            return DatanodeInfoProto.AdminState.DECOMMISSION_INPROGRESS;
534        case DECOMMISSIONED: return DatanodeInfoProto.AdminState.DECOMMISSIONED;
535        default: return DatanodeInfoProto.AdminState.NORMAL;
536        }
537      }
538      
539      static public DatanodeInfo convert(DatanodeInfoProto di) {
540        if (di == null) return null;
541        return new DatanodeInfo(
542            PBHelper.convert(di.getId()),
543            di.hasLocation() ? di.getLocation() : null , 
544            di.getCapacity(),  di.getDfsUsed(),  di.getRemaining(),
545            di.getBlockPoolUsed(), di.getCacheCapacity(), di.getCacheUsed(),
546            di.getLastUpdate(), di.getXceiverCount(),
547            PBHelper.convert(di.getAdminState())); 
548      }
549      
550      static public DatanodeInfoProto convertDatanodeInfo(DatanodeInfo di) {
551        if (di == null) return null;
552        return convert(di);
553      }
554      
555      
556      static public DatanodeInfo[] convert(DatanodeInfoProto di[]) {
557        if (di == null) return null;
558        DatanodeInfo[] result = new DatanodeInfo[di.length];
559        for (int i = 0; i < di.length; i++) {
560          result[i] = convert(di[i]);
561        }    
562        return result;
563      }
564    
565      public static List<? extends HdfsProtos.DatanodeInfoProto> convert(
566          DatanodeInfo[] dnInfos) {
567        return convert(dnInfos, 0);
568      }
569      
570      /**
571       * Copy from {@code dnInfos} to a target of list of same size starting at
572       * {@code startIdx}.
573       */
574      public static List<? extends HdfsProtos.DatanodeInfoProto> convert(
575          DatanodeInfo[] dnInfos, int startIdx) {
576        if (dnInfos == null)
577          return null;
578        ArrayList<HdfsProtos.DatanodeInfoProto> protos = Lists
579            .newArrayListWithCapacity(dnInfos.length);
580        for (int i = startIdx; i < dnInfos.length; i++) {
581          protos.add(convert(dnInfos[i]));
582        }
583        return protos;
584      }
585    
586      public static DatanodeInfo[] convert(List<DatanodeInfoProto> list) {
587        DatanodeInfo[] info = new DatanodeInfo[list.size()];
588        for (int i = 0; i < info.length; i++) {
589          info[i] = convert(list.get(i));
590        }
591        return info;
592      }
593      
594      public static DatanodeInfoProto convert(DatanodeInfo info) {
595        DatanodeInfoProto.Builder builder = DatanodeInfoProto.newBuilder();
596        if (info.getNetworkLocation() != null) {
597          builder.setLocation(info.getNetworkLocation());
598        }
599        builder
600            .setId(PBHelper.convert((DatanodeID)info))
601            .setCapacity(info.getCapacity())
602            .setDfsUsed(info.getDfsUsed())
603            .setRemaining(info.getRemaining())
604            .setBlockPoolUsed(info.getBlockPoolUsed())
605            .setCacheCapacity(info.getCacheCapacity())
606            .setCacheUsed(info.getCacheUsed())
607            .setLastUpdate(info.getLastUpdate())
608            .setXceiverCount(info.getXceiverCount())
609            .setAdminState(PBHelper.convert(info.getAdminState()))
610            .build();
611        return builder.build();
612      }
613    
614      public static AdminStates convert(AdminState adminState) {
615        switch(adminState) {
616        case DECOMMISSION_INPROGRESS:
617          return AdminStates.DECOMMISSION_INPROGRESS;
618        case DECOMMISSIONED:
619          return AdminStates.DECOMMISSIONED;
620        case NORMAL:
621        default:
622          return AdminStates.NORMAL;
623        }
624      }
625      
626      public static LocatedBlockProto convert(LocatedBlock b) {
627        if (b == null) return null;
628        Builder builder = LocatedBlockProto.newBuilder();
629        DatanodeInfo[] locs = b.getLocations();
630        List<DatanodeInfo> cachedLocs =
631            Lists.newLinkedList(Arrays.asList(b.getCachedLocations()));
632        for (int i = 0; i < locs.length; i++) {
633          DatanodeInfo loc = locs[i];
634          builder.addLocs(i, PBHelper.convert(loc));
635          boolean locIsCached = cachedLocs.contains(loc);
636          builder.addIsCached(locIsCached);
637          if (locIsCached) {
638            cachedLocs.remove(loc);
639          }
640        }
641        Preconditions.checkArgument(cachedLocs.size() == 0,
642            "Found additional cached replica locations that are not in the set of"
643            + " storage-backed locations!");
644    
645        StorageType[] storageTypes = b.getStorageTypes();
646        if (storageTypes != null) {
647          for (int i = 0; i < storageTypes.length; ++i) {
648            builder.addStorageTypes(PBHelper.convertStorageType(storageTypes[i]));
649          }
650        }
651        final String[] storageIDs = b.getStorageIDs();
652        if (storageIDs != null) {
653          builder.addAllStorageIDs(Arrays.asList(storageIDs));
654        }
655    
656        return builder.setB(PBHelper.convert(b.getBlock()))
657            .setBlockToken(PBHelper.convert(b.getBlockToken()))
658            .setCorrupt(b.isCorrupt()).setOffset(b.getStartOffset()).build();
659      }
660      
661      public static LocatedBlock convert(LocatedBlockProto proto) {
662        if (proto == null) return null;
663        List<DatanodeInfoProto> locs = proto.getLocsList();
664        DatanodeInfo[] targets = new DatanodeInfo[locs.size()];
665        for (int i = 0; i < locs.size(); i++) {
666          targets[i] = PBHelper.convert(locs.get(i));
667        }
668    
669        final int storageTypesCount = proto.getStorageTypesCount();
670        final StorageType[] storageTypes;
671        if (storageTypesCount == 0) {
672          storageTypes = null;
673        } else {
674          Preconditions.checkState(storageTypesCount == locs.size());
675          storageTypes = convertStorageTypeProtos(proto.getStorageTypesList());
676        }
677    
678        final int storageIDsCount = proto.getStorageIDsCount();
679        final String[] storageIDs;
680        if (storageIDsCount == 0) {
681          storageIDs = null;
682        } else {
683          Preconditions.checkState(storageIDsCount == locs.size());
684          storageIDs = proto.getStorageIDsList().toArray(new String[storageIDsCount]);
685        }
686    
687        // Set values from the isCached list, re-using references from loc
688        List<DatanodeInfo> cachedLocs = new ArrayList<DatanodeInfo>(locs.size());
689        List<Boolean> isCachedList = proto.getIsCachedList();
690        for (int i=0; i<isCachedList.size(); i++) {
691          if (isCachedList.get(i)) {
692            cachedLocs.add(targets[i]);
693          }
694        }
695    
696        LocatedBlock lb = new LocatedBlock(PBHelper.convert(proto.getB()), targets,
697            storageIDs, storageTypes, proto.getOffset(), proto.getCorrupt(),
698            cachedLocs.toArray(new DatanodeInfo[0]));
699        lb.setBlockToken(PBHelper.convert(proto.getBlockToken()));
700    
701        return lb;
702      }
703    
704      public static TokenProto convert(Token<?> tok) {
705        return TokenProto.newBuilder().
706                  setIdentifier(ByteString.copyFrom(tok.getIdentifier())).
707                  setPassword(ByteString.copyFrom(tok.getPassword())).
708                  setKind(tok.getKind().toString()).
709                  setService(tok.getService().toString()).build(); 
710      }
711      
712      public static Token<BlockTokenIdentifier> convert(
713          TokenProto blockToken) {
714        return new Token<BlockTokenIdentifier>(blockToken.getIdentifier()
715            .toByteArray(), blockToken.getPassword().toByteArray(), new Text(
716            blockToken.getKind()), new Text(blockToken.getService()));
717      }
718    
719      
720      public static Token<DelegationTokenIdentifier> convertDelegationToken(
721          TokenProto blockToken) {
722        return new Token<DelegationTokenIdentifier>(blockToken.getIdentifier()
723            .toByteArray(), blockToken.getPassword().toByteArray(), new Text(
724            blockToken.getKind()), new Text(blockToken.getService()));
725      }
726    
727      public static ReplicaState convert(ReplicaStateProto state) {
728        switch (state) {
729        case RBW:
730          return ReplicaState.RBW;
731        case RUR:
732          return ReplicaState.RUR;
733        case RWR:
734          return ReplicaState.RWR;
735        case TEMPORARY:
736          return ReplicaState.TEMPORARY;
737        case FINALIZED:
738        default:
739          return ReplicaState.FINALIZED;
740        }
741      }
742    
743      public static ReplicaStateProto convert(ReplicaState state) {
744        switch (state) {
745        case RBW:
746          return ReplicaStateProto.RBW;
747        case RUR:
748          return ReplicaStateProto.RUR;
749        case RWR:
750          return ReplicaStateProto.RWR;
751        case TEMPORARY:
752          return ReplicaStateProto.TEMPORARY;
753        case FINALIZED:
754        default:
755          return ReplicaStateProto.FINALIZED;
756        }
757      }
758      
759      public static DatanodeRegistrationProto convert(
760          DatanodeRegistration registration) {
761        DatanodeRegistrationProto.Builder builder = DatanodeRegistrationProto
762            .newBuilder();
763        return builder.setDatanodeID(PBHelper.convert((DatanodeID) registration))
764            .setStorageInfo(PBHelper.convert(registration.getStorageInfo()))
765            .setKeys(PBHelper.convert(registration.getExportedKeys()))
766            .setSoftwareVersion(registration.getSoftwareVersion()).build();
767      }
768    
769      public static DatanodeRegistration convert(DatanodeRegistrationProto proto) {
770        StorageInfo si = convert(proto.getStorageInfo(), NodeType.DATA_NODE);
771        return new DatanodeRegistration(PBHelper.convert(proto.getDatanodeID()),
772            si, PBHelper.convert(proto.getKeys()), proto.getSoftwareVersion());
773      }
774    
775      public static DatanodeCommand convert(DatanodeCommandProto proto) {
776        switch (proto.getCmdType()) {
777        case BalancerBandwidthCommand:
778          return PBHelper.convert(proto.getBalancerCmd());
779        case BlockCommand:
780          return PBHelper.convert(proto.getBlkCmd());
781        case BlockRecoveryCommand:
782          return PBHelper.convert(proto.getRecoveryCmd());
783        case FinalizeCommand:
784          return PBHelper.convert(proto.getFinalizeCmd());
785        case KeyUpdateCommand:
786          return PBHelper.convert(proto.getKeyUpdateCmd());
787        case RegisterCommand:
788          return REG_CMD;
789        case BlockIdCommand:
790          return PBHelper.convert(proto.getBlkIdCmd());
791        default:
792          return null;
793        }
794      }
795      
796      public static BalancerBandwidthCommandProto convert(
797          BalancerBandwidthCommand bbCmd) {
798        return BalancerBandwidthCommandProto.newBuilder()
799            .setBandwidth(bbCmd.getBalancerBandwidthValue()).build();
800      }
801    
802      public static KeyUpdateCommandProto convert(KeyUpdateCommand cmd) {
803        return KeyUpdateCommandProto.newBuilder()
804            .setKeys(PBHelper.convert(cmd.getExportedKeys())).build();
805      }
806    
807      public static BlockRecoveryCommandProto convert(BlockRecoveryCommand cmd) {
808        BlockRecoveryCommandProto.Builder builder = BlockRecoveryCommandProto
809            .newBuilder();
810        for (RecoveringBlock b : cmd.getRecoveringBlocks()) {
811          builder.addBlocks(PBHelper.convert(b));
812        }
813        return builder.build();
814      }
815    
816      public static FinalizeCommandProto convert(FinalizeCommand cmd) {
817        return FinalizeCommandProto.newBuilder()
818            .setBlockPoolId(cmd.getBlockPoolId()).build();
819      }
820    
821      public static BlockCommandProto convert(BlockCommand cmd) {
822        BlockCommandProto.Builder builder = BlockCommandProto.newBuilder()
823            .setBlockPoolId(cmd.getBlockPoolId());
824        switch (cmd.getAction()) {
825        case DatanodeProtocol.DNA_TRANSFER:
826          builder.setAction(BlockCommandProto.Action.TRANSFER);
827          break;
828        case DatanodeProtocol.DNA_INVALIDATE:
829          builder.setAction(BlockCommandProto.Action.INVALIDATE);
830          break;
831        case DatanodeProtocol.DNA_SHUTDOWN:
832          builder.setAction(BlockCommandProto.Action.SHUTDOWN);
833          break;
834        default:
835          throw new AssertionError("Invalid action");
836        }
837        Block[] blocks = cmd.getBlocks();
838        for (int i = 0; i < blocks.length; i++) {
839          builder.addBlocks(PBHelper.convert(blocks[i]));
840        }
841        builder.addAllTargets(convert(cmd.getTargets()))
842               .addAllTargetStorageUuids(convert(cmd.getTargetStorageIDs()));
843        return builder.build();
844      }
845      
846      public static BlockIdCommandProto convert(BlockIdCommand cmd) {
847        BlockIdCommandProto.Builder builder = BlockIdCommandProto.newBuilder()
848            .setBlockPoolId(cmd.getBlockPoolId());
849        switch (cmd.getAction()) {
850        case DatanodeProtocol.DNA_CACHE:
851          builder.setAction(BlockIdCommandProto.Action.CACHE);
852          break;
853        case DatanodeProtocol.DNA_UNCACHE:
854          builder.setAction(BlockIdCommandProto.Action.UNCACHE);
855          break;
856        default:
857          throw new AssertionError("Invalid action");
858        }
859        long[] blockIds = cmd.getBlockIds();
860        for (int i = 0; i < blockIds.length; i++) {
861          builder.addBlockIds(blockIds[i]);
862        }
863        return builder.build();
864      }
865    
866      private static List<DatanodeInfosProto> convert(DatanodeInfo[][] targets) {
867        DatanodeInfosProto[] ret = new DatanodeInfosProto[targets.length];
868        for (int i = 0; i < targets.length; i++) {
869          ret[i] = DatanodeInfosProto.newBuilder()
870              .addAllDatanodes(PBHelper.convert(targets[i])).build();
871        }
872        return Arrays.asList(ret);
873      }
874    
875      private static List<StorageUuidsProto> convert(String[][] targetStorageUuids) {
876        StorageUuidsProto[] ret = new StorageUuidsProto[targetStorageUuids.length];
877        for (int i = 0; i < targetStorageUuids.length; i++) {
878          ret[i] = StorageUuidsProto.newBuilder()
879              .addAllStorageUuids(Arrays.asList(targetStorageUuids[i])).build();
880        }
881        return Arrays.asList(ret);
882      }
883    
884      public static DatanodeCommandProto convert(DatanodeCommand datanodeCommand) {
885        DatanodeCommandProto.Builder builder = DatanodeCommandProto.newBuilder();
886        if (datanodeCommand == null) {
887          return builder.setCmdType(DatanodeCommandProto.Type.NullDatanodeCommand)
888              .build();
889        }
890        switch (datanodeCommand.getAction()) {
891        case DatanodeProtocol.DNA_BALANCERBANDWIDTHUPDATE:
892          builder.setCmdType(DatanodeCommandProto.Type.BalancerBandwidthCommand)
893              .setBalancerCmd(
894                  PBHelper.convert((BalancerBandwidthCommand) datanodeCommand));
895          break;
896        case DatanodeProtocol.DNA_ACCESSKEYUPDATE:
897          builder
898              .setCmdType(DatanodeCommandProto.Type.KeyUpdateCommand)
899              .setKeyUpdateCmd(PBHelper.convert((KeyUpdateCommand) datanodeCommand));
900          break;
901        case DatanodeProtocol.DNA_RECOVERBLOCK:
902          builder.setCmdType(DatanodeCommandProto.Type.BlockRecoveryCommand)
903              .setRecoveryCmd(
904                  PBHelper.convert((BlockRecoveryCommand) datanodeCommand));
905          break;
906        case DatanodeProtocol.DNA_FINALIZE:
907          builder.setCmdType(DatanodeCommandProto.Type.FinalizeCommand)
908              .setFinalizeCmd(PBHelper.convert((FinalizeCommand) datanodeCommand));
909          break;
910        case DatanodeProtocol.DNA_REGISTER:
911          builder.setCmdType(DatanodeCommandProto.Type.RegisterCommand)
912              .setRegisterCmd(REG_CMD_PROTO);
913          break;
914        case DatanodeProtocol.DNA_TRANSFER:
915        case DatanodeProtocol.DNA_INVALIDATE:
916        case DatanodeProtocol.DNA_SHUTDOWN:
917          builder.setCmdType(DatanodeCommandProto.Type.BlockCommand).
918            setBlkCmd(PBHelper.convert((BlockCommand) datanodeCommand));
919          break;
920        case DatanodeProtocol.DNA_CACHE:
921        case DatanodeProtocol.DNA_UNCACHE:
922          builder.setCmdType(DatanodeCommandProto.Type.BlockIdCommand).
923            setBlkIdCmd(PBHelper.convert((BlockIdCommand) datanodeCommand));
924          break;
925        case DatanodeProtocol.DNA_UNKNOWN: //Not expected
926        default:
927          builder.setCmdType(DatanodeCommandProto.Type.NullDatanodeCommand);
928        }
929        return builder.build();
930      }
931    
932      public static KeyUpdateCommand convert(KeyUpdateCommandProto keyUpdateCmd) {
933        return new KeyUpdateCommand(PBHelper.convert(keyUpdateCmd.getKeys()));
934      }
935    
936      public static FinalizeCommand convert(FinalizeCommandProto finalizeCmd) {
937        return new FinalizeCommand(finalizeCmd.getBlockPoolId());
938      }
939    
940      public static BlockRecoveryCommand convert(
941          BlockRecoveryCommandProto recoveryCmd) {
942        List<RecoveringBlockProto> list = recoveryCmd.getBlocksList();
943        List<RecoveringBlock> recoveringBlocks = new ArrayList<RecoveringBlock>(
944            list.size());
945        
946        for (RecoveringBlockProto rbp : list) {
947          recoveringBlocks.add(PBHelper.convert(rbp));
948        }
949        return new BlockRecoveryCommand(recoveringBlocks);
950      }
951    
952      public static BlockCommand convert(BlockCommandProto blkCmd) {
953        List<BlockProto> blockProtoList = blkCmd.getBlocksList();
954        Block[] blocks = new Block[blockProtoList.size()];
955        for (int i = 0; i < blockProtoList.size(); i++) {
956          blocks[i] = PBHelper.convert(blockProtoList.get(i));
957        }
958        List<DatanodeInfosProto> targetList = blkCmd.getTargetsList();
959        DatanodeInfo[][] targets = new DatanodeInfo[targetList.size()][];
960        for (int i = 0; i < targetList.size(); i++) {
961          targets[i] = PBHelper.convert(targetList.get(i));
962        }
963    
964        List<StorageUuidsProto> targetStorageUuidsList = blkCmd.getTargetStorageUuidsList();
965        String[][] targetStorageIDs = new String[targetStorageUuidsList.size()][];
966        for(int i = 0; i < targetStorageIDs.length; i++) {
967          List<String> storageIDs = targetStorageUuidsList.get(i).getStorageUuidsList();
968          targetStorageIDs[i] = storageIDs.toArray(new String[storageIDs.size()]);
969        }
970    
971        int action = DatanodeProtocol.DNA_UNKNOWN;
972        switch (blkCmd.getAction()) {
973        case TRANSFER:
974          action = DatanodeProtocol.DNA_TRANSFER;
975          break;
976        case INVALIDATE:
977          action = DatanodeProtocol.DNA_INVALIDATE;
978          break;
979        case SHUTDOWN:
980          action = DatanodeProtocol.DNA_SHUTDOWN;
981          break;
982        default:
983          throw new AssertionError("Unknown action type: " + blkCmd.getAction());
984        }
985        return new BlockCommand(action, blkCmd.getBlockPoolId(), blocks, targets,
986            targetStorageIDs);
987      }
988    
989      public static BlockIdCommand convert(BlockIdCommandProto blkIdCmd) {
990        int numBlockIds = blkIdCmd.getBlockIdsCount();
991        long blockIds[] = new long[numBlockIds];
992        for (int i = 0; i < numBlockIds; i++) {
993          blockIds[i] = blkIdCmd.getBlockIds(i);
994        }
995        int action = DatanodeProtocol.DNA_UNKNOWN;
996        switch (blkIdCmd.getAction()) {
997        case CACHE:
998          action = DatanodeProtocol.DNA_CACHE;
999          break;
1000        case UNCACHE:
1001          action = DatanodeProtocol.DNA_UNCACHE;
1002          break;
1003        default:
1004          throw new AssertionError("Unknown action type: " + blkIdCmd.getAction());
1005        }
1006        return new BlockIdCommand(action, blkIdCmd.getBlockPoolId(), blockIds);
1007      }
1008    
1009      public static DatanodeInfo[] convert(DatanodeInfosProto datanodeInfosProto) {
1010        List<DatanodeInfoProto> proto = datanodeInfosProto.getDatanodesList();
1011        DatanodeInfo[] infos = new DatanodeInfo[proto.size()];
1012        for (int i = 0; i < infos.length; i++) {
1013          infos[i] = PBHelper.convert(proto.get(i));
1014        }
1015        return infos;
1016      }
1017    
1018      public static BalancerBandwidthCommand convert(
1019          BalancerBandwidthCommandProto balancerCmd) {
1020        return new BalancerBandwidthCommand(balancerCmd.getBandwidth());
1021      }
1022    
1023      public static ReceivedDeletedBlockInfoProto convert(
1024          ReceivedDeletedBlockInfo receivedDeletedBlockInfo) {
1025        ReceivedDeletedBlockInfoProto.Builder builder = 
1026            ReceivedDeletedBlockInfoProto.newBuilder();
1027        
1028        ReceivedDeletedBlockInfoProto.BlockStatus status;
1029        switch (receivedDeletedBlockInfo.getStatus()) {
1030        case RECEIVING_BLOCK:
1031          status = ReceivedDeletedBlockInfoProto.BlockStatus.RECEIVING;
1032          break;
1033        case RECEIVED_BLOCK:
1034          status = ReceivedDeletedBlockInfoProto.BlockStatus.RECEIVED;
1035          break;
1036        case DELETED_BLOCK:
1037          status = ReceivedDeletedBlockInfoProto.BlockStatus.DELETED;
1038          break;
1039        default:
1040          throw new IllegalArgumentException("Bad status: " +
1041              receivedDeletedBlockInfo.getStatus());
1042        }
1043        builder.setStatus(status);
1044        
1045        if (receivedDeletedBlockInfo.getDelHints() != null) {
1046          builder.setDeleteHint(receivedDeletedBlockInfo.getDelHints());
1047        }
1048        return builder.setBlock(PBHelper.convert(receivedDeletedBlockInfo.getBlock()))
1049            .build();
1050      }
1051    
1052      public static ReceivedDeletedBlockInfo convert(
1053          ReceivedDeletedBlockInfoProto proto) {
1054        ReceivedDeletedBlockInfo.BlockStatus status = null;
1055        switch (proto.getStatus()) {
1056        case RECEIVING:
1057          status = BlockStatus.RECEIVING_BLOCK;
1058          break;
1059        case RECEIVED:
1060          status = BlockStatus.RECEIVED_BLOCK;
1061          break;
1062        case DELETED:
1063          status = BlockStatus.DELETED_BLOCK;
1064          break;
1065        }
1066        return new ReceivedDeletedBlockInfo(
1067            PBHelper.convert(proto.getBlock()),
1068            status,
1069            proto.hasDeleteHint() ? proto.getDeleteHint() : null);
1070      }
1071      
1072      public static NamespaceInfoProto convert(NamespaceInfo info) {
1073        return NamespaceInfoProto.newBuilder()
1074            .setBlockPoolID(info.getBlockPoolID())
1075            .setBuildVersion(info.getBuildVersion())
1076            .setUnused(0)
1077            .setStorageInfo(PBHelper.convert((StorageInfo)info))
1078            .setSoftwareVersion(info.getSoftwareVersion()).build();
1079      }
1080      
1081      // Located Block Arrays and Lists
1082      public static LocatedBlockProto[] convertLocatedBlock(LocatedBlock[] lb) {
1083        if (lb == null) return null;
1084        return convertLocatedBlock2(Arrays.asList(lb)).toArray(
1085            new LocatedBlockProto[lb.length]);
1086      }
1087      
1088      public static LocatedBlock[] convertLocatedBlock(LocatedBlockProto[] lb) {
1089        if (lb == null) return null;
1090        return convertLocatedBlock(Arrays.asList(lb)).toArray(
1091            new LocatedBlock[lb.length]);
1092      }
1093      
1094      public static List<LocatedBlock> convertLocatedBlock(
1095          List<LocatedBlockProto> lb) {
1096        if (lb == null) return null;
1097        final int len = lb.size();
1098        List<LocatedBlock> result = 
1099            new ArrayList<LocatedBlock>(len);
1100        for (int i = 0; i < len; ++i) {
1101          result.add(PBHelper.convert(lb.get(i)));
1102        }
1103        return result;
1104      }
1105      
1106      public static List<LocatedBlockProto> convertLocatedBlock2(List<LocatedBlock> lb) {
1107        if (lb == null) return null;
1108        final int len = lb.size();
1109        List<LocatedBlockProto> result = new ArrayList<LocatedBlockProto>(len);
1110        for (int i = 0; i < len; ++i) {
1111          result.add(PBHelper.convert(lb.get(i)));
1112        }
1113        return result;
1114      }
1115      
1116      
1117      // LocatedBlocks
1118      public static LocatedBlocks convert(LocatedBlocksProto lb) {
1119        return new LocatedBlocks(
1120            lb.getFileLength(), lb.getUnderConstruction(),
1121            PBHelper.convertLocatedBlock(lb.getBlocksList()),
1122            lb.hasLastBlock() ? PBHelper.convert(lb.getLastBlock()) : null,
1123            lb.getIsLastBlockComplete());
1124      }
1125      
1126      public static LocatedBlocksProto convert(LocatedBlocks lb) {
1127        if (lb == null) {
1128          return null;
1129        }
1130        LocatedBlocksProto.Builder builder = 
1131            LocatedBlocksProto.newBuilder();
1132        if (lb.getLastLocatedBlock() != null) {
1133          builder.setLastBlock(PBHelper.convert(lb.getLastLocatedBlock()));
1134        }
1135        return builder.setFileLength(lb.getFileLength())
1136            .setUnderConstruction(lb.isUnderConstruction())
1137            .addAllBlocks(PBHelper.convertLocatedBlock2(lb.getLocatedBlocks()))
1138            .setIsLastBlockComplete(lb.isLastBlockComplete()).build();
1139      }
1140      
1141      // DataEncryptionKey
1142      public static DataEncryptionKey convert(DataEncryptionKeyProto bet) {
1143        String encryptionAlgorithm = bet.getEncryptionAlgorithm();
1144        return new DataEncryptionKey(bet.getKeyId(),
1145            bet.getBlockPoolId(),
1146            bet.getNonce().toByteArray(),
1147            bet.getEncryptionKey().toByteArray(),
1148            bet.getExpiryDate(),
1149            encryptionAlgorithm.isEmpty() ? null : encryptionAlgorithm);
1150      }
1151      
1152      public static DataEncryptionKeyProto convert(DataEncryptionKey bet) {
1153        DataEncryptionKeyProto.Builder b = DataEncryptionKeyProto.newBuilder()
1154            .setKeyId(bet.keyId)
1155            .setBlockPoolId(bet.blockPoolId)
1156            .setNonce(ByteString.copyFrom(bet.nonce))
1157            .setEncryptionKey(ByteString.copyFrom(bet.encryptionKey))
1158            .setExpiryDate(bet.expiryDate);
1159        if (bet.encryptionAlgorithm != null) {
1160          b.setEncryptionAlgorithm(bet.encryptionAlgorithm);
1161        }
1162        return b.build();
1163      }
1164      
1165      public static FsServerDefaults convert(FsServerDefaultsProto fs) {
1166        if (fs == null) return null;
1167        return new FsServerDefaults(
1168            fs.getBlockSize(), fs.getBytesPerChecksum(), 
1169            fs.getWritePacketSize(), (short) fs.getReplication(),
1170            fs.getFileBufferSize(),
1171            fs.getEncryptDataTransfer(),
1172            fs.getTrashInterval(),
1173            PBHelper.convert(fs.getChecksumType()));
1174      }
1175      
1176      public static FsServerDefaultsProto convert(FsServerDefaults fs) {
1177        if (fs == null) return null;
1178        return FsServerDefaultsProto.newBuilder().
1179          setBlockSize(fs.getBlockSize()).
1180          setBytesPerChecksum(fs.getBytesPerChecksum()).
1181          setWritePacketSize(fs.getWritePacketSize())
1182          .setReplication(fs.getReplication())
1183          .setFileBufferSize(fs.getFileBufferSize())
1184          .setEncryptDataTransfer(fs.getEncryptDataTransfer())
1185          .setTrashInterval(fs.getTrashInterval())
1186          .setChecksumType(PBHelper.convert(fs.getChecksumType()))
1187          .build();
1188      }
1189      
1190      public static FsPermissionProto convert(FsPermission p) {
1191        return FsPermissionProto.newBuilder().setPerm(p.toExtendedShort()).build();
1192      }
1193      
1194      public static FsPermission convert(FsPermissionProto p) {
1195        return new FsAclPermission((short)p.getPerm());
1196      }
1197      
1198      
1199      // The creatFlag field in PB is a bitmask whose values are the same a the 
1200      // emum values of CreateFlag
1201      public static int convertCreateFlag(EnumSetWritable<CreateFlag> flag) {
1202        int value = 0;
1203        if (flag.contains(CreateFlag.APPEND)) {
1204          value |= CreateFlagProto.APPEND.getNumber();
1205        }
1206        if (flag.contains(CreateFlag.CREATE)) {
1207          value |= CreateFlagProto.CREATE.getNumber();
1208        }
1209        if (flag.contains(CreateFlag.OVERWRITE)) {
1210          value |= CreateFlagProto.OVERWRITE.getNumber();
1211        }
1212        return value;
1213      }
1214      
1215      public static EnumSetWritable<CreateFlag> convertCreateFlag(int flag) {
1216        EnumSet<CreateFlag> result = 
1217           EnumSet.noneOf(CreateFlag.class);   
1218        if ((flag & CreateFlagProto.APPEND_VALUE) == CreateFlagProto.APPEND_VALUE) {
1219          result.add(CreateFlag.APPEND);
1220        }
1221        if ((flag & CreateFlagProto.CREATE_VALUE) == CreateFlagProto.CREATE_VALUE) {
1222          result.add(CreateFlag.CREATE);
1223        }
1224        if ((flag & CreateFlagProto.OVERWRITE_VALUE) 
1225            == CreateFlagProto.OVERWRITE_VALUE) {
1226          result.add(CreateFlag.OVERWRITE);
1227        }
1228        return new EnumSetWritable<CreateFlag>(result);
1229      }
1230    
1231      public static int convertCacheFlags(EnumSet<CacheFlag> flags) {
1232        int value = 0;
1233        if (flags.contains(CacheFlag.FORCE)) {
1234          value |= CacheFlagProto.FORCE.getNumber();
1235        }
1236        return value;
1237      }
1238    
1239      public static EnumSet<CacheFlag> convertCacheFlags(int flags) {
1240        EnumSet<CacheFlag> result = EnumSet.noneOf(CacheFlag.class);
1241        if ((flags & CacheFlagProto.FORCE_VALUE) == CacheFlagProto.FORCE_VALUE) {
1242          result.add(CacheFlag.FORCE);
1243        }
1244        return result;
1245      }
1246    
1247      public static HdfsFileStatus convert(HdfsFileStatusProto fs) {
1248        if (fs == null)
1249          return null;
1250        return new HdfsLocatedFileStatus(
1251            fs.getLength(), fs.getFileType().equals(FileType.IS_DIR), 
1252            fs.getBlockReplication(), fs.getBlocksize(),
1253            fs.getModificationTime(), fs.getAccessTime(),
1254            PBHelper.convert(fs.getPermission()), fs.getOwner(), fs.getGroup(), 
1255            fs.getFileType().equals(FileType.IS_SYMLINK) ? 
1256                fs.getSymlink().toByteArray() : null,
1257            fs.getPath().toByteArray(),
1258            fs.hasFileId()? fs.getFileId(): INodeId.GRANDFATHER_INODE_ID,
1259            fs.hasLocations() ? PBHelper.convert(fs.getLocations()) : null,
1260            fs.hasChildrenNum() ? fs.getChildrenNum() : -1);
1261      }
1262    
1263      public static SnapshottableDirectoryStatus convert(
1264          SnapshottableDirectoryStatusProto sdirStatusProto) {
1265        if (sdirStatusProto == null) {
1266          return null;
1267        }
1268        final HdfsFileStatusProto status = sdirStatusProto.getDirStatus();
1269        return new SnapshottableDirectoryStatus(
1270            status.getModificationTime(),
1271            status.getAccessTime(),
1272            PBHelper.convert(status.getPermission()),
1273            status.getOwner(),
1274            status.getGroup(),
1275            status.getPath().toByteArray(),
1276            status.getFileId(),
1277            status.getChildrenNum(),
1278            sdirStatusProto.getSnapshotNumber(),
1279            sdirStatusProto.getSnapshotQuota(),
1280            sdirStatusProto.getParentFullpath().toByteArray());
1281      }
1282      
1283      public static HdfsFileStatusProto convert(HdfsFileStatus fs) {
1284        if (fs == null)
1285          return null;
1286        FileType fType = FileType.IS_FILE;
1287        if (fs.isDir()) {
1288          fType = FileType.IS_DIR;
1289        } else if (fs.isSymlink()) {
1290          fType = FileType.IS_SYMLINK;
1291        }
1292    
1293        HdfsFileStatusProto.Builder builder = 
1294         HdfsFileStatusProto.newBuilder().
1295          setLength(fs.getLen()).
1296          setFileType(fType).
1297          setBlockReplication(fs.getReplication()).
1298          setBlocksize(fs.getBlockSize()).
1299          setModificationTime(fs.getModificationTime()).
1300          setAccessTime(fs.getAccessTime()).
1301          setPermission(PBHelper.convert(fs.getPermission())).
1302          setOwner(fs.getOwner()).
1303          setGroup(fs.getGroup()).
1304          setFileId(fs.getFileId()).
1305          setChildrenNum(fs.getChildrenNum()).
1306          setPath(ByteString.copyFrom(fs.getLocalNameInBytes()));
1307        if (fs.isSymlink())  {
1308          builder.setSymlink(ByteString.copyFrom(fs.getSymlinkInBytes()));
1309        }
1310        if (fs instanceof HdfsLocatedFileStatus) {
1311          LocatedBlocks locations = ((HdfsLocatedFileStatus)fs).getBlockLocations();
1312          if (locations != null) {
1313            builder.setLocations(PBHelper.convert(locations));
1314          }
1315        }
1316        return builder.build();
1317      }
1318      
1319      public static SnapshottableDirectoryStatusProto convert(
1320          SnapshottableDirectoryStatus status) {
1321        if (status == null) {
1322          return null;
1323        }
1324        int snapshotNumber = status.getSnapshotNumber();
1325        int snapshotQuota = status.getSnapshotQuota();
1326        byte[] parentFullPath = status.getParentFullPath();
1327        ByteString parentFullPathBytes = ByteString.copyFrom(
1328            parentFullPath == null ? DFSUtil.EMPTY_BYTES : parentFullPath);
1329        HdfsFileStatusProto fs = convert(status.getDirStatus());
1330        SnapshottableDirectoryStatusProto.Builder builder = 
1331            SnapshottableDirectoryStatusProto
1332            .newBuilder().setSnapshotNumber(snapshotNumber)
1333            .setSnapshotQuota(snapshotQuota).setParentFullpath(parentFullPathBytes)
1334            .setDirStatus(fs);
1335        return builder.build();
1336      }
1337      
1338      public static HdfsFileStatusProto[] convert(HdfsFileStatus[] fs) {
1339        if (fs == null) return null;
1340        final int len = fs.length;
1341        HdfsFileStatusProto[] result = new HdfsFileStatusProto[len];
1342        for (int i = 0; i < len; ++i) {
1343          result[i] = PBHelper.convert(fs[i]);
1344        }
1345        return result;
1346      }
1347      
1348      public static HdfsFileStatus[] convert(HdfsFileStatusProto[] fs) {
1349        if (fs == null) return null;
1350        final int len = fs.length;
1351        HdfsFileStatus[] result = new HdfsFileStatus[len];
1352        for (int i = 0; i < len; ++i) {
1353          result[i] = PBHelper.convert(fs[i]);
1354        }
1355        return result;
1356      }
1357      
1358      public static DirectoryListing convert(DirectoryListingProto dl) {
1359        if (dl == null)
1360          return null;
1361        List<HdfsFileStatusProto> partList =  dl.getPartialListingList();
1362        return new DirectoryListing( 
1363            partList.isEmpty() ? new HdfsLocatedFileStatus[0] 
1364              : PBHelper.convert(
1365                  partList.toArray(new HdfsFileStatusProto[partList.size()])),
1366            dl.getRemainingEntries());
1367      }
1368    
1369      public static DirectoryListingProto convert(DirectoryListing d) {
1370        if (d == null)
1371          return null;
1372        return DirectoryListingProto.newBuilder().
1373            addAllPartialListing(Arrays.asList(
1374                PBHelper.convert(d.getPartialListing()))).
1375            setRemainingEntries(d.getRemainingEntries()).
1376            build();
1377      }
1378    
1379      public static long[] convert(GetFsStatsResponseProto res) {
1380        long[] result = new long[6];
1381        result[ClientProtocol.GET_STATS_CAPACITY_IDX] = res.getCapacity();
1382        result[ClientProtocol.GET_STATS_USED_IDX] = res.getUsed();
1383        result[ClientProtocol.GET_STATS_REMAINING_IDX] = res.getRemaining();
1384        result[ClientProtocol.GET_STATS_UNDER_REPLICATED_IDX] = res.getUnderReplicated();
1385        result[ClientProtocol.GET_STATS_CORRUPT_BLOCKS_IDX] = res.getCorruptBlocks();
1386        result[ClientProtocol.GET_STATS_MISSING_BLOCKS_IDX] = res.getMissingBlocks();
1387        return result;
1388      }
1389      
1390      public static GetFsStatsResponseProto convert(long[] fsStats) {
1391        GetFsStatsResponseProto.Builder result = GetFsStatsResponseProto
1392            .newBuilder();
1393        if (fsStats.length >= ClientProtocol.GET_STATS_CAPACITY_IDX + 1)
1394          result.setCapacity(fsStats[ClientProtocol.GET_STATS_CAPACITY_IDX]);
1395        if (fsStats.length >= ClientProtocol.GET_STATS_USED_IDX + 1)
1396          result.setUsed(fsStats[ClientProtocol.GET_STATS_USED_IDX]);
1397        if (fsStats.length >= ClientProtocol.GET_STATS_REMAINING_IDX + 1)
1398          result.setRemaining(fsStats[ClientProtocol.GET_STATS_REMAINING_IDX]);
1399        if (fsStats.length >= ClientProtocol.GET_STATS_UNDER_REPLICATED_IDX + 1)
1400          result.setUnderReplicated(
1401                  fsStats[ClientProtocol.GET_STATS_UNDER_REPLICATED_IDX]);
1402        if (fsStats.length >= ClientProtocol.GET_STATS_CORRUPT_BLOCKS_IDX + 1)
1403          result.setCorruptBlocks(
1404              fsStats[ClientProtocol.GET_STATS_CORRUPT_BLOCKS_IDX]);
1405        if (fsStats.length >= ClientProtocol.GET_STATS_MISSING_BLOCKS_IDX + 1)
1406          result.setMissingBlocks(
1407              fsStats[ClientProtocol.GET_STATS_MISSING_BLOCKS_IDX]);
1408        return result.build();
1409      }
1410      
1411      public static DatanodeReportTypeProto
1412        convert(DatanodeReportType t) {
1413        switch (t) {
1414        case ALL: return DatanodeReportTypeProto.ALL;
1415        case LIVE: return DatanodeReportTypeProto.LIVE;
1416        case DEAD: return DatanodeReportTypeProto.DEAD;
1417        default: 
1418          throw new IllegalArgumentException("Unexpected data type report:" + t);
1419        }
1420      }
1421      
1422      public static DatanodeReportType 
1423        convert(DatanodeReportTypeProto t) {
1424        switch (t) {
1425        case ALL: return DatanodeReportType.ALL;
1426        case LIVE: return DatanodeReportType.LIVE;
1427        case DEAD: return DatanodeReportType.DEAD;
1428        default: 
1429          throw new IllegalArgumentException("Unexpected data type report:" + t);
1430        }
1431      }
1432    
1433      public static SafeModeActionProto convert(
1434          SafeModeAction a) {
1435        switch (a) {
1436        case SAFEMODE_LEAVE:
1437          return SafeModeActionProto.SAFEMODE_LEAVE;
1438        case SAFEMODE_ENTER:
1439          return SafeModeActionProto.SAFEMODE_ENTER;
1440        case SAFEMODE_GET:
1441          return SafeModeActionProto.SAFEMODE_GET;
1442        default:
1443          throw new IllegalArgumentException("Unexpected SafeModeAction :" + a);
1444        }
1445      }
1446      
1447      public static SafeModeAction convert(
1448          ClientNamenodeProtocolProtos.SafeModeActionProto a) {
1449        switch (a) {
1450        case SAFEMODE_LEAVE:
1451          return SafeModeAction.SAFEMODE_LEAVE;
1452        case SAFEMODE_ENTER:
1453          return SafeModeAction.SAFEMODE_ENTER;
1454        case SAFEMODE_GET:
1455          return SafeModeAction.SAFEMODE_GET;
1456        default:
1457          throw new IllegalArgumentException("Unexpected SafeModeAction :" + a);
1458        }
1459      }
1460      
1461      public static RollingUpgradeActionProto convert(RollingUpgradeAction a) {
1462        switch (a) {
1463        case QUERY:
1464          return RollingUpgradeActionProto.QUERY;
1465        case PREPARE:
1466          return RollingUpgradeActionProto.START;
1467        case FINALIZE:
1468          return RollingUpgradeActionProto.FINALIZE;
1469        default:
1470          throw new IllegalArgumentException("Unexpected value: " + a);
1471        }
1472      }
1473      
1474      public static RollingUpgradeAction convert(RollingUpgradeActionProto a) {
1475        switch (a) {
1476        case QUERY:
1477          return RollingUpgradeAction.QUERY;
1478        case START:
1479          return RollingUpgradeAction.PREPARE;
1480        case FINALIZE:
1481          return RollingUpgradeAction.FINALIZE;
1482        default:
1483          throw new IllegalArgumentException("Unexpected value: " + a);
1484        }
1485      }
1486    
1487      public static RollingUpgradeStatusProto convertRollingUpgradeStatus(
1488          RollingUpgradeStatus status) {
1489        return RollingUpgradeStatusProto.newBuilder()
1490            .setBlockPoolId(status.getBlockPoolId())
1491            .build();
1492      }
1493    
1494      public static RollingUpgradeStatus convert(RollingUpgradeStatusProto proto) {
1495        return new RollingUpgradeStatus(proto.getBlockPoolId());
1496      }
1497    
1498      public static RollingUpgradeInfoProto convert(RollingUpgradeInfo info) {
1499        return RollingUpgradeInfoProto.newBuilder()
1500            .setStatus(convertRollingUpgradeStatus(info))
1501            .setCreatedRollbackImages(info.createdRollbackImages())
1502            .setStartTime(info.getStartTime())
1503            .setFinalizeTime(info.getFinalizeTime())
1504            .build();
1505      }
1506    
1507      public static RollingUpgradeInfo convert(RollingUpgradeInfoProto proto) {
1508        RollingUpgradeStatusProto status = proto.getStatus();
1509        return new RollingUpgradeInfo(status.getBlockPoolId(),
1510            proto.getCreatedRollbackImages(),
1511            proto.getStartTime(), proto.getFinalizeTime());
1512      }
1513    
1514      public static CorruptFileBlocks convert(CorruptFileBlocksProto c) {
1515        if (c == null)
1516          return null;
1517        List<String> fileList = c.getFilesList();
1518        return new CorruptFileBlocks(fileList.toArray(new String[fileList.size()]),
1519            c.getCookie());
1520      }
1521    
1522      public static CorruptFileBlocksProto convert(CorruptFileBlocks c) {
1523        if (c == null)
1524          return null;
1525        return CorruptFileBlocksProto.newBuilder().
1526            addAllFiles(Arrays.asList(c.getFiles())).
1527            setCookie(c.getCookie()).
1528            build();
1529      }
1530      
1531      public static ContentSummary convert(ContentSummaryProto cs) {
1532        if (cs == null) return null;
1533        return new ContentSummary(
1534          cs.getLength(), cs.getFileCount(), cs.getDirectoryCount(), cs.getQuota(),
1535          cs.getSpaceConsumed(), cs.getSpaceQuota());
1536      }
1537      
1538      public static ContentSummaryProto convert(ContentSummary cs) {
1539        if (cs == null) return null;
1540        return ContentSummaryProto.newBuilder().
1541            setLength(cs.getLength()).
1542            setFileCount(cs.getFileCount()).
1543            setDirectoryCount(cs.getDirectoryCount()).
1544            setQuota(cs.getQuota()).
1545            setSpaceConsumed(cs.getSpaceConsumed()).
1546            setSpaceQuota(cs.getSpaceQuota()).
1547            build();
1548      }
1549    
1550      public static NNHAStatusHeartbeat convert(NNHAStatusHeartbeatProto s) {
1551        if (s == null) return null;
1552        switch (s.getState()) {
1553        case ACTIVE:
1554          return new NNHAStatusHeartbeat(HAServiceState.ACTIVE, s.getTxid());
1555        case STANDBY:
1556          return new NNHAStatusHeartbeat(HAServiceState.STANDBY, s.getTxid());
1557        default:
1558          throw new IllegalArgumentException("Unexpected NNHAStatusHeartbeat.State:" + s.getState());
1559        }
1560      }
1561    
1562      public static NNHAStatusHeartbeatProto convert(NNHAStatusHeartbeat hb) {
1563        if (hb == null) return null;
1564        NNHAStatusHeartbeatProto.Builder builder =
1565          NNHAStatusHeartbeatProto.newBuilder();
1566        switch (hb.getState()) {
1567          case ACTIVE:
1568            builder.setState(NNHAStatusHeartbeatProto.State.ACTIVE);
1569            break;
1570          case STANDBY:
1571            builder.setState(NNHAStatusHeartbeatProto.State.STANDBY);
1572            break;
1573          default:
1574            throw new IllegalArgumentException("Unexpected NNHAStatusHeartbeat.State:" +
1575                hb.getState());
1576        }
1577        builder.setTxid(hb.getTxId());
1578        return builder.build();
1579      }
1580    
1581      public static DatanodeStorageProto convert(DatanodeStorage s) {
1582        return DatanodeStorageProto.newBuilder()
1583            .setState(PBHelper.convertState(s.getState()))
1584            .setStorageType(PBHelper.convertStorageType(s.getStorageType()))
1585            .setStorageUuid(s.getStorageID()).build();
1586      }
1587    
1588      private static StorageState convertState(State state) {
1589        switch(state) {
1590        case READ_ONLY_SHARED:
1591          return StorageState.READ_ONLY_SHARED;
1592        case NORMAL:
1593        default:
1594          return StorageState.NORMAL;
1595        }
1596      }
1597    
1598      private static StorageTypeProto convertStorageType(
1599          StorageType type) {
1600        switch(type) {
1601        case DISK:
1602          return StorageTypeProto.DISK;
1603        case SSD:
1604          return StorageTypeProto.SSD;
1605        default:
1606          throw new IllegalStateException(
1607              "BUG: StorageType not found, type=" + type);
1608        }
1609      }
1610    
1611      public static DatanodeStorage convert(DatanodeStorageProto s) {
1612        return new DatanodeStorage(s.getStorageUuid(),
1613                                   PBHelper.convertState(s.getState()),
1614                                   PBHelper.convertType(s.getStorageType()));
1615      }
1616    
1617      private static State convertState(StorageState state) {
1618        switch(state) {
1619        case READ_ONLY_SHARED:
1620          return DatanodeStorage.State.READ_ONLY_SHARED;
1621        case NORMAL:
1622        default:
1623          return DatanodeStorage.State.NORMAL;
1624        }
1625      }
1626    
1627      private static StorageType convertType(StorageTypeProto type) {
1628        switch(type) {
1629          case DISK:
1630            return StorageType.DISK;
1631          case SSD:
1632            return StorageType.SSD;
1633          default:
1634            throw new IllegalStateException(
1635                "BUG: StorageTypeProto not found, type=" + type);
1636        }
1637      }
1638    
1639      private static StorageType[] convertStorageTypeProtos(
1640          List<StorageTypeProto> storageTypesList) {
1641        final StorageType[] storageTypes = new StorageType[storageTypesList.size()];
1642        for (int i = 0; i < storageTypes.length; ++i) {
1643          storageTypes[i] = PBHelper.convertType(storageTypesList.get(i));
1644        }
1645        return storageTypes;
1646      }
1647    
1648      public static StorageReportProto convert(StorageReport r) {
1649        StorageReportProto.Builder builder = StorageReportProto.newBuilder()
1650            .setBlockPoolUsed(r.getBlockPoolUsed()).setCapacity(r.getCapacity())
1651            .setDfsUsed(r.getDfsUsed()).setRemaining(r.getRemaining())
1652            .setStorageUuid(r.getStorage().getStorageID())
1653            .setStorage(convert(r.getStorage()));
1654        return builder.build();
1655      }
1656    
1657      public static StorageReport convert(StorageReportProto p) {
1658        return new StorageReport(
1659            p.hasStorage() ?
1660                convert(p.getStorage()) :
1661                new DatanodeStorage(p.getStorageUuid()),
1662            p.getFailed(), p.getCapacity(), p.getDfsUsed(), p.getRemaining(),
1663            p.getBlockPoolUsed());
1664      }
1665    
1666      public static StorageReport[] convertStorageReports(
1667          List<StorageReportProto> list) {
1668        final StorageReport[] report = new StorageReport[list.size()];
1669        for (int i = 0; i < report.length; i++) {
1670          report[i] = convert(list.get(i));
1671        }
1672        return report;
1673      }
1674    
1675      public static JournalInfo convert(JournalInfoProto info) {
1676        int lv = info.hasLayoutVersion() ? info.getLayoutVersion() : 0;
1677        int nsID = info.hasNamespaceID() ? info.getNamespaceID() : 0;
1678        return new JournalInfo(lv, info.getClusterID(), nsID);
1679      }
1680    
1681      /**
1682       * Method used for converting {@link JournalInfoProto} sent from Namenode
1683       * to Journal receivers to {@link NamenodeRegistration}.
1684       */
1685      public static JournalInfoProto convert(JournalInfo j) {
1686        return JournalInfoProto.newBuilder().setClusterID(j.getClusterId())
1687            .setLayoutVersion(j.getLayoutVersion())
1688            .setNamespaceID(j.getNamespaceId()).build();
1689      } 
1690      
1691      public static SnapshottableDirectoryStatus[] convert(
1692          SnapshottableDirectoryListingProto sdlp) {
1693        if (sdlp == null)
1694          return null;
1695        List<SnapshottableDirectoryStatusProto> list = sdlp
1696            .getSnapshottableDirListingList();
1697        if (list.isEmpty()) {
1698          return new SnapshottableDirectoryStatus[0];
1699        } else {
1700          SnapshottableDirectoryStatus[] result = 
1701              new SnapshottableDirectoryStatus[list.size()];
1702          for (int i = 0; i < list.size(); i++) {
1703            result[i] = PBHelper.convert(list.get(i));
1704          }
1705          return result;
1706        }
1707      }
1708      
1709      public static SnapshottableDirectoryListingProto convert(
1710          SnapshottableDirectoryStatus[] status) {
1711        if (status == null)
1712          return null;
1713        SnapshottableDirectoryStatusProto[] protos = 
1714            new SnapshottableDirectoryStatusProto[status.length];
1715        for (int i = 0; i < status.length; i++) {
1716          protos[i] = PBHelper.convert(status[i]);
1717        }
1718        List<SnapshottableDirectoryStatusProto> protoList = Arrays.asList(protos);
1719        return SnapshottableDirectoryListingProto.newBuilder()
1720            .addAllSnapshottableDirListing(protoList).build();
1721      }
1722      
1723      public static DiffReportEntry convert(SnapshotDiffReportEntryProto entry) {
1724        if (entry == null) {
1725          return null;
1726        }
1727        DiffType type = DiffType.getTypeFromLabel(entry
1728            .getModificationLabel());
1729        return type == null ? null : 
1730          new DiffReportEntry(type, entry.getFullpath().toByteArray());
1731      }
1732      
1733      public static SnapshotDiffReportEntryProto convert(DiffReportEntry entry) {
1734        if (entry == null) {
1735          return null;
1736        }
1737        byte[] fullPath = entry.getRelativePath();
1738        ByteString fullPathString = ByteString
1739            .copyFrom(fullPath == null ? DFSUtil.EMPTY_BYTES : fullPath);
1740        
1741        String modification = entry.getType().getLabel();
1742        
1743        SnapshotDiffReportEntryProto entryProto = SnapshotDiffReportEntryProto
1744            .newBuilder().setFullpath(fullPathString)
1745            .setModificationLabel(modification).build();
1746        return entryProto;
1747      }
1748      
1749      public static SnapshotDiffReport convert(SnapshotDiffReportProto reportProto) {
1750        if (reportProto == null) {
1751          return null;
1752        }
1753        String snapshotDir = reportProto.getSnapshotRoot();
1754        String fromSnapshot = reportProto.getFromSnapshot();
1755        String toSnapshot = reportProto.getToSnapshot();
1756        List<SnapshotDiffReportEntryProto> list = reportProto
1757            .getDiffReportEntriesList();
1758        List<DiffReportEntry> entries = new ArrayList<DiffReportEntry>();
1759        for (SnapshotDiffReportEntryProto entryProto : list) {
1760          DiffReportEntry entry = convert(entryProto);
1761          if (entry != null)
1762            entries.add(entry);
1763        }
1764        return new SnapshotDiffReport(snapshotDir, fromSnapshot, toSnapshot,
1765            entries);
1766      }
1767      
1768      public static SnapshotDiffReportProto convert(SnapshotDiffReport report) {
1769        if (report == null) {
1770          return null;
1771        }
1772        List<DiffReportEntry> entries = report.getDiffList();
1773        List<SnapshotDiffReportEntryProto> entryProtos = 
1774            new ArrayList<SnapshotDiffReportEntryProto>();
1775        for (DiffReportEntry entry : entries) {
1776          SnapshotDiffReportEntryProto entryProto = convert(entry);
1777          if (entryProto != null)
1778            entryProtos.add(entryProto);
1779        }
1780        
1781        SnapshotDiffReportProto reportProto = SnapshotDiffReportProto.newBuilder()
1782            .setSnapshotRoot(report.getSnapshotRoot())
1783            .setFromSnapshot(report.getFromSnapshot())
1784            .setToSnapshot(report.getLaterSnapshotName())
1785            .addAllDiffReportEntries(entryProtos).build();
1786        return reportProto;
1787      }
1788    
1789      public static DataChecksum.Type convert(HdfsProtos.ChecksumTypeProto type) {
1790        return DataChecksum.Type.valueOf(type.getNumber());
1791      }
1792    
1793      public static CacheDirectiveInfoProto convert
1794          (CacheDirectiveInfo info) {
1795        CacheDirectiveInfoProto.Builder builder = 
1796            CacheDirectiveInfoProto.newBuilder();
1797        if (info.getId() != null) {
1798          builder.setId(info.getId());
1799        }
1800        if (info.getPath() != null) {
1801          builder.setPath(info.getPath().toUri().getPath());
1802        }
1803        if (info.getReplication() != null) {
1804          builder.setReplication(info.getReplication());
1805        }
1806        if (info.getPool() != null) {
1807          builder.setPool(info.getPool());
1808        }
1809        if (info.getExpiration() != null) {
1810          builder.setExpiration(convert(info.getExpiration()));
1811        }
1812        return builder.build();
1813      }
1814    
1815      public static CacheDirectiveInfo convert
1816          (CacheDirectiveInfoProto proto) {
1817        CacheDirectiveInfo.Builder builder =
1818            new CacheDirectiveInfo.Builder();
1819        if (proto.hasId()) {
1820          builder.setId(proto.getId());
1821        }
1822        if (proto.hasPath()) {
1823          builder.setPath(new Path(proto.getPath()));
1824        }
1825        if (proto.hasReplication()) {
1826          builder.setReplication(Shorts.checkedCast(
1827              proto.getReplication()));
1828        }
1829        if (proto.hasPool()) {
1830          builder.setPool(proto.getPool());
1831        }
1832        if (proto.hasExpiration()) {
1833          builder.setExpiration(convert(proto.getExpiration()));
1834        }
1835        return builder.build();
1836      }
1837    
1838      public static CacheDirectiveInfoExpirationProto convert(
1839          CacheDirectiveInfo.Expiration expiration) {
1840        return CacheDirectiveInfoExpirationProto.newBuilder()
1841            .setIsRelative(expiration.isRelative())
1842            .setMillis(expiration.getMillis())
1843            .build();
1844      }
1845    
1846      public static CacheDirectiveInfo.Expiration convert(
1847          CacheDirectiveInfoExpirationProto proto) {
1848        if (proto.getIsRelative()) {
1849          return CacheDirectiveInfo.Expiration.newRelative(proto.getMillis());
1850        }
1851        return CacheDirectiveInfo.Expiration.newAbsolute(proto.getMillis());
1852      }
1853    
1854      public static CacheDirectiveStatsProto convert(CacheDirectiveStats stats) {
1855        CacheDirectiveStatsProto.Builder builder = 
1856            CacheDirectiveStatsProto.newBuilder();
1857        builder.setBytesNeeded(stats.getBytesNeeded());
1858        builder.setBytesCached(stats.getBytesCached());
1859        builder.setFilesNeeded(stats.getFilesNeeded());
1860        builder.setFilesCached(stats.getFilesCached());
1861        builder.setHasExpired(stats.hasExpired());
1862        return builder.build();
1863      }
1864      
1865      public static CacheDirectiveStats convert(CacheDirectiveStatsProto proto) {
1866        CacheDirectiveStats.Builder builder = new CacheDirectiveStats.Builder();
1867        builder.setBytesNeeded(proto.getBytesNeeded());
1868        builder.setBytesCached(proto.getBytesCached());
1869        builder.setFilesNeeded(proto.getFilesNeeded());
1870        builder.setFilesCached(proto.getFilesCached());
1871        builder.setHasExpired(proto.getHasExpired());
1872        return builder.build();
1873      }
1874    
1875      public static CacheDirectiveEntryProto convert(CacheDirectiveEntry entry) {
1876        CacheDirectiveEntryProto.Builder builder = 
1877            CacheDirectiveEntryProto.newBuilder();
1878        builder.setInfo(PBHelper.convert(entry.getInfo()));
1879        builder.setStats(PBHelper.convert(entry.getStats()));
1880        return builder.build();
1881      }
1882      
1883      public static CacheDirectiveEntry convert(CacheDirectiveEntryProto proto) {
1884        CacheDirectiveInfo info = PBHelper.convert(proto.getInfo());
1885        CacheDirectiveStats stats = PBHelper.convert(proto.getStats());
1886        return new CacheDirectiveEntry(info, stats);
1887      }
1888    
1889      public static CachePoolInfoProto convert(CachePoolInfo info) {
1890        CachePoolInfoProto.Builder builder = CachePoolInfoProto.newBuilder();
1891        builder.setPoolName(info.getPoolName());
1892        if (info.getOwnerName() != null) {
1893          builder.setOwnerName(info.getOwnerName());
1894        }
1895        if (info.getGroupName() != null) {
1896          builder.setGroupName(info.getGroupName());
1897        }
1898        if (info.getMode() != null) {
1899          builder.setMode(info.getMode().toShort());
1900        }
1901        if (info.getLimit() != null) {
1902          builder.setLimit(info.getLimit());
1903        }
1904        if (info.getMaxRelativeExpiryMs() != null) {
1905          builder.setMaxRelativeExpiry(info.getMaxRelativeExpiryMs());
1906        }
1907        return builder.build();
1908      }
1909    
1910      public static CachePoolInfo convert (CachePoolInfoProto proto) {
1911        // Pool name is a required field, the rest are optional
1912        String poolName = checkNotNull(proto.getPoolName());
1913        CachePoolInfo info = new CachePoolInfo(poolName);
1914        if (proto.hasOwnerName()) {
1915            info.setOwnerName(proto.getOwnerName());
1916        }
1917        if (proto.hasGroupName()) {
1918          info.setGroupName(proto.getGroupName());
1919        }
1920        if (proto.hasMode()) {
1921          info.setMode(new FsPermission((short)proto.getMode()));
1922        }
1923        if (proto.hasLimit())  {
1924          info.setLimit(proto.getLimit());
1925        }
1926        if (proto.hasMaxRelativeExpiry()) {
1927          info.setMaxRelativeExpiryMs(proto.getMaxRelativeExpiry());
1928        }
1929        return info;
1930      }
1931    
1932      public static CachePoolStatsProto convert(CachePoolStats stats) {
1933        CachePoolStatsProto.Builder builder = CachePoolStatsProto.newBuilder();
1934        builder.setBytesNeeded(stats.getBytesNeeded());
1935        builder.setBytesCached(stats.getBytesCached());
1936        builder.setBytesOverlimit(stats.getBytesOverlimit());
1937        builder.setFilesNeeded(stats.getFilesNeeded());
1938        builder.setFilesCached(stats.getFilesCached());
1939        return builder.build();
1940      }
1941    
1942      public static CachePoolStats convert (CachePoolStatsProto proto) {
1943        CachePoolStats.Builder builder = new CachePoolStats.Builder();
1944        builder.setBytesNeeded(proto.getBytesNeeded());
1945        builder.setBytesCached(proto.getBytesCached());
1946        builder.setBytesOverlimit(proto.getBytesOverlimit());
1947        builder.setFilesNeeded(proto.getFilesNeeded());
1948        builder.setFilesCached(proto.getFilesCached());
1949        return builder.build();
1950      }
1951    
1952      public static CachePoolEntryProto convert(CachePoolEntry entry) {
1953        CachePoolEntryProto.Builder builder = CachePoolEntryProto.newBuilder();
1954        builder.setInfo(PBHelper.convert(entry.getInfo()));
1955        builder.setStats(PBHelper.convert(entry.getStats()));
1956        return builder.build();
1957      }
1958    
1959      public static CachePoolEntry convert (CachePoolEntryProto proto) {
1960        CachePoolInfo info = PBHelper.convert(proto.getInfo());
1961        CachePoolStats stats = PBHelper.convert(proto.getStats());
1962        return new CachePoolEntry(info, stats);
1963      }
1964      
1965      public static HdfsProtos.ChecksumTypeProto convert(DataChecksum.Type type) {
1966        return HdfsProtos.ChecksumTypeProto.valueOf(type.id);
1967      }
1968    
1969      public static DatanodeLocalInfoProto convert(DatanodeLocalInfo info) {
1970        DatanodeLocalInfoProto.Builder builder = DatanodeLocalInfoProto.newBuilder();
1971        builder.setSoftwareVersion(info.getSoftwareVersion());
1972        builder.setConfigVersion(info.getConfigVersion());
1973        builder.setUptime(info.getUptime());
1974        return builder.build();
1975      }
1976    
1977      public static DatanodeLocalInfo convert(DatanodeLocalInfoProto proto) {
1978        return new DatanodeLocalInfo(proto.getSoftwareVersion(),
1979            proto.getConfigVersion(), proto.getUptime());
1980      }
1981    
1982      public static InputStream vintPrefixed(final InputStream input)
1983          throws IOException {
1984        final int firstByte = input.read();
1985        if (firstByte == -1) {
1986          throw new EOFException("Premature EOF: no length prefix available");
1987        }
1988    
1989        int size = CodedInputStream.readRawVarint32(firstByte, input);
1990        assert size >= 0;
1991        return new ExactSizeInputStream(input, size);
1992      }
1993    
1994      private static AclEntryScopeProto convert(AclEntryScope v) {
1995        return AclEntryScopeProto.valueOf(v.ordinal());
1996      }
1997    
1998      private static AclEntryScope convert(AclEntryScopeProto v) {
1999        return castEnum(v, ACL_ENTRY_SCOPE_VALUES);
2000      }
2001    
2002      private static AclEntryTypeProto convert(AclEntryType e) {
2003        return AclEntryTypeProto.valueOf(e.ordinal());
2004      }
2005    
2006      private static AclEntryType convert(AclEntryTypeProto v) {
2007        return castEnum(v, ACL_ENTRY_TYPE_VALUES);
2008      }
2009    
2010      private static FsActionProto convert(FsAction v) {
2011        return FsActionProto.valueOf(v != null ? v.ordinal() : 0);
2012      }
2013    
2014      private static FsAction convert(FsActionProto v) {
2015        return castEnum(v, FSACTION_VALUES);
2016      }
2017    
2018      public static List<AclEntryProto> convertAclEntryProto(
2019          List<AclEntry> aclSpec) {
2020        ArrayList<AclEntryProto> r = Lists.newArrayListWithCapacity(aclSpec.size());
2021        for (AclEntry e : aclSpec) {
2022          AclEntryProto.Builder builder = AclEntryProto.newBuilder();
2023          builder.setType(convert(e.getType()));
2024          builder.setScope(convert(e.getScope()));
2025          builder.setPermissions(convert(e.getPermission()));
2026          if (e.getName() != null) {
2027            builder.setName(e.getName());
2028          }
2029          r.add(builder.build());
2030        }
2031        return r;
2032      }
2033    
2034      public static List<AclEntry> convertAclEntry(List<AclEntryProto> aclSpec) {
2035        ArrayList<AclEntry> r = Lists.newArrayListWithCapacity(aclSpec.size());
2036        for (AclEntryProto e : aclSpec) {
2037          AclEntry.Builder builder = new AclEntry.Builder();
2038          builder.setType(convert(e.getType()));
2039          builder.setScope(convert(e.getScope()));
2040          builder.setPermission(convert(e.getPermissions()));
2041          if (e.hasName()) {
2042            builder.setName(e.getName());
2043          }
2044          r.add(builder.build());
2045        }
2046        return r;
2047      }
2048    
2049      public static AclStatus convert(GetAclStatusResponseProto e) {
2050        AclStatusProto r = e.getResult();
2051        return new AclStatus.Builder().owner(r.getOwner()).group(r.getGroup())
2052            .stickyBit(r.getSticky())
2053            .addEntries(convertAclEntry(r.getEntriesList())).build();
2054      }
2055    
2056      public static GetAclStatusResponseProto convert(AclStatus e) {
2057        AclStatusProto r = AclStatusProto.newBuilder().setOwner(e.getOwner())
2058            .setGroup(e.getGroup()).setSticky(e.isStickyBit())
2059            .addAllEntries(convertAclEntryProto(e.getEntries())).build();
2060        return GetAclStatusResponseProto.newBuilder().setResult(r).build();
2061      }
2062    
2063      public static ShortCircuitShmSlotProto convert(SlotId slotId) {
2064        return ShortCircuitShmSlotProto.newBuilder().
2065            setShmId(convert(slotId.getShmId())).
2066            setSlotIdx(slotId.getSlotIdx()).
2067            build();
2068      }
2069    
2070      public static ShortCircuitShmIdProto convert(ShmId shmId) {
2071        return ShortCircuitShmIdProto.newBuilder().
2072            setHi(shmId.getHi()).
2073            setLo(shmId.getLo()).
2074            build();
2075    
2076      }
2077    
2078      public static SlotId convert(ShortCircuitShmSlotProto slotId) {
2079        return new SlotId(PBHelper.convert(slotId.getShmId()),
2080            slotId.getSlotIdx());
2081      }
2082    
2083      public static ShmId convert(ShortCircuitShmIdProto shmId) {
2084        return new ShmId(shmId.getHi(), shmId.getLo());
2085      }
2086    }
2087