/** * Copyright (c) 2009 Juwi MacMillan Group GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.juwimm.cms.search.xmldb; import java.util.ArrayList; import java.util.Date; import java.util.Map; import org.apache.log4j.Logger; import org.apache.xindice.client.xmldb.resources.XMLResourceImpl; import org.apache.xindice.client.xmldb.services.MetaService; import org.apache.xindice.core.meta.MetaData; import org.springframework.beans.factory.annotation.Autowired; import org.xmldb.api.base.ResourceIterator; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; import de.juwimm.cms.beans.foreign.TizzitPropertiesBeanSpring; import de.juwimm.cms.search.vo.XmlSearchValue; /** * tizzitXindiceHost and tizzitXindicePort must be set up in tizzit.properties! * @author Michael Frankfurter (michael.frankfurter@juwimm.com) * @version $Id$ */ public class XindiceXmlDbImpl implements XmlDb { private static Logger log = Logger.getLogger(XindiceXmlDbImpl.class); public static final String XMLDB_COLLECTION_NAME = "viewComponentContent"; private TizzitPropertiesBeanSpring tizzitPropertiesBeanSpring; public TizzitPropertiesBeanSpring getTizzitPropertiesBeanSpring() { return tizzitPropertiesBeanSpring; } @Autowired public void setTizzitPropertiesBeanSpring(TizzitPropertiesBeanSpring tizzitPropertiesBeanSpring) { // TODO: Test if autowire is working this.tizzitPropertiesBeanSpring = tizzitPropertiesBeanSpring; } public XmlSearchValue[] searchXml(Integer siteId, String xpathQuery) { if (log.isDebugEnabled()) log.debug("searchXml(...) -> begin at " + sdf.format(new Date())); if (xpathQuery == null || xpathQuery.length() == 0) { log.warn("XPath-Query is null or empty, no search possible and sensible!"); return new XmlSearchValue[0]; } XmlSearchValue[] retArray = null; org.xmldb.api.base.Collection col = null; try { String serverHost = tizzitPropertiesBeanSpring.getSearch().getXindiceHost(); String port = tizzitPropertiesBeanSpring.getSearch().getXindicePort(); col = XindiceHelper.getCollection(getTizzitPropertiesBeanSpring(), "xmldb:xindice://" + serverHost + ":" + port + "/db/", "viewComponentContent", siteId); //index erstellen if (xpathQuery.indexOf("[") < 0 && xpathQuery.indexOf("'") < 0 && xpathQuery.startsWith("//")) { String idxName = xpathQuery.substring(2); XindiceHelper.addIndex(col, "idx_" + idxName, idxName); } //xindice execute query XPathQueryService service = XindiceHelper.getXPathQueryService(col); MetaService metaService = XindiceHelper.getMetaService(col); if (log.isDebugEnabled()) log.debug("searchXml(...) -> starting searchXML with siteId " + siteId + " and query " + xpathQuery); ResourceSet resultSet = service.query(xpathQuery); if (resultSet.getSize() > 0) { retArray = new XmlSearchValue[(int) resultSet.getSize()]; int i = 0; ResourceIterator results = resultSet.getIterator(); while (results.hasMoreResources()) { XMLResourceImpl res = (XMLResourceImpl) results.nextResource(); try { // test! perhaps if one entry is corrupt nothing is returned? para-stellenagebote + news if (log.isDebugEnabled()) log.debug("searchXml(...) -> found object with ID: " + res.getDocumentId()); retArray[i] = new XmlSearchValue(); retArray[i].setContent((String) res.getContent()); MetaData metaData = metaService.getMetaData(res.getDocumentId()); retArray[i].setInfoText((String) metaData.getAttribute("infoText")); retArray[i].setText((String) metaData.getAttribute("text")); retArray[i].setUnitId(new Integer((String) metaData.getAttribute("unitId"))); retArray[i].setViewComponentId(new Integer(res.getDocumentId())); } catch (Exception e) { log.error("searchXml(...) -> error iterating results for search for: siteId " + siteId + " query " + xpathQuery, e); } i++; } } else { if (log.isDebugEnabled()) log.debug("searchXml(...) -> no result for query " + xpathQuery + " on site " + siteId); } } catch (Exception exe) { log.error("searchXml(...) -> error occured during search ", exe); } finally { if (col != null) { try { col.close(); } catch (XMLDBException e) { log.warn("Error closing Xindice-Collection: " + e.getMessage(), e); } } } if (log.isDebugEnabled()) log.debug("searchXml(...) -> end at " + sdf.format(new Date())); return retArray; } public boolean saveXml(Integer siteId, Integer viewComponentId, String contentText, Map<String, String> metaAttributes) { if (log.isDebugEnabled()) log.debug("saveXml(...) -> begin"); boolean retVal = false; String serverHost = tizzitPropertiesBeanSpring.getSearch().getXindiceHost(); String port = tizzitPropertiesBeanSpring.getSearch().getXindicePort(); try { org.xmldb.api.base.Collection col = XindiceHelper.getCollection(getTizzitPropertiesBeanSpring(), "xmldb:xindice://" + serverHost + ":" + port + "/db/", XMLDB_COLLECTION_NAME, siteId.intValue()); XMLResource doc = (XMLResource) col.createResource(viewComponentId.toString(), "XMLResource"); doc.setContent(contentText); col.storeResource(doc); MetaService metaService = XindiceHelper.getMetaService(col); MetaData metaData = metaService.getMetaData(viewComponentId.toString()); if (!(metaAttributes.get("infoText") == null || "".equals(metaAttributes.get("infoText")))) { metaData.setAttribute("infoText", metaAttributes.get("infoText")); } if (!(metaAttributes.get("text") == null || "".equals(metaAttributes.get("text")))) { metaData.setAttribute("text", metaAttributes.get("text")); } if (!(metaAttributes.get("unitId") == null || "".equals(metaAttributes.get("unitId")))) { metaData.setAttribute("unitId", metaAttributes.get("unitId")); } metaService.setMetaData(viewComponentId.toString(), metaData); retVal = true; } catch (XMLDBException e) { log.error("saveXml(...) -> could not write xindice resource for viewComponent " + viewComponentId + "\n" + e.getMessage()); } if (log.isDebugEnabled()) log.debug("saveXml(...) -> end"); return retVal; } public void deleteXml(Integer siteId, Integer viewComponentId) { if (log.isDebugEnabled()) log.debug("deleteXml(...) -> begin"); String serverHost = System.getProperty("tizzitXindiceHost", "localhost"); String port = System.getProperty("tizzitXindicePort", "8080"); try { org.xmldb.api.base.Collection col = XindiceHelper.getCollection(getTizzitPropertiesBeanSpring(), "xmldb:xindice://" + serverHost + ":" + port + "/db/", XMLDB_COLLECTION_NAME, siteId.intValue()); org.xmldb.api.base.Resource doc = col.getResource(viewComponentId.toString()); if (doc != null) { col.removeResource(doc); } } catch (XMLDBException e) { log.error("deleteXml(...) -> could not delete xindice resource for viewComponent " + viewComponentId + "\n" + e.getMessage()); } if (log.isDebugEnabled()) log.debug("deleteXml(...) -> end"); } /** @see de.juwimm.cms.search.xmldb.XmlDb#searchXmlByUnit(java.lang.Integer, java.lang.String) */ public XmlSearchValue[] searchXmlByUnit(Integer unitId, Integer viewDocumentId, String xpathQuery) { if (log.isDebugEnabled()) log.debug("searchXmlByUnit(...) -> begin at " + sdf.format(new Date())); if (xpathQuery == null || xpathQuery.length() == 0) { log.warn("XPath-Query is null or empty, no search possible and sensible!"); return new XmlSearchValue[0]; } ArrayList<XmlSearchValue> result = new ArrayList<XmlSearchValue>(); /* org.xmldb.api.base.Collection col = null; try { Integer siteId = UnitUtil.getLocalHome().findByPrimaryKey(unitId).getSite().getSiteId(); String serverHost = System.getProperty("tizzitXindiceHost", "localhost"); String port = System.getProperty("tizzitXindicePort", "8080"); col = XindiceHelper.getCollection("xmldb:xindice://" + serverHost + ":" + port + "/db/", SearchUpdateMessageListener.XMLDB_COLLECTION_NAME, siteId); //index erstellen if (xpathQuery.indexOf("[") < 0 && xpathQuery.indexOf("'") < 0 && xpathQuery.startsWith("//")) { String idxName = xpathQuery.substring(2); XindiceHelper.addIndex(col, "idx_" + idxName, idxName); } //xindice execute query XPathQueryService service = XindiceHelper.getXPathQueryService(col); MetaService metaService = XindiceHelper.getMetaService(col); if (log.isDebugEnabled()) log.debug("searchXmlByUnit(...) -> starting searchXML with siteId " + siteId + " and query " + xpathQuery); ResourceSet resultSet = service.query(xpathQuery); if (resultSet.getSize() > 0) { ResourceIterator results = resultSet.getIterator(); while (results.hasMoreResources()) { XMLResourceImpl res = (XMLResourceImpl) results.nextResource(); try { // test! perhaps if one entry is corrupt nothing is returned? if (log.isDebugEnabled()) { log.debug("searchXmlByUnit(...) -> found object with ID: " + res.getDocumentId()); } MetaData metaData = metaService.getMetaData(res.getDocumentId()); Integer foundUnit = new Integer((String) metaData.getAttribute("unitId")); if (foundUnit.equals(unitId)) { XmlSearchValue xmlSearchValue = new XmlSearchValue(); xmlSearchValue.setContent((String) res.getContent()); xmlSearchValue.setInfoText((String) metaData.getAttribute("infoText")); xmlSearchValue.setText((String) metaData.getAttribute("text")); xmlSearchValue.setUnitId(new Integer((String) metaData.getAttribute("unitId"))); xmlSearchValue.setViewComponentId(new Integer((String) res.getDocumentId())); result.add(xmlSearchValue); } } catch (Exception e) { log.error("searchXmlByUnit(...) -> error iterating results for search for: siteId " + siteId + " query " + xpathQuery, e); } } } else { if (log.isDebugEnabled()) log.debug("searchXmlByUnit(...) -> no result for query " + xpathQuery + " on site " + siteId); } } catch (FinderException exception) { log.error("searchXmlByUnit(...) -> could not find site for unit " + unitId, exception); } catch (Exception exception) { log.error("searchXmlByUnit(...) -> error occured during search ", exception); } finally { if (col != null) { try { col.close(); } catch (XMLDBException e) { log.warn("Error closing Xindice-Collection: " + e.getMessage(), e); } } } */ if (log.isDebugEnabled()) log.debug("searchXmlByUnit(...) -> end at " + sdf.format(new Date())); return result.toArray(new XmlSearchValue[result.size()]); } }