/** * @author nitun * @lastChange 4:24:36 PM */ package de.juwimm.cms.cocoon.transformation; import java.io.IOException; import java.io.Serializable; import java.util.Date; import java.util.Map; import org.apache.avalon.excalibur.pool.Recyclable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.caching.CacheableProcessingComponent; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.transformation.AbstractTransformer; import org.apache.excalibur.source.SourceValidity; import org.apache.excalibur.source.impl.validity.TimeStampValidity; import org.apache.log4j.Logger; import org.tizzit.util.XercesHelper; import org.tizzit.util.xml.SAXHelper; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import de.juwimm.cms.beans.WebServiceSpring; import de.juwimm.cms.cocoon.helper.CocoonSpringHelper; import de.juwimm.cms.vo.SiteValue; import de.juwimm.cms.vo.UnitValue; import de.juwimm.cms.vo.ViewComponentValue; import de.juwimm.cms.vo.ViewDocumentValue; /** * * This transformer is fetching all document slim values from the database for a * specific unit or an entire site. The tag that will trigger the transformation * is "getAllDocuments" * * @author nitun * */ public class GetDocumentsTransformer extends AbstractTransformer implements CacheableProcessingComponent, Recyclable { private static Logger log = Logger.getLogger(GetDocumentsTransformer.class); private WebServiceSpring webSpringBean = null; private Integer viewComponentId = null; private ViewComponentValue viewComponentValue = null; private Serializable uniqueKey; private long chgDate = 0; private Request request = null; /* * (non-Javadoc) * * @see * org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon * .environment.SourceResolver, java.util.Map, java.lang.String, * org.apache.avalon.framework.parameters.Parameters) */ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException { if (log.isDebugEnabled()) log.debug("begin setup with src: " + src); try { webSpringBean = (WebServiceSpring) CocoonSpringHelper.getBean( objectModel, CocoonSpringHelper.WEB_SERVICE_SPRING); } catch (Exception exf) { log.error("could not load webServiceSpringBean ", exf); } try { viewComponentId = new Integer(par.getParameter("viewComponentId")); request = ObjectModelHelper.getRequest(objectModel); uniqueKey = viewComponentId + src + "?" + request.getQueryString(); if (log.isDebugEnabled()) { log.debug("UniqueKey: " + uniqueKey); } try { viewComponentValue = webSpringBean .getViewComponent4Id(viewComponentId); } catch (Exception e) { if (log.isDebugEnabled()) { log.debug(e.getMessage()); } } } catch (Exception exe) { viewComponentId = null; } } /* * @see org.xml.sax.ContentHandler#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (localName.equals("getAllDocuments")) { super.startElement(uri, localName, qName, attrs); // get site value and unit value based on attributes Document doc = XercesHelper.getNewDocument(); if (log.isDebugEnabled()) log.debug("getAllDocuments entered."); StringBuilder documentsXml = new StringBuilder(); Integer viewComponentId = null; String docsFor = null; try { viewComponentId = new Integer(attrs.getValue("viewComponentId")); } catch (Exception exe) { if (log.isDebugEnabled()) log.debug("value for 'viewComponentId' not found or invalid"); } try { docsFor = attrs.getValue("showDocuments"); } catch (Exception exe) { if (log.isDebugEnabled()) log.debug("value for 'showDocuments' not found or invalid"); } documentsXml.append("<documents>"); try { if (docsFor.equalsIgnoreCase("unit")) { ViewDocumentValue viewDocumentValue = webSpringBean .getViewDocument4ViewComponentId(viewComponentId); UnitValue unitValue = webSpringBean .getUnit4ViewComponent(viewComponentId); ViewComponentValue rootViewComponent = webSpringBean .getViewComponent4Unit(unitValue.getUnitId(), viewDocumentValue.getViewDocumentId()); documentsXml.append(webSpringBean .getDocumentsForUnitXml(rootViewComponent .getViewComponentId())); } else if (docsFor.equalsIgnoreCase("site")) { SiteValue siteValue = webSpringBean .getSite4VCId(viewComponentId); documentsXml.append(webSpringBean .getDocumentsForSiteXml(siteValue.getSiteId())); } else if (docsFor.equalsIgnoreCase("viewComponent")) { documentsXml.append(webSpringBean .getDocumentsForViewComponentXml(viewComponentId)); } documentsXml.append("</documents>"); Document smdoc = XercesHelper.string2Dom(documentsXml .toString()); Node page = doc.importNode(smdoc.getFirstChild(), true); SAXHelper.string2sax(XercesHelper.node2string(page), this); } catch (Exception e) { log.error("An error occured while creating the documents xml", e); } } else { super.startElement(uri, localName, qName, attrs); } } public Serializable getKey() { return uniqueKey; } /** * The current validity date returned for this transformer is based only on * the current system time and it always fetches the documents from * database. This is implemented so that the other components of the * pipeline can be cached. * * @return */ public SourceValidity getValidity() { SourceValidity sv = new TimeStampValidity(System.currentTimeMillis()); return sv; } }