📄 lrucachehandler.java
字号:
} catch (Exception e) { if (mLogger.isDebugEnabled()) { StringBuffer sb = new StringBuffer(); sb.append("Probably a client abort exception, key="); sb.append(key); mLogger.error(sb.toString()); } } } } /** * Purge entire cache. */ public synchronized void flushCache(HttpServletRequest req) { mPageCache.clear(); } /** * Purge user's entries from cache. */ public synchronized void removeFromCache(HttpServletRequest req, UserData user) { // TODO: can we make this a little more precise, perhaps via regex? String rssString = "/rss/" + user.getUserName(); // user's pages String pageString = "/page/" + user.getUserName(); // user's RSS feeds String mainRssString = "/rss_"; // main RSS feed List purgeList = new ArrayList(); Iterator keys = mPageCache.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); if (key.indexOf(rssString)!=-1 || key.indexOf(pageString)!=-1 || key.indexOf(mainRssString)!=-1) { purgeList.add(key); } } Iterator purgeIter = purgeList.iterator(); while (purgeIter.hasNext()) { String key = (String) purgeIter.next(); mPageCache.remove(key); } if (mLogger.isDebugEnabled()) { StringBuffer sb = new StringBuffer(); sb.append("Purged, count="); sb.append(purgeList.size()); sb.append(", user="); sb.append(user.getUserName()); mLogger.debug(sb.toString()); } } public synchronized void timeoutCache() { if (mTimeoutRatio == 1.0) { mLogger.debug("Timing out whole cache: " + mName); mPageCache.clear(); } else { int numToTimeout = (int)(mTimeoutRatio * mPageCache.size()); mLogger.debug( "Timing out " + numToTimeout + " of " + mPageCache.size() + " entries from cache: " + mName); ArrayList allKeys = new ArrayList(mPageCache.keySet()); for (int i=numToTimeout; i>0; i--) { mPageCache.remove(allKeys.get(i)); } } } /** * Get from cache. Synchronized because "In access-ordered linked hash * maps, merely querying the map with get is a structural modification" */ public synchronized Object getFromCache(String key) { Object entry = mPageCache.get(key); if (entry != null && mLogger.isDebugEnabled()) { hits++; } return entry; } public synchronized void putToCache(String key, Object entry) { mPageCache.put(key, entry); if (mLogger.isDebugEnabled()) { misses++; StringBuffer sb = new StringBuffer(); sb.append("Missed, cache size="); sb.append(mPageCache.size()); sb.append(", hits="); sb.append(hits); sb.append(", misses="); sb.append(misses); sb.append(", key="); sb.append(key); mLogger.debug(sb.toString()); } } public String generateEntryKey(String key, HttpServletRequest request, int scope, String language) { StringBuffer cBuffer = new StringBuffer(AVERAGE_KEY_LENGTH); // Append the language if available if (language != null) { cBuffer.append(FILE_SEPARATOR).append(language); } //cBuffer.append(FILE_SEPARATOR).append(request.getServerName()); if (key != null) { cBuffer.append(FILE_SEPARATOR).append(key); } else { String generatedKey = request.getRequestURI(); if (generatedKey.charAt(0) != FILE_SEPARATOR_CHAR) { cBuffer.append(FILE_SEPARATOR_CHAR); } cBuffer.append(generatedKey); cBuffer.append("_").append(request.getMethod()).append("_"); generatedKey = getSortedQueryString(request); if (generatedKey != null) { try { java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); byte[] b = digest.digest(generatedKey.getBytes()); cBuffer.append("_"); // Base64 encoding allows for unwanted slash characters. cBuffer.append(toBase64(b).replace('/', '_')); } catch (Exception e) { // Ignore query string } } } return cBuffer.toString(); } protected String getSortedQueryString(HttpServletRequest request) { Map paramMap = request.getParameterMap(); if (paramMap.isEmpty()) { return null; } Set paramSet = new TreeMap(paramMap).entrySet(); StringBuffer buf = new StringBuffer(); boolean first = true; for (Iterator it = paramSet.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); String[] values = (String[]) entry.getValue(); for (int i = 0; i < values.length; i++) { String key = (String) entry.getKey(); if ((key.length() != 10) || !"jsessionid".equals(key)) { if (first) { first = false; } else { buf.append('&'); } buf.append(key).append('=').append(values[i]); } } } // We get a 0 length buffer if the only parameter was a jsessionid if (buf.length() == 0) { return null; } else { return buf.toString(); } } /** * Convert a byte array into a Base64 string (as used in mime formats) */ private static String toBase64(byte[] aValue) { int byte1; int byte2; int byte3; int iByteLen = aValue.length; StringBuffer tt = new StringBuffer(); for (int i = 0; i < iByteLen; i += 3) { boolean bByte2 = (i + 1) < iByteLen; boolean bByte3 = (i + 2) < iByteLen; byte1 = aValue[i] & 0xFF; byte2 = (bByte2) ? (aValue[i + 1] & 0xFF) : 0; byte3 = (bByte3) ? (aValue[i + 2] & 0xFF) : 0; tt.append(m_strBase64Chars.charAt(byte1 / 4)); tt.append(m_strBase64Chars.charAt((byte2 / 16) + ((byte1 & 0x3) * 16))); tt.append(((bByte2) ? m_strBase64Chars.charAt((byte3 / 64) + ((byte2 & 0xF) * 4)) : '=')); tt.append(((bByte3) ? m_strBase64Chars.charAt(byte3 & 0x3F) : '=')); } return tt.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -