001/* 002 * Copyright 2012 Anyware Services 003 * 004 * Licensed under the Apache 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.apache.org/licenses/LICENSE-2.0 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 */ 016package org.ametys.plugins.core.upload; 017 018import java.io.IOException; 019import java.io.InputStream; 020import java.io.Reader; 021import java.util.Map; 022import java.util.NoSuchElementException; 023 024import org.apache.avalon.framework.parameters.Parameters; 025import org.apache.avalon.framework.service.ServiceException; 026import org.apache.avalon.framework.service.ServiceManager; 027import org.apache.avalon.framework.service.Serviceable; 028import org.apache.cocoon.ProcessingException; 029import org.apache.cocoon.ResourceNotFoundException; 030import org.apache.cocoon.environment.ObjectModelHelper; 031import org.apache.cocoon.environment.Request; 032import org.apache.cocoon.environment.SourceResolver; 033import org.xml.sax.SAXException; 034 035import org.ametys.core.upload.Upload; 036import org.ametys.core.upload.UploadManager; 037import org.ametys.core.user.CurrentUserProvider; 038import org.ametys.core.util.cocoon.AbstractResourceReader; 039 040/** 041 * {@link Reader} for generating binary output of previously uploaded file. 042 */ 043public class UploadReader extends AbstractResourceReader implements Serviceable 044{ 045 private CurrentUserProvider _currentUserProvider; 046 private UploadManager _uploadManager; 047 private Upload _upload; 048 049 @Override 050 public void service(ServiceManager serviceManager) throws ServiceException 051 { 052 _currentUserProvider = (CurrentUserProvider) serviceManager.lookup(CurrentUserProvider.ROLE); 053 _uploadManager = (UploadManager) serviceManager.lookup(UploadManager.ROLE); 054 } 055 056 @Override 057 protected void doSetup(SourceResolver res, Map objModel, String src, Parameters par) 058 { 059 Request request = ObjectModelHelper.getRequest(objModel); 060 String uploadId = request.getParameter("id"); 061 062 try 063 { 064 _upload = _uploadManager.getUpload(_currentUserProvider.getUser(), uploadId); 065 } 066 catch (NoSuchElementException e) 067 { 068 // Invalid upload id 069 getLogger().warn("Cannot find the temporary uploaded file with id " + (uploadId != null ? "'" + uploadId + "'" : "<null>")); 070 } 071 } 072 073 @Override 074 protected InputStream getInputStream() 075 { 076 return _upload.getInputStream(); 077 } 078 079 @Override 080 protected String getFilename() 081 { 082 return _upload.getFilename(); 083 } 084 085 @Override 086 protected String getEncodedFilename() 087 { 088 return null; 089 } 090 091 @Override 092 protected long getLength() 093 { 094 return _upload.getLength(); 095 } 096 097 @Override 098 public long getLastModified() 099 { 100 if (_upload != null) 101 { 102 return _upload.getUploadedDate().toInstant().toEpochMilli(); 103 } 104 105 return super.getLastModified(); 106 } 107 108 @Override 109 public String getMimeType() 110 { 111 if (_upload != null) 112 { 113 return _upload.getMimeType(); 114 } 115 116 return super.getMimeType(); 117 } 118 119 120 @Override 121 public void generate() throws IOException, SAXException, ProcessingException 122 { 123 if (_upload == null) 124 { 125 throw new ResourceNotFoundException("No upload for source: " + source); 126 } 127 128 super.generate(); 129 } 130 131 @Override 132 public void recycle() 133 { 134 super.recycle(); 135 _upload = null; 136 } 137}