/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.portal.kernel.upload; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.ProgressTracker; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; /** * @author Jorge Ferrer * @author Brian Wing Shun Chan * @author Minhchau Dang */ public class ProgressInputStream extends InputStream { public ProgressInputStream( PortletRequest portletRequest, InputStream inputStream, long totalSize, String progressId) { _portletSession = portletRequest.getPortletSession(); _inputStream = inputStream; _totalSize = totalSize; _progressId = progressId; initProgress(); } @Override public int available() throws IOException { return _inputStream.available(); } public void clearProgress() { _portletSession.removeAttribute(_getPercentAttributeName()); } @Override public void close() throws IOException { _inputStream.close(); } public long getTotalRead() { return _totalRead; } public void initProgress() { ProgressTracker progressTracker = new ProgressTracker(_progressId); progressTracker.initialize(_portletSession); } @Override public void mark(int readlimit) { _inputStream.mark(readlimit); } @Override public boolean markSupported() { return _inputStream.markSupported(); } @Override public int read() throws IOException { return _inputStream.read(); } @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } @Override public int read(byte[] b, int off, int len) throws IOException { int bytesRead = super.read(b, off, len); _updateProgress(bytesRead); return bytesRead; } public void readAll(OutputStream outputStream) throws IOException { byte[] buffer = new byte[_DEFAULT_INITIAL_BUFFER_SIZE]; int len = 0; while ((len = read(buffer)) > 0) { outputStream.write(buffer, 0, len); } outputStream.close(); } @Override public void reset() throws IOException { _inputStream.reset(); } @Override public long skip(long n) throws IOException { long result = _inputStream.skip(n); _updateProgress(result); return result; } private String _getPercentAttributeName() { return ProgressTracker.PERCENT + _progressId; } private void _updateProgress(long bytesRead) { if (bytesRead > 0) { _totalRead += bytesRead; } else if (_totalSize > 0) { _totalRead = _totalSize; } int percent = 0; if (_totalSize > 0) { percent = (int)((_totalRead * 100) / _totalSize); } if (_log.isDebugEnabled()) { _log.debug(_totalRead + "/" + _totalSize + "=" + percent); } ProgressTracker progressTracker = (ProgressTracker)_portletSession.getAttribute( _getPercentAttributeName(), PortletSession.APPLICATION_SCOPE); Integer curPercent = null; if (progressTracker != null) { curPercent = progressTracker.getPercent(); } if ((curPercent == null) || ((percent - curPercent.intValue()) >= 1)) { if (progressTracker == null) { progressTracker = new ProgressTracker(_progressId); progressTracker.initialize(_portletSession); } progressTracker.setPercent(percent); } } private static final int _DEFAULT_INITIAL_BUFFER_SIZE = 4 * 1024; private static final Log _log = LogFactoryUtil.getLog( ProgressInputStream.class); private final InputStream _inputStream; private final PortletSession _portletSession; private final String _progressId; private long _totalRead; private final long _totalSize; }