/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc. * * 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 com.salesmanager.core.module.impl.application.files; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.configuration.Configuration; import org.apache.log4j.Logger; import com.salesmanager.core.CoreException; import com.salesmanager.core.constants.ErrorConstants; import com.salesmanager.core.entity.orders.FileHistory; import com.salesmanager.core.entity.orders.OrderProductDownload; import com.salesmanager.core.module.model.application.DownloadFileModule; import com.salesmanager.core.module.model.application.ProductFileModule; import com.salesmanager.core.service.ServiceFactory; import com.salesmanager.core.service.order.OrderException; import com.salesmanager.core.service.order.OrderService; import com.salesmanager.core.util.FileUtil; import com.salesmanager.core.util.PropertiesUtil; /** * Implementation for managing the creation and copy of files localy on the * server * * @author Carl Samson * */ public class LocalFileImpl extends CoreFileImpl implements ProductFileModule, DownloadFileModule { private static Configuration conf = PropertiesUtil.getConfiguration(); private static Logger log = Logger.getLogger(LocalFileImpl.class); private long productid; private String fileName; public void setProductId(long productid) { this.productid = productid; } public String getFileName() { return fileName; } public InputStream getFileInputStream(HttpServletRequest request) throws Exception { // parse token String fileid = request.getParameter("fileId"); Map fileInfo = FileUtil.getFileDownloadFileTokens(fileid); String fileId = (String) fileInfo.get("ID"); String date = (String) fileInfo.get("DATE"); String merchantId = (String) fileInfo.get("MERCHANTID"); // Compare the date Date today = new Date(); DateFormat d = new SimpleDateFormat("yyyy-MM-dd"); Date dt = null; dt = d.parse(date); if (dt.before(new Date(today.getTime()))) { // expired CoreException excpt = new CoreException( ErrorConstants.DELAY_EXPIRED); throw excpt; // String lbl = // LabelUtil.getInstance().getText("message.error.download.delayexpired1"); } OrderService oservice = (OrderService) ServiceFactory .getService(ServiceFactory.OrderService); OrderProductDownload download = oservice .getOrderProductDownload(new Long(fileId)); this.setFileName(download.getOrderProductFilename()); int maxcount = conf.getInt("core.product.file.downloadmaxcount", 5); // String filename = ""; FileHistory fh = oservice.getFileHistory(Integer.parseInt(merchantId), download.getFileId()); if (fh == null) { log .warn("Trying to update non existing file history [attrid " + download.getFileId() + "][merchantid " + merchantId + "]"); } else { int downloadcount = fh.getDownloadCount(); int newcount = downloadcount + 1; fh.setDownloadCount(newcount); oservice.saveOrUpdateFileHistory(fh); } int downloadcount = download.getDownloadCount(); if (downloadcount == maxcount) { OrderException oe = new OrderException("Maximum download reached", ErrorConstants.MAXIMUM_ORDER_PRODUCT_DOWNLOAD_REACHED); throw oe; } int newcount = downloadcount + 1; download.setDownloadCount(newcount); oservice.saveOrUpdateOrderProductDownload(download); //String downloadPath = conf.getString("core.product.file.filefolder"); String downloadPath = FileUtil.getDownloadFilePath(); File file = new File(downloadPath + "/" + merchantId + "/" + download.getOrderProductFilename()); BufferedInputStream bis = new BufferedInputStream(new FileInputStream( file)); return bis; } public void handleResponse(HttpServletResponse response, InputStream fis) throws IOException { } public String getFileUrl(int merchantId, long downloadId) throws FileException { try { return FileUtil.getInternalDownloadFileUrl(merchantId, downloadId); } catch (Exception e) { log.error(e); } return ""; } public boolean deleteFile(int merchantid, File file, String folder) { if (folder != null) { String newFile = folder + "/" + file.getName(); file = new File(newFile); } return deleteFile(merchantid, file); } public boolean deleteFile(int merchantid, File file) { try { boolean direxist = file.exists(); if (direxist) { if (file.isDirectory()) { String[] children = file.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteFile(merchantid, new File(file, children[i])); if (!success) { return false; } } } } // The directory is now empty so delete it boolean delete = true; try { file.delete(); } catch (Exception e) { log.warn("File " + file.getName() + " does not exist"); } return delete; } finally { } } public String copyFile(int merchantid, String config, File file, String fileName, String contentType) throws FileException { try { String filefolder = conf.getString(config + ".filefolder"); if (filefolder == null) { throw new FileException(FileException.ERROR, "Properties " + config + ".filefolder not defined"); } // Check if merchant directory exist StringBuffer dirPath = new StringBuffer(); dirPath.append(FileUtil.getMediaPath()); dirPath.append(filefolder); dirPath.append("/"); dirPath.append(String.valueOf(merchantid)); String directory = dirPath.toString(); //String directory = filefolder + "/" + String.valueOf(merchantid); String dir = conf.getString(config + ".dirname"); String destinationdir = directory; if (dir != null) { destinationdir = directory + "/" + dir; } // do we need to clear String clear = conf.getString(config + ".cleanup", "false"); if (clear.equals("true")) { // will delete the directory if it exist this.deleteFile(merchantid, new File(destinationdir)); } // check if directory/merchantid exists boolean exists = (new File(directory)).exists(); if (!exists) { // create the directory merchant id File merchantdir = new File(directory); boolean successcreate = merchantdir.mkdir(); if (!successcreate) { throw new FileException(FileException.ERROR, "Can't create directory " + merchantdir); } } // create the destination directory File destfile = new File(destinationdir); boolean exists2 = (new File(destinationdir)).exists(); if (!exists2) { boolean successcreatefinal = destfile.mkdir(); if (!successcreatefinal) { throw new FileException(FileException.ERROR, "Can't create directory " + destfile); } } // check if file exist in destination File destfile2 = new File(destfile, fileName); boolean destfile2exist = destfile2.exists(); if (destfile2exist) { // remove it destfile2.delete(); } // Move file to new directory // boolean successcopy = file.renameTo(new File(destfile, // file.getName())); boolean successcopy = file.renameTo(new File(destfile, fileName)); if (!successcopy) { file.delete(); throw new FileException(FileException.ERROR, "Can't move file " + file.getName() + " to destfile"); } // delete temp file file.delete(); return destinationdir + "/" + fileName; } finally { } } public long getProductid() { return productid; } public void setProductid(long productid) { this.productid = productid; } public void setFileName(String fileName) { this.fileName = fileName; } }