Menu

16 Haziran 2010 Çarşamba

ResultSet`i List`e cevirme

List al = new ArrayList();
ResultSet rs = stmt.executeQuery("SELECT userid, username FROM USER");
while (rs.next()) {
   int i = rs.getInt("userid");
  String str = rs.getString("username");
  User user = new User(i, str);
  al.add(user);
}

Application Express (APEX) Nedir, APEX`in Ozellikleri ve kullanim alanlari

  • Application Express (APEX), eski adı HTML-DB olan ve Oracle veritabanı üzerinde çalışan hızlı uygulama geliştirme aracıdır
  • APEX, web tabanlı uygulama geliştirmek için tasarlanmış, web tabanlı çalışan bir üründür
  • APEX uygulamalarını kullanabilmek için istemci (client) tarafına kurulması gereken herhangi bir program yoktur
  • APEX, Oracle tarafından sürekli geliştirilen ve yenilenen bir platformdur
APEX Özellikleri   
  • APEX’in çalışabilmesi için herhangi bir Application Server kurulumuna ihtiyaç yoktur
  • SQL, PL/SQL, HTML, CSS gibi bilinen teknolojiler aynı framework içerisinde birleştirilmiştir
  • APEX uygulamalarıyla ilgili tüm bilgiler veritabanında tutulur, başka bir kaynak kod üretimi söz konusu değildir
  • Application Builder - Dinamik uygulama geliştirme aracı 
  • SQL Workshop - Veritabanı yapılarını inceleme, SQL sorguları oluşturma aracı 
  • Utilities - Yardımcı uygulamalar 
  • Raporlar ( SQL sorguları , SQL dönen fonksiyonlar )        
  • Bilgi Giriş Formları 
  1. Tablo, view yada prosedür üzerine formlar
  2. Çoklu güncelleme formları 
  3. Master-detail formlar 
  4. Web service formları 
  5. Pop up formlar 
  • Grafikler 
  • Takvimler 
  • Güvenlik
  1. LDAP bağlantısı 
  2. Single sign-on
  3. Veritabanı kullanıcı 
  4. Apex kullanıcısı 
  5. Her objeye güvenlik şeması atayabilme
  • Navigasyon - Tab, listeler, ağaç görünümü, breadcrumbs
  • Oracle 9.2.0.3 verisyonundan itibaren tüm Oracle veritabanı versiyonları tarafından desteklenir
  • Ücretsiz bir versiyon olan OracleXE veritabanı üzerinde tam uyumlulukla çalışır

APEX Kullanım Alanları               
  •  Veritabanı merkezli uygalamalarınız varsa
  • Genel olarak SQL veya PL/SQL bilginiz varsa
  • Çok derin programlama bilgisine ihtiyaç duymadan belirli özelliklerde web uygulaması yapmak istiyorsanız, 
  • MS Access veya MS Excel’de yaptığınız işleri merkezi bir uygulamaya taşımak istiyorsanız, 
  • Dünya çapında yaygın kullanım alanına sahiptir. Büyük ölçekte projelerin gerçekleştirildiği sektörler
  1. Kamu - Otomotiv - Telekom - Bilimsel Arastirma    

Oracle Application Express’e Dışarıdan Ulaşma(Remote Access)

Bu işlemi yapmadan önce yapılacaklar:
-Windows Servislerinden OracleXETNSListener ı kapatıyoruz.
-Çalışan herhangi bir tarayıcı ekranı var ise onları da kapatıyoruz(ki neden çıktığını anlamadığınız bir sorunla karşılaşmayın. Bazen işlem düzgün çalışsa da tarayıcı kapatılıp açılmadığından sayfaya erişilemiyor hatası çıkıyor.)

Oracle Application Express 3.0.1(önceki versiyonlarda da geçerli) de dışarıdan ulaşmak için başlat->çalıştır’dan cmd yazıp command prompt a giriyoruz. Command prompta:
sqlplus system/sifreniz
yazıp sqlplus’a system olarak bağlanıyoruz. Buradan sonra aşağıdaki komutu çalıştırıyoruz:
exec dbms_xdb.setListenerLocalAccess(l_access => FALSE);

Servislerden OracleXETNSListener ı açıyoruz.

Bundan sonra hangi ip yi aldıysak örneğin http://192.168.2.1:8080/apex yazıp application express’e bağlanıyoruz. Eğer bilgisayar adı tanımlanmışsa aynı şekilde ağ içerisinde örneğin http://ertugrul:8080/apex yazıp da bağlanabilirsiniz.

Eğer uzaktan bağlantı erişimini engellemek istiyorsak:
exec dbms_xdb.setListenerLocalAccess(l_access => TRUE);
yazarak tekrar sadece localhost tan erişime açık hale getirebiliyoruz.

Hepsi bu kadar.

12 Haziran 2010 Cumartesi

Report Parser

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReportParser {

    private Properties fileTable;
    private String reportDirectory;

    public ReportParser(File file, String reportDirectory) throws Exception {

        this.reportDirectory = reportDirectory;
        if (this.reportDirectory == null) {
            this.reportDirectory = file.getParent();
        }
        fileTable = new Properties();
        parse(file);

        fileTable.store(new FileOutputStream(this.reportDirectory + file.separator + "main.xml"), "Report table");
    }

    private String convertToFullName(String directory, String fileName) {
        if (!fileName.contains(File.separator)) {
            fileName = directory + File.separator + fileName;
        }
        return fileName;
    }

    public void parse() {
    }

    public void parse(File file) throws Exception {

        if (fileTable.getProperty(file.getName()) != null) {
            return;
        }

        fileTable.setProperty(file.getName(), UUID.randomUUID().toString().replaceAll("-", ""));

        Document doc = getDocument(file);

        NodeList imgList = doc.getElementsByTagName("imageExpression");

        for (int i = 0; i < imgList.getLength(); i++) {
            Node imgNode = imgList.item(i);
            String fileName = imgNode.getTextContent().replaceAll("\"", "");
            fileName = convertToFullName(file.getParent(), fileName);
            String value = fileTable.getProperty(fileName);
            if (value == null) {
                value = UUID.randomUUID().toString().replaceAll("-", "");
                fileTable.setProperty(fileName, value);
                imgNode.getFirstChild().setNodeValue(value);
                writeImage(fileName, convertToFullName(reportDirectory, value));
            }
        }

        NodeList subReportList = doc.getElementsByTagName("subreportExpression");

        for (int i = 0; i < subReportList.getLength(); i++) {
            Node subReportNode = subReportList.item(i);
            String fileName = subReportNode.getFirstChild().getNodeValue().replaceAll("\"", "").replaceAll(".jasper", ".jrxml");
            fileName = convertToFullName(file.getParent(), fileName);
            String value = fileTable.getProperty(fileName);
            if (value == null) {
                parse(new File(fileName));
                subReportNode.getFirstChild().setNodeValue(value);
            }
        }
        writeDocument(doc, convertToFullName(this.reportDirectory, fileTable.getProperty(file.getName())));
    }

    public Properties getFileTable() {
        return fileTable;
    }

    public void setFileTable(Properties fileTable) {
        this.fileTable = fileTable;
    }

    public void writeDocument(Document document, String file) {
        try {
            XMLSerializer serializer = new XMLSerializer();
            serializer.setOutputCharStream(
                    new java.io.FileWriter(file));
            serializer.serialize(document);
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
    }

    private Document getDocument(File xmlFile) throws Exception {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(xmlFile);
        doc.getDocumentElement().normalize();
        return doc;
    }

    private void writeImage(String fileName, String value) {
        FileInputStream fin = null;
        try {
            fin = new FileInputStream(fileName);
            byte[] buf = new byte[fin.available()];
            fin.read(buf);
            fin.close();
            FileOutputStream fout = new FileOutputStream(value);
            fout.write(buf);
            fout.close();
        } catch (IOException ex) {
            Logger.getLogger(ReportParser.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

11 Haziran 2010 Cuma

Ireport uzerinde SubReport olusturma ve kullanma

Bu yazimizda Ireport uzerinde subreport kullanimini, bir rapor uzerine subreport`un nasil eklendigi uygulamali bi sekilde yapmaya calisacaz..

Ben NetBean uzerindeki daha onceden JavaDB (Derby) ile baglanti kurdugum source kullanacam..

Oncelikle bize gerekli olacak tablolari yaratma ile baslayalim, ve tablolar uzerindeki iliskileri belirtelim..

CREATE TABLE alumnos (            
                ID integer NOT NULL,               
                NOMBRE varchar(100) NOT NULL,         
                CLAVE varchar(100) NOT NULL,       
                PRIMARY KEY  (ID)                     
              )

Ikinci Tablomuz..

CREATE TABLE materias (            
                ID integer NOT NULL,               
                NOMBRE VARCHAR(100) NOT NULL,         
                PRIMARY KEY  (ID)                     
              )

 Tablolar arasinda iliskileri gosterdigimiz yardimci tablomuz


CREATE TABLE alumnos_materias (
    ALUMNO_ID integer NOT NULL, 
    MATERIA_ID integer NOT NULL, 
     PRIMARY KEY (ALUMNO_ID, MATERIA_ID),

    FOREIGN KEY (ALUMNO_ID) REFERENCES alumnos (ID),
    FOREIGN KEY (MATERIA_ID) REFERENCES materias (ID) 
)

Simdide, tablolarimiza veriler ekleyelim..


INSERT INTO alumnos VALUES (1, 'Alumno 1', '00001');
INSERT INTO alumnos VALUES (2, 'Alumno 2', '00002');
INSERT INTO alumnos VALUES (3, 'Alumno 3', '00003');
INSERT INTO alumnos VALUES (4, 'Alumno 4', '00004');
INSERT INTO alumnos VALUES (5, 'Alumno 5', '00005');
INSERT INTO alumnos VALUES (6, 'Alumno 6', '00006');
INSERT INTO alumnos VALUES (7, 'Alumno 7', '00007');
INSERT INTO alumnos VALUES (8, 'Alumno 8', '00008');
INSERT INTO alumnos VALUES (9, 'Alumno 9', '00009');
INSERT INTO alumnos VALUES (10, 'Alumno 10', '000010');


INSERT INTO materias VALUES (1, 'Matematicas');
INSERT INTO materias VALUES (2, 'Fisica');
INSERT INTO materias VALUES (3, 'Quimica');
INSERT INTO materias VALUES (4, 'Biologia');
INSERT INTO materias VALUES (5, 'Historia');
INSERT INTO materias VALUES (6, 'Geografia');


INSERT INTO alumnos_materias VALUES (1, 1);
INSERT INTO alumnos_materias VALUES (1, 3);
INSERT INTO alumnos_materias VALUES (1, 5);

INSERT INTO alumnos_materias VALUES (2, 1);
INSERT INTO alumnos_materias VALUES (2, 2);
INSERT INTO alumnos_materias VALUES (2, 3);

INSERT INTO alumnos_materias VALUES (3, 2);
INSERT INTO alumnos_materias VALUES (3, 4);
INSERT INTO alumnos_materias VALUES (3, 6);

INSERT INTO alumnos_materias VALUES (4, 4);
INSERT INTO alumnos_materias VALUES (4, 5);
INSERT INTO alumnos_materias VALUES (4, 6);

INSERT INTO alumnos_materias VALUES (5, 1);
INSERT INTO alumnos_materias VALUES (5, 4);
INSERT INTO alumnos_materias VALUES (5, 5);

INSERT INTO alumnos_materias VALUES (6, 2);
INSERT INTO alumnos_materias VALUES (6, 5);
INSERT INTO alumnos_materias VALUES (6, 6);

INSERT INTO alumnos_materias VALUES (7, 1);
INSERT INTO alumnos_materias VALUES (7, 3);
INSERT INTO alumnos_materias VALUES (7, 5);

INSERT INTO alumnos_materias VALUES (8, 1);
INSERT INTO alumnos_materias VALUES (8, 2);
INSERT INTO alumnos_materias VALUES (8, 3);

INSERT INTO alumnos_materias VALUES (9, 2);
INSERT INTO alumnos_materias VALUES (9, 4);
INSERT INTO alumnos_materias VALUES (9, 6);

INSERT INTO alumnos_materias VALUES (10, 4);
INSERT INTO alumnos_materias VALUES (10, 5);
INSERT INTO alumnos_materias VALUES (10, 6);

Bir şeye karar vermeden önce 2 defa düşünün!

Bir şeyde çok iyi ol. O “şey” seni değerli kılacak

Özürlü sekiz çocuğu olan ve frengi hastası hamile bir kadına rastlasaydınız, ona kürtaj olmasını tavsiye eder miydiniz?

Yanıtladıktan sonra aşağıdaki soruları yanıtlayın.
Şimdi bir dünya lideri seçme zamanı ve sizin oyunuz da sonucu etkileyecek.
Işte üç aday hakkındaki gerçekler:
1. aday: Sahtekar siyasetçilerle işbirliği içinde ve falcılara danışıyor.
Iki metresi olmuş. Paket paket sigara ve günde 8 ile 10 bardak martini içiyor.
2. aday: İki kere işten atılmış, öğlene kadar uyur. Üniversitedeyken uyuşturucu kullanmış ve her gece 1 litre viski içiyor.
3. aday: Madalya almış bir savaş kahramanı, vejeteryan, sigara içmiyor.
Nadiren bira içer ve evlilik dışı hiçbir ilişkisi olmamış.
Tercihiniz bu adaylardan hangisi olurdu?
Önce karar verin, kopya çekmek yok, daha sonra aşağıdaki yanıta bakın lütfen!
1. aday: Franklin D. Roosevelt
2. aday: Winston Churchill
3. aday: Adolf Hitler
ve bu arada…
Kürtaj sorusuna eğer evet dediyseniz, Beethoven’i öldürdünüz!
JRXML file parsing ve Zip file olusturma

import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ReadXMLFile_bak {

    public static String directory;
    public static String fXmlFile;
    public static String ZipedFileName;

    public static void main(String argv[]) throws Exception {
        ReadXMLFile_bak mLFile = new ReadXMLFile_bak();
        mLFile.zippedJRXML();

    }

    public void zippedJRXML() throws Exception {
        NodeList nList = getDocument().getElementsByTagName("jasperReport");
        for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                List files = new ArrayList();
                files.add(fXmlFile);
                files.addAll(getSubReportList(nNode));
                files.addAll(getImageList(nNode));
                createZip(files);
            }
        }
    }

    private List getSubReportList(Node node) {
        Element eElement = (Element) node;
        List subReps = new ArrayList();
        for (String sb : getTagValue("subreportExpression", eElement)) {
            sb = sb.substring(1, sb.length() - 1);
            if (!sb.contains("\\")) {
                subReps.add(directory + sb);
                System.out.println("subReps : " + directory + sb);
            } else {
                subReps.add(sb);
            }
        }
        return subReps;
    }

    private List getImageList(Node node) {
        Element eElement = (Element) node;
        List images = new ArrayList();
        for (String sb : getTagValue("imageExpression", eElement)) {
            sb = sb.substring(1, sb.length() - 1);
            if (!sb.contains("\\")) {
                images.add(directory + sb);
            } else {
                images.add(sb);
            }
        }
        return images;
    }

    private List getTagValue(String sTag, Element eElement) {
        int size = eElement.getElementsByTagName(sTag).getLength();
        List list = new ArrayList();
        for (int i = 0; i < size; i++) {
            NodeList nlList = eElement.getElementsByTagName(sTag).item(i).getChildNodes();
            Node nValue = (Node) nlList.item(0);
            list.add(nValue.getNodeValue());
        }
        return list;
    }

    private void createZip(List files) throws Exception {
        FileOutputStream outputFile = new FileOutputStream(ZipedFileName);
        ZipOutputStream zipFile = new ZipOutputStream(outputFile);
        byte[] buffer = new byte[1024];
        for (int i = 0; i < files.size(); i++) {
            FileInputStream inFile = new FileInputStream(files.get(i));
            zipFile.putNextEntry(new ZipEntry(files.get(i)));
            int length;
            while ((length = inFile.read(buffer)) > 0) {
                zipFile.write(buffer, 0, length);
            }
            zipFile.closeEntry();
            inFile.close();

        }
        System.out.println(".....Created ZIP file Successfully.....");
        zipFile.close();
    }

    private Document getDocument() throws Exception {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();
        return doc;
    }
}

8 Haziran 2010 Salı

Object Kelimesinin Seçilmesi

Kelimeler hiç şüphesiz düşüncelerimizi, hayal dünyamızı, algılarımızı şekillendiriyor. Fikir dünyamız için yeni açılımlar getirmede kolaylaştırıcı bir rol de üstlenebiliyorlar, veya tam tersine düşüncelerimiz önünde zaman zaman engel de olabiliyorlar. Bilişim teknolojilerindeki yabancı terimlere bire bir sözlük karşılıkları bulunmasından pek memnun olmadığımı belirtmek istiyorum. Endişem bu sözlük karşılıklarının üzerinde çalıştığımız alanla ilgili kavram, olgu ve diğer yapıları tam manası ile aktarmada zayıf kalmalarıdır.

Aşağıda 2003 yılında Harezmi Yahoo grubunda yayımlanmış bir mesajdan bir bölüm var. Mesajın sahibi Naci Akkök. Halen Norveç Oslo Üniversitesi'nde öğretim görevlisi. Nesneye dayalı programlama ile ilgili kavramları mümkün olduğunca sağlıklı ve kayıpsız biçimde insanlar arasında paylaşabilmek için object teriminin nasıl tercih edildiği ile ilgili çok inginç bir örnek olduğunu düşünüyorum.

Ben Kristen Nygaard'un önce ögrencisi sayilirim. Simdi "Simula" müzesine kaldirilan bir kara (aslinda esil) tahtamiz vardi, onun önünde böyle seyleri günlerce tartisirdik. Nesne object gibi ama "material" olma özelligini ima ediyor. Object kelimesinin arkasinda yatan orijinal fikir "individual" ve "identifiable" olmasi idi, ama terimin bilincli bir sekilde "ting" olarak secilmemesinin ana nedeni kavramlari kapsamamasi idi. Bir de object'in "process" (sürec, sadece aktivite tanimi) kavramina kontrast olarak secildigini de hatirlamak gerekir. Kristen Nygaard'un Ole Johan Dahl (yani Simula ve OO kavramlarinin "formalisti") ile tartismalarindan su cümleyi cok iyi hatirliyorum: Bu "sey" hem fiziki hem kavramsal seyleri temsil edebilmeli. Kendisi sürec'e alternatif olmali ama bir süreci de temsil edebilmeli. Ingilizcedeki tanimimiz "a structural and behavioral representation of a conceptual or physical entity, identifiable as a separate individual entity".

Hatta "object" kelimesinin (ki Norveccesi de ayni, Objekt) seciminde bir bireye "odaklanma" (focus) yan anlami da önemli: Programlama (ki o zaman Simula ve OO sadece simulasyon programlamak icin düsünülüyordu) cevreyi kavramsallastirmak, modellemek ile baslar, ve bu modelde nelere odaklanacak, neler model disi birkilacak bu da cok önemli (denirdi). Dolayisiyla objekt'ler model üniteleri olarak da "object of attention", yani secilip üzerine odaklanan objectler olarak da düsünülürdü. Ayrica "object"in "subject"ten faki, yani kavramsal da olsa "dissal" bir seyin temsili oldugu da kelimenin seciminde rol oynadi. Tabii daha benim bildigim ve nbilmedigim 1000 cesit tartisma oldu bu konuda, ama sanirim tartismalarin tarzinda modelleme ünitesinin özellikleri yatiyordu hep. Bunlar felsefi (ve tarihi) tartismalar belki ama tartismalarin altinda dilin ne derece düsünmeye yardimci olabilecegi veya engelleyebilecegi hipotezi yatiyor (Sapir-Whorf thesis).

Nesne bu kavramlari temsil ediyormu (kognitif olarak, yani otomatik bunu mu algiliyor insanlar "nesne" kelimesini duyduklarinda)? Degilse, bu kavramlari toplayan ve "icgüdüsel" temsil eden Türkce kelime nedir? Object'in Türkce cevirsindeki tartismalara aranizda sahit olan varmi? Bilmek isterdim.

Naci Akkök 29.08.2003


Evet, sahiden biz yabancı terimlere Türkçe karşılıklar bulurken bu değerlendirmeleri yapıyor muyuz?

1 Mayıs 2010 Cumartesi

Java ile Dosya indirme

import java.io.*;
import java.net.*;
import javax.swing.JProgressBar;

public class guncelleme implements Runnable{
private int dosyaBoyutu = 0;
private OutputStream output = null;
private URLConnection UrlBaglanti = null;
private InputStream input = null;
private JProgressBar statusBar = null;
private volatile Thread proc = null;

public guncelleme(String urlbaglanti, String kayitYolu,JProgressBar progresBar){
//Burda internet adresine bağlantı sağlanıyor. Dosya okunuyor ve yazılıyor.
proc = new Thread(this);
try {
URL UrlLoc = new URL(urlbaglanti);
output = new BufferedOutputStream(new FileOutputStream(kayitYolu));
UrlBaglanti = UrlLoc.openConnection();
input =UrlBaglanti.getInputStream();
//İnternetteki dosyanın boyutu alınıyor ve JprogressBar'a aktarılıyor.
dosyaBoyutu = UrlBaglanti.getContentLength();
statusBar = progresBar;

} catch (Exception exception) {
System.out.println("Dosya alınamadı veya kaydedilemedi !");
}
// Herzaman indirilmeden sonra başlatılmalı.
proc.start();

}


public void run() {

}
//Bu metodu kullanarak ağacı ve indirmeyi durduruyoruz.
public void IndirmeyiDurdur(){
proc.interrupt();
}

public void Indir(){
try {
byte[] yaz = new byte[4096];
int bytesOku;
long bytesYaz = 0;
// JprogressBarın ayarları
statusBar.setMinimum(0);
statusBar.setMaximum(dosyaBoyutu);
statusBar.setValue(0);
statusBar.setStringPainted(true);
//Verinin çıktısına bakılıyor ve hardiske yazılıyor.
while((bytesOku = input.read(yaz)) != -1){
output.write(yaz, 0, bytesOku);
//Veri şuan yazılıyor.
bytesYaz += bytesOku;
//Anlık olarak progresBara indirilbe bilgisi yolluyor.
statusBar.setValue((int)bytesYaz);
}
//İnput ve output değerleri temizleniyor.
input.close();
output.close();
} catch (Exception exception) {
System.out.println("Dosya yazılamadı !");
}

}

}

31 Mart 2010 Çarşamba

Jsf 2.0 ile custom component olusturma

Makalemizde Jsf 2.0 ile custom component`lerin nasil olusturuldugu orneklerle beraber uygulamali olarak paylasmaya calisacam. Jsf `in 2.0`dan onceki surumlerinde de custom component olusturabiliyorduk ancak JSF2 ve facelets ile birlikte bu konu cok daha rahat bi sekilde hazirlanabiliyor. Bi sonraki yazimda, jsf2 ile gelen ozelliklerinden ve jsf2 ile eski surumlerin karsilastirilmasindan bahsedecem.

Simdi konumuza donersek, custom componentleri hangi durumlarda olusturuz, neden bole biseye ihtiyac duyariz derseniz, jsf`nin kendi componentlerinin yeterli olmadigi durumlarda, uygulamalarimiz icin kendi componentlerimizi olustururuz mesala bi ornek vermek gerekirse, h:datatable componentinde h:selectOneRadio componenti kullandigimizda cogumuz karsilasmisizdir, birden fazla satir secilebiliyor, ama radio butonlarin ozellikleri grub halinde calismalari ve o grub icinde yanliz birtane secilebilir olmalaridir. Ancak jsf componentinde birden fazla satir secebiliyoruz ve buda bizim hic istemedigimiz bir sonuc ortaya koyuyor, iste tam burada custom componentler yardimimiza kosuyor, ve biz kendi radio buton componentimizi istedigimiz sekilde olusturabiliyoruz. Bu sorunu 3.parti framevorklar kullanarak cozebiliyoruz ancak, onlarda sayfaya fazla bisekilde javascript-ajax atiyorlar. Bizim kendi olusturdugumuzu componentde ise hic bisekilde javascritpte yada ajax`a ihtiyacimiz olmayacak, Konuyu uzatmadan isterseniz hemen, nasil kendi componentlerimizi olusturabiliriz onan bakalim.

Ben uygulamarimda,

NetBeans 6.8 - glassfishv3 - j2ee 6 - jsf 2.0 ve facelets kullandim.

Simdi componentimizi olusturmaya baslayalim.

Bize gerekli olan classlar, SingleRowSelect, SingleRowSelectRenderer, RadioGroup, RadioGroupRenderer,

Simdi bu classlar ne isimize yarayacak,

SingleRowSelect classi bizim componentimizin propertylerinin olacagi class, bi nevi hangi attributelerinin olacagini burada gosteriyoruz, biz burada butun attributeleri tek tek olusturmakdansa var olanin uzerine bize gereken attributeleri ekleyelim, bunun icinde yanliz groupId attributemiz olsa bizim icin yeterli olacak. Classin icersi asagidaki gibi..



package net.aslan.faces.radiobutton;

import javax.faces.component.FacesComponent;


@FacesComponent(value = SingleRowSelect.COMPONENT_TYPE)
public class SingleRowSelect extends javax.faces.component.UIInput {

public static final String COMPONENT_FAMILY = "net.aslan.faces.component";
public static final String COMPONENT_TYPE = "net.aslan.faces.component.radiobutton.SingleRowSelect";
public static final String RENDERER_TYPE = "net.aslan.faces.component.radiobutton.SingleRowSelectRenderer";

public SingleRowSelect() {
super();
setRendererType(RENDERER_TYPE);
}

@Override
public String getFamily() {
return COMPONENT_FAMILY;
}

public void setGroupId(String groupId) {
getStateHelper().put("groupId", groupId);
}

public String getGroupId() {
return (String) getStateHelper().get("groupId");
}
}


Yukarida dikkat edecek olursak, classimizi UInput`dan extends ettik, cunku ayni seyleri tekrardan yazmakdansa bize gerekli olani var olani kullanarak onun uzerine eklemek daha rahat ve kolay olacaktir. UInput classinin icerisini incelemek bize cok fayada saglayacaktir.

Simdi yukaridaki classdaki kodlarin neler yaptigindan biraz bahsedecek olursak,

@FacesComponent, bu ozellikle jsf2 ile birlikte gelen annotationlar ile classin neyapacaginin neturden bi class olduguna karar veriyoruz,

ve classimizi component olarak gosteriyoruz, value` degeri ise componentin bir butun olarak calisacagindan Component_Family belirtiyoruz,

public static final String COMPONENT_FAMILY = "net.aslan.faces.component";
public static final String COMPONENT_TYPE = "net.aslan.faces.component.radiobutton.SingleRowSelect";


kodlarimiz UInput classinin icindede var oldugunda biz bu propertyleri ovveride ediyoruz ve kendi component type`mizi ve family`ini gosteriyoruz, biz ovveride etmeseydik kendisi tanyacakti ama biz ona izin vermiyoruz (UIInput classinin icini incelemenizi tavsiye ederim.)


public SingleRowSelect() {
super();
setRendererType(RENDERER_TYPE);
}


burada ise yapilandiricimizda renderer olacagi classimi set ediyoruz, eger biz set etmesek kendi renderer classini kullanacaktir.

ve son olarak

public void setGroupId(String groupId) {
getStateHelper().put("groupId", groupId);
}

public String getGroupId() {
return (String) getStateHelper().get("groupId");
}




bizim icin gerekli olan attribute`i olusturuyoruz ve stateHelper ekliyoruz, stateHelper Map seklinde calisiyor, setGroupId`de map`a ekliyoruz ve istegimiz zaman getGroupId`de oldugu gibi cagirabiliyoru, StateHelper`i ilerki makalelerde UIInput incelerken gorecegiz.



Bundan sonra bizim icin gerekli olan ve en onemli kisimlardan birisi renderer clasimizi olusturmak. Yani componentimizin nasil davranacagini bu class yardimiyla belirtecegiz..



import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;

@FacesRenderer(componentFamily = SingleRowSelect.COMPONENT_FAMILY, rendererType = SingleRowSelect.RENDERER_TYPE)
public class SingleRowSelectRenderer extends javax.faces.render.Renderer {

@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
SingleRowSelect radio = (SingleRowSelect) component;
String clientId = component.getClientId();
String groupId = radio.getGroupId();
Object selectedItems = null;
RadioButtonGroup group = null;

if (groupId != null) {
group = (RadioButtonGroup) findComponent(radio, groupId);
if (group != null) {
selectedItems = group.getValue();
} else {
}
}

ResponseWriter writer = context.getResponseWriter();
writer.startElement("input", component);
writer.writeAttribute("type", "radio", null);
writer.writeAttribute("id", clientId, null);

if (group != null) {
writer.writeAttribute("name", group.getClientId(), null);
} else {
writer.writeAttribute("name", clientId, null);
}
writer.writeAttribute("value", radio.getValue(), "value");

if (selectedItems != null) {
System.out.println("type is:" + radio.getValue().getClass().getName() + " / value:" + radio.getValue());
}
writer.endElement("input");
}

private UIComponent findComponent(UIComponent comp, String componentId) {
UIComponent parent = comp;
UIComponent found = null;
int i = 1;
while (parent != null) {
found = parent.findComponent(componentId);
if (found != null) {
return found;
}
parent = parent.getParent();
}
return null;
}
}


yukaridaki kod blogumuzu inceleyecek olursak,

@FacesRenderer ile classimizn renderer ozellikde davranacagini belirtiyoruz ve componentFamily ve rendererType`ni gosteriyoruz, ve classimizi Renderer`den extend ediyoruz, bize gerekli olan kisimlari ovveride edip gerekli degisiklikleri yaptiyoruz.

@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {


Renderer classinin encodeEnd metodunu ovveride ettik cunku bizim icin componentimizin en son nasil davranacagini burada belirttik, metodu icinde kullandiklarimiza gelince.

SingleRowSelect radio = (SingleRowSelect) component

-burada componentimizi daha once olusturdugumuz SingleRowSelect custom component`i tipinde olusturduk. Burada kullandigimiz clientId componentimizin clientId`sini aldik, groupId ile`de bizim olusturdugumuz attribute`in degerin aldik. RadioGroup birazdan bizim olusturacagimiz class, bu classida component gibi olusturduk, cunku radiobutonlarimizdaki degerleri grub halinde kullanip radio butondaki degeri Object turunde almak icin.


ResponseWriter writer = context.getResponseWriter();
writer.startElement("input", component);
budan sonraki kisimlarda ise componentimizi hangi propetylerinin oldugunu degerlerin nasil alinacagini gosteriyoruz, bu bolumleri derinlemesi baska bi makalede paylasacagiz.

Ve RadioGroup ve RadioGroupRenderer clasinin yaziyoruz, bu bolumlerin uzerine fazla deyinmeden gececem, makaleyi cok fazla uzatmamak icin, sorusu olan arkadaslara formda yardimci olmaya calisirim.



=============

package net.aslan.faces.radiobutton;


import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.render.FacesRenderer;


@FacesRenderer(componentFamily = RadioButtonGroup.COMPONENT_FAMILY, rendererType = RadioButtonGroup.RENDERER_TYPE)
public class RadioButtonGroupRenderer extends javax.faces.render.Renderer {

public RadioButtonGroupRenderer() {
super();
}

@Override
public void decode(FacesContext context, UIComponent component) {

RadioButtonGroup group = (RadioButtonGroup) component;
String clientId = group.getClientId(context);
Object[] submittedValue = context.getExternalContext().getRequestParameterValuesMap().get(clientId);
group.setSubmittedValue(submittedValue);
}
}


====================

package net.aslan.faces.radiobutton;


import javax.faces.component.FacesComponent;
import javax.faces.component.UIInput;


@FacesComponent(value = RadioButtonGroup.COMPONENT_TYPE)
public class RadioButtonGroup extends UIInput {

public static final String COMPONENT_FAMILY = "net.aslan.faces.component";
public static final String COMPONENT_TYPE = "net.aslan.faces.component.radiobutton.RadioButtonGroup";
public static final String RENDERER_TYPE = "net.aslan.faces.component.checkbox.RadioButtonGroupRenderer";

public RadioButtonGroup() {
super();
setRendererType(RENDERER_TYPE);
}

@Override
public String getFamily() {
return COMPONENT_FAMILY;
}
}


Bizim icin gerekli olanlar classlar bukadar, bunda sonra yapmamiz gereken, componentimiz icin bi taglib olusturmak ve xml`de gostermek, daha sonrada kullanmak :).



Bunda sonra yapacaklarimiz cok kolay, oncelikle taglib`imizi olusturalim.



net-aslan-taglib.xml





http://www.aslan.net/jsf/component


inputRadiobutton

net.aslan.faces.component.radiobutton.SingleRowSelect


radioGroup

net.aslan.faces.component.radiobutton.RadioButtonGroup




sonra web.xml icerisinde gosterelim..



javax.faces.FACELETS_LIBRARIES/WEB-INF/net-aslan-taglib.xml



uygulamadaki dizin yapisi asagidaki sekilde






hepsi bukadar, simdide facelets page`imde kullanmaya basliyalim.


DataBean.java


import accr.beans.Person;
import accr.beans.PersonRemote;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


@ManagedBean
@SessionScoped
public class DataBean implements Serializable {

@EJB
PersonRemote pr;
private Person selectedPerson;
Object selectedItem[];

public List getPersons() {
return pr.findAll();
}

public String actionEdit() {
String id = (String) selectedItem[0];
selectedPerson = pr.getPerson(new Long(id));
System.out.println("Per : " + selectedPerson.getName());
return "edit";
}

public Object[] getSelectedItem() {
return selectedItem;
}

public void setSelectedItem(Object[] selectedItem) {
System.out.println("Set edildi -----=== ");
this.selectedItem = selectedItem;
}

public Person getSelectedPerson() {
return selectedPerson;
}

public void setSelectedPerson(Person selectedPerson) {
this.selectedPerson = selectedPerson;
}
}


index.xhtml



































edit.xhtml






Edit Person











uygulamanin tamamini, proje halinde dosyalar bolunde bulubilirsiniz.

Yorum ve dusuncelerinizi bekliyorum, Faydali olmasi dilegiyle.

Bir sonraki makaledeki, Jsf 2.0 ile gelen yeniliklerden bahsedecegim..

Degiserek gelismenin dilegilyle...



Ertugrul Aslan

R.I.S.K Company

Baku / Azerbaycan

27 Mart 2010 Cumartesi

Java Ile Asal Sayi

Asagidaki ornekde java ile asal sayilarin nasil bulundugu gosteren bi ornegimiz var
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

public static void main(String[] args) throws IOException {
int a;
System.out.println("Kaca kadar olan asal sayılar bulunsun :");
BufferedReader nesne = new BufferedReader(new InputStreamReader(System.in));
int sayı = Integer.parseInt(nesne.readLine());
for (int i = 2; i < sayı; i++) {
a = 1;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
a = 0;
}
}
if (a == 1) {
System.out.println("" + i);
}
}
}
}

2 Şubat 2010 Salı

Ceturk




CETURK JAVA ve Kariyer Günü

CETURK olarak Çankaya Üniversitesi Uygulamalı Matematik Bilgisayar Bilimleri Topluluğu ile birlikte "JAVA ve Kariyer Günü" etkinliği düzenliyoruz. Etkinlik konusu dahilinde JAVA dünyasındaki kariyer olanaklarından bahsedilecek ve etkinlik sonundaki panelimiz ile bilgi alışverişi gerçekleştirilecektir.Etkinliğe katılım ücretsizdir.
1
Konuşmacılar ve Seminer Konuları:
Kadir Teke - Mehmet Gursul : İş İlanlarında Java

Kenan Sevindik : Java, Kariyer ve Gelecek

Mert Çalışkan : Fikrim Açık, Kodum Açık
Ümit Vardar : JavaFX
Adres:

Çankaya Üniversitesi - Mavi Salon
Saat: 12:00 - 17:00

Kayıt işlemi için bu bağlantıyı kullanabilirsiniz.

27 Ocak 2010 Çarşamba

List`i array`a - array`i liste cevirme

Bu yazimizda Collection`lar altinda bulunan List`i array`a ve array`i de liste cevirez. Bir ornek uzerinde gosterecek olursak,

public static void main(String args[]){

Object object[];
List list = new ArrayList();
// simdi listi arraya cevirelim
object = list.toArray();
// simdide array`i liste cevirelim
list = Arrays.asList(object);
}

Hepsi bukadar : )

4 Eylül 2009 Cuma

Jersey Examples

Jersey Nedir?
Ornegimize gecmeden once jersey nedir ondan bahsedelim kisaca.
Jersey, RESTFul web servisin sun tarafindan gelistirilen implementasyonudur. Kullanmak icin yapmamiz gereken cok kucukseyler var. Bunlardan bir tanesi, web.xml icerisinde servlet jersey`in destekledigi servlete tarif etmek, Ama bu servlet bisey istiyoruz bizden, oyle bir class yazacaksiniz ki, resources`leri dahil ettiginiz class applicationu extend etmelidir. O application extend ettikden sonra hangi resources var ise onlari bunun icine yazmalisiniz.. Bunun kolay yolu resourcesi / yapip otomatik aratabiliriz. ornegimizde gorecez.

Example-1
Oncelikle bir tane class yaratip, bunu RESTFul web servis yapalim, RESTFul web servis olmasi icin tek yapmamiz gerekn,
@Path("/helloworld")
annotationu ile gostermemiz.
Simdi classimizin icini doldurmaya baslayalim.

HelloWorld.java

import javax.ws.rs.Path;
import javax.ws.rs.GET

@Path("/helloworld")
public class HelloWorld{

@Path("sayHello")
@GET
@Produces("text/plain")
public String sayHello(){
return "Merhaba Dunya";
}
}


web.xml


3 Eylül 2009 Perşembe

GOALS - NONGOALS(Avantaj-dezavantaj)

Bir onceki makalemizde RESTFul web servislerin ne oldugunda nasil calisdigindan bahsetmisdik, bu makalemizde ise goals-nongoals( avantaj- dezavantaj)`larinda bahsedecegiz.

GOALS(Avantaj)
-POJO-Based;
POJO tabanli olacak, cok fazla complex arayuzler(interface) kullanmaya ihtiyacimiz olmayacak

-HTTPCentric;
Http merkezli olacak, yani baska protocolleri desteklemeyecem cunku basit olmali.

-Format indenpendece;
Formattan bagimsiz olam, yani biz bugun web arayuzleri nasil MIME tipini gosterebliyorsak ayni sekilde kullanabilmek.

-Container indenpendice;
Contanierden bagimsiz olma, (Application server)

-inclusion in Java EE;
JavaEE specifikasyonunu kullanimi


NONGOALS(Dezavantaj)
-support for java version prior to J2Se 5.0;
Yani j2se 5.0`dan onceki surumler desteklenmez.

-Description, registration and discovery;
WSDL, UDDI, vb. kullanilmamasi(tabii bu dezavantajmi :) )

-Client API;
Istemci APIs spesifikasyonu disinda

-data model/format classes;
Yani model bicimden uzak duracagim, Cunku onlari implemente ederken HTTP stock buyuyor.


Terminology
Resource classes;
WebServisi adi altindan uzaklasiyorum, bu yuzden neyi sunuyorsam onun adina resources diyecem.

Root Class;
Root sinifinin uzerinde path olmali, ve bu URL`de olacak.

Request method designator;
Http biz method annotationlarindan hangisini dinleyecegi


Provider
Yani biz MIME tiplerinden bagimsiz bir veri sundugumuz icin, yani MIME tiplerine bagimli olmasin, muhakkak xml olmasin, muhakkak json olamsin vs.
Peki bizim istedigimizi bu MIME tiplerinden hic biri saglamiyor ise, bu durumda provider annaotationu ile providerleri tarife etmemiz gerekiyor. Yani ben sana bir nesne gonderiyorum, bunun icin detaylari kullanmak icin bu provider class`ini kullanmaliyiz.
NOT: Ilerki makalelerde ayrinliti bir sekilde gorecegiz, ve orneklerle anlatmaya calisacagiz
Mesala bir uygulamamiz var, ben buna bir @Path("sirket") annotationu vermisim,
-@Path annotationlarini hem metodlarda, hemde class seviyesinde rahatlikla kullanabiliriz.
Peki hem class`da hem metodda kullanirsak ne olacak? ozmanda, su olacak, once class uzerinde path daha sonra metod uzerindeki path, yani

http://localhost:8080/webapp/resources/sirket/calisan
burada,
webapp - Bizim web.xml icindeki uygulamamizin adi,
resources - Servlet kaynagi
sirket - Bizim classimizin adi
calisan - Sirket class`imizin icindeki metod adi

@Path("sirket")
public class Sirket{

@Path("calisan")
public ..... calisan(){
...
...
}
.....
.....
}

@Path annotaionunlarini metodlarda kullaniyorsam, ozellikle hagi HTTP metoda karsilik geldigini belirtmem gerekiyor. Yani(GET`mi, POST`mu vs.). Biz belirtmezsek, default olarak @GET calisir
Mesala bir metodun
@GET
@Path("message")
public Srting getMessage(String mess){
-- - - - - -- - - -- -
- -- - -- - - - -
}
bu nasil calisacak
Burada en sonda belirtigimiz merhaba dunya, metodumuzun parametre degeri yani mess` deger gondermis oluyoruz. Bunlari ilerki makalelerde cok daha ayrintili bir sekilde gorecegiz
NOT: Bir method birden fazla requesti kabul ediyor olabilir. Yani ayni zamanda hem GET`i hem POST`u kabul ediyor olabilir.

Jersey(RESTFul Web service)

Genel olarak islerimizi insan-makina olarak, yapariz, yani bilgisayarda bi e-posta okuma, gonderme vs. gibi isler. Biz bu isler gibi diger islerimizide makina-makina arasinda yapma sansimiz vardir.? Diye dusundugumuzede iste tam bu noktada RESTful web servisler devreye giriyor. Bunlari kullanirkende, Web servislerdeki butun protocol isteklerini WSDL, UDDI, WDAL, gibi servislere gerek kalmadan yapabilmek icin RESTFul web servislerini kullanabiliriz. Biz web`de kulladigimiz URL ile bir takim verilere ulastigimizda isler gayet guzel isliyor.
Mesala bir url ile bir kaynak belirtip
diye cagirdigimiz zaman sistemde bana o kaynaktaki veriyi cikarip veriyor. Acaba butun bu uygulamalari bu sekilde uygulayabilirmiyiz diye dusundugumuzde iste tam bu noktada RESTFul web servisler devreye giriyor.
Yani ben gidip bir metodu tetiklemeyeyim, yada bir belgeyi burdan gondermeyeyim vs. Ama bir takim metodlarla resourceler(kaynaklar) yaratayim. Web uygulamanin icersinden o kaynaklarada hep URL`lerle yada URI` ler ile erisebileyim.
RESTFul web servisler bu noktada basiliyor, ne oldugu anlasiliyor diyebiliriz. Peki bu oldugunda ne olacak,? Bu oldugunda, aslinda insan maikna arasindaki haberlesme nekadar basitse, yani web`de sorf email okuma vs. Peki benim ayni seyi, makina-makina arasinda yapma sansim varmi? diye cikmis bir protocoldur. Bunu yaparsam, diger WEB serivislerde oldugu gibi,
WSDL, UDDIm vs gibi arabetimler kullanmaya gerek kalmacaktir.
Peki kullanmam icin bana neler lazim ?
1- Birtane URL
2- Bir tane browser, (daha dogrusu browseri dusunmeden tcp uzerinden akan)
bukadar basit yapacagimiz seyler.
Her uygulama icin mutlaka bir URL yaratiriz, bunlari yarattigimizda, zaten http protocolunun icinde 4-5 tane komut var(GET, POST, PUT, DELETE vs.) bunlar vasitasi ile ben islemlerimin cok buyuk kismini %80`i yapabilirim.
Bu makalemiz giris niteliginde bir makeledir. REST ful webservislerin neler oldugundan bahsetmis olduk. Asagidaki linkte RESTFul web servisler icin 50 sayfalik bi pdf dokuman var sun sitesinde, orada daha ayrintili bi sekilde gorebilirsiniz.
Diger dersimizde, avantajlarindn, dezavantajlarinda,vs bahsedecez ve ornek projeler ile daha ayrintili bi sekilde anlatmaya calisacaz, umarim faydali bir yazi olmusdur.

https://jersey.dev.java.net/

1 Eylül 2009 Salı

JAAS (Java Authentication and Authorization Service)

JAAS java uygulamalari icin kimlik dogrulama ve yetkilendirme islemlerini portatif bir sekilde yapilmasini saglayan bir API`dir. JAAS`i kullanarak kendimiz sisteme giris yapmayi ve uyetkilendirmeyi saglayabiliriz. JAAS`i her hangi bir guvenlik sisteminde kullanabiliriz. Ornegin, bir uygulama sunucusu kimlik dogrulamayi bir dosyadan okuyarak yapiyor olabilir. yada bir veritabanindan sorgulatarak yada bir LDAP sunucusuna baglanarak yapiyor olabilir.

JAAS ile bu ortamlara ayak uydurmak hic sorun degil. Cunku JAAS interfacelerle olusur ve siz interfaceleri implemente edersiniz. JAAS ejb guvenliginde siklikla kullanilir. Sun, JAAS`i EJB guvenliginde standart olarak kullanmaktadir.

Genelde JAAS modullerinin kullanimi ile ilgili iki tip senaryo vardir.

-Bir desktop uygulamamiz var ve bu uygulamamiz uzak bir uygulama sunucusuna baglanip sisteme giris yapacaktir. Sisteme giris saglandikdan sonrada sistemde hangi modullere erisip hangi modullere erisemeyecegi belirlenecektir. Bunun icin desktop uygulamamiz JAAS ile kullanicinin giris bilgilerini uygulama sunucusuna iletir. Uygulama sunucusuda bu bilgileri kullanarak sisteme giris gerceklestirip kullanicin rollerini olusturur, Bundan sonraki EJB metodlarinin cagrilmasinda kullanicinin rollerine bakilir.

- Bir web tarayici araciligi ile sisteme giris yapabilirsiniz. Burada kullanicinin giris bilgileri JSP/Servlet `e aktarilir. Jsp/Servlet`de bu bilgileri kullanarak sisteme girisi gerceklestirir. Tarayici giris bilgilerini asagidaki yontemleri kullanarak aktarir.

-Basic authentication

-Form-Based authentication

-Digest authentication

-Certificate authentuication

Dekstop uygulamalari gibi web uygulamasindada sisteme giris gerceklestiginde, istemci EJB metodlarini kullanici yetkileri izin veridigi olcude cagirir.

JAAS`in calisma mantigina bakarsak asagidaki maddeler cikabilir

1- Istemci yeni bir LoginContext nesnesi olusturur. Bu class JAAS tarafindan sunulmustur ve kimlik dogrulama surecinden sorumludur.

2-LoginContext nesnesi bir Configration nesnesi alir, bu nesnedeki kimlik dogrulama isleminin hangi LoginModule ile yapilacagi bildirilir. Ornegin bir sitem kullanici adi ve sifre isterken baska bir sistem hem kulanici adi-sifre hemde certifica bazli dogrulama isteyebilir.

3-LoginContext Configration nesnesine kimlik dogrulama mekanizmalarin neler oldugunu sorar.

4-Configration nesnesi kimlik dogrulamalarindan olusan mekanizmalardan olusan bir liste dondurur. Bu mekanizmalarin her birine LoginModule denmektedir.LoginModule JAAS`in sundugu bir interfacedir. LoginModule kimlik dogrulama isleminin yapildigi birimlerdir.

5-LoginContext LoginModule siniflarindan birer nesne olusturur.

6-LoginContext olusturulan LoginModule nesnelerini iliskilendirir.

7-Istemci kodu LoginContext nesnesi uzerinden login() metodunu cagirir.

8-LoginContext login islemlerini loginModule nesnelerine devreder. Cunku kimlik dogrulama islemlerinin nasil yapilacagini bu moduller bilmektedir.

9-Sizin tarafinizdan yazilmis LoginModule nesneleri kimlik dogrulama islemini gerceklestirir.

10- Islem sonucunu olusturan bilgiler Subject class`indan olusturulmus bir nesnenin icinde saklanir. Bu nesneyi guvenli islemler gerceklestirmek icin kullanirsaniz.

11- Bundan sonra istemci kodu EJB metodlarini cagirir ve sistem giris bilgisi bu metod cagiriminda otomatik olarak iletilir. Boylece uygulama sunucusu ile bu bilgileri kullanarak kimlik dogrulama ve yetkilendirme islemlerini yapar.

Asagida yukaridaki yapinin resim olarak cizilmis halidir.

28 Ağustos 2009 Cuma

XML

Convert XML to XSD
http://www.flame-ware.com/products/xml-2-xsd/default.aspx

XML, XSLT, XSD, JAXB
Bu tutorial da XML hakkında gerekli temel bilgiler verildikten sonra Eclipse de örnek uygulamalar yapılacaktır.

XML Nedir? (Kaynak: İnternet )

XML=eXtensibe Markup Language kelimelerinin baş harflerinden oluşan HTML gibi Markup Language (yani <> tagları kullananılarak hazırlanan ) bir Web programlama ve bilgi transformasyonuna - (uygulamalar ya da sistemler arasında bilgi aktarımı) yarayan bir dildir.

XML verileri(data) tanımlamak için dizayn edilmiştir.

XML tagları HTML deki gibi önceden tanımlanmamıştır. Bu tagları programcı oluşturur. (Örneğin HTML'de <p>(paragraf),<table>(tablo) gibi taglar vardır. Bunlar Browser'ların (örneğin IE) otomatik olarak tanıyabildiği taglardır. Fakat XML de bu tagları kendimiz oluşturuyoruz ve Browser'a tanıtmak (görüntülemek) için XSLT(eXtensible Stylesheet Language) dilini kullanıyoruz.

XSLT Tutorial:

XML verileri tanımlamak için DTD(Document Type Definition) veya XML Schema kullanır.

Örnek olarak aşağıda invoice(fatura) dokümanı olarak kullanılabilecek xml dokümanı var. Burada fatura da yer alan her bir kalem mal/ürün tanımlanmış. Ayrıca faturadaki para birimi ve faturanın ödeme tarihini (due) tanımlanmış.

<?xml version="1.0" encoding="UTF-8"?>
<invoice due="2000-09-22">
<product>
<name>Apple</name>
<price>0.10</price>
</product>
<product>
<name>Orange</name>
<price>0.08</price>
</product>
<product>
<name>Strawberries</name>
<price>0.20</price>
</product>
<product>
<name>Banana</name>
<price>0.14</price>
</product>
<total currency="US$">0.52</total>
</invoice>

XMLSPY isminde xml dokümanları oluşturmak ve xml dokümanları üzerinde çalışmak için güzel bir yazılım var.


XMLSPY indirip kurduktan sonra File – New –XML Document şeklinde bir xml dokümanı oluşturalım. Sonra içine yukarıdaki fatura xml dokümanını kopyalayalım ve deneme.xml olarak kayıt edelim. Sonra Menüde DTD/Schema dan Generate DTD/Schema seçip xml şemasını da oluşturabiliriz. deneme.xsd olarak kayıt edelim. İçeriğini notepad de görüntülediğimizde:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by aa (ORiON) -->
<!--W3C Schema generated by XMLSPY v2004 rel. 4 U (http://www.xmlspy.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="invoice">
<xs:complexType>
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded"/>
<xs:element ref="total"/>
</xs:sequence>
<xs:attribute name="due" type="xs:date" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Apple"/>
<xs:enumeration value="Banana"/>
<xs:enumeration value="Orange"/>
<xs:enumeration value="Strawberries"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="price">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:enumeration value="0.08"/>
<xs:enumeration value="0.10"/>
<xs:enumeration value="0.14"/>
<xs:enumeration value="0.20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="product">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="price"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>

Bu şemayı kullanacak xml dosyası da aşağıdaki şekilde olacaktır.

<?xml version="1.0" encoding="UTF-8"?>
<invoice due="2000-09-22" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:xmldeneme.xsd">
<product>
<name>Apple</name>
<price>0.10</price>
</product>
<product>
<name>Orange</name>
<price>0.08</price>
</product>
<product>
<name>Strawberries</name>
<price>0.20</price>
</product>
<product>
<name>Banana</name>
<price>0.14</price>
</product>
<total currency="US$">0.52</total>
</invoice>

http://www.netbeans.org/ den NetBeans IDE yi indirip herhangi bir proje oluşturduktan sonra xml ve xsd dosyalarımızı açabiliriz. deneme.xsd dosyası tab dan Design tıklandığında aşağıdaki şekilde gösterilmektedir.



Şimdi de fatura dokümanın görüntüsünü tasarlayalım. Faturanın aşağıdaki şekilde görüntülenmesini istiyoruz.


Fatura Bilgileri
Fatura Ödeme Tarihi:

Frame1
Toplam:
Fatura Kur:



Bu fatura dokümanı için XSL dosyasını oluşturmak için NetBeans de ya da XMLSpy da File – New -> XSL şeklinde deneme.xsl oluşturalım. Bu dosyada

Fatura Ödeme Tarihi, Fatura Kur ve Toplam için <xsl:value-of> ini kullanacağız. Detay için bakınız:

Tablo şeklindeki Ürün ve Fiyat için ise <xsl:for-each> elementini kullanacağız. Detay için bakınız:

Fatura Ödeme Tarihi ve Fatura Kur attribute olduğu için @ kullanılarak değerine erişebiliyoruz.


<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : deneme.xsl
Created on : 26 Mart 2008 Çarşamba, 11:54
Author : byazar
Description:
Purpose of transformation follows.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- TODO customize transformation rules
syntax recommendation http://www.w3.org/TR/xslt
-->
<xsl:template match="/">

<html>
<head>
<title>deneme.xsl</title>
</head>
<body>
<H1>Fatura Bilgileri</H1>
<br> Fatura Ödeme Tarihi:
<xsl:value-of select="invoice/@due" />
</br>
<table border="1">
<tr bgcolor="#9acd32">
<th>Ürün</th>
<th>Fiyat</th>
</tr>
<xsl:for-each select="invoice/product">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
</table>
<br> Toplam:<xsl:value-of select="invoice/total"/> </br>
<br> Fatura Kur:<xsl:value-of select="invoice/total/@currency"/> </br>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


XSL Transformation xml dosyasının xsl dosyası kullanılarak görüntülenmesidir diyebiliriz. Dolayısıyla input olarak deneme.xml kullanılacak, transformasyon sırasında ise deneme.xsl kullanarak html, xml, pdf output formatına dönüştürülebilir.

XSL Transformation XMLSPY ile yapabilmek için menüden XSL -> XSL Transformation tıklayarak ve input dosya olarak deneme.xml i seçerek aşağıdaki şekilde dönüştürüyoruz:


NetBeans de dosya üzerinde sağ tuş ile XSL Transformation seçerek aşağıdaki ekranda OK tıkladıktan sonra Browser da dönüştürelen dosyayı (html) görebiliriz.






JAXB
Şimdi işin biraz da kodlama tarafına bakalım;

JAXB API kullanarak XML dokümanlarına kolay bir şekilde erişebiliriz. JAXB dışında da kullanılan librariler mevcut :SAX, DOM, JDOM, and dom4j. Bu API ler dokümanın yapısıyla çok fazla uğraşmak gerektiğinde kullanılması gerekiyor. XML doküman yapısı konusunda uğraşmamız gerekmiyorsa yani xml dokümanindaki verileri okuyup kullanacaksak sadece, bu durumda JAXB kullanmak daha uygun olur.


Yukarıdaki şekilde görüldüğü gibi uygulama xml dokümanını unmarshal ile object e dönüştürecek.

c:\xmldeneme dizini altına deneme.xsd ve deneme.xml i kopyalayalım:

ve aşağıdaki şekilde xjc -p com.ibm.dw deneme.xsd çalıştıralım. Aşağıdaki şekilde dosyaları com.ibm.dw dizini altına oluşacaktır.



Şimdi Eclipse açalım ve File –New- Java Project seçerek XMLProject isminde bir proje oluşturalım. Src de sağ tuş ile File – New -> Java Class dan JAXBDeneme isimli sınıfı com.ibm.dw.main de oluşturalım.


Sürükle bırak ile Eclipse com.ibm.dw daki class ları src dizini altına kopyalayalım.


Şimdi de JAXBDeneme.java dosyasının içeriğini aşağıdaki şekilde değiştirelim:

package com.ibm.dw.main;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;

import com.ibm.dw.*;
import java.io.FileInputStream;


public class JAXBDeneme {

/**
* @param args
*/
public static void main (String args[]) {
try {
String xmlfile = "c:/xmldeneme/deneme.xml";

;
Unmarshaller unmarshaller =null;
Invoice invoice= null;
try {
JAXBContext jaxbContext= JAXBContext.newInstance(new Class[] {com.ibm.dw.Invoice.class});
unmarshaller = jaxbContext.createUnmarshaller();
invoice =(Invoice)
unmarshaller.unmarshal(new FileInputStream(xmlfile));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Fatura Bilgileri") ;
System.out.println("Fatura Tarihi: " + invoice.getDue().toXMLFormat()) ;
System.out.println("Fatura Kur: " + invoice.getTotal().getCurrency()) ;
System.out.println("Fatura Toplam: " + invoice.getTotal().getValue()) ;
System.out.println("Ürünler") ;
for (int i=0;i<invoice.getProduct().size();i++)
{
Product product=invoice.getProduct().get(i);
System.out.println("Ürün Adı: " + product.getName()) ;
System.out.println("Ürün Fiyat: " + product.getPrice().toString()) ;
}
}catch (Exception e ) {
e.printStackTrace();
}
}
}


Şimdi de JAXBDeneme.java dosyasını Run as – Java Application olarak çalıştıralım. Console da output aşağıdaki şekilde olacaktır.




XML ve Veritabanı

XML veri içerdiğinden dolayı veritabanlarında bu verinin XML olarak depolanması gerekebilir. Bu konuda bakınız: