Skip to content

Commit bc0a73d

Browse files
committed
Moved web socket client related code out of SaveAndRestoreService
1 parent aa21840 commit bc0a73d

File tree

14 files changed

+213
-146
lines changed

14 files changed

+213
-146
lines changed

app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/DataChangeListener.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreBaseController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.phoebus.applications.saveandrestore.ui;
2121

2222
import javafx.beans.property.SimpleStringProperty;
23+
import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
2324
import org.phoebus.security.store.SecureStore;
2425
import org.phoebus.security.tokens.AuthenticationScope;
2526
import org.phoebus.security.tokens.ScopedAuthenticationToken;
@@ -63,4 +64,11 @@ public void secureStoreChanged(List<ScopedAuthenticationToken> validTokens) {
6364
public SimpleStringProperty getUserIdentity() {
6465
return userIdentity;
6566
}
67+
68+
/**
69+
* Default no-op implementation of a handler for {@link SaveAndRestoreWebSocketMessage}s.
70+
* @param webSocketMessage See {@link SaveAndRestoreWebSocketMessage}
71+
*/
72+
public void handleWebSocketMessage(SaveAndRestoreWebSocketMessage<?> webSocketMessage){
73+
}
6674
}

app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreController.java

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,17 @@ public class SaveAndRestoreController extends SaveAndRestoreBaseController
168168
@FXML
169169
private VBox treeViewPane;
170170

171-
protected SaveAndRestoreService saveAndRestoreService;
171+
private SaveAndRestoreService saveAndRestoreService;
172+
private WebSocketClientService webSocketClientService;
172173

173174
private final ObjectMapper objectMapper = new ObjectMapper();
174-
175175
protected MultipleSelectionModel<TreeItem<Node>> browserSelectionModel;
176-
177176
private static final String TREE_STATE = "tree_state";
178-
179177
private static final String FILTER_NAME = "filter_name";
180-
181178
protected static final Logger LOG = Logger.getLogger(SaveAndRestoreController.class.getName());
182-
183179
protected Comparator<TreeItem<Node>> treeNodeComparator;
184-
185180
protected SimpleBooleanProperty disabledUi = new SimpleBooleanProperty(false);
186-
187181
private final SimpleBooleanProperty filterEnabledProperty = new SimpleBooleanProperty(false);
188-
189182
private static final Logger logger = Logger.getLogger(SaveAndRestoreController.class.getName());
190183

191184
@SuppressWarnings("unused")
@@ -263,7 +256,6 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
263256
treeNodeComparator = Comparator.comparing(TreeItem::getValue);
264257

265258
saveAndRestoreService = SaveAndRestoreService.getInstance();
266-
saveAndRestoreService.openWebSocket();
267259
treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
268260
treeView.getStylesheets().add(getClass().getResource("/save-and-restore-style.css").toExternalForm());
269261

@@ -291,9 +283,6 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
291283
});
292284

293285
treeView.setShowRoot(true);
294-
295-
saveAndRestoreService.addWebSocketMessageHandler(this);
296-
297286
treeView.setCellFactory(p -> new BrowserTreeCell(this));
298287
treeViewPane.disableProperty().bind(disabledUi);
299288
progressIndicator.visibleProperty().bind(disabledUi);
@@ -369,6 +358,12 @@ public Filter fromString(String s) {
369358
loadTreeData();
370359

371360
webSocketTrackerLabel.textProperty().bind(webSocketTrackerText);
361+
362+
webSocketClientService = WebSocketClientService.getInstance();
363+
webSocketClientService.addWebSocketMessageHandler(this);
364+
webSocketClientService.setConnectCallback(() -> Platform.runLater(() -> webSocketTrackerText.setValue("Web Socket Connected")));
365+
webSocketClientService.setDisconnectCallback(() -> Platform.runLater(() -> webSocketTrackerText.setValue("Web Socket Disconnected")));
366+
webSocketClientService.connect();
372367
}
373368

374369
/**
@@ -540,6 +535,7 @@ public SearchAndFilterTab openSearchWindow() {
540535
return searchAndFilterTab;
541536
}
542537
}
538+
543539
/**
544540
* Creates a new folder {@link Node}.
545541
*/
@@ -791,7 +787,7 @@ private void nodeChanged(Node node) {
791787
nodeSubjectToUpdate.setValue(node);
792788
// For updated and expanded folder nodes, refresh with respect to child nodes as
793789
// a move/copy operation may add/remove nodes.
794-
if(nodeSubjectToUpdate.getValue().getNodeType().equals(NodeType.FOLDER) && nodeSubjectToUpdate.isExpanded()){
790+
if (nodeSubjectToUpdate.getValue().getNodeType().equals(NodeType.FOLDER) && nodeSubjectToUpdate.isExpanded()) {
795791
expandTreeNode(nodeSubjectToUpdate);
796792
}
797793
}
@@ -802,7 +798,7 @@ private void nodeChanged(Node node) {
802798
*
803799
* @param nodeId Unique id of the added {@link Node}
804800
*/
805-
private void nodeAdded(String nodeId){
801+
private void nodeAdded(String nodeId) {
806802
Node newNode = saveAndRestoreService.getNode(nodeId);
807803
try {
808804
Node parentNode = saveAndRestoreService.getParentNode(nodeId);
@@ -819,11 +815,12 @@ private void nodeAdded(String nodeId){
819815
/**
820816
* Handles callback in order to update the tree view when a {@link Node} has been deleted.
821817
* The purpose is to update the {@link TreeView} accordingly to reflect the change.
818+
*
822819
* @param nodeId Unique id of the deleted {@link Node}
823820
*/
824-
private void nodeRemoved(String nodeId){
821+
private void nodeRemoved(String nodeId) {
825822
TreeItem<Node> treeItemToRemove = recursiveSearch(nodeId, treeView.getRoot());
826-
if(treeItemToRemove != null){
823+
if (treeItemToRemove != null) {
827824
treeItemToRemove.getParent().getChildren().remove(treeItemToRemove);
828825
}
829826
}
@@ -932,8 +929,9 @@ public void saveLocalState() {
932929

933930
public void handleTabClosed() {
934931
saveLocalState();
935-
saveAndRestoreService.closeWebSocket();
936-
saveAndRestoreService.removeWebSocketMessageHandler(this);
932+
webSocketClientService.closeWebSocket();
933+
webSocketClientService.removeWebSocketMessageHandler(this);
934+
webSocketClientService.close();
937935
}
938936

939937
/**
@@ -1298,10 +1296,10 @@ public boolean mayPaste() {
12981296
if (clipBoardContent == null || browserSelectionModel.getSelectedItems().size() != 1) {
12991297
return false;
13001298
}
1301-
if(selectedItemsProperty.size() != 1 ||
1302-
selectedItemsProperty.get(0).getUniqueId().equals(Node.ROOT_FOLDER_UNIQUE_ID) ||
1303-
(!selectedItemsProperty.get(0).getNodeType().equals(NodeType.FOLDER) && !selectedItemsProperty.get(0).getNodeType().equals(NodeType.CONFIGURATION))){
1304-
return false;
1299+
if (selectedItemsProperty.size() != 1 ||
1300+
selectedItemsProperty.get(0).getUniqueId().equals(Node.ROOT_FOLDER_UNIQUE_ID) ||
1301+
(!selectedItemsProperty.get(0).getNodeType().equals(NodeType.FOLDER) && !selectedItemsProperty.get(0).getNodeType().equals(NodeType.CONFIGURATION))) {
1302+
return false;
13051303
}
13061304
// Check is made if target node is of supported type for the clipboard content.
13071305
List<Node> selectedNodes = (List<Node>) clipBoardContent;
@@ -1491,14 +1489,13 @@ private void addOptionalLoggingMenuItem() {
14911489
}
14921490

14931491
@Override
1494-
public void handleWebSocketMessage(SaveAndRestoreWebSocketMessage<?> saveAndRestoreWebSocketMessage){
1495-
switch (saveAndRestoreWebSocketMessage.messageType()){
1496-
case NODE_ADDED -> nodeAdded((String)saveAndRestoreWebSocketMessage.payload());
1497-
case NODE_REMOVED -> nodeRemoved((String)saveAndRestoreWebSocketMessage.payload());
1498-
case NODE_UPDATED -> nodeChanged((Node)saveAndRestoreWebSocketMessage.payload());
1499-
case FILTER_ADDED_OR_UPDATED -> filterAddedOrUpdated((Filter)saveAndRestoreWebSocketMessage.payload());
1500-
case FILTER_REMOVED -> filterRemoved((String)saveAndRestoreWebSocketMessage.payload());
1492+
public void handleWebSocketMessage(SaveAndRestoreWebSocketMessage saveAndRestoreWebSocketMessage) {
1493+
switch (saveAndRestoreWebSocketMessage.messageType()) {
1494+
case NODE_ADDED -> nodeAdded((String) saveAndRestoreWebSocketMessage.payload());
1495+
case NODE_REMOVED -> nodeRemoved((String) saveAndRestoreWebSocketMessage.payload());
1496+
case NODE_UPDATED -> nodeChanged((Node) saveAndRestoreWebSocketMessage.payload());
1497+
case FILTER_ADDED_OR_UPDATED -> filterAddedOrUpdated((Filter) saveAndRestoreWebSocketMessage.payload());
1498+
case FILTER_REMOVED -> filterRemoved((String) saveAndRestoreWebSocketMessage.payload());
15011499
}
15021500
}
1503-
15041501
}

app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/SaveAndRestoreService.java

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@
1919
package org.phoebus.applications.saveandrestore.ui;
2020

2121
import com.fasterxml.jackson.annotation.JsonInclude;
22-
import com.fasterxml.jackson.core.JsonProcessingException;
2322
import com.fasterxml.jackson.databind.DeserializationFeature;
2423
import com.fasterxml.jackson.databind.ObjectMapper;
25-
import com.fasterxml.jackson.databind.module.SimpleModule;
2624
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
2725
import org.epics.vtype.VType;
28-
import org.phoebus.applications.saveandrestore.client.Preferences;
2926
import org.phoebus.applications.saveandrestore.client.SaveAndRestoreClient;
3027
import org.phoebus.applications.saveandrestore.client.SaveAndRestoreClientImpl;
3128
import org.phoebus.applications.saveandrestore.model.CompositeSnapshot;
@@ -43,20 +40,15 @@
4340
import org.phoebus.applications.saveandrestore.model.UserData;
4441
import org.phoebus.applications.saveandrestore.model.search.Filter;
4542
import org.phoebus.applications.saveandrestore.model.search.SearchResult;
46-
import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
47-
import org.phoebus.applications.saveandrestore.model.websocket.WebMessageDeserializer;
4843
import org.phoebus.core.vtypes.VDisconnectedData;
49-
import org.phoebus.core.websocket.WebSocketClient;
5044
import org.phoebus.pv.PV;
5145
import org.phoebus.pv.PVPool;
5246
import org.phoebus.saveandrestore.util.VNoData;
5347
import org.phoebus.util.time.TimestampFormats;
5448

5549
import javax.ws.rs.core.MultivaluedMap;
56-
import java.net.URI;
5750
import java.time.Instant;
5851
import java.util.ArrayList;
59-
import java.util.Collections;
6052
import java.util.List;
6153
import java.util.concurrent.ExecutorService;
6254
import java.util.concurrent.Future;
@@ -71,33 +63,20 @@ public class SaveAndRestoreService {
7163

7264
private final ExecutorService executor;
7365

74-
private final List<WebSocketMessageHandler> webSocketMessageHandlers = Collections.synchronizedList(new ArrayList<>());
7566
private static final Logger LOG = Logger.getLogger(SaveAndRestoreService.class.getName());
7667

7768
private static SaveAndRestoreService instance;
7869

7970
private final SaveAndRestoreClient saveAndRestoreClient;
8071
private final ObjectMapper objectMapper;
8172

82-
private final WebSocketClient webSocketClient;
83-
8473
private SaveAndRestoreService() {
8574
saveAndRestoreClient = new SaveAndRestoreClientImpl();
86-
String baseUrl = Preferences.jmasarServiceUrl;
87-
String schema = baseUrl.startsWith("https") ? "wss" : "ws";
88-
String webSocketUrl = schema + baseUrl.substring(baseUrl.indexOf("://")) + "/web-socket";
89-
URI webSocketUri = URI.create(webSocketUrl);
90-
webSocketClient = new WebSocketClient(webSocketUri, this::handleWebSocketConnect, this::handleWebSocketDisconnect, this::handleWebSocketMessage);
9175
executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
9276
objectMapper = new ObjectMapper();
9377
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
9478
objectMapper.registerModule(new JavaTimeModule());
9579
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
96-
SimpleModule module = new SimpleModule();
97-
module.addDeserializer(SaveAndRestoreWebSocketMessage.class,
98-
new WebMessageDeserializer(SaveAndRestoreWebSocketMessage.class));
99-
objectMapper.registerModule(module);
100-
10180
}
10281

10382
public static SaveAndRestoreService getInstance() {
@@ -173,6 +152,7 @@ public List<Tag> getAllTags() throws Exception {
173152
Future<List<Tag>> future = executor.submit(saveAndRestoreClient::getAllTags);
174153
return future.get();
175154
}
155+
176156
/**
177157
* Moves the <code>sourceNode</code> to the <code>targetNode</code>. The target {@link Node} may not contain
178158
* any {@link Node} of same name and type as the source {@link Node}.
@@ -447,39 +427,4 @@ private VType readFromArchiver(String pvName, Instant time) {
447427
return VDisconnectedData.INSTANCE;
448428
}
449429
}
450-
451-
private void handleWebSocketDisconnect(){
452-
LOG.log(Level.INFO, "Web socket disonnected");
453-
}
454-
455-
private void handleWebSocketConnect(){
456-
LOG.log(Level.INFO, "Web socket connected");
457-
}
458-
459-
private void handleWebSocketMessage(CharSequence charSequence){
460-
try {
461-
SaveAndRestoreWebSocketMessage saveAndRestoreWebSocketMessage =
462-
objectMapper.readValue(charSequence.toString(), SaveAndRestoreWebSocketMessage.class);
463-
webSocketMessageHandlers.forEach(w -> w.handleWebSocketMessage(saveAndRestoreWebSocketMessage));
464-
465-
} catch (JsonProcessingException e) {
466-
throw new RuntimeException(e);
467-
}
468-
}
469-
470-
public void closeWebSocket(){
471-
webSocketClient.close("Application shutdown");
472-
}
473-
474-
public void openWebSocket(){
475-
webSocketClient.connect();
476-
}
477-
478-
public void addWebSocketMessageHandler(WebSocketMessageHandler webSocketMessageHandler){
479-
webSocketMessageHandlers.add(webSocketMessageHandler);
480-
}
481-
482-
public void removeWebSocketMessageHandler(WebSocketMessageHandler webSocketMessageHandler){
483-
webSocketMessageHandlers.remove(webSocketMessageHandler);
484-
}
485430
}

0 commit comments

Comments
 (0)