View Javadoc

1   package com.atlassian.cache.hazelcast;
2   
3   import java.util.concurrent.atomic.AtomicInteger;
4   
5   import com.atlassian.hazelcast.serialization.OsgiClassLoaderRegistry;
6   import com.atlassian.hazelcast.serialization.OsgiSafe;
7   import com.atlassian.hazelcast.serialization.OsgiSafeStreamSerializer;
8   import com.atlassian.hazelcast.test.DefaultNodeConfigurer;
9   import com.atlassian.hazelcast.test.HazelcastCluster;
10  
11  import com.hazelcast.config.Config;
12  import com.hazelcast.config.SerializerConfig;
13  
14  /**
15   * JUnit rule to set up a Hazelcast cluster for testing.
16   */
17  public class InitOnceHazelcastCluster extends HazelcastCluster
18  {
19      private static final InitOnceHazelcastCluster INSTANCE = new Builder().size(2).nodeConfigurer(new DefaultNodeConfigurer()
20      {
21          @Override
22          public Config createConfig(int nodeIndex)
23          {
24              Config config = super.createConfig(nodeIndex);
25              config.getSerializationConfig().addSerializerConfig(
26                      new SerializerConfig()
27                              .setTypeClass(OsgiSafe.class)
28                              .setImplementation(new OsgiSafeStreamSerializer(new OsgiClassLoaderRegistry()))
29              );
30              return config;
31          }
32      }).build();
33  
34      // counter to keep track of the 'active users' of the HazelcastCluster. This is used to be able to set up the
35      // cluster only once for a set of tests (see HazelcastTestSuite)
36      private final AtomicInteger activeCount = new AtomicInteger();
37  
38      protected InitOnceHazelcastCluster(Builder builder)
39      {
40          super(builder);
41      }
42  
43      public int size()
44      {
45          return getNodes().size();
46      }
47  
48      @Override
49      protected void after()
50      {
51          if (activeCount.decrementAndGet() == 0)
52          {
53              // only truly shut down when the active count reaches zero
54              super.after();
55          } else {
56              super.reset();
57          }
58      }
59  
60      @Override
61      protected void before() throws Throwable
62      {
63          if (activeCount.getAndIncrement() == 0)
64          {
65              // only initialize when the active count is at zero
66              super.before();
67          } else {
68              super.reset();
69          }
70      }
71  
72      public static InitOnceHazelcastCluster getInstance()
73      {
74          return INSTANCE;
75      }
76  
77      public static class Builder extends AbstractBuilder<Builder, InitOnceHazelcastCluster>
78      {
79          @Override
80          public InitOnceHazelcastCluster build()
81          {
82              return new InitOnceHazelcastCluster(this);
83          }
84  
85          @Override
86          protected Builder self()
87          {
88              return this;
89          }
90      }
91  }