/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.deliver.applications.actions; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.security.Principal; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController; import org.infoglue.cms.controllers.kernel.impl.simple.ServerNodeController; import org.infoglue.cms.entities.content.DigitalAssetVO; import org.infoglue.cms.security.InfoGluePrincipal; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.deliver.applications.databeans.DeliveryContext; import org.infoglue.deliver.controllers.kernel.impl.simple.ContentDeliveryController; /** * This is the action that takes care of all incoming update-calls. This action is * called by either the system or by replication-program and the class the distibutes the * update-call to all the listeners which have registered earlier. * * @author Mattias Bogeblad */ public class DownloadAssetAction extends InfoGlueAbstractAction { private final static Logger logger = Logger.getLogger(DownloadAssetAction.class.getName()); private Integer digitalAssetId; private Integer siteNodeId; private Integer contentId; private Integer languageId; private String assetKey; private Principal principal = null; private DigitalAssetVO digitalAssetVO; private String assetFilePath = ""; /** * This method is the application entry-point. The parameters has been set through the setters * and now we just have to render the appropriate output. */ public String doExecute() throws Exception { HttpServletResponse response = this.getResponse(); if(digitalAssetId != null && !ServerNodeController.getController().getIsIPAllowed(getRequest())) { logger.error("A client with IP " + getRequest().getRemoteAddr() + " was denied access to the download action. Could be a hack attempt or you have just not configured the allowed IP-addresses correct."); return null; } principal = (Principal)this.getHttpSession().getAttribute("infogluePrincipal"); getAssetInformation(); //logger.info("assetFilePath:" + assetFilePath); //logger.info("digitalAssetVO:" + digitalAssetVO); if(assetFilePath != null && digitalAssetVO != null) { response.setContentType(digitalAssetVO.getAssetContentType()); // print some html ServletOutputStream out = response.getOutputStream(); // print the file InputStream in = null; try { in = new BufferedInputStream(new FileInputStream(assetFilePath)); int ch; while ((ch = in.read()) !=-1) { out.print((char)ch); } } finally { if (in != null) in.close(); // very important } return NONE; } response.sendError(302); return NONE; } private void getAssetInformation() throws Exception { if(logger.isDebugEnabled()) logger.debug("Getting asset information...."); if(digitalAssetId != null) { this.digitalAssetVO = DigitalAssetController.getDigitalAssetVOWithId(digitalAssetId); if(logger.isDebugEnabled()) logger.debug("this.digitalAssetVO:" + this.digitalAssetVO); if(this.digitalAssetVO != null) this.assetFilePath = DigitalAssetController.getDigitalAssetFilePath(this.digitalAssetVO.getId()); } else { if(CmsPropertyHandler.getApplicationName().equalsIgnoreCase("cms")) { if(logger.isDebugEnabled()) { logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); logger.info("assetKey:" + assetKey); } this.digitalAssetVO = DigitalAssetController.getDigitalAssetVO(contentId, languageId, assetKey, true); if(this.digitalAssetVO != null) this.assetFilePath = DigitalAssetController.getDigitalAssetProtectedFilePath(this.digitalAssetVO.getId()); } else { ContentDeliveryController cdc = ContentDeliveryController.getContentDeliveryController(); Database db = CastorDatabaseService.getDatabase(); try { db.begin(); DeliveryContext deliveryContext = DeliveryContext.getDeliveryContext(); //assetUrl = cdc.getAssetUrl(db, contentId, languageId, assetKey, siteNodeId, true, deliveryContext, this.getInfoGluePrincipal()); logger.info("principal:" + this.principal); if(this.principal == null) { this.principal = this.getInfoGluePrincipal(); if(this.principal == null) this.principal = getAnonymousPrincipal(); } //logger.info("principal:" + principal); Integer digitalAssetId = cdc.getDigitalAssetId(db, contentId, languageId, assetKey, siteNodeId, true, deliveryContext, (InfoGluePrincipal)principal); //logger.info("digitalAssetId:" + digitalAssetId); if(digitalAssetId != null) { this.digitalAssetVO = DigitalAssetController.getSmallDigitalAssetVOWithId(digitalAssetId, db); logger.info("digitalAssetVO:" + digitalAssetVO); if(this.digitalAssetVO != null) { this.assetFilePath = DigitalAssetController.getDigitalAssetProtectedFilePath(digitalAssetId); logger.info("assetFilePath:" + assetFilePath); } } commitTransaction(db); } catch (Exception e) { logger.error("Problem getting asset url:" + e.getMessage(), e); rollbackTransaction(db); } } } } public String getAssetKey() { return assetKey; } public void setAssetKey(String assetKey) { this.assetKey = assetKey; } public Integer getContentId() { return contentId; } public void setContentId(Integer contentId) { this.contentId = contentId; } public Integer getLanguageId() { return languageId; } public void setLanguageId(Integer languageId) { this.languageId = languageId; } public Integer getSiteNodeId() { return siteNodeId; } public void setSiteNodeId(Integer siteNodeId) { this.siteNodeId = siteNodeId; } public Integer getDigitalAssetId() { return digitalAssetId; } public void setDigitalAssetId(Integer digitalAssetId) { this.digitalAssetId = digitalAssetId; } }