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

#ifndef __javax_management_ObjectName__
#define __javax_management_ObjectName__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace javax
  {
    namespace management
    {
        class MBeanServer;
        class ObjectName;
    }
  }
}

class javax::management::ObjectName : public ::java::lang::Object
{

public:
  ObjectName(::java::lang::String *);
private:
  void parse(::java::lang::String *);
public:
  ObjectName(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  ObjectName(::java::lang::String *, ::java::util::Hashtable *);
private:
  void checkComponents();
public:
  virtual jboolean apply(::javax::management::ObjectName *);
private:
  static jboolean domainMatches(::java::lang::String *, jint, ::java::lang::String *, jint);
public:
  virtual jboolean equals(::java::lang::Object *);
  virtual ::java::lang::String * getCanonicalKeyPropertyListString();
  virtual ::java::lang::String * getCanonicalName();
  virtual ::java::lang::String * getDomain();
  static ::javax::management::ObjectName * getInstance(::javax::management::ObjectName *);
  static ::javax::management::ObjectName * getInstance(::java::lang::String *);
  static ::javax::management::ObjectName * getInstance(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  static ::javax::management::ObjectName * getInstance(::java::lang::String *, ::java::util::Hashtable *);
  virtual ::java::lang::String * getKeyProperty(::java::lang::String *);
  virtual ::java::util::Hashtable * getKeyPropertyList();
  virtual ::java::lang::String * getKeyPropertyListString();
  virtual jint hashCode();
  virtual jboolean isDomainPattern();
  virtual jboolean isPattern();
  virtual jboolean isPropertyPattern();
  virtual jboolean isPropertyListPattern();
  virtual jboolean isPropertyValuePattern();
  virtual jboolean isPropertyValuePattern(::java::lang::String *);
  static ::java::lang::String * quote(::java::lang::String *);
  virtual void setMBeanServer(::javax::management::MBeanServer *);
  virtual ::java::lang::String * toString();
private:
  void writeObject(::java::io::ObjectOutputStream *);
  void readObject(::java::io::ObjectInputStream *);
public:
  static ::java::lang::String * unquote(::java::lang::String *);
private:
  static const jlong serialVersionUID = 1081892073854801359LL;
public:
  static ::javax::management::ObjectName * WILDCARD;
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) domain;
  ::java::util::TreeMap * properties;
  ::java::lang::String * propertyListString;
  jboolean propertyListPattern;
  jboolean propertyValuePattern;
  ::javax::management::MBeanServer * server;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_management_ObjectName__
