/*
 * Copyright 2011 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.user.client.rpc;

import java.util.logging.LogRecord;

/**
 * Test service for serialization of GWT core.java.util.logging emulations.
 */
@RemoteServiceRelativePath("loggingrpc")
public interface LoggingRPCTestService extends RemoteService {
  /**
   * A custom exception for the LoggingRPC test.
   */
  final class LoggingRPCTestServiceException extends Exception {
    public LoggingRPCTestServiceException() {
    }

    public LoggingRPCTestServiceException(String msg) {
      super(msg);
    }
  }
  LogRecord deobfuscateLogRecord(LogRecord value) throws LoggingRPCTestServiceException;

  LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException;
}
