Mercurial Hosting > nabble
diff src/fschmidt/util/servlet/MemCache.java @ 68:00520880ad02
add fschmidt source
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 05 Oct 2025 17:24:15 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fschmidt/util/servlet/MemCache.java Sun Oct 05 17:24:15 2025 -0600 @@ -0,0 +1,77 @@ +/* +Copyright (c) 2008 Franklin Schmidt <fschmidt@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +package fschmidt.util.servlet; + +import java.util.Map; +import java.util.Collections; +import fschmidt.db.util.WeakCacheMap; + + +public final class MemCache implements HttpCache { + private final HttpCache cache; + private final Map<String,Long> map = Collections.synchronizedMap(new WeakCacheMap<String,Long>()); + + public MemCache(HttpCache cache) { + this.cache = cache; + } + + public long[] lastModifieds(String[] modifyingEvents) { + long[] rtn = new long[modifyingEvents.length]; + int[] missed = new int[modifyingEvents.length]; + int nMissed = 0; + for( int i=0; i<modifyingEvents.length; i++ ) { + Object modifyingEvent = modifyingEvents[i]; + Long r = map.get(modifyingEvent); + if( r!=null ) { + rtn[i] = r.longValue(); + } else { + missed[nMissed++] = i; + } + } + if( nMissed > 0 ) { + String[] aS = new String[nMissed]; + for( int i=0; i<nMissed; i++ ) { + aS[i] = modifyingEvents[missed[i]]; + } + long[] aL = cache.lastModifieds(aS); + for( int i=0; i<nMissed; i++ ) { + int iMissed = missed[i]; + long lastModified = aL[i]; + rtn[iMissed] = lastModified; + map.put(modifyingEvents[iMissed],new Long(lastModified)); + } + } + return rtn; + } + + public void modified(String modifyingEvent) { + cache.modified(modifyingEvent); + map.remove(modifyingEvent); + } + + public void clear() { + cache.clear(); + map.clear(); + } + +}