Controller altyapısı iki parçadan oluşur.

  1. her formda kullanılan swing bileşenlerinin (TextEdit, ComboBox, Button gibi) görsel olmayan birer taklitlerinin geliştirilmesi
    Örneğin sunucuda bir form açılıp, o formda bulunan kontrollere (bileşenlere) değerler doldurulup formdaki kaydet tuşuna basılabilir. Bu taklit sınıflar, görsel parçaları olmadığı için sunucuda Headless modda bile çalışabilirler.
  2. üründe bulunan her forma ait bir controller sınıfı oluşturulması
    Her forma ait controller sınıfı o formun üzerindeki arayüz kontrollerinin desteklediği işlevleri kullanıcı arayüzü ve de etkileşimi olmadan yerine getirebilmek için gerekli metodları içerir.


Bu iki parça bir araya gelince sunucu tarafında bir forma ait controller sınıfı elde edilip formun içindeki kontroller taklit sınıflarla gerçekleştirilip form aslında açılmadan da formun işlevleri kullanılabilir hale gelir.

Kullanımı

Controller altyapısı iki şekilde kullanılabilir.

  1. Menüden Controller Kullanımı

    Controller kodları üründeki menü seviyesinden kullanılmaya başlar. Bu şekilde kullanım çoğunlukla sunucu tarafında veri aktarımı gibi amaçlar için kullanılabilir.
  2. Ürün ve Uyarlama Formlarında Controller Kullanımı

    Bu ikinci kullanım daha çok uyarlama geliştiren kişiler tarafından bir ürün formu değiştirilirken kullanılmak için tasarlanmıştır.

1. Menüden Controller Kullanımı

Controller kullanımı menüden bir forma ait controller'ı açarak başlar.

Bu kullanım için ILbsControllerTask arayüzü gerçekleştirilir. Bu arayüz üzerinde tek bir metod bulunur:

public void execute(LbsMenuController menu, IClientContext context); 

Bu metod içinde parametre olarak gelen LbsMenuController sınıfı üzerinden istenen herhangi bir controller alınabilir.
Böylece normalde ürün kullanımında başlangıç noktası olan menü, controller kullanımında da başlangıç noktası olmuş olur. 

Örneğin Malzeme aktarımı yapmak isteniyorsa, bu durumda bu task sınıfında menü controller sınıfından Malzeme Yönetimi modülündeki Malzemeler formuna ait controller sınıfı alınır ve yeni malzeme oluşturma işlemi bu veri listesi formuna ait controller üzerinden üründe nasıl yapılıyorsa aynı şekilde yapılır.

Örnek bir kullanım şöyle olur: 

public class TestControllerTask implements ILbsControllerTask
{
       public void execute(LbsMenuController menu, IClientContext context)
       {
             try
             {
                    ILbsController controller = menu.launchMaterials();
                    if(controller instanceof MMXFItemBrowserController)
                    {
                           MMXFItemBrowserController itemBrowser =(MMXFItemBrowserController) controller;
                           ILbsController controller2 = itemBrowser.createNew_CGCommercialGood();
                           if(controller2 instanceof MMXFItemController)
                           {
                                  MMXFItemController itemEditor = (MMXFItemController) controller2;
                                  itemEditor.setCode("Material1");
                                  itemEditor.clickSave();
                           }
                    }
             }
             catch (LbsControllerException e)
             {
                    e.printStackTrace();
             }
       }
}

Görüldüğü gibi kodda bu sınıf üzerinden yeni bir malzeme kaydı ekleme işlemi gerçekleştiriliyor.

Bu şekilde yazılmış bir contoller iş sınıfını kullanabilmek için altyapıda bir yardımcı metod bulunur: com.lbs.controllers.LbsControllerUtil sınıfında bulunan bu metodun imzası (signature) şöyledir:

public static void executeControllerTask(final IClientContext clientContext, ILbsControllerTask task) throws Exception 

Bu metodu kullanarak sunucuda ya da istemcide bir controller iş tanımı çalıştırılabilir.

2. Ürün ve Uyarlama Formlarında Controller Kullanımı

Ürün formlarının event handler kodlarında o anda açık olan forma ait controller sınıfını alıp kullanmaktır.

Bu kullanım daha çok uyarlama geliştiren kullanıcılar için tasarlanmıştır.

Uyarlama ile bir ürün formu temel alınıp, ürün formu üzerinde değişiklik yapılıyorsa bu ürün formunun controller sınıfı üzerinden çalışmak uyarlama geliştirmeyi kolaylaştırabilir.

Bu kullanım sadece ürün formu temel alınan uyarlama formlarında geçerlidir, sıfırdan geliştirilen uyarlama formlarında bu formlara ait controller sınıfı olmadığı ve de üretilmediği için bu formlar için bu şekilde bir kulanım yoktur.

Normal ürün formlarının da istenirse event handler kodlarında forma ait controller sınıfı alınıp kullanılabilir.

Bu kullanıma örnek aşağıdaki gibi olur:

public class TestFormHandler extends JLbsXUIAdapter
{
       public boolean keyPressed(ILbsComponent component, ILbsComponent child, int keyCode, int keyModifiers, ILbsXUIPane container, Object data, IClientContext context)
       {
             ILbsController controller = container.getController();
             if (controller instanceof WFXFTestFormController)
             {
                    WFXFTestFormController testController = (WFXFTestFormController)controller;
                    try
                    {
                           switch (keyCode)
                           {
                                  case KeyEvent.VK_0:
                                        testController.selectRadio_April();
                                        testController.selectRadio_January();
                                        testController.selectCheckBox_Friday();
                                        testController.selectCheckBox_Sunday();
                                        break;
                           }
                    }
                    catch (Exception e)
                    {
                           e.printStackTrace();
                    }
             }
             return super.keyPressed(component, child, keyCode, keyModifiers, container, data, context);
       }
}

Bu örnekte;

ILbsController controller = container.getController();

controller sınıfının nasıl alındığını gösteriyor.

  • Görüldüğü gibi controller sınfı elde edildikten sonra kullanım controller kodu kullanımından farklılık göstermez.
  • Bu kullanımda formun içindeki bileşenler (button, radio button, text edit gibi) kullanıcı arayüzünde görülen swing bileşenleridir.
  • Formdaki bir alana bu şekilde değer girildiğinde, formda bu değişiklik görsel olarak da oluşur ve kullanıcı bu değişikliği görebilir

Controller Kullanım Örnekleri

Controller kodlarının kullanımı sırasında dikkat edilmesi gereken genel bazı prensipler vardır. Öncelikle hangi arayüz formuna ait controller sınıfı kullanılacaksa bu arayüz formuna aşina olunması gerekir. Controller kodları ile gerçekleştirilmek istenen senaryo ne ise öncelikle bu senaryonun ürün açıkken arayüz üzerinden denenmiş ve çalıştığından emin olunmuş olması gerekir. Kullanıcı arayüzü üzerinden kullanıcı etkileşimi ile gerçekleştirilemeyen herhangi bir işlem controller kodları aracılığıyla da gerçekleştirilemez. Örneğin bir formda görünmeyen (gizli durumda) olan ya da kısıtlı durumda bulunan bir kontrole değer girme işlemi nasıl ki kullanıcı arayüzünde yapılamıyorsa, controller kodları üzerinden yapılamaz ve hata verir.

Controller kodlarında kodların çağrılma sırasının da önemi vardır. Örneğin önce üst birimler seçilmeli, ardından bu üst birime bağlı alt birimler seçilmelidir. Önce Ambar seçip, sonra bu ambarın üst birimi olmayan bir birimi seçmek kullanıcı arayüzünde hatalı bir durum oluşturuyorsa, controller kodlarında da sıralamaya dikkat edilmemesi aynı hatalı durumu oluşturur.

Controller Kodları ile Lookup / Seçim Yapılması 

Kullanıcı açılan formda eğer seçmek istediği kayıt ilk sayfada görünürse, gördüğü bu kaydı seçer. Eğer kayıt ilk sayfada görünmüyorsa, bu durumda kullanıcı bir arama ya da filtreleme yaparak kaydı bulur ve seçer. İstenen kaydın 3. kayıt olduğunu belirten bir bilgi (görüntü) olmadığı için, bu durumda çoğunlukla koddan seçilmek istenen kaydı hedef alan bir arama ya da filtreleme yapılır. Arama ya da filtreleme sonucu istenen kayıt bulunduktan sonra bu kaydın seçimi yapılabilir. Bu işlem için bir arayüz geliştirilmişir:

public interface ILbsControllerLookupHandler
{
       public void lookupControllerOpened(IClientContext context, ILbsController lookupController) throws Exception;
}

Bu arayüz üzerinde tek bir metod bulunur. Bu metod seçim için açılması beklenen veri listesi formu controller tarafında açılınca (gerçek anlamda açılma değil ama formun oluşması durumunda) kullanıcı seçimi için gerekli işlemleri yapması için çağrılır.

Controller sınıflarında bulunan lookup_ metodları iki parametre alır. İlki açılması beklenen forma ait controller id değeri - ki bu değer formun adına karşılık gelir, Örneğin MMXFItemBrowser.jfm - ikincisi ise bu arayüzü gerçekleştiren ve açılacak veri listesi formundan seçimi yapması beklenen nesnedir. Örnek bir kullanım şöyle olur:

MMXFItemController item = (MMXFItemController) controller;
item.setDescription("Item for controllertest");
item.lookup_UnitSet("MMXFUnitSetBrowser.jfm", new ILbsControllerLookupHandler()
{
       public void lookupControllerOpened(IClientContext context, ILbsController lookupController) throws Exception
       {
             if (lookupController instanceof MMXFUnitSetBrowserController)
             {
                    MMXFUnitSetBrowserController unitSets =(MMXFUnitSetBrowserController) lookupController;
                    UnitSets_Grid100SearchParams params2 =unitSets.getUnitSets_Grid100SearchParams();
                    params2.setCode("07");
                    QueryBusinessObjects sets = params2.search();
                    if (sets.size() = = 1)
                    {
                           unitSets.selectGrid100Row(0);
                           unitSets.clickSelect();
                    }
                    else
                           unitSets.clickClose();
             }
       }
});

Bu örnekte malzeme editör formunda birim seti seçimi örnekleniyor. Birim seti seçimi metoduna ilgili birim setini seçecek bir sınıf yollanıyor. Bu sınıfın lookupControllerOpened metodunda açılmış olan forma ait controller eğer birim seti veri listesine aitse, bu controller üzerinden kodu "07" ye eşit olan birim seti arama ile bulunmaya çalışılıyor. Eğer kodu "07" olan birim seti bulunabilirse bu kayıt seçiliyor ve veri listesi formundaki "Select" tuşuna basılarak formun kapanıp seçimin yapılması bekleniyor. Eğer kayıt bulunamazsa form "Close" tuşuna basılarak kapatılıyor.

Lookup kullanımına çok benzeyen bir diğer kullanım kayıt türü seçerek yeni kayıt ekleme işlemidir. Burada da ilgili metod createNewObjectWithType adındaki metoddur. Bu metod da yeni kayıt ekleme işlemi öncesi tür seçimi için açılan veri listesi formundan seçim yapılıp işlemin öyle devam etmesini sağlar. Örnek bir kullanım şöyle olur:

FIXFARPSlipBrowserControllerarpSlips = (FIXFARPSlipBrowserController) controller;
controller = arpSlips.createNewObjectWithType("SSXFVTOutlinesBrowser.jfm", new ILbsControllerLookupHandler()
{
       public void lookupControllerOpened(IClientContext context, ILbsController lookupController) throws Exception
       {
             if(lookupController instanceof SSXFVTOutlinesBrowserController)
             {
                    SSXFVTOutlinesBrowserController typeBrowser =(SSXFVTOutlinesBrowserController) lookupController;
                    SSXFVTOutlinesBrowser_Grid100SearchParams params = typeBrowser.getSSXFVTOutlinesBrowser_Grid100SearchParams();
                    params.setCode("CARI1");
                    params.search();
                    if(typeBrowser.getVisibleRowCountGrid100()= = 1)
                    {
                           typeBrowser.selectGrid100Row(0);
                           typeBrowser.clickSelect();
                    }
                    else
                           throw new Exception("Could not find arpslip type!");
             }
       }
}); 

Bu örnek de bir önceki örnek gibi tür veri listesi formunun açılması durumunda kodu "CARI1" olan tür kaydını bulup seçimi yapmaya çalışıyor. Bu durumda kayıt bulunamazsa işlem devam edemeyeceği için bir hata atılıyor.

Mesaj Kullanımı

Kullanıcı arayüzünde bazı uyarı ve hata durumlarında veya kullanıcıdan bir seçenek seçmesini bekleyen mesajlar gösterilebilir. Uyarı ve hata durumlarında mesaj diyaloğunda sadece "Tamam" tuşu bulunur ve bu durumlar kullanıcı etkileşimi olmadığı durumda daha kolay halledilebilir. Örneğin hata mesajı çıkan yerlerde kodda da hata atmak (Exception) ve işlemi durdurmak genel bir çözüm olabilir. Ama kullanıcıdan bir seçim bekleyen mesajlarda, ki bu mesajlar her nesne silme işleminde sorulur, kullanıcının hangi seçeneği seçeceği kullanıcı etkileşimi olmayan ortamda çözüm bekleyen bir sorundur. Bu sorunun çözümü kapsamında ürün içinden çıkabilecek her mesaj bu mesajı çıkaran formun tanımında listelenir. Böylece her formun kullanıcıya hangi mesajları gösterdiği daha tanım aşamasında bilinir. Bu mesajlar için controller sınıflarında birer mesaj tanım sabiti oluşturulur. Her mesaj tanım sabitinde, mesaja ait anahtar (id), mesajın başlığı, mesajın içeriği, türü (hata, uyarı, seçenek gibi) ve mesaj diyaloğunda gösterilen seçenekler bulunur. Böylece kullanıcı controller sınıfına bakarak bu formun, işleyiş sırasında hangi mesajları görüntüleyebileceğini öğrenmiş olur. Örnek mesaj sabitleri şöyle olur:

public static final Message DATA_SAVE_FAILED = new ErrorMessage("DATA_SAVE_FAILED", "null", "Operationfailed.", new int[] {BUT_OK}, BUT_OK);
public static final Message CONFIRM_DATA_DELETE = new SelectionMessage("CONFIRM_DATA_DELETE", "null", "Delete thisrecord?", new int[] {BUT_CANCEL, BUT_OK}, BUT_CANCEL);

Burada görüldüğü gibi mesajla ilgili tüm bilgiler bu sabitler üzerinde bulunur.

Lookup konusunda olduğu gibi mesaj kullanımında da kullanıcı etkileşimi olmadığı durumlarda hangi mesaj durumunda ne yapılacağının koddan belirtilmesi gerekir. Bunu yapabilmek için LbsControllerRegistry sınıfındaki mesajla ilgili yardımcı metodlar kullanılır. LbsControllerRegistry sınıfını almak için her controller sınıfında bulunan getControllerRegistry metodu kullanılır. LbsControllerRegistry sınıfı üzerinde bir mesaj işletme nesnesi bulunur. Bu nesne ILbsMessageExecutor arayüzünü gerçekleştirir. Bu arayüz şöyle bir tanıma sahiptir:

public interface ILbsMessageExecutor
{
       public JLbsMessageDialogResult onMessageShow(JLbsMessage sourceMessage);
}

Arayüz üzerindeki tek metoda her mesaj diyaloğu görüntülenmek istenince gelinir ve bu sınıftan beklenen bu mesaja karşılık ne yapılacağını belirlemektir. Bu arayüzü gerçekleştiren sınıf yazıldıktan sonra bu sınıftan bir nesne LbsControllerRegistry üzerine mesaj işletmeni olarak setMessageExecutor metodu ile takılır. Buradaki kullanım, kodu yazan kişinin tasarımına kalmıştır. Örneğin, bir nesne silme işleminden hemen önce sadece nesne silme işlemi sırasında çıkabilecek onay mesajına cevap vermek üzere bir sınıf yaratılıp takılabilir, nesne silme işlemi bitince de bu sınıf sökülebilir.

Altyapı tarafından türü hata olan mesajlar için eğer mesaj işletmen sınıfı takılı değilse otomatik olarak bir hata oluşması sağlanır. Böylece hata durumlarının farkında olmadan yutulması engellenmiş olur. Ama eğer bir mesaj işletmeni takılıysa bu durumda o sınıf ne sonuç dönüyorsa o aynen kullanılır. Örnek bir kullanım şöyle olur:

ILbsController controller = container.getController();
if (controller instanceof WFXFProcessBrowserController)
{
       final WFXFProcessBrowserController processBrowser =(WFXFProcessBrowserController) controller;
       processBrowser.selectGrid100Row(0);
       processBrowser.getControllerRegistry().setMessageExecutor(new ILbsMessageExecutor()
       {
 
             public JLbsMessageDialogResultonMessageShow(JLbsMessage sourceMessage)
             {
                    if (sourceMessage.getId().equals(WFXFProcessBrowserController.CONFIRM_DATA_DELETE.getConstantId()))
                    {
                           JLbsMessageDialogResult result = new JLbsMessageDialogResult();
                           result.button = ILbsMessageConstants.BUT_OK;
                           return result;
                    }
                    throw newLbsControllerRuntimeException("Cannot handle this message: " + sourceMessage);
             }
       });
       processBrowser.clickDelete();
       processBrowser.getControllerRegistry().setMessageExecutor(null); 
}

Bu örnekte görüldüğü gibi nesne silme işleminden hemen önce bir mesaj işletmeni takılıyor ve bu işletmen içinde sadece silme sırasında gelmesi beklenen onay mesajı için işlem yapılıyor, diğer tüm tanınmayan ve beklenmeyen mesajlar için hata üretiliyor. Silme işleminin bitmesiyle bu mesaj işletmeni sökülüyor ki bu noktadan sonra oluşacak mesajlar için etkili olmasın.

Arayüzden Açılan Diğer Formlar

Kullanıcı arayüzünde bazı açılır menülerden ya da tuşlardan başka formlar açılıyor olabilir. Kullanıcı etkileşimi olduğu durumlarda açılan form zaten kullanıcı tarafından görüldüğü için bir sıkıntı oluşmaz. Ama controller kodları çalışırken, hangi seçeneğin ya da tuşun başka bir formu açma ihtimali olduğu bilinmediğinden, lookup'lar ya da mesajlar gibi özel çözümlerin bu noktalara getirilmesi mümkün olmaz. Bu durumda yapılan işlem sonucu başka bir form açılıyorsa ve kullanıcı bunu biliyorsa, açılan bu forma ait controller sınıfını LbsControllerRegistry sınıfından waitForController metodu ile alıp çalışabilir. Örneğin, kayıtlarda durum değiştirme işlemi genellikle durum değişikliği için bir onay arayüz formu açar. Kullanıcının durum değişikliği ile ilgili seçimleri yapıp işlemi onaylaması ile durum değişikliği işlemi gerçekleşir. Bu senaryonun controller kısmında çalışabilmesi için öncelikle controller tarafında durum değişikliği işlemi başlayınca başka bir formun açılacağının, hangi formun açılacağının bilinmesi gerekir. Bundan sonra bu formun açılmasının beklendiği noktada LbsControllerRegistry sınıfındaki waitForController metodu ile bu açılan forma ait controller alınıp, devam edilmelidir. Örnek bir kullanım şöyle olur:

if (itemBrowser.getVisibleRowCountGrid100()> 0)
{
       itemBrowser.selectGrid100Row(0);
       itemBrowser.selectPopup_ChangeStatus();
       controller = itemBrowser.getControllerRegistry().waitForController("MMXFItemStateChange.jfm");
       if (controller instanceof MMXFItemStateChangeController)
       {
             ((MMXFItemStateChangeController) controller).clickOK();
       }
       itemBrowser.refreshGrid100();
} 

Bu örnekte görüldüğü gibi malzeme veri listesi formunda durum değişikliği açılır menü seçeneği seçilince başka bir formun açılması bekleniyor. Açılması beklenen bu form "MMXFItemStateChange.jfm" formu, ve bu forma ait controller LbsControllerRegistry üzerinden alınmaya çalışılıyor. Eğer bu form açılmazsa, ya da başka bir form açılırsa waitForController metodu bir hata atar ve işlem devam edemez.

Veri Kayıt İşlemini Dinleme

Emulating controller kodları ile yapılan veri kaydetme işlemleri sonucu yapılması istenen belli işlemler varsa bu veri kaydetme işlemleri bir listener arayüz ile dinlenebilir. Arayüz şöyledir:

public interface ILbsControllerDataListener
{
       public void formDataSaved(ILbsController controller, int savedPrimaryKey);
} 

Bu arayüzdeki tek metoda herhangi bir veri kayıt işlemi sonucu kaydedilen veriye ait birincil anahtar değeri ile gelinir. Metodun ilk parametresi olan controller nesnesi veri kayıt işleminin gerçekleştiği forma aittir. Bu arayüz de mesaj dinleme arayüzü gibi LbsControllerRegistry üzerine setDataListener metodu ile takılır. Bu arayüzü kullanırken dikkat edilmesi gereken nokta, bu arayüzün tüm veri kayıt işlemleri sonucu çağrılacağıdır.

Page viewed 3662 times by 5 users since Dec 04, 2015

Telif HakkıKullanım KoşullarıGizlilik
Copyright © 2018 Logo Yazılım