/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.hadoop.yarn.ipc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.exceptions.YarnRemoteException;
import org.apache.hadoop.yarn.factories.YarnRemoteExceptionFactory;
import org.apache.hadoop.yarn.factory.providers.YarnRemoteExceptionFactoryProvider;

public class RPCUtil {


  /**
   * Relying on the default factory configuration to be set correctly
   * for the default configuration.
   */
  private static Configuration conf = new Configuration();
  private static YarnRemoteExceptionFactory exceptionFactory = YarnRemoteExceptionFactoryProvider.getYarnRemoteExceptionFactory(conf);
  
  /**
   * Returns the YarnRemoteException which is serializable. 
   */
  public static YarnRemoteException getRemoteException(Throwable t) {
    return exceptionFactory.createYarnRemoteException(t);
  }

  /**
   * Returns the YarnRemoteException which is serializable.
   */
  public static YarnRemoteException getRemoteException(String message) {
    return exceptionFactory.createYarnRemoteException(message);
  }

  public static String toString(YarnRemoteException e) {
    return (e.getMessage() == null ? "" : e.getMessage()) + 
      (e.getRemoteTrace() == null ? "" : "\n StackTrace: " + e.getRemoteTrace()) + 
      (e.getCause() == null ? "" : "\n Caused by: " + toString(e.getCause()));
  }
}
