assert (resourcePath != null) && (resourcePath.length() != 0);
ResourceRequestData data = resourceCodec.decodeResource(context, resourcePath);
assert (data != null);
Cache cache = ServiceTracker.getService(context, Cache.class);
Resource resource = lookupInCache(cache, data.getResourceKey());
if (resource == null) {
resource = resourceFactory.createResource(context, data);
}
if (resource == null) {
sendResourceNotFound(context);
return;
}
if (resource instanceof CacheableResource) {
CacheableResource cacheableResource = (CacheableResource) resource;
if (cacheableResource.isCacheable(context)) {
// TODO - we could move this part of code to ConcurrentMap so that
// only single thread does resource put
CachedResourceImpl cachedResource = new CachedResourceImpl();
cachedResource.initialize(resource);
// someone may provided this resource for us
// while we were reading it, check once again
resource = lookupInCache(cache, data.getResourceKey());
if (resource == null) {
// don't cache it on Development stage
if (!ProjectStage.Development.equals(context.getApplication().getProjectStage())) {
Date cacheExpirationDate = cachedResource.getExpired(context);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(new MessageFormat(
"Storing {0} resource in cache until {1,date,dd MMM yyyy HH:mm:ss zzz}", Locale.US)
.format(new Object[] { data.getResourceKey(), cacheExpirationDate }));
}
cache.put(data.getResourceKey(), cachedResource, cacheExpirationDate);
}
resource = cachedResource;
}
}
}