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 }