/**
* 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.util.HashMap;
import java.util.Map;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.transformation.AbstractTransformer;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import de.juwimm.cms.beans.WebServiceSpring;
import de.juwimm.cms.cocoon.helper.CocoonSpringHelper;
/**
* Transformer parses input for XML like this:<br/>
* <pre>
* <page viewComponentId="639">
* <pageName></pageName>
* <pageUrl></pageUrl>
* </page>
* </pre>
* <p><h5>Configuration:</h5>
* <pre>
* <map:transformer name="vcresolve" src="de.juwimm.cms.cocoon.transformation.ViewComponentResolveTransformer"/>
* </pre>
* </p>
* <p><h5>Usage:</h5>
* Just put code like this in your pipeline:
* <pre>
* <map:transform type="vcresolve" />
* </pre>
* </p>
* <p><h5>Result:</h5>
* In your content you get a result like this:
* <pre>
* <page viewComponentId="639">
* <pageName>bä<n>ane</pageName>
* <pageUrl>/deutsch/banane</pageUrl>
* </page>
* </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.4.13
*/
public class ViewComponentResolveTransformer extends AbstractTransformer {
private static Logger log = Logger.getLogger(ViewComponentResolveTransformer.class);
private Map<Integer, String> path4ViewComponentCacheMap = new HashMap<Integer, String>();
private Map<Integer, String> name4ViewComponentCacheMap = new HashMap<Integer, String>();
private WebServiceSpring webSpringBean = null;
private Integer viewComponentId = null;
/*
* @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 {
try {
this.webSpringBean = (WebServiceSpring) CocoonSpringHelper.getBean(objectModel, CocoonSpringHelper.WEB_SERVICE_SPRING);
} catch (Exception e) {
log.error("Could not load WebServiceSpring: " + e.getMessage(), e);
}
}
/*
* @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 {
super.startElement(uri, localName, qName, attrs);
if (localName.equals("page")) {
try {
this.viewComponentId = Integer.valueOf(attrs.getValue("viewComponentId"));
} catch (Exception e) {
log.warn("Error parsing viewComponentId! " + e.getMessage());
}
} else if (localName.equals("pageUrl")) {
String url = this.getPath4ViewComponent();
if (url != null) super.characters(url.toCharArray(), 0, url.length());
} else if (localName.equals("pageName")) {
String displayName = this.getName4ViewComponent();
if (displayName != null) super.characters(displayName.toCharArray(), 0, displayName.length());
}
}
private String getPath4ViewComponent() {
String result = this.path4ViewComponentCacheMap.get(this.viewComponentId);
if (result == null) {
String requestPath = "";
String requestLang = "";
try {
requestLang = webSpringBean.getViewDocument4ViewComponentId(this.viewComponentId).getLanguage();
} catch (Exception e) {
}
try {
requestPath = webSpringBean.getPath4ViewComponent(this.viewComponentId);
} catch (Exception e) {
}
result = "/" + requestLang + "/" + requestPath;
this.path4ViewComponentCacheMap.put(this.viewComponentId, result);
}
return result;
}
private String getName4ViewComponent() {
String displayName = this.name4ViewComponentCacheMap.get(this.viewComponentId);
if (displayName == null) {
try {
displayName = webSpringBean.getViewComponent4Id(this.viewComponentId).getDisplayLinkName();
} catch (Exception e) {
}
this.name4ViewComponentCacheMap.put(this.viewComponentId, displayName);
}
return displayName;
}
}