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 }