package railo.commons.io.res.util;
import java.util.Map;
import railo.commons.collection.LinkedHashMapMaxSize;
import railo.commons.io.res.Resource;
import railo.runtime.PageSource;
public class ResourceSnippetsMap {
/* methods that access these Map objects should take care of synchronization */
private final Map<String, String> sources;
private final Map<String, ResourceSnippet> snippets;
public ResourceSnippetsMap( int maxSnippets, int maxSources ) {
sources = new LinkedHashMapMaxSize<String, String>( maxSources );
snippets = new LinkedHashMapMaxSize<String, ResourceSnippet>( maxSnippets );
}
/**
* this method accesses the underlying Map(s) and is therefore synchronized
*
* @param ps
* @param startPos
* @param endPos
* @param charset
* @return
*/
public synchronized ResourceSnippet getSnippet( PageSource ps, int startPos, int endPos, String charset ) {
String keySnp = calcKey( ps, startPos, endPos );
ResourceSnippet snippet = snippets.get( keySnp );
if ( snippet == null ) {
Resource res = ps.getResource();
String keyRes = calcKey( res );
String src = sources.get( keyRes );
if ( src == null ) {
src = ResourceSnippet.getContents( res, charset );
sources.put( keyRes, src );
}
snippet = ResourceSnippet.createResourceSnippet( src, startPos, endPos );
snippets.put( keySnp, snippet );
}
return snippet;
}
public static String calcKey( Resource res ) {
return res.getAbsolutePath() + "@" + res.lastModified();
}
public static String calcKey( PageSource ps, int startPos, int endPos ) {
return ps.getDisplayPath() + "@" + ps.getLastAccessTime() + ":" + startPos + "-" + endPos;
}
}