/**
* 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.cocoon.reading;
import java.io.IOException;
import java.io.Serializable;
import java.util.Map;
import org.apache.avalon.excalibur.pool.Poolable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.ResourceNotFoundException;
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.reading.AbstractReader;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.TimeStampValidity;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;
import de.juwimm.cms.beans.WebServiceSpring;
import de.juwimm.cms.cocoon.helper.CocoonSpringHelper;
/**
*
* Some ways to get an image:<br/>
* <br/>
* Chance <b>one</b> to get an image is via request parameters:<br/>
* id = id of image<br/>
* typ = (s)tandard for images as it is stored<br/>
* = (t)humb image - scaled image<br/>
* = (p)review image<br/>
*<br/>
* <map:match pattern="img/ejbimage**"><br/>
* <map:read type="imagereader" /><br/>
* </map:match><br/>
*<br/>
*
* <b>Second</b> chance to get an image is via sitemap parameters:<br/>
* Possible parameters are the same as above. An advantage<br/>
* solving image reading that way is a better search engine<br/>
* optimized way to get images on pages.<br/>
*<br/>
* <img src="/img/123-t.jpg" alt="" title="" /><br/>
*<br/>
* <map:match pattern="img/*-*.*"><br/>
* <map:read type="imagereader"><br/>
* <map:parameter name="id" value="{1}" /><br/>
* <map:parameter name="typ" value="{2}" /><br/>
* </map:read><br/>
* </map:match><br/>
*<br/>
* and/or<br/>
* <br/>
* <img src="/img/123.jpg" alt="" title="" /><br/>
*<br/>
* <map:match pattern="img/*.*"><br/>
* <map:read type="imagereader"><br/>
* <map:parameter name="id" value="{1}" /><br/>
* </map:read><br/>
* </map:match><br/>
* <br/>
* It is also possible to filter the possibly placed description
* to get even better search engine optimization<br/>
*<br/>
* <img src="/img/123-t/my long description text goes here.jpg" alt="" title="" /><br/>
*<br/>
* <map:match pattern="img/*-*/**"><br/>
* <map:read type="imagereader"><br/>
* <map:parameter name="id" value="{1}" /><br/>
* <map:parameter name="typ" value="{2}" /><br/>
* </map:read><br/>
* </map:match><br/>
*<br/>
* <img src="/img/123/t/my long description text goes here.jpg" alt="" title="" /><br/>
*<br/>
* <map:match pattern="img/*/*/**"><br/>
* <map:read type="imagereader"><br/>
* <map:parameter name="id" value="{1}" /><br/>
* <map:parameter name="typ" value="{2}" /><br/>
* </map:read><br/>
* </map:match><br/>
*<br/>
* <img src="/img/123/my long description text goes here.jpg" alt="" title="" /><br/>
*<br/>
* <map:match pattern="img/*/**"><br/>
* <map:read type="imagereader"><br/>
* <map:parameter name="id" value="{1}" /><br/>
* </map:read><br/>
* </map:match><br/>
* <br/>
* @author <a href="mailto:kulawik@juwimm.com">Sascha Kulawik</a>
* @author <a href="mailto:carsten.schalm@juwimm.com">Carsten Schalm</a>
* @author <a href="mailto:michael.frankfurter@juwimm.com">Michael Frankfurter</a>
* company Juwi|MacMillan Group Gmbh, Walsrode, Germany
* @version $Id$
*/
public class CmsImageReader extends AbstractReader implements Poolable, CacheableProcessingComponent {
private static Logger log = Logger.getLogger(CmsImageReader.class);
private long chgDate = 0;
private byte[] ressource = null;
private WebServiceSpring webSpringBean = null;
private Integer primaryKey;
private String strBez = "";
public void supersetup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException {
super.setup(resolver, objectModel, src, par);
}
@Override
public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException {
supersetup(resolver, objectModel, src, par);
try {
try {
webSpringBean = (WebServiceSpring) CocoonSpringHelper.getBean(objectModel, CocoonSpringHelper.WEB_SERVICE_SPRING);
} catch (Exception exf) {
log.error("Could not load webservicespringbean!", exf);
}
Request request = ObjectModelHelper.getRequest(objectModel);
if (par.isParameter("id")) {
primaryKey = Integer.valueOf(par.getParameterAsInteger("id"));
strBez = (par.isParameter("typ")) ? par.getParameter("typ") : null;
} else {
primaryKey = new Integer(request.getParameter("id"));
try {
strBez = request.getParameter("typ");
} catch (Exception e) {
strBez = "s";
}
}
if (strBez == null || strBez.equals("")) strBez = "s";
} catch (Exception e) {
throw new ResourceNotFoundException("error:", e);
}
if (log.isDebugEnabled()) log.debug("Fine setup");
}
public void generate() throws java.io.IOException, org.xml.sax.SAXException, org.apache.cocoon.ProcessingException {
try {
//Response response = ObjectModelHelper.getResponse(objectModel);
if (strBez.equals("t")) {
this.ressource = getWebServiceSpring().getThumbnail(this.primaryKey);
} else if (strBez.equals("p")) {
this.ressource = getWebServiceSpring().getPreview(this.primaryKey);
} else {
this.ressource = getWebServiceSpring().getPicture(this.primaryKey);
}
if (this.ressource == null) {
throw new ResourceNotFoundException("The Blob is empty!");
}
//response.setHeader("Content-disposition", "inline;filename=" + this.filename);
out.write(ressource);
out.flush();
} catch (IOException ioe) {
if (log.isDebugEnabled()) log.debug("Assuming client reset stream");
} catch (Exception e) {
throw new ResourceNotFoundException("DatabaseReader error:", e);
}
if (log.isDebugEnabled()) log.debug("Fine generating");
}
public Serializable getKey() {
if (strBez.equals("t")) {
return "t" + this.primaryKey;
}
if (strBez.equals("p")) {
return "p" + this.primaryKey;
}
return "s" + this.primaryKey;
}
public SourceValidity getValidity() {
chgDate = 0;
try {
chgDate = getWebServiceSpring().getTimestamp4Picture(this.primaryKey).longValue();
} catch (Exception exe) {
}
if (chgDate != 0) {
return new TimeStampValidity(chgDate);
}
return null;
}
protected WebServiceSpring getWebServiceSpring() {
return webSpringBean;
}
@Override
public String getMimeType() {
String mimetype = "image/jpeg";
try {
mimetype = getWebServiceSpring().getMimetype4Picture(this.primaryKey);
} catch (Exception e) {
}
return mimetype;
}
/**
* @return Returns the ressource.
*/
protected byte[] getRessource() {
return this.ressource;
}
/**
* @param ressource The ressource to set.
*/
protected void setRessource(byte[] ressource) {
this.ressource = ressource;
}
/**
* @return Returns the chgDate.
*/
protected long getChgDate() {
return this.chgDate;
}
/**
* @param chgDate The chgDate to set.
*/
protected void setChgDate(long chgDate) {
this.chgDate = chgDate;
}
/**
* @return Returns the primaryKey.
*/
protected Integer getPrimaryKey() {
return this.primaryKey;
}
/**
* @param primaryKey The primaryKey to set.
*/
protected void setPrimaryKey(Integer primaryKey) {
this.primaryKey = primaryKey;
}
}