/*
 * 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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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


/**
 * A set of functions to convert standard JSON strings into
 * LogRecords. The corresponding functions to create the JSON
 * strings are in JsonLogRecordClientUtil.java. This class should only be used
 * in server side code since it imports org.json classes.
 * TODO(unnurg) once there is a unified JSON GWT library, combine this with
 * JsonLogRecordClientUtil.
 */
public class JsonLogRecordServerUtil {
  private static Logger logger =
    Logger.getLogger(JsonLogRecordServerUtil.class.getName());
  public static LogRecord logRecordFromJson(String jsonString)
  throws JSONException {
    JSONObject lro = new JSONObject(jsonString);
    String level = lro.getString("level");
    String loggerName = lro.getString("loggerName");
    String msg = lro.getString("msg");
    long timestamp = Long.parseLong(lro.getString("timestamp"));
    Throwable thrown =
      throwableFromJson(lro.getString("thrown"));
    LogRecord lr = new LogRecord(Level.parse(level), msg);
    lr.setLoggerName(loggerName);
    lr.setThrown(thrown);
    lr.setMillis(timestamp);
    return lr;
  }
  
  private static StackTraceElement stackTraceElementFromJson(
      String jsonString) throws JSONException {
    JSONObject ste = new JSONObject(jsonString);
    String className = ste.getString("className");
    String fileName = ste.getString("fileName");
    String methodName = ste.getString("methodName");
    int lineNumber = Integer.parseInt(ste.getString("lineNumber"));
    return new StackTraceElement(className, methodName, fileName, lineNumber);
  }
  
  private static Throwable throwableFromJson(String jsonString)
  throws JSONException {
    if (jsonString.equals("{}")) {
      return null;
    }
    JSONObject t = new JSONObject(jsonString);
    String message = t.getString("message");
    Throwable cause =
      throwableFromJson(t.getString("cause"));
    StackTraceElement[] stackTrace = null;
    JSONArray st = t.getJSONArray("stackTrace");
    if (st.length() > 0) {
      stackTrace = new StackTraceElement[st.length()];
      for (int i = 0; i < st.length(); i++) {
        stackTrace[i] = stackTraceElementFromJson(st.getString(i));
      }
    }
    Throwable thrown = new Throwable(message, cause);
    thrown.setStackTrace(stackTrace);
    return thrown;
  }
}
