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