source: trunk/fmgVen/src/net/fmg/ven/SorguEslestirici.java @ 32

Last change on this file since 32 was 26, checked in by fmguler, 14 years ago

Refs #3 - Ven.save() is transferred to the new package. Save use case is completed. Convert.toDB() converts camel case object names to database names with underscores. Unchecked VenException is thrown by Ven methods. Liquibase changelog (test-db-changelog.xml) is changed to include only a simple object to test save operation. It creates a sample database table and inserts a sample row. On rollback it removes sample data. Using liquibase, Sample.java builds database, tests save operation and rolls back.

QueryGenerator generates insert and update queries for save and generates sequence query to assign ids to new objects. Ven calls query generator and runs the query using spring jdbc template.

Old codebase updated to run at Java 1.4

File size: 6.7 KB
Line 
1/*
2 * SorguEslestirici.java
3 *
4 * Created on December 18, 2006, 10:40 AM
5 * (4.12.06 tarihli SpringDaoDeneme çalışmasından derlenmiştir)
6 *
7 * Ven - Ayar Yerine Gelenek veritabanı erişim nesnesi
8 */
9
10package net.fmg.ven;
11
12import java.beans.PropertyDescriptor;
13import java.sql.ResultSet;
14import java.sql.SQLException;
15import java.util.ArrayList;
16import java.util.Date;
17import java.util.HashMap;
18import java.util.HashSet;
19import java.util.Iterator;
20import java.util.LinkedList;
21import java.util.List;
22import java.util.Map;
23import java.util.Set;
24import net.fmg.ven.arac.Cevir;
25import net.fmg.ven.arac.SinifBildirenLinkedList;
26import org.springframework.beans.BeanWrapper;
27import org.springframework.beans.BeanWrapperImpl;
28import org.springframework.jdbc.core.RowCallbackHandler;
29import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
30
31/**
32 * 'Ayar yerine gelenek' yaklaşımında üretilmiş sorgunun sonucunu belirtilen nesneye eşler
33 * @author Fatih Mehmet Güler
34 */
35public class SorguEslestirici{
36    private NamedParameterJdbcTemplate sablon;
37    private Set vtSiniflari;
38    private Set nesnePaketleri;
39    private boolean hataAyiklama = false;
40    private Map saklanmisSiniflar;
41   
42    /**
43     * Creates a new instance of SorguEslestirici
44     */
45    public SorguEslestirici(){
46        this.vtSiniflari = new HashSet();
47        this.nesnePaketleri = new HashSet();
48        this.saklanmisSiniflar = new HashMap();
49        this.vtSiniflari.add(Integer.class);
50        this.vtSiniflari.add(String.class);
51        this.vtSiniflari.add(Date.class);
52        this.vtSiniflari.add(Double.class);
53        this.vtSiniflari.add(Boolean.class);
54    }
55   
56    public List listele(String sorgu, Map parametreler, final Class nesneSinifi){
57        long t1 = System.currentTimeMillis();
58        final List sonuclar = new LinkedList();
59        final String tabloAdi = Cevir.vt(Cevir.isim(nesneSinifi.getName()));
60        final Set sutunlar = new HashSet();
61       
62        sablon.query(sorgu,parametreler,new RowCallbackHandler(){
63            public void processRow(ResultSet rs) throws SQLException {
64                sutunAdlariniAl(sutunlar,rs);
65                esle(rs,sutunlar,tabloAdi,nesneSinifi,sonuclar);
66            }
67        }
68        );
69        System.out.println("Listeleme zamanı="+(System.currentTimeMillis()-t1));       
70        return sonuclar;
71    }
72   
73    private void esle(ResultSet rs, Set sutunlar, String tabloAdi, Class nesneSinifi, List ustListe){
74        try{
75            if (!sutunlar.contains(tabloAdi+"_no")) return; //bu nesne sütunlar arasında hiç yok
76            Object no = rs.getObject(tabloAdi+"_no");
77            if (no==null) return; //bu nesne sütunlar arasında var ama null, muhtemelen left join den dolayı
78            BeanWrapper wr=new BeanWrapperImpl(nesneSinifi); //Zaten class introspectionunu saklıyor (CachedIntrospectionResults.forClass())
79            wr.setPropertyValue("no",no);
80            Object nesne = wr.getWrappedInstance();
81            boolean esle = true;
82            for (Iterator it = ustListe.iterator(); it.hasNext();) { //listenin içinde indexOf ve get(i) ile birkaç kez dolaşmak yerinde bir kez dolaşmış olalım, onlar da aynı şeyi yapıyor çünkü.
83                Object listedekiNesne = (Object) it.next();
84                if (nesne.equals(listedekiNesne)){ //NOT: bunu no'ları karşılaştırarak da yapabiliriz
85                    wr.setWrappedInstance(listedekiNesne); //listede zaten var onu kullanmalıyız
86                    esle = false; // ve tekrar eşleme yapmamalıyız
87                    break;
88                }
89            }
90            if (esle) ustListe.add(nesne); //bulamadık, yani listede yok bunu ekliyoruz
91            PropertyDescriptor[] pdArr = wr.getPropertyDescriptors();
92            for (int i = 0; i < pdArr.length; i++) {
93                PropertyDescriptor pd = pdArr[i];
94                String alanAdi = Cevir.vt(pd.getName());
95                Class alanSinifi = pd.getPropertyType();
96                String sutun = tabloAdi+"_"+alanAdi;
97                if (esle && vtSiniflari.contains(alanSinifi)){ //veritabanı nesneleri
98                    if(sutunlar.contains(sutun)){
99                        if(hataAyiklama) System.out.println(">>alan bulundu "+sutun);
100                        wr.setPropertyValue(pd.getName(),rs.getObject(sutun));
101                    }else{
102                        if(hataAyiklama) System.out.println("--alan bulunamadı: "+sutun);
103                    }
104                }
105                if (esle && alanSinifi.getPackage()!=null && getNesnePaketleri().contains(alanSinifi.getPackage().getName())){ //bire bir nesneler
106                    if(sutunlar.contains(sutun+"_no")){
107                        if(hataAyiklama) System.out.println(">>nesne bulundu "+sutun);
108                        List list = new ArrayList(1); //tek sonuç olacağını biliyoruz
109                        esle(rs,sutunlar,sutun,alanSinifi,list);
110                        if(list.size()>0)wr.setPropertyValue(pd.getName(),list.get(0));
111                    }else{
112                        if(hataAyiklama) System.out.println("--nesne bulunamadı: "+sutun);
113                    }
114                }
115                if ((SinifBildirenLinkedList) wr.getPropertyValue(pd.getName())  instanceof SinifBildirenLinkedList){ //çoklu nesneler
116                    if(sutunlar.contains(sutun+"_no")){
117                        if(hataAyiklama) System.out.println(">>liste bulundu "+sutun);
118                        Class bagNesneSinifi = (Class)wr.getPropertyValue(pdArr[i].getName()+".nesneSinifi");
119                        esle(rs,sutunlar,sutun,bagNesneSinifi,(List)wr.getPropertyValue(pd.getName()));
120                    }else{
121                        if(hataAyiklama) System.out.println("--liste bulunamadı: "+sutun);
122                    }
123                }
124               
125            }
126        } catch(Exception ex){
127            ex.printStackTrace();
128        }
129    }
130   
131    private Set sutunAdlariniAl(Set sutunAdlari, ResultSet rs) throws SQLException{
132        if (!sutunAdlari.isEmpty()) return sutunAdlari;
133        for (int i=1; i<rs.getMetaData().getColumnCount()+1; i++) {
134            sutunAdlari.add(rs.getMetaData().getColumnName(i));
135        }
136        return sutunAdlari;
137    }
138   
139    public void setHataAyiklama(boolean hataAyiklama) {
140        this.hataAyiklama = hataAyiklama;
141    }
142   
143    public Set getNesnePaketleri() {
144        return nesnePaketleri;
145    }
146   
147    public void setNesnePaketleri(Set nesnePaketleri) {
148        this.nesnePaketleri = nesnePaketleri;
149    }
150   
151    public void setSablon(NamedParameterJdbcTemplate sablon) {
152        this.sablon = sablon;
153    }
154}
Note: See TracBrowser for help on using the repository browser.