[11] | 1 | /* |
---|
| 2 | * SorguEslestirici.java |
---|
| 3 | * |
---|
| 4 | * Created on December 18, 2006, 10:40 AM |
---|
[22] | 5 | * (4.12.06 tarihli SpringDaoDeneme çalışmasından derlenmiştir) |
---|
[11] | 6 | * |
---|
[22] | 7 | * Ven - Ayar Yerine Gelenek veritabanı erişim nesnesi |
---|
[11] | 8 | */ |
---|
| 9 | |
---|
| 10 | package net.fmg.ven; |
---|
| 11 | |
---|
| 12 | import java.beans.PropertyDescriptor; |
---|
| 13 | import java.sql.ResultSet; |
---|
| 14 | import java.sql.SQLException; |
---|
| 15 | import java.util.ArrayList; |
---|
| 16 | import java.util.Date; |
---|
| 17 | import java.util.HashMap; |
---|
| 18 | import java.util.HashSet; |
---|
| 19 | import java.util.Iterator; |
---|
| 20 | import java.util.LinkedList; |
---|
| 21 | import java.util.List; |
---|
| 22 | import java.util.Map; |
---|
| 23 | import java.util.Set; |
---|
| 24 | import net.fmg.ven.arac.Cevir; |
---|
| 25 | import net.fmg.ven.arac.SinifBildirenLinkedList; |
---|
| 26 | import org.springframework.beans.BeanWrapper; |
---|
| 27 | import org.springframework.beans.BeanWrapperImpl; |
---|
| 28 | import org.springframework.jdbc.core.RowCallbackHandler; |
---|
| 29 | import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; |
---|
| 30 | |
---|
| 31 | /** |
---|
[22] | 32 | * 'Ayar yerine gelenek' yaklaşımında üretilmiş sorgunun sonucunu belirtilen nesneye eşler |
---|
| 33 | * @author Fatih Mehmet Güler |
---|
[11] | 34 | */ |
---|
| 35 | public 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 | ); |
---|
[22] | 69 | System.out.println("Listeleme zamanı="+(System.currentTimeMillis()-t1)); |
---|
[11] | 70 | return sonuclar; |
---|
| 71 | } |
---|
| 72 | |
---|
| 73 | private void esle(ResultSet rs, Set sutunlar, String tabloAdi, Class nesneSinifi, List ustListe){ |
---|
| 74 | try{ |
---|
[22] | 75 | if (!sutunlar.contains(tabloAdi+"_no")) return; //bu nesne sütunlar arasında hiç yok |
---|
[11] | 76 | Object no = rs.getObject(tabloAdi+"_no"); |
---|
[22] | 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()) |
---|
[11] | 79 | wr.setPropertyValue("no",no); |
---|
| 80 | Object nesne = wr.getWrappedInstance(); |
---|
| 81 | boolean esle = true; |
---|
[22] | 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ü. |
---|
[11] | 83 | Object listedekiNesne = (Object) it.next(); |
---|
[22] | 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 |
---|
[11] | 87 | break; |
---|
| 88 | } |
---|
| 89 | } |
---|
[22] | 90 | if (esle) ustListe.add(nesne); //bulamadık, yani listede yok bunu ekliyoruz |
---|
[11] | 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; |
---|
[22] | 97 | if (esle && vtSiniflari.contains(alanSinifi)){ //veritabanı nesneleri |
---|
[11] | 98 | if(sutunlar.contains(sutun)){ |
---|
| 99 | if(hataAyiklama) System.out.println(">>alan bulundu "+sutun); |
---|
| 100 | wr.setPropertyValue(pd.getName(),rs.getObject(sutun)); |
---|
| 101 | }else{ |
---|
[22] | 102 | if(hataAyiklama) System.out.println("--alan bulunamadı: "+sutun); |
---|
[11] | 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); |
---|
[22] | 108 | List list = new ArrayList(1); //tek sonuç olacağını biliyoruz |
---|
[11] | 109 | esle(rs,sutunlar,sutun,alanSinifi,list); |
---|
| 110 | if(list.size()>0)wr.setPropertyValue(pd.getName(),list.get(0)); |
---|
| 111 | }else{ |
---|
[22] | 112 | if(hataAyiklama) System.out.println("--nesne bulunamadı: "+sutun); |
---|
[11] | 113 | } |
---|
| 114 | } |
---|
[22] | 115 | if ((SinifBildirenLinkedList) wr.getPropertyValue(pd.getName()) instanceof SinifBildirenLinkedList){ //çoklu nesneler |
---|
[11] | 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{ |
---|
[22] | 121 | if(hataAyiklama) System.out.println("--liste bulunamadı: "+sutun); |
---|
[11] | 122 | } |
---|
| 123 | } |
---|
| 124 | |
---|
| 125 | } |
---|
[23] | 126 | } catch(Exception ex){ |
---|
[11] | 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 | } |
---|