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

#ifndef __gnu_CORBA_ObjectCreator__
#define __gnu_CORBA_ObjectCreator__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace GIOP
      {
          class ServiceContext;
      }
        class ObjectCreator;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Any;
          class SystemException;
          class UserException;
        namespace portable
        {
            class InputStream;
            class OutputStream;
        }
      }
    }
  }
}

class gnu::CORBA::ObjectCreator : public ::java::lang::Object
{

public:
  ObjectCreator();
  static ::java::lang::Object * createObject(::java::lang::String *, ::java::lang::String *);
  static ::org::omg::CORBA::SystemException * readSystemException(::org::omg::CORBA::portable::InputStream *, JArray< ::gnu::CORBA::GIOP::ServiceContext * > *);
  static ::org::omg::CORBA::UserException * readUserException(::java::lang::String *, ::org::omg::CORBA::portable::InputStream *);
  static ::java::lang::String * toHelperName(::java::lang::String *);
  static void writeSystemException(::org::omg::CORBA::portable::OutputStream *, ::org::omg::CORBA::SystemException *);
public: // actually protected
  static ::java::lang::String * toClassName(::java::lang::String *, ::java::lang::String *);
public:
  static ::java::lang::Class * Idl2class(::java::lang::String *);
  static ::java::lang::Object * Idl2Object(::java::lang::String *);
  static ::java::lang::String * getRepositoryId(::java::lang::Class *);
  static jboolean insertWithHelper(::org::omg::CORBA::Any *, ::java::lang::Object *);
  static jboolean insertSysException(::org::omg::CORBA::Any *, ::org::omg::CORBA::SystemException *);
  static ::java::lang::String * getDefaultName(::java::lang::String *);
  static void insertException(::org::omg::CORBA::Any *, ::java::lang::Throwable *);
  static ::java::lang::Class * findHelper(::java::lang::String *);
  static ::java::lang::Class * forName(::java::lang::String *);
  static ::java::lang::String * OMG_PREFIX;
  static ::java::lang::String * JAVA_PREFIX;
  static ::java::lang::String * CLASSPATH_PREFIX;
  static ::java::util::Map * m_names;
  static ::java::util::Map * m_classes;
  static ::java::util::Map * m_helpers;
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_ObjectCreator__
