diff --git a/build.gradle b/build.gradle index 73a6fcb..77b4a58 100644 --- a/build.gradle +++ b/build.gradle @@ -40,8 +40,8 @@ dependencies { implementation 'org.slf4j:slf4j-api:2.0.7' // Logging API runtimeOnly 'org.slf4j:slf4j-simple:2.0.7' // Logging API - implementation 'javax.inject:javax.inject:1' - implementation 'javax.annotation:javax.annotation-api:1.3.2' + implementation 'jakarta.inject:jakarta.inject-api:2.0.1' + implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1' implementation 'org.jmdns:jmdns:3.5.8' testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0' diff --git a/doc/mDNS-Explorer.png b/doc/mDNS-Explorer.png index 6a0d9a9..a7ad97e 100644 Binary files a/doc/mDNS-Explorer.png and b/doc/mDNS-Explorer.png differ diff --git a/gradle.properties b/gradle.properties index 49e5f0c..2c4734b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version = 0.0.2 +version = 0.1.1 diff --git a/src/main/java/biz/nellemann/mdexpl/App.java b/src/main/java/biz/nellemann/mdexpl/App.java index dfb8885..03b466a 100644 --- a/src/main/java/biz/nellemann/mdexpl/App.java +++ b/src/main/java/biz/nellemann/mdexpl/App.java @@ -6,7 +6,6 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; -import javafx.stage.WindowEvent; import java.awt.Taskbar; import java.awt.Toolkit; diff --git a/src/main/java/biz/nellemann/mdexpl/MainPresenter.java b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java index 4098a9b..386969b 100644 --- a/src/main/java/biz/nellemann/mdexpl/MainPresenter.java +++ b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java @@ -2,17 +2,17 @@ package biz.nellemann.mdexpl; import biz.nellemann.mdexpl.model.NetworkService; import biz.nellemann.mdexpl.service.DiscoveryService; +import jakarta.inject.Inject; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.ListView; +import javafx.scene.control.TableView; import javafx.scene.layout.BorderPane; -import javafx.stage.WindowEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.inject.Inject; +import java.util.HashMap; import java.util.ResourceBundle; public class MainPresenter { @@ -20,6 +20,7 @@ public class MainPresenter { private static final Logger log = LoggerFactory.getLogger(MainPresenter.class); + @FXML private BorderPane view; @@ -29,6 +30,9 @@ public class MainPresenter { @FXML private ListView listView; + @FXML + public ListView propertiesList; + @Inject DiscoveryService discoveryService; diff --git a/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java b/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java index bbd658d..ba15c3f 100644 --- a/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java +++ b/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java @@ -1,14 +1,16 @@ package biz.nellemann.mdexpl; import biz.nellemann.mdexpl.model.NetworkService; -import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.scene.Node; +import javafx.scene.Scene; import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; import javafx.scene.input.ClipboardContent; import javafx.scene.layout.HBox; import javafx.scene.shape.Rectangle; import javafx.scene.input.Clipboard; - public class NetworkServiceCell extends ListCell { private final Rectangle icon; @@ -31,6 +33,14 @@ public class NetworkServiceCell extends ListCell { if(itemProperty().get() != null) { clipboardContent.putString(itemProperty().get().getUrl()); clipboard.setContent(clipboardContent); + + Node source = (Node) e.getSource(); + Scene scene = source.getScene(); + Object node = scene.lookup("#propertiesList"); + + if(node instanceof ListView listView) { + listView.setItems(FXCollections.observableArrayList(itemProperty().get().getProperties())); + } }; }); setText(null); diff --git a/src/main/java/biz/nellemann/mdexpl/NetworkServiceListener.java b/src/main/java/biz/nellemann/mdexpl/NetworkServiceListener.java index f817e5e..0a0e624 100644 --- a/src/main/java/biz/nellemann/mdexpl/NetworkServiceListener.java +++ b/src/main/java/biz/nellemann/mdexpl/NetworkServiceListener.java @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import javax.jmdns.ServiceEvent; import javax.jmdns.ServiceInfo; import javax.jmdns.ServiceListener; +import java.util.Iterator; public class NetworkServiceListener implements ServiceListener { @@ -21,7 +22,7 @@ public class NetworkServiceListener implements ServiceListener { private final Color color; public NetworkServiceListener(String service, ObservableList observableList, Color color) { - log.info("NetworkServiceListener() - type: {}", service); + log.debug("NetworkServiceListener() - type: {}", service); this.service = service; this.observableList = observableList; this.color = color; @@ -38,13 +39,13 @@ public class NetworkServiceListener implements ServiceListener { ServiceInfo serviceInfo = event.getInfo(); if (serviceInfo != null) { String name = serviceInfo.getName(); + String url = serviceInfo.getURLs()[0]; log.info("serviceRemoved() - Service: " + name); - NetworkService networkService = new NetworkService(name, service, serviceInfo.getSubtype(), serviceInfo.getApplication(), serviceInfo.getURLs()[0], color); - while (observableList.contains(networkService)) { - Platform.runLater(() -> { - observableList.remove(networkService); - }); - } + Platform.runLater( () -> { + observableList.stream().filter(e -> ( + e.getName().equals(name) && e.getUrl().equals(url) + )).forEach(observableList::remove); + }); } } @@ -56,7 +57,15 @@ public class NetworkServiceListener implements ServiceListener { String name = serviceInfo.getName(); String app = serviceInfo.getApplication(); log.info("serviceResolved() - Service: {} - {} with url {}", app, name, url); + NetworkService networkService = new NetworkService(name, service, serviceInfo.getSubtype(), app, url, color); + for (Iterator it = serviceInfo.getPropertyNames().asIterator(); it.hasNext(); ) { + String key = it.next(); + String value = serviceInfo.getPropertyString(key); + //log.info(" -> " + key + " = " + value); + networkService.addProperty(key, value); + } + Platform.runLater(() -> { if(!observableList.contains(networkService)) { observableList.add(networkService); diff --git a/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java b/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java index d6c5caa..676b672 100644 --- a/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java +++ b/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java @@ -1,8 +1,11 @@ package biz.nellemann.mdexpl.model; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.ObservableMap; import javafx.scene.paint.Color; -import java.util.Objects; +import java.util.*; public class NetworkService { @@ -12,6 +15,8 @@ public class NetworkService { private String app; private String url; private Color color; + private final ArrayList propertiesList = new ArrayList<>(); + public NetworkService(String name, String type, String subType, String app, String url, Color color) { this.name = name; @@ -71,6 +76,14 @@ public class NetworkService { this.color = color; } + public void addProperty(String key, String value) { + propertiesList.add(key + ": " + value); + } + + public ArrayList getProperties() { + return propertiesList; + } + @Override public String toString() { diff --git a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java index 313b28d..d173b99 100644 --- a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java +++ b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java @@ -2,12 +2,12 @@ package biz.nellemann.mdexpl.service; import biz.nellemann.mdexpl.NetworkServiceListener; import biz.nellemann.mdexpl.model.NetworkService; +import jakarta.inject.Singleton; import javafx.collections.ObservableList; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.inject.Singleton; import javax.jmdns.JmDNS; import java.io.IOException; import java.net.InetAddress; @@ -56,6 +56,9 @@ public class DiscoveryService { put("homekit", Color.LIGHTGREEN); put("homebridge", Color.LIGHTGREEN); + put("device-info", Color.DARKGREEN); + //put("rdlink", Color.DARKGREEN); + put("sip", Color.YELLOW); put("skype", Color.YELLOW); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 387106d..753b422 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,8 +3,8 @@ module biz.nellemann.mdexpl { requires javafx.fxml; requires javax.jmdns; requires org.slf4j; - requires javax.inject; - requires java.annotation; + requires jakarta.inject; + requires jakarta.annotation; requires java.desktop; opens biz.nellemann.mdexpl to javafx.fxml; diff --git a/src/main/resources/biz/nellemann/mdexpl/main.fxml b/src/main/resources/biz/nellemann/mdexpl/main.fxml index bdef55f..933b83e 100644 --- a/src/main/resources/biz/nellemann/mdexpl/main.fxml +++ b/src/main/resources/biz/nellemann/mdexpl/main.fxml @@ -3,10 +3,13 @@ - +
+ + +