
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_util_logging_LogRecord__
#define __java_util_logging_LogRecord__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>


class java::util::logging::LogRecord : public ::java::lang::Object
{

public:
  LogRecord(::java::util::logging::Level *, ::java::lang::String *);
private:
  void readObject(::java::io::ObjectInputStream *);
  void writeObject(::java::io::ObjectOutputStream *);
public:
  virtual ::java::lang::String * getLoggerName();
  virtual void setLoggerName(::java::lang::String *);
  virtual ::java::util::ResourceBundle * getResourceBundle();
  virtual void setResourceBundle(::java::util::ResourceBundle *);
  virtual ::java::lang::String * getResourceBundleName();
  virtual void setResourceBundleName(::java::lang::String *);
  virtual ::java::util::logging::Level * getLevel();
  virtual void setLevel(::java::util::logging::Level *);
private:
  static jlong allocateSeqNum();
public:
  virtual jlong getSequenceNumber();
  virtual void setSequenceNumber(jlong);
  virtual ::java::lang::String * getSourceClassName();
  virtual void setSourceClassName(::java::lang::String *);
  virtual ::java::lang::String * getSourceMethodName();
  virtual void setSourceMethodName(::java::lang::String *);
  virtual ::java::lang::String * getMessage();
  virtual void setMessage(::java::lang::String *);
  virtual JArray< ::java::lang::Object * > * getParameters();
  virtual void setParameters(JArray< ::java::lang::Object * > *);
  virtual jint getThreadID();
  virtual void setThreadID(jint);
  virtual jlong getMillis();
  virtual void setMillis(jlong);
  virtual ::java::lang::Throwable * getThrown();
  virtual void setThrown(::java::lang::Throwable *);
private:
  ::java::util::logging::Level * __attribute__((aligned(__alignof__( ::java::lang::Object)))) level;
  jlong sequenceNumber;
  ::java::lang::String * sourceClassName;
  ::java::lang::String * sourceMethodName;
  ::java::lang::String * message;
  jint threadID;
  jlong millis;
  ::java::lang::Throwable * thrown;
  ::java::lang::String * loggerName;
  ::java::lang::String * resourceBundleName;
  JArray< ::java::lang::Object * > * parameters;
  ::java::util::ResourceBundle * bundle;
public: // actually package-private
  static const jlong serialVersionUID = 5372048053134512534LL;
private:
  static jlong lastSeqNum;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_logging_LogRecord__
