Merhabalar,
Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)
Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.
HeadQuarter.Java
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class HeadQuarter{
private String name = "";
private int size = 0;
private ArrayList<String> rooms = new ArrayList<String>();
private Vector<String> floors = new Vector<String>();
private Date dob = new Date();
private ArrayList<Branch> branch = new ArrayList<Branch>();
public HeadQuarter(String name, int size, ArrayList<String> rooms,
Vector<String> floors, Date dob, ArrayList<Branch> branch) {
super();
this.name = name;
this.size = size;
this.rooms = rooms;
this.floors = floors;
this.dob = dob;
this.branch = branch;
}
public ArrayList<Branch> getBranch() {
return branch;
}
public void setBranch(ArrayList<Branch> branch) {
this.branch = branch;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList<String> getRooms() {
return rooms;
}
public void setRooms(ArrayList<String> rooms) {
this.rooms = rooms;
}
public Vector<String> getFloors() {
return floors;
}
public void setFloors(Vector<String> floors) {
this.floors = floors;
}
public HeadQuarter(){}
}
Branch.java
public class Branch {
private String branchName = "";
private int numberOfWorkers = 0;
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public int getNumberOfWorkers() {
return numberOfWorkers;
}
public void setNumberOfWorkers(int numberOfWorkers) {
this.numberOfWorkers = numberOfWorkers;
}
public Branch(String branchName, int numberOfWorkers) {
super();
this.branchName = branchName;
this.numberOfWorkers = numberOfWorkers;
}
public Branch(){}
}
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branch" type="Branch" collection="arraylist">
<bind-xml name="Branches" node="element"></bind-xml>
</field>
</class>
<class name="Branch">
<map-to xml="Branches"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
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 {
/**
* @param args
* @throws IOException
* @throws ValidationException
* @throws MarshalException
* @throws MappingException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
// TODO Auto-generated method stub
ArrayList<String> rooms1 = new ArrayList<String>();
rooms1.add("firstroom");
rooms1.add("secondroom");
rooms1.add("thirdroom");
Vector<String> floors1 = new Vector<String>();
floors1.add("firstfloor");
floors1.add("secondfloor");
Date dob = new Date(2011,12,22);
ArrayList<Branch> branch = new ArrayList<Branch>();
branch.add(new Branch("Umraniye", 500));
branch.add(new Branch("Maslak", 275));
HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
// Marshalling Starts
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
XMLContext context = new XMLContext();
context.addMapping(mapping);
FileWriter writer = new FileWriter("output.xml");
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
Marshaller marshaller = context.createMarshaller();
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
marshaller.marshal(hq);
// Marshalling ends
// Unmarshalling Starts
FileReader reader = new FileReader("output.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setMapping(mapping);
unmarshaller.setClass(HeadQuarter.class);
HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
// Unmarshalling ends
}
}
Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)
- 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
Şimdilik bu kadar. Esen kalın.,
Hiç yorum yok:
Yorum Gönder