Marshalling Unmarshalling etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Marshalling Unmarshalling etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Temmuz 2011 Perşembe

Mapping Dosyası Olmadan Castor Unmarshalling Operasyonu

Arkadaşlar Merhaba,

Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.

Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,


<anonymous-tag>
        <person>...</person>
        <person>...</person>
</anonymous-tag>

Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.

 Person.Java

import java.util.Date;

public class Person{
    private String name = null;
    private Date dob = null;
    public Person() {
        super();
    }
    public Person(String name) {
        this.setName(name);
    }
    public Person(String name, Date dob) {
        this.setName(name);
        this.setDob(dob);
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setDob(Date dob) {
        this.dob = dob;
    }
    public Date getDob() {
        return dob;
    }
    public String toString(){
        return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
    }  
}


PersonList.Java


public class PersonList {

    public PersonList(int number) {
        super();
        this.person = new Person[number];
    }
    public PersonList() {
        super();
    }
    private Person[] person;
    public Person[] getPerson() {
        return person;
    }
    public void setPerson(Person[] person) {
        this.person = person;
    }
}


Main.Java

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;

public class Main {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException,
        MappingException, MarshalException, ValidationException {

        //
Yeni Person objesi
        Person person = new Person("Emre Gözen");
        person.setDob(new Date(1999, 06, 29, 12, 20));    
        // Yeni Person objesi
        Person person2 = new Person("Emre Gözen1234564");
        person2.setDob(new Date(1999, 06, 29, 12, 20));      
        PersonList personList = new PersonList(2);
        personList.getPerson()[0]=person;
        personList.getPerson()[1]=person2;       
       
        // Marshalling için Writer objesi
        FileWriter writer = new FileWriter("test.xml");
        XMLContext context =  new XMLContext();       
        // Marshaller objesi
        Marshaller marshaller = context.createMarshaller();
        marshaller.setWriter(writer);
        marshaller.setSuppressXSIType(true);
        // Marshalling işlemi
        marshaller.marshal(personList);
      
        // Unmarshalling için Reader
        FileReader reader = new FileReader("test.xml");       
        XMLContext context2 = new XMLContext();
        // Unmarshaller objesi
        Unmarshaller unmarshaller =
        context2.createUnmarshaller();
        unmarshaller.setClass(PersonList.class);       

        // Unmarshalling işlemi       
        PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
       
        // Sonucu ekrana yazdırma
        for (int i = 0; i < 2; i++) {
            System.out.println(personList2.getPerson()[i].getName() + "\n\n");
        }      
    }   
}


Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.

Herkese iyi günler.

27 Temmuz 2011 Çarşamba

Castor Framework Kullanımı (XML Veri Dönüştürme)

Merhabalar,

Uzun süredir yazı yazamıyordum, bugün öğrendiğim önemli bir konuyu yazıya dökmek istedim. Bilindiği üzere, XML, veri aktarma ve depolamada kullanılabilen oldukça yararlı bir format. Bu formatı Javada nesne yönelimli programlamaya uygun olarak kullanmak için ise çeşitlli frameworkler mevcut. Bunlardan biri de Castor dur. Bu frameworkle beraber elimizde bulunan objeleri XML'e aktarıp, daha sonradan bu XML dosyasından geri objeler oluşturabileceğiz.

Castor'un resmi sayfasında hoş bir dökümantasyonu var, bu işle ilgilenecek arkadaşlara tavsiyem bunu da mutlaka okumalarıdır.

Şimdi örnek kodlarda biraz daha ayrıntıya inelim.


Projemizde iki ayrı sınıf olacak, birincisi "Person" sınıfı, kişinin ismini, işini ve favori araba markalarını tutacak, diğeri ise main fonksiyonumuzu barındıran "Main" sınıfı. Bunların yanında, projemizin çalışabilmesi için bazı jar dosyalarını projemize eklememiz gerekiyor.  İsimlerini aşağıya yazıyorum, googlede aratıp indirebilirsiniz.

- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar

Şimdide kodlar:

Öncelikle mapping işlemimiz için gerekli olan mapping.xml

Burada oluşacak xml'in yapısına karar veriliyor.


mapping.xml


<?xml version="1.0"?>

<mapping>
        <class name="Person">
            <map-to xml="Person" />
           
            <field name="name" type="java.lang.String">
                <bind-xml name="name" node="attribute" />
            </field>
            <field name="dob" type="java.util.Date">
                <bind-xml name="dob" node="element" />
            </field>
            <field name="certificates" type="java.lang.String" collection="arraylist">
                <bind-xml name="certificates" node="element" />
            </field>
        </class>
</mapping>


Person.java

import java.util.ArrayList;


public class Person {

    public Person(){}
   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public ArrayList<String> getFavorites() {
        return favorites;
    }

    public void setFavorites(ArrayList<String> favorites) {
        this.favorites = favorites;
    }

    private String name;
    private String job;
    private ArrayList<String> favorites;
   
    public Person(String name,String job,ArrayList<String> favorites){
        this.name = name;
        this.job = job;
        this.favorites = favorites;
    }
    /**
     * @return the String representation of the Person
     */
    public String toString(){
        return "Name: "+this.getName()+"\nJob: "+this.getJob()+"\nFavorites:"+this.getFavorites();
    }
   
}


Main.java


import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;


public class Main {

    /**
     * @param args
     * @throws MappingException
     * @throws IOException
     * @throws ValidationException
     * @throws MarshalException
     */
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException, MappingException, MarshalException, ValidationException {
        // TODO Auto-generated method stub

        ArrayList<String> favorites1 = new ArrayList<String>();
        ArrayList<String> favorites2 = new ArrayList<String>();
        ArrayList<String> favorites3 = new ArrayList<String>();
       
        favorites1.add("Audi");
        favorites2.add("BMW");
        favorites2.add("Mercedes");
        favorites3.add("VW");
        favorites3.add("Ford");
        favorites3.add("Audi");
       
        ArrayList<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Ahmet","Engineer",favorites1));
        personList.add(new Person("Mehmet","Doctor",favorites2));
        personList.add(new Person("Celil","Teacher",favorites3));
       
        // mapping.xml dosyası tanımlaması
        final String MAPPING_FILE = "file:///home/gozenem/workspace/mycastor/mapping.xml";
       
        // Mapping oluşturma
        Mapping mapping = new Mapping();
        mapping.loadMapping(MAPPING_FILE);

        // -------- Marshalling Başlangıcı --------
        // mashhal için Writer oluşturma
        FileWriter writer = new FileWriter("test.xml");

        // formatlama için Serializer oluşturma
        OutputFormat format = new OutputFormat();
        format.setIndenting(true);
        format.setIndent(4);
        XMLSerializer serializer = new XMLSerializer(writer, format);

        // Marshaller oluşturma
        Marshaller marshaller = new Marshaller();
        marshaller.setMapping(mapping);
        marshaller.setSuppressXSIType(true);
        marshaller.setWriter(writer);
        marshaller.setDocumentHandler(serializer.asDocumentHandler());

        // person objesini marshalla
        marshaller.marshal(personList);
       
        // -------- Marshalling bitti --------
       
        // -------- Unmarshalling Başlangıcı --------
        // unmarshalling için reader oluşturma

       ArrayList<Person> personList2 = new ArrayList<Person>();
       
        FileReader reader = new FileReader("test.xml");

        // Unmarshaller oluşturma
        Unmarshaller unmarshaller = new Unmarshaller(ArrayList.class);
        unmarshaller.setMapping(mapping);
        personList2 = (ArrayList<Person>) unmarshaller.unmarshal(reader);
        // -------- Unmarshalling Bitti --------

        // Bilgileri ekrana yazdırma
        for (int i = 0; i < 3; i++) {
            System.out.println(personList2.get(i).toString());
        }

       
       
    }

}


Bu yazıdaki büyük katkısı için Murat Sayılgan arkadaşıma teşekkür ederim. Kolay gelsin.