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

Last change on this file since 19 was 11, checked in by fmguler, 16 years ago

FMG VEN kütüphanesi - ilk import

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(nesneSinifi.getSimpleName());
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(SQLException 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.