View Javadoc

1   package com.atlassian.core.util.thumbnail;
2   
3   import com.google.common.annotations.VisibleForTesting;
4   import com.google.common.base.Predicate;
5   import org.apache.log4j.Logger;
6   
7   import javax.annotation.Nullable;
8   
9   public class AdaptiveThresholdPredicate implements Predicate<Dimensions>
10  {
11      private final static Logger log = Logger.getLogger(AdaptiveThresholdPredicate.class);
12  
13      private static final int BYTES_PER_PIXEL = 4;
14      private static final float PROCESSING_HEADROOM = 1.2F; // We need a bit of headroom for processing, still pulling numbers out of thin air.
15  
16      @Override
17      public boolean apply(@Nullable final Dimensions input)
18      {
19          return sufficientMemory(input);
20      }
21  
22      private boolean sufficientMemory(final Dimensions dimensions)
23      {
24          long requiredMemory = dimensions.getHeight() * dimensions.getWidth() * BYTES_PER_PIXEL;
25          long freeMemory = freeMemory();
26          boolean result = requiredMemory * PROCESSING_HEADROOM < freeMemory;
27          if (log.isDebugEnabled())
28          {
29              log.debug(String.format("Expected memory required for this image conversion: %d. " +
30                      "Free memory: %d. Image dimension (%s) renderable: %s", requiredMemory, freeMemory, dimensions, result));
31          }
32          return result;
33      }
34  
35      @VisibleForTesting
36      long freeMemory()
37      {
38          return Runtime.getRuntime().freeMemory();
39      }
40  }