OSDN Git Service

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