/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed 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 com.google.gwt.logging.server;

import java.util.logging.LogRecord;
import java.util.logging.Logger;

/**
 * Utilities for classes that accept Remote Logging requests.
 */
public class RemoteLoggingServiceUtil {

  /**
   * Exceptions that occur during remote logging.
   */
  public static class RemoteLoggingException extends Exception {
    public RemoteLoggingException(String message) {
      super(message);
    }

    public RemoteLoggingException(String message, Throwable t) {
      super(message, t);
    }
  }

  /**
   * Logs a message on the server.
   *
   * @param lr LogRecord to be logged
   * @param strongName Permutation name (used for deobfuscation and may be null,
   *        which will only cause deobfuscation to fail)
   * @param deobfuscator used for deobfuscation. May be null, which will only
   *        cause deobfuscation to fail.
   * @param loggerNameOverride logger name for messages logged on server. May be
   *        null, in which case, messages will be logged to a logger
   *        corresponding to the client side logger which triggered them.
   */
  public static void logOnServer(LogRecord lr, String strongName,
      StackTraceDeobfuscator deobfuscator, String loggerNameOverride) throws
      RemoteLoggingException {
    if (deobfuscator != null) {
      lr = deobfuscator.deobfuscateLogRecord(lr, strongName);
    }
    String loggerName = loggerNameOverride == null ? lr.getLoggerName() :
      loggerNameOverride;
    Logger logger = Logger.getLogger(loggerName);
    logger.log(lr);
  }

  public static void logOnServer(String serializedLogRecordJson,
      String strongName, StackTraceDeobfuscator deobfuscator,
      String loggerNameOverride) throws RemoteLoggingException {
    LogRecord lr;
    try {
      lr = JsonLogRecordServerUtil.logRecordFromJson(
          serializedLogRecordJson);
      logOnServer(lr, strongName, deobfuscator, loggerNameOverride);
    } catch (Exception e) {
      // We don't want to import the JsonException, which will require the json
      // jar when this class loads, so we just catch all exceptions here
      throw new RemoteLoggingException("Failed to deserialize JSON", e);
    }
  }
}
