Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2014 Red Hat, Inc., and individual contributors
   * as indicated by the @author tags.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
 
 package io.undertow.server.handlers.resource;
 
 import java.io.File;
 import java.net.URL;
 import java.util.Date;
 import java.util.List;
 

Author(s):
Stuart Douglas
 
 public class CachedResource implements Resource {
 
     private final CacheKey cacheKey;
     private final Resource underlyingResource;
     private final boolean directory;
     private final Date lastModifiedDate;
     private final String lastModifiedDateString;
     private final ETag eTag;
     private final String name;
     private volatile long nextMaxAgeCheck;
 
     public CachedResource(final CachingResourceManager cachingResourceManagerfinal Resource underlyingResourcefinal String path) {
         this. = cachingResourceManager;
         this. = underlyingResource;
         this. = underlyingResource.isDirectory();
         this. = underlyingResource.getLastModified();
         if ( != null) {
             this. = DateUtils.toDateString();
         } else {
             this. = null;
         }
         this. = underlyingResource.getETag();
         this. = underlyingResource.getName();
         this. = new CacheKey(cachingResourceManagerunderlyingResource.getCacheKey());
         if (cachingResourceManager.getMaxAge() > 0) {
              = System.currentTimeMillis() + cachingResourceManager.getMaxAge();
         } else {
              = -1;
         }
     }
 
     @Override
     public String getPath() {
         return .getPath();
     }
 
     @Override
     public Date getLastModified() {
         return ;
     }
 
     @Override
     public String getLastModifiedString() {
         return ;
     }
 
     @Override
     public ETag getETag() {
         return ;
     }
 
     @Override
     public String getName() {
         return ;
     }
 
     @Override
    public boolean isDirectory() {
        return ;
    }
    @Override
    public List<Resourcelist() {
        return .list();
    }
    @Override
    public String getContentType(final MimeMappings mimeMappings) {
        return .getContentType(mimeMappings);
    }
    public void invalidate() {
        final DirectBufferCache dataCache = .getDataCache();
        if(dataCache != null) {
            dataCache.remove();
        }
    }
    public boolean checkStillValid() {
        if ( > 0) {
            long time = System.currentTimeMillis();
            if (time > ) {
                 = time + .getMaxAge();
                if (!.getLastModified().equals()) {
                    return false;
                }
            }
        }
        return true;
    }
    @Override
    public void serve(final Sender senderfinal HttpServerExchange exchangefinal IoCallback completionCallback) {
        final DirectBufferCache dataCache = .getDataCache();
        if(dataCache == null) {
            .serve(senderexchangecompletionCallback);
            return;
        }
        final DirectBufferCache.CacheEntry existing = dataCache.get();
        final Long length = getContentLength();
        //if it is not eligible to be served from the cache
        if (length == null || length > .getMaxFileSize()) {
            .serve(senderexchangecompletionCallback);
            return;
        }
        //it is not cached yet, install a wrapper to grab the data
        if (existing == null || !existing.enabled() || !existing.reference()) {
            Sender newSender = sender;
            final DirectBufferCache.CacheEntry entry;
            if (existing == null) {
                entry = dataCache.add(length.intValue(), .getMaxAge());
            } else {
                entry = existing;
            }
            if (entry != null && entry.buffers().length != 0 && entry.claimEnable()) {
                if (entry.reference()) {
                    newSender = new ResponseCachingSender(senderentrylength);
                } else {
                    entry.disable();
                }
            }
            .serve(newSenderexchangecompletionCallback);
        } else {
            //serve straight from the cache
            ByteBuffer[] buffers;
            boolean ok = false;
            try {
                LimitedBufferSlicePool.PooledByteBuffer[] pooled = existing.buffers();
                buffers = new ByteBuffer[pooled.length];
                for (int i = 0; i < buffers.lengthi++) {
                    // Keep position from mutating
                    buffers[i] = pooled[i].getResource().duplicate();
                }
                ok = true;
            } finally {
                if (!ok) {
                    existing.dereference();
                }
            }
            sender.send(buffersnew DereferenceCallback(existingcompletionCallback));
        }
    }
    @Override
    public Long getContentLength() {
        //we always use the underlying size unless the data is cached in the buffer cache
        //to prevent a mis-match between size on disk and cached size
        final DirectBufferCache dataCache = .getDataCache();
        if(dataCache == null) {
            return .getContentLength();
        }
        final DirectBufferCache.CacheEntry existing = dataCache.get();
        if(existing == null || !existing.enabled()) {
            return .getContentLength();
        }
        //we only return the
        return (long)existing.size();
    }
    @Override
    public String getCacheKey() {
        return .;
    }
    @Override
    public File getFile() {
        return .getFile();
    }
    @Override
    public File getResourceManagerRoot() {
    }
    @Override
    public URL getUrl() {
        return .getUrl();
    }
    private static class DereferenceCallback implements IoCallback {
        private final DirectBufferCache.CacheEntry cache;
        private final IoCallback callback;
        public DereferenceCallback(DirectBufferCache.CacheEntry cachefinal IoCallback callback) {
            this. = cache;
            this. = callback;
        }
        @Override
        public void onComplete(final HttpServerExchange exchangefinal Sender sender) {
            try {
                .dereference();
            } finally {
                .onComplete(exchangesender);
            }
        }
        @Override
        public void onException(final HttpServerExchange exchangefinal Sender senderfinal IOException exception) {
            ..ioException(exception);
            try {
                .dereference();
            } finally {
                .onException(exchangesenderexception);
            }
        }
    }
    static final class CacheKey {
        final CachingResourceManager manager;
        final String cacheKey;
        CacheKey(CachingResourceManager managerString cacheKey) {
            this. = manager;
            this. = cacheKey;
        }
        @Override
        public boolean equals(Object o) {
            if (this == oreturn true;
            if (o == null || getClass() != o.getClass()) return false;
            CacheKey cacheKey1 = (CacheKeyo;
            if ( != null ? !.equals(cacheKey1.cacheKey) : cacheKey1.cacheKey != nullreturn false;
            if ( != null ? !.equals(cacheKey1.manager) : cacheKey1.manager != nullreturn false;
            return true;
        }
        @Override
        public int hashCode() {
            int result =  != null ? .hashCode() : 0;
            result = 31 * result + ( != null ? .hashCode() : 0);
            return result;
        }
    }
New to GrepCode? Check out our FAQ X