AttachmentUtilities.java
/* This software was designed and created by Jason Carroll.
* Copyright (c) 2002, 2003, 2004 Jason Carroll.
* The author can be reached at jcarroll@cowsultants.com
* ITracker website: http://www.cowsultants.com
* ITracker forums: http://www.cowsultants.com/phpBB/index.php
*
* This program is free software; you can redistribute it and/or modify
* it only under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package org.itracker.web.util;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.itracker.core.resources.ITrackerResources;
import org.itracker.services.ConfigurationService;
import org.itracker.services.ITrackerServices;
import org.itracker.services.IssueService;
public class AttachmentUtilities {
private static final Logger logger = Logger.getLogger(AttachmentUtilities.class);
private static boolean initialized = false;
private static final String CONTENT_TYPE = "multipart/form-data";
private static final String CHAR_ENCODING = "ISO-8859-1";
private static final long MAX_FILE_SIZE_KB = 256L;
private static final long MAX_TOTAL_FILE_SIZE_KB = 1000000L;
private static long maxFileSize = MAX_FILE_SIZE_KB * 1024L;
private static long maxTotalFileSize = MAX_TOTAL_FILE_SIZE_KB * 1024L;
private static long spaceLeft = 0;
public static ActionMessages validate(FormFile file, ITrackerServices services) {
ActionMessages msg = new ActionMessages();
if (!initialized) {
if (!init(services)) {
msg.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.system"));
return msg;
}
}
if (file == null) {
return msg;
}
long origFileSize = file.getFileSize();
if (origFileSize > maxFileSize) {
logger.info("Cannot save attachment. File is " + (origFileSize / 1024L) + " kB and max file size is set to " + (maxFileSize / 1024L) + "kB.");
msg.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.validate.attachment.size", (Math.round((maxFileSize / 1024L) * 100) / 100) + " " + ITrackerResources.getString("itracker.web.generic.kilobyte")));
return msg;
}
if ((spaceLeft - origFileSize) < 0) {
logger.info("Cannot save attachment. Total allocated disk space already used.");
msg.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.validate.attachment.quota", (Math.round((maxTotalFileSize / 1024L) * 100) / 100) + " " + ITrackerResources.getString("itracker.web.generic.kilobyte")));
}
spaceLeft = spaceLeft - origFileSize;
return msg;
}
private static boolean init(ITrackerServices services) {
if (!initialized) {
try {
ConfigurationService configurationService = services.getConfigurationService();
IssueService issueService = services.getIssueService();
maxFileSize = configurationService.getLongProperty("max_attachment_size", MAX_FILE_SIZE_KB) * 1024L;
maxTotalFileSize = configurationService.getLongProperty("max_total_attachment_size", MAX_TOTAL_FILE_SIZE_KB) * 1024L;
spaceLeft = maxTotalFileSize - issueService.getAllIssueAttachmentSize();
if (logger.isDebugEnabled()) {
logger.debug("Attachment Properties: MaxAttachmentSize set to " + (maxFileSize / 1024L) + " kB");
logger.debug("Attachment Properties: MaxTotalAttachmentsSize set to " + (maxTotalFileSize / 1024L) + " kB");
logger.debug("Attachment Properties: Current space left is " + (spaceLeft / 1024L) + " kB");
}
initialized = true;
} catch (Exception e) {
logger.error("Exception initializing AttachmentUtilities.", e);
throw new Error("Failed to initialize AttachmentUtilities.", e);
}
}
return initialized;
}
public static String getCONTENT_TYPE() {
return CONTENT_TYPE;
}
public static String getCHAR_ENCODING() {
return CHAR_ENCODING;
}
}