Spec-Zone .ru
спецификации, руководства, описания, API
|
Эти шоу документа код, сгенерированный компилятором IDL к Java в соответствии с IDL к Спецификации Отображения Языка Java (для деталей соответствия ссылаются на документ соответствия), так же как демонстрационные приложения клиента и сервера.
Для подробного описания кода, перечисленного здесь, консультируйтесь с вводным учебным руководством, Начинающим с IDL Java.
Следующий файл, Hello.idl, пишется в Языке определения интерфейсов OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чей метод shutdown() завершает работу ШАРА. IDL OMG является просто декларативным языком, разработанным для того, чтобы определить независимые от языка программированием операционные интерфейсы для распределенных приложений. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.
Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, считайте Главу 3
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 расширяет org.omg.portable.IDLEntity, org.omg.CORBA.Object, и интерфейс операций, HelloOperations. Интерфейс подписи используется, поскольку подпись вводит объявления метода, когда интерфейсы указанного типа используются в других интерфейсах. С точки зрения клиента, ссылки на объект для CORBA Hello
возразите реализует этот интерфейс.
Отметьте: Тупик реализует Hello
интерфейс, где это генерирует код для каждого метода в Маршалл параметры, вызывает метод, и затем неМаршалл параметры.
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
Интерфейс операций Java, HelloOperations.java
, используется в отображении серверной стороны и как механизм для того, чтобы обеспечить оптимизированные призывы к cо-расположенным клиентам и серверу. Разработчик сервера обеспечивает реализацию для методов, обозначенных интерфейсом операций.
Этот интерфейс содержит методы sayHello() и shutdown(). Отображение IDL к Java помещает все операции, определенные в интерфейсе IDL в этот файл, который совместно используется и тупиками и скелетами.
Отметьте: писатель сервера обычно расширяется HelloPOA
и обеспечивает реализацию для методов, обеспеченных интерфейсом операций.
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
Класс Java HelloHelper
обеспечивает вспомогательную функциональность, особенно метод narrow(), требуемый бросать ссылки на объект CORBA на их надлежащие типы. Класс Помощника ответственен за чтение и запись типа данных к потокам CORBA, и вставки и извлечения типа данных от Any s. Класс Держателя делегирует к методам в классе Помощника для чтения и записи.
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; } } }
Класс 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.javapackage 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 (); } }
Класс Java _HelloStub является тупиковым файлом для отображения клиентской стороны. Это расширяет org.omg.CORBA.portable.ObjectImpl и реализует интерфейс Hello.java.
HelloApp / _ HelloStub.javapackage 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
Класс Java HelloImplPOA является скелетным файлом для отображения серверной стороны, обеспечивая основную функциональность CORBA для сервера. Это расширяет org.omg.PortableServer.Servant, и реализует интерфейс InvokeHandler и интерфейс HelloOperations. Класс сервера, HelloServant, расширяет HelloPOA.
HelloApp/HelloPOA.javapackage 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
Чтобы завершить приложение, разработчик должен записать код клиента и сервера.
Сервер в качестве примера состоит из двух классов, слуги и сервера. Слуга, 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 ..."); } }
Этот пример показывает клиентское приложение 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, обратитесь к Созданию и Запущению Привет Мирового Приложения.