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 019package org.apache.hadoop.ipc.protocolPB; 020 021import java.io.Closeable; 022import java.io.IOException; 023import java.util.ArrayList; 024import java.util.Arrays; 025import java.util.Collection; 026import java.util.List; 027 028import org.apache.hadoop.ipc.ProtobufHelper; 029import org.apache.hadoop.ipc.ProtocolMetaInterface; 030import org.apache.hadoop.ipc.RPC; 031import org.apache.hadoop.ipc.RefreshResponse; 032import org.apache.hadoop.ipc.RpcClientUtil; 033import org.apache.hadoop.ipc.GenericRefreshProtocol; 034import org.apache.hadoop.ipc.proto.GenericRefreshProtocolProtos.GenericRefreshRequestProto; 035import org.apache.hadoop.ipc.proto.GenericRefreshProtocolProtos.GenericRefreshResponseProto; 036import org.apache.hadoop.ipc.proto.GenericRefreshProtocolProtos.GenericRefreshResponseCollectionProto; 037 038import com.google.protobuf.RpcController; 039import com.google.protobuf.ServiceException; 040 041public class GenericRefreshProtocolClientSideTranslatorPB implements 042 ProtocolMetaInterface, GenericRefreshProtocol, Closeable { 043 044 /** RpcController is not used and hence is set to null. */ 045 private final static RpcController NULL_CONTROLLER = null; 046 private final GenericRefreshProtocolPB rpcProxy; 047 048 public GenericRefreshProtocolClientSideTranslatorPB( 049 GenericRefreshProtocolPB rpcProxy) { 050 this.rpcProxy = rpcProxy; 051 } 052 053 @Override 054 public void close() throws IOException { 055 RPC.stopProxy(rpcProxy); 056 } 057 058 @Override 059 public Collection<RefreshResponse> refresh(String identifier, String[] args) throws IOException { 060 List<String> argList = Arrays.asList(args); 061 062 try { 063 GenericRefreshRequestProto request = GenericRefreshRequestProto.newBuilder() 064 .setIdentifier(identifier) 065 .addAllArgs(argList) 066 .build(); 067 068 GenericRefreshResponseCollectionProto resp = rpcProxy.refresh(NULL_CONTROLLER, request); 069 return unpack(resp); 070 } catch (ServiceException se) { 071 throw ProtobufHelper.getRemoteException(se); 072 } 073 } 074 075 private Collection<RefreshResponse> unpack(GenericRefreshResponseCollectionProto collection) { 076 List<GenericRefreshResponseProto> responseProtos = collection.getResponsesList(); 077 List<RefreshResponse> responses = new ArrayList<RefreshResponse>(); 078 079 for (GenericRefreshResponseProto rp : responseProtos) { 080 RefreshResponse response = unpack(rp); 081 responses.add(response); 082 } 083 084 return responses; 085 } 086 087 private RefreshResponse unpack(GenericRefreshResponseProto proto) { 088 // The default values 089 String message = null; 090 String sender = null; 091 int returnCode = -1; 092 093 // ... that can be overridden by data from the protobuf 094 if (proto.hasUserMessage()) { 095 message = proto.getUserMessage(); 096 } 097 if (proto.hasExitStatus()) { 098 returnCode = proto.getExitStatus(); 099 } 100 if (proto.hasSenderName()) { 101 sender = proto.getSenderName(); 102 } 103 104 // ... and put into a RefreshResponse 105 RefreshResponse response = new RefreshResponse(returnCode, message); 106 response.setSenderName(sender); 107 108 return response; 109 } 110 111 @Override 112 public boolean isMethodSupported(String methodName) throws IOException { 113 return RpcClientUtil.isMethodSupported(rpcProxy, 114 GenericRefreshProtocolPB.class, 115 RPC.RpcKind.RPC_PROTOCOL_BUFFER, 116 RPC.getProtocolVersion(GenericRefreshProtocolPB.class), 117 methodName); 118 } 119}