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

#ifndef __java_util_logging_LogManager__
#define __java_util_logging_LogManager__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace beans
    {
        class PropertyChangeListener;
        class PropertyChangeSupport;
    }
  }
}

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

public: // actually protected
  LogManager();
public:
  static ::java::util::logging::LogManager * getLogManager();
private:
  static ::java::util::logging::LogManager * makeLogManager();
  static void initLogManager();
public:
  virtual void addPropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual void removePropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual jboolean addLogger(::java::util::logging::Logger *);
private:
  ::java::util::logging::Logger * findAncestor(::java::util::logging::Logger *);
public:
  virtual ::java::util::logging::Logger * getLogger(::java::lang::String *);
  virtual ::java::util::Enumeration * getLoggerNames();
  virtual void reset();
  virtual void readConfiguration();
  virtual void readConfiguration(::java::io::InputStream *);
  virtual ::java::lang::String * getProperty(::java::lang::String *);
public: // actually package-private
  static jint getIntProperty(::java::lang::String *, jint);
  static jint getIntPropertyClamped(::java::lang::String *, jint, jint, jint);
  static jboolean getBooleanProperty(::java::lang::String *, jboolean);
  static ::java::util::logging::Level * getLevelProperty(::java::lang::String *, ::java::util::logging::Level *);
  static ::java::lang::Class * getClassProperty(::java::lang::String *, ::java::lang::Class *);
  static ::java::lang::Object * getInstanceProperty(::java::lang::String *, ::java::lang::Class *, ::java::lang::Class *);
public:
  virtual void checkAccess();
private:
  static ::java::lang::Object * createInstance(::java::lang::String *, ::java::lang::Class *, ::java::lang::String *);
  static void warn(::java::lang::String *, ::java::lang::String *, ::java::lang::Throwable *);
  static void warn(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  static void warn(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::Throwable *);
  static void warn(::java::lang::String *, ::java::lang::Throwable *);
  static ::java::lang::Class * locateClass(::java::lang::String *);
public:
  static ::java::util::logging::LoggingMXBean * getLoggingMXBean();
  static ::java::lang::String * LOGGING_MXBEAN_NAME;
private:
  static ::java::util::logging::LogManager * logManager;
  static ::java::util::logging::LoggingMXBean * loggingBean;
  ::java::util::Map * __attribute__((aligned(__alignof__( ::java::lang::Object)))) loggers;
  ::java::util::Properties * properties;
  ::java::beans::PropertyChangeSupport * pcs;
  static ::java::lang::String * MANAGER_PROPERTY;
  static ::java::lang::String * CONFIG_PROPERTY;
  static ::java::util::logging::LoggingPermission * controlPermission;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_logging_LogManager__
