You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by GitBox <gi...@apache.org> on 2022/08/19 11:52:19 UTC

[GitHub] [netbeans] sdedic commented on a diff in pull request #3386: Replacing SecurityManager with a tracking agent

sdedic commented on code in PR #3386:
URL: https://github.com/apache/netbeans/pull/3386#discussion_r949519274


##########
platform/o.n.agent.hooks/nbproject/project.properties:
##########
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+javac.source=1.8

Review Comment:
   autoload ?



##########
harness/nbjunit/test/unit/src/org/netbeans/junit/NbModuleSuiteTest.java:
##########
@@ -232,25 +232,27 @@ public void testAccessClassPathDefinedAutoload() {
     public void testModulesForCL() throws Exception {
         Set<String> s = NbModuleSuite.S.findEnabledModules(ClassLoader.getSystemClassLoader());
         s.remove("org.netbeans.modules.nbjunit");
-        assertEquals("Four modules left: " + s, 5, s.size());
+        assertEquals("Four modules left: " + s, 6, s.size());

Review Comment:
   four > six ?



##########
platform/core.execution/src/org/netbeans/core/execution/Install.java:
##########
@@ -88,7 +88,7 @@ public class Install implements Runnable {
     private static final Logger LOG = Logger.getLogger(Install.class.getName());
     
     public @Override void run() {
-        TopSecurityManager.register(SecMan.DEFAULT);
+        TrackingHooks.register(SecMan.DEFAULT, 100, TrackingHooks.Hooks.EXIT, Hooks.NEW_AWT_WINDOW);

Review Comment:
   Nitpick: `TrackingHooks.` redundant.



##########
platform/o.n.agent/src/org/netbeans/agent/TrackingAgent.java:
##########
@@ -0,0 +1,1135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.agent;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+public class TrackingAgent {
+
+    private static final String TRACKING_HOOKS = "org/netbeans/agent/hooks/TrackingHooksCallback";
+
+    //<editor-fold defaultstate="collapsed" desc="Transformations">
+    private static final List<TrackingTransformer.MethodEnhancement> toInject = Arrays.asList(
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1AB8,%5s"), //iload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "halt",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream", //delegates to FileInputStream(File)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newOutputStream",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel
+//                                                      "newInputStream",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "()[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "()[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FileFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdir",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdirs",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "delete",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canExecute",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canRead",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canWrite",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isDirectory",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isHidden",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "exists",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "length",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "createNewFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setExecutable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setWritable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadOnly",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setLastModified",
+                                                      "(J)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "lastModified",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile", //covered by <init>(File, String)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile",
+                                                      "<init>",
+                                                      "(Ljava/io/File;Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/io/File;Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2B2CB8,%5s"), //aload1, aload2, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "delete",
+                                                      "(Ljava/nio/file/Path;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "createDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by createDirectory
+//                                                      "createDirectories",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "write",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newDirectoryStream
+//                                                      "newDirectoryStream",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel(Path,Set,FileAttribute[])
+//                                                      "newByteChannel",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newByteChannel",
+                                                      "(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/nio/file/Path;Ljava/util/Set;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload0, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by readAttribute
+//                                                      "getAttribute",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/lang/Object;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "getFileAttributeView",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isExecutable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isHidden",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isReadable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isRegularFile",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isSameFile",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s,2BB8,%5s"), //aload0, invokespecial #5, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isWritable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "setAttribute",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "clearProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Constructor",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Field",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Method",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/AccessibleObject",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "setSecurityManager",
+                                                      "(Ljava/lang/SecurityManager;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setSecurityManager",
+                                                        "s" + "(Ljava/lang/Object;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Frame;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;Ljava/awt/GraphicsConfiguration;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/ProcessBuilder",
+                                                      "start",
+                                                      "()Ljava/lang/Process;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "processBuilderStart",
+                                                        "s" + "(Ljava/lang/ProcessBuilder;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s") //aload0, invokespecial #5
+    );
+    //</editor-fold>
+
+    private static Instrumentation instrumentation;
+
+    public static void premain(String arg, Instrumentation i) throws IOException, URISyntaxException {
+        instrumentation = i;
+        File thisFile = new File(TrackingAgent.class.getProtectionDomain().getCodeSource().getLocation().toURI());
+        File hooksFile = new File(thisFile.getParentFile(), "org-netbeans-agent-hooks.jar");
+        i.appendToBootstrapClassLoaderSearch(new JarFile(hooksFile));
+    }
+
+    public static void install() {
+        //TODO: should happen only once
+        ClassFileTransformer trackingTransformer = new TrackingTransformer();
+        try {
+            List<Class<?>> classes2Transform = new ArrayList<>();
+            for (String className : toInject.stream().map(me -> me.className.replace('/', '.')).collect(Collectors.toSet())) {
+                try {
+                    classes2Transform.add(Class.forName(className));
+                } catch (ClassNotFoundException ex) {
+                    //XXX: warn:
+                    System.err.println("cannot instrument:");
+                    ex.printStackTrace();
+                }
+            }
+            instrumentation.addTransformer(trackingTransformer, true);
+            instrumentation.retransformClasses(classes2Transform.toArray(new Class[0]));
+        } catch (UnmodifiableClassException ex) {
+            System.err.println("cannot instrument:");
+            ex.printStackTrace();
+        } finally {
+            instrumentation.removeTransformer(trackingTransformer);
+        }
+    }
+
+    private static class TrackingTransformer implements ClassFileTransformer {
+
+        private static final BiFunction<String, Integer, byte[]> NOOP_INJECTOR = (n, pp) -> null;
+
+        public TrackingTransformer() {
+        }
+
+        @Override
+        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+            if (className == null) {
+                return classfileBuffer;
+            }
+            try {
+                List<MethodEnhancement> thisClassEnhancements = toInject.stream().filter(me -> {/*System.err.println("className=" + className); */return className.equals(me.className);}).collect(Collectors.toList());

Review Comment:
   Wouldn't it be better to organize `toInject` as a Map keyed by FQN ? It would allow faster lookup here. Also not sure about effectivness of the stream filter approach for that small number of items.



##########
platform/o.n.bootstrap/src/org/netbeans/TopSecurityManager.java:
##########
@@ -302,103 +140,75 @@ private static String findCallStackLine(String callerClazz) {
         warnedClassesNH.add("org.netbeans.modules.apisupport.project.universe.NbPlatform"); // defaultPlatformLocation
     }
 
-    /* ----------------- private methods ------------- */
 
-    /**
-     * The method is empty. This is not "secure", but on the other hand,
-     * it reduces performance penalty of startup about 10%
-     */
-    public @Override void checkRead(String file) {
-        notifyRead(file);
-    }
-    
-    public @Override void checkRead(FileDescriptor fd) {
-    }
-
-    
-    public @Override void checkWrite(FileDescriptor fd) {
-    }
-
-    /** The method has awful performance in super class */
-    public @Override void checkDelete(String file) {
-        notifyDelete(file);
+    public static Class<?>[] getStack() {
         try {
-            checkPermission(allPermission);
-            return;
-        } catch (SecurityException e) {
-            super.checkDelete(file);
-        }
-    }
-           
-    /** The method has awful performance in super class */
-    public @Override void checkWrite(String file) {
-        notifyWrite(file);
-        try {
-            checkPermission(allPermission);
-            return;
-        } catch (SecurityException e) {
-            super.checkWrite(file);
-        }
-    }
-    
-    /** Checks connect */
-    public @Override void checkConnect(String host, int port) {
-        if (! check) {
-            return;
-        }
-        
-        try {
-            checkPermission(allPermission);
-            return;
-        } catch (SecurityException e) {
-        }
-        
-        try {
-            super.checkConnect(host, port);
-            return;
-        } catch (SecurityException e) {
-        }
-        
-        PrivilegedCheck.checkConnect(host, port, this);
-    }
-     
-    final void checkConnectImpl(String host, int port) {
-        Class<?> insecure = getInsecureClass();
-        if (insecure != null) {  
-            URL ctx = getClassURL(insecure);
-            if (ctx != null) {
+            List<Class<?>> classes = new ArrayList<>();
+            //StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).forEach(f -> classes.add(f.getDeclaringClass()));
+            Class<?> stackWalker = Class.forName("java.lang.StackWalker");
+            Class<?> stackWalkerOption = Class.forName("java.lang.StackWalker$Option");
+            Class<?> stackWalkerStackFrame = Class.forName("java.lang.StackWalker$StackFrame");
+            Method getInstance = stackWalker.getDeclaredMethod("getInstance", stackWalkerOption);

Review Comment:
   Perhaps this reflective lookups could be done just once ?



##########
platform/o.n.agent.hooks/src/org/netbeans/agent/hooks/TrackingHooksCallback.java:
##########
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.agent.hooks;
+
+import java.awt.Window;
+import java.io.File;
+import java.lang.reflect.AccessibleObject;
+import java.nio.file.FileSystems;
+import java.nio.file.OpenOption;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.netbeans.agent.hooks.api.TrackingHooks;
+import org.netbeans.agent.hooks.api.TrackingHooks.Hooks;
+
+public abstract class TrackingHooksCallback {
+
+    private static final Logger LOG = Logger.getLogger(TrackingHooksCallback.class.getName());
+
+    private static final Map<Hooks, Set<HookDescription>> hook2Delegates = new HashMap<>();
+
+    public static synchronized void register(TrackingHooks delegate, int priority, Hooks... hooks) {
+        if (hook2Delegates.isEmpty() && hooks.length != 0) {
+            try {
+                Class<?> agent = Class.forName("org.netbeans.agent.TrackingAgent", false, ClassLoader.getSystemClassLoader());
+                agent.getDeclaredMethod("install").invoke(null);
+            } catch (ReflectiveOperationException ex) {
+                LOG.log(Level.WARNING, "Cannot associate tracking hooks, the application will be unstable"); // NOI18N
+                LOG.log(Level.INFO, "Cannot associate tracking hooks, the application will be unstable", ex); // NOI18N
+            }
+        }
+        for (Hooks hook : hooks) {
+            Set<HookDescription> existing = hook2Delegates.computeIfAbsent(hook, x -> new TreeSet<>((d1, d2) -> d1.priority - d2.priority));
+            existing.add(new HookDescription(delegate, priority));
+        }
+    }
+
+    private static synchronized Iterable<TrackingHooks> getDelegates(Hooks hook) {
+        //bootstrap issues, cannot use lambdas here:
+        List<TrackingHooks> result = new ArrayList<>();
+
+        for (HookDescription desc : hook2Delegates.getOrDefault(hook, Collections.emptySet())) {
+            result.add(desc.hooks);
+        }
+
+        return result;
+    }
+
+    public static synchronized void clear() {
+        hook2Delegates.clear();
+    }
+
+    public static synchronized void unregister(TrackingHooks toRemove) {
+        for (Set<HookDescription> delegates : hook2Delegates.values()) {
+            for (Iterator<HookDescription> it = delegates.iterator(); it.hasNext();) {
+                HookDescription hd = it.next();
+                if (hd.hooks == toRemove) {
+                    it.remove();

Review Comment:
   stop after first removed ?



##########
platform/o.n.core/src/org/netbeans/core/NbLifecycleManager.java:
##########
@@ -67,9 +67,6 @@ public static void advancePolicy() {
         if (!Boolean.getBoolean("TopSecurityManager.disable")) {
             // set security manager
             TopSecurityManager.install();
-            if (CLIOptions.isGui()) {
-                TopSecurityManager.makeSwingUseSpecialClipboard(Lookup.getDefault().lookup(ExClipboard.class));

Review Comment:
   What was this supposed to do ?



##########
platform/o.n.agent/src/org/netbeans/agent/TrackingAgent.java:
##########
@@ -0,0 +1,1135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.agent;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+public class TrackingAgent {
+
+    private static final String TRACKING_HOOKS = "org/netbeans/agent/hooks/TrackingHooksCallback";
+
+    //<editor-fold defaultstate="collapsed" desc="Transformations">
+    private static final List<TrackingTransformer.MethodEnhancement> toInject = Arrays.asList(
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1AB8,%5s"), //iload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "halt",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream", //delegates to FileInputStream(File)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newOutputStream",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel
+//                                                      "newInputStream",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "()[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "()[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FileFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdir",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdirs",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "delete",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canExecute",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canRead",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canWrite",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isDirectory",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isHidden",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "exists",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "length",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "createNewFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setExecutable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setWritable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadOnly",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setLastModified",
+                                                      "(J)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "lastModified",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile", //covered by <init>(File, String)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile",
+                                                      "<init>",
+                                                      "(Ljava/io/File;Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/io/File;Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2B2CB8,%5s"), //aload1, aload2, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "delete",
+                                                      "(Ljava/nio/file/Path;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "createDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by createDirectory
+//                                                      "createDirectories",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "write",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newDirectoryStream
+//                                                      "newDirectoryStream",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel(Path,Set,FileAttribute[])
+//                                                      "newByteChannel",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newByteChannel",
+                                                      "(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/nio/file/Path;Ljava/util/Set;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload0, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by readAttribute
+//                                                      "getAttribute",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/lang/Object;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "getFileAttributeView",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isExecutable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isHidden",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isReadable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isRegularFile",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isSameFile",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s,2BB8,%5s"), //aload0, invokespecial #5, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isWritable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "setAttribute",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "clearProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Constructor",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Field",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Method",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/AccessibleObject",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "setSecurityManager",
+                                                      "(Ljava/lang/SecurityManager;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setSecurityManager",
+                                                        "s" + "(Ljava/lang/Object;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Frame;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;Ljava/awt/GraphicsConfiguration;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/ProcessBuilder",
+                                                      "start",
+                                                      "()Ljava/lang/Process;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "processBuilderStart",
+                                                        "s" + "(Ljava/lang/ProcessBuilder;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s") //aload0, invokespecial #5
+    );
+    //</editor-fold>
+
+    private static Instrumentation instrumentation;
+
+    public static void premain(String arg, Instrumentation i) throws IOException, URISyntaxException {
+        instrumentation = i;
+        File thisFile = new File(TrackingAgent.class.getProtectionDomain().getCodeSource().getLocation().toURI());
+        File hooksFile = new File(thisFile.getParentFile(), "org-netbeans-agent-hooks.jar");
+        i.appendToBootstrapClassLoaderSearch(new JarFile(hooksFile));
+    }
+
+    public static void install() {
+        //TODO: should happen only once
+        ClassFileTransformer trackingTransformer = new TrackingTransformer();
+        try {
+            List<Class<?>> classes2Transform = new ArrayList<>();
+            for (String className : toInject.stream().map(me -> me.className.replace('/', '.')).collect(Collectors.toSet())) {
+                try {
+                    classes2Transform.add(Class.forName(className));
+                } catch (ClassNotFoundException ex) {
+                    //XXX: warn:
+                    System.err.println("cannot instrument:");
+                    ex.printStackTrace();
+                }
+            }
+            instrumentation.addTransformer(trackingTransformer, true);
+            instrumentation.retransformClasses(classes2Transform.toArray(new Class[0]));
+        } catch (UnmodifiableClassException ex) {
+            System.err.println("cannot instrument:");
+            ex.printStackTrace();
+        } finally {
+            instrumentation.removeTransformer(trackingTransformer);
+        }
+    }
+
+    private static class TrackingTransformer implements ClassFileTransformer {
+
+        private static final BiFunction<String, Integer, byte[]> NOOP_INJECTOR = (n, pp) -> null;
+
+        public TrackingTransformer() {
+        }
+
+        @Override
+        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+            if (className == null) {
+                return classfileBuffer;
+            }
+            try {
+                List<MethodEnhancement> thisClassEnhancements = toInject.stream().filter(me -> {/*System.err.println("className=" + className); */return className.equals(me.className);}).collect(Collectors.toList());
+            if (thisClassEnhancements.isEmpty()) {
+//                System.err.println("not rewriting: " + className);
+                return classfileBuffer;
+            }
+            List<Edit> injectBytes = new ArrayList<>();
+//            System.err.println("transforming: " + className);
+            int p = 4 + 2 + 2;
+            int cpStart = p;
+            int cpEntries = readShort(classfileBuffer, p);
+//                System.err.println("cpEntries: " + cpEntries);
+            p += 2;
+            List<Object> constantPool = new ArrayList<>();
+            constantPool.add(null);
+            for (int entry = 1; entry < cpEntries; entry++) {
+//                System.err.println("entry: " + entry);
+                byte tag = classfileBuffer[p++];
+//                System.err.println("tag: " + tag);
+                switch (tag) {
+                    case 1:
+                        int size = readShort(classfileBuffer, p);
+                        constantPool.add(new String(classfileBuffer, p + 2, size, StandardCharsets.UTF_8));
+                        p += 2 + size;
+                        break;
+                    case 7: case 8: case 16: case 19: case 20:
+                        p += 2;
+                        constantPool.add(null);
+                        break;
+                    case 15:
+                        p += 3;
+                        constantPool.add(null);
+                        break;
+                    case 3: case 4: case 9: case 10: case 11:
+                    case 12: case 17: case 18:
+                        p += 4;
+                        constantPool.add(null);
+                        break;
+                    case 5: case 6:
+                        p += 8;
+                        constantPool.add(null);
+                        entry++;
+                        constantPool.add(null);
+                        break;
+                    default:
+                        System.err.println("unknown constant pool tag: " + tag);

Review Comment:
   Use Logger.



##########
platform/o.n.agent/src/org/netbeans/agent/TrackingAgent.java:
##########
@@ -0,0 +1,1135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.agent;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+public class TrackingAgent {
+
+    private static final String TRACKING_HOOKS = "org/netbeans/agent/hooks/TrackingHooksCallback";
+
+    //<editor-fold defaultstate="collapsed" desc="Transformations">
+    private static final List<TrackingTransformer.MethodEnhancement> toInject = Arrays.asList(
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1AB8,%5s"), //iload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "exit",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/Runtime",
+                                                      "halt",
+                                                      "(I)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "exitCallback",
+                                                        "s" + "(I)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "1BB8,%5s"), //iload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileOutputStream",
+                                                      "<init>",
+                                                      "(Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream",
+                                                      "<init>",
+                                                      "(Ljava/io/File;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/FileInputStream", //delegates to FileInputStream(File)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newOutputStream",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel
+//                                                      "newInputStream",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "()[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "list",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "()[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FilenameFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "listFiles",
+                                                      "(Ljava/io/FileFilter;)[Ljava/io/File;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdir",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "mkdirs",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "delete",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canExecute",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canRead",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "canWrite",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isDirectory",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "isHidden",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "exists",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "length",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "createNewFile",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setExecutable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setWritable",
+                                                      "(ZZ)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setReadOnly",
+                                                      "()Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "setLastModified",
+                                                      "(J)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/File",
+                                                      "lastModified",
+                                                      "()J",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/io/File;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile", //covered by <init>(File, String)
+//                                                      "<init>",
+//                                                      "(Ljava/lang/String;Ljava/lang/String;)V",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/lang/String;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2A2BB8,%5s"), //aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/io/RandomAccessFile",
+                                                      "<init>",
+                                                      "(Ljava/io/File;Ljava/lang/String;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/io/File;Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2B2CB8,%5s"), //aload1, aload2, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "delete",
+                                                      "(Ljava/nio/file/Path;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "deleteFile",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "createDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by createDirectory
+//                                                      "createDirectories",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "write",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newDirectoryStream
+//                                                      "newDirectoryStream",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newDirectoryStream",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by newByteChannel(Path,Set,FileAttribute[])
+//                                                      "newByteChannel",
+//                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "readWrite",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "newByteChannel",
+                                                      "(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "readWrite",
+                                                        "s" + "(Ljava/nio/file/Path;Ljava/util/Set;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2A2BB8,%5s"), //aload0, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "readAttributes",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+//            new TrackingTransformer.MethodEnhancement("java/nio/file/Files", //covered by readAttribute
+//                                                      "getAttribute",
+//                                                      "(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/lang/Object;",
+//                                                      Arrays.asList(
+//                                                        "s" + TRACKING_HOOKS,
+//                                                        "s" + "read",
+//                                                        "s" + "(Ljava/nio/file/Path;)V",
+//                                                        "0C,%1s,%2s",
+//                                                        "07,%0s",
+//                                                        "0A,%4s,%3s"
+//                                                      ),
+//                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "getFileAttributeView",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isDirectory",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isExecutable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isHidden",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isReadable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isRegularFile",
+                                                      "(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isSameFile",
+                                                      "(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s,2BB8,%5s"), //aload0, invokespecial #5, aload1, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "isWritable",
+                                                      "(Ljava/nio/file/Path;)Z",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "read",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/nio/file/Files",
+                                                      "setAttribute",
+                                                      "(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "write",
+                                                        "s" + "(Ljava/nio/file/Path;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "getProperty",
+                                                      "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "clearProperty",
+                                                      "(Ljava/lang/String;)Ljava/lang/String;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "systemProperty",
+                                                        "s" + "(Ljava/lang/String;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Constructor",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Field",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/Method",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/reflect/AccessibleObject",
+                                                      "setAccessible",
+                                                      "(Z)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setAccessible",
+                                                        "s" + "(Ljava/lang/reflect/AccessibleObject;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0 , invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/System",
+                                                      "setSecurityManager",
+                                                      "(Ljava/lang/SecurityManager;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "setSecurityManager",
+                                                        "s" + "(Ljava/lang/Object;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Frame;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/awt/Window",
+                                                      "<init>",
+                                                      "(Ljava/awt/Window;Ljava/awt/GraphicsConfiguration;)V",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "newAWTWindowCallback",
+                                                        "s" + "(Ljava/awt/Window;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s"), //aload0, invokespecial #5
+            new TrackingTransformer.MethodEnhancement("java/lang/ProcessBuilder",
+                                                      "start",
+                                                      "()Ljava/lang/Process;",
+                                                      Arrays.asList(
+                                                        "s" + TRACKING_HOOKS,
+                                                        "s" + "processBuilderStart",
+                                                        "s" + "(Ljava/lang/ProcessBuilder;)V",
+                                                        "0C,%1s,%2s",
+                                                        "07,%0s",
+                                                        "0A,%4s,%3s"
+                                                      ),
+                                                      "2AB8,%5s") //aload0, invokespecial #5
+    );
+    //</editor-fold>
+
+    private static Instrumentation instrumentation;
+
+    public static void premain(String arg, Instrumentation i) throws IOException, URISyntaxException {
+        instrumentation = i;
+        File thisFile = new File(TrackingAgent.class.getProtectionDomain().getCodeSource().getLocation().toURI());
+        File hooksFile = new File(thisFile.getParentFile(), "org-netbeans-agent-hooks.jar");
+        i.appendToBootstrapClassLoaderSearch(new JarFile(hooksFile));
+    }
+
+    public static void install() {
+        //TODO: should happen only once
+        ClassFileTransformer trackingTransformer = new TrackingTransformer();
+        try {
+            List<Class<?>> classes2Transform = new ArrayList<>();
+            for (String className : toInject.stream().map(me -> me.className.replace('/', '.')).collect(Collectors.toSet())) {
+                try {
+                    classes2Transform.add(Class.forName(className));
+                } catch (ClassNotFoundException ex) {
+                    //XXX: warn:
+                    System.err.println("cannot instrument:");
+                    ex.printStackTrace();
+                }
+            }
+            instrumentation.addTransformer(trackingTransformer, true);
+            instrumentation.retransformClasses(classes2Transform.toArray(new Class[0]));
+        } catch (UnmodifiableClassException ex) {
+            System.err.println("cannot instrument:");
+            ex.printStackTrace();
+        } finally {
+            instrumentation.removeTransformer(trackingTransformer);
+        }
+    }
+
+    private static class TrackingTransformer implements ClassFileTransformer {
+
+        private static final BiFunction<String, Integer, byte[]> NOOP_INJECTOR = (n, pp) -> null;
+
+        public TrackingTransformer() {
+        }
+
+        @Override
+        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+            if (className == null) {
+                return classfileBuffer;
+            }
+            try {
+                List<MethodEnhancement> thisClassEnhancements = toInject.stream().filter(me -> {/*System.err.println("className=" + className); */return className.equals(me.className);}).collect(Collectors.toList());
+            if (thisClassEnhancements.isEmpty()) {
+//                System.err.println("not rewriting: " + className);
+                return classfileBuffer;
+            }
+            List<Edit> injectBytes = new ArrayList<>();
+//            System.err.println("transforming: " + className);
+            int p = 4 + 2 + 2;
+            int cpStart = p;
+            int cpEntries = readShort(classfileBuffer, p);
+//                System.err.println("cpEntries: " + cpEntries);
+            p += 2;
+            List<Object> constantPool = new ArrayList<>();
+            constantPool.add(null);
+            for (int entry = 1; entry < cpEntries; entry++) {
+//                System.err.println("entry: " + entry);
+                byte tag = classfileBuffer[p++];
+//                System.err.println("tag: " + tag);
+                switch (tag) {
+                    case 1:
+                        int size = readShort(classfileBuffer, p);
+                        constantPool.add(new String(classfileBuffer, p + 2, size, StandardCharsets.UTF_8));
+                        p += 2 + size;
+                        break;
+                    case 7: case 8: case 16: case 19: case 20:
+                        p += 2;
+                        constantPool.add(null);
+                        break;
+                    case 15:
+                        p += 3;
+                        constantPool.add(null);
+                        break;
+                    case 3: case 4: case 9: case 10: case 11:
+                    case 12: case 17: case 18:
+                        p += 4;
+                        constantPool.add(null);
+                        break;
+                    case 5: case 6:
+                        p += 8;
+                        constantPool.add(null);
+                        entry++;
+                        constantPool.add(null);
+                        break;
+                    default:
+                        System.err.println("unknown constant pool tag: " + tag);
+                        return classfileBuffer;
+                }
+            }
+
+            int cpEnd = p;
+            ByteArrayOutputStreamImpl additionalConstantPool = new ByteArrayOutputStreamImpl();
+            int[] cpLastEntry = new int[] {constantPool.size()};
+
+            p += 2; //access flags
+            p += 2; //this class
+            p += 2; //super class
+            int interfacesCount = readShort(classfileBuffer, p); p += 2;
+            p += interfacesCount * 2;
+            int fields_count = readShort(classfileBuffer, p); p += 2;
+            for (int f = 0; f < fields_count; f++) {
+                p += 2; //access flags
+                p += 2; //name
+                p += 2; //descriptor
+                p = readAttributes(constantPool, classfileBuffer, p, NOOP_INJECTOR);
+            }
+            int methods_count = readShort(classfileBuffer, p); p += 2;
+            for (int m = 0; m < methods_count; m++) {
+                p += 2; //access flags
+                int nameIdx = readShort(classfileBuffer, p); p += 2;
+                int descriptor = readShort(classfileBuffer, p); p += 2;
+                BiFunction<String, Integer, byte[]> injector = (n, pp) -> null;
+                Optional<MethodEnhancement> me = thisClassEnhancements.stream().filter(me_ -> constantPool.get(nameIdx).equals(me_.methodName)).filter(me_ -> constantPool.get(descriptor).equals(me_.methodDescriptor)).findAny();
+                if (me.isPresent()) {
+                    injector = (n, pp) -> {
+                        if (!"Code".equals(n)) {
+                            return null;
+                        }
+                        
+                        List<Integer> newConstantPoolEntries = new ArrayList<>();
+
+                        for (String cpEntry : me.get().constantPool) {
+                            newConstantPoolEntries.add(cpLastEntry[0]++);
+                            byte[] data = decodeData(cpEntry, newConstantPoolEntries);
+                            additionalConstantPool.write(data);
+                        }
+
+                        int maxStack = readShort(classfileBuffer, pp); pp += 2;
+                        int maxLocals = readShort(classfileBuffer, pp); pp += 2;
+                        int codeLengthStart = pp;
+                        int codeLength = readInt(classfileBuffer, pp); pp += 4;
+                        byte[] dataToInject = decodeData(me.get().code2Inject, newConstantPoolEntries);
+                        int newCodeLength = codeLength + dataToInject.length;
+                        injectBytes.add(new Edit(codeLengthStart, 4, new byte[] {
+                            (byte) ((newCodeLength >> 24) & 0xFF),
+                            (byte) ((newCodeLength >> 16) & 0xFF),
+                            (byte) ((newCodeLength >>  8) & 0xFF),
+                            (byte) ((newCodeLength >>  0) & 0xFF)
+                        }));
+
+                        injectBytes.add(new Edit(pp, 0, dataToInject));
+                        pp += codeLength;
+
+                        //TODO: fix exception offsets, StackMapTable offsets, etc.
+                        int exceptions = readShort(classfileBuffer, pp); pp += 2;
+                        for (int exception = 0; exception < exceptions; exception++) {
+                            int start = readShort(classfileBuffer, pp) + dataToInject.length; pp += 2;
+                            int end = readShort(classfileBuffer, pp) + dataToInject.length; pp += 2;
+                            int handler = readShort(classfileBuffer, pp) + dataToInject.length; pp += 2;
+                            pp += 2;
+                            injectBytes.add(new Edit(pp - 8, 6, new byte[] {
+                                (byte) ((start >>  8) & 0xFF),
+                                (byte) ((start >>  0) & 0xFF),
+                                (byte) ((end >>  8) & 0xFF),
+                                (byte) ((end >>  0) & 0xFF),
+                                (byte) ((handler >>  8) & 0xFF),
+                                (byte) ((handler >>  0) & 0xFF)
+                            }));
+                        }
+                        pp = readAttributes(constantPool, classfileBuffer, pp, NOOP_INJECTOR);
+                        return null;
+                    };
+                }
+                p = readAttributes(constantPool, classfileBuffer, p, injector);
+            }
+            p = readAttributes(constantPool, classfileBuffer, p, NOOP_INJECTOR);
+            injectBytes.add(new Edit(cpStart, 2, new byte[] {(byte) ((cpLastEntry[0] >> 8) & 0xFF), (byte) (cpLastEntry[0] & 0xFF)}));
+            injectBytes.add(new Edit(cpEnd, 0, additionalConstantPool.toByteArray()));
+            byte[] newBuffer = new byte[classfileBuffer.length + injectBytes.stream().mapToInt(e -> e.newData.length - e.len).sum()];
+            int lastCopySource = 0;
+            int lastCopyDest = 0;
+            Collections.sort(injectBytes, (o1, o2) -> o1.start - o2.start);
+            for (Edit edit : injectBytes) {
+                int len = edit.start - lastCopySource;
+                System.arraycopy(classfileBuffer, lastCopySource, newBuffer, lastCopyDest, len); lastCopySource += len + edit.len; lastCopyDest += len;
+                System.arraycopy(edit.newData, 0, newBuffer, lastCopyDest, edit.newData.length); lastCopyDest += edit.newData.length;
+            }
+            int len = classfileBuffer.length - lastCopySource;
+            System.arraycopy(classfileBuffer, lastCopySource, newBuffer, lastCopyDest, len); lastCopySource += len; lastCopyDest += len;
+            return newBuffer;
+            } catch (Throwable t) {
+                t.printStackTrace();

Review Comment:
   Use logger; it is really useful to catch all `Throwable`s ?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists