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

#ifndef __java_security_Identity__
#define __java_security_Identity__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace security
    {
        class Certificate;
        class Identity;
        class IdentityScope;
        class PublicKey;
    }
  }
}

class java::security::Identity : public ::java::lang::Object
{

public: // actually protected
  Identity();
public:
  Identity(::java::lang::String *, ::java::security::IdentityScope *);
  Identity(::java::lang::String *);
  virtual ::java::lang::String * getName();
  virtual ::java::security::IdentityScope * getScope();
  virtual ::java::security::PublicKey * getPublicKey();
  virtual void setPublicKey(::java::security::PublicKey *);
  virtual void setInfo(::java::lang::String *);
  virtual ::java::lang::String * getInfo();
  virtual void addCertificate(::java::security::Certificate *);
  virtual void removeCertificate(::java::security::Certificate *);
  virtual JArray< ::java::security::Certificate * > * certificates();
  virtual jboolean equals(::java::lang::Object *);
public: // actually protected
  virtual jboolean identityEquals(::java::security::Identity *);
public:
  virtual ::java::lang::String * toString();
  virtual ::java::lang::String * toString(jboolean);
  virtual jint hashCode();
private:
  static const jlong serialVersionUID = 3609922007826600659LL;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name;
  ::java::security::IdentityScope * scope;
  ::java::security::PublicKey * publicKey;
  ::java::lang::String * info;
  ::java::util::Vector * certificates__;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_Identity__
