test_class.declarator: ntInstance = NetworkTableInstance.create()
test_class.modifier: private final
test_class.original_string: private final NetworkTableInstance ntInstance = NetworkTableInstance.create();
test_class.type: NetworkTableInstance
test_class.var_name: ntInstance
test_class.declarator: rootTable = ntInstance.getTable("CameraPublisher")
test_class.modifier: private final
test_class.original_string: private final NetworkTable rootTable = ntInstance.getTable("CameraPublisher");
test_class.type: NetworkTable
test_class.var_name: rootTable
test_class.file: plugins/cameraserver/src/test/java/edu/wpi/first/shuffleboard/plugin/cameraserver/source/StreamDiscovererTest.java
test_class.identifier: StreamDiscovererTest
test_case.body: @Test
    public void testEmptyWhenTypeChanges() {
      final StreamDiscoverer discoverer = new StreamDiscoverer(rootTable, "Camera");
      String[] urls = {"foo", "bar"};
      rootTable.getEntry("Camera/streams").setStringArray(urls);
      waitForNtEvents();
  
      rootTable.getEntry("Camera/streams").forceSetBoolean(false);
      waitForNtEvents();
  
      assertArrayEquals(new String[0], discoverer.getUrls());
    }
test_case.class_method_signature: StreamDiscovererTest.testEmptyWhenTypeChanges()
test_case.full_signature: @Test public void testEmptyWhenTypeChanges()
test_case.identifier: testEmptyWhenTypeChanges
test_case.invocations: setStringArray getEntry waitForNtEvents forceSetBoolean getEntry waitForNtEvents assertArrayEquals getUrls
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testEmptyWhenTypeChanges()
focal_class.declarator: streams
focal_class.modifier: private final
focal_class.original_string: private final NetworkTableEntry streams;
focal_class.type: NetworkTableEntry
focal_class.var_name: streams
focal_class.declarator: STREAMS_KEY = "streams"
focal_class.modifier: private static final
focal_class.original_string: private static final String STREAMS_KEY = "streams";
focal_class.type: String
focal_class.var_name: STREAMS_KEY
focal_class.declarator: emptyStringArray = new String[0]
focal_class.modifier: private static final
focal_class.original_string: private static final String[] emptyStringArray = new String[0];
focal_class.type: String[]
focal_class.var_name: emptyStringArray
focal_class.declarator: urls = new AsyncProperty<>(this, "urls", emptyStringArray)
focal_class.modifier: private final
focal_class.original_string: private final AtomicProperty<String[]> urls = new AsyncProperty<>(this, "urls", emptyStringArray);
focal_class.type: AtomicProperty<String[]>
focal_class.var_name: urls
focal_class.declarator: listenerHandle
focal_class.modifier: private final
focal_class.original_string: private final int listenerHandle;
focal_class.type: int
focal_class.var_name: listenerHandle
focal_class.file: plugins/cameraserver/src/main/java/edu/wpi/first/shuffleboard/plugin/cameraserver/source/StreamDiscoverer.java
focal_class.identifier: StreamDiscoverer
focal_class.interfaces: implements Closeable
focal_class.class_method_signature: StreamDiscoverer.StreamDiscoverer(NetworkTable publisherTable, String cameraName)
focal_class.full_signature: public  StreamDiscoverer(NetworkTable publisherTable, String cameraName)
focal_class.identifier: StreamDiscoverer
focal_class.modifiers: public
focal_class.parameters: (NetworkTable publisherTable, String cameraName)
focal_class.signature:  StreamDiscoverer(NetworkTable publisherTable, String cameraName)
focal_class.class_method_signature: StreamDiscoverer.removeCameraProtocols(String... streams)
focal_class.full_signature: @VisibleForTesting static String[] removeCameraProtocols(String... streams)
focal_class.identifier: removeCameraProtocols
focal_class.modifiers: @VisibleForTesting static
focal_class.parameters: (String... streams)
focal_class.return: String[]
focal_class.signature: String[] removeCameraProtocols(String... streams)
focal_class.class_method_signature: StreamDiscoverer.getUrls()
focal_class.full_signature: public String[] getUrls()
focal_class.identifier: getUrls
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.return: String[]
focal_class.signature: String[] getUrls()
focal_class.class_method_signature: StreamDiscoverer.urlsProperty()
focal_class.full_signature: public ReadOnlyProperty<String[]> urlsProperty()
focal_class.identifier: urlsProperty
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.return: ReadOnlyProperty<String[]>
focal_class.signature: ReadOnlyProperty<String[]> urlsProperty()
focal_class.class_method_signature: StreamDiscoverer.close()
focal_class.full_signature: @Override public void close()
focal_class.identifier: close
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void close()
focal_class.class_method_signature: StreamDiscoverer.updateUrls(EntryNotification notification)
focal_class.full_signature: private void updateUrls(EntryNotification notification)
focal_class.identifier: updateUrls
focal_class.modifiers: private
focal_class.parameters: (EntryNotification notification)
focal_class.return: void
focal_class.signature: void updateUrls(EntryNotification notification)
focal_method.body: public String[] getUrls() {
      return urls.getValue().clone(); // defensive copy
    }
focal_method.class_method_signature: StreamDiscoverer.getUrls()
focal_method.full_signature: public String[] getUrls()
focal_method.identifier: getUrls
focal_method.invocations: clone getValue
focal_method.modifiers: public
focal_method.parameters: ()
focal_method.return: String[]
focal_method.signature: String[] getUrls()