Skip to content

Commit 41552e5

Browse files
authored
Merge pull request #2441 from ControlSystemStudio/CSSTUDIO-1772
Updated log property provider interface
2 parents c04ec8b + 81cfb8b commit 41552e5

File tree

3 files changed

+66
-43
lines changed

3 files changed

+66
-43
lines changed

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogPropertiesEditorController.java

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import javafx.beans.binding.Bindings;
55
import javafx.beans.binding.BooleanBinding;
66
import javafx.beans.property.SimpleStringProperty;
7-
import javafx.beans.value.ChangeListener;
87
import javafx.beans.value.ObservableValue;
98
import javafx.collections.FXCollections;
109
import javafx.collections.ListChangeListener;
@@ -31,6 +30,7 @@
3130
import javafx.util.converter.DefaultStringConverter;
3231
import org.phoebus.framework.jobs.JobManager;
3332
import org.phoebus.logbook.LogClient;
33+
import org.phoebus.logbook.LogPropertiesProvider;
3434
import org.phoebus.logbook.LogService;
3535
import org.phoebus.logbook.LogbookPreferences;
3636
import org.phoebus.logbook.Property;
@@ -51,7 +51,7 @@ public class LogPropertiesEditorController {
5151

5252
/**
5353
* List of properties user may add to log entry. It is constructed from the properties as
54-
* provided by the log service, plus optional properties providers, see {@link LogPropertyProvider}.
54+
* provided by the log service, plus optional properties providers, see {@link LogPropertiesProvider}.
5555
*/
5656
private final ObservableList<Property> availableProperties = FXCollections.observableArrayList();
5757
/**
@@ -114,18 +114,15 @@ public void initialize() {
114114
new PropertyValueTreeTableCell(new DefaultStringConverter()));
115115

116116
// Hide the headers
117-
selectedPropertiesTree.widthProperty().addListener(new ChangeListener<Number>() {
118-
@Override
119-
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
120-
// Get the table header
121-
Pane header = (Pane) selectedPropertiesTree.lookup("TableHeaderRow");
122-
if (header != null && header.isVisible()) {
123-
header.setMaxHeight(0);
124-
header.setMinHeight(0);
125-
header.setPrefHeight(0);
126-
header.setVisible(false);
127-
header.setManaged(false);
128-
}
117+
selectedPropertiesTree.widthProperty().addListener((ov, t, t1) -> {
118+
// Get the table header
119+
Pane header = (Pane) selectedPropertiesTree.lookup("TableHeaderRow");
120+
if (header != null && header.isVisible()) {
121+
header.setMaxHeight(0);
122+
header.setMinHeight(0);
123+
header.setPrefHeight(0);
124+
header.setVisible(false);
125+
header.setManaged(false);
129126
}
130127
});
131128

@@ -150,9 +147,9 @@ private void constructTree(Collection<Property> properties) {
150147
PropertyTreeNode node = new PropertyTreeNode(property.getName(), " ");
151148
rowCount.set(rowCount.get() + 1);
152149
TreeItem<PropertyTreeNode> treeItem = new TreeItem<>(node);
153-
property.getAttributes().entrySet().stream().forEach(entry -> {
150+
property.getAttributes().forEach((key, value1) -> {
154151
rowCount.set(rowCount.get() + 1);
155-
treeItem.getChildren().add(new TreeItem<>(new PropertyTreeNode(entry.getKey(), entry.getValue())));
152+
treeItem.getChildren().add(new TreeItem<>(new PropertyTreeNode(key, value1)));
156153
});
157154
treeItem.setExpanded(true);
158155
return treeItem;
@@ -196,7 +193,7 @@ private void removeSelectedProperty(String propertyName) {
196193
}
197194
}
198195

199-
private class PropertyTreeNode {
196+
private static class PropertyTreeNode {
200197
private SimpleStringProperty name;
201198
private SimpleStringProperty value;
202199

@@ -237,7 +234,7 @@ public void setValue(String value) {
237234
}
238235

239236
/**
240-
* Refreshes the list of available properties. Properties provided by {@link LogPropertyProvider} implementations
237+
* Refreshes the list of available properties. Properties provided by {@link LogPropertiesProvider} implementations
241238
* are considered first, and then properties available from service. However, adding items to the list of properties
242239
* always consider equality, i.e. properties with same name are added only once. SPI implementations should therefore
243240
* not support properties with same name, and should not implement properties available from service.
@@ -256,24 +253,26 @@ private void setupProperties() {
256253
JobManager.schedule("Fetch Properties from service", monitor ->
257254
{
258255
// First add properties from SPI implementations
259-
List<LogPropertyProvider> factories = new ArrayList<>();
260-
ServiceLoader<LogPropertyProvider> loader = ServiceLoader.load(LogPropertyProvider.class);
256+
List<LogPropertiesProvider> factories = new ArrayList<>();
257+
ServiceLoader<LogPropertiesProvider> loader = ServiceLoader.load(LogPropertiesProvider.class);
261258
loader.stream().forEach(p -> {
262-
if (p.get().getProperty() != null) {
259+
if (p.get().getProperties() != null && !p.get().getProperties().isEmpty()) {
263260
factories.add(p.get());
264261
}
265262
});
266263
// List of property names added if user is replying to a log entry.
267264
List<String> selectedPropertyNames =
268265
selectedProperties.stream().map(Property::getName).collect(Collectors.toList());
269266
factories.stream()
270-
.map(LogPropertyProvider::getProperty)
271-
.forEach(property -> {
272-
// Do not add a property that is already selected
273-
if (!selectedPropertyNames.contains(property.getName())) {
274-
selectedProperties.add(property);
275-
selectedPropertyNames.add(property.getName());
276-
}
267+
.map(LogPropertiesProvider::getProperties)
268+
.forEach(propertiesList -> {
269+
// Do not add a property that is already present
270+
propertiesList.forEach(property -> {
271+
if (!selectedPropertyNames.contains(property.getName())) {
272+
selectedProperties.add(property);
273+
selectedPropertyNames.add(property.getName());
274+
}
275+
});
277276
});
278277

279278
LogClient logClient =
@@ -283,7 +282,7 @@ private void setupProperties() {
283282
Platform.runLater(() ->
284283
{
285284
propertyList.forEach(property -> {
286-
// Do not add a property that is already selected or already added from provider
285+
// Do not add already selected property, or added from provider.
287286
if (!selectedPropertyNames.contains(property.getName())) {
288287
list.add(property);
289288
}
@@ -323,8 +322,8 @@ protected void updateItem(String item, boolean empty) {
323322
// Binding to determine if the selected cell is a leaf or not.
324323
// Property name cells are not leaves.
325324
BooleanBinding binding = Bindings.createBooleanBinding(() ->
326-
getTreeTableRow().getTreeItem() != null &&
327-
!getTreeTableRow().getTreeItem().leafProperty().get());
325+
getTableRow().getTreeItem() != null &&
326+
!getTableRow().getTreeItem().leafProperty().get());
328327
// Action must specify the property name subject for removal
329328
menuItem.setOnAction(e -> removeSelectedProperty(item));
330329
contextMenuProperty().bind(Bindings
@@ -355,7 +354,7 @@ private class PropertyValueTreeTableCell extends TextFieldTreeTableCell<Property
355354
@Override
356355
public void commitEdit(String value) {
357356
super.commitEdit(value);
358-
TreeTableRow row = getTreeTableRow();
357+
TreeTableRow row = getTableRow();
359358
PropertyTreeNode parent = (PropertyTreeNode) row.getTreeItem().getParent().getValue();
360359
String propertyName = parent.getName();
361360
String attributeName = ((PropertyTreeNode) row.getTreeItem().getValue()).getName();

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/write/LogPropertyProvider.java

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.phoebus.logbook;
2+
3+
import java.util.Collections;
4+
import java.util.List;
5+
6+
/**
7+
* An interface to subscribe property providers. A custom logbook module can use this
8+
* to - for instance - add a list of {@link Property} objects calculated dynamically when a new
9+
* log entry is created.
10+
*/
11+
public interface LogPropertiesProvider {
12+
13+
/**
14+
* Clients should consider that implementations may take some time to complete, e.g. query a remote
15+
* endpoint for data.
16+
* @param logEntry The {@link LogEntry} object as created by the client. Implementations can use this to apply filtering
17+
* based on the fields of the log entry.
18+
* @return A {@link Property} added to a new log entry. An implementation should return <code>null</code>
19+
* if it applies a filter that rules out the log entry.
20+
*/
21+
@SuppressWarnings("unused")
22+
default List<Property> getProperties(LogEntry logEntry){
23+
return Collections.emptyList();
24+
}
25+
26+
/**
27+
* Clients should consider that implementations may take some time to complete, e.g. query a remote
28+
* endpoint for data.
29+
* @return A {@link Property} added to a new log entry. An implementation should return <code>null</code>
30+
* if it applies a filter that rules out the log entry.
31+
*/
32+
default List<Property> getProperties(){
33+
return Collections.emptyList();
34+
}
35+
}

0 commit comments

Comments
 (0)