1 package jp.sourceforge.stigmata.result;
7 import java.net.MalformedURLException;
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;
17 import javax.naming.Context;
18 import javax.naming.InitialContext;
19 import javax.naming.NamingException;
20 import javax.sql.DataSource;
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;
33 import org.apache.commons.dbutils.QueryRunner;
34 import org.apache.commons.dbutils.ResultSetHandler;
35 import org.apache.commons.dbutils.handlers.ScalarHandler;
39 * @author Haruaki Tamada
42 public class RDBExtractionResultSet extends AbstractExtractionResultSet{
44 private DataSource source;
45 private boolean initFlag = true;
47 public RDBExtractionResultSet(BirthmarkContext context){
50 initializeDataSource();
53 public RDBExtractionResultSet(DataSource source, String id){
54 super(Stigmata.getInstance().createContext());
59 initializeDataSource();
60 initialization(getContext());
64 public String[] getBirthmarkTypes(){
66 String[] types = (String[])select(
67 "SELECT TYPE FROM EXTRACTED_BIRTHMARK_TYPES WHERE EXTRACTED_ID = ?",
68 new StringHandler(), id
71 types = new String[0];
75 return super.getBirthmarkTypes();
79 public ExtractionUnit getExtractionUnit(){
81 String[] units = (String[])select(
82 "SELECT UNIT FROM EXTRACTED_BIRTHMARKS WHERE EXTRACTED_ID = ?",
83 new StringHandler(), id
85 if(units != null && units.length > 0){
86 return ExtractionUnit.valueOf(units[0]);
88 return ExtractionUnit.CLASS;
90 return super.getExtractionUnit();
94 public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
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()
107 public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
108 return new ArrayIterator<BirthmarkSet>(getBirthmarkSets(target));
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()
121 public void removeAllBirthmarkSets(ExtractionTarget target){
122 QueryRunner qr = new QueryRunner(source);
125 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and STORE_TARGET=?",
126 new Object[] { id, target.name(), }
128 } catch(SQLException e){
133 public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
134 QueryRunner qr = new QueryRunner(source);
137 "DELETE FROM EXTRACTED_BIRTHMARK WHERE ID=? and LOCATION=? and STORE_TARGET=?",
138 new Object[] { id, set.getLocation(), target.name(), }
140 } catch(SQLException e){
144 public BirthmarkStoreTarget getStoreTarget(){
145 return BirthmarkStoreTarget.RDB;
148 private Object select(String sql, ResultSetHandler handler, Object... parameters){
149 QueryRunner qr = new QueryRunner(source);
151 return qr.query(sql, parameters, handler);
152 } catch(SQLException e){
157 private void initialization(BirthmarkContext context){
158 context.setStoreTarget(BirthmarkStoreTarget.RDB);
159 context.setBirthmarkTypes(getBirthmarkTypes());
160 context.setExtractionUnit(getExtractionUnit());
165 private void initializeDataSource(){
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");
172 source = (DataSource)namingContext.lookup(dataSourceName);
173 } catch(NamingException e){
177 public static class StringHandler implements ResultSetHandler{
180 public StringHandler(){
184 public StringHandler(int index){
188 public Object handle(ResultSet rs) throws SQLException{
189 List<String> list = new ArrayList<String>();
191 list.add(rs.getString(index));
193 return list.toArray(new String[list.size()]);
197 private static class BirthmarkSetListHandler implements ResultSetHandler{
198 private BirthmarkEnvironment env;
200 public BirthmarkSetListHandler(BirthmarkEnvironment env){
204 public Object handle(ResultSet rs) throws SQLException{
205 Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
209 String name = rs.getString("NAME");
210 String location = rs.getString("LOCATION");
212 URL url = new URL(location);
213 BirthmarkSet bs = map.get(url);
215 bs = new BirthmarkSet(name, url);
218 String type = rs.getString("TYPE");
220 Birthmark birthmark = bs.getBirthmark(type);
221 if(birthmark == null){
222 birthmark = env.getService(type).buildBirthmark();
223 bs.addBirthmark(birthmark);
225 String element = rs.getString("ELEMENT");
226 birthmark.addElement(env.getService(type).buildBirthmarkElement(element));
228 } catch(MalformedURLException e){
231 return map.values().toArray(new BirthmarkSet[map.size()]);