/** * */ package org.ariadne_eu.utils.lucene.reindex; import java.io.StringReader; import java.io.StringWriter; import java.util.Vector; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.log4j.Logger; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; import org.apache.xpath.XPathAPI; import org.ariadne.config.PropertiesManager; import org.ariadne_eu.metadata.insert.InsertMetadataFactory; import org.ariadne_eu.metadata.insert.InsertMetadataImpl; import org.ariadne_eu.metadata.insert.InsertMetadataLuceneImpl; import org.ariadne_eu.metadata.query.QueryMetadataException; import org.ariadne_eu.metadata.query.QueryMetadataFactory; import org.ariadne_eu.metadata.query.QueryMetadataImpl; import org.ariadne_eu.metadata.query.QueryMetadataOracleDbImpl; import org.ariadne_eu.utils.config.RepositoryConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; /** * @author bramv * */ public class ReIndexOracleDbImpl extends ReIndexImpl { private static String xquery; private static String xmlns ; private static int startResult = 1 ; private static int nbResults = 25 ; private static Vector xpathQueries; private static Logger log = Logger.getLogger(ReIndexOracleDbImpl.class); public ReIndexOracleDbImpl() { initialize(); } void initialize() { super.initialize(); try { xmlns = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_INSERT_XMLNS_XSD); //XMLNS is not query-language dependent xpathQueries = new Vector(); if (PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().SR_XPATH_QRY_ID + ".1") == null) xpathQueries.add("general/identifier/entry/text()"); else { int i = 1; while(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().SR_XPATH_QRY_ID + "." + i) != null) { xpathQueries.add(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().SR_XPATH_QRY_ID + "." + i)); i++; } } createXQuery(); } catch (Throwable t) { log.error("initialize: ", t); } } /* * NOTE: Collection is not implemented! * * */ public void reIndexMetadata() { QueryMetadataImpl xqueryImpl = (QueryMetadataImpl) QueryMetadataFactory.getQueryImpl(-1); InsertMetadataImpl[] insertImpls = InsertMetadataFactory.getInsertImpl(); InsertMetadataLuceneImpl luceneImpl = null; for (int i = 0; i < insertImpls.length; i++) { InsertMetadataImpl insertImpl = insertImpls[i]; if (insertImpl instanceof InsertMetadataLuceneImpl) luceneImpl = (InsertMetadataLuceneImpl) insertImpl; } if (luceneImpl == null) return; luceneImpl.createLuceneIndex(); String implementation = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_INSERT_IMPLEMENTATION); if (implementation != null) { startResult = 1; while (true) { String results; try { createXQuery(); results = (new QueryMetadataOracleDbImpl()).xQuery(xquery,startResult,nbResults); if (results == null) break; results = "<results>" + results + "</results>"; startResult += nbResults; StringReader stringReader = new StringReader(results); InputSource input = new InputSource(stringReader); Document doc = null; try { doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse(input); } catch (Exception e) { e.printStackTrace(); } Node result = doc.getFirstChild(); NodeList nl = result.getChildNodes(); log.info("startResult:" + startResult + "NodeListLength:"+ nl.getLength()); if (nl.getLength() == 0) break; for (int i = 0; i < nl.getLength(); i++) { Node item = nl.item(i); Element theNode = ((Element) item); String identifier = null; for (int j = 0; j < xpathQueries.size() && identifier == null; j++) { String xpathQuery = (String) xpathQueries.elementAt(j); try { identifier = XPathAPI.selectSingleNode(theNode,xpathQuery).getNodeValue(); } catch (Exception e) { } } StringWriter out = new StringWriter(); XMLSerializer serializer = new XMLSerializer(out,new OutputFormat(doc)); serializer.serialize(theNode); String lom = out.toString(); if (identifier != null) luceneImpl.insertMetadata(identifier, lom, "ARIADNE"); } } catch (QueryMetadataException e) { log.error("reIndexMetadata: ", e); } catch (ClassCastException e) { log.error("reIndexMetadata: ", e); } catch (Exception e) { log.error("reIndexMetadata: ", e); } } } } public static void createXQuery(){ xquery = "xquery version \"1.0\";\n" + (xmlns == null ? "" : "declare default element namespace \"" + xmlns + "\"; (:hello:)\n") + "for $lom in /lom return $lom "; } }