diff --git a/agent/src/main/java/com/appland/appmap/Agent.java b/agent/src/main/java/com/appland/appmap/Agent.java index 6205216c..6d7c28e6 100644 --- a/agent/src/main/java/com/appland/appmap/Agent.java +++ b/agent/src/main/java/com/appland/appmap/Agent.java @@ -135,7 +135,7 @@ private static void startAutoRecording(Runnable logShutdown) { final SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss"); final String timestamp = dateFormat.format(date); final Metadata metadata = new Metadata("java", "process"); - final Recorder recorder = Recorder.getInstance(); + final Recorder recorder = Recorder.INSTANCE; if (appmapName == null || appmapName.trim().isEmpty()) { appmapName = timestamp; } diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/MethodCall.java b/agent/src/main/java/com/appland/appmap/process/hooks/MethodCall.java index 33e29c2b..f6a75b94 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/MethodCall.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/MethodCall.java @@ -13,7 +13,7 @@ * Hooks to capture method invocations from classes included in configuration. */ public class MethodCall { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; @ArgumentArray @HookCondition(ConfigCondition.class) diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/MethodException.java b/agent/src/main/java/com/appland/appmap/process/hooks/MethodException.java index 8b3bae49..1eda1f6d 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/MethodException.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/MethodException.java @@ -11,7 +11,7 @@ * Hooks to capture method exceptions from classes included in configuration. */ public class MethodException { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; @ArgumentArray @HookCondition(value = ConfigCondition.class, methodEvent = MethodEvent.METHOD_EXCEPTION) diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/MethodReturn.java b/agent/src/main/java/com/appland/appmap/process/hooks/MethodReturn.java index 846b86ff..a78703de 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/MethodReturn.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/MethodReturn.java @@ -15,7 +15,7 @@ * Hooks to capture method returns from classes included in configuration. */ public class MethodReturn { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; private static final EventTemplateRegistry templateRegistry = EventTemplateRegistry.get(); @ArgumentArray diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/RecordMethod.java b/agent/src/main/java/com/appland/appmap/process/hooks/RecordMethod.java index b855fa92..cfd9472f 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/RecordMethod.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/RecordMethod.java @@ -9,7 +9,7 @@ import com.appland.appmap.transform.annotations.MethodEvent; public class RecordMethod { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; @ArgumentArray @ExcludeReceiver diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/RecordingSupport.java b/agent/src/main/java/com/appland/appmap/process/hooks/RecordingSupport.java index c5696629..c88baec4 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/RecordingSupport.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/RecordingSupport.java @@ -18,7 +18,7 @@ public class RecordingSupport { private static final TaggedLogger logger = AppMapConfig.getLogger(null); - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; public static class TestDetails { public String definedClass; diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/RequestRecording.java b/agent/src/main/java/com/appland/appmap/process/hooks/RequestRecording.java index f3de4aab..56527e3b 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/RequestRecording.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/RequestRecording.java @@ -33,7 +33,7 @@ public static void start(HttpServletRequest req) { RecordingSession recordingSession = new RecordingSession(metadata); try { - Recorder.getInstance().setThreadSession(recordingSession); + Recorder.INSTANCE.setThreadSession(recordingSession); req.setAttribute(ServletListener.RECORDING_ATTRIBUTE, recordingSession); } catch (ActiveSessionException e) { ServletListener.logger.warn(e); @@ -65,7 +65,7 @@ public static void stop(HttpServletRequest req) { localStart.format(Recording.RECORDING_TIME_FORMATTER)); recordingSession.getMetadata().scenarioName = appMapName; - Recording recording = Recorder.getInstance().stopThread(); + Recording recording = Recorder.INSTANCE.stopThread(); String filename = String.format("%.3f_%s", startTime.toEpochMilli() / 1000.0, req.getRequestURI()); filename = Recorder.sanitizeFilename(filename) + ".appmap.json"; recording.moveTo(filename); @@ -75,7 +75,7 @@ public static void stop(HttpServletRequest req) { * abort stops the current thread's recording and throws it away. */ public static void abort() { - Recorder.getInstance().stopThread(); + Recorder.INSTANCE.stopThread(); } } diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/SqlQuery.java b/agent/src/main/java/com/appland/appmap/process/hooks/SqlQuery.java index 343ee265..e8b91dbb 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/SqlQuery.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/SqlQuery.java @@ -19,7 +19,7 @@ */ @Unique("sql_query") public class SqlQuery { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; // ================================================================================================ // Calls diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpClientRequest.java b/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpClientRequest.java index 344ba4c9..f9e646e8 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpClientRequest.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpClientRequest.java @@ -27,7 +27,7 @@ public class HttpClientRequest { private static final TaggedLogger logger = AppMapConfig.getLogger(null); - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; /* * See https://hc.apache.org/httpcomponents-client-4.5.x/index.html for a diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpServerRequest.java b/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpServerRequest.java index f25903a5..7eabb78e 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpServerRequest.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/http/HttpServerRequest.java @@ -32,7 +32,7 @@ public class HttpServerRequest { private static final String URI_TEMPLATE_VARIABLES_ATTRIBUTE = "org.springframework.web.servlet.HandlerMapping.uriTemplateVariables"; private static final String LAST_EVENT_KEY = PACKAGE_NAME + ".lastEvent"; - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; public static void recordHttpServerRequest(Event event, HttpServletRequest req) { if (req.getRequestURI().endsWith(RemoteRecordingManager.RecordRoute)) { diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/remoterecording/RemoteRecordingManager.java b/agent/src/main/java/com/appland/appmap/process/hooks/remoterecording/RemoteRecordingManager.java index a846698f..9a43dea8 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/remoterecording/RemoteRecordingManager.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/remoterecording/RemoteRecordingManager.java @@ -22,7 +22,7 @@ interface RemoteRecordingRequest { public class RemoteRecordingManager { private static final TaggedLogger logger = AppMapConfig.getLogger(null); - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; public static final String RecordRoute = "/_appmap/record"; public static final String CheckpointRoute = "/_appmap/record/checkpoint"; diff --git a/agent/src/main/java/com/appland/appmap/process/hooks/test/TestNG.java b/agent/src/main/java/com/appland/appmap/process/hooks/test/TestNG.java index 38beef13..9135ae62 100644 --- a/agent/src/main/java/com/appland/appmap/process/hooks/test/TestNG.java +++ b/agent/src/main/java/com/appland/appmap/process/hooks/test/TestNG.java @@ -17,7 +17,7 @@ public class TestNG { private static final TaggedLogger logger = AppMapConfig.getLogger(null); private static final String TESTNG_NAME = "testng"; - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; private static final ThreadLocal lastReturnEvent = new ThreadLocal<>(); private static class ITestResult extends ReflectiveType { diff --git a/agent/src/main/java/com/appland/appmap/record/EventTemplateRegistry.java b/agent/src/main/java/com/appland/appmap/record/EventTemplateRegistry.java index d7041476..733af39d 100644 --- a/agent/src/main/java/com/appland/appmap/record/EventTemplateRegistry.java +++ b/agent/src/main/java/com/appland/appmap/record/EventTemplateRegistry.java @@ -22,7 +22,7 @@ public class EventTemplateRegistry { private static final TaggedLogger logger = AppMapConfig.getLogger(null); private static final EventTemplateRegistry instance = new EventTemplateRegistry(); - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; private final List eventTemplates = new ArrayList<>(); diff --git a/agent/src/main/java/com/appland/appmap/record/Recorder.java b/agent/src/main/java/com/appland/appmap/record/Recorder.java index 174d085c..1b5553cf 100644 --- a/agent/src/main/java/com/appland/appmap/record/Recorder.java +++ b/agent/src/main/java/com/appland/appmap/record/Recorder.java @@ -47,12 +47,12 @@ Event getLastThreadEvent() { * Recorder is a singleton responsible for managing recording sessions and routing events to any * active session. It also maintains a code object tree containing every known package/class/method. */ -public class Recorder { +public enum Recorder { + INSTANCE; + private static final String ERROR_SESSION_PRESENT = "an active recording session already exists"; private static final String ERROR_NO_SESSION = "there is no active recording session"; - private static final Recorder instance = new Recorder(); - private final ActiveSession activeSession = new ActiveSession(); private final CodeObjectTree globalCodeObjects = new CodeObjectTree(); private final Map threadState = new ConcurrentHashMap<>(); @@ -184,18 +184,6 @@ synchronized void addThreadEvent(Event event) { } } - /** - * Get the global Recorder instance. - * - * @return The global recorder instance - */ - public static Recorder getInstance() { - return Recorder.instance; - } - - private Recorder() { - } - /** * Start a recording session. * @@ -266,7 +254,7 @@ public void add(Event event) { event.ignore(); } } - + event.setStartTime(); ts.callStack.push(event); } else if ( event.event.equals("return") ) { diff --git a/agent/src/main/java/com/appland/appmap/record/RecordingSession.java b/agent/src/main/java/com/appland/appmap/record/RecordingSession.java index 583177fd..a6f50335 100644 --- a/agent/src/main/java/com/appland/appmap/record/RecordingSession.java +++ b/agent/src/main/java/com/appland/appmap/record/RecordingSession.java @@ -140,7 +140,7 @@ public synchronized Recording stop() { } CodeObjectTree getClassMap() { - CodeObjectTree registeredObjects = Recorder.getInstance().getRegisteredObjects(); + CodeObjectTree registeredObjects = Recorder.INSTANCE.getRegisteredObjects(); CodeObjectTree classMap = new CodeObjectTree(); for (String key : this.classReferences) { String[] parts = key.split(":"); diff --git a/agent/src/test/java/com/appland/appmap/integration/RecorderTest.java b/agent/src/test/java/com/appland/appmap/integration/RecorderTest.java index 1f83d6c1..0d7e65fc 100644 --- a/agent/src/test/java/com/appland/appmap/integration/RecorderTest.java +++ b/agent/src/test/java/com/appland/appmap/integration/RecorderTest.java @@ -21,7 +21,7 @@ public class RecorderTest { - private static final Recorder recorder = Recorder.getInstance(); + private static final Recorder recorder = Recorder.INSTANCE; @BeforeEach public void initialize() throws Exception { diff --git a/agent/src/test/java/com/appland/appmap/record/RecorderTest.java b/agent/src/test/java/com/appland/appmap/record/RecorderTest.java index caf3af60..f916a4f9 100644 --- a/agent/src/test/java/com/appland/appmap/record/RecorderTest.java +++ b/agent/src/test/java/com/appland/appmap/record/RecorderTest.java @@ -20,6 +20,7 @@ import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -50,13 +51,13 @@ public void before() throws Exception { final Recorder.Metadata metadata = new Recorder.Metadata("recorder_test", "tests"); - Recorder.getInstance().start(metadata); + Recorder.INSTANCE.start(metadata); } @AfterEach public void after() throws Exception { - if ( Recorder.getInstance().hasActiveSession()) { - Recorder.getInstance().stop(); + if (Recorder.INSTANCE.hasActiveSession()) { + Recorder.INSTANCE.stop(); } } @@ -74,7 +75,7 @@ private Event newEvent() { } private Recorder recordEvents() { - final Recorder recorder = Recorder.getInstance(); + final Recorder recorder = Recorder.INSTANCE; final Event[] events = new Event[3]; for (int i = 0; i < events.length; i++) { @@ -189,7 +190,7 @@ public void testAllEventsWritten() throws IOException { @Test public void testMultithreadCheckpoint() throws InterruptedException { - final Recorder recorder = spy(Recorder.getInstance()); + final Recorder recorder = spy(Recorder.INSTANCE); // This puts an entry in recorder.threadState, so there will be a // value to iterate over. @@ -221,7 +222,7 @@ public void testMultithreadCheckpoint() throws InterruptedException { iterLock.release(); eventAddedLock.acquire(); return ret; - }).when(recorder).getThreadStateIterator(); + }).when(recorder).getThreadStateIterator(); recorder.checkpoint(); }); diff --git a/agent/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/agent/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..ca6ee9ce --- /dev/null +++ b/agent/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/agent/test/access/RecordPackage.java b/agent/test/access/RecordPackage.java index 5a9ec27e..5ba71c63 100644 --- a/agent/test/access/RecordPackage.java +++ b/agent/test/access/RecordPackage.java @@ -7,7 +7,7 @@ public class RecordPackage { public static void main(String[] argv) { - final Recording recording = Recorder.getInstance().record(() -> { + final Recording recording = Recorder.INSTANCE.record(() -> { new MyClass().callNonPublic(); }); diff --git a/agent/test/access/RecordUnnamed.java b/agent/test/access/RecordUnnamed.java index f4754e4c..2538954e 100644 --- a/agent/test/access/RecordUnnamed.java +++ b/agent/test/access/RecordUnnamed.java @@ -6,7 +6,7 @@ public class RecordUnnamed { public static void main(String[] argv) { - final Recording recording = Recorder.getInstance().record(() -> { + final Recording recording = Recorder.INSTANCE.record(() -> { new HelloWorld().getGreetingWithPunctuation("!"); }); diff --git a/agent/test/classloading/app/src/main/java/com/appland/appmap/test/fixture/TestProxy.java b/agent/test/classloading/app/src/main/java/com/appland/appmap/test/fixture/TestProxy.java index 38cb2917..0b1464be 100644 --- a/agent/test/classloading/app/src/main/java/com/appland/appmap/test/fixture/TestProxy.java +++ b/agent/test/classloading/app/src/main/java/com/appland/appmap/test/fixture/TestProxy.java @@ -43,7 +43,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl @Override public int runTest() throws IOException { try { - Recorder recorder = Recorder.getInstance(); + Recorder recorder = Recorder.INSTANCE; Recording recording = recorder.record(() -> { try { ClassLoader cl = Thread.currentThread().getContextClassLoader(); diff --git a/agent/test/http_client/httpclient/src/main/java/httpclient/HttpClientTest.java b/agent/test/http_client/httpclient/src/main/java/httpclient/HttpClientTest.java index 8f2973c2..8d573315 100644 --- a/agent/test/http_client/httpclient/src/main/java/httpclient/HttpClientTest.java +++ b/agent/test/http_client/httpclient/src/main/java/httpclient/HttpClientTest.java @@ -13,7 +13,7 @@ public class HttpClientTest { public static void main(String[] argv) throws IOException { - final Recording recording = Recorder.getInstance().record(() -> { + final Recording recording = Recorder.INSTANCE.record(() -> { try { new HttpClientTest(argv[0], argv.length > 1 ? argv[1] : null).run(); } catch (IOException e) { diff --git a/agent/test/http_client/httpclient/src/main/java/httpclient/HttpHostTest.java b/agent/test/http_client/httpclient/src/main/java/httpclient/HttpHostTest.java index ec219695..42f22b21 100644 --- a/agent/test/http_client/httpclient/src/main/java/httpclient/HttpHostTest.java +++ b/agent/test/http_client/httpclient/src/main/java/httpclient/HttpHostTest.java @@ -18,7 +18,7 @@ public class HttpHostTest { public static void main(String[] argv) throws IOException { - final Recording recording = Recorder.getInstance().record(() -> { + final Recording recording = Recorder.INSTANCE.record(() -> { try { new HttpHostTest(argv[0], Integer.parseInt(argv[1]), argv[2]).run(); } catch (IOException e) {