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

#ifndef __javax_imageio_metadata_IIOMetadataFormatImpl$IIOMetadataNodeAttr__
#define __javax_imageio_metadata_IIOMetadataFormatImpl$IIOMetadataNodeAttr__

#pragma interface

#include <javax/imageio/metadata/IIOMetadataNode.h>
extern "Java"
{
  namespace javax
  {
    namespace imageio
    {
      namespace metadata
      {
          class IIOMetadataFormatImpl$IIOMetadataNodeAttr;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Element;
          class TypeInfo;
      }
    }
  }
}

class javax::imageio::metadata::IIOMetadataFormatImpl$IIOMetadataNodeAttr : public ::javax::imageio::metadata::IIOMetadataNode
{

public:
  IIOMetadataFormatImpl$IIOMetadataNodeAttr(::org::w3c::dom::Element *, ::java::lang::String *, ::java::lang::String *);
  IIOMetadataFormatImpl$IIOMetadataNodeAttr(::org::w3c::dom::Element *, ::java::lang::String *, jint, jboolean, ::java::lang::String *);
  virtual ::java::lang::String * getName();
  virtual ::org::w3c::dom::Element * getOwnerElement();
  virtual jint getDataType();
  virtual ::org::w3c::dom::TypeInfo * getSchemaTypeInfo();
  virtual jboolean getSpecified();
  virtual ::java::lang::String * getValue();
  virtual jboolean isId();
  virtual void setValue(::java::lang::String *);
  virtual jboolean isRequired();
public: // actually protected
  ::org::w3c::dom::Element * __attribute__((aligned(__alignof__( ::javax::imageio::metadata::IIOMetadataNode)))) owner;
  ::java::lang::String * name;
  jint dataType;
  jboolean required;
  ::java::lang::String * defaultValue;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_imageio_metadata_IIOMetadataFormatImpl$IIOMetadataNodeAttr__
