1 package jp.sourceforge.stigmata.result;
3 import java.net.MalformedURLException;
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;
13 import javax.naming.Context;
14 import javax.naming.InitialContext;
15 import javax.naming.NamingException;
16 import javax.sql.DataSource;
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;
29 import org.apache.commons.dbutils.QueryRunner;
30 import org.apache.commons.dbutils.ResultSetHandler;
31 import org.apache.commons.dbutils.handlers.ScalarHandler;
35 * @author Haruaki Tamada
37 public class RDBExtractionResultSet extends AbstractExtractionResultSet{
39 private DataSource source;
40 private boolean initFlag = true;
42 public RDBExtractionResultSet(BirthmarkContext context){
45 initializeDataSource();
48 public RDBExtractionResultSet(DataSource source, String id){
49 super(Stigmata.getInstance().createContext());
54 initializeDataSource();
55 initialization(getContext());
59 public String[] getBirthmarkTypes(){
61 String[] types = (String[])select(
62 "SELECT TYPE FROM EXTRACTED_BIRTHMARK_TYPES WHERE EXTRACTED_ID = ?",
63 new StringHandler(), id
66 types = new String[0];
70 return super.getBirthmarkTypes();
74 public ExtractionUnit getExtractionUnit(){
76 String[] units = (String[])select(
77 "SELECT UNIT FROM EXTRACTED_BIRTHMARKS WHERE EXTRACTED_ID = ?",
78 new StringHandler(), id
80 if(units != null && units.length > 0){
81 return ExtractionUnit.valueOf(units[0]);
83 return ExtractionUnit.CLASS;
85 return super.getExtractionUnit();
89 public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
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()
102 public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
103 return new ArrayIterator<BirthmarkSet>(getBirthmarkSets(target));
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()
116 public void removeAllBirthmarkSets(ExtractionTarget target){
117 QueryRunner qr = new QueryRunner(source);
120 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and STORE_TARGET=?",
121 new Object[] { id, target.name(), }
123 } catch(SQLException e){
128 public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
129 QueryRunner qr = new QueryRunner(source);
132 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and LOCATION=? and STORE_TARGET=?",
133 new Object[] { id, set.getLocation(), target.name(), }
135 } catch(SQLException e){
140 public BirthmarkStoreTarget getStoreTarget(){
141 return BirthmarkStoreTarget.RDB;
144 private Object select(String sql, ResultSetHandler handler, Object... parameters){
145 QueryRunner qr = new QueryRunner(source);
147 return qr.query(sql, parameters, handler);
148 } catch(SQLException e){
153 private void initialization(BirthmarkContext context){
154 context.setStoreTarget(BirthmarkStoreTarget.RDB);
155 context.setBirthmarkTypes(getBirthmarkTypes());
156 context.setExtractionUnit(getExtractionUnit());
161 private void initializeDataSource(){
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");
168 source = (DataSource)namingContext.lookup(dataSourceName);
169 } catch(NamingException e){
173 public static class StringHandler implements ResultSetHandler{
176 public StringHandler(){
180 public StringHandler(int index){
185 public Object handle(ResultSet rs) throws SQLException{
186 List<String> list = new ArrayList<String>();
188 list.add(rs.getString(index));
190 return list.toArray(new String[list.size()]);
194 private static class BirthmarkSetListHandler implements ResultSetHandler{
195 private BirthmarkEnvironment env;
197 public BirthmarkSetListHandler(BirthmarkEnvironment env){
202 public Object handle(ResultSet rs) throws SQLException{
203 Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
207 String name = rs.getString("NAME");
208 String location = rs.getString("LOCATION");
210 URL url = new URL(location);
211 BirthmarkSet bs = map.get(url);
213 bs = new BirthmarkSet(name, url);
216 String type = rs.getString("TYPE");
218 Birthmark birthmark = bs.getBirthmark(type);
219 if(birthmark == null){
220 birthmark = env.getService(type).buildBirthmark();
221 bs.addBirthmark(birthmark);
223 String element = rs.getString("ELEMENT");
224 birthmark.addElement(env.getService(type).buildBirthmarkElement(element));
226 } catch(MalformedURLException e){
229 return map.values().toArray(new BirthmarkSet[map.size()]);