Java tutorial
/* * ConcourseConnect * Copyright 2009 Concursive Corporation * http://www.concursive.com * * This file is part of ConcourseConnect, an open source social business * software and community platform. * * Concursive ConcourseConnect is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, version 3 of the License. * * Under the terms of the GNU Affero General Public License you must release the * complete source code for any application that uses any part of ConcourseConnect * (system header files and libraries used by the operating system are excluded). * These terms must be included in any work that has ConcourseConnect components. * If you are developing and distributing open source applications under the * GNU Affero General Public License, then you are free to use ConcourseConnect * under the GNU Affero General Public License. * * If you are deploying a web site in which users interact with any portion of * ConcourseConnect over a network, the complete source code changes must be made * available. For example, include a link to the source archive directly from * your web site. * * For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their * products, and do not license and distribute their source code under the GNU * Affero General Public License, Concursive provides a flexible commercial * license. * * To anyone in doubt, we recommend the commercial license. Our commercial license * is competitively priced and will eliminate any confusion about how * ConcourseConnect can be used and distributed. * * ConcourseConnect 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with ConcourseConnect. If not, see <http://www.gnu.org/licenses/>. * * Attribution Notice: ConcourseConnect is an Original Work of software created * by Concursive Corporation */ package com.concursive.connect.web.modules.documents.dao; import com.concursive.commons.db.DatabaseUtils; import com.concursive.commons.text.StringUtils; import com.concursive.commons.web.mvc.beans.GenericBean; import com.concursive.connect.Constants; import com.concursive.connect.cache.utils.CacheUtils; import com.concursive.connect.web.modules.common.social.rating.dao.Rating; import com.concursive.connect.web.modules.profile.dao.Project; import com.concursive.connect.web.modules.profile.utils.ProjectUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; import java.sql.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; /** * Description of the Class * * @author matt rajkowski * @version $Id$ * @created February 8, 2002 */ public class FileItem extends GenericBean { private static Log LOG = LogFactory.getLog(FileItem.class); public final static String fs = System.getProperty("file.separator"); public static final String TABLE = "project_files"; public static final String PRIMARY_KEY = "item_id"; protected int linkModuleId = -1; protected int linkItemId = -1; protected int id = -1; protected int folderId = -1; protected String subject = ""; protected String clientFilename = ""; protected String filename = ""; protected String directory = ""; protected int size = 0; protected double version = 0; protected String image = null; protected boolean enabled = false; protected boolean defaultFile = false; protected boolean doVersionInsert = true; protected int downloads = 0; protected java.sql.Timestamp entered = null; protected int enteredBy = -1; protected java.sql.Timestamp modified = null; protected int modifiedBy = -1; protected FileItemVersionList versionList = null; protected String thumbnailFilename = null; protected int imageWidth = 0; protected int imageHeight = 0; protected String comment = null; protected boolean featuredFile = false; protected int ratingCount = 0; protected int ratingValue = 0; protected double ratingAvg = 0.0; protected int inappropriateCount = 0; protected String fileAttachment = null; /** * Constructor for the FileItem object */ public FileItem() { } /** * Constructor for the FileItem object * * @param db Description of the Parameter * @param itemId Description of the Parameter * @throws SQLException Description of the Exception */ public FileItem(Connection db, int itemId) throws SQLException { queryRecord(db, itemId); } /** * Constructor for the FileItem object * * @param db Description of the Parameter * @param itemId Description of the Parameter * @param moduleItemId Description of the Parameter * @param moduleId Description of the Parameter * @throws SQLException Description of the Exception */ public FileItem(Connection db, int itemId, int moduleItemId, int moduleId) throws SQLException { this.linkModuleId = moduleId; this.linkItemId = moduleItemId; queryRecord(db, itemId); } /** * Constructor for the FileItem object when the linkItemId is programmed to * have only ONE fileItem * * @param db Description of the Parameter * @param moduleItemId Description of the Parameter * @param moduleId Description of the Parameter * @throws SQLException Description of the Exception */ public FileItem(Connection db, int moduleItemId, int moduleId) throws SQLException { this.linkModuleId = moduleId; this.linkItemId = moduleItemId; queryRecord(db, -1); } /** * Description of the Method * * @param db Description of the Parameter * @param itemId Description of the Parameter * @throws SQLException Description of the Exception */ protected void queryRecord(Connection db, int itemId) throws SQLException { StringBuffer sql = new StringBuffer(); sql.append("SELECT f.*, t.filename AS thumbnail " + "FROM project_files f " + "LEFT JOIN project_files_thumbnail t ON (f.item_id = t.item_id AND f.version = t.version) " + "WHERE f.item_id > 0 "); if (itemId > -1) { sql.append("AND f.item_id = ? "); } if (linkModuleId > -1) { sql.append("AND f.link_module_id = ? "); } if (linkItemId > -1) { sql.append("AND f.link_item_id = ? "); } PreparedStatement pst = db.prepareStatement(sql.toString()); int i = 0; if (itemId > -1) { pst.setInt(++i, itemId); } if (linkModuleId > -1) { pst.setInt(++i, linkModuleId); } if (linkItemId > -1) { pst.setInt(++i, linkItemId); } ResultSet rs = pst.executeQuery(); if (rs.next()) { buildRecord(rs, false); } else { rs.close(); pst.close(); throw new SQLException("File record not found."); } rs.close(); pst.close(); } /** * Constructor for the FileItem object * * @param rs Description of Parameter * @throws SQLException Description of Exception */ public FileItem(ResultSet rs) throws SQLException { buildRecord(rs, false); } /** * Constructor for the FileItem object * * @param rs Description of Parameter * @param isVersion Description of Parameter * @throws SQLException Description of Exception */ public FileItem(ResultSet rs, boolean isVersion) throws SQLException { buildRecord(rs, isVersion); } /** * Gets the datePath attribute of the FileItem class * * @param fileDate Description of Parameter * @return The datePath value */ public static String getDatePath(java.sql.Timestamp fileDate) { SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy"); String datePathToUse1 = formatter1.format(fileDate); SimpleDateFormat formatter2 = new SimpleDateFormat("MMdd"); String datePathToUse2 = formatter2.format(fileDate); return datePathToUse1 + fs + datePathToUse2 + fs; } /** * Gets the datePath attribute of the FileItem class * * @param filenameDate Description of the Parameter * @return The datePath value */ public static String getDatePath(String filenameDate) { if (filenameDate.length() > 7) { return (filenameDate.substring(0, 4) + fs + filenameDate.substring(4, 8) + fs); } else { return null; } } /** * Gets the fullFilePath attribute of the FileItem object * * @return The fullFilePath value */ public String getFullFilePath() { if ("".equals(directory)) { return filename; } else { if (modified != null) { return directory + getDatePath(modified) + filename; } else { return directory + getDatePath(filename) + filename; } } } /** * Sets the linkModuleId attribute of the FileItem object * * @param tmp The new linkModuleId value */ public void setLinkModuleId(int tmp) { linkModuleId = tmp; } /** * Sets the linkModuleId attribute of the FileItem object * * @param tmp The new linkModuleId value */ public void setLinkModuleId(String tmp) { linkModuleId = Integer.parseInt(tmp); } /** * Sets the linkItemId attribute of the FileItem object * * @param tmp The new linkItemId value */ public void setLinkItemId(int tmp) { linkItemId = tmp; } /** * Sets the linkItemId attribute of the FileItem object * * @param tmp The new linkItemId value */ public void setLinkItemId(String tmp) { linkItemId = Integer.parseInt(tmp); } /** * Sets the id attribute of the FileItem object * * @param tmp The new id value */ public void setId(int tmp) { this.id = tmp; } /** * Sets the id attribute of the FileItem object * * @param tmp The new id value */ public void setId(String tmp) { this.id = Integer.parseInt(tmp); } /** * Sets the folderId attribute of the FileItem object * * @param tmp The new folderId value */ public void setFolderId(int tmp) { this.folderId = tmp; } /** * Sets the folderId attribute of the FileItem object * * @param tmp The new folderId value */ public void setFolderId(String tmp) { this.folderId = Integer.parseInt(tmp); } /** * Sets the subject attribute of the FileItem object * * @param tmp The new subject value */ public void setSubject(String tmp) { this.subject = tmp; } /** * Sets the clientFilename attribute of the FileItem object * * @param tmp The new clientFilename value */ public void setClientFilename(String tmp) { this.clientFilename = tmp; } /** * Sets the filename attribute of the FileItem object * * @param tmp The new filename value */ public void setFilename(String tmp) { this.filename = tmp; } /** * Sets the directory attribute of the FileItem object * * @param tmp The new directory value */ public void setDirectory(String tmp) { this.directory = tmp; } /** * Sets the size attribute of the FileItem object * * @param tmp The new size value */ public void setSize(int tmp) { this.size = tmp; } /** * Sets the size attribute of the FileItem object * * @param tmp The new size value */ public void setSize(String tmp) { this.size = Integer.parseInt(tmp); } /** * Sets the version attribute of the FileItem object * * @param tmp The new version value */ public void setVersion(double tmp) { this.version = tmp; } /** * Sets the version attribute of the FileItem object * * @param tmp The new version value */ public void setVersion(String tmp) { this.version = Double.parseDouble(tmp); } /** * Sets the image attribute of the FileItem object * * @param tmp The new image value */ public void setImage(String tmp) { this.image = tmp; } /** * Sets the entered attribute of the FileItem object * * @param tmp The new entered value */ public void setEntered(java.sql.Timestamp tmp) { this.entered = tmp; } /** * Sets the entered attribute of the FileItem object * * @param tmp The new entered value */ public void setEntered(String tmp) { this.entered = DatabaseUtils.parseTimestamp(tmp); } /** * Sets the enteredBy attribute of the FileItem object * * @param tmp The new enteredBy value */ public void setEnteredBy(int tmp) { this.enteredBy = tmp; } /** * Sets the enteredBy attribute of the FileItem object * * @param tmp The new enteredBy value */ public void setEnteredBy(String tmp) { this.enteredBy = Integer.parseInt(tmp); } /** * Sets the modified attribute of the FileItem object * * @param tmp The new modified value */ public void setModified(java.sql.Timestamp tmp) { this.modified = tmp; } /** * Sets the modified attribute of the FileItem object * * @param tmp The new modified value */ public void setModified(String tmp) { this.modified = DatabaseUtils.parseTimestamp(tmp); } /** * Sets the modifiedBy attribute of the FileItem object * * @param tmp The new modifiedBy value */ public void setModifiedBy(int tmp) { this.modifiedBy = tmp; } /** * Sets the modifiedBy attribute of the FileItem object * * @param tmp The new modifiedBy value */ public void setModifiedBy(String tmp) { this.modifiedBy = Integer.parseInt(tmp); } /** * Sets the enabled attribute of the FileItem object * * @param tmp The new enabled value */ public void setEnabled(boolean tmp) { this.enabled = tmp; } /** * Sets the enabled attribute of the FileItem object * * @param tmp The new enabled value */ public void setEnabled(String tmp) { this.enabled = DatabaseUtils.parseBoolean(tmp); } /** * Sets the defaultFile attribute of the FileItem object * * @param tmp The new defaultFile value */ public void setDefaultFile(boolean tmp) { this.defaultFile = tmp; } /** * Sets the defaultFile attribute of the FileItem object * * @param tmp The new defaultFile value */ public void setDefaultFile(String tmp) { defaultFile = DatabaseUtils.parseBoolean(tmp); } /** * Gets the defaultFile attribute of the FileItem object * * @return The defaultFile value */ public boolean getDefaultFile() { return defaultFile; } /** * Sets the downloads attribute of the FileItem object * * @param tmp The new downloads value */ public void setDownloads(int tmp) { downloads = tmp; } /** * Sets the downloads attribute of the FileItem object * * @param tmp The new downloads value */ public void setDownloads(String tmp) { downloads = Integer.parseInt(tmp); } /** * Sets the doVersionInsert attribute of the FileItem object * * @param tmp The new doVersionInsert value */ public void setDoVersionInsert(boolean tmp) { this.doVersionInsert = tmp; } /** * Sets the doVersionInsert attribute of the FileItem object * * @param tmp The new doVersionInsert value */ public void setDoVersionInsert(String tmp) { doVersionInsert = DatabaseUtils.parseBoolean(tmp); } /** * Sets the thumbnailFilename attribute of the FileItem object * * @param tmp The new thumbnailFilename value */ public void setThumbnailFilename(String tmp) { this.thumbnailFilename = tmp; } public void setImageWidth(int imageWidth) { this.imageWidth = imageWidth; } public void setImageHeight(int imageHeight) { this.imageHeight = imageHeight; } public void setImageSize(int[] imageSize) { if (imageSize.length == 2) { imageWidth = imageSize[0]; imageHeight = imageSize[1]; } } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } /** * @return the featuredFile */ public boolean getFeaturedFile() { return featuredFile; } /** * @param featuredFile the featuredFile to set */ public void setFeaturedFile(boolean featuredFile) { this.featuredFile = featuredFile; } public void setFeaturedFile(String featuredFile) { this.featuredFile = DatabaseUtils.parseBoolean(featuredFile); } /** * @return the ratingCount */ public int getRatingCount() { return ratingCount; } /** * @param ratingCount the ratingCount to set */ public void setRatingCount(int ratingCount) { this.ratingCount = ratingCount; } public void setRatingCount(String ratingCount) { this.ratingCount = Integer.parseInt(ratingCount); } /** * @return the ratingValue */ public int getRatingValue() { return ratingValue; } /** * @param ratingValue the ratingValue to set */ public void setRatingValue(int ratingValue) { this.ratingValue = ratingValue; } public void setRatingValue(String ratingValue) { this.ratingValue = Integer.parseInt(ratingValue); } /** * @return the ratingAvg */ public double getRatingAvg() { return ratingAvg; } /** * @param ratingAvg the ratingAvg to set */ public void setRatingAvg(double ratingAvg) { this.ratingAvg = ratingAvg; } public void setRatingAvg(String ratingAvg) { this.ratingAvg = Double.parseDouble(ratingAvg); } /** * @return the inappropriateCount */ public int getInappropriateCount() { return inappropriateCount; } /** * @param inappropriateCount the inappropriateCount to set */ public void setInappropriateCount(int inappropriateCount) { this.inappropriateCount = inappropriateCount; } public void setInappropriateCount(String inappropriateCount) { this.inappropriateCount = Integer.parseInt(inappropriateCount); } public String getFileAttachment() { return fileAttachment; } public void setFileAttachment(String fileAttachment) { this.fileAttachment = fileAttachment; } /** * Gets the doVersionInsert attribute of the FileItem object * * @return The doVersionInsert value */ public boolean getDoVersionInsert() { return doVersionInsert; } /** * Gets the linkModuleId attribute of the FileItem object * * @return The linkModuleId value */ public int getLinkModuleId() { return linkModuleId; } /** * Gets the linkItemId attribute of the FileItem object * * @return The linkItemId value */ public int getLinkItemId() { return linkItemId; } /** * Gets the id attribute of the FileItem object * * @return The id value */ public int getId() { return id; } /** * Gets the folderId attribute of the FileItem object * * @return The folderId value */ public int getFolderId() { return folderId; } /** * Gets the subject attribute of the FileItem object * * @return The subject value */ public String getSubject() { return subject; } /** * Gets the clientFilename attribute of the FileItem object * * @return The clientFilename value */ public String getClientFilename() { return clientFilename; } /** * Gets the extension attribute of the FileItem object * * @return The extension value */ public String getExtension() { return getExtension(clientFilename); } /** * Gets the extension attribute of the FileItem class * * @param clientFilename Description of the Parameter * @return The extension value */ public static String getExtension(String clientFilename) { if (clientFilename.indexOf(".") > 0) { return clientFilename.substring(clientFilename.lastIndexOf(".")).toLowerCase(); } else { return ""; } } /** * Gets the filename attribute of the FileItem object * * @return The filename value */ public String getFilename() { return filename; } /** * Gets the directory attribute of the FileItem object * * @return The directory value */ public String getDirectory() { return directory; } /** * Gets the size attribute of the FileItem object * * @return The size value */ public int getSize() { return size; } /** * Gets the relativeSize attribute of the FileItem object * * @return The relativeSize value */ public int getRelativeSize() { int newSize = (size / 1000); if (newSize == 0) { return 1; } else { return newSize; } } /** * Gets the version attribute of the FileItem object * * @return The version value */ public double getVersion() { return version; } /** * Description of the Method * * @param version Description of the Parameter * @return Description of the Return Value */ public boolean hasVersion(double version) { return (getVersion(version) != null); } /** * Gets the version attribute of the FileItem object * * @param version Description of Parameter * @return The version value */ public FileItemVersion getVersion(double version) { if (versionList != null) { for (FileItemVersion thisVersion : versionList) { if (thisVersion.getVersion() == version) { return thisVersion; } } } return null; } /** * Gets the versionNextMajor attribute of the FileItem object * * @return The versionNextMajor value */ public String getVersionNextMajor() { return (((int) version + 1) + ".0"); } /** * Gets the versionNextMinor attribute of the FileItem object * * @return The versionNextMinor value */ public String getVersionNextMinor() { String value = String.valueOf(version); if (value.indexOf(".") > -1) { value = value.substring(0, value.indexOf(".") + 2); } String newVersion = (new java.math.BigDecimal(value).add(new java.math.BigDecimal(".1"))).toString(); if (Double.parseDouble(newVersion) > (Double.parseDouble(getVersionNextMajor()))) { return getVersionNextMajor(); } else { return newVersion; } } /** * Gets the versionNextChanges attribute of the FileItem object * * @return The versionNextChanges value */ public String getVersionNextChanges() { return (new java.math.BigDecimal("" + version).add(new java.math.BigDecimal(".01"))).toString(); } /** * Gets the image attribute of the FileItem object * * @return The image value */ public String getImage() { return image; } public String getImageTag(String imageExt, String url) { return getImageTag(image, imageExt, getExtension(), url); } /** * Gets the imageTag attribute of the FileItem object * * @param imageSizeExtension Description of the Parameter * @param image Description of the Parameter * @param ext Description of the Parameter * @param imageUrl * @return The imageTag value */ public static String getImageTag(String image, String imageSizeExtension, String ext, String imageUrl) { if (image == null) { if (".bmp".equals(ext)) { image = "gnome-image-bmp"; } else if (".dia".equals(ext)) { image = "gnome-application-x-dia-diagram"; } else if (".doc".equals(ext)) { image = "gnome-application-msword"; } else if (".eps".equals(ext)) { image = "gnome-application-encapsulated_postscript"; } else if (".gif".equals(ext)) { image = "gnome-image-gif"; } else if (".gz".equals(ext)) { image = "gnome-compressed"; } else if (".gzip".equals(ext)) { image = "gnome-compressed"; } else if (".html".equals(ext)) { image = "gnome-text-html"; } else if (".jar".equals(ext)) { image = "gnome-application-x-jar"; } else if (".java".equals(ext)) { image = "gnome-application-x-java-source"; } else if (".jpeg".equals(ext)) { image = "gnome-image-jpeg"; } else if (".jpg".equals(ext)) { image = "gnome-image-jpeg"; } else if (".midi".equals(ext)) { image = "gnome-audio-midi"; } else if (".mp3".equals(ext)) { image = "gnome-audio-mpg"; } else if (".mpeg".equals(ext)) { image = "gnome-video-mpeg"; } else if (".mpg".equals(ext)) { image = "gnome-video-mpeg"; } else if (".pdf".equals(ext)) { image = "gnome-application-pdf"; } else if (".png".equals(ext)) { image = "gnome-image-png"; } else if (".ppt".equals(ext)) { image = "gnome-application-vnd.ms-powerpoint"; } else if (".psd".equals(ext)) { image = "gnome-image-psd"; } else if (".ps".equals(ext)) { image = "gnome-application-postscript"; } else if (".sql".equals(ext)) { image = "gnome-text-x-sql"; } else if (".sdc".equals(ext)) { image = "gnome-application-x-generic-spreadsheet"; } else if (".sdd".equals(ext)) { image = "gnome-application-x-staroffice-presentation"; } else if (".sdw".equals(ext)) { image = "gnome-application-x-staroffice-words"; } else if (".sxc".equals(ext)) { image = "gnome-application-x-generic-spreadsheet"; } else if (".sxd".equals(ext)) { image = "gnome-application-x-openoffice-presentation"; } else if (".sxi".equals(ext)) { image = "gnome-application-x-openoffice-words"; } else if (".sxw".equals(ext)) { image = "gnome-application-x-openoffice-words"; } else if (".tgz".equals(ext)) { image = "gnome-compressed"; } else if (".tif".equals(ext)) { image = "gnome-image-tiff"; } else if (".tiff".equals(ext)) { image = "gnome-image-tiff"; } else if (".wav".equals(ext)) { image = "gnome-audio-x-wav"; } else if (".xls".equals(ext)) { image = "gnome-application-vnd.ms-excel"; } else if (".zip".equals(ext)) { image = "gnome-compressed"; } else { image = "gnome-text-plain"; } } return "<img border=\"0\" src=\"" + (imageUrl != null ? imageUrl : "") + "/images/mime/" + image + imageSizeExtension + ".png\" align=\"absmiddle\" alt=\"" + "" + "\" />"; } /** * Gets the thumbnail attribute of the FileItem object * * @param contextPath the url of the application * @return The thumbnail value */ public String getThumbnail(String contextPath) { if (hasThumbnail()) { return "<img border=\"0\" src=\"" + contextPath + "/ProjectManagementFiles.do?command=ShowThumbnail&p=" + linkItemId + "&i=" + id + "&v=" + version + "\" align=\"absmiddle\" alt=\"\" />"; } else { return getImageTag(image, "", getExtension(), contextPath); } } public String getFullImageFromAdmin(String contextPath) { if (hasThumbnail()) { return "<img border=\"0\" src=\"" + contextPath + "/Admin.do?command=Img&fileItemId=" + id + "\" align=\"absmiddle\" alt=\"\" />"; } else { return getImageTag(image, "", getExtension(), contextPath); } } /** * Gets the fullImage attribute of the FileItem object * * @return The fullImage value */ public String getFullImage(String contextPath) { if (isImageFormat() && hasValidImageSize()) { return "<img border=\"0\" src=\"" + contextPath + "/ProjectManagementFiles.do?command=ShowThumbnail&p=" + linkItemId + "&i=" + id + "&v=" + version + "&s=full" + "\" align=\"absmiddle\" alt=\"\" />"; } else { return getImageTag(image, "", getExtension(), contextPath); } } /** * Gets the entered attribute of the FileItem object * * @return The entered value */ public java.sql.Timestamp getEntered() { return entered; } /** * Gets the enteredString attribute of the FileItem object * * @return The enteredString value */ public String getEnteredString() { try { return DateFormat.getDateInstance(3).format(entered); } catch (NullPointerException e) { } return ""; } /** * Gets the enteredDateTimeString attribute of the FileItem object * * @return The enteredDateTimeString value */ public String getEnteredDateTimeString() { try { return DateFormat.getDateTimeInstance(3, 3).format(entered); } catch (NullPointerException e) { } return ""; } /** * Gets the enteredBy attribute of the FileItem object * * @return The enteredBy value */ public int getEnteredBy() { return enteredBy; } /** * Gets the modified attribute of the FileItem object * * @return The modified value */ public java.sql.Timestamp getModified() { return modified; } public Timestamp getModificationDate() { if (modified != null) { return modified; } if (entered != null) { return entered; } return new Timestamp((new java.util.Date()).getTime()); } /** * Gets the modifiedBy attribute of the FileItem object * * @return The modifiedBy value */ public int getModifiedBy() { return modifiedBy; } /** * Gets the downloads attribute of the FileItem object * * @return The downloads value */ public int getDownloads() { return downloads; } /** * Gets the enabled attribute of the FileItem object * * @return The enabled value */ public boolean getEnabled() { return enabled; } /** * Gets the versionList attribute of the FileItem object * * @return The versionList value */ public FileItemVersionList getVersionList() { return versionList; } /** * Gets the thumbnailFilename attribute of the FileItem object * * @return The thumbnailFilename value */ public String getThumbnailFilename() { return thumbnailFilename; } public int getImageWidth() { return imageWidth; } public int getImageHeight() { return imageHeight; } public Project getProject() { if (linkModuleId == Constants.PROJECTS_FILES) { return ProjectUtils.loadProject(linkItemId); } else if (linkModuleId == Constants.PROJECT_IMAGE_FILES) { return ProjectUtils.loadProject(linkItemId); } return null; } /** * Description of the Method * * @param db Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public boolean insert(Connection db) throws SQLException { if (!isValid()) { LOG.debug("Object validation failed"); return false; } boolean result = false; boolean doCommit = false; try { if (doCommit = db.getAutoCommit()) { db.setAutoCommit(false); } StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO project_files " + "(folder_id, subject, client_filename, filename, version, size, "); sql.append("enabled, downloads, "); if (entered != null) { sql.append("entered, "); } if (modified != null) { sql.append("modified, "); } sql.append(" link_module_id, link_item_id, " + " enteredby, modifiedby, default_file, image_width, image_height, comment, featured_file) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, "); if (entered != null) { sql.append("?, "); } if (modified != null) { sql.append("?, "); } sql.append("?, ?, ?, ?, ?, ?, ?, ?, ?) "); int i = 0; PreparedStatement pst = db.prepareStatement(sql.toString()); if (folderId > 0) { pst.setInt(++i, folderId); } else { pst.setNull(++i, java.sql.Types.INTEGER); } pst.setString(++i, subject); pst.setString(++i, clientFilename); pst.setString(++i, filename); pst.setDouble(++i, version); pst.setInt(++i, size); pst.setBoolean(++i, enabled); pst.setInt(++i, downloads); if (entered != null) { pst.setTimestamp(++i, entered); } if (modified != null) { pst.setTimestamp(++i, modified); } pst.setInt(++i, linkModuleId); pst.setInt(++i, linkItemId); pst.setInt(++i, enteredBy); pst.setInt(++i, modifiedBy); pst.setBoolean(++i, defaultFile); pst.setInt(++i, imageWidth); pst.setInt(++i, imageHeight); pst.setString(++i, comment); pst.setBoolean(++i, featuredFile); pst.execute(); pst.close(); id = DatabaseUtils.getCurrVal(db, "project_files_item_id_seq", -1); // New default item if (defaultFile) { updateDefaultRecord(db, linkModuleId, linkItemId, id); } // Insert the version information if (doVersionInsert) { FileItemVersion thisVersion = new FileItemVersion(); thisVersion.setId(this.getId()); thisVersion.setSubject(subject); thisVersion.setClientFilename(clientFilename); thisVersion.setFilename(filename); thisVersion.setVersion(version); thisVersion.setSize(size); thisVersion.setEnteredBy(enteredBy); thisVersion.setModifiedBy(modifiedBy); thisVersion.setImageWidth(imageWidth); thisVersion.setImageHeight(imageHeight); thisVersion.setComment(comment); thisVersion.insert(db); } logUpload(db); if (doCommit) { db.commit(); } result = true; } catch (Exception e) { e.printStackTrace(System.out); if (doCommit) { db.rollback(); } throw new SQLException(e.getMessage()); } finally { if (doCommit) { db.setAutoCommit(true); } } return result; } /** * Description of the Method * * @param db Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public boolean insertVersion(Connection db) throws SQLException { if (!isValid()) { return false; } boolean result = false; boolean doCommit = false; try { if (doCommit = db.getAutoCommit()) { db.setAutoCommit(false); } //Insert a new version of an existing file FileItemVersion thisVersion = new FileItemVersion(); thisVersion.setId(this.getId()); thisVersion.setSubject(subject); thisVersion.setClientFilename(clientFilename); thisVersion.setFilename(filename); thisVersion.setVersion(version); thisVersion.setSize(size); thisVersion.setEnteredBy(enteredBy); thisVersion.setModifiedBy(modifiedBy); thisVersion.setImageWidth(imageWidth); thisVersion.setImageHeight(imageHeight); thisVersion.setComment(comment); thisVersion.insert(db); //Update the master record int i = 0; PreparedStatement pst = db.prepareStatement("UPDATE project_files " + "SET subject = ?, client_filename = ?, filename = ?, version = ?, " + "size = ?, modifiedby = ?, modified = CURRENT_TIMESTAMP, comment = ?, image_width = ?, image_height = ? , featured_file = ? " + "WHERE item_id = ? "); pst.setString(++i, subject); pst.setString(++i, clientFilename); pst.setString(++i, filename); pst.setDouble(++i, version); pst.setInt(++i, size); pst.setInt(++i, modifiedBy); pst.setString(++i, comment); pst.setInt(++i, imageWidth); pst.setInt(++i, imageHeight); pst.setBoolean(++i, featuredFile); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); logUpload(db); if (doCommit) { db.commit(); } result = true; } catch (Exception e) { LOG.error("Could not insert version", e); if (doCommit) { db.rollback(); } throw new SQLException(e.getMessage()); } finally { if (doCommit) { db.setAutoCommit(true); } } return result; } /** * Description of the Method * * @param db Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public int update(Connection db) throws SQLException { if (this.getId() == -1) { throw new SQLException("ID was not specified"); } if (!isValid()) { return -1; } int resultCount = 0; boolean commit = db.getAutoCommit(); try { if (commit) { db.setAutoCommit(false); } int i = 0; // NOTE: Do not update the "modified" field because it is used for file paths PreparedStatement pst = db.prepareStatement("UPDATE project_files " + "SET subject = ?, client_filename = ?, default_file = ?, comment = ?, featured_file = ? " + "WHERE item_id = ? "); pst.setString(++i, subject); pst.setString(++i, clientFilename); pst.setBoolean(++i, defaultFile); pst.setString(++i, comment); pst.setBoolean(++i, featuredFile); pst.setInt(++i, this.getId()); resultCount = pst.executeUpdate(); pst.close(); // Set default if (defaultFile) { updateDefaultRecord(db, linkModuleId, linkItemId, id); } // Retrieve any versions this.buildVersionList(db); // Update version info for the corresponding file item version for (FileItemVersion latestVersion : versionList) { if (Double.toString(this.version).equals(Double.toString(latestVersion.getVersion()))) { latestVersion.setClientFilename(this.getClientFilename()); latestVersion.setSubject(this.getSubject()); latestVersion.setComment(this.getComment()); latestVersion.update(db); break; } } } catch (Exception e) { if (commit) { db.rollback(); } throw new SQLException(e.getMessage()); } finally { if (commit) { db.setAutoCommit(true); } } return resultCount; } /** * Description of the Method * * @param db Description of the Parameter * @param thisVersion Description of the Parameter * @return Description of the Return Value * @throws SQLException Description of the Exception */ public boolean updateVersion(Connection db, FileItemVersion thisVersion) throws SQLException { // Set the master record subject = thisVersion.getSubject(); clientFilename = thisVersion.getClientFilename(); filename = thisVersion.getFilename(); version = thisVersion.getVersion(); size = thisVersion.getSize(); enteredBy = thisVersion.getEnteredBy(); modifiedBy = thisVersion.getModifiedBy(); comment = thisVersion.getComment(); modified = thisVersion.getModified(); // Update the master record int i = 0; PreparedStatement pst = db.prepareStatement("UPDATE project_files " + "SET subject = ?, client_filename = ?, filename = ?, version = ?, " + "size = ?, modifiedby = ?, modified = ?, comment = ?, featured_file = ? " + "WHERE item_id = ? "); pst.setString(++i, subject); pst.setString(++i, clientFilename); pst.setString(++i, filename); pst.setDouble(++i, version); pst.setInt(++i, size); pst.setInt(++i, modifiedBy); pst.setTimestamp(++i, modified); pst.setString(++i, comment); pst.setBoolean(++i, featuredFile); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); return true; } /** * Description of the Method * * @param db Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public boolean updateCounter(Connection db) throws SQLException { FileDownloadLog thisLog = new FileDownloadLog(); thisLog.setItemId(id); thisLog.setVersion(version); thisLog.setUserId(enteredBy); thisLog.setFileSize(size); return thisLog.updateCounter(db); } /** * Description of the Method * * @param db Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public boolean buildVersionList(Connection db) throws SQLException { if (versionList == null) { versionList = new FileItemVersionList(); } else { versionList.clear(); } versionList.setItemId(this.getId()); versionList.buildList(db); return true; } /** * Description of the Method * * @param db Description of Parameter * @param baseFilePath Description of Parameter * @return Description of the Returned Value * @throws SQLException Description of Exception */ public boolean delete(Connection db, String baseFilePath) throws SQLException { if (id == -1) { throw new SQLException("Id not specified"); } this.buildVersionList(db); // Need to delete the actual files for (FileItemVersion thisVersion : versionList) { // For each version, delete the main record String filePath = baseFilePath + getDatePath(thisVersion.getEntered()); File fileToDelete = new File(filePath + thisVersion.getFilename()); if (!fileToDelete.delete()) { LOG.error("File not found -- could not delete file: " + fileToDelete.getPath()); } // Delete the thumbnails for this version ThumbnailList thumbnailList = new ThumbnailList(); thumbnailList.setItemId(thisVersion.getId()); thumbnailList.setVersion(thisVersion.getVersion()); thumbnailList.buildList(db); for (Thumbnail thisThumbnail : thumbnailList) { File thumbnailToDelete = new File(filePath + thisThumbnail.getFilename()); if (!thumbnailToDelete.delete()) { LOG.error("File thumbnail not found -- could not delete file: " + fileToDelete.getPath()); } } } boolean result = false; boolean commit = db.getAutoCommit(); try { if (commit) { db.setAutoCommit(false); } //Delete the ratings Rating.delete(db, this.getId(), TABLE, PRIMARY_KEY); // Delete the log of downloads int i = 0; PreparedStatement pst = db .prepareStatement("DELETE FROM project_files_download " + "WHERE item_id = ? "); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); // Delete the thumbnail i = 0; pst = db.prepareStatement("DELETE FROM project_files_thumbnail " + "WHERE item_id = ? "); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); // Delete all of the versions i = 0; pst = db.prepareStatement("DELETE FROM project_files_version " + "WHERE item_id = ? "); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); // Delete the master record i = 0; pst = db.prepareStatement("DELETE FROM project_files " + "WHERE item_id = ? "); pst.setInt(++i, this.getId()); pst.execute(); pst.close(); if (linkModuleId == Constants.PROJECT_IMAGE_FILES) { if (this.getDefaultFile()) { Project project = ProjectUtils.loadProject(linkItemId); // Enable the next image FileItemList files = new FileItemList(); files.setLinkModuleId(Constants.PROJECT_IMAGE_FILES); files.setLinkItemId(linkItemId); files.setIgnoreId(this.getId()); files.buildList(db); if (files.size() > 0) { project.setLogoId(files.get(0).getId()); } else { project.setLogoId(-1); } project.updateLogoId(db); } } if (commit) { db.commit(); } if (linkModuleId == Constants.PROJECT_IMAGE_FILES) { CacheUtils.invalidateValue(Constants.SYSTEM_PROJECT_CACHE, linkItemId); } result = true; } catch (Exception e) { if (commit) { db.rollback(); } throw new SQLException(e.getMessage()); } finally { if (commit) { db.setAutoCommit(true); } } return result; } /** * Gets the valid attribute of the FileItem object * * @return The valid value */ private boolean isValid() { if (linkModuleId == -1 || linkItemId == -1) { LOG.debug("linkModuleId=" + linkModuleId); LOG.debug("linkItemId=" + linkItemId); errors.put("actionError", "Id not specified"); } if (!StringUtils.hasText(subject)) { LOG.debug("subject=" + subject); errors.put("subjectError", "Required field"); } if (!StringUtils.hasText(clientFilename)) { LOG.debug("clientFilename=" + clientFilename); errors.put("clientFilenameError", "Required field"); } return !hasErrors(); } /** * Populates the object's properties from the result set * * @param rs Description of Parameter * @param isVersion Description of Parameter * @throws SQLException Description of Exception */ protected void buildRecord(ResultSet rs, boolean isVersion) throws SQLException { id = rs.getInt("item_id"); if (!isVersion) { linkModuleId = rs.getInt("link_module_id"); linkItemId = rs.getInt("link_item_id"); folderId = DatabaseUtils.getInt(rs, "folder_id", -1); } clientFilename = rs.getString("client_filename"); filename = rs.getString("filename"); subject = rs.getString("subject"); size = rs.getInt("size"); version = rs.getDouble("version"); enabled = rs.getBoolean("enabled"); downloads = rs.getInt("downloads"); entered = rs.getTimestamp("entered"); enteredBy = rs.getInt("enteredby"); modified = rs.getTimestamp("modified"); modifiedBy = rs.getInt("modifiedby"); if (!isVersion) { thumbnailFilename = rs.getString("thumbnail"); } defaultFile = rs.getBoolean("default_file"); imageWidth = rs.getInt("image_width"); imageHeight = rs.getInt("image_height"); comment = rs.getString("comment"); featuredFile = rs.getBoolean("featured_file"); ratingCount = DatabaseUtils.getInt(rs, "rating_count", 0); ratingValue = DatabaseUtils.getInt(rs, "rating_value", 0); ratingAvg = DatabaseUtils.getDouble(rs, "rating_avg", 0.0); inappropriateCount = DatabaseUtils.getInt(rs, "inappropriate_count", 0); } /** * Description of the Method * * @param db Description of the Parameter * @throws SQLException Description of the Exception */ private void logUpload(Connection db) throws SQLException { PreparedStatement pst = db.prepareStatement( "INSERT INTO usage_log " + "(enteredby, action, record_id, record_size) VALUES (?, ?, ?, ?) "); int i = 0; pst.setInt(++i, enteredBy); pst.setInt(++i, 1); pst.setInt(++i, id); pst.setInt(++i, size); pst.execute(); pst.close(); } /** * Description of the Method * * @param db Description of the Parameter * @param newFolderId Description of the Parameter * @throws SQLException Description of the Exception */ public void updateFolderId(Connection db, int newFolderId) throws SQLException { if (id == -1) { throw new SQLException("ID not specified"); } PreparedStatement pst = db .prepareStatement("UPDATE project_files " + "SET folder_id = ? " + "WHERE item_id = ?"); int i = 0; if (newFolderId > 0) { pst.setInt(++i, newFolderId); } else { pst.setNull(++i, java.sql.Types.INTEGER); } pst.setInt(++i, id); int count = pst.executeUpdate(); pst.close(); if (count == 1) { if (newFolderId > 0) { folderId = newFolderId; } else { folderId = -1; } } } /** * Gets the imageFormat attribute of the FileItem object * * @return The imageFormat value */ public boolean isImageFormat() { String extension = getExtension(); return (".gif".equals(extension) || ".jpg".equals(extension) || ".jpeg".equals(extension) || ".png".equals(extension) || ".bmp".equals(extension)); } public boolean hasValidImageSize() { return (imageHeight > 0 && imageWidth > 0); } /** * Description of the Method * * @return Description of the Return Value */ public boolean hasThumbnail() { return thumbnailFilename != null; } /** * Description of the Method * * @param db Description of the Parameter * @return Description of the Return Value * @throws SQLException Description of the Exception */ public boolean enable(Connection db) throws SQLException { if (this.getId() == -1) { throw new SQLException("File ID not specified"); } boolean success = false; int i = 0; PreparedStatement pst = db.prepareStatement("UPDATE project_files " + "SET enabled = " + DatabaseUtils.getTrue(db) + " " + "WHERE item_id = ? " + "AND modified = ? "); pst.setInt(++i, this.getId()); pst.setTimestamp(++i, this.getModified()); int resultCount = pst.executeUpdate(); pst.close(); if (resultCount == 1) { success = true; } return success; } /** * Description of the Method * * @param db Description of the Parameter * @return Description of the Return Value * @throws SQLException Description of the Exception */ public boolean disable(Connection db) throws SQLException { if (this.getId() == -1) { throw new SQLException("File ID not specified"); } boolean success = false; int i = 0; PreparedStatement pst = db.prepareStatement("UPDATE project_files SET " + "enabled = " + DatabaseUtils.getFalse(db) + " " + "WHERE item_id = ? " + "AND modified = ? "); pst.setInt(++i, this.getId()); pst.setTimestamp(++i, this.getModified()); int resultCount = pst.executeUpdate(); pst.close(); if (resultCount == 1) { success = true; } return success; } /** * Description of the Method * * @param db Description of the Parameter * @param linkModuleId Description of the Parameter * @param linkItemId Description of the Parameter * @param id Description of the Parameter * @throws SQLException Description of the Exception */ public static synchronized void updateDefaultRecord(Connection db, int linkModuleId, int linkItemId, int id) throws SQLException { // Turn off other defaults PreparedStatement pst = db.prepareStatement("UPDATE project_files " + "SET default_file = ? " + "WHERE link_module_id = ? " + "AND link_item_id = ? " + "AND default_file = ? "); int i = 0; pst.setBoolean(++i, false); pst.setInt(++i, linkModuleId); pst.setInt(++i, linkItemId); pst.setBoolean(++i, true); pst.execute(); pst.close(); // Turn on this default pst = db.prepareStatement( "UPDATE project_files " + "SET default_file = ? " + "WHERE item_id = ? " + "AND default_file = ? "); pst.setBoolean(1, true); pst.setInt(2, id); pst.setBoolean(3, false); pst.execute(); pst.close(); } /** * For temporary UI entries, this unique value can be used for file selector * * @return date based unique value */ public static String createUniqueValue() { Calendar cal = Calendar.getInstance(); return (String.valueOf(cal.get(Calendar.HOUR)) + String.valueOf(cal.get(Calendar.MINUTE)) + String.valueOf(cal.get(Calendar.SECOND)) + String.valueOf(cal.get(Calendar.MILLISECOND))); } public String getUrlName(String maxWidth, String maxHeight) { return getUrlName(Integer.parseInt(maxWidth), Integer.parseInt(maxHeight)); } public String getUrlName(int maxWidth, int maxHeight) { return linkModuleId + "-" + linkItemId + "-" + id + "-" + maxWidth + "x" + maxHeight + "/" + StringUtils.replace(StringUtils.toAllowedOnly( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890`~!@$^*()-_=+;:,.{}[]\" ", clientFilename), " ", "+"); } }