Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Пример кода для Hello.idl

Эти шоу документа код, сгенерированный компилятором IDL к Java в соответствии с IDL к Спецификации Отображения Языка Java (для деталей соответствия ссылаются на документ соответствия), так же как демонстрационные приложения клиента и сервера.

Для подробного описания кода, перечисленного здесь, консультируйтесь с вводным учебным руководством, Начинающим с IDL Java.

Hello.idl, интерфейсное определение

Следующий файл, Hello.idl, пишется в Языке определения интерфейсов OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чей метод shutdown() завершает работу ШАРА. IDL OMG является просто декларативным языком, разработанным для того, чтобы определить независимые от языка программированием операционные интерфейсы для распределенных приложений. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.

Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, считайте Главу 3 Спецификации CORBA.

Hello.idl

module HelloApp
{
  interface Hello
  {
  string sayHello();
  oneway void shutdown();
  };
};

Сгенерированные Файлы

Компилятор idlj использует IDL к Java, отображающийся, чтобы преобразовать определения интерфейса IDL соответствующим интерфейсам Java, классам, и методам, которые можно тогда использовать, чтобы реализовать Ваш код клиента и сервера. Следующие файлы сгенерированы, когда Hello.idl компилируется с компилятором IDL к Java, используя следующую команду:

   idlj -fall Hello.idl

Hello.java, интерфейс подписи

Файл интерфейса подписи, Hello.java расширяет org.omg.portable.IDLEntity, org.omg.CORBA.Object, и интерфейс операций, HelloOperations. Интерфейс подписи используется, поскольку подпись вводит объявления метода, когда интерфейсы указанного типа используются в других интерфейсах. С точки зрения клиента, ссылки на объект для CORBA Hello возразите реализует этот интерфейс.

Отметьте: Тупик реализует Hello интерфейс, где это генерирует код для каждого метода в Маршалл параметры, вызывает метод, и затем неМаршалл параметры.

HelloApp/Hello.java
package HelloApp;


/**
* HelloApp/Hello.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

public interface Hello extends HelloOperations, org.omg.CORBA.Object, 
org.omg.CORBA.portable.IDLEntity 
{
} // interface Hello

HelloOperations.java, интерфейс операций

Интерфейс операций Java, HelloOperations.java, используется в отображении серверной стороны и как механизм для того, чтобы обеспечить оптимизированные призывы к cо-расположенным клиентам и серверу. Разработчик сервера обеспечивает реализацию для методов, обозначенных интерфейсом операций.

Этот интерфейс содержит методы sayHello() и shutdown(). Отображение IDL к Java помещает все операции, определенные в интерфейсе IDL в этот файл, который совместно используется и тупиками и скелетами.

Отметьте: писатель сервера обычно расширяется HelloPOA и обеспечивает реализацию для методов, обеспеченных интерфейсом операций.

HelloApp/HelloOperations.java
package HelloApp;


/**
* HelloApp/HelloOperations.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

public interface HelloOperations 
{
  String sayHello ();
  void Shutdown ();
} // interface HelloOperations

HelloHelper.java, класс Помощника

Класс Java HelloHelper обеспечивает вспомогательную функциональность, особенно метод narrow(), требуемый бросать ссылки на объект CORBA на их надлежащие типы. Класс Помощника ответственен за чтение и запись типа данных к потокам CORBA, и вставки и извлечения типа данных от Any s. Класс Держателя делегирует к методам в классе Помощника для чтения и записи.

HelloApp/HelloHelper.java
package HelloApp;


/**
* HelloApp/HelloHelper.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

abstract public class HelloHelper
{
  private static String  _id = "IDL:HelloApp/Hello:1.0";

  public static void insert (org.omg.CORBA.Any a, HelloApp.Hello that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
    a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  public static HelloApp.Hello extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  private static org.omg.CORBA.TypeCode __typeCode = null;
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc 
(HelloApp.HelloHelper.id (), "Hello");
    }
    return __typeCode;
  }

  public static String id ()
  {
    return _id;
  }

  public static HelloApp.Hello read (org.omg.CORBA.portable.InputStream istream)
  {
    return narrow (istream.read_Object (_HelloStub.class));
  }

  public static void write (org.omg.CORBA.portable.OutputStream ostream, 
HelloApp.Hello value)
  {
    ostream.write_Object ((org.omg.CORBA.Object) value);
  }

  public static HelloApp.Hello narrow (org.omg.CORBA.Object obj)
  {
    if (obj == null)
      return null;
    else if (obj instanceof HelloApp.Hello)
      return (HelloApp.Hello)obj;
    else if (!obj._is_a (id ()))
      throw new org.omg.CORBA.BAD_PARAM ();
    else
    {
      org.omg.CORBA.portable.Delegate delegate = 
((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
      HelloApp._HelloStub stub = new HelloApp._HelloStub ();
      stub._set_delegate(delegate);
      return stub;
    }
  }

}

HelloHolder.java, класс Держателя

Класс Java под названием HelloHolder содержит общедоступного члена экземпляра типа Hello. Всякий раз, когда типом IDL является out или параметр inout, класс Держателя используется. Это обеспечивает операции для org.omg.CORBA.portable.OutputStream и параметров org.omg.CORBA.portable.InputStream, которые CORBA позволяет, но которые не отображаются легко на семантику Java. Класс Держателя делегирует к методам в классе Помощника для чтения и записи. Это реализует org.omg.CORBA.portable.Streamable.

HelloApp/HelloHolder.java
package HelloApp;

/**
* HelloApp/HelloHolder.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

public final class HelloHolder implements org.omg.CORBA.portable.Streamable
{
  public HelloApp.Hello value = null;

  public HelloHolder ()
  {
  }

  public HelloHolder (HelloApp.Hello initialValue)
  {
    value = initialValue;
  }

  public void _read (org.omg.CORBA.portable.InputStream i)
  {
    value = HelloApp.HelloHelper.read (i);
  }

  public void _write (org.omg.CORBA.portable.OutputStream o)
  {
    HelloApp.HelloHelper.write (o, value);
  }

  public org.omg.CORBA.TypeCode _type ()
  {
    return HelloApp.HelloHelper.type ();
  }

}

_HelloStub.java, клиентский тупик

Класс Java _HelloStub является тупиковым файлом для отображения клиентской стороны. Это расширяет org.omg.CORBA.portable.ObjectImpl и реализует интерфейс Hello.java.

HelloApp / _ HelloStub.java
package HelloApp;


/**
* HelloApp/_HelloStub.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

public class _HelloStub extends org.omg.CORBA.portable.ObjectImpl implements 
HelloApp.Hello
{

  public String sayHello ()
  {
    org.omg.CORBA.portable.InputStream _in = null;
    try {
       org.omg.CORBA.portable.OutputStream _out = _request ("sayHello", true);
       _in = _invoke (_out);
       String __result = _in.read_string ();
       return __result;
    } catch (org.omg.CORBA.portable.ApplicationException _ex) {
       _in = _ex.getInputStream ();
       String _id = _ex.getId ();
       throw new org.omg.CORBA.MARSHAL (_id);
    } catch (org.omg.CORBA.portable.RemarshalException _rm) {
       return sayHello ();
    } finally {
        _releaseReply (_in);
    }
  } // sayHello

  public void Shutdown ()
  {
    org.omg.CORBA.portable.InputStream _in = null;
    try {
       org.omg.CORBA.portable.OutputStream _out = _request ("Shutdown", false);
       _in = _invoke (_out);
    } catch (org.omg.CORBA.portable.ApplicationException _ex) {
       _in = _ex.getInputStream ();
       String _id = _ex.getId ();
       throw new org.omg.CORBA.MARSHAL (_id);
    } catch (org.omg.CORBA.portable.RemarshalException _rm) {
       Shutdown ();
    } finally {
        _releaseReply (_in);
    }
  } // Shutdown

  // Type-specific CORBA::Object operations
  private static String[] __ids = {
    "IDL:HelloApp/Hello:1.0"};

  public String[] _ids ()
  {
    return (String[])__ids.clone ();
  }

  private void readObject (java.io.ObjectInputStream s) throws java.io.IOException
  {
     String str = s.readUTF ();
     String[] args = null;
     java.util.Properties props = null;
     org.omg.CORBA.Object obj = org.omg.CORBA.ORB.init (args, 
props).string_to_object 
(str);
     org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) 
obj)._get_delegate ();
     _set_delegate (delegate);
  }

  private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException
  {
     String[] args = null;
     java.util.Properties props = null;
     String str = org.omg.CORBA.ORB.init (args, props).object_to_string (this);
     s.writeUTF (str);
  }
} // class _HelloStub

HelloPOA.java, скелет сервера

Класс Java HelloImplPOA является скелетным файлом для отображения серверной стороны, обеспечивая основную функциональность CORBA для сервера. Это расширяет org.omg.PortableServer.Servant, и реализует интерфейс InvokeHandler и интерфейс HelloOperations. Класс сервера, HelloServant, расширяет HelloPOA.

HelloApp/HelloPOA.java
package HelloApp;


/**
* HelloApp/HelloPOA.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from Hello.idl
* Thursday, March 22, 2001 2:17:15 PM PST
*/

public abstract class HelloPOA extends org.omg.PortableServer.Servant
 implements HelloApp.HelloOperations, org.omg.CORBA.portable.InvokeHandler
{

  // Constructors

  private static java.util.Hashtable _methods = new java.util.Hashtable ();
  static
  {
    _methods.put ("sayHello", new java.lang.Integer (0));
    _methods.put ("Shutdown", new java.lang.Integer (1));
  }

  public org.omg.CORBA.portable.OutputStream _invoke (String method,
                                org.omg.CORBA.portable.InputStream in,
                                org.omg.CORBA.portable.ResponseHandler rh)
  {
    org.omg.CORBA.portable.OutputStream out = null;
    java.lang.Integer __method = (java.lang.Integer)_methods.get (method);
    if (__method == null)
      throw new org.omg.CORBA.BAD_OPERATION (0, 
org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);

    switch (__method.intValue ())
    {
       case 0:  // HelloApp/Hello/sayHello
       {
         String __result = null;
         __result = this.sayHello ();
         out = rh.createReply();
         out.write_string (__result);
         break;
       }

       case 1:  // HelloApp/Hello/Shutdown
       {
         this.Shutdown ();
         out = rh.createReply();
         break;
       }

       default:
         throw new org.omg.CORBA.BAD_OPERATION (0, 
org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
    }

    return out;
  } // _invoke

  // Type-specific CORBA::Object operations
  private static String[] __ids = {
    "IDL:HelloApp/Hello:1.0"};

  public String[] _all_interfaces (org.omg.PortableServer.POA poa, byte[] objectId)
  {
    return (String[])__ids.clone ();
  }

  public Hello _this() 
  {
    return HelloHelper.narrow(
    super._this_object());
  }

  public Hello _this(org.omg.CORBA.ORB orb) 
  {
    return HelloHelper.narrow(
    super._this_object(orb));
  }


} // class HelloPOA

Завершение приложения

Чтобы завершить приложение, разработчик должен записать код клиента и сервера.

HelloServer.java, переходный сервер

Сервер в качестве примера состоит из двух классов, слуги и сервера. Слуга, HelloImpl, является реализацией интерфейса IDL Hello; каждый экземпляр Hello реализуется экземпляром HelloImpl. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера.

Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.

Этот пример показывает код для переходного сервера. Для "Привет Мирового" приложения с персистентным сервером см. Привет Мир с Персистентным Сервером.

Следующий код пишется разработчиком.

HelloServer.java
// HelloServer.java
// Copyright and License 
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

class HelloImpl extends HelloPOA {
  private ORB orb;

  public void setORB(ORB orb_val) {
    orb = orb_val; 
  }
    
  // implement sayHello() method
  public String sayHello() {
    return "\nHello world !!\n";
  }
    
  // implement shutdown() method
  public void shutdown() {
    orb.shutdown(false);
  }
}


public class HelloServer {

  public static void main(String args[]) {
    try{
      // create and initialize the ORB
      ORB orb = ORB.init(args, null);

      // get reference to rootpoa & activate the POAManager
      POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
      rootpoa.the_POAManager().activate();

      // create servant and register it with the ORB
      HelloImpl helloImpl = new HelloImpl();
      helloImpl.setORB(orb); 

      // get object reference from the servant
      org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
      Hello href = HelloHelper.narrow(ref);
          
      // get the root naming context
      // NameService invokes the name service
      org.omg.CORBA.Object objRef =
          orb.resolve_initial_references("NameService");
      // Use NamingContextExt which is part of the Interoperable
      // Naming Service (INS) specification.
      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

      // bind the Object Reference in Naming
      String name = "Hello";
      NameComponent path[] = ncRef.to_name( name );
      ncRef.rebind(path, href);

      System.out.println("HelloServer ready and waiting ...");

      // wait for invocations from clients
      orb.run();
    } 
        
      catch (Exception e) {
        System.err.println("ERROR: " + e);
        e.printStackTrace(System.out);
      }
          
      System.out.println("HelloServer Exiting ...");
        
  }
}

HelloClient.java, клиентское приложение

Этот пример показывает клиентское приложение Java. Вы могли записать клиенту CORBA как сервлет, JSP, апплет, и т.д.

HelloClient.java
// Copyright and License 
 
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class HelloClient
{
  static Hello helloImpl;

  public static void main(String args[])
    {
      try{
        // create and initialize the ORB
        ORB orb = ORB.init(args, null);

        // get the root naming context
        org.omg.CORBA.Object objRef = 
            orb.resolve_initial_references("NameService");
        // Use NamingContextExt instead of NamingContext. This is 
        // part of the Interoperable naming Service.  
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
 
        // resolve the Object Reference in Naming
        String name = "Hello";
        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

        System.out.println("Obtained a handle on server object: " + helloImpl);
        System.out.println(helloImpl.sayHello());
        helloImpl.shutdown();

        } catch (Exception e) {
          System.out.println("ERROR : " + e) ;
          e.printStackTrace(System.out);
          }
    }

}

Компиляция и Выполнение Java приложение CORBA

Для деталей компиляции и выполнения Java приложение CORBA, обратитесь к Созданию и Запущению Привет Мирового Приложения.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами