View Javadoc

1   package net.sf.ehcache.pool.sizeof;
2   
3   import java.lang.reflect.Array;
4   import java.util.ArrayList;
5   import java.util.List;
6   
7   import net.sf.ehcache.pool.sizeof.AgentSizeOf;
8   import net.sf.ehcache.pool.sizeof.ReflectionSizeOf;
9   import net.sf.ehcache.pool.sizeof.SizeOf;
10  import net.sf.ehcache.pool.sizeof.UnsafeSizeOf;
11  import net.sf.ehcache.pool.sizeof.filter.PassThroughFilter;
12  import net.sf.ehcache.pool.sizeof.filter.SizeOfFilter;
13  
14  
15  public class CrossCheckingSizeOf extends SizeOf {
16  
17    private final List<SizeOf> engines;
18  
19    public CrossCheckingSizeOf() {
20      this(new PassThroughFilter());
21    }
22    
23    public CrossCheckingSizeOf(SizeOfFilter filter) {
24      this(filter, true);
25    }
26  
27    public CrossCheckingSizeOf(SizeOfFilter filter, boolean caching) {
28      super(filter, caching);
29      engines = new ArrayList<SizeOf>();
30  
31      try {
32        engines.add(new AgentSizeOf());
33      } catch (UnsupportedOperationException usoe) {
34        System.err.println("Not using AgentSizeOf: " + usoe);
35      }
36      try {
37        engines.add(new UnsafeSizeOf());
38      } catch (UnsupportedOperationException usoe) {
39        System.err.println("Not using UnsafeSizeOf: " + usoe);
40      }
41      try {
42        engines.add(new ReflectionSizeOf());
43      } catch (UnsupportedOperationException usoe) {
44        System.err.println("Not using ReflectionSizeOf: " + usoe);
45      }
46      
47      if (engines.isEmpty()) {
48        throw new AssertionError("No SizeOf engines available");
49      }
50    }
51  
52    @Override
53    protected long measureSizeOf(Object obj) {
54      long[] values = new long[engines.size()];
55      for (int i = 0; i < engines.size(); i++) {
56        values[i] = engines.get(i).measureSizeOf(obj);
57      }
58      for (long value : values) {
59        if (values[0] != value) {
60          StringBuilder sb = new StringBuilder("Values do not match for ");
61          sb.append(obj.getClass());
62          if (obj.getClass().isArray()) {
63             sb.append(" length:").append(Array.getLength(obj));
64          }
65          sb.append(" - ");
66          for (int i = 0; i < engines.size(); i++) {
67            sb.append(engines.get(i).getClass().getSimpleName()).append(":").append(values[i]);
68            if (i != engines.size() - 1) {
69              sb.append(", ");
70            }
71          }
72          throw new AssertionError(sb.toString());
73        }
74      }
75      
76      return values[0];
77    }
78  }