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}