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 ;
33+ import org .phoebus .logbook .LogPropertiesProvider ;
3434import org .phoebus .logbook .LogService ;
3535import org .phoebus .logbook .LogbookPreferences ;
3636import 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 ();
0 commit comments