Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions app/queue-server/edit-control/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.phoebus</groupId>
<artifactId>app-queue-server</artifactId>
<version>5.0.3-SNAPSHOT</version>
</parent>
<artifactId>app-queue-server-edit-control</artifactId>
<name>${project.groupId}:${project.artifactId}</name>

<dependencies>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>app-queue-server-network</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>core-framework</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>core-ui</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.phoebus.applications.queueserver.editcontrol;

import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.phoebus.applications.queueserver.Preferences;
import org.phoebus.applications.queueserver.client.RunEngineHttpClient;
import org.phoebus.applications.queueserver.util.AppLifecycle;
import org.phoebus.applications.queueserver.util.PythonParameterConverter;
import org.phoebus.applications.queueserver.view.ViewFactory;
import javafx.scene.Parent;

import org.phoebus.framework.spi.AppInstance;
import org.phoebus.framework.spi.AppResourceDescriptor;
import org.phoebus.framework.workbench.ApplicationService;
import org.phoebus.ui.docking.DockItem;
import org.phoebus.ui.docking.DockPane;

@SuppressWarnings("nls")
public final class QueueEditControlApp implements AppResourceDescriptor {

public static final Logger logger = Logger.getLogger(QueueEditControlApp.class.getPackageName());

public static final String NAME = "queue_edit_control";
private static final String DISPLAY_NAME = "Edit & Control Queue";

static {
PythonParameterConverter.initializeInBackground();
}

@Override public String getName() { return NAME; }
@Override public String getDisplayName() { return DISPLAY_NAME; }

@Override public URL getIconURL() {
return getClass().getResource("/icons/bluesky.png");
}

@Override public AppInstance create() {
initializeHttpClient();
AppLifecycle.registerApp();

Parent root = ViewFactory.EDIT_AND_CONTROL_QUEUE.get();
QueueEditControlInstance inst = new QueueEditControlInstance(this, root);

DockItem tab = new DockItem(inst, root);
tab.addClosedNotification(AppLifecycle::unregisterApp);
DockPane.getActiveDockPane().addTab(tab);

return inst;
}

@Override public AppInstance create(java.net.URI resource) {
return ApplicationService.createInstance(NAME);
}

private static void initializeHttpClient() {
String serverUrl = Preferences.queue_server_url;
if (serverUrl == null || serverUrl.trim().isEmpty() || serverUrl.startsWith("$(")) {
serverUrl = "http://localhost:60610";
logger.log(Level.INFO, "Using default Queue Server URL: " + serverUrl);

Check warning on line 64 in app/queue-server/edit-control/src/main/java/org/phoebus/applications/queueserver/editcontrol/QueueEditControlApp.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Format specifiers or lambda should be used instead of string concatenation.

See more on https://sonarcloud.io/project/issues?id=ControlSystemStudio_phoebus&issues=AZz21m4BKdimBKFqU_5Z&open=AZz21m4BKdimBKFqU_5Z&pullRequest=3698
}
String apiKey = resolveApiKey();
RunEngineHttpClient.initialize(serverUrl, apiKey);
}

private static String resolveApiKey() {
String apiKey = Preferences.api_key;
if (apiKey != null && !apiKey.trim().isEmpty() && !apiKey.startsWith("$(")) {
return apiKey.trim();
}
String keyFilePath = Preferences.api_key_file;
if (keyFilePath != null && !keyFilePath.trim().isEmpty() && !keyFilePath.startsWith("$(")) {
try {
Path path = Paths.get(keyFilePath.trim());
if (Files.exists(path)) {
return Files.readString(path).trim();
}
} catch (Exception e) {
logger.log(Level.WARNING, "Failed to read API key from file: " + keyFilePath, e);
}
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.phoebus.applications.queueserver.editcontrol;

import javafx.scene.Node;
import org.phoebus.framework.persistence.Memento;
import org.phoebus.framework.spi.AppDescriptor;
import org.phoebus.framework.spi.AppInstance;

final class QueueEditControlInstance implements AppInstance {

private final AppDescriptor desc;
private final Node view;

QueueEditControlInstance(AppDescriptor desc, Node view) {
this.desc = desc;
this.view = view;
}

@Override public AppDescriptor getAppDescriptor() { return desc; }
public Node create() { return view; }

@Override public void restore(Memento m) { /* nothing */ }
@Override public void save (Memento m) { /* nothing */ }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.phoebus.applications.queueserver.editcontrol;

import org.phoebus.applications.queueserver.Messages;
import org.phoebus.framework.workbench.ApplicationService;
import org.phoebus.ui.javafx.ImageCache;
import org.phoebus.ui.spi.MenuEntry;
import javafx.scene.image.Image;

public final class QueueEditControlMenuEntry implements MenuEntry {

@Override public String getName() { return Messages.EditControlQueue; }
@Override public Image getIcon() { return ImageCache.getImage(
QueueEditControlApp.class, "/icons/bluesky.png"); }
@Override public String getMenuPath() { return Messages.EditControlQueueMenuPath; }

@Override public Void call() throws Exception {
ApplicationService.createInstance(QueueEditControlApp.NAME);
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.phoebus.applications.queueserver.editcontrol.QueueEditControlApp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.phoebus.applications.queueserver.editcontrol.QueueEditControlMenuEntry
31 changes: 31 additions & 0 deletions app/queue-server/monitor/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.phoebus</groupId>
<artifactId>app-queue-server</artifactId>
<version>5.0.3-SNAPSHOT</version>
</parent>
<artifactId>app-queue-server-monitor</artifactId>
<name>${project.groupId}:${project.artifactId}</name>

<dependencies>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>app-queue-server-network</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>core-framework</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.phoebus</groupId>
<artifactId>core-ui</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.phoebus.applications.queueserver.monitor;

import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.phoebus.applications.queueserver.Preferences;
import org.phoebus.applications.queueserver.client.RunEngineHttpClient;
import org.phoebus.applications.queueserver.util.AppLifecycle;
import org.phoebus.applications.queueserver.util.PythonParameterConverter;
import org.phoebus.applications.queueserver.view.ViewFactory;
import javafx.scene.Parent;

import org.phoebus.framework.spi.AppInstance;
import org.phoebus.framework.spi.AppResourceDescriptor;
import org.phoebus.framework.workbench.ApplicationService;
import org.phoebus.ui.docking.DockItem;
import org.phoebus.ui.docking.DockPane;

@SuppressWarnings("nls")
public final class QueueMonitorApp implements AppResourceDescriptor {

public static final Logger logger = Logger.getLogger(QueueMonitorApp.class.getPackageName());

public static final String NAME = "queue_monitor";
private static final String DISPLAY_NAME = "Queue Monitor";

static {
PythonParameterConverter.initializeInBackground();
}

@Override public String getName() { return NAME; }
@Override public String getDisplayName() { return DISPLAY_NAME; }

@Override public URL getIconURL() {
return getClass().getResource("/icons/bluesky.png");
}

@Override public AppInstance create() {
initializeHttpClient();
AppLifecycle.registerApp();

Parent root = ViewFactory.MONITOR_QUEUE.get();
QueueMonitorInstance inst = new QueueMonitorInstance(this, root);

DockItem tab = new DockItem(inst, root);
tab.addClosedNotification(AppLifecycle::unregisterApp);
DockPane.getActiveDockPane().addTab(tab);

return inst;
}

@Override public AppInstance create(java.net.URI resource) {
return ApplicationService.createInstance(NAME);
}

private static void initializeHttpClient() {
String serverUrl = Preferences.queue_server_url;
if (serverUrl == null || serverUrl.trim().isEmpty() || serverUrl.startsWith("$(")) {
serverUrl = "http://localhost:60610";
logger.log(Level.INFO, "Using default Queue Server URL: " + serverUrl);
}
String apiKey = resolveApiKey();
RunEngineHttpClient.initialize(serverUrl, apiKey);
}

private static String resolveApiKey() {
String apiKey = Preferences.api_key;
if (apiKey != null && !apiKey.trim().isEmpty() && !apiKey.startsWith("$(")) {
return apiKey.trim();
}
String keyFilePath = Preferences.api_key_file;
if (keyFilePath != null && !keyFilePath.trim().isEmpty() && !keyFilePath.startsWith("$(")) {
try {
Path path = Paths.get(keyFilePath.trim());
if (Files.exists(path)) {
return Files.readString(path).trim();
}
} catch (Exception e) {
logger.log(Level.WARNING, "Failed to read API key from file: " + keyFilePath, e);

Check warning on line 83 in app/queue-server/monitor/src/main/java/org/phoebus/applications/queueserver/monitor/QueueMonitorApp.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Lambda should be used to defer string concatenation.

See more on https://sonarcloud.io/project/issues?id=ControlSystemStudio_phoebus&issues=AZz21m36KdimBKFqU_5X&open=AZz21m36KdimBKFqU_5X&pullRequest=3698
}
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package org.phoebus.applications.queueserver;
package org.phoebus.applications.queueserver.monitor;

import javafx.scene.Node;
import org.phoebus.framework.persistence.Memento;
import org.phoebus.framework.spi.AppDescriptor;
import org.phoebus.framework.spi.AppInstance;

final class QueueServerInstance implements AppInstance {
final class QueueMonitorInstance implements AppInstance {

private final AppDescriptor desc;
private final Node view;

QueueServerInstance(AppDescriptor desc, Node view) {
QueueMonitorInstance(AppDescriptor desc, Node view) {
this.desc = desc;
this.view = view;
}
Expand All @@ -20,4 +20,4 @@ final class QueueServerInstance implements AppInstance {

@Override public void restore(Memento m) { /* nothing */ }
@Override public void save (Memento m) { /* nothing */ }
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package org.phoebus.applications.queueserver;
package org.phoebus.applications.queueserver.monitor;

import org.phoebus.applications.queueserver.Messages;
import org.phoebus.framework.workbench.ApplicationService;
import org.phoebus.ui.javafx.ImageCache;
import org.phoebus.ui.spi.MenuEntry;
import javafx.scene.image.Image;

public final class QueueServerMenuEntry implements MenuEntry {
public final class QueueMonitorMenuEntry implements MenuEntry {

@Override public String getName() { return Messages.QueueServer; }
@Override public String getName() { return Messages.QueueMonitor; }
@Override public Image getIcon() { return ImageCache.getImage(
QueueServerApp.class,
"/icons/bluesky.png"); } // same icon as descriptor
@Override public String getMenuPath() { return Messages.QueueServerMenuPath; }
QueueMonitorApp.class, "/icons/bluesky.png"); }
@Override public String getMenuPath() { return Messages.QueueMonitorMenuPath; }

@Override public Void call() throws Exception {
ApplicationService.createInstance(QueueServerApp.NAME);
ApplicationService.createInstance(QueueMonitorApp.NAME);
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.phoebus.applications.queueserver.monitor.QueueMonitorApp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.phoebus.applications.queueserver.monitor.QueueMonitorMenuEntry
Loading
Loading