44import javafx .beans .binding .Bindings ;
55import javafx .beans .binding .BooleanBinding ;
66import javafx .beans .property .SimpleStringProperty ;
7- import javafx .beans .value .ChangeListener ;
87import javafx .beans .value .ObservableValue ;
98import javafx .collections .FXCollections ;
109import javafx .collections .ListChangeListener ;
3130import javafx .util .converter .DefaultStringConverter ;
3231import org .phoebus .framework .jobs .JobManager ;
3332import org .phoebus .logbook .LogClient ;
34- import org .phoebus .logbook .LogPropertyProvider ;
33+ import org .phoebus .logbook .LogPropertiesProvider ;
3534import org .phoebus .logbook .LogService ;
3635import org .phoebus .logbook .LogbookPreferences ;
3736import 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 ();
0 commit comments