/**
* 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.
*/
/*
* Created on 29.11.2004
*/
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.framework.parameters.ParameterException;
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.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import de.juwimm.cms.beans.WebServiceSpring;
import de.juwimm.cms.cocoon.helper.CocoonSpringHelper;
import de.juwimm.cms.vo.UnitValue;
import de.juwimm.cms.vo.ViewComponentValue;
import de.juwimm.cms.vo.ViewDocumentValue;
/**
* Transformer parses input for the tag "languageVersions" and fetches and appends language-name and language-url.<br/>
* It needs three parameters from the sitemap:
* <ul>
* <li>viewComponentId</li>
* <li>language</li>
* <li>liveserver</li>
* </ul>
* <p><h5>Configuration:</h5>
* <pre>
* <map:transformer name="language" src="de.juwimm.cms.cocoon.transformation.LanguageTransformer"/>
* </pre>
* </p>
* <p><h5>Usage:</h5>
* Just put code like this in your pipeline:
* <pre>
* <map:transform type="language">
* <map:parameter name="language" value="{../1}"/>
* <map:parameter name="liveserver" value="{conquest-properties:liveserver} "/>
* <map:parameter name="viewComponentId" value="{viewComponentId}"/>
* </map:transform>
* </pre>
* </p>
* <p><h5>Result:</h5>
* In your content you get a result like this:
* <pre>
* <languageVersions>
* <language>
* <langName>englisch</langName>
* <langUrl>url/to/english/startpage/of/current/unit</langUrl>
* </language>
* </languageVersions>
* </pre>
* </p>
*
* @author <a href="mailto:carsten.schalm@juwimm.com">Carsten Schalm</a>
* company Juwi|MacMillan Group Gmbh, Walsrode, Germany
* @version $Id$
* @since ConQuest 2.0
*/
public class LanguageTransformer extends AbstractTransformer implements CacheableProcessingComponent {
private static Logger log = Logger.getLogger(LanguageTransformer.class);
private Integer viewComponentId = null;
private WebServiceSpring webSpringBean = null;
private Serializable uniqueKey;
private long chgDate = 0;
private String currentLanguage = "";
private boolean iAmTheLiveserver = false;
/* (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 {
Request request = ObjectModelHelper.getRequest(objectModel);
this.uniqueKey = request.getRequestURI();
try {
webSpringBean = (WebServiceSpring) CocoonSpringHelper.getBean(objectModel, CocoonSpringHelper.WEB_SERVICE_SPRING);
} catch (Exception exf) {
log.error("Could not load webservicespringbean!", exf);
}
try {
this.viewComponentId = new Integer(par.getParameter("viewComponentId"));
this.currentLanguage = par.getParameter("language");
iAmTheLiveserver = new Boolean(par.getParameter("liveserver")).booleanValue();
} catch (ParameterException e) {
log.error("an unknown error occured", e);
}
}
/* (non-Javadoc)
* @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
*/
public Serializable getKey() {
return this.uniqueKey;
}
/* (non-Javadoc)
* @see org.apache.cocoon.caching.CacheableProcessingComponent#getValidity()
*/
public SourceValidity getValidity() {
this.chgDate = 0;
try {
this.chgDate = getModifiedDate().getTime();
} catch (Exception exe) {
log.error("An error occured", exe);
}
if (this.chgDate != 0) {
SourceValidity sv = new TimeStampValidity(this.chgDate);
return sv;
}
return null;
}
/**
* Returns the last modified Date of this ViewComponent. <br>
* It will also check, if there are some contained DatabaseComponents or other dynamic content, who has to been
* checked.
*/
private Date getModifiedDate() {
if (log.isDebugEnabled()) log.debug("start getModifiedDate");
Date retDte = new Date(System.currentTimeMillis());
try {
retDte = this.webSpringBean.getModifiedDate4Cache(this.viewComponentId);
} catch (Exception exe) {
log.error("an unknown error occured", exe);
}
if (log.isDebugEnabled()) log.debug("end getModifiedDate with " + retDte);
return retDte;
}
/*
* (non-Javadoc)
* @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 {
AttributesImpl newAttr = new AttributesImpl(attrs);
contentHandler.startElement(uri, localName, qName, newAttr);
if (localName.equals("languageVersions")) {
UnitValue currentUnit = null;
ViewDocumentValue[] vdd = null;
try {
currentUnit = webSpringBean.getUnit4ViewComponent(viewComponentId);
vdd = webSpringBean.getViewDocuments4Site(webSpringBean.getSite4VCId(viewComponentId).getSiteId());
for (int i = 0; i < vdd.length; i++) {
String lang = vdd[i].getLanguage();
if (!lang.equals(this.currentLanguage)) { // give me only those vc's from other languages
try {
Integer unitId = currentUnit.getUnitId();
Integer viewDocumentId = vdd[i].getViewDocumentId();
ViewComponentValue viewComponentValue = webSpringBean.getViewComponent4Unit(unitId, viewDocumentId);
if (viewComponentValue != null) {
// Maybe for this language there is no page for this unit
if (webSpringBean.isVisibleForLanguageVersion(viewComponentValue, iAmTheLiveserver)) {
String langpath = webSpringBean.getPath4ViewComponent(viewComponentValue.getViewComponentId());
contentHandler.startElement(uri, "language", "language", new AttributesImpl());
contentHandler.startElement(uri, "langName", "langName", new AttributesImpl());
contentHandler.characters(lang.toCharArray(), 0, lang.length());
contentHandler.endElement(uri, "langName", "langName");
contentHandler.startElement(uri, "langUrl", "langUrl", new AttributesImpl());
contentHandler.characters(langpath.toCharArray(), 0, langpath.length());
contentHandler.endElement(uri, "langUrl", "langUrl");
contentHandler.endElement(uri, "language", "language");
}
}
} catch (Exception exe) { //if the vcl wont be found. thats ok :)
if (log.isDebugEnabled()) {
log.debug("An error occured", exe);
}
}
}
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
}