샘플 코드 - xrath.com 에서 번역됨

<

# Hello.idl 의 샘플 코드

이 문서에서는, 「IDL to Java Language Mapping Specification」에 따라 IDL-to-Java 컴파일러로 생성한 코드 (스펙의 상세한 것에 대하여는 「준거에 관한 문서」를 참조), 및 샘플의 클라이언트 어플리케이션과 서버 어플리케이션에 대해 설명합니다.

여기에 기재한 코드의 상세한 설명에 대해서는, 입문 튜토리얼「Java IDL 입문」을 참조해 주세요.

## 인터페이스 정의의 Hello.idl

다음의 파일 (`Hello.idl`)은 OMG 인터페이스 정의 언어 (IDL)로 기술된 것으로, CORBA 객체의 `sayHello()` 오퍼레이션이 캐릭터 라인 (string)을 반환 `shutdown()` 메소드가 ORB 를 지 그런데 있습니다. OMG IDL 는, 분산형 어플리케이션으로 프로그램 언어에 의존하지 않는 오퍼레이션 인터페이스를 지정하기 위해서 설계된, 순수한 선언형의 언어입니다. IDL 는 다양한 프로그램 언어에 매핑 할 수 있습니다. IDL 를 Java 에 매핑 하는 방법은「IDL 와 Java 언어의 매핑의 개요」 로 설명하고 있습니다.

OMG IDL 의 구문과 시멘틱스의 자세한 것은, OMG 의 Web 사이트에서 CORBA Specification 의 제 3 장을 참조해 주세요.

Hello.idl

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

## 생성되는 파일

`idlj` 컴파일러는, IDL-to-Java 매핑을 사용해 IDL 인터페이스 정의를 대응하는 Java 인터페이스, 클래스, 및 메소드로 변환합니다. 다음에, 그것을 사용해 클라이언트와 서버 코드를 구현할 수 있습니다. 다음의 파일은, 다음의 커멘드를 사용해 IDL-to-Java 컴파일러로 `Hello.idl` 를 컴파일 하면(자) 생성됩니다.

       idlj -fall Hello.idl

### 시그니챠인타페스의 Hello.java

시그니챠인타페스파일 `Hello.java` 는,`org.omg.portable.IDLEntity`,`org.omg.CORBA.Object`, 및 오퍼레이션 인터페이스 `HelloOperations` 를 상속한 것입니다. 시그니챠인타페스는, 지정한 형태의 인터페이스를 다른 인터페이스로 사용하는 경우에 메소드 선언의 시그니챠형으로서 사용합니다. 클라이언트의 관점으로부터 말하면(자), CORBA `Hello` 객체의 객체 참조는, 이 인터페이스를 구현합니다.

주:Stub는 `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` 는 서버측의 매핑으로 사용되어 같은 장소에 있는 클라이언트와 서버에 최적화된 호출을 제공하는 기구로서 사용됩니다. 서버의 개발자는, 오퍼레이션 인터페이스로 지시받은 메소드에 대해서 구현을 제공합니다.

이 인터페이스에는 `sayHello()` 메소드 및 `shutdown()` 메소드가 포함됩니다. IDL-to-Java 매핑은, IDL 인터페이스로 정의된 오퍼레이션을 모두 이 파일에 짜넣어, Stub와 스켈리턴으로 공유합니다.

주:서버의 개발자는, 일반적으로,`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

### Helper 클래스의 HelloHelper.java

Java 클래스 `HelloHelper` 는 보조적인 기능을 제공합니다. 특히, CORBA 객체 참조를 적절한 형태에 캐스트하기 위한 `narrow()` 메소드는 중요한 역할을 완수합니다. 헬퍼 클래스는, CORBA 스트림에의 데이터형의 읽고 쓰기, 및 `Any` 로부터의 데이터형의 삽입 및 추출을 담당합니다. Holder 클래스는 Helper 클래스의 메소드에 입출력을 위양 합니다.

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;
        }
      }

    }

### Holder 클래스의 HelloHolder.java

Java 클래스 `HelloHolder` 에는,`Hello` 형의 퍼블릭 인스턴스 멤버가 들어옵니다. IDL 형의 파라미터가 `out` 또는 `inout` 이면 Holder 클래스가 사용됩니다. 여기에서는,`org.omg.CORBA.portable.OutputStream` 및 `org.omg.CORBA.portable.InputStream` 인수에 대한 오퍼레이션이 규정됩니다. 이러한 인수는 CORBA 에는 존재합니다만, Java 의 시멘틱스에는 간단하게 매핑 할 수 없습니다. Holder 클래스는 Helper 클래스의 메소드에 입출력을 위양 합니다. Holder 클래스는 `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 ();
      }

    }

### 클라이언트 Stub의 _HelloStub.java

Java 클래스 `_HelloStub` 는, 클라이언트측 매핑의 Stub 파일입니다. 이것은 `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

여기서 소개하는 서버는, 서번트와 서버의 2 개의 클래스로 구성됩니다. 서번트인 `HelloImpl` 는,`Hello` IDL 인터페이스의 구현입니다. 즉,`Hello` 의 각 인스턴스는,`HelloImpl` 의 인스턴스에 의해 구현됩니다. 서번트는,`idlj` 컴파일러에 의해 예의 IDL 로부터 생성되는 `HelloPOA` 의 서브 클래스입니다.

서번트에게는, IDL 오퍼레이션 마다 1 개의 메소드가 포함됩니다. 이 예에서는,`sayHello()` 및 `shutdown()` 메소드입니다. 서번트 메소드는, Java 의 일반적으로의 메소드와 변화는 없습니다. ORB 의 처리, 인수나 결과의 정렬화등을 실시하는 코드는, 스켈리턴으로 구현합니다.

다음의 예에서는, 일시 서버의 코드를 나타냅니다. 지속 서버를 사용한 「Hello World」어플리케이션에 대해서는,지속 서버를 사용한 Hello World 의 예를 참조해 주세요.

다음의 코드는, 개발자에 의해 기술됩니다.

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 어플리케이션의 컴파일과 실행의 상세한 것에 대하여는,「Hello World 의 구축 방법과 실행 방법」을 참조해 주세요.

Copyright © 2001-2004 Sun Microsystems, Inc. All Rights Reserved. | Java Software