1
22
23 package com.liferay.portal.upload;
24
25 import com.liferay.portal.kernel.util.ByteArrayMaker;
26 import com.liferay.portal.kernel.util.GetterUtil;
27 import com.liferay.portal.util.PropsUtil;
28 import com.liferay.util.servlet.ByteArrayInputStreamWrapper;
29 import com.liferay.util.servlet.ServletInputStreamWrapper;
30
31 import java.io.ByteArrayInputStream;
32 import java.io.IOException;
33
34 import javax.servlet.ServletInputStream;
35 import javax.servlet.http.HttpServletRequest;
36 import javax.servlet.http.HttpSession;
37
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40
41
49 public class LiferayInputStream extends ServletInputStreamWrapper {
50
51 public static final int THRESHOLD_SIZE = GetterUtil.getInteger(
52 PropsUtil.get(LiferayInputStream.class.getName() + ".threshold.size"));
53
54 public LiferayInputStream(HttpServletRequest request) throws IOException {
55 super(request.getInputStream());
56
57 _session = request.getSession();
58 _totalSize = request.getContentLength();
59 }
60
61 public int read(byte[] b, int off, int len) throws IOException {
62 int bytesRead = super.read(b, off, len);
63
64 if (bytesRead > 0) {
65 _totalRead += bytesRead;
66 }
67 else {
68 return bytesRead;
69 }
70
71 int percent = (_totalRead * 100) / _totalSize;
72
73 if (_log.isDebugEnabled()) {
74 _log.debug(bytesRead + "/" + _totalRead + "=" + percent);
75 }
76
77 if (_totalSize < THRESHOLD_SIZE) {
78 _cachedBytes.write(b, off, bytesRead);
79 }
80
81 Integer curPercent = (Integer)_session.getAttribute(
82 LiferayFileUpload.PERCENT);
83
84 if ((curPercent == null) || (percent - curPercent.intValue() >= 1)) {
85 _session.setAttribute(
86 LiferayFileUpload.PERCENT, new Integer(percent));
87 }
88
89 return bytesRead;
90 }
91
92 public ServletInputStream getCachedInputStream() {
93 if (_totalSize < THRESHOLD_SIZE) {
94 return this;
95 }
96 else {
97 return new ByteArrayInputStreamWrapper(
98 new ByteArrayInputStream(_cachedBytes.toByteArray()));
99 }
100 }
101
102 private static Log _log = LogFactory.getLog(LiferayInputStream.class);
103
104 private HttpSession _session;
105 private int _totalRead;
106 private int _totalSize;
107 private ByteArrayMaker _cachedBytes = new ByteArrayMaker();
108
109 }