Опубликован: 10.10.2010 | Уровень: специалист | Доступ: платный
Лекция 8:

CORBA. Второй пример

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Теперь перейдем к рассмотрению интерфейса Card.В файле Card.java (пример 8.8) определен интерфейс Card, наследующий от созданного idlj интерфейса CardOperations (пример 8.9) и двух интерфейсов - они являются определенными в CORBA типами, от которых должны наследовать все CORBA -совместимые объекты, - org.omg.CORBA.Object и org.omg.CORBA.portable.IDLEntity.

1  package com.asw.corba.ex2.BillingServiceModule;
2 
3
4 /**
5 * com/asw/corba/ex2/BillingServiceModule/Card.java .
6 * Generated by the IDL-to-Java compiler (portable), version "3.1"
7 * from com/asw/corba/ex2/BillingService.idl
8 * 16 Июль 2006 г. 15:01:11 MSD
9 */
10
11  public interface Card extends CardOperations,
12  org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
13  {
14  } // interface Card
Листинг 8.8. Интерфейс Card, созданный idlj

CardOperations, ни от кого не наследуя, объявляет три метода, изначально определенные в IDL.

1  package com.asw.corba.ex2.BillingServiceModule;
2 
3
4 /**
5 * com/asw/corba/ex2/BillingServiceModule/CardOperations.java . 
6 * Generated by the IDL-to-Java compiler (portable), version "3.1" 
7 * from com/asw/corba/ex2/BillingService.idl
8 * 16 Июль 2006 г. 15:01:11 MSD
9 */
10
11  // определение CORBA-совместимого сервиса
12  public interface CardOperations
13  {
14  void addMoney (double money);
15  void subMoney (double money);
16  double getBalance ();
17  } // interface CardOperations
Листинг 8.9. Интерфейс CardOperations, созданный idlj

Файлы CardHelper.java (пример 8.10) и CardHolder.java (пример 8.11) содержат вспомогательные классы.

1  package com.asw.corba.ex2.BillingServiceModule;
2
3
4 /**
5 *  com/asw/corba/ex2/BillingServiceModule/CardHelper.java .
6 *  Generated by the IDL-to-Java compiler (portable), version "3.1"
7 *  from com/asw/corba/ex2/BillingService.idl
8 *  16 Июля 2006 г. 15:01:11 MSD
9 */
10
11  // определение класса CardHelper
12  abstract public class CardHelper
13  {
14  private static String _id = "IDL:BillingServiceModule/Card:1.0";
15
16  public static void insert (org.omg.CORBA.Any a, 
  com.asw.corba.ex2.BillingServiceModule.Card that)
17  {
18  org.omg.CORBA.portable.OutputStream out = a.create_output_stream();
19  a.type (type ());
20  write (out, that);
21  a.read_value (out.create_input_stream (), type ());
22  }
23
24  public static com.asw.corba.ex2.BillingServiceModule.Card extract 
  (org.omg.CORBA.Any a)
25  {
26  return read (a.create_input_stream ());
27  }
28
29  private static org.omg.CORBA.TypeCode __typeCode = null;
30  synchronized public static org.omg.CORBA.TypeCode type ()
31  {
32  if (__typeCode == null)
33  {
34  __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc
  (com.asw.corba.ex2.BillingServiceModule.CardHelper.id (), 
   "Card");
35  }
36  return  __typeCode;
37  }
38
39  public static String id ()
40  {
41  return _id;
42  }
43
44  public static com.asw.corba.ex2.BillingServiceModule.Card read 
    (org.omg.CORBA.portable.InputStream istream)
45  {
46  return narrow (istream.read_Object (_CardStub.class));
47  }
48
49  public static void write (org.omg.CORBA.portable.OutputStream ostream, 
    com.asw.corba.ex2.BillingServiceModule.Card value)
50  {
51  ostream.write_Object ((org.omg.CORBA.Object) value);
52  }
53
54  public static com.asw.corba.ex2.BillingServiceModule.Card 
    narrow (org.omg.CORBA.Object obj)
55  {
56  if (obj == null)
57  return null;
58  else if (obj instanceof com.asw.corba.ex2.BillingServiceModule.Card)
59  return (com.asw.corba.ex2.BillingServiceModule.Card)obj;
60  else if (!obj._is_a (id ()))
61  throw new org.omg.CORBA.BAD_PARAM ();
62  else
63  {
64  org.omg.CORBA.portable.Delegate delegate = 
    ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
65  com.asw.corba.ex2.BillingServiceModule._CardStub stub = 
    new com.asw.corba.ex2.BillingServiceModule._CardStub ();
66  stub._set_delegate(delegate);
67  return stub;
68  }
69  }
70  }
Листинг 8.10. Класс CardHelper, созданный idlj
1  package com.asw.corba.ex2.BillingServiceModule;
2 
3 /**
4 *  com/asw/corba/ex2/BillingServiceModule/CardHolder.java .
5 * Generated by the IDL-to-Java compiler (portable), version "3.1"
6 *  from com/asw/corba/ex2/BillingService.idl
7 *  16 Июль 2006 г. 15:01:11 MSD
8 */
9
10  // определение класса CardHolder
11  public final class CardHolder implements org.omg.CORBA. 
  portable.Streamable
12  {
13  public com.asw.corba.ex2.BillingServiceModule.Card value = null;
14
15  public CardHolder ()
16  {
17  }
18
19  public CardHolder (com.asw.corba.ex2.BillingServiceModule.Card 
  initialValue)
20  {
21  value = initialValue;
22  }
23
24  public void _read (org.omg.CORBA.portable.InputStream i)
25  {
26  value = com.asw.corba.ex2.BillingServiceModule.CardHelper.read (i);
27  }
28
29  public void _write (org.omg.CORBA.portable.OutputStream o)
30  {
31  com.asw.corba.ex2.BillingServiceModule.CardHelper.write (o, value);
32  } 
33
34  public org.omg.CORBA.TypeCode _type ()
35  {
36  return com.asw.corba.ex2.BillingServiceModule.CardHelper.type ();
37  }
38  }
Листинг 8.11. Класс CardHolder, созданный idlj

Файл _CardStub.java (пример 8.12) содержит клиентскую заглушку. Класс CardStub наследует от org.omg.CORBA.portable.ObjectImpl и реализует интерфейс Card.При вызове клиентом методов этого класса происходит упаковка вызова (и параметров) и их передача по сети серверному классу.

1  package com.asw.corba.ex2.BillingServiceModule;
2
3 /**
4 * com/asw/corba/ex2/BillingServiceModule/_CardStub.java .
5 * Generated by the IDL-to-Java compiler (portable), version "3.1"
6 * from com/asw/corba/ex2/BillingService.idl
7 * 16 Июль 2006 г. 15:01:11 MSD
8 */
9
10    // определение класса _CardStub
11  public class _CardStub extends org.omg.CORBA.portable.ObjectImpl 
  implements com.asw.corba.ex2.BillingServiceModule.Card
12  {
13  public void addMoney (double money)
14  {
15  org.omg.CORBA.portable.InputStream $in = null;
16  try {
17  org.omg.CORBA.portable.OutputStream $out = 
    _request ("addMoney", true);
18  $out.write_double (money);
19  $in = _invoke ($out);
20  return;
21  } catch (org.omg.CORBA.portable.ApplicationException $ex) {
22  $in = $ex.getInputStream ();
23  String _id = $ex.getId ();
24  throw new org.omg.CORBA.MARSHAL (_id);
25  } catch (org.omg.CORBA.portable.RemarshalException $rm) {
26  addMoney (money  );
27  } finally {
28  _releaseReply ($in);
29  }
30  } // addMoney
31
32  public void subMoney (double money)
33  {
34  org.omg.CORBA.portable.InputStream $in = null;
35  try {
36  org.omg.CORBA.portable.OutputStream $out = 
    _request ("subMoney", true);
37  $out.write_double (money);
38  $in = _invoke ($out);
39  return;
40  } catch (org.omg.CORBA.portable.ApplicationException $ex) {
41  $in = $ex.getInputStream ();
42  String _id = $ex.getId ();
43  throw new org.omg.CORBA.MARSHAL (_id);
44  } catch (org.omg.CORBA.portable.RemarshalException $rm) {
45  subMoney (money  );
46  } finally {
47  _releaseReply ($in);
48  }
49  } // subMoney
50
51  public double getBalance ()
52  {
53  org.omg.CORBA.portable.InputStream $in = null;
54  try {
55  org.omg.CORBA.portable.OutputStream $out = 
  _request ("getBalance", true);
56  $in = _invoke ($out);
57  double $result = $in.read_double ();
58  return $result;
59  } catch (org.omg.CORBA.portable.ApplicationException $ex) {
60  $in = $ex.getInputStream ();
61  String _id = $ex.getId ();
62  throw new org.omg.CORBA.MARSHAL (_id);
63  } catch (org.omg.CORBA.portable.RemarshalException $rm) {
64  return getBalance (  );
65  } finally {
66  _releaseReply ($in);
67  }
68  } // getBalance
69
70  // Type-specific CORBA::Object operations
71  private static String[] __ids =
  {"IDL:BillingServiceModule/Card:1.0"};
72
73  public String[] __ids ()
74  {
75  return (String[]) __ids.clone ();
76  }
77
78  private void readObject (java.io.ObjectInputStream s) 
    throws java.io.IOException
79  {
80  String str = s.readUTF ();
81  String[] args = null;
82  java.util.Properties props = null;
83  org.omg.CORBA.Object obj = 
    org.omg.CORBA.ORB.init (args, props).string_to_object (str);
84  org.omg.CORBA.portable.Delegate delegate = 
    ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate ();
85  _set_delegate (delegate);
86  }
87
88  private void writeObject (java.io.ObjectOutputStream s) 
  throws java.io.IOException
89  {
90  String[] args = null;
91  java.util.Properties props = null;
92  String str = org.omg.CORBA.ORB.init (args, props).object_to_string
  (this);
93  s.writeUTF (str);
94  }
95  } // class _CardStub
Листинг 8.12. Класс CardStub, созданный idlj

И, наконец, файл CardPOA.java (пример 8.13) содержит класс, выполняющий всю рутинную работу по диспетчеризации сообщений клиента, - этот класс будет являться предком для нашего серверного класса, в котором мы переопределим нужные методы. Класс CardPOA наследует от org.omg.PortableServer.Servant и реализует CORBA -интерфейс InvokeHandler и интерфейс CardOperations.

1  package com.asw.corba.ex2.BillingServiceModule;
2
3 /**
4 * com/asw/corba/ex2/BillingServiceModule/CardPOA.java .
5 * Generated by the IDL-to-Java compiler (portable), version "3.1"
6 * from com/asw/corba/ex2/BillingService.idl
7 * 16 Июль 2006 г. 15:01:11 MSD
8 */ 
9
10  // определение класса CardPOA
11  public abstract class CardPOA extends org.omg.PortableServer.Servant
12  implements com.asw.corba.ex2.BillingServiceModule.CardOperations, 
    org.omg.CORBA.portable.InvokeHandler
13  {
14  // Constructors
15  private static java.util.Hashtable _methods = 
    new java.util.Hashtable ();
16  static
17  {
18  _methods.put ("addMoney", new java.lang.Integer (0));
19  _methods.put ("subMoney", new java.lang.Integer (1));
20  _methods.put ("getBalance", new java.lang.Integer (2));
21  }
22
23  public org.omg.CORBA.portable.OutputStream _invoke (String $method,
24  org.omg.CORBA.portable.InputStream in,
25  org.omg.CORBA.portable.ResponseHandler $rh)
26  {
27  org.omg.CORBA.portable.OutputStream out = null;
28  java.lang.Integer __method = (java.lang.Integer)_methods.get 
  ($method);
29  if (__method == null)
30  throw new org.omg.CORBA.BAD_OPERATION 
    (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
31
32  switch __method.intValue ())
33  {
34  case 0:   // BillingServiceModule/Card/addMoney
35  {
36  double money = in.read_double ();
37  this.addMoney (money);
38  out = $rh.createReply();
39  break;
40  }
41
42  case 1:   // BillingServiceModule/Card/subMoney
43  {
44  double money = in.read_double ();
45  this.subMoney (money);
46  out = $rh.createReply();
47  break;
48  }
49
50  case 2:   // BillingServiceModule/Card/getBalance
51  {
52  double $result = (double)0;
53  $result = this.getBalance ();
54  out = $rh.createReply();
55  out.write_double ($result);
56  break;
57  }
58
59  default:
60  throw new org.omg.CORBA.BAD_OPERATION 
    (0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
61  }
62  return out;
63  } // _invoke
64
65  // Type-specific CORBA::Object operations
66  private static String[] __ids = 
    {"IDL:BillingServiceModule/Card:1.0"};
67
68  public String[] _all_interfaces 
    (org.omg.PortableServer.POA poa, byte[] objectId)
69  {
70  return (String[])__ids.clone ();
71  }
72
73  public Card _this()
74  {
75  return CardHelper.narrow(super._this_object());
76  }
77
78  public Card _this(org.omg.CORBA.ORB orb)
79  {
80  return CardHelper.narrow(super._this_object(orb));
81  }
82
83  } // class CardPOA
Листинг 8.13. Класс CardPOA, созданный idlj
< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Алмаз Мурзабеков
Алмаз Мурзабеков
Прохожу курс "Построение распределенных систем на Java" в третьей лекции где описывается TCPServer вылетает эта ошибка
"Connection cannot be resolved to a type"


Java version 1.7.0_05
Александр Хвостов
Александр Хвостов
Россия
Максим Лютов
Максим Лютов
Россия, СПб, Политех, 2012