package org.ariadne_eu.metadata.query; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import oracle.jdbc.OracleResultSet; import oracle.xdb.XMLType; import org.apache.log4j.Logger; import org.ariadne.config.PropertiesManager; import org.ariadne_eu.metadata.query.language.QueryTranslationException; import org.ariadne_eu.metadata.query.language.TranslateLanguage; import org.ariadne_eu.utils.config.RepositoryConstants; /** * Created by ben * Date: 5-mei-2007 * Time: 19:30:21 * To change this template use File | Settings | File Templates. */ public class QueryMetadataOracleDbImpl extends QueryMetadataImpl { private static Logger log = Logger.getLogger(QueryMetadataOracleDbImpl.class); public QueryMetadataOracleDbImpl() { } QueryMetadataOracleDbImpl(int language) { setLanguage(language); initialize(); } void initialize() { super.initialize(); try { try { // String driver = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_DRIVER + "." + getLanguage()); // if (driver == null) // driver = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_DRIVER); // Class.forName(driver); Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { log.error("initialize: ", e); } } catch (Throwable t) { log.error("initialize: ", t); } } private Connection getConnection() throws SQLException { String URI = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_URI + "." + getLanguage()); if (URI == null) URI = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_URI); String username = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_USERNAME + "." + getLanguage()); if (username == null) username = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_USERNAME); String password = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_PASSWORD + "." + getLanguage()); if (password == null) password = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_PASSWORD); return DriverManager.getConnection(URI,username, password); } public int xQueryCount(String xQuery) throws QueryMetadataException { Statement stmt = null; Connection con = null; try { con = getConnection(); stmt = (Statement) con.createStatement(); String column_xml = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_XMLDB_SQL_COLUMNNAME); String table = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_XMLDB_SQL_TABLENAME); xQuery = xQuery.replaceAll("\"\"", "\""); xQuery = xQuery.replaceAll("count\\(for","\\(for"); String query = "SELECT COUNT(*) " + "FROM " + table + " " + ", XMLTable(' " + xQuery + "' passing "+ column_xml +")"; log.debug(query); ResultSet rs = stmt.executeQuery(query); //TODO: why doesn't version work for IBM DB2 String result = ""; if (rs.next()) { return ((OracleResultSet)rs).getInt(1); } if (result.equals("")){ log.error("xQuery:method didn't return answer, xQuery=" + xQuery); return -2; } return -2; //GAP end } catch (SQLException e) { log.error("xQuery:xQuery=" + xQuery, e); throw new QueryMetadataException(e); } finally { try { stmt.close(); con.close(); } catch (Exception e) { log.error("xQuery:xQuery=" + xQuery, e); } } //log.error("xQuery:method didn't return answer, xQuery=" + xQuery); //return null; } public String xQuery(String xQuery, int start, int max) throws QueryMetadataException { Statement stmt = null; Connection con = null; try { con = getConnection(); stmt = (Statement) con.createStatement(); String column_xml = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_XMLDB_SQL_COLUMNNAME); String table = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_XMLDB_SQL_TABLENAME); xQuery = xQuery.replaceAll("\"\"", "\""); xQuery = xQuery.replaceAll("\\<results\\>\\{for \\$x at \\$y in \\(",""); xQuery = xQuery.replaceAll("/lom:lom","/lom:lom//\\*"); int temp = start+max; xQuery = xQuery.replaceAll("\\) where \\$y \\>= "+start+" and \\$y \\< "+temp+" return \\$x \\}\\</results\\>", ""); String query = "FROM ( " + "SELECT "+column_xml+" " + "FROM " + table + " " + ", XMLTable(' " + xQuery + "' passing "+ column_xml +"))"; String select = "SELECT "+column_xml+" from ( select /*+ FIRST_ROWS(n) */ a.*, ROWNUM rnum "; String limitQuery = " a where ROWNUM <= "+ (start+max) +") where rnum > " + start ; log.debug(select+query+limitQuery); ResultSet rs = stmt.executeQuery(select+query+limitQuery); //TODO: why doesn't version work for IBM DB2 StringBuilder result = new StringBuilder(); result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<results>\n"); while (rs.next()) { XMLType poxml = XMLType.createXML(((OracleResultSet)rs).getOPAQUE(1)); String lomxml = poxml.getStringVal().replaceFirst("\\<\\?xml version=\"1.0\" encoding=\".*\"\\?>\\n",""); result.append(lomxml); } if (result.equals("")){ log.error("xQuery:method didn't return answer, xQuery=" + xQuery); return null; } result.append("</results>"); return result.toString(); //GAP end } catch (SQLException e) { log.error("xQuery:xQuery=" + xQuery, e); throw new QueryMetadataException(e); } finally { try { stmt.close(); con.close(); } catch (Exception e) { log.error("xQuery:xQuery=" + xQuery, e); } } //log.error("xQuery:method didn't return answer, xQuery=" + xQuery); //return null; } public String query(String query, int start, int max, int resultsFormat) throws QueryTranslationException, QueryMetadataException { String xQuery = TranslateLanguage.translateToQuery(query, getLanguage(), TranslateLanguage.XQUERY, start, max, resultsFormat); return xQuery(xQuery, start, max); } public int count(String query) throws QueryTranslationException, QueryMetadataException { String xQuery = TranslateLanguage.translateToCount(query, getLanguage(), TranslateLanguage.XQUERY); return xQueryCount(xQuery); } @Override public String xQuery(String query) throws QueryTranslationException, QueryMetadataException { return xQuery(query, 0, 101); } }