From 201bfc5b7d990b2dd7250c43c2f966e4897d2116 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 14:33:48 +0200 Subject: [PATCH 01/15] Remove gluon stuff and run as plain desktop app. --- build.gradle | 106 +++++++++++++++--- settings.gradle | 3 - src/main/java/biz/nellemann/mdexpl/App.java | 50 ++++++--- .../biz/nellemann/mdexpl/MainPresenter.java | 55 +++++++++ .../nellemann/mdexpl/NetworkServiceCell.java | 41 +++---- .../biz/nellemann/mdexpl/model/MainModel.java | 20 ---- .../mdexpl/model/NetworkService.java | 2 +- .../mdexpl/service/DiscoveryService.java | 4 - .../nellemann/mdexpl/view/AboutPresenter.java | 64 ----------- .../nellemann/mdexpl/view/AppViewManager.java | 52 --------- .../nellemann/mdexpl/view/MainPresenter.java | 77 ------------- src/main/java/module-info.java | 12 ++ .../{view => }/configuration.properties | 0 .../resources/biz/nellemann/mdexpl/main.fxml | 12 ++ .../biz/nellemann/mdexpl/view/about.fxml | 45 -------- .../biz/nellemann/mdexpl/view/main.fxml | 16 --- 16 files changed, 227 insertions(+), 332 deletions(-) create mode 100644 src/main/java/biz/nellemann/mdexpl/MainPresenter.java delete mode 100644 src/main/java/biz/nellemann/mdexpl/model/MainModel.java delete mode 100644 src/main/java/biz/nellemann/mdexpl/view/AboutPresenter.java delete mode 100644 src/main/java/biz/nellemann/mdexpl/view/AppViewManager.java delete mode 100644 src/main/java/biz/nellemann/mdexpl/view/MainPresenter.java create mode 100644 src/main/java/module-info.java rename src/main/resources/biz/nellemann/mdexpl/{view => }/configuration.properties (100%) create mode 100644 src/main/resources/biz/nellemann/mdexpl/main.fxml delete mode 100644 src/main/resources/biz/nellemann/mdexpl/view/about.fxml delete mode 100644 src/main/resources/biz/nellemann/mdexpl/view/main.fxml diff --git a/build.gradle b/build.gradle index 088bbbb..c5adeb8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,16 @@ -import org.apache.tools.ant.filters.ReplaceTokens - plugins { id 'application' id 'org.openjfx.javafxplugin' version '0.0.14' - id "com.github.johnrengelman.shadow" version "8.1.1" - id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.19' + id 'com.google.osdetector' version '1.7.3' + id 'org.beryx.jlink' version '2.26.0' + //id "com.github.johnrengelman.shadow" version "8.1.1" + //id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.19' + } +import org.apache.tools.ant.filters.ReplaceTokens + repositories { mavenCentral() mavenLocal() @@ -27,23 +30,22 @@ tasks.withType(JavaCompile).configureEach { java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 - modularity.inferModulePath = false + //modularity.inferModulePath = false } /* This is to be able to build with a JDK not bundled with JavaFX */ javafx { - version = '21+' + version = '17.0.8' modules = [ 'javafx.controls', 'javafx.fxml' ] // platform("linux-aarch64") } dependencies { - implementation 'com.gluonhq:charm-glisten:6.2.3' - implementation 'com.gluonhq:glisten-afterburner:2.1.0' - 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 'org.jmdns:jmdns:3.5.8' testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0' @@ -54,7 +56,7 @@ test { useJUnitPlatform() } - +/* gluonfx { verbose = true target = project.hasProperty("target") ? project.getProperty("target") : 'host' @@ -102,18 +104,96 @@ gluonfx { //skipSigning = true // Will not run or deploy if not signed } -} +}*/ +/* shadowJar { //archiveBaseName.set("vtd-poc-app") //archiveClassifier.set('all') archiveVersion.set("${System.env.BITBUCKET_BRANCH ?: 'dev' }") -} +}*/ -tasks.build.dependsOn tasks.shadowJar +//tasks.build.dependsOn tasks.shadowJar tasks.processResources { filesMatching('**/configuration.properties') { filter(ReplaceTokens, tokens: [copyright: '2023', version: System.env.BITBUCKET_BUILD_NUMBER ?: 'development' ]) } } + +jlink { + + forceMerge 'slf4j' + + options = [ + '--strip-debug', + '--compress', '2', + '--no-header-files', + '--no-man-pages' + ] + + launcher { + name = 'mDNS-Explorer' + noConsole = true + } + + // Only works with Java 14 (and later) + jpackage { + imageName = "mDNS-Explorer" + skipInstaller = true + installerName = "mDNS-Explorer-${osdetector.arch}" + installerOptions += [ + '--vendor', 'Nellemann Data', + '--description', 'mDNS Explorer', + '--copyright', 'Mark Nellemann ', + '--app-version', version + ] + + // Requires: https://wixtoolset.org/ to create installer on Windows + if(osdetector.os == 'windows') { + installerType = 'msi' + skipInstaller = false + installerOptions += [ + '--win-per-user-install', + '--win-dir-chooser', + '--win-menu', + // '--icon', 'src/main/resources/icon.ico' + ] + } + + // Requires: xcode-select --install + if(osdetector.os == 'osx') { + installerType = 'dmg' + skipInstaller = false + installerOptions += [ + //'--icon', 'src/main/resources/icon.icns' + ] + } + + if(osdetector.os == 'linux') { + + installerOptions += [ + '--linux-menu-group', 'Internet', + '--linux-shortcut', + //'--icon', 'src/main/resources/icon_256x256.png' + ] + + if (osdetector.release.isLike('debian')) { + installerType = 'deb' + skipInstaller = false + installerOptions += [ + '--linux-deb-maintainer', 'mark.nellemann@gmail.com' + ] + } else if (osdetector.release.isLike('centos')) { + installerType = 'rpm' + skipInstaller = false + installerOptions += [ + '--linux-rpm-license-type', 'APACHE-20' + ] + } + + } + + } + +} diff --git a/settings.gradle b/settings.gradle index 4aeb3ad..616f1de 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,6 @@ pluginManagement { repositories { mavenLocal() - maven { - url "https://nexus.gluonhq.com/nexus/content/repositories/releases" - } gradlePluginPortal() } } diff --git a/src/main/java/biz/nellemann/mdexpl/App.java b/src/main/java/biz/nellemann/mdexpl/App.java index 5742834..83c2d9a 100644 --- a/src/main/java/biz/nellemann/mdexpl/App.java +++ b/src/main/java/biz/nellemann/mdexpl/App.java @@ -1,36 +1,58 @@ package biz.nellemann.mdexpl; -import biz.nellemann.mdexpl.view.AppViewManager; -import com.gluonhq.charm.glisten.application.AppManager; -import com.gluonhq.charm.glisten.visual.Swatch; import javafx.application.Application; +import javafx.application.Platform; +import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; +import javafx.stage.WindowEvent; -import java.util.Objects; +import java.awt.Taskbar; +import java.awt.Toolkit; +import java.awt.Taskbar.Feature; +import java.io.IOException; public class App extends Application { - private final AppManager appManager = AppManager.initialize(this::postInit); - @Override public void init() { - AppViewManager.registerViewsAndDrawer(); + Platform.setImplicitExit(true); } @Override - public void start(Stage primaryStage) { - //System.setProperty(com.gluonhq.attach.util.Constants.ATTACH_DEBUG,"true"); - appManager.start(primaryStage); + public void start(Stage primaryStage) throws IOException { + + // Make all stages close and the app exit when the primary stage is closed + primaryStage.setOnCloseRequest(e -> Platform.exit()); + + // Set icon on the application bar + var appIcon = new Image("/icon.png"); + primaryStage.getIcons().add(appIcon); + + // Set icon on the taskbar/dock + if (Taskbar.isTaskbarSupported()) { + var taskbar = Taskbar.getTaskbar(); + + if (taskbar.isSupported(Feature.ICON_IMAGE)) { + final Toolkit defaultToolkit = Toolkit.getDefaultToolkit(); + var dockIcon = defaultToolkit.getImage(getClass().getResource("/icon.png")); + taskbar.setIconImage(dockIcon); + } + + } + + FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("main.fxml")); + Scene scene = new Scene(fxmlLoader.load()); + primaryStage.setTitle("mDNS Explorer"); + primaryStage.setScene(scene); + primaryStage.show(); } - private void postInit(Scene scene) { - Swatch.GREEN.assignTo(scene); - //scene.getStylesheets().add(App.class.getResource("style.css").toExternalForm()); - ((Stage) scene.getWindow()).getIcons().add(new Image(Objects.requireNonNull(App.class.getResourceAsStream("/icon.png")))); + @Override + public void stop() { } diff --git a/src/main/java/biz/nellemann/mdexpl/MainPresenter.java b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java new file mode 100644 index 0000000..9bc698a --- /dev/null +++ b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java @@ -0,0 +1,55 @@ +package biz.nellemann.mdexpl; + +import biz.nellemann.mdexpl.model.NetworkService; +import biz.nellemann.mdexpl.service.DiscoveryService; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.scene.control.ListView; +import javafx.scene.layout.BorderPane; +import javafx.stage.WindowEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import java.util.ResourceBundle; + +public class MainPresenter { + + private static final Logger log = LoggerFactory.getLogger(MainPresenter.class); + + + @FXML + private BorderPane view; + + @FXML + private ResourceBundle resources; + + @FXML + private ListView listView; + + @Inject + DiscoveryService discoveryService; + + private final ObservableList devicesList = FXCollections.observableArrayList(); + + + @FXML + public void initialize() { + log.info("initialize()"); + + view.addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, event -> { + log.info("Window closing"); + discoveryService.destroy(); + }); + + discoveryService = new DiscoveryService(); + discoveryService.initialize(); + discoveryService.setObservableList(devicesList); + listView.setItems(devicesList); + listView.setCellFactory(p -> new NetworkServiceCell()); + } + + +} diff --git a/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java b/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java index c01398f..bbd658d 100644 --- a/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java +++ b/src/main/java/biz/nellemann/mdexpl/NetworkServiceCell.java @@ -1,40 +1,37 @@ package biz.nellemann.mdexpl; import biz.nellemann.mdexpl.model.NetworkService; -import com.gluonhq.attach.util.impl.ClipboardUtils; -import com.gluonhq.charm.glisten.control.CharmListCell; -import com.gluonhq.charm.glisten.control.ListTile; +import javafx.application.Platform; +import javafx.scene.control.ListCell; import javafx.scene.input.ClipboardContent; +import javafx.scene.layout.HBox; import javafx.scene.shape.Rectangle; import javafx.scene.input.Clipboard; -import java.util.Optional; -public class NetworkServiceCell extends CharmListCell { +public class NetworkServiceCell extends ListCell { - private final ListTile tile; private final Rectangle icon; private final Clipboard clipboard; private final ClipboardContent clipboardContent; + HBox hBox; public NetworkServiceCell() { clipboard = Clipboard.getSystemClipboard(); clipboardContent = new ClipboardContent(); - this.tile = new ListTile(); - //imageView = new ImageView(); - //imageView.setFitHeight(15); - //imageView.setFitWidth(25); - //tile.setPrimaryGraphic(imageView); icon = new Rectangle(); icon.setHeight(25); icon.setWidth(25); - tile.setPrimaryGraphic(icon); - tile.setOnMouseClicked(e -> { - clipboardContent.putString(itemProperty().get().getUrl()); - clipboard.setContent(clipboardContent); + this.setGraphic(icon); + + this.setOnMouseClicked(e -> { + if(itemProperty().get() != null) { + clipboardContent.putString(itemProperty().get().getUrl()); + clipboard.setContent(clipboardContent); + }; }); setText(null); } @@ -43,16 +40,14 @@ public class NetworkServiceCell extends CharmListCell { @Override public void updateItem(NetworkService item, boolean empty) { super.updateItem(item, empty); - if (item != null && !empty) { - tile.textProperty().setAll(item.getName(), - item.getApp() + " (" + item.getSubType() + ") - " + item.getUrl() - ); - icon.setFill(item.getColor()); - setGraphic(tile); - } else { + if (empty) { + setText(null); setGraphic(null); + } else { + setText(item.toString()); + icon.setFill(item.getColor()); + setGraphic(icon); } } - } diff --git a/src/main/java/biz/nellemann/mdexpl/model/MainModel.java b/src/main/java/biz/nellemann/mdexpl/model/MainModel.java deleted file mode 100644 index 4c96aaa..0000000 --- a/src/main/java/biz/nellemann/mdexpl/model/MainModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package biz.nellemann.mdexpl.model; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.PostConstruct; -import javax.inject.Singleton; - -@Singleton -public class MainModel { - - private static final Logger log = LoggerFactory.getLogger(MainModel.class); - - - @PostConstruct - public void initialize() { - log.info("initialize()"); - } - -} diff --git a/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java b/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java index b148c0a..d6c5caa 100644 --- a/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java +++ b/src/main/java/biz/nellemann/mdexpl/model/NetworkService.java @@ -74,7 +74,7 @@ public class NetworkService { @Override public String toString() { - return name + " (" + type + "), app=" + app + ", url=" + url; + return name + " (" + app + ") " + url; } diff --git a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java index d72761d..071a619 100644 --- a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java +++ b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java @@ -7,8 +7,6 @@ import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import javax.inject.Singleton; import javax.jmdns.JmDNS; import java.io.IOException; @@ -71,7 +69,6 @@ public class DiscoveryService { }}; - @PostConstruct public void initialize() { log.info("initialize()"); try { @@ -82,7 +79,6 @@ public class DiscoveryService { } - @PreDestroy public void destroy() { if(jmdns != null) { try { diff --git a/src/main/java/biz/nellemann/mdexpl/view/AboutPresenter.java b/src/main/java/biz/nellemann/mdexpl/view/AboutPresenter.java deleted file mode 100644 index 2062ca9..0000000 --- a/src/main/java/biz/nellemann/mdexpl/view/AboutPresenter.java +++ /dev/null @@ -1,64 +0,0 @@ -package biz.nellemann.mdexpl.view; - -import com.gluonhq.charm.glisten.application.AppManager; -import com.gluonhq.charm.glisten.control.AppBar; -import com.gluonhq.charm.glisten.mvc.View; -import com.gluonhq.charm.glisten.visual.MaterialDesignIcon; -import javafx.fxml.FXML; -import javafx.scene.control.Label; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Inject; -import java.util.ResourceBundle; - -public class AboutPresenter { - - private static final Logger log = LoggerFactory.getLogger(AboutPresenter.class); - - - @FXML - private ResourceBundle resources; - - @FXML - View about; - - @FXML - Label labelInfoWebsite; - - @FXML - Label labelVersion; - - @Inject String appVersion; - @Inject String aboutWebsite; - - - @FXML - public void initialize() { - log.info("initialize()"); - - about.showingProperty().addListener((obs, oldValue, newValue) -> { - if (newValue) { - AppManager appManager = AppManager.getInstance(); - AppBar appBar = appManager.getAppBar(); - - appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> - appManager.getDrawer().open())); - - appBar.setTitleText("About"); - - appBar.getActionItems().add(MaterialDesignIcon.CLOSE.button(e -> { - appManager.goHome(); - })); - - } - }); - - labelVersion.setText(appVersion); - labelInfoWebsite.setText(aboutWebsite); - - } - - - -} diff --git a/src/main/java/biz/nellemann/mdexpl/view/AppViewManager.java b/src/main/java/biz/nellemann/mdexpl/view/AppViewManager.java deleted file mode 100644 index f656d26..0000000 --- a/src/main/java/biz/nellemann/mdexpl/view/AppViewManager.java +++ /dev/null @@ -1,52 +0,0 @@ -package biz.nellemann.mdexpl.view; - -import biz.nellemann.mdexpl.App; -import com.gluonhq.charm.glisten.afterburner.AppView; -import com.gluonhq.charm.glisten.afterburner.AppViewRegistry; -import com.gluonhq.charm.glisten.afterburner.Utils; -import com.gluonhq.charm.glisten.application.AppManager; -import com.gluonhq.charm.glisten.control.Avatar; -import com.gluonhq.charm.glisten.control.NavigationDrawer; -import com.gluonhq.charm.glisten.visual.MaterialDesignIcon; -import javafx.scene.image.Image; - -import java.util.Locale; -import java.util.Objects; - -import static com.gluonhq.charm.glisten.afterburner.AppView.Flag.*; - -public class AppViewManager { - - public static final AppViewRegistry REGISTRY = new AppViewRegistry(); - - // Shown in drawer - public static final AppView PRIMARY_VIEW = view("Explorer", MainPresenter.class, MaterialDesignIcon.HOME, SHOW_IN_DRAWER, HOME_VIEW, SKIP_VIEW_STACK); - public static final AppView ABOUT_VIEW = view("About", AboutPresenter.class, MaterialDesignIcon.HELP, SHOW_IN_DRAWER); - - - - private static AppView view(String title, Class presenterClass, MaterialDesignIcon menuIcon, AppView.Flag... flags ) { - return REGISTRY.createView(name(presenterClass), title, presenterClass, menuIcon, flags); - } - - private static String name(Class presenterClass) { - return presenterClass.getSimpleName().toUpperCase(Locale.ROOT).replace("PRESENTER", ""); - } - - public static void registerViewsAndDrawer() { - for (AppView view : REGISTRY.getViews()) { - view.registerView(); - } - - NavigationDrawer.Header header = new NavigationDrawer.Header("mDNS Explorer", - "Multicast DNS Explorer", - new Avatar(48, new Image(Objects.requireNonNull(App.class.getResourceAsStream("/icon.png")))) - ); - - Utils.buildDrawer(AppManager.getInstance().getDrawer(), header, REGISTRY.getViews()); - - //NavigationDrawer.Footer footer = new NavigationDrawer.Footer("Bla"); - //AppManager.getInstance().getDrawer().setFooter(footer); - } - -} diff --git a/src/main/java/biz/nellemann/mdexpl/view/MainPresenter.java b/src/main/java/biz/nellemann/mdexpl/view/MainPresenter.java deleted file mode 100644 index 7c8d6a8..0000000 --- a/src/main/java/biz/nellemann/mdexpl/view/MainPresenter.java +++ /dev/null @@ -1,77 +0,0 @@ -package biz.nellemann.mdexpl.view; - -import biz.nellemann.mdexpl.NetworkServiceCell; -import biz.nellemann.mdexpl.model.NetworkService; -import biz.nellemann.mdexpl.model.MainModel; -import biz.nellemann.mdexpl.service.DiscoveryService; -import com.gluonhq.charm.glisten.application.AppManager; -import com.gluonhq.charm.glisten.control.AppBar; -import com.gluonhq.charm.glisten.control.CharmListView; -import com.gluonhq.charm.glisten.control.LifecycleEvent; -import com.gluonhq.charm.glisten.mvc.View; -import com.gluonhq.charm.glisten.visual.MaterialDesignIcon; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.input.MouseEvent; -import javafx.scene.input.TouchEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Inject; -import java.util.ResourceBundle; - -public class MainPresenter { - - private static final Logger log = LoggerFactory.getLogger(MainPresenter.class); - - - @FXML - private View main; - - @Inject - private MainModel model; - - @Inject - private DiscoveryService discoveryService; - - @FXML - private ResourceBundle resources; - - @FXML - private CharmListView charmListView; - - private final ObservableList devicesList = FXCollections.observableArrayList(); - - - @FXML - public void initialize() { - - log.info("initialize()"); - - main.showingProperty().addListener((obs, oldValue, newValue) -> { - if (newValue) { - AppManager appManager = AppManager.getInstance(); - AppBar appBar = appManager.getAppBar(); - - appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> - appManager.getDrawer().open())); - - appBar.setTitleText("mDNS Explorer"); - } - }); - - discoveryService.setObservableList(devicesList); - charmListView.setItems(devicesList); - charmListView.setCellFactory(p -> new NetworkServiceCell()); - } - - - public void onEventShowing(LifecycleEvent lifecycleEvent) { - - } - - public void onEventHiding(LifecycleEvent lifecycleEvent) { - } - -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..387106d --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,12 @@ +module biz.nellemann.mdexpl { + requires javafx.controls; + requires javafx.fxml; + requires javax.jmdns; + requires org.slf4j; + requires javax.inject; + requires java.annotation; + requires java.desktop; + + opens biz.nellemann.mdexpl to javafx.fxml; + exports biz.nellemann.mdexpl; +} diff --git a/src/main/resources/biz/nellemann/mdexpl/view/configuration.properties b/src/main/resources/biz/nellemann/mdexpl/configuration.properties similarity index 100% rename from src/main/resources/biz/nellemann/mdexpl/view/configuration.properties rename to src/main/resources/biz/nellemann/mdexpl/configuration.properties diff --git a/src/main/resources/biz/nellemann/mdexpl/main.fxml b/src/main/resources/biz/nellemann/mdexpl/main.fxml new file mode 100644 index 0000000..bdef55f --- /dev/null +++ b/src/main/resources/biz/nellemann/mdexpl/main.fxml @@ -0,0 +1,12 @@ + + + + + + + +
+ +
+ +
diff --git a/src/main/resources/biz/nellemann/mdexpl/view/about.fxml b/src/main/resources/biz/nellemann/mdexpl/view/about.fxml deleted file mode 100644 index df8b47f..0000000 --- a/src/main/resources/biz/nellemann/mdexpl/view/about.fxml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/biz/nellemann/mdexpl/view/main.fxml b/src/main/resources/biz/nellemann/mdexpl/view/main.fxml deleted file mode 100644 index 31171e8..0000000 --- a/src/main/resources/biz/nellemann/mdexpl/view/main.fxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - -
- -
- -
From ff68f18ac3f03587d2a654259eab17d1a02863d5 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 17:58:57 +0200 Subject: [PATCH 02/15] Test drone builds. --- .dockerignore | 2 + .drone.yml | 44 ++++++++++++++++++++ README.md | 86 ++++++--------------------------------- build.gradle | 49 +++++++++++----------- docker/Dockerfile.deb-txt | 12 ++++++ docker/Dockerfile.rpm-txt | 14 +++++++ gradle.properties | 1 + 7 files changed, 110 insertions(+), 98 deletions(-) create mode 100644 .dockerignore create mode 100644 .drone.yml create mode 100644 docker/Dockerfile.deb-txt create mode 100644 docker/Dockerfile.rpm-txt create mode 100644 gradle.properties diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..20398ae --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +.gradle diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..ebfa697 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,44 @@ +--- +kind: pipeline +name: default +type: docker + +#platform: +# os: linux +# arch: amd64 + + +steps: + + - name: test + image: docker.io/bellsoft/liberica-openjdk-debian:17 + commands: + - ./gradlew --quiet --no-daemon test + + + - name: build-deb + image: docker.io/debian:stable + environment: + AUTH_TOKEN: # Gitea access token ENV variable + from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above + commands: + - apt-get install -y dpkg-dev unzip zip curl + - ./gradlew --quiet --no-daemon build jpackage + - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done + when: + event: + - tag + + + - name: build-rpm + image: docker.io/almalinux:8 + environment: + AUTH_TOKEN: # Gitea access token ENV variable + from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above + commands: + - dnf -y install unzip zip rpm-build + - ./gradlew --quiet --no-daemon build jpackage + - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done + when: + event: + - tag diff --git a/README.md b/README.md index 9b3ccc9..69fa77a 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,34 @@ # mDNS Explorer -View all multicastDNS devices. +View all multicastDNS devices on your local network. ## Development Java SDK version 17 (or later) is required. -## Native Images - -The native images are built with GraalVM. -Download the Gluon version of GraalVM from https://github.com/gluonhq/graal/releases/tag/gluon-22.1.0.1-Final and extract it locally. - -Point the GRAALVM_HOME environment variable to the folder: - -```export GRAALVM_HOME="/path/to/gluon-22.1.0.1``` - -With all requirements setup and on a supported platform, the general idea is to run: +Information on how to build and package jftpd: ```shell -./gradlew clean build -./gradlew nativeBuild -Ptarget=android # or -Ptarget=ios -./gradlew nativeLink -Ptarget=android -./gradlew nativePackage -Ptarget=android -./gradlew nativeInstall -Ptarget=android -./gradlew nativeRun -Ptarget=android +./gradlew build jpackage ``` -or, in one go for Android: +### Windows -```shell -./gradlew -Ptarget=android clean build nativeBuild nativeLink nativePackage nativeInstall nativeRun -``` +Download and install +- Microsoft .NET Framework 3.5 +- Wix Toolset 3.11.2 (or later) -or, in one go for iOS: -```shell -./gradlew -Ptarget=ios clean build nativeBuild nativeLink nativePackage nativeInstall nativeRun -``` ### Linux -See https://docs.gluonhq.com/#prerequisites_linux +TODO -For nativeBuild on Linux, install the following dependencies. +docker build . -f docker/Dockerfile.rpm-txt -```shell -sudo apt install libgtk-3-dev libavformat-dev libavutil-dev libavcodec-dev libasound2-dev libpango1.0-dev libxtst-dev build-essential -``` +or -#### Building for Android (on Linux) - -See https://docs.gluonhq.com/#prerequisites_android - -Install Android Studio and use sdkmanager to install the following: - -- Android SDK Platform 31 -- NDK (Side by side) - -Point the ANDROID_NDK variable to the installed NDK directory: - -``` -export ANDROID_NDK="/home/mark/Android/Sdk/ndk/25.2.9519653/" -``` - -Add the platform-tools to you PATH to use 'adb' command: - - -``` -export PATH="$PATH:/home/mark/Android/Sdk/platform-tools/" -``` - -Run the 'adb devices' and 'adb usb' to verify your Android networkService is in development mode and allows connections. +docker build . -f docker/Dockerfile.deb-txt ### MacOS -See https://docs.gluonhq.com/#platforms_macos - -Install the xcode command line tools and an iPhone emulator. - -If you have problems with *xcrun* not being able to find *iphoneos*, try: - -```shell -sudo xcode-select --switch /Applications/Xcode.app -``` - -Download and install homebrew, and install the following: - -```shell -brew install maven -brew install --HEAD libusbmuxd -brew install --HEAD libimobiledevice -``` - -#### iOS (on MacOS) - -See https://docs.gluonhq.com/#prerequisites_ios +TODO diff --git a/build.gradle b/build.gradle index c5adeb8..3ad5d0e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,6 @@ plugins { + id 'java' + id 'groovy' id 'application' id 'org.openjfx.javafxplugin' version '0.0.14' id 'com.google.osdetector' version '1.7.3' @@ -14,19 +16,17 @@ import org.apache.tools.ant.filters.ReplaceTokens repositories { mavenCentral() mavenLocal() - maven { - url 'https://nexus.gluonhq.com/nexus/content/repositories/releases' - } } -version = "0.0.1" -mainClassName = "biz.nellemann.mdexpl.App" -application.mainModule = "biz.nellemann.mdexpl" - tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' } +application { + mainModule = 'biz.nellemann.mdexpl' + mainClass = 'biz.nellemann.mdexpl.App' +} + java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -106,21 +106,6 @@ gluonfx { }*/ -/* -shadowJar { - //archiveBaseName.set("vtd-poc-app") - //archiveClassifier.set('all') - archiveVersion.set("${System.env.BITBUCKET_BRANCH ?: 'dev' }") -}*/ - -//tasks.build.dependsOn tasks.shadowJar - -tasks.processResources { - filesMatching('**/configuration.properties') { - filter(ReplaceTokens, tokens: [copyright: '2023', version: System.env.BITBUCKET_BUILD_NUMBER ?: 'development' ]) - } -} - jlink { forceMerge 'slf4j' @@ -179,21 +164,37 @@ jlink { ] if (osdetector.release.isLike('debian')) { + // Requires 'dpkg-dev' installed installerType = 'deb' skipInstaller = false installerOptions += [ '--linux-deb-maintainer', 'mark.nellemann@gmail.com' ] - } else if (osdetector.release.isLike('centos')) { + } else if (osdetector.release.isLike('centos') or osdetector.release.isLike('suse')) { + // Requires 'rpm-build' installed installerType = 'rpm' skipInstaller = false installerOptions += [ '--linux-rpm-license-type', 'APACHE-20' ] } - } } } + +/* +shadowJar { + //archiveBaseName.set("vtd-poc-app") + //archiveClassifier.set('all') + archiveVersion.set("${System.env.BITBUCKET_BRANCH ?: 'dev' }") +}*/ + +//tasks.build.dependsOn tasks.shadowJar + +tasks.processResources { + filesMatching('**/configuration.properties') { + filter(ReplaceTokens, tokens: [copyright: '2023', version: System.env.BITBUCKET_BUILD_NUMBER ?: 'development' ]) + } +} diff --git a/docker/Dockerfile.deb-txt b/docker/Dockerfile.deb-txt new file mode 100644 index 0000000..02a4d86 --- /dev/null +++ b/docker/Dockerfile.deb-txt @@ -0,0 +1,12 @@ +FROM docker.io/debian:stable AS build + +RUN apt-get update && apt-get install -y unzip zip curl dpkg-dev +RUN bash -c "curl -s 'https://get.sdkman.io' | bash" +RUN bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + +COPY ./src /tmp/prj/src +COPY ./gradle /tmp/prj/gradle +COPY [ "gradlew", "build.gradle", "gradle.properties", "settings.gradle", "/tmp/prj/" ] + +WORKDIR /tmp/prj +RUN bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" diff --git a/docker/Dockerfile.rpm-txt b/docker/Dockerfile.rpm-txt new file mode 100644 index 0000000..eb9213c --- /dev/null +++ b/docker/Dockerfile.rpm-txt @@ -0,0 +1,14 @@ +FROM docker.io/almalinux:8 AS build + +RUN dnf -y install unzip zip rpm-build +RUN sh -c "curl -s 'https://get.sdkman.io' | bash" +RUN sh -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + +COPY ./src /tmp/prj/src +COPY ./gradle /tmp/prj/gradle +COPY [ "gradlew", "build.gradle", "gradle.properties", "settings.gradle", "/tmp/prj/" ] + +WORKDIR /tmp/prj +RUN sh -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + +COPY --from=build build/jpackage/* build/ diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..82348b2 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +version = 0.0.1 From 1289f3b8fff9898857e9af59ef7a20067a049e08 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 18:04:49 +0200 Subject: [PATCH 03/15] Test drone builds. --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index ebfa697..1a3a141 100644 --- a/.drone.yml +++ b/.drone.yml @@ -22,7 +22,7 @@ steps: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - apt-get install -y dpkg-dev unzip zip curl + - apt-get update && apt-get install -y dpkg-dev unzip zip curl - ./gradlew --quiet --no-daemon build jpackage - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: From 6eac4dedec3baed6cc29862d6d307ac4332273b5 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 18:08:19 +0200 Subject: [PATCH 04/15] Test drone builds. --- .drone.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 1a3a141..9c40b9b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,7 +23,9 @@ steps: from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - apt-get update && apt-get install -y dpkg-dev unzip zip curl - - ./gradlew --quiet --no-daemon build jpackage + - curl -s 'https://get.sdkman.io' | bash + - source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca + - source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: @@ -36,8 +38,10 @@ steps: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - dnf -y install unzip zip rpm-build - - ./gradlew --quiet --no-daemon build jpackage + - dnf -y install unzip zip curl rpm-build + - curl -s 'https://get.sdkman.io' | bash + - source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca + - source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: From 5077130eb79f63df6167425747855d26276ef539 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 18:12:07 +0200 Subject: [PATCH 05/15] Test drone builds. --- .drone.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index 9c40b9b..4921f47 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,9 +23,9 @@ steps: from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - apt-get update && apt-get install -y dpkg-dev unzip zip curl - - curl -s 'https://get.sdkman.io' | bash - - source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca - - source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage + - bash -c "curl -s 'https://get.sdkman.io' | bash" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: @@ -39,9 +39,9 @@ steps: from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - dnf -y install unzip zip curl rpm-build - - curl -s 'https://get.sdkman.io' | bash - - source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca - - source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage + - bash -c "curl -s 'https://get.sdkman.io' | bash" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: From d57541d0eb85493e3c5395ffd4cef0b0f7dfeb26 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 18:15:41 +0200 Subject: [PATCH 06/15] Test drone builds. --- .drone.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index 4921f47..a8e6f52 100644 --- a/.drone.yml +++ b/.drone.yml @@ -24,9 +24,9 @@ steps: commands: - apt-get update && apt-get install -y dpkg-dev unzip zip curl - bash -c "curl -s 'https://get.sdkman.io' | bash" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" - - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done + - for file in build/jpackage/*.deb ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: - tag @@ -40,9 +40,9 @@ steps: commands: - dnf -y install unzip zip curl rpm-build - bash -c "curl -s 'https://get.sdkman.io' | bash" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8-zulu" + - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" - - for file in build/jpackage/*.{rpm,deb} ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done + - for file in build/jpackage/*.rpm ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: - tag From 1e1bcf1996cb38c60ecc1651afb644f3da97054d Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 18:25:58 +0200 Subject: [PATCH 07/15] Test drone builds. --- .drone.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.drone.yml b/.drone.yml index a8e6f52..2650de1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -10,11 +10,10 @@ type: docker steps: - - name: test - image: docker.io/bellsoft/liberica-openjdk-debian:17 - commands: - - ./gradlew --quiet --no-daemon test - +# - name: test +# image: docker.io/bellsoft/liberica-openjdk-debian:17 +# commands: +# - ./gradlew --quiet --no-daemon test - name: build-deb image: docker.io/debian:stable @@ -22,26 +21,27 @@ steps: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - apt-get update && apt-get install -y dpkg-dev unzip zip curl - - bash -c "curl -s 'https://get.sdkman.io' | bash" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + - apt-get update && apt-get install -y dpkg-dev unzip zip curl openjdk-17-jdk + # - bash -c "curl -s 'https://get.sdkman.io' | bash" + # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" + # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + - ./gradlew --no-daemon clean build jpackage - for file in build/jpackage/*.deb ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: - tag - - name: build-rpm image: docker.io/almalinux:8 environment: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - dnf -y install unzip zip curl rpm-build - - bash -c "curl -s 'https://get.sdkman.io' | bash" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" - - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + - dnf -y install unzip zip curl rpm-build java-17-openjdk +# - bash -c "curl -s 'https://get.sdkman.io' | bash" +# - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" +# - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + - ./gradlew --no-daemon clean build jpackage - for file in build/jpackage/*.rpm ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: From e3e80b70037f45d0aeb4387c69a15b8c452ec1a6 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 19:09:05 +0200 Subject: [PATCH 08/15] Test drone builds. --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 2650de1..4446e82 100644 --- a/.drone.yml +++ b/.drone.yml @@ -37,7 +37,7 @@ steps: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - dnf -y install unzip zip curl rpm-build java-17-openjdk + - dnf -y install unzip zip curl rpm-build java-17-openjdk-gui # - bash -c "curl -s 'https://get.sdkman.io' | bash" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" From 7678813e457dac8a7093026765cd140321bd86b9 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 19:19:36 +0200 Subject: [PATCH 09/15] Test drone builds. --- .drone.yml | 4 +-- build.gradle | 66 ++---------------------------------------- doc/mDNS-Explorer.png | Bin 0 -> 47849 bytes 3 files changed, 5 insertions(+), 65 deletions(-) create mode 100644 doc/mDNS-Explorer.png diff --git a/.drone.yml b/.drone.yml index 4446e82..cf9ffc4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -32,12 +32,12 @@ steps: - tag - name: build-rpm - image: docker.io/almalinux:8 + image: docker.io/almalinux:9 environment: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - dnf -y install unzip zip curl rpm-build java-17-openjdk-gui + - dnf -y install unzip zip curl rpm-build java-17-openjdk # - bash -c "curl -s 'https://get.sdkman.io' | bash" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" diff --git a/build.gradle b/build.gradle index 3ad5d0e..dcaf8a9 100644 --- a/build.gradle +++ b/build.gradle @@ -5,9 +5,6 @@ plugins { id 'org.openjfx.javafxplugin' version '0.0.14' id 'com.google.osdetector' version '1.7.3' id 'org.beryx.jlink' version '2.26.0' - //id "com.github.johnrengelman.shadow" version "8.1.1" - //id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.19' - } @@ -30,7 +27,9 @@ application { java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 - //modularity.inferModulePath = false + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } /* This is to be able to build with a JDK not bundled with JavaFX */ @@ -56,56 +55,6 @@ test { useJUnitPlatform() } -/* -gluonfx { - verbose = true - target = project.hasProperty("target") ? project.getProperty("target") : 'host' - //target = 'ios' // Uncomment to enable iOS - see https://docs.gluonhq.com/#prerequisites_ios - //target = 'android' // Uncomment to enable Android - see https://docs.gluonhq.com/#prerequisites_android - - attachConfig { - version = "4.0.18" - services 'storage', 'display', 'lifecycle', 'statusbar' - } - - reflectionList = [ - "javafx.fxml.FXMLLoader", - "com.gluonhq.charm.glisten.mvc.View", - "com.gluonhq.charm.glisten.control.Icon", - "com.gluonhq.charm.glisten.control.DropdownButton", - "com.gluonhq.charm.glisten.control.BottomNavigation", - "com.gluonhq.charm.glisten.control.BottomNavigationButton", - "biz.nellemann.mdexpl.view.AboutPresenter", - "biz.nellemann.mdexpl.view.MainPresenter", "biz.nellemann.mdexpl.model.MainModel", - "biz.nellemann.mdexpl.service.DiscoveryService", - ] - - compilerArgs = [ - '-Djava.awt.headless=true' - ] - - appIdentifier = 'biz.nellemann.mdexpl' - - release { - // Android - appLabel = "mDNS Explorer" - //versionCode = "1" - //versionName = "1.0" - //providedKeyStorePath = "" - //providedKeyStorePassword = "" - //providedKeyAlias = "" - //providedKeyAliasPassword = "" - // iOS - //bundleName = "mDNS Explorer" - //bundleVersion = "" - //bundleShortVersion = "" - //providedSigningIdentity = "" - //providedProvisioningProfile = "" - //skipSigning = true // Will not run or deploy if not signed - } - -}*/ - jlink { forceMerge 'slf4j' @@ -184,15 +133,6 @@ jlink { } -/* -shadowJar { - //archiveBaseName.set("vtd-poc-app") - //archiveClassifier.set('all') - archiveVersion.set("${System.env.BITBUCKET_BRANCH ?: 'dev' }") -}*/ - -//tasks.build.dependsOn tasks.shadowJar - tasks.processResources { filesMatching('**/configuration.properties') { filter(ReplaceTokens, tokens: [copyright: '2023', version: System.env.BITBUCKET_BUILD_NUMBER ?: 'development' ]) diff --git a/doc/mDNS-Explorer.png b/doc/mDNS-Explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0d9a93bdfc4f06a55fb94bdec2b09a315647af GIT binary patch literal 47849 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 H$; Date: Mon, 14 Aug 2023 19:25:41 +0200 Subject: [PATCH 10/15] Test drone builds. --- .drone.yml | 2 +- README.md | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index cf9ffc4..367c8ba 100644 --- a/.drone.yml +++ b/.drone.yml @@ -37,7 +37,7 @@ steps: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - dnf -y install unzip zip curl rpm-build java-17-openjdk + - dnf -y install unzip zip rpm-build java-17-openjdk # - bash -c "curl -s 'https://get.sdkman.io' | bash" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" diff --git a/README.md b/README.md index 69fa77a..56572c0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # mDNS Explorer -View all multicastDNS devices on your local network. +View multicastDNS services on your local network. + +![mDNS-Explorer](doc/mDNS-Explorer.png) + ## Development From 66c79fb2898649b189ff87352cd3ec00e8afadd6 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 19:35:20 +0200 Subject: [PATCH 11/15] Test drone builds. --- .drone.yml | 25 +++---------------------- build.gradle | 22 ++++------------------ 2 files changed, 7 insertions(+), 40 deletions(-) diff --git a/.drone.yml b/.drone.yml index 367c8ba..ea9005a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -15,34 +15,15 @@ steps: # commands: # - ./gradlew --quiet --no-daemon test - - name: build-deb + - name: jpackage image: docker.io/debian:stable environment: AUTH_TOKEN: # Gitea access token ENV variable from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above commands: - - apt-get update && apt-get install -y dpkg-dev unzip zip curl openjdk-17-jdk - # - bash -c "curl -s 'https://get.sdkman.io' | bash" - # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" - # - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" + - apt-get update && apt-get install -y dpkg-dev rpm unzip zip curl openjdk-17-jdk - ./gradlew --no-daemon clean build jpackage - - for file in build/jpackage/*.deb ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done - when: - event: - - tag - - - name: build-rpm - image: docker.io/almalinux:9 - environment: - AUTH_TOKEN: # Gitea access token ENV variable - from_secret: AUTH_TOKEN # Name of DroneCI secret exposed above - commands: - - dnf -y install unzip zip rpm-build java-17-openjdk -# - bash -c "curl -s 'https://get.sdkman.io' | bash" -# - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.8.fx-librca" -# - bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && ./gradlew --no-daemon clean build jpackage" - - ./gradlew --no-daemon clean build jpackage - - for file in build/jpackage/*.rpm ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done + - for file in build/jpackage/*.* ; do curl -s --user "$${AUTH_TOKEN}" --upload-file "$${file}" "https://git.data.coop/api/packages/${DRONE_REPO_OWNER}/generic/${DRONE_REPO_NAME}/${DRONE_TAG}/$(basename $file)" ; done when: event: - tag diff --git a/build.gradle b/build.gradle index dcaf8a9..f63494d 100644 --- a/build.gradle +++ b/build.gradle @@ -105,28 +105,14 @@ jlink { } if(osdetector.os == 'linux') { - + skipInstaller = false installerOptions += [ '--linux-menu-group', 'Internet', '--linux-shortcut', - //'--icon', 'src/main/resources/icon_256x256.png' + '--linux-deb-maintainer', 'mark.nellemann@gmail.com', + '--linux-rpm-license-type', 'APACHE-20', + '--icon', 'src/main/resources/icon.png', ] - - if (osdetector.release.isLike('debian')) { - // Requires 'dpkg-dev' installed - installerType = 'deb' - skipInstaller = false - installerOptions += [ - '--linux-deb-maintainer', 'mark.nellemann@gmail.com' - ] - } else if (osdetector.release.isLike('centos') or osdetector.release.isLike('suse')) { - // Requires 'rpm-build' installed - installerType = 'rpm' - skipInstaller = false - installerOptions += [ - '--linux-rpm-license-type', 'APACHE-20' - ] - } } } From 369e96226fc8d26759306f4133c9c16896c6f570 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Mon, 14 Aug 2023 20:03:50 +0200 Subject: [PATCH 12/15] Ensure closing the window exits. --- gradle.properties | 2 +- src/main/java/biz/nellemann/mdexpl/App.java | 15 ++----- .../biz/nellemann/mdexpl/MainPresenter.java | 10 +---- .../mdexpl/service/DiscoveryService.java | 40 +++++-------------- 4 files changed, 15 insertions(+), 52 deletions(-) diff --git a/gradle.properties b/gradle.properties index 82348b2..49e5f0c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version = 0.0.1 +version = 0.0.2 diff --git a/src/main/java/biz/nellemann/mdexpl/App.java b/src/main/java/biz/nellemann/mdexpl/App.java index 83c2d9a..dfb8885 100644 --- a/src/main/java/biz/nellemann/mdexpl/App.java +++ b/src/main/java/biz/nellemann/mdexpl/App.java @@ -16,16 +16,14 @@ import java.io.IOException; public class App extends Application { - @Override - public void init() { - Platform.setImplicitExit(true); - } - @Override public void start(Stage primaryStage) throws IOException { // Make all stages close and the app exit when the primary stage is closed - primaryStage.setOnCloseRequest(e -> Platform.exit()); + Platform.setImplicitExit(true); + primaryStage.setOnCloseRequest(e -> { + System.exit(0); + }); // Set icon on the application bar var appIcon = new Image("/icon.png"); @@ -51,11 +49,6 @@ public class App extends Application { } - @Override - public void stop() { - } - - public static void main(String[] args) { launch(args); } diff --git a/src/main/java/biz/nellemann/mdexpl/MainPresenter.java b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java index 9bc698a..4098a9b 100644 --- a/src/main/java/biz/nellemann/mdexpl/MainPresenter.java +++ b/src/main/java/biz/nellemann/mdexpl/MainPresenter.java @@ -38,17 +38,9 @@ public class MainPresenter { @FXML public void initialize() { log.info("initialize()"); - - view.addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, event -> { - log.info("Window closing"); - discoveryService.destroy(); - }); - - discoveryService = new DiscoveryService(); - discoveryService.initialize(); - discoveryService.setObservableList(devicesList); listView.setItems(devicesList); listView.setCellFactory(p -> new NetworkServiceCell()); + discoveryService = new DiscoveryService(devicesList); } diff --git a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java index 071a619..313b28d 100644 --- a/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java +++ b/src/main/java/biz/nellemann/mdexpl/service/DiscoveryService.java @@ -20,16 +20,10 @@ public class DiscoveryService { private final static Logger log = LoggerFactory.getLogger(DiscoveryService.class); - private ObservableList observableList; + private final ObservableList observableList; private JmDNS jmdns; - /*private final HashMap services = HashMap<>({ - "http", "https", "upnp", "ssh", "sip", "rdp", "ntp", "rdp", "rtsp", - "ntp", "smb", "nfs", "llrp", "ftp", "ep", "daap", "ipp", "ipps", - "googlecast", "sonos", "airplay", "smartenergy", "skype", "bittorrent" - );*/ - // From: http://www.dns-sd.org/serviceTypes.html + // https://jonathanmumm.com/tech-it/mdns-bonjour-bible-common-service-strings-for-various-vendors/ + some guesses private final Map services = new HashMap<>() {{ @@ -68,36 +62,20 @@ public class DiscoveryService { //put("rdlink", Color.KHAKI); }}; + public DiscoveryService(ObservableList list) { + log.info("DiscoveryService()"); + this.observableList = list; - public void initialize() { - log.info("initialize()"); try { jmdns = JmDNS.create(InetAddress.getByName("0.0.0.0"), "mdnsExplorer"); + services.forEach((item, color) -> { + String service = String.format("_%s._%s.local.", item, "tcp"); + NetworkServiceListener networkServiceListener = new NetworkServiceListener(service, observableList, color); + jmdns.addServiceListener(service, networkServiceListener); + }); } catch (IOException e) { log.error("initialize() - {}", e.getMessage()); } } - - public void destroy() { - if(jmdns != null) { - try { - jmdns.close(); - } catch (IOException e) { - log.error("destroy() - {}", e.getMessage()); - } - } - } - - - public void setObservableList(ObservableList list) { - this.observableList = list; - services.forEach((item, color) -> { - String service = String.format("_%s._%s.local.", item, "tcp"); - NetworkServiceListener networkServiceListener = new NetworkServiceListener(service, observableList, color); - jmdns.addServiceListener(service, networkServiceListener); - }); - } - - } From 61baab8c70de736fb5cb002201e64af800bd5d09 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Tue, 15 Aug 2023 09:20:17 +0200 Subject: [PATCH 13/15] Cleanup. --- build.gradle | 16 ++++------------ .../nellemann/mdexpl/configuration.properties | 8 -------- 2 files changed, 4 insertions(+), 20 deletions(-) delete mode 100644 src/main/resources/biz/nellemann/mdexpl/configuration.properties diff --git a/build.gradle b/build.gradle index f63494d..73a6fcb 100644 --- a/build.gradle +++ b/build.gradle @@ -7,9 +7,6 @@ plugins { id 'org.beryx.jlink' version '2.26.0' } - -import org.apache.tools.ant.filters.ReplaceTokens - repositories { mavenCentral() mavenLocal() @@ -78,7 +75,7 @@ jlink { installerName = "mDNS-Explorer-${osdetector.arch}" installerOptions += [ '--vendor', 'Nellemann Data', - '--description', 'mDNS Explorer', + '--description', 'List mDNS services on your local network.', '--copyright', 'Mark Nellemann ', '--app-version', version ] @@ -104,13 +101,14 @@ jlink { ] } + // Requires: build-rpm / rpm and dpkg-dev if(osdetector.os == 'linux') { skipInstaller = false installerOptions += [ - '--linux-menu-group', 'Internet', '--linux-shortcut', - '--linux-deb-maintainer', 'mark.nellemann@gmail.com', + '--linux-menu-group', 'Internet', '--linux-rpm-license-type', 'APACHE-20', + '--linux-deb-maintainer', 'mark.nellemann@gmail.com', '--icon', 'src/main/resources/icon.png', ] } @@ -118,9 +116,3 @@ jlink { } } - -tasks.processResources { - filesMatching('**/configuration.properties') { - filter(ReplaceTokens, tokens: [copyright: '2023', version: System.env.BITBUCKET_BUILD_NUMBER ?: 'development' ]) - } -} diff --git a/src/main/resources/biz/nellemann/mdexpl/configuration.properties b/src/main/resources/biz/nellemann/mdexpl/configuration.properties deleted file mode 100644 index f6c5482..0000000 --- a/src/main/resources/biz/nellemann/mdexpl/configuration.properties +++ /dev/null @@ -1,8 +0,0 @@ -### -# properties defined in configuration.properties per folder (component) -# can be directly injected into a presenter - -appCopyright=@copyright@ -appVersion=@version@ - -aboutWebsite=https://www.nellemann.biz From 603701c296481cc63e6b0b65044c55793a4e7d90 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Tue, 15 Aug 2023 21:00:47 +0200 Subject: [PATCH 14/15] Display service properties. --- build.gradle | 4 +-- doc/mDNS-Explorer.png | Bin 47849 -> 89436 bytes gradle.properties | 2 +- src/main/java/biz/nellemann/mdexpl/App.java | 1 - .../biz/nellemann/mdexpl/MainPresenter.java | 10 +++++--- .../nellemann/mdexpl/NetworkServiceCell.java | 14 +++++++++-- .../mdexpl/NetworkServiceListener.java | 23 ++++++++++++------ .../mdexpl/model/NetworkService.java | 15 +++++++++++- .../mdexpl/service/DiscoveryService.java | 5 +++- src/main/java/module-info.java | 4 +-- .../resources/biz/nellemann/mdexpl/main.fxml | 5 +++- 11 files changed, 62 insertions(+), 21 deletions(-) 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 6a0d9a93bdfc4f06a55fb94bdec2b09a315647af..a7ad97ed20b11a8062a21dc1c362c84755d3df06 100644 GIT binary patch literal 89436 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

iDEPTj*!!pmI`SMM2)&5v- z#XLGx;o1%F+^>Nq#3Sr@@%`@Z%jXpq=wVc%C*wE19_v)vAy(OQpnROmng` zyTfGe`gy;H6Hnl}<-7g++sjN}KYRuFT8yfVKap19J52W(f(n<}2OBHp27 zXFJMwt_!Ial9!)1)G|$SI?>Nvmk!23xF=ua4(~Kzh6OENiweBPTCCX@0fiVMs(nmY zx!Y9Cy+@s9N8+lfhT}WVd+MoGX?6Yco*FU~O8S>Nn29Agc)-c`S49C!^-5WZ+ac0xuiZv2l}Ejd)Isu!&%;=3~?T z(n;DW+&o@(R&^$}vsbeMQ4Pr2L$vTF^E_zYSOG+jV&9SL#5Q-SE6UW| zHK+*MD7{4v1+`Yige~zurZiD&gd_H6ob*b>9hiO4v?n#LMmf=r?1H6*%$=4t;kC{a z`+Y5TQyzizt|Cdm<&F3PmaA$Njw+1yS)ZQv?B#9eoK}!nWWbeoi_K~M!DwI86X^$Q zkZ4~#TAxxUd4nE4?p$kVr&kfBXKmOFTQZ>Dg4niGN2kqWr(yWiH^Ss3LUg`(oZxZ- zYoU6TaA-V2(c+sl_pMPo!wtUzmkJ55y`{C0aM_v0`j0*#^N73G-v2&?s&&$zjNJN_LUe-WG zd}J4G24^0GrX@25g|bTKNKQ`BE!K2J(0GFjK4=bNKm}oaK!PR;l2gjW*D?{D<&cR3 zinfZXyc5ljvJ7i3Ocf^3p^T~`#e3)K)jc(E)i~H*qF|t=)335OY6%%jYHci7)0{Tl z^1hVi0nGEbU@fRhF@RWHb#{2qH{YYEY2TcSC+32;J8t3RvnJ{!P5&sQ=M)9#mR#C6 z<1pom!L7EO82w1@NTZ3}-Jitm6nreIE6{Bs`)VC?_OjNc6Tf+AxOqcDhi7+;qqpH| z%}0mel5m4&9|R|2`3;t!AZflliY#rX(uRVTs$#T^;8XjN_Tfc4GBLG&H1lsG%dBI@ z*x@lX1!4_7HA6v+Ve?ue6%o?I8=swtfC>gGIqt2M#c^P)0Di9X5w<|?GC)I&#M^lV z*SM;B=v6MbN0GisnaRH3EY@7rIHnKl;~rOx<-ZaZwE|A77BiS~eiHZ^U|>>IUbcTC zbji5vDtEMT+Xk0iRSWKQb#MOeZu_b%#~Yvf%}|J6&`t^>w+|O0D9+13kG{)wAG269 z!IZwN0(9tFR!-Qh796yxBKdq{q0D62q|PP&@;7PXVx4gRbO2sC+uq)pSyzr+Jo9Xv zp4>D8^F>$~>NvM2KN<7451cQLo)8N`P;2bFaFs0skFX(tPp_D}<%bD&?l_lkd_P$` zYSS{aU3#H2yJ|+YYHek~Z{iKbAWa;L2^CD$r!k`^;zU3jaM$#vZ5v~kHFF4>Mt*5d zf(TW?>VdXJ#h(9;V}o_(VjNQ2*H-@V`k!evc~s{UX+y~uN75MPOYF+#DaiOm$2Ot` z5{qrnNZRNK^M!S$0nw4Gbb@VVV7>>`ZAKBOReG&!ed;ZYtJm@l8zfPB7mQi|ILX~! zhqN5L3f$An*ei4>64wpYb8nv}eP6$M%`^}VIZTs~`32wT5sJ}%Kz*f4$X)0j5c)D-? zVH7|8{2d4eibnGlgA5%HINZ+eKz1s~|8C;I$@e;Ohr$PoPY~0~qK?*D0f>tZG7KcRTzGtiqt{{3U)j>x)edg@24MK;tIYt6-K(=dSCEx!USsH#KAwDT2sU( z-qw9AGntOUa{2HaSWT-X^&tzXsCRWddSly&v`Xw$7gCsb&t)p>TTMu;VaGR?Uo-CT zZ_C|*U4|Pmu3f)u+r85I&=lI!TsMLYGjTF#@1AuMyzs)2n}1MR$ic^7{i>lxXbrW?*uk&zHWIH{V`X! zc7I^`O^5f7H&%at^Hgi?FJRC79JHQmNIjEz;`tS?Y=7;0msY=jx@~KJb>FV;^^GaN zv(8k1fBQ75s=CS&f@hw-*~>)UDn&Vw&S_sH;Lq*n$PYeL)tkH^3G)5dVXbF&)sC5{VmQm zZr3-Oo@uYJ3zkdvIvewQNBYx%eo!gIaQsOC?>9TS^i#IWue^CB&~JEhquI9hnz&&3 z?5w+&-n}Y>6y|qBlkL71F2APxa6-T7Nkj8PbP0l+XkKh$4{9 literal 47849 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 H$; 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 @@ - +

+ + + From 70efeedd77c8e9d34337b875464f436a56b86709 Mon Sep 17 00:00:00 2001 From: Mark Nellemann Date: Wed, 16 Aug 2023 09:39:56 +0200 Subject: [PATCH 15/15] Fix build on macOS - requires version number 1+ --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 77b4a58..0e1e62b 100644 --- a/build.gradle +++ b/build.gradle @@ -77,7 +77,7 @@ jlink { '--vendor', 'Nellemann Data', '--description', 'List mDNS services on your local network.', '--copyright', 'Mark Nellemann ', - '--app-version', version + '--app-version', project.findProperty('version') ] // Requires: https://wixtoolset.org/ to create installer on Windows diff --git a/gradle.properties b/gradle.properties index 2c4734b..c518c53 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version = 0.1.1 +version = 1.0.1