CORBA WwwJavaDiliCom

You might also like

Download as pdf
Download as pdf
You are on page 1of 30

o m

Hacettepe Üniversitesi Bilgisayar


Mühendisliği Bölümü

i.c
dil
CORBA
(Common Object Request Broker Architecture)
ja va
w.
ww

2006, Ankara
Hacettepe Üniversitesi Bilgisayar Mühendisliği

HAZIRLAYANLAR

m
Ekip İsim - Soyisim E-Posta Tarih
2. Ekip Doğukan DOĞAN dogukan_dogan@hotmail.com 01.12.2006
Yusuf KARTAL ykartal@gmail.com
1. Ekip Emre ÇAĞLAR 20.11.2005

o
i.c
dil
ja va
w.
ww

İçindekiler

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 1
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

İçindekiler......................................................................................................................................... 1

m
1- OMG......................................................................................................................................... 2
2- CORBA Mimarisi .................................................................................................................... 3
2.1 IDL ..................................................................................................................................... 4
2.2 OMA................................................................................................................................... 4
3- ORB .......................................................................................................................................... 5

o
4- Dağıtık nesnelerde standart olarak CORBA ............................................................................ 6
4.1 IIOP .................................................................................................................................... 6
4.2 Java RMI ............................................................................................................................ 7

i.c
5- CORBA Servisleri .................................................................................................................... 8
6- CORBA Ürünleri...................................................................................................................... 9
7- CORBA ile Örnekler ................................................................................................................ 9
7.1 Gereksinimler ve Kurulumlar............................................................................................. 9
7.2 Hello World Uygulaması ................................................................................................. 11
7.3 Banka Uygulaması ........................................................................................................... 21

dil
8- Kaynaklar ............................................................................................................................... 29
va
ja
w.
ww

1- OMG
OMG (Object Management Group) çeşitli bilgi sistemleri üreticileri, yazılım geliştiricileri ve kullanıcılarının
oluşturduğu, kar amacı gütmeyen uluslararası bir kuruluştur. OMG 1989 yılında kurulmuştur ve su anda

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 2
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

600’ü askın üyesi vardır. OMG, dağıtık, ölçeklenebilir, yeniden kullanılabilir, taşınabilir özelliklerde, yaygın
çapta açık bir uygulama çatısı sunar.

m
2- CORBA Mimarisi
CORBA (Common Object Request Broker Architecture), OMG’nin (Object Management Group) internet

o
üzerinden birlikte çalışan uygulamalar için tasarladığı alt yapıdır. CORBA Nesne Yönetim Grubu'nun
(OMG) Nesne Yönetim Mimarisi'nin (OMA) ana bileşenlerinden birisidir. Nesne Yönetim Mimarisi Nesne
Modeli ve Referans Modelinden oluşur. Nesne Modeli heterojen bir ortamda dağılmış nesnelerin nasıl
tanımlanabileceğini belirler. Referans Modeli ise nesneler arası etkileşimleri tanımlar. Dolayısıyla Nesne

i.c
Yönetim Mimarisi heterojen ortamlara dağılmış beraber isleyebilen dağıtık nesnelerin geliştirilmesine ve
konuşlandırılmasına yardımcı olur. Herhangi bir satıcının, herhangi bir işletim sistemi üzerinde çalışan,
herhangi bir dille yazılmış CORBA tabanlı bir uygulaması, IIOP protokolü üzerinden; başka herhangi bir
satıcının, herhangi bir işletim sistemi üzerinde çalışan, herhangi bir dille yazılmış bir başka CORBA tabanlı
uygulaması ile iş birliği içinde çalışabilir.

Dağıtık işlemler, bilgisayar alanında pek çok çözümde iyi bir yol sağlamaktadır. Paralel ve hızlı bir şekilde
işlem yapmaları; hataya karşı daha dirençli olmaları gibi sebepler de dağıtık işleyen yapılara yönelmeye

dil
sebep olmuştur. Dağıtık işlemi sağlamak için kimi çözümler çıkmıştır. Bunlara soketler ve dağıtık işlem
yapmak için tasarlanmış dilleri örnek verebileceğimiz gibi, daha üst seviyede CORBA ve RPC gibi yapıları
da örnek verebiliriz. CORBA, RPC ile pek çok benzerliğe sahiptir. Yalnız RPC daha çok yapısal dillere
yönelik iken; CORBA temel olarak nesneye yönelik dillere göre tasarlanmıştır.

Dağıtık nesnelerin iki yönü vardır. Bunlar sunucu ve istemci yönüdür. En basit haliyle bu ilişki söyle
gerçekleşir: Sunucu uzak bir ara yüz (remote interface) sağlar ve istemci de sağlanan uzak ara yüzü
çağırır. Bu ilişki RMI ve CORBA gibi birçok dağıtık nesne standartlarında benimsenen bir yaklaşımdır. Bu
va
bağlamda, sunucu ve istemci terimlerinden kastedilen uygulama düzeyindeki etkileşimlerden ziyade
nesne düzeyindeki etkileşimlerdir. Yani bir uygulama, herhangi bir nesne için sunucu olabilirken başka bir
nesnenin istemcisi olabilir.

Aşağıda bu tanımı özetleyen, dağıtık nesnelerin, bir CORBA istemci ve sunucusu üzerinden bir metodu
nasıl paylaştıklarını gösteren klasik bir “Hello World” uygulaması görünmektedir.
ja
w.
ww

İstemci tarafında, uygulama uzak nesnenin bir referansını içerir. Bu nesne referansı, uzaktan çağrılan
nesne metodunun bir vekil metoduna sahiptir.

Sunucu tarafından ise, ORB (Object Request Broker), uzaktan çağrıyı, yerel nesne üzerinde bir metot
çağrısıymış gibi yapmak için bir kod gövdesi (çatı) kullanır. Bu gövde, mevcut çağrıyı ve uygulamaya özel

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 3
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

formattaki parametreleri çevirir ve metodu çağırır. Yordam dönüşünde, gövde, sonuçları ve hataları
çevirerek çağrının geldiği istemciye tekrar, ORB’ yi kullanarak gönderir.

m
ORB’ler arasında iletişim, paylaşılan ortak bir protokol üzerinden (IIOP-Internet Inter ORB Protocol)
üzerinden sağlanır. IIOP, standart TCP/IP internet protokolü temel alınarak oluşturulmuş, ORB’ler
arasında bilgi aktarımını sağlamak için oluşturulmuş bir protokoldür. Tıpkı CORBA ve IDL gibi IIOP de
OMG tarafından tanımlanmış bir standarttır.

o
2.1 IDL

CORBA dil bağımsızlığını sağlar. Bir dilde yazılan CORBA nesnesi, başka bir dilde yazılan CORBA

i.c
nesnesine istem gönderebilir. Nesneye yönelik bir dilde yazılan CORBA nesnesi(örneğin Java veya
Smalltalk), C veya COBOL’da yazılan bir nesneyle konuşabilir, tersi de doğrudur.

CORBA'nın temelinde nesneye yönelimli dillerin uzaktan yordam çağırısı yapmasını sağlayan yapı
yatmaktadır. Bu çağrıyı yapabilmesi için hem sunucu tarafın hem de istemci tarafın ortak bir arayüzde
anlaşması lazımdır. Bu arayüzü dillerden ve platformlardan bağımsız bir şekilde tanımlayabilmek için,
CORBA bir tanımlama dili kullanmaktadır. Bu dile Interface Definition Language (IDL) denmektedir. Bu dil

dil
sayesinde nesnenin arayüzü tanımlanır. IDL derleyicileri, bu tanımı, istemci tarafında "stub" oluşturmak
için, sunucu tarafta "skeleton" oluşturmak için kullanırlar. Üretilen bu kodları kullanarak, yapılan yordam
çağırıları, sanki yereldeki bir nesneden çağrı yapılıyor gibi kullanılabilir.

İşte bu yüzden, IDL, CORBA için anahtar özelliklerden birisidir. CORBA’yı destekleyen her dil, kendi IDL
eşleştirmesine sahiptir. Bu eşleştirmeler, OMG IDL’de tanımlanan CORBA türleri ile Java dilinin türleri
arasında gerçekleşir. Hazırlanan idl dosyaları, bu eşleştirmeler temel alınarak, Java'da “idlj” (idltojava)
derleyicisi ile Java kodlarına çevrilir. Ardından da elde edilen Java arayüzlerini gerçekleştiren kodlar ile
va
arayüzleri çağıracak olan kodlar yazılır. Bu sayede sunucu tarafında gövde kısmı bulunan kodlar, istemci
tarafındaki iskeletleri aracılığıyla işletilir.

Her CORBA satıcısı IDL tanımlarını özel bir dile çeviren derleyici sağlarlar. Oracle8i JServer, idl2java
derleyicisi kullanırlar. Idl2java derleyicisi, IDL ara yüzler tanımlarını Java sınıflarına çevirir.
ja

2.2 OMA

IDL gerçekte bir alfabe vazifesi görmektedir. Bu sayede ortak bir dil oluşturarak CORBA karşılıklı işlerliğini
kurmak ve parça yazılımların modüler olarak kullanılmasını sağlar. OMG’nin OMA’sı IDL alfabesinden
w.

türetilen ortak dili ifade eder. OMA karşılıklı işlerliği sistem seviyesinden uygulama seviyesine indirgeyen
bir ortam sağlar.

OMA’nın amacı uygulamaların getirdiği servisleri olası kullanıcılara standart bir arayüzle sağlamaktadır.
CORBA Servisleri herhangi bir nesnenin ihtiyaç duyabileceği tüm temel servisleri belirler. Bu servisler çok
daha evvelden gerçekleştirilmiş olup CORBA Üst Servisleri uygulamalar için orta seviyede servisler
sağlamaktadır ve daha yeni yeni tanımlanmıştır. En üst seviyedeki uygulama nesneleri OMG tarafından
değil yazılım geliştirici firmalarca gerçekleştirilmektedir. OMG OMA’nın her parçası için ayrı bir formal
ww

tanımlama sağlamaktadır. Bu tanımlama

• Nesne işlemcilerinin nasıl çağrılacağını (OMG IDL’de hazırlanmış sözdizimi dokümanı) ve


• Her işlemin ne yaptığını içerir (İngilizce olarak hazırlanmış olan anlambilim dokumanı)

OMA uyumlu sistem geliştiricileri gerekli servisleri gerçekleştirerek kullanıma sunarlar. Ancak firmaların
her servisi gerçekleştirme zorunluluğu yoktur, sadece OMG tanımlamalarına uyma zorunlulukları vardır.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 4
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

3- ORB

m
ORB (Object Request Broker) nesneler arasında veri değişimi ve iletişimini sağlayan bir orta katman
teknolojisidir. ORB dağıtık nesnelerin veri değişim ve bunları kullanabilme kapasitelerinin arttırıldığı bir
teknolojidir çünkü kullanıcıların birlikte olan nesneleri bölüp ORB’ler üzerinden haberleşebilecek şekilde
sistem geliştirmelerine olanak verirler. ORB‘nin gerçekleştirim ayrıntıları, dağıtık sistem geliştirenler
tarafından genellikle önemli değildir. Geliştiricilerin sadece nesne ara yüzleriyle ilgilenmeleri yeterlidir. Bilgi
gizlemenin bu yolu sistemin daha kaliteli olmasına neden olur çünkü nesne iletişim ayrıntıları

o
geliştiricilerden saklanır ve ORB içinde izole edilir.

ORB teknolojisi makine, yazılım ve satıcı kısıtları arasında nesne iletişimini amaç edinerek ilerler. ORB
teknolojisini ilgili fonksiyonları şunlardır;

i.c
• Ara yüz tanımı
• Uzak nesnelerin muhtemel aktivasyonları ve konumlandırmaları
• İstemci ve nesne arasındaki iletişim

ORB bir telefon santrali gibi davranır. Servisin dizinini sağlar ve bu servisler ile istemci arasında bir
bağlantı kurulmasına yardım eder.

dil
ORB, sürekli ve etkili olarak birçok fonksiyonu desteklemek zorundadır. Fakat bu fonksiyonların çoğu ORB
kullanıcılarından gizlenmiş haldedir. Bu yer ilizyonunu sağlamak ORB’nin sorumluluğundadır. Başka bir
deyişle, geliştirici başka bir işlem ya da makine üzerinde sanki yerelde (local) çalışıyormuş gibi işlemlere
devam etme saydamlığına sahiptir. Bu yüzden ORB nesneler arasındaki cross - system iletişimi için bir
çatı sağlar. Bu, nesne sistemlerinin bilgilerini değiştirme ve kullanabilme yolundaki ilk teknik adımdır.

Nesne sistemleri bilgi değiş tokuşuna karsı diğer bir teknik adım da, platformlar arası nesne iletişimidir.
va
ORB, nesnelerin, gerçekleştirim detaylarını, istemcilerden gizlemesine izin verir. Bu, programlama dilini,
işletim sistemini, yerel donanım yapısını ve nesne konumunu kapsayabilir. Bütün bunlar “şeffaflık” olarak
düşünülebilir ve farklı ORB teknolojileri, farklı saydamlıkları destekleyebilir.

ORB kavramını uygulamanın birçok değişik yolu vardır. Örneğin, fonksiyonlar, istemciler için derlenebilir,
işlemlere dağıtılabilir veya bir işletim sisteminin çekirdeğine dâhil olabilir. Bu temel tasarım kararları tek bir
ürün içinde tanımlanabileceği gibi ORB uygulamacısının kararlarına bağlı olarak bir yelpaze içinde de yer
ja

alabilir.

Ana olarak iki ORB teknolojisi vardır:


• OMG’nin (Object Management Group) CORBA (Common Object
Request Broker Architecture) spesifikasyonu
w.

• Microsoft’un COM (Component Object Model) spesifikasyonu

ORB yapısının daha ayrıntılı bir çizimi aşağıda verilmiştir.


ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 5
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

o m
i.c
4- Dağıtık nesnelerde standart olarak CORBA
dil
va
CORBA spesifikasyonundaki temel amaçlardan birisi de, istemci ve nesne gerçekleştirimini taşınabilir
yapmaktır. CORBA spesifikasyonları ayrıca dağıtık nesnelerle ilgilenen istemciler için ve CORBA
nesnelerinin gerçekleştirimleri için bir API tanımlar. Yani herhangi bir şirketin CORBA ürünü için yazılan bir
kod, minimum değişiklikle başka bir şirketin CORBA ürünü için yeniden yazılabilir. Fakat CORBA
ürünlerinde bugünün dünyasına baktığımız zaman CORBA istemcilerinin taşınabilir olduğunu görürüz ama
buna karşın nesne gerçekleştirimlerinin bir CORBA ürününden diğerine taşınırken belli miktarda yeniden
çalışma yapıldığı görülmektedir.
ja

Bu bağlamda CORBA 2.0, IIOP (Internet Inter-ORB Protokol) adında, herhangi bir istemcinin herhangi bir
CORBA ürünü kullanarak, herhangi bir CORBA ürünü kullanan başka bir istemci ile iletişim kurabilmesine
olanak veren bir ağ protokolü tanımlamıştır. IIOP Internet üzerinden çalışan bir protokoldür.
w.

İki sistem arasında bilgi değişilebilirliği ve değişildikten sonra da kullanılabilirliği (interoperability), dağıtık
sistemler için taşınabilirlikten daha önemlidir.

4.1 IIOP

IIOP (Internet Inter-ORB Protocol), farklı programlama, dillerinde yazılmış dağıtık programların Internet
üzerinden haberleşmelerini sağlayabilmek için geliştirilmiş bir protokoldür. IIOP, stratejik bir endüstri
ww

standardı olan CORBA için kritik bir kesimdir. CORBA’nın IIOP protokolünü kullanarak bir şirket kendi
programlarıyla ya da başka bir şirketin programlarıyla, her nerede bulunursa bulunsun, program için
servisi ve adı dışında bir bilgiye gereksinim duymadan iletişim kurabilir.

CORBA ve IIOP sunucu/istemci modelini temel alan yaklaşımı kullanır. Buna göre bir istemci sürekli
istemde bulunurken sunucu program da istemcide istemleri alıp yanıtlamak için bekler. Programcı
programını yazarken GIOP (General Inter-ORB Protocol) adı verilen bir arayüz kullanır. GIOP bir veya
daha çok ağ iletişim katmanında mapping yapmak üzere gerçekleştirilmiştir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 6
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

İstemci tarafında, ağdaki herhangi bir bilgisayardaki bir programa istemde bulunmak için istemci program
için bir adres bilgisine sahip olmalıdır. Bu adres IOR (Interoperable Object Reference)olarak bilinir. IIOP

m
kullanılarak, adres sunucunun port numarası ve ip’sine dönüştürülür. İstemcinin bilgisayarında ise IOR leri
proxy isimlerine eslemek için bir tablo tutulur. Buradaki amaç ise kullanımı kolaylaştırmaktır. GIOP,
programa bir IOR ile bağlantı kurması için izin verir ve istemini gönderir. Daha sonra bir CDR (Common
Data Representation) veri için encode ve decode işlemlerini yaparak verinin standart bir şekilde
değişilmesini sağlar.

o
4.2 Java RMI

Uzak Metot Çağırımı (RMI) ilk olarak JDK 1.1 ile gündeme gelmiş ve ağ programlamayı daha yüksek

i.c
seviyelere taşımıştır. Uzak Metot Çağrımı’nın kullanımının nispeten kolay olmasının yanında fark edilir
güçte teknolojiler arasında gösterilebilir. Uzak Metot Çağrımı, ortalama Java geliştiricilerini dağıtık işlemler
dünyası adı verilen yeni bir değerler dizisi ile tanıştırmaktadır. Uzak Metot Çağrımı, dağıtık sistemlerdeki
klasik Uzak Yordam Çağırma mantığına benzer şekilde, uzaktaki bir bilgisayar üzerinde çalışan “Uzak
nesne ” nin metotlarını çağırabilmek olarak bilinmektedir. Diğer dağıtık programlama (Ara yüz Tanımlama
Dili (IDL), Uzak Yordam Çağırma (RPC), vb) aksine Java Uzak Metot Çağrımı (RMI), Java programlama
diline özgüdür.

dil
Uzak Metot Çağrımı, dağıtılmış bir ortamda yerel çalışıyormuşçasına imkânlar sağlayan, uzaktan
nesnelere ileti göndermeye yarayan temel bir teknoloji olarak görülebilir. Büyük çaplı yazılımlar
başarılarını Uzak Metot Çağırımı’na borçludur. Bu tüy büyük çaptaki yazılımlarda Java RMI teknolojisi
kullanıldığından, istemci ve sunucu da Java programlama dili ile kodlanacağı için dağıtık programlama
tümüyle Java programlama dilinde gerçekleşmektedir. Böylelikle Java programlama dilinin özellikleri
avantajları dağıtık programlamada da kullanılabilmiş olmaktadır. Java RMI ağ işlemleri için kullanıcıya
soket ve streamlere göre daha üst düzeyde bir ara yüz sunmaktadır. Bu nedenle, RMI ile dağıtık
va
programlama yapmak soket ve stream kullanımına göre daha az karmaşıktır. Programcı açısından
bakıldığında, RMI kullanıldığında istemci/sunucu uygulamaların geliştirilmesi sırasında ağ işlem alt
düzeydeki ayrıntıları ile uğraşmak gerekmemektedir.

Çizim 1’de Java Sanal Makinesi–1 üzerinde bulunan bir Java uygulamasının, Java Sanal Makinesi–2
üzerinde bulunan Uzak Nesne isimli bir nesnenin Uzak_Metot() isimli bir metodunu çağrımı görülmektedir.
ja
w.
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 7
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

o m
i.c
dil
va
5- CORBA Servisleri
CORBA Servisleri nesneye yönelik uygulama ve parçalar için temel, sistem seviyesinde hizmetler
sağlamaktadır. Formal olarak sağlanan 15 servis aşağıda listelenmiştir. Bu servisler yeni sürümlerde
ja

artmaktadır.

1. Yaşam döngüsü servisi.


2. Bağıntı servisi.
3. İsimlendirme servisi.
4. Kalıcı nesne servisi.
w.

5. Globalizasyon servisi.
6. Event servisi.
7. Nesne sorgulama servisi.
8. Nesne karakteristikleri servisi.
9. Hareket servisi.
10. Paralel işleme servisi
11. Lisans servisi.
ww

12. Güvenlik servisi.


13. Güvenli zaman servisi.
14. Ticaret servisi.
15. Nesne koleksiyon servisi.

Corba ve OMG IDL uygulamaların birbirlerine bağlandıkları telefon hattı ve alfabe olarak düşünülebilir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 8
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

6- CORBA Ürünleri

m
CORBA bir spesifikasyondur. Ürünlerin gerçekleştirimlerinde bir rehberdir. Birçok satıcı değişik
programlama dilleri için CORBA ürünleri sağlayabilir. Java programlama dilini destekleyen CORBA ürünü
şunları içerir.

ORB Açıklama

o
The Java 2 ORB Java 2 ORB, Sun’ın Java 2
SDK sı ile gelir.

i.c
VisiBroker for Java Inspire Corporation tarafından
popüler bir Java ORB. Netscape
Communicator web tarayıcı içine
gömülen ORB’dir.

OrbixWeb Lona Technologies tarafından


popüler bir Java ORB

WebSphere

Netscape Communicator
dil IBM tarafından ORB içeren popüler
bir uygulama sunucusu

Netscape, VisiBroker‘ın bir


sürümüne sahiptir. Appletler, web
tarayıcıya ORB sınıfları
yüklemeden CORBA nesnesi
üzerinden istem gönderebilir
va
7- CORBA ile Örnekler
ja

7.1 Gereksinimler ve Kurulumlar

Kullanılan bileşenler aşağıdakilerdir:


w.

9 JDK 1.5.0 sürümü kullanılmıştır. www.java.com adresinden indirilebilir.


9 IDE olarak Eclipse 3.2.1 kullanılmıştır. Eclipse’in bu sürümü www.eclipse.org adresinden
indirilebilir.
9 Eclipse kullanılarak yazılımı geliştirmek için bir Eclipse eklentisine (plugin) ihtiyacımız var. Bunun
için ORB Studio 7 kullanılmıştır. www.orbzone.org/?p=125 adresinden indirilebilir.
9 idl’i kullanarak CORBA uyumlu java sınıfları yaratan derleyici olarak JacORB-2.2.4 kullanılmıştır.
www.jacorb.org adresinden indirilebilir.
ww

9 Jacorb’dan yararlanabilmek için Apache Ant 1.6.5 kullanılmıştır. http://ant.apache.org adresinden


indirelebilir.

Gerekli Kurulumlar:
9 Eclipse’in plugin klasörüne ORBStudio_7.7.5.jar eklentisi kopyalanır.
9 Jacorb herhangi bir yere açılır. (extract). Yüklenen dizinde boşluk olmamasına dikkat edilir. Biz
bu örneğimizde C: dizinine açtık. (C:\JacORB-2.2.4)

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 9
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

9 Apache Ant herhangi bir yere açılır. (extract). Yüklenen dizinde boşluk olmamasına dikkat edilir.
Biz bu örneğimizde C: dizinine açtık. (C:\apache-ant-1.6.5)
9 Apache Ant ortam değişkenlerinden path değişkenine eklenir. ( ‘;’ ile ayrılıp Apache Ant’ın yüklü

m
olduğu dizinden bin klasörü gösterilir. )

o
i.c
dil
va
9 Konsoldan Jacorb ‘un bulunduğu dizine gidilir ve burada iki ant komutu çalıştırılır:

o ant jaco
o ant idlcmd
ja

9 Eclipse’de kullanacağımız idl derleyicisini jacorb olarak ayarlamamız gerekmektedir. Bunun için
Eclipse çalıştırılır. Window / Prefences seçeneği tıklandığında çıkan ekranda OrbStudio / IDL
compiler seçeneğindeki derleyici JacORB olarak değiştirilir.
w.
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 10
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

o m
i.c
9
dil
Bir önceki maddede anlatılan Window / Prefences / OrbStudio / IDL Compiler seçeneğine tekrar
gelinir ve alt seçeneklerden JacORB seçilir. Çıkan ekranda IDL command kısmına idl.bat ‘ın
bulunduğu yol yazılır. Command Options kısmında ise idl.jar ve logkit-1.2.jar yolları düzenlenir.

o IDL Command : C:\JacORB-2.2.4\bin\idl.bat


Command Options : -cp "C:/JacORB-2.2.4/lib/idl.jar;C:/JacORB-2.2.4/lib/logkit-
va
o
1.2.jar" org.jacorb.idl.parser -d %D% %F%
ja
w.

9 Uygulamamız çalışmaya hazır hale gelmiştir. Gerekli idl kütüğü artık yazılabilir.
ww

7.2 Hello World Uygulaması

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 11
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Bu örneğimizde Java IDL kullanarak örnek bir CORBA dağıtık uygulamanın nasıl gerçekleştirildiğini
göreceğiz. Adım adım klasik bir “Hello World” uygulaması geliştireceğiz. Hello World programı, basılmak
üzere bir katar döndüren sadece bir eylem gerçekleştirir.

m
Uygulamadaki adımları daha iyi anlamak açısından CORBA yapısını tekrar gözden geçirmekte fayda
vardır.

o
i.c
1- İstemci, Hello Server’ın sayHello metodunu çağırır.

dil
2- ORB, bu çağrıyı IDL ara yüzü için kayıtlı hizmet veren nesneye transfer eder.
3- Hizmeti sunan nesnenin sayHello metodu çalıştırılır. Karşılığında bir Java String tipinde nesne döner.
4- ORB, bu String tipindeki nesneyi tekrar istemciye yönlendirir.
5- İstemci String tipindeki nesnenin değerini yazdırır. Basit tasarımına karsın bu uygulama temel bir
CORBA uygulaması geliştirmek için gereken altyapıyı sağlar.

• IDL ara yüzünü yazmak


va
Bu bölümde Hello World uygulaması için basit bir IDL ara yüzü yazacağız. IDL ara yüzü,
uygulamamızdaki istemci ve sunucu kesimi için etkiletişimi sağlar. OMG IDL programlama dilinden
bağımsız bir kesimdir. Herhangi bir gerçekleştirime yönelik kodlamadan önce IDL’ i Java’ya “map”
etmemiz gerekir.

• “Hello. idl”’i yazmak


ja

Hello World için yazılması gereken IDL oldukça basittir. Bunun için aşağıda belirtilen üç adımları
uygulamak yeterlidir.

Adım 1: CORBA IDL modülünü tanımlamak


w.

a) Eclipse’de yeni bir java projesi açın ve bu projeye bir Simple IDL kütüğü ekleyin (Hello.idl).
b) Kütük içine aşağıdaki modül satırlarını girin.

module HelloApp {
// Sonraki kodları buraya ekleyin.
ww

};

• Arayüzü tanımlamak

Hello.idl kütüğünün içine aşağıdaki ara yüz deyimlerini yazın.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 12
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

module HelloApp {
interface Hello // Bu

m
{ // dört
// satırı
}; // ekleyin.
}

o
IDL’i derlediğiniz zaman, bu deyim Java kodunda bir ara yüz deyimi oluşturacaktır. Sunucu ve istemci
sınıfları Hello ara yüzünü değişik yollardan implement edecektir.

• Metotları tanımlamak

i.c
CORBA işlemleri, sunucuların istemci namına gerçekleştirmeye söz verdiği davranışlardır. IDL türündeki
her işlem deyimi, üretilen Java ara yüzündeki ilgili metot deyimini üretir. Hello.idl kütüğüne aşağıdaki ara
yüz deyimlerini ekleyin.

module HelloApp {

dil
interface Hello
{
string sayHello(); // Bu satırı ekleyin.
};
};

Çünkü bizim küçük Hello World uygulamamız sadece bir tane işlem içerir. Hello.idl şimdi son halini
va
almıştır.

“Hello.idl”’i “IDL”’den “Java”’ya çevirmek

Hello.idl üzerinde sağ tuş yapıp ORB Menu’den Compile seçeneğini tıklayalım, bu IDLimizi derleyecektir.
IDL’i derlediğiniz zaman, yukarıdaki tüm deyimler HelloApp paketi içerisinde Java kodlarına dönüşecektir.
ja
w.
ww

Eğer dizinin içeriğini listelerseniz, HelloApp adlı dizinin yaratıldığını ve içerisinde de 7 tane kütük
bulunduğunu göreceksiniz. Hello.java kütüğünü bir metin editörü ile açarsanız şu satırlarla karsılaşırsınız.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 13
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

package HelloApp;

m
/**
* Generated from IDL interface "Hello"
* @author JacORB IDL compiler V 2.2.3, 10-Dec-2005
*/

public interface Hello

o
extends HelloOperations, org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity
{
}

i.c
• İstemci Uygulamayı Geliştirmek

CORBA istemcisinin temel yapısı birçok Java uygulamasından farklı değildir. Gerekli paketleri ekleyin, bir
uygulama sınıfı tanımlayın, bir main metodu tanımlayın, istisnaları yakalamayı da unutmayın.

dil
*Gerekli Paketlerin Eklenmesi
Projemize “implementation” adında bir paket ekleyin ve bir java kütüğünü HelloClient.java olarak
kaydedin. Daha sonra gerekli paketleri ekleyin:

package implementation;
import HelloApp.*; // stub altyapısını saglamak için.
import org.omg.CosNaming.*; // HelloClient isimlendirme servisini kullanır
va
import org.omg.CORBA.*; // Bütün CORBA uygulamaları buna ihtiyaç duyar

*Main metodunun tanımlanması

Her Java uygulaması main metoduna ihtiyaç duyar. Main metodunu HelloClient.java sınıfının etkinlik alanı
ja

içinde aşağıdaki gibi tanımlayın.

public static void main(String args[]) {


// Daha sonra buraya try-catch blogu ekleyin
}
w.

*CORBA Sistem İstisnalarını Ele Almak

Bütün CORBA uygulamalarının çalışma anında CORBA sistem hatasını fırlatabileceğini göz önüne alarak,
ww

main içindeki tüm kodu try-catch bloğuna almamız gerekir. İstisna yakalayıcımız sadece istisnanın ismini
yazdırır ve yığıt izini ekrana basar.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 14
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

try {
// HelloClient kodu buraya yazılacaktır.

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

o
*Bir ORB Nesnesi Yaratmak

Bir CORBA istemcisi, bütün marchalling ve IIOP işlemlerini gerçekleştirmek için yerel bir ORB nesnesine
ihtiyacı vardır.

i.c
HelloClient sınıfının içinde, try-catch bloğunun içine bir ORB değişkeni tanımlayalım.

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

dil
ORB’nin init metodunu çağırmak, uygulamamızın komut satırı argümanlarını aktarmaya yarar ve çalışma
anında kesin özellikleri değiştirmemize izin verir.

PoaManager’i aktif hale getirmek için aşağıdaki kod bloğunu ekleyin.


va
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper
.narrow(orb.resolve_initial_references("RootPOA"));

poa.the_POAManager().activate();

*Hello Sunucusunu Bulmak


ja

CORBA istemcisi için bir ilk nesne referansı almak için çeşitli yolar vardır. Bizim uygulamamız bunun için
COS isimlendirme servisini kullanacaktır. COS, OMG tarafından tanımlanmış ve Java IDL destekleyen bir
servistir.

NameServer bütün CORBA ORB’leri için tanımlı bir katardır. Bu kadarı parametre olarak geçtiğimiz
w.

zaman, ORB bir naming context döndürür.

NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));

Hello sunucusunu bulabilmek için öncelikle Hello sunucusunun kimliğini tanımlayan, bir
ww

NameComponent’a ihtiyaç vardır.

NameComponent[] helloName = new NameComponent[1];


helloName[0] = new NameComponent("Hello", "server");

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 15
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Hello nesnesine olan yol sadece bir element içerdiği için, nc üstünden tek elemanlı bir dizi oluşturulur.

Son olarak, Hello sunucusuna bir referans almak için ve bunu Hello nesnesine vermek için, isim servisin

m
resolve metoduna gerekli yol paramatre olarak geçilir.

Hello hello = HelloHelper.narrow(nc.resolve(helloName));

o
• sayHello() işlemini çağırmak

i.c
9 HelloClient.java içinde, try-catch bloğunun içine isim servisinin resolve metodunu
çağırmak için aşağıdaki çağrı yapılır.

String Hello = hello.sayHello();

System.out.println(Hello);
dil
Son olarak da sonuç ekrana bastırılır.
va
9 Kütük kaydedilir ve kapatılır (HelloClient.java)

• HelloWorld sunucusunun geliştirilmesi

Projemize HelloServer.java isminde bir kütük yaratın. Sonra aşağıdaki paketleri ekleyin.
ja

*Gerekli paketleri eklemek

package implementation;
import HelloApp.*;
// HelloServer isimlendirme servisini kullanacak.
w.

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
// Bütün CORBA uygulamalı bu paketi kullanır.
import org.omg.CORBA.*;

• Sunucu sınıfını tanımlamak


ww

public class HelloServer {


// kodlar buraya.
}

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 16
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

*CORBA sistem hatalarını ele almak

m
Main içine aşağıdaki try-catch bloğunu ekleyin.

try {
// HelloServer kodları buraya eklenecektir

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

i.c
*ORB nesnesini yaratmak

İstemci gibi sunucu uygulama da yerel bir ORB nesnesine ihtiyaç duyar.

ORB orb = ORB.init(args, null);

dil
PoaManager’i aktif hale getirmek için aşağıdaki kod bloğunu ekleyin.

org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper


va
.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();

Hizmet edecek sınıf hala tanımlanmadı. Bunu daha sonraki adımlarda yapacaksınız. Bir sonraki adımda
nesnemizi ORB’ye bağlayacağız. Böylece ORB gelen çağrıların farkına varıp bu çağrıları doğru hizmet
eden sınıfa aktarabilir.
ja

org.omg.CORBA.Object helloObject = poa


.servant_to_reference(new HelloServant(orb));
w.

• Hizmetçi sınıfı tanımlamak

o Sınıfı tanımlayın.

class HelloServant extends HelloPOA{


ww

// sayHello metodunu burada olusturun.


}

o Hizmetçi sınıf HelloPOA sınıfının alt sınıfıdır. Bu yüzden derleyici tarafından bütün
CORBA fonksiyonelliği kalıtılır.

o Gerekli sayHello metodunu tanımlayın.


Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 17
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

m
public String sayHello() {
//metot tanımını burada olusturun
}

o
o sayHello tanımını olusturun.

return "\nHello World!!\n";

i.c
• COS isimlendirme servisi ile çalışmak

NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));

Yeni bir NameComponent nesnesi yaratın.

dil
NameComponent[] hello = new NameComponent[1];
hello[0] = new NameComponent("Hello", "server");
va
Hello nesnesine olan yol sadece bir element içerdiği için, nc üstünden tek elemanlı bir dizi oluşturulur.
Son olarak yolu ve hizmetçi sınıfı isimlendirme servisine geçin ve nesneyi “Hello” id’si ile bağlatın.

nc.rebind(hello, helloObject);
ja

Sunucumuz hazır. Tek ihtiyacı olan çevrede ihtiyacı olan istemcilerden istem beklemektir. Bunun için try-
catch bloğunun sonuna aşağıdaki kod kesimi eklenir.
w.

java.lang.Object sync = new java.lang.Object();


synchronized(sync) {
sync.wait();
}
ww

Uygulamamızı Çalıştırmak

• Uygulamayı derlemek ve çalıştırmak


Eclipse Hello.idl’imizi derledikten sonra java kodlarımızda otomatik olarak derlenir. Java kütüklerinin .class
uzantılı kütükleri oluşur.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 18
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Uygulamayı Çalıştırmak:

• Windows için komut satırını açın ve Java IDL isim servisini başlatın.

m
tnameserv -ORBInitialPort 1050

• Sunucu’yu -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek


parametre yazılabilir.

o
• İstemciyi -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek
parametre yazılabilir.

• İstemci aşağıdaki katarı ekrana basar.

i.c
Hello world!!

NameServer’ı ve HelloServer’ı istemci uygulama başarıyla sonuçlandıktan sonra sonlandırmayı

dil
unutmayın.

Uygulamada anlatılan java kodları aşağıda verilmiştir.

1) Hello.idl

module HelloApp
va
{
interface Hello
{
string sayHello();
};
};
ja
w.

2) HelloClient.java
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 19
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

package implementation;

m
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;

import HelloApp.HelloHelper;
import HelloApp.Hello;

o
public class HelloClient {

public static void main(String[] args) {

i.c
try{

Hello hello;

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

org.omg.PortableServer.POA poa =
org.omg.PortableServer.POAHelper

dil
.narrow(orb.resolve_initial_references("RootPOA"));

poa.the_POAManager().activate();

NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));

NameComponent[] helloName = new NameComponent[1];


va
helloName[0] = new NameComponent("Hello", "server");

hello = HelloHelper.narrow(nc.resolve(helloName));

String Hello = hello.sayHello();


System.out.println(Hello);
}
catch (Exception e) {
ja

e.printStackTrace();
}
}
}
w.
ww

3) HelloServer.java

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 20
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

package implementation;
import org.omg.CosNaming.*;

m
import org.omg.CORBA.*;
//import org.omg.CosNaming.NamingContextPackage.*;

public class HelloServer {


public static void main(String args[])
{

o
try{
// Create and initialize the ORB
ORB orb = ORB.init(args, null);

i.c
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper
.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();

org.omg.CORBA.Object helloObject = poa


.servant_to_reference(new HelloServant(orb));

NamingContextExt nc = NamingContextExtHelper.narrow(orb

dil
.resolve_initial_references("NameService"));

NameComponent[] hello = new NameComponent[1];


hello[0] = new NameComponent("Hello", "server");

nc.rebind(hello, helloObject);

// Wait for invocations from clients


va
java.lang.Object sync = new java.lang.Object();
synchronized(sync){
sync.wait();
}

orb.run();
} catch(Exception e) {
System.err.println("ERROR: " + e);
ja

e.printStackTrace(System.out);
}

}
}
w.

7.3 Banka Uygulaması

Bu örneğimizde basit bir banka uygulaması gerçekleştirilmiştir.


ww

1. Banka (BankSystem), Müşteri (Customer) ve Hesap (Account) öğelerimiz bulunmaktadır.


2. Banka’da kayıtlı müşteriler ve hesaplar bulunmaktadır.
3. Banka müşteri ekleme, müşteri silme, hesap ekleme, hesap silme işlemleri yapmaktadır.
4. Her müşterinin bir idsi, ismi ve hesapları bulunmaktadır.
5. Her hesabın bir idsi ve hesap limiti bulunmaktadır.
6. Banka sunucu tarafında çalışmaktadır.
7. İstemci, bankanın(sunucunun) işlevlerinden yararlanır. (Hesap ekleme, müşteri ekleme…)
• Bank.idl’in oluşturulması:
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 21
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

9 Eclipse’te projemize Simple IDL kütüğü ekleyin ve aşağıdaki modül satırlarını girin. Aşağıdaki
Bank modülünde Hesap (Account), Müşteri (Customer) ve Banka (BankSystem) arayüzleri
tanımlanmıştır.

m
module Bank{

interface Account{

o
attribute long accountId;
attribute long accountLimit;
};

typedef sequence<Account> AccountList;

i.c
interface Customer{
attribute string customerName;
attribute long customerId;

boolean openCustomerAccount(in Account account);


AccountList getCustomerAccounts(in long customerId);

dil
};

interface BankSystem{

Customer createCustomer(in string customerName, in long


customerId);
boolean deleteCustomer(in long customerId);
va
Account createAccount(in long accountId, in long accountLimit);
boolean deleteAccount(in long accountId);
};
};

Her tanımlı arayüz içerisinde gerekli işlevlerin tanımına yer verilmiştir.


ja

9 Bank.idl üzerinde sağ tuş yapıp ORB Menu’den Compile seçeneğini tıklayalım, bu IDLimizi
derleyecektir. IDL’i derlediğiniz zaman, yukarıdaki tüm deyimler Bank paketi içerisinde Java
kodlarına dönüşecektir.

9 Oluşan arayüzlere karşılık gerçekleştirimler için “implementation” adında paket oluşturun.


w.

Gerçekleştirimler aşağıdaki şekilde doldurulur. Bunlar basit hesap ekleme, hesap silme, hesap
açma, müşteri ekleme, müşteri silme işlemleridir.
ww

AccountImplementation.java:

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 22
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

package implementation;

m
import Bank.AccountPOA;

public class AccountImplementation extends AccountPOA {

private int accountId;


private int accountLimit;

o
public AccountImplementation(int accountId, int accountLimit){
accountId(accountId);
accountLimit(accountLimit);

i.c
}

public int accountId() {


return this.accountId;
}

public void accountId(int newAccountId) {


this.accountId = newAccountId;

dil
}

public int accountLimit() {


return this.accountLimit;
}

public void accountLimit(int newAccountLimit) {


this.accountLimit = newAccountLimit;
va
}
}
ja
w.
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 23
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

BankSystemImplementation.java:
package implementation;

m
import java.util.ArrayList;

import org.omg.CORBA.ORB;

import Bank.Account;

o
import Bank.BankSystemPOA;
import Bank.Customer;

public class BankSystemImplementation extends BankSystemPOA {

i.c
private ORB orb;
ArrayList<CustomerImplementation> customerArray;
ArrayList<AccountImplementation> accountArray;

public BankSystemImplementation(org.omg.CORBA.ORB orb){


this.orb = orb;
customerArray = new ArrayList<CustomerImplementation>();

dil
accountArray = new ArrayList<AccountImplementation>();
}

public Account createAccount(int accountId, int accountLimit) {


AccountImplementation accImp = new
AccountImplementation(accountId,accountLimit);
accountArray.add(accImp);
return accImp._this(orb);
va
}

public Customer createCustomer(String customerName, int customerId) {


CustomerImplementation cusImp = new
CustomerImplementation(customerName,customerId);
customerArray.add(cusImp);
return cusImp._this(orb);
}
ja

public boolean deleteAccount(int accountId) {

for(int i=0;i<accountArray.size();++i)
System.out.println(accountArray.get(i).accountId());
w.

boolean isDeleted = false;


for(int i=0;i<accountArray.size();++i){
if(accountArray.get(i).accountId() == accountId){
accountArray.remove(i);
isDeleted = true;
}
}
ww

System.out.println("after deleting account");


for(int i=0;i<accountArray.size();++i)
System.out.println(accountArray.get(i).accountId());

return isDeleted;
}

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 24
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

public boolean deleteCustomer(int customerId) {

m
for(int i=0;i<customerArray.size();++i)
System.out.println(customerArray.get(i).customerName());

boolean isDeleted = false;


for(int i=0;i<customerArray.size();++i){
if(customerArray.get(i).customerId() == customerId){

o
customerArray.remove(i);
isDeleted = true;
}
}

i.c
System.out.println("after deleting customer");
for(int i=0;i<customerArray.size();++i)
System.out.println(customerArray.get(i).customerName());

return isDeleted;
}
}

dil
ja va
w.
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 25
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

CustomerImplementation.java:
package implementation;

m
import Bank.Account;
import Bank.CustomerPOA;
import java.util.ArrayList;

public class CustomerImplementation extends CustomerPOA {

o
private int customerId;
private String customerName;

i.c
private ArrayList<Account> customerAccounts = new ArrayList<Account>();

public CustomerImplementation(String customerName, int customerId){


customerName(customerName);
customerId(customerId);
}

public int customerId() {

dil
return this.customerId;
}

public void customerId(int newCustomerId) {


this.customerId = newCustomerId;
}

public String customerName() {


va
return this.customerName;
}

public void customerName(String newCustomerName) {


this.customerName = newCustomerName;
}

public Account[] getCustomerAccounts(int customerId) {


ja

return this.customerAccounts.toArray(new
Account[customerAccounts.size()]);
}

public boolean openCustomerAccount(Account account) {


w.

customerAccounts.add(account);
return true;
}
}
ww

Sunucu ve İstemci’nin oluşturulması:


9 Bir önceki örneğimizdeki gibi isimlendirme servisi, ORB nesne yaratımı gibi kriterlere dikkat
ederek aşağıdaki kodu Sunucu (Server) sınıfı içerisine yerleştirin.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 26
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Server.java

m
package implementation;

import org.omg.CosNaming.*;

public class Server {

o
public static void main(String args[]){
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
try{

System.out.println("Server calisti");

i.c
org.omg.PortableServer.POA poa =
org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA
"));

poa.the_POAManager().activate();

dil
org.omg.CORBA.Object bankSystemObject =
poa.servant_to_reference(new BankSystemImplementation(orb));

NamingContextExt nc =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));

NameComponent[] bankSystemName = new NameComponent[1];


va
bankSystemName[0] = new NameComponent("BankSystem",
"server");

nc.rebind(bankSystemName, bankSystemObject);

}
catch(Exception e){
ja

e.printStackTrace();
}
orb.run();
}
}
w.

9 Bir önceki örneğimizdeki gibi isimlendirme servisi, ORB nesne yaratımı gibi kriterlere dikkat
ederek aşağıdaki kodu İstemci (Client) sınıfı içerisine yerleştirin.
ww

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 27
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Client.java
package implementation;

m
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import Bank.Account;
import Bank.BankSystem;

o
import Bank.BankSystemHelper;
import Bank.Customer;

public class Client {

i.c
public static void main(String args[]){
try{

System.out.println("Client calisti");

BankSystem bankSystem;

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

"server");
NamingContextExt nc =

dil
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));

NameComponent[] bankSystemName = new NameComponent[1];

bankSystemName[0] = new NameComponent("BankSystem",


va
bankSystem =
BankSystemHelper.narrow(nc.resolve(bankSystemName));

Account account = bankSystem.createAccount(123456, 1000);


Customer customer = bankSystem.createCustomer("Yusuf
Kartal",98765432);
ja

customer.openCustomerAccount(account);
Account[] accountList =
customer.getCustomerAccounts(987654321);
for(int i=0; i<accountList.length; ++i)
System.out.println("account ID: " +
w.

accountList[i].accountId());

Customer customer2 = bankSystem.createCustomer("Dogukan


Dogan",88885432);
bankSystem.deleteCustomer(88885432);

Account account2 = bankSystem.createAccount(111156, 1000);


bankSystem.deleteAccount(111156);
ww

}
catch(Exception e){
e.printStackTrace();
}
}
}

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 28
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği

Uygulamamızın Çalıştırılması:

m
9 Komut satırını açın ve Java IDL isim servisini başlatın.
o tnameserv –ORBInitialPort 1050

o
i.c
9 Sunucu’yu -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek
parametre yazılabilir.

9 İstemciyi -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek


parametre yazılabilir.

Server calisti
Yusuf Kartal
dil
Program aşağıdaki gibi çıktı üretecektir:
va
Dogukan Dogan
after deleting customer
Yusuf Kartal
123456
111156
after deleting account
ja

8- Kaynaklar
ftp.cs.hacettepe.edu.tr/pub/dersler/BIL4XX/BIL447_YML/belgeler/Java_IDL.pdf
ftp.cs.hacettepe.edu.tr/pub/dersler/BIL4XX/BIL447_YML/belgeler/CORBA_20122034.pdf
w.

http://www.objs.com/
http://java.sun.com/docs/books/tutorial/idl/intro/corba.html
http://www.omg.org/gettingstarted/corbafaq.htm
http://tr.wikipedia.org/wiki/CORBA
http://www.sei.cmu.edu/str/descriptions/orb.html
http://whatis.techtarget.com/definition/0,,sid9_gci214019,00.html
http://searchwebservices.techtarget.com
ww

http://www.corba.org/

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 29
fatihg@cs.hacettepe.edu.tr

You might also like