1 22 package org.objectweb.petals.binding.xquarebc.listeners; 23 24 import java.sql.Connection ; 25 import java.sql.ResultSet ; 26 import java.sql.Statement ; 27 import java.util.ArrayList ; 28 import java.util.Properties ; 29 import java.util.StringTokenizer ; 30 import java.util.logging.Level ; 31 import java.util.logging.Logger ; 32 33 import javax.xml.transform.Source ; 34 35 import org.objectweb.petals.binding.xquarebc.XQuareBCException; 36 import org.xquark.bridge.XQBridge; 37 38 63 public class DelimiterNewDataStrategy implements NewDataStrategy { 64 65 public static final String OLD_DATA_DELIMITER_SELECT_PROP = "oldDataDelimiterSelect"; 66 public static final String NEW_DATA_DELIMITER_SELECT_PROP = "newDataDelimiterSelect"; 67 public static final String INIT_DATA_DELIMITER_PROP = "initDataDelimiter"; 68 public static final String NEW_DATA_XQUERY_PROP = "newDataXquery"; 69 public static final String NEW_DATA_DELIMITER_UPDATES_PROP = "newDataDelimiterUpdates"; 70 71 protected static final String DELIMITER_PROP_PREFIX = "delimiter."; 72 protected static final String CUSTOM_TABLE_SUFFIX = "_xqbc"; 73 protected static final String OLD_DATA_DELIMITER_TOKEN = "##OLD_DATA_DELIMITER##"; 74 protected static final String NEW_DATA_DELIMITER_TOKEN = "##NEW_DATA_DELIMITER##"; 75 76 private Logger logger; 77 protected Connection conn; 78 79 protected String oldDataDelimiterSelect; 80 protected String newDataDelimiterSelect; 81 protected String initDataDelimiter; 82 protected ArrayList <String > newDataDelimiterUpdates = new ArrayList <String >(); 83 protected String newDataXquery; 84 85 protected String oldDataDelimiter; 86 protected String newDataDelimiter; 87 88 protected XQuareBCJBIProcessor processor; 89 public Properties serviceProps; 90 protected XQBridge xqBridge; 91 92 93 102 public DelimiterNewDataStrategy(XQuareBCJBIProcessor processor, 103 Connection conn, Properties serviceProps, String listenerPropPrefix, 104 Logger logger) 105 throws XQuareBCException { 106 this.logger = logger; 107 this.conn = conn; 108 109 this.processor = processor; 111 this.serviceProps = serviceProps; 112 this.xqBridge= processor.getXQBridge(serviceProps); 113 114 listenerPropPrefix = listenerPropPrefix + DELIMITER_PROP_PREFIX; 116 this.oldDataDelimiterSelect = (String ) serviceProps.get( 117 listenerPropPrefix + OLD_DATA_DELIMITER_SELECT_PROP); 118 this.newDataDelimiterSelect = (String ) serviceProps.get( 119 listenerPropPrefix + NEW_DATA_DELIMITER_SELECT_PROP); 120 this.initDataDelimiter = (String ) serviceProps.get( 121 listenerPropPrefix + INIT_DATA_DELIMITER_PROP); 122 this.newDataXquery = (String ) serviceProps.get( 123 listenerPropPrefix + NEW_DATA_XQUERY_PROP); 124 125 String newDataDelimiterUpdateString = (String ) serviceProps.get( 127 listenerPropPrefix + NEW_DATA_DELIMITER_UPDATES_PROP); 128 StringTokenizer stok = new StringTokenizer (newDataDelimiterUpdateString, ";"); 129 while (stok.hasMoreTokens()) { 132 String newDataDelimiterUpdate = stok.nextToken().trim(); 133 newDataDelimiterUpdates.add(newDataDelimiterUpdate); 134 } 135 } 136 137 138 141 public boolean detectNewData() throws Exception { 142 Statement newDataStmt = conn.createStatement(); 144 newDataStmt.execute(this.oldDataDelimiterSelect); 145 ResultSet newDataRs = newDataStmt.getResultSet(); 146 if (newDataRs.next()) { 147 oldDataDelimiter = newDataRs.getString(1); 148 } 149 if (oldDataDelimiter == null) { 150 oldDataDelimiter = initDataDelimiter; 151 } 152 153 Statement getNewMaxIdStmt = conn.createStatement(); 155 getNewMaxIdStmt.execute(this.newDataDelimiterSelect); 156 ResultSet getNewMaxIdRs = getNewMaxIdStmt.getResultSet(); 157 if (getNewMaxIdRs.next()) { 158 newDataDelimiter = getNewMaxIdRs.getString(1); 159 } 160 161 return (newDataDelimiter != null 163 && !newDataDelimiter.equals(oldDataDelimiter)); 164 } 165 166 167 170 public Source getNewData() throws Exception { 171 String formattedXquery = replaceDelimiterTokens(newDataXquery); 173 logger.log(Level.FINE, "DelimiterNewDataStrategy formattedXquery : " 174 + formattedXquery); 175 Source bodySource = processor.doQuery(formattedXquery, 176 xqBridge, serviceProps); 177 return bodySource; 178 } 179 180 181 184 public void updateDataKnown() throws Exception { 185 for (String newDataDelimiterUpdate : newDataDelimiterUpdates) { 189 newDataDelimiterUpdate = replaceDelimiterTokens(newDataDelimiterUpdate); 190 conn.createStatement().executeUpdate(newDataDelimiterUpdate); 191 } 193 } 194 195 196 protected String replaceDelimiterTokens(String sqlOrXquery) { 197 sqlOrXquery = sqlOrXquery.replaceAll(OLD_DATA_DELIMITER_TOKEN, oldDataDelimiter); 198 sqlOrXquery = sqlOrXquery.replaceAll(NEW_DATA_DELIMITER_TOKEN, newDataDelimiter); 199 return sqlOrXquery; 200 } 201 202 } 203 | Popular Tags |