001 /** 002 * Copyright 2005-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.kew.notes.service.impl; 017 018 import java.io.BufferedOutputStream; 019 import java.io.File; 020 import java.io.FileOutputStream; 021 import java.util.logging.Logger; 022 023 import org.kuali.rice.kew.notes.Attachment; 024 import org.kuali.rice.kew.notes.service.AttachmentService; 025 import org.kuali.rice.kew.service.KEWServiceLocator; 026 027 028 /** 029 * Implementation of the {@link AttachmentService}. 030 * 031 * @author Kuali Rice Team (rice.collab@kuali.org) 032 */ 033 public class AttachmentServiceImpl implements AttachmentService { 034 035 protected final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AttachmentServiceImpl.class); 036 037 private static final String ATTACHMENT_PREPEND = "wf_att_"; 038 039 private String attachmentDir; 040 041 public void persistAttachedFileAndSetAttachmentBusinessObjectValue(Attachment attachment) throws Exception { 042 createStorageDirIfNecessary(); 043 String uniqueId = KEWServiceLocator.getResponsibilityIdService().getNewResponsibilityId(); 044 String internalFileIndicator = attachment.getFileName().replace('.', '_'); 045 String fileName = ATTACHMENT_PREPEND + attachment.getNote().getDocumentId() + "_" + internalFileIndicator + "_" + uniqueId; 046 File file = File.createTempFile(fileName, null, new File(attachmentDir)); 047 LOG.info("Persisting attachment at: " + file.getAbsolutePath()); 048 if (!file.canWrite()) { 049 throw new RuntimeException("Do not have permissions to write to attachment file at: " + file.getAbsolutePath()); 050 } 051 FileOutputStream streamOut = null; 052 BufferedOutputStream bufferedStreamOut = null; 053 try { 054 streamOut = new FileOutputStream(file); 055 bufferedStreamOut = new BufferedOutputStream(streamOut); 056 int c; 057 while ((c = attachment.getAttachedObject().read()) != -1) 058 { 059 bufferedStreamOut.write(c); 060 } 061 } finally { 062 if (bufferedStreamOut != null) { 063 bufferedStreamOut.close(); 064 } 065 if (streamOut != null) { 066 streamOut.close(); 067 } 068 } 069 attachment.setFileLoc(file.getAbsolutePath()); 070 } 071 072 public File findAttachedFile(Attachment attachment) throws Exception { 073 return new File(attachment.getFileLoc()); 074 } 075 076 public void deleteAttachedFile(Attachment attachment) throws Exception { 077 File file = new File(attachment.getFileLoc()); 078 if (! file.delete()) { 079 LOG.error("failed to delete file " + attachment.getFileLoc()); 080 } 081 } 082 083 private void createStorageDirIfNecessary() { 084 if (attachmentDir == null) { 085 throw new RuntimeException("Attachment Directory was not set when configuring workflow"); 086 } 087 File attachDir = new File(attachmentDir); 088 if (! attachDir.exists()) { 089 LOG.warn("No attachment directory found. Attempting to create directory " + attachmentDir); 090 boolean directoriesCreated = attachDir.mkdirs(); 091 if (!directoriesCreated) { 092 throw new RuntimeException("Failed to create directory for attachments at: " + attachDir.getAbsolutePath()); 093 } 094 } 095 if (!attachDir.canWrite()) { 096 throw new RuntimeException("Do not have permission to write to: " + attachDir.getAbsolutePath()); 097 } 098 } 099 100 public String getAttachmentDir() { 101 return attachmentDir; 102 } 103 104 public void setAttachmentDir(String attachmentDir) { 105 this.attachmentDir = attachmentDir; 106 } 107 108 }