OSDN Git Service

add KGramBuilder for build kgram
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / result / RDBExtractionResultSet.java
1 package jp.sourceforge.stigmata.result;
2
3 /*
4  * $Id$
5  */
6
7 import java.net.MalformedURLException;
8 import java.net.URL;
9 import java.sql.ResultSet;
10 import java.sql.SQLException;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16
17 import javax.naming.Context;
18 import javax.naming.InitialContext;
19 import javax.naming.NamingException;
20 import javax.sql.DataSource;
21
22 import jp.sourceforge.stigmata.Birthmark;
23 import jp.sourceforge.stigmata.BirthmarkContext;
24 import jp.sourceforge.stigmata.BirthmarkEnvironment;
25 import jp.sourceforge.stigmata.BirthmarkSet;
26 import jp.sourceforge.stigmata.BirthmarkStoreException;
27 import jp.sourceforge.stigmata.BirthmarkStoreTarget;
28 import jp.sourceforge.stigmata.ExtractionTarget;
29 import jp.sourceforge.stigmata.ExtractionUnit;
30 import jp.sourceforge.stigmata.Stigmata;
31 import jp.sourceforge.stigmata.utils.ArrayIterator;
32
33 import org.apache.commons.dbutils.QueryRunner;
34 import org.apache.commons.dbutils.ResultSetHandler;
35 import org.apache.commons.dbutils.handlers.ScalarHandler;
36
37 /**
38  * 
39  * @author Haruaki Tamada
40  * @version $Revision$ 
41  */
42 public class RDBExtractionResultSet extends AbstractExtractionResultSet{
43     private String id;
44     private DataSource source;
45     private boolean initFlag = true;
46
47     public RDBExtractionResultSet(BirthmarkContext context){
48         super(context);
49
50         initializeDataSource();
51     }
52
53     public RDBExtractionResultSet(DataSource source, String id){
54         super(Stigmata.getInstance().createContext());
55
56         this.source = source;
57         this.id = id;
58
59         initializeDataSource();
60         initialization(getContext());
61     }
62
63     @Override
64     public String[] getBirthmarkTypes(){
65         if(initFlag){
66             String[] types = (String[])select(
67                 "SELECT TYPE FROM EXTRACTED_BIRTHMARK_TYPES WHERE EXTRACTED_ID = ?",
68                 new StringHandler(), id
69             );
70             if(types == null){
71                 types = new String[0];
72             }
73             return types;
74         }
75         return super.getBirthmarkTypes();
76     }
77
78     @Override
79     public ExtractionUnit getExtractionUnit(){
80         if(initFlag){
81             String[] units = (String[])select(
82                 "SELECT UNIT FROM EXTRACTED_BIRTHMARKS WHERE EXTRACTED_ID = ?",
83                 new StringHandler(), id
84             );
85             if(units != null && units.length > 0){
86                 return ExtractionUnit.valueOf(units[0]);
87             }
88             return ExtractionUnit.CLASS;
89         }
90         return super.getExtractionUnit();
91     }
92
93     @Override
94     public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
95         
96     }
97
98     @Override
99     public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){
100         return (BirthmarkSet[])select(
101             "SELECT * FROM EXTRACTED_BIRTHMARK WHERE EXTRACTED_ID = ? AND STORE_TARGET = ? ORDER TO TYPE, INDEX",
102             new BirthmarkSetListHandler(getEnvironment()), id, target.name()
103         );
104     }
105
106     @Override
107     public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
108         return new ArrayIterator<BirthmarkSet>(getBirthmarkSets(target));
109     }
110
111     @Override
112     public int getBirthmarkSetSize(ExtractionTarget target){
113         Integer o = (Integer)select(
114             "SELECT DISTINCT COUNT(LOCATION) FROM EXTRACTED_BIRTHMARK WEHERE ID=? and STORE_TARGET=?",
115             new ScalarHandler(), id, target.name()
116         );
117         return o.intValue();
118     }
119
120     @Override
121     public void removeAllBirthmarkSets(ExtractionTarget target){
122         QueryRunner qr = new QueryRunner(source);
123         try{
124             qr.update(
125                 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and STORE_TARGET=?",
126                 new Object[] { id, target.name(), }
127             );
128         } catch(SQLException e){
129         }
130     }
131
132     @Override
133     public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
134         QueryRunner qr = new QueryRunner(source);
135         try{
136             qr.update(
137                 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and LOCATION=? and STORE_TARGET=?",
138                 new Object[] { id, set.getLocation(), target.name(), }
139             );
140         } catch(SQLException e){
141         }
142     }
143
144     public BirthmarkStoreTarget getStoreTarget(){
145         return BirthmarkStoreTarget.RDB;
146     }
147
148     private Object select(String sql, ResultSetHandler handler, Object... parameters){
149         QueryRunner qr = new QueryRunner(source);
150         try{
151             return qr.query(sql, parameters, handler);
152         } catch(SQLException e){
153         }
154         return null;
155     }
156
157     private void initialization(BirthmarkContext context){
158         context.setStoreTarget(BirthmarkStoreTarget.RDB);
159         context.setBirthmarkTypes(getBirthmarkTypes());
160         context.setExtractionUnit(getExtractionUnit());
161
162         initFlag = false;
163     }
164
165     private void initializeDataSource(){
166         try{
167             Context namingContext = new InitialContext();
168             String dataSourceName = getEnvironment().getProperty("rdb.datasource");
169             if(dataSourceName == null){
170                 throw new IllegalStateException("property ``rdb.datasource''  is missing");
171             }
172             source = (DataSource)namingContext.lookup(dataSourceName);
173         } catch(NamingException e){
174         }
175     }
176
177     public static class StringHandler implements ResultSetHandler{
178         private int index;
179
180         public StringHandler(){
181             this(0);
182         }
183
184         public StringHandler(int index){
185             this.index = index;
186         }
187
188         public Object handle(ResultSet rs) throws SQLException{
189             List<String> list = new ArrayList<String>();
190             while(rs.next()){
191                 list.add(rs.getString(index));
192             }
193             return list.toArray(new String[list.size()]);
194         }
195     }
196
197     private static class BirthmarkSetListHandler implements ResultSetHandler{
198         private BirthmarkEnvironment env;
199
200         public BirthmarkSetListHandler(BirthmarkEnvironment env){
201             this.env = env;
202         }
203
204         public Object handle(ResultSet rs) throws SQLException{
205             Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
206
207             while(rs.next()){
208                 try{
209                     String name = rs.getString("NAME");
210                     String location = rs.getString("LOCATION");
211
212                     URL url = new URL(location);
213                     BirthmarkSet bs = map.get(url);
214                     if(bs == null){
215                         bs = new BirthmarkSet(name, url);
216                         map.put(url, bs);
217                     }
218                     String type = rs.getString("TYPE");
219
220                     Birthmark birthmark = bs.getBirthmark(type);
221                     if(birthmark == null){
222                         birthmark = env.getService(type).buildBirthmark();
223                         bs.addBirthmark(birthmark);
224                     }
225                     String element = rs.getString("ELEMENT");
226                     birthmark.addElement(env.getService(type).buildBirthmarkElement(element));
227
228                 } catch(MalformedURLException e){
229                 }
230             }
231             return map.values().toArray(new BirthmarkSet[map.size()]);
232         }
233     }
234 }