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}