Skip to content

Commit 81cfb8b

Browse files
committed
Added (and updated) log property provider interface
1 parent 5e5a9a7 commit 81cfb8b

File tree

3 files changed

+66
-42
lines changed

3 files changed

+66
-42
lines changed

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

Lines changed: 31 additions & 33 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,7 +30,7 @@
3130
import javafx.util.converter.DefaultStringConverter;
3231
import org.phoebus.framework.jobs.JobManager;
3332
import org.phoebus.logbook.LogClient;
34-
import org.phoebus.logbook.LogPropertyProvider;
33+
import org.phoebus.logbook.LogPropertiesProvider;
3534
import org.phoebus.logbook.LogService;
3635
import org.phoebus.logbook.LogbookPreferences;
3736
import org.phoebus.logbook.Property;
@@ -52,7 +51,7 @@ public class LogPropertiesEditorController {
5251

5352
/**
5453
* List of properties user may add to log entry. It is constructed from the properties as
55-
* 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}.
5655
*/
5756
private final ObservableList<Property> availableProperties = FXCollections.observableArrayList();
5857
/**
@@ -115,18 +114,15 @@ public void initialize() {
115114
new PropertyValueTreeTableCell(new DefaultStringConverter()));
116115

117116
// Hide the headers
118-
selectedPropertiesTree.widthProperty().addListener(new ChangeListener<Number>() {
119-
@Override
120-
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
121-
// Get the table header
122-
Pane header = (Pane) selectedPropertiesTree.lookup("TableHeaderRow");
123-
if (header != null && header.isVisible()) {
124-
header.setMaxHeight(0);
125-
header.setMinHeight(0);
126-
header.setPrefHeight(0);
127-
header.setVisible(false);
128-
header.setManaged(false);
129-
}
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);
130126
}
131127
});
132128

@@ -151,9 +147,9 @@ private void constructTree(Collection<Property> properties) {
151147
PropertyTreeNode node = new PropertyTreeNode(property.getName(), " ");
152148
rowCount.set(rowCount.get() + 1);
153149
TreeItem<PropertyTreeNode> treeItem = new TreeItem<>(node);
154-
property.getAttributes().entrySet().stream().forEach(entry -> {
150+
property.getAttributes().forEach((key, value1) -> {
155151
rowCount.set(rowCount.get() + 1);
156-
treeItem.getChildren().add(new TreeItem<>(new PropertyTreeNode(entry.getKey(), entry.getValue())));
152+
treeItem.getChildren().add(new TreeItem<>(new PropertyTreeNode(key, value1)));
157153
});
158154
treeItem.setExpanded(true);
159155
return treeItem;
@@ -197,7 +193,7 @@ private void removeSelectedProperty(String propertyName) {
197193
}
198194
}
199195

200-
private class PropertyTreeNode {
196+
private static class PropertyTreeNode {
201197
private SimpleStringProperty name;
202198
private SimpleStringProperty value;
203199

@@ -238,7 +234,7 @@ public void setValue(String value) {
238234
}
239235

240236
/**
241-
* 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
242238
* are considered first, and then properties available from service. However, adding items to the list of properties
243239
* always consider equality, i.e. properties with same name are added only once. SPI implementations should therefore
244240
* not support properties with same name, and should not implement properties available from service.
@@ -257,24 +253,26 @@ private void setupProperties() {
257253
JobManager.schedule("Fetch Properties from service", monitor ->
258254
{
259255
// First add properties from SPI implementations
260-
List<LogPropertyProvider> factories = new ArrayList<>();
261-
ServiceLoader<LogPropertyProvider> loader = ServiceLoader.load(LogPropertyProvider.class);
256+
List<LogPropertiesProvider> factories = new ArrayList<>();
257+
ServiceLoader<LogPropertiesProvider> loader = ServiceLoader.load(LogPropertiesProvider.class);
262258
loader.stream().forEach(p -> {
263-
if (p.get().getProperty() != null) {
259+
if (p.get().getProperties() != null && !p.get().getProperties().isEmpty()) {
264260
factories.add(p.get());
265261
}
266262
});
267263
// List of property names added if user is replying to a log entry.
268264
List<String> selectedPropertyNames =
269265
selectedProperties.stream().map(Property::getName).collect(Collectors.toList());
270266
factories.stream()
271-
.map(LogPropertyProvider::getProperty)
272-
.forEach(property -> {
273-
// Do not add a property that is already selected
274-
if (!selectedPropertyNames.contains(property.getName())) {
275-
selectedProperties.add(property);
276-
selectedPropertyNames.add(property.getName());
277-
}
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+
});
278276
});
279277

280278
LogClient logClient =
@@ -284,7 +282,7 @@ private void setupProperties() {
284282
Platform.runLater(() ->
285283
{
286284
propertyList.forEach(property -> {
287-
// 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.
288286
if (!selectedPropertyNames.contains(property.getName())) {
289287
list.add(property);
290288
}
@@ -324,8 +322,8 @@ protected void updateItem(String item, boolean empty) {
324322
// Binding to determine if the selected cell is a leaf or not.
325323
// Property name cells are not leaves.
326324
BooleanBinding binding = Bindings.createBooleanBinding(() ->
327-
getTreeTableRow().getTreeItem() != null &&
328-
!getTreeTableRow().getTreeItem().leafProperty().get());
325+
getTableRow().getTreeItem() != null &&
326+
!getTableRow().getTreeItem().leafProperty().get());
329327
// Action must specify the property name subject for removal
330328
menuItem.setOnAction(e -> removeSelectedProperty(item));
331329
contextMenuProperty().bind(Bindings
@@ -356,7 +354,7 @@ private class PropertyValueTreeTableCell extends TextFieldTreeTableCell<Property
356354
@Override
357355
public void commitEdit(String value) {
358356
super.commitEdit(value);
359-
TreeTableRow row = getTreeTableRow();
357+
TreeTableRow row = getTableRow();
360358
PropertyTreeNode parent = (PropertyTreeNode) row.getTreeItem().getParent().getValue();
361359
String propertyName = parent.getName();
362360
String attributeName = ((PropertyTreeNode) row.getTreeItem().getValue()).getName();
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+
}

core/logbook/src/main/java/org/phoebus/logbook/LogPropertyProvider.java

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

0 commit comments

Comments
 (0)