View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.internal.state;
6   
7   import static mockit.internal.expectations.RecordAndReplayExecution.RECORD_OR_REPLAY_LOCK;
8   
9   import edu.umd.cs.findbugs.annotations.NonNull;
10  
11  import java.util.List;
12  import java.util.Map;
13  import java.util.Set;
14  
15  import mockit.internal.ClassIdentification;
16  import mockit.internal.faking.FakeClasses;
17  
18  public final class SavePoint {
19      @NonNull
20      private final Set<ClassIdentification> previousTransformedClasses;
21      @NonNull
22      private final Map<Class<?>, byte[]> previousRedefinedClasses;
23      private final int previousCaptureTransformerCount;
24      @NonNull
25      private final List<Class<?>> previousMockedClasses;
26      @NonNull
27      private final FakeClasses.SavePoint previousFakeClasses;
28  
29      public SavePoint() {
30          MockFixture mockFixture = TestRun.mockFixture();
31          previousTransformedClasses = mockFixture.getTransformedClasses();
32          previousRedefinedClasses = mockFixture.getRedefinedClasses();
33          previousCaptureTransformerCount = mockFixture.getCaptureTransformerCount();
34          previousMockedClasses = mockFixture.getMockedClasses();
35          previousFakeClasses = TestRun.getFakeClasses().new SavePoint();
36      }
37  
38      public synchronized void rollback() {
39          RECORD_OR_REPLAY_LOCK.lock();
40  
41          try {
42              MockFixture mockFixture = TestRun.mockFixture();
43              mockFixture.removeCaptureTransformers(previousCaptureTransformerCount);
44              mockFixture.restoreTransformedClasses(previousTransformedClasses);
45              mockFixture.restoreRedefinedClasses(previousRedefinedClasses);
46              mockFixture.removeMockedClasses(previousMockedClasses);
47              previousFakeClasses.rollback();
48          } finally {
49              RECORD_OR_REPLAY_LOCK.unlock();
50          }
51      }
52  }