<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Melez Bir Mimari Yaklaşımıyla Yazılım Çercevesi Geliştirme</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Osman Karaahmetoğlu</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ebru Karaahmetoğlu</string-name>
          <email>erogluebru@hotmail.com2</email>
        </contrib>
      </contrib-group>
      <abstract>
        <p>On the field of software development, there are different kinds of software framework in order to simplify and optimize the software development processes. Any software framework has not only superior capabilities but also inefficiencies to effect software development processes as positive or negative. While some frameworks are strong in terms of architectural component like memory management, transaction management on middle layer, the others provide reliable and scalable user controls on user interactions. To provide optimum expectation on software development processes, it is need to design a new software development framework by using good features of the frameworks. In this study,it is tried to develop a new software development framework which uses Java based framework, Spring on middle layer, and JSF on user interface. These two technologies are integrated each other and extended by dynamic technologies, log management, exception handling etc.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Key words: framework, user interface, middle layer, managed bean, controller,
DAO classes
1</p>
    </sec>
    <sec id="sec-2">
      <title>Giriş</title>
      <p>
        Kurumsal uygulamalarda, uygulamanın standartlarını, kalitesini, uygulama
yaklaşımını belirleyecek, altyapısal işlemlerde kolaylık sağlayacak, tasarım örüntülerinin
nesne yönelimli olarak kullanılmasını kolaylaştıracak, kısacası uygulama teknik
çerçevesini belirleyecek yapılara ihtiyaç duyulmaktadır. Böyle yapıların olmamasını,
temeli olmayan binalar üretmeye benzetebiliriz. Diğer bir deyişle proje kapsamında
her geliştirilen modülde, hatta sayfada, bellek yönetimi, hareket yönetimi, loglama,
hata yönetimi ve hatta kullanıcı kontrolleri gibi yapıların mikroservislerden farklı
olarak tekrar tekrar geliştirildiği düşünülebilir. Mikroservisler [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] de iş kısmı küçük
parçacıklara ayrılmaktadır. Kullanılan ortak bileşenler tekrar tekrar
geliştirilmemektedir. Yukarıda bahsedilen tüm olumsuzlukların ışığında, kurumsal bir yazılım
mimarisinde, yazılım çerçeve ihtiyacı aşikardır.
      </p>
      <p>Bu noktada nesne yönelimli yazılım mimari bileşenlerinin etkin olarak
kullanılmasına olanak sağlayan, uygulama kapsamında kullanılacak ortak bileşenleri
uygulamanın kullanımına esnek olarak sunan, farklı tasarım örüntülerinin kullanımına izin
veren, bellek yönetimi, hareket yönetimi, hata yönetimi, log yönetimi, veritabanı
erişimi ve kullanıcı kontrolleri gibi yapılarla uygulama çerçevesini belirleyen, bir
yazılım mimarisi tasarımı, kurumsal uygulamalar için kaçınılmazdır.</p>
      <p>Yazılım mimari çerçevelerinin en önemli özelliği, içerisinde proje iş bileşenlerini
barındırmamalarıdır. Proje kapsamında, uygulama iş kurallarının geliştirilmesinde
gerekli olduğu durumlarda yazılım çerçevesi bileşenleri çağrılır. Böylelikle
geliştirilmiş olan yazılım çerçevesi, iş kuralları birbirinden çok farklı uygulamaların
geliştirilmesinde kullanılabilir.</p>
      <p>Günümüz yazılım mimari yaklaşımlarında kod geliştirme faaliyetlerinin, kolay ve
hızlı olmasının yanında, modüler olması da önemlidir. Bu nedenle, özellikle veritabanı
uygulamaları için, yazılımcıya mümkün olduğu kadar az iş yükü çıkaracak, sade,
kolay anlaşılabilir kodlar üretecek, uygulama mimarileri geliştirmek önemlidir.</p>
      <p>
        Bu çalışmada ön yüzde kararlı, farklı tarayıcılarda kullanıcı kontrollerinin aynı
davranışları gösterdiği, kullanıcı kütüphanesinin geniş olduğu ve uygulama ihtiyaçlarına
göre özgün kullanıcı kontrolleriyle genişletilebilecek JSF[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] mimarisi ile, orta
katmanda hareket yönetimi, bellek yönetimi, hata yönetimi, log yönetimi vb. mimari
alanlarında üstün özellikler gösteren Spring mimarisini kullanan, bir yazılım mimari
çerçevesi sunulmuştur. Buna ek olarak JPA [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] temelli bir veri nesne modeli (entity)
yapısı kurulmuş olup, sanal sınıflarla servis ve veri katmanları ortak bileşen olarak
geliştirilerek, uygulama geliştirme sürecinde yazılmcının kod geliştirme faaliyetleri
hızlandırılmıştır.
      </p>
    </sec>
    <sec id="sec-3">
      <title>Yazılım Mimarisi</title>
      <p>
        Yazılım mimarisi, kurumsal uygulama geliştirme süreçlerine altlık oluşturacak
yazılım bileşenleri, bu bileşenlerin uygulama iş bileşenlerinin kullanımına sunulan
özellikleri ve birbirleriyle ilişkilerinden oluşan yapılardır [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>
        Bir yazılım sisteminin temel çatısı mimari üzerine kurulur. Bu çatı, yazılım sistemi
bileşenleri, bileşenlerin kendi arasında ve dış sistemlerle etkileşimleri ve bu çatıyı
temel alan uygulama tasarlama ve geliştirme kurallarından oluşur [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        Yazılım mimarileri tasarım biçimlerine göre aşağıdaki gibi sınıflandırılabilirler [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]:
1. Katmanlı mimari. Bileşenler katmanlı olarak tasarlanmışlardır. Bu yapıda
bileşenler, komşu katman bileşenleri ile etkileşimde bulunacak şekilde
yapılandırılmışlardır.
2. Kanal ve filtre temelli mimari. Bu mimaride bileşenler, kanallarla konuşan
filtreler gibi işlev görürler.
3. Paylaşılan veri mimarisi. Bu mimari yaklaşımında bileşenler, paylaşılan veri
erişimcisi tarafından erişilen, paylaşılan veri deposu olarak tasarlanırlar.
4. Olay güdümlü mimari. Bu mimari yaklaşımında bileşenler, olay yöneticisi
nin, olay bildirimleri doğrultusunda işlev görürler.
5. Tanım-Görünüm-Yönetici (Model-View-Controller -MVC). Günümüz web
uygulamalarının temel almış olduğu mimari yaklaşımdır. Bu mimari
yaklaşımın sağlamış olduğu, soyutlama ile her katman kendi işine odaklanır.
Tanım katmanı veri modeli işlemlerini, görünüm katmanı kullanıcı arayüzü
işlemlerini, yönetici katmanı ise görünüm katmanı ile tanım katmanı arasında
iletişimi sağlar. Yönetici katmanı, iş kurallarını tanım ve görünüm
katmanından edinmiş olduğu verilerle çalıştırarak, kullanıcıya gösterilecek biçime
çevirdiği veriyi görünüm katmanına, veri saklama ortamlarına kaydedilmesi
için de tanım katmanına iletir.
      </p>
      <p>
        Tablo 1. de bu mimari yaklaşımları kullanarak geliştirilmiş yazılım çerçevelerinin
karşılaştırması yapılmıştır [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [10], [11], [12], [13], [14], [15], [16], [17].
3 JSF
      </p>
      <p>Java EE [18] mimarisinin bir parçası olan JSF, kullanıcı arabiriminde işlevsellik
gösteren kullanıcı kontrolleri ailesinden oluşan bir çerçevedir. JSF’ de kullanıcı
kontrolleri, sunucu tarafında yorumlanmakta olup, javascript’te karşılaşılabilecek
tarayıcı uyumsuzluğu sorunu bulunmamaktadır.</p>
      <p>JSF’ de kullanıcı kontrollerinin oluşturulmasında, öncelikle kontrol ağacı oluşturulur.
Daha sonra, kontrol ağacı HTML sayfasına yorumlanır. Bu iki sürecin birbirinden ayrı
olması, kullanıcı tarafında farklı işaretleme (markup) dillerinin kullanılmasına olanak
sağlar. Böylelikle farklı ortamlarda, akıllı telefon, tablet, masaüstü bilgisayarlar vb.
JSF kullanıcı kontrolleri kullanılabilir [19].</p>
      <p>JSF kullanıcı kontrollerinde istemci tarafta gerçekleşen değişiklikler, dinleyici
(listener) aracılığıyla, Ajax teknolojileri [20] kullanılarak sunucuya iletilmekte ve bu
mesajların işlenmesi sonucu oluşan güncellemeler, kullanıcı kontrollerine
bildirilmektedir. Buradan hareketle, JSF’in bir olay güdümlü programlama çerçevesi
olduğu söylenebilir..</p>
      <p>
        JSF kullanıcı kontrolleri farklı kullanıcı aletlerini desteklemektedir. JSF ile
geliştirilen bir veritabanı uygulamasında, uygulama iş kuralları ve veri modeli
nesneleri, uygulama katmanında yer alır [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>Tablo 1. Yazılım Çerçeveleri Karşılaştırma
ı
m
ı
n
a
l
l
u
K
k
e
n
s
E
u
CV illreküdo lliıaeeunndnKm ililllireeçebnkk jılıiseankğkyonEm lılışaeeğvkkB ,liiltlıılırşsaankkA reenğm tieaeüpühgnnnK ilekvnü</p>
      <p>M M Y Ö B G B Ö Z G
√ √ √ √ √ √ √ √ √ √ √
√ √ √ √ √ √ √ √
√ √ √ √ √ √ √ √
√ √ √ √ √
√ √ √
k
i
l
k
e
n
s
E
lılıi)r(ssaeevyukpnoR itiitaaenknkyönKYm rsenkon</p>
      <p>D E A
√ √ √</p>
      <p>√ √
√
√
√ √ √
√
√
√
√ √ √
√ √ √
√ √ √
√ √ √
√</p>
      <p>√
√ √</p>
      <p>√
√ √ √ √
√ √ √ √
√ √ √
√
√
√ √
√ √
√ √ √
√ √
√ √
√
√
√
√
√
√ √
√ √ √
√ √</p>
      <p>√
√ √
Melez Çerçeve
Spring MVC
JSF
Struts
Hibernate
Play Framework
Vaadin
Grails
Django
Wicket
Vert.x
Entity Framework
AngularJS</p>
    </sec>
    <sec id="sec-4">
      <title>4 Sunulan Mimari</title>
      <p>Sunulan yazılım mimarisinde, kullanıcı uygulama iletişiminde, JSF teknolojileri
kullanılmıştır. Sunucu tarafında yorumlanan JSF kullanıcı kontrollerinin kullanımı ile
istemci tarafı, tarayıcı ve kullanıcı aletleri bağımlılığı ortadan kaldırılmıştır. JSF
teknolojilerinde tutarlı, ölçeklenebilir, esnekliği kurumsal uygulamalarda denenmiş,
zengin içerikli kütüphanelerin geliştirilebilmesi, uygulama geliştirme süreçleri ve
geliştirilen üründeki kaliteyi artırmaktadır. JSF çerçevesinin kullanıcı kontrolleri
temelli olması, özellikle veritabanı uygulamalarında orta katmanda iş kuralları ve veri
modelleme nesnelerini çerçeveleyerek, hareket yönetimi, bellek yönetimi, log
yönetimi, hata yönetimi, güvenlik vb. hizmetleri sağlayacak, bir uygulama katmanına
gereksinim oluşturmaktadır.</p>
      <p>Bu noktada bilindik, ölçeklenebilir, tutarlı, güvenilir, esnek bir çerçeve olan Spring
çerçevesi [21] kullanılmıştır.</p>
      <p>Geliştirilen mimaride yazılımcının güvenilir, modüler kaynak kodu, hızlı ve kolay
bir şekilde geliştirebilmesi ölçütleri göz önünde tutulmuştur. Veri modelinin
tanımlanması, kullanıcı gösterim sayfasının yazılımının yapılması, orta katmandaki
bean’lerin, sanal (abstract) bean sınıflarından türetilmesi ve dinamik kod geliştirme
teknolojilerinin kullanılması ile orta katmanda mümkün olduğu kadar az kod
yazılarak, uygulama geliştirilmesi sağlanmıştır.</p>
      <p>Sanal sınıf olarak geliştirilen bir hata yönetim mekanizması, JSF mesajlaşma ve
hata yönetim yapısıyla birleştirilmiştir.</p>
      <p>Yine uygulama çerçevesine bütünleşik bir veritabanı günlük mekanizması
geliştirilmiştir.</p>
      <p>Bellek yönetimi, hareket yönetimi, güvenlik yönetimi, Spring çerçeve tarafında,
etiketler kullanımı ile sağlanmıştır.</p>
      <p>Kullanıcı oturum başlatma mekanizması veritabanındaki bir kullanıcı tablosunda,
kullanıcı ve şifre bilgisi tutularak sağlanmıştır.</p>
      <p>Uygulama very modeli, veri model nesnesi (entity) JPA teknoloji kullanımıyla
veritabanı tablosu ile ilişkilendirilerek oluşturulmuştur. JSF sayfaları ile iletişimi sağlayan
managed bean’ler, oluşturulan sanal bir managed bean’ den türetilmiştir. Bu sanal
managed bean içerisinde, veri modeli nesnesinin dinamik olarak oluşturulması,
kullanıcı sayfalarından gelen verilerin, oluşturulan nesneye atanması, iş kuralları ve
veritabanı işlemlerini gerçekleştirecek yapıların çağrılması işlemleri yapılır.</p>
      <p>Bu işlemler için çağrılan yönetici (Controller) sınıflarında iş kuralı nesneleri
oluşturulur; veri modeli nesnelerine değerler atanır ve veritabanı işlemlerini yapacak
DAO nesneleri çağrılır. Yukarıda bahsedilen yapıların, tümü sanal sınıflar olup, veri
modeli nesnesine göre dinamik olarak oluşturma, değer atama, yöntem çağırma
işlemlerini kullanmakta olup, iş kuralları için tekrar tekrar geliştirilmesine gerek
bulunmamaktadır.</p>
      <p>Raporlama işlemleri, geliştirilen sanal bir rapor sınıfı içerisinde, dinamik kriter
atama yöntemleri kullanılan bir rapor arayüzü ile rapor ve kriter sınıfınının, rapor
yapısına sağlanması ile Jasper Reports [22] kullanımıyla oluşturulur.
5</p>
      <p>Çerçeve Yapıları
5.1</p>
      <sec id="sec-4-1">
        <title>Mamage Bean</title>
        <p>
          Uygulamada istemci sunucu iletişimi managed bean’ ler aracılığı ile sağlanır. Web
sayfasındaki JSF kullanıcı kontrollerine yapılan veri girişleri, managed bean sınıfında
tanımlanmış değişkenler ve nesneler aracılığı ile toplanır. Uygulama çerçevesinde
geliştirilen managed bean’ler, sanal bir managed bean’ den türetilmekte olup, hiç kod
yazmaya gerek olmadan dahi veritabanı işlemleri gerçekleştirilebilir. Bu durum, sanal
managed bean üzerinde veri modeli nesnelerinin dinamik olarak, sanal managed bean’
in bir özelliği olarak oluşturulabilmesi ve sayfa üzerindeki veri giriş değerlerinin, bu
sınıf değişkeninde toplanabilmesiyle sağlanabilmektedir. [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ], [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]
        </p>
        <p>Aşağıda örnek pseudo kodları da görülebilecek yapılar, uygulamaya esneklik ve
değişik veri modellerine uyarlanabilirlik desteğini sağlamaktadır (bknz. Şekil 3,4,5,6).</p>
        <p>Böylelikle Java kodlamada çok tecrübeli olmayan bir yazılımcı dahi, sadece veri
modeli nesnesini oluşturup, istemci tarafında JSF sayfasını geliştirerek, çerçevenin
sağlamış olduğu kütüphaneler aracılığıyla, Java EE mimarisinde uygulama
geliştirmedeki karmaşık teknik detaylarla boğuşmadan, kolay ve hızlı bir şekilde
uygulama geliştirebilir.</p>
        <p>Zaten bir çerçevenin en önemli faydaları, uygulama geliştirme sürecini bir standarta
kavuşturarak, kaliteyi artırmak ve ortak yapıları yazılımcının kullanımına sağlayarak,
yazılım sürecini basitleştirmek ve hızlı kod geliştirilmesini sağlamaktır.
Şekil 1. Yazılım Çerçevesi Sunumu
İstemci</p>
        <sec id="sec-4-1-1">
          <title>Cihazlar Akıllı</title>
        </sec>
        <sec id="sec-4-1-2">
          <title>Telefon</title>
        </sec>
        <sec id="sec-4-1-3">
          <title>Tablet</title>
          <p>Dizüstü</p>
        </sec>
        <sec id="sec-4-1-4">
          <title>Masaüstü Vb.</title>
          <p>D
A
O
S
ı
n
ı
f
l
a
r
ı</p>
        </sec>
        <sec id="sec-4-1-5">
          <title>Ortak Kütüphaneler</title>
        </sec>
        <sec id="sec-4-1-6">
          <title>Log Yönetimi</title>
        </sec>
        <sec id="sec-4-1-7">
          <title>Hata Yönetimi</title>
        </sec>
        <sec id="sec-4-1-8">
          <title>Model Nesneleri, Entity Spring Çerçevesi</title>
          <p>V
e
r
i
E
r
i
ş
i
m
K
a
t
m
a
n
ı
J
P
A
Veritabanı
5.2</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>Kontrol Sınıfları (Controller)</title>
        <p>Bu katmanda JSF ile Spring çerçeve iletişimi sağlanır. Yönetici sınıflar, JPA
aracılığıyla veri modeli nesnelerinin veritabanı işlemlerini geliştirmek üzere, DAO
sınıflarını çağırırlar.
Şekil 2. Yazılım Çerçevesi Raporlama Yapısı
R
a
p
o
r
S
ı
n
lıf
a
r
ı</p>
        <p>J
a
s
p
e
r
R
e
p
o
r
t
s
R
a
p
o
r
Ortak Kütüphaneler</p>
        <p>Log Yönetimi</p>
        <p>Hata Yönetimi</p>
        <p>Spring Çerçevesi
Model Nesneleri, Entity (Rapor Kriter Sınıf)</p>
        <p>DAO sınıfları yine sanal bir DAO sınıfından türer ve bu DAO sınıfında JPA
kullanımı ile veritabanı üzerindeki ekleme, güncelleme, silme ve benzeri işlemleri
gerçekleştirirler. Yine bu sanal DAO sınıfı çerçeve tarafından sağlanmış olup, yönetici
sınıfları aracılığı ile veritabanı üzerinde işlem yapılacak veri modeli nesnesi
parametresi ile çağrılır. Bu sanal DAO sınıfında veri modeli nesnesi ile parametrik
işlemler yapılması gereken durumlarda, nesne özelliklerine dinamik olarak ulaşan değer
getirme ve atama işlemleri gerçekleştirilmiştir.</p>
        <p>Uygulama genelinde raporlamalar Jasper Reports [22] ile geliştirilmektedir. Bu
noktada çerçevenin sağladığı özgünlük, rapor parametrelerinin paketlenerek, kullanıcı
tarafından talep edilen raporların uygulama katmanında çağrılmasına sağlayacak
yapının gerçekleştirilmesidir. Bu noktadaı geliştirilmiş olan AbstractReportBean sınıfı
parametre olarak, almış olduğu rapor parametre sınıfı özelliklerine dinamik olarak
erişerek, rapor parametrelerini oluşturmakta ve rapor ismi ile birlikte Jasper Reports
ile geliştirilen bir raporu çağırmak için gerekli geliştirmeleri içermektedir (bknz. Şekil
2).
6</p>
        <p>Yazılım Çerçevesi Geliştirmeleri</p>
        <p>Aşağıdaki pseudo koddan da görüldüğü gibi, managed bean’in generik bir yapıdaki
AbstractManagedBean sınıfından türetilmesi, yapıcı kısmında türediği sınıfın
yapıcısına, veri modeli nesne belirtecinin geçilmesi ve yine üst sanal sınıftaki
CreateInstance yöntemi ile, dinamik olarak veri modeli nesnesinin yaratılması işlemlerinin
geçeklenmesi, yazılımcının managed bean geliştirmeleri için yeterli olacaktır.</p>
        <p>Sayfada yapılan veritabanı işlemleri managed bean’in türediği sanal sınıftan
devraldığı, save, update, remove, findAll gibi komutlar aracılığı ile geliştirilmekte
olup, aşağıda örnek kod parçaları görülmektedir (bknz. Şekil 3,4.).
Şekil 3. Managed Bean Yapısı</p>
        <p>ManagedBean :
Ctor () :</p>
        <p>Super (VeriModelNesne.class);
CreateInstance();</p>
        <p>AbstractManagedBean&lt;VeriModelNesne&gt;
Şekil 4. Sanal (Abstract) Managed Bean Yapısı</p>
        <p>Class : AbstractManagedBean&lt;T&gt;
Ctor (Class&lt;T&gt; entityClass) :</p>
        <p>Yönetici Sınıfı (BaseController) Oluşturulur.
}
return entityList;
}
return entityList;
Veri modeli nesnesi yönetici sınıfına parametre
olarak geçilir.</p>
        <p>CreateInstance();
List&lt;T&gt; findAll():
if (entityList == null){</p>
        <p>entityList =baseController.findAll();
List&lt;T&gt; findAll(HashMap&lt;String, Object&gt; parameters):
if (entityList == null){</p>
        <p>entityList =baseController.findAll(parameters);
save():
baseController.setEntityClass(entityClass);
baseController.save(entityInstance);
update():</p>
        <p>baseController.update(entityInstance);
remove(T entity):</p>
        <p>baseController.remove(entity);</p>
        <p>Sanal managed bean’ den devir alınan, veritabanı işlemlerine yönelik yöntemler,
çerçeve tarafından sağlanan, generik yapıdaki temel yönetici (BaseController) sınıfı
aracılığı ile veritabanı işlemlerini gerçekleştirirler. Bu sınıf Spring çerçeve bellek
yönetimi, hareket yönetimi mekanizmalarına tabidir (bknz. Şekil 5.).
Şekil 5. Temel Kontrol Sınıfı (BaseController) Yapısı</p>
        <p>Class : BaseController &lt;T&gt;
Ctor (Class&lt;T&gt; entityClass) :</p>
        <p>this.entityClass = entityClass;
setEntityClass(Class&lt;T&gt; entityClass) :</p>
        <p>this.entityClass = entityClass;
List&lt;T&gt; findAll():
dao.setEntityClass(entityClass);
return dao.findAll();
List&lt;T&gt; findAll(HashMap&lt;String, Object&gt; parameters):
dao.setEntityClass(entityClass);
return dao.findAll(parameters);
save(T entity):
dao.setEntityClass(entityClass);
dao.create (entity);
update(T entity):
dao.setEntityClass(entityClass);</p>
        <p>dao.update (entity);
remove(T entity):
dao.setEntityClass(entityClass);
dao.remove (entity);</p>
        <p>BaseController generic sınıfı, AbsttactDAO sınıfından türeyen DAO sınıfları
aracılığı ile veritabanı işlemlerini gerçekleştirir. AbsttactDAO sınıfı veritabanı işlemi
yöntemleri ile ilgili tüm işlemlerin gerçeklemelerini içerir.</p>
        <p>Bu sınıfta JPA teknolojileri ile geliştirmeler yapılmıştır. Bu sınıflar çerçeve
dahilinde yazılımcıların kullanımına açık olup, bu katmanda normal şartlarda ek bir
geliştirme gerekmemektedir.</p>
        <p>Bahsi geçen sınıfın pseudo kodları aşağıda bulunmaktadır (bknz. Şekil 6.).
Şekil 6. Sanal Veri Erişim Sınıfı (AbstractDAO) Yapısı</p>
        <p>Class : AbstractDAO &lt;T&gt;
Ctor (Class&lt;T&gt; entityClass) :</p>
        <p>this.entityClass = entityClass;
setEntityClass(Class&lt;T&gt; entityClass) :</p>
        <p>this.entityClass = entityClass;
getEntityManager():</p>
        <p>return entityManager;
List&lt;T&gt; findAll():</p>
        <p>CriteriaQuery cq = createQuery(); Kriter sorgusu
oluşturulur.
root = cq.from(entityClass)
cq.select(root); Entity nesnesi sorgu alanları
listesi oluşturulur.
cq.where(predicate); Sorgu kriter filtresi eklenir.
return getEntityManager().createQuery(cq)
.getResultList();
List&lt;T&gt; findAll(HashMap&lt;String, Object&gt; parameters):
CriteriaQuery cq = createQuery(); Kriter sorgusu
oluşturulur.
root = cq.from(entityClass)
cq.select(root); Entity nesnesi sorgu alanları
listesi oluşturulur.</p>
        <p>Parametre değerlerinden sorgu kriter belirtimi
(predicate) yapısı oluşturulur.
cq.where(predicate); Sorgu kriter filtresi eklenir.
return getEntityManager().createQuery(cq)</p>
        <p>.getResultList();
T find(Object id) :</p>
        <p>return getEntityManager().find(entityClass, id);
create(T entity):</p>
        <p>getEntityManager().persist(entity);
update(T entity):</p>
        <p>getEntityManager().merge(entity);
remove(T entity):</p>
        <p>getEntityManager().remove(entity);</p>
        <p>Uygulama genelinde raporlamalar Jasper Reports ile geliştirilmektedir. Çerçevenin
rapor sınıfı, AbstractReportBean, parametre olarak almış olduğu, rapor parametre
sınıfı özelliklerine, dinamik olarak erişerek rapor parametrelerinin oluşturulması ve
rapor ismi ile birlikte, Jasper Reports ile geliştirilen bir raporun çağrılması için gerekli
geliştirmeleri içermektedir (bknz. Şekil 7.).
Şekil 7. Sanal Rapor Sınıfı (AbstractReportBean) Yapısı</p>
        <p>Class : AbstractReportBean &lt;T&gt;
Ctor (Class&lt;T&gt; _reportClass ,T _reportInstance</p>
        <p>,String _reportName):
reportClass = _reportClass;
reportName = _reportName;
reportInstance = _reportInstance;
setExportOption(ExportOption.PDF);
createParameters(): Rapor nesnesinden kriter
değerlerine alan ismine göre ulaşır ve rapora
parametre olarak ekler.</p>
        <p>Map&lt;String,Object&gt; parameters = new HashMap&lt;String,
Object&gt;();
Field[] fieldsArray = reportInstance.getClass()
.getDeclaredFields();
for (Field field : fieldsArray) {</p>
        <p>Object value = field.get(reportInstance);
parameters.put(field.getName(), value.toString());
}
return parameters;
execute(): Raporu derler ve çalıştırır.</p>
        <p>Yazılım çerçevesinin iş bileşenlerinin kullanımına sunmuş olduğu veritabanı
işlemlerinin sekans diyagragramları aşağıda gösterilmektedir (bknz. Şekil 8).
Şekil 8.a. Kayıt Listeleme Yöntemi (findAll) Sekans Diyagramu</p>
        <p>Kullanıcı
Şekil 8.b Kayıt Ekleme Yöntemi (save) Sekans Diyagramu</p>
        <p>Kullanıcı</p>
        <p>Sayfa (JSF)
save</p>
        <p>Managed</p>
        <p>Bean</p>
        <p>Base
Contoller</p>
        <p>DAO Sınıfı</p>
        <p>Entity
Entity
Manager
save
setEntityClass
save
new Entity()
setEntityClass
persist
Şekil 8.c. Kayıt Güncelleme Yöntemi (update) Sekans Diyagramu</p>
        <p>Kullanıcı
Şekil 8.d. Kayıt Silme Yöntemi (remove) Sekans Diyagramu</p>
        <p>Kullanıcı</p>
        <p>Sayfa (JSF)
remove</p>
        <p>Managed</p>
        <p>Bean</p>
        <p>Base
Contoller</p>
        <p>DAO Sınıfı</p>
        <p>Entity
Manager</p>
        <p>Entity
remove
setEntityClass
remove
select Entity
setEntityClass
remove
remove
Yazılım çerçevesi bileşenlerinin sınıf diyagramı Şekil 9’.da gösterilmektedir.
Şekil 9. Yazılım Çerçevesi Sınıf Diyagramı
setEntityClass
findAll
save
update
remove
ManagedBean</p>
        <p>BaseController
setEntityClass
update
save
findAll
remove
Entity
setEntityClass
findAll
save
update
remove
DAO</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>7 Sonuç</title>
      <p>Kurumsal bir yazılım mimarisinin, gereksinimleri olan modüler, kaliteli, kararlı,
ölçeklenebilir, tutarlı, kolay ve hızlı kod geliştirebilme, kolay yaygınlanştırma vb.
mimari özellikleri düşünülerek bir yazılım çerçevesi geliştirilmiş olup, bu çalışma ile
sunulmaya çalışılmıştır. Bu çalışmada geliştirilen yazılım çerçevesinde, web temelli
veri tabanı uygulamaları hedef alınmış olup, orta katmanda Java gibi matematik
işlemlerde güçlü bir programlama dili kullanıldığı için, matematiksel işlem yoğunluklu
uygulamalarda geliştirilebilir.</p>
      <p>Yazılım çerçeveleri genellikle, uygulama süreçlerini standartlaştırmayı ve bu
süreçlerde ortak kütüphaneler kullanımıyla, kolay, anlaşılabilir, kaliteli, hızlı kod
geliştirmeye hedeflediği için, hazır teknolojilerden faydalanmakla birlikte, çerçeve
yaklaşımı özgün olup, iş nesneleri ile iletişimdeki katman yapısı, kullanılan dinamik
nesne oluşturma yöntemleri ile uygulama geliştirme süreçlerinde hızlı, anlaşılabilir
kod geliştirmenin sağlanması, raporlama araçlarıyla iletişimi sağlayan dinamik
yapılarla raporlama süreçlerininin basitleştirilmesi, vb. açılımlar bu yaklaşımla
yapılmıştır.</p>
      <p>Çerçeve geliştirmelerinin yazılım süreçlerine temel katkısı, kurumsal bir mimaride
uygulama geliştirme süreçlerinin karmaşık yapısına destek sağlıyacak yapıların, yetkin
ekiplerce geliştirilen kütüphanelerle gerçeklenerek, yazılımcının kullanımına
sunulmasıdır. Böylelikle yazılım süreçleri hem kolaylaymış, hem de hızlanmış olur.</p>
      <p>Yazılım çerçevesi yaklaşımında lego benzeri bir yaklaşım ön planda tutulmuş olup,
bir servis katmanı aracılığıyla javascript temelli bir yaklaşım, çerçeveye eklenebilir.
Orta katman Spring çerçevenin sağlamış olduğu bellek yönetimi ve hareket yönetimi
gibi faaliyetler geliştirilecek farklı yaklaşımlarla sağlanabilir. Buna ek olarak,
veritabanı erişim katmanında farklı erişim terknolojileri kullanılarak çerçeve yaklaşımı
genişletilebilir.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Johannes</surname>
            <given-names>T.</given-names>
          </string-name>
          <string-name>
            <surname>Microservices</surname>
          </string-name>
          . IEEE Software,
          <volume>32</volume>
          (
          <issue>1</issue>
          ):
          <fpage>116</fpage>
          -
          <lpage>116</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>2. JSF Reference Site,http://www.javaserverfaces.org/</mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Java</given-names>
            <surname>Persistence</surname>
          </string-name>
          <string-name>
            <surname>API</surname>
          </string-name>
          , https://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp140049.html
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4 Bass, Klemen, Kazman,
          <source>Software Architecture in Practice (2 nd edition)</source>
          ,
          <source>Addison-Wesley</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <article-title>5 Recommended Practice for Architectural Description of Software-Intensive Systems</article-title>
          , ANSI/IEEE Std 1471
          <article-title>-</article-title>
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6 https://www.academia.edu/25325573/YAZILIM_TASARIM_VE_MİMARİSİ_
          <article-title>-_SOFT WARE _DESIGN_AND_ARCHITECTURE, SIRIUS information technology</article-title>
          ,Sam Houston State University, Computer science, Graduate Student
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Struts</given-names>
            <surname>Framework</surname>
          </string-name>
          , https://struts.apache.org/
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>8. Hibernate, http://hibernate.org/</mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>Google</given-names>
            <surname>Web</surname>
          </string-name>
          <article-title>Toolkit (GWT)</article-title>
          , https://opensource.google.com/projects/gwt 10.Play Framework, https://www.playframework.com/ 11.Vaadin,https://vaadin.com/ 12.Grails Framework,https://grails.org/ 13.Django, https://www.djangoproject.com/ 14.Wicket, https://wicket.apache.org/ 15.
          <string-name>
            <surname>Vert</surname>
          </string-name>
          .X, https://vertx.io/ 16.Entity Framework, https://docs.microsoft.com/en-us/ef/ 17.AngularJS, https://angularjs.org/ 18.JSR-000314
          <source>JavaServerTM Faces 2</source>
          .0, https://jcp.org/aboutJava/communityprocess/ final/jsr314/index.html 19.JSR 366:
          <string-name>
            <surname>Java</surname>
            <given-names>Platform</given-names>
          </string-name>
          ,
          <article-title>Enterprise Edition 8 (Java EE 8) Specification</article-title>
          , https://jcp.org/en/jsr/detail?id=366 20
          <string-name>
            <surname>Dong</surname>
          </string-name>
          , S., Cheng, C.,
          <string-name>
            <surname>Zhou</surname>
          </string-name>
          , Y.:
          <article-title>Research on AJAX technology application in web development</article-title>
          . In: 2011 International Conference E-Business and E -Government, ICEE (
          <year>2011</year>
          )
          <fpage>21</fpage>
          .Spring Framework, https://spring.io/. 22.Jasper Reports, https://community.jaspersoft.com/wiki/jaspersoft-community
          <source>-wiki-0.</source>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>