diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml index f598598763..4931f0c7dd 100644 --- a/.github/workflows/_lint.yml +++ b/.github/workflows/_lint.yml @@ -14,4 +14,4 @@ jobs: with: persist-credentials: false - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 - - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd \ No newline at end of file + - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd diff --git a/.gitignore b/.gitignore index 3d835da330..ccc6f6ee2b 100644 --- a/.gitignore +++ b/.gitignore @@ -121,7 +121,7 @@ phoebus-product/settings_template.ini # hs_err* files **/hs_err* -# doc files generated by docs/source/conf.py +# doc files generated by docs/source/conf.py docs/source/applications.rst docs/source/services.rst diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3e189a6d82..3a0a027a85 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,9 +2,10 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - - id: check-yaml - # TODO add end of file fixer and whitespace fixer + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace - repo: https://github.com/zizmorcore/zizmor-pre-commit - rev: v1.26.1 + rev: v1.26.1 hooks: - - id: zizmor \ No newline at end of file + - id: zizmor diff --git a/LICENSE b/LICENSE index b5b1433674..f7ee3d0ec3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ Copyright (c) 2018 Michigan State University Copyright (c) 2018 Brookhaven National Laboratory Copyright (c) 2018 Oak Ridge National Laboratory. -Copyright (c) 2018 European Spallation Source +Copyright (c) 2018 European Spallation Source Eclipse Public License - v 1.0 diff --git a/README.md b/README.md index 34a4349184..c267b692ec 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ mvn clean verify -f dependencies/pom.xml ## Building with maven -Define the JAVA_HOME environment variable to point to your Java installation directory. +Define the JAVA_HOME environment variable to point to your Java installation directory. Mac OS users should use something like: ``` export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.0.11+10/Contents/Home @@ -52,7 +52,7 @@ Set the environment variable `LANG` to `en_US.UTF-8` to execute tests in a specific locale, or build with `mvn -DskipTests ...` to skip tests. -### Running the phoebus application +### Running the phoebus application To run the product jar ``` @@ -253,20 +253,20 @@ Create a sonatype account and update the maven settings.xml file with your sonat ``` -**Prepare the release** -`mvn release:prepare` +**Prepare the release** +`mvn release:prepare` In this step will ensure there are no uncommitted changes, ensure the versions number are correct, tag the scm, etc. A full list of checks is documented [here](https://maven.apache.org/maven-release/maven-release-plugin/usage/prepare-release.html). -**Perform the release** -`mvn -Darguments="-Dskip-executable-jar" -Pdocs,releases release:perform` +**Perform the release** +`mvn -Darguments="-Dskip-executable-jar" -Pdocs,releases release:perform` Checkout the release tag, build, sign and push the build binaries to sonatype. The `docs` profile is needed in order to create required javadocs jars. -**Publish** +**Publish** Open the staging repository in [sonatype](https://s01.oss.sonatype.org/#stagingRepositories) and hit the *publish* button **Note:** -In order to keep the ant and maven builds in sync, before the prepare:release update the `version` in the -dependencies\ant_settings.xml to match the release version number. After the release is completed the `version` should +In order to keep the ant and maven builds in sync, before the prepare:release update the `version` in the +dependencies\ant_settings.xml to match the release version number. After the release is completed the `version` should updated to match the next development snapshotData version. diff --git a/app/3d-viewer/build.xml b/app/3d-viewer/build.xml index 46b2db0a13..126e325155 100644 --- a/app/3d-viewer/build.xml +++ b/app/3d-viewer/build.xml @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/app/3d-viewer/doc/index.rst b/app/3d-viewer/doc/index.rst index c2cb5fb814..b6645c66e5 100644 --- a/app/3d-viewer/doc/index.rst +++ b/app/3d-viewer/doc/index.rst @@ -6,7 +6,7 @@ Overview The 3d Viewer is a tool that allows users to configure 3 dimensional structures using spheres, cylinders, and boxes. -These structures are defined in shape file (`*.shp`) and parsed by the application. +These structures are defined in shape file (`*.shp`) and parsed by the application. The resultant structure is then rendered on screen. This structure can be viewed in the application which allows rotation, zoom, and movement. @@ -23,60 +23,60 @@ structure will be rendered. **Background Color** The background color of the viewer can be controlled using the following command. - + ``background(r, g, b, A)`` - - This command has four parameters. The red, green, and blue values for the color are the first three. Each color value is an integer from 0 through 255. + + This command has four parameters. The red, green, and blue values for the color are the first three. Each color value is an integer from 0 through 255. These are followed by the alpha value which allows you to control the transparency of the color. Alpha is a floating point number in the range [0, 1]. An alpha of 0 is transparent while an alpha of 1 is opaque. - + Multiple background colors may be defined, however only the last defined background color will be used. - + **Spheres** A sphere may be defined using the following command. - + ``sphere(x, y, z, R, r, g, b, A)`` - + This command has eight parameters. The first three parameters are the x, y, and z values which represent the center point of the sphere in the three dimensional space. The x, y, and z parameters are floating point values. These are followed by the radius of the sphere, another floating point value. - The final four parameters are the red, green, blue, and alpha values used to define the color of the sphere. Red, green, and blue are integer values in [0, 255] and + The final four parameters are the red, green, blue, and alpha values used to define the color of the sphere. Red, green, and blue are integer values in [0, 255] and alpha is a floating point value in [0, 1]. **Cylinders** A cylinder may be defined using the following command. - + ``cylinder(x1, y1, z1, x2, y2, z2, R, r, g, b, A)`` - - This command has eleven parameters. The first three parameters are the x, y, and z values which represent one end point of the cylinder. The second three parameters - are the x, y, and z values which represent the other end point of the cylinder. All x, y, and z parameters are floating point values. These are followed the cylinder's - radius. The radius is a floating point value. The final four parameters are the red, green, blue, and alpha values used to define the color of the sphere. Red, green, + + This command has eleven parameters. The first three parameters are the x, y, and z values which represent one end point of the cylinder. The second three parameters + are the x, y, and z values which represent the other end point of the cylinder. All x, y, and z parameters are floating point values. These are followed the cylinder's + radius. The radius is a floating point value. The final four parameters are the red, green, blue, and alpha values used to define the color of the sphere. Red, green, and blue are integer values in [0, 255] and alpha is a floating point value in [0, 1]. **Boxes** A box may be defined using the following command. - + ``box(x1, y1, z1, x2, y2, z2, r, g, b, A)`` - - This command has 10 parameters. The first three parameters are the x, y, and z values which represent one corner of the box.The second three parameters are the x, y, and z - values which represent the opposite corner of the box. All x, y, and z parameters are floating point values. The final four parameters are the red, green, blue, and alpha + + This command has 10 parameters. The first three parameters are the x, y, and z values which represent one corner of the box.The second three parameters are the x, y, and z + values which represent the opposite corner of the box. All x, y, and z parameters are floating point values. The final four parameters are the red, green, blue, and alpha values used to define the color of the sphere. Red, green, and blue are integer values in [0, 255] and alpha is a floating point value in [0, 1]. - + If the first corner of a box was defined at (0, 0, 0) and the second corner at (100, 100, 100) then the box would have one corner at the origin and one corner at (100, 100, 100). Each of the boxes sides would be of length 100, and the boxes center point would be (50, 50, 50). **Cones** A cone may be defined using the following command. - + ``cone(x1, y1, z1, R, x2, y2, z2, r, g, b, A)`` - + This command has eleven parameters. The first three parameters are the x, y, and z values of the base, followed by the radius of the base. - The second three parameters are the x, y, and z values of the tip of the cone. + The second three parameters are the x, y, and z values of the tip of the cone. The final four parameters are the red, green, blue, and alpha values used to define the color. **Tool Tips** A final string added to a shape defines a tool tip for the shape. - + Example Shape File ------------------ @@ -84,7 +84,7 @@ Example Shape File :: # This is a comment. It will be ignored when the file is parsed. - + # The background of the viewer is set to be nearly black. background(32, 32, 32, 1) @@ -103,10 +103,10 @@ Example Shape File # being of magnitude 100. box(0, 0, 0, 100, 100, 100, 0, 0, 255, 1) - # Cone along the X axis, base at x=200, radius 20, tip at x=300 + # Cone along the X axis, base at x=200, radius 20, tip at x=300 cone ( 200, 0, 0, 10, 300, 0, 0, 255, 100, 100, 1, "X") - + **Resulting Structure** .. image:: images/example_struct.png @@ -117,29 +117,29 @@ Transparency JavaFX does not sort 3D objects by depth. What this means is that you have to be thoughtful of the order you add 3D shapes to a scene. For example, if a sphere needed to be displayed inside a translucent box, the sphere would have to be added *before* the box. If the box first were added first, it would still be translucent, but the JavaFX renderer would not draw the sphere because it doesn't sort the scene graph by depth. - + **Examples** Here, the box is added first and the sphere is not drawn. :: - + background(32, 32, 32, 1) box(0, 0, 0, 100, 100, 100, 0, 0, 255, 0.1) sphere(50, 50, 50, 10, 255, 0, 0, 1) - + .. image:: images/bad_transparency.png :width: 50% Here, the box is added second and the sphere is drawn correctly. :: - + background(32, 32, 32, 1) sphere(50, 50, 50, 10, 255, 0, 0, 1) box(0, 0, 0, 100, 100, 100, 0, 0, 255, 0.1) - + .. image:: images/good_transparency.png :width: 50% - + Compatibility ------------- @@ -160,4 +160,4 @@ Can be made to work: In case of problems which usually include error messages ``System can't support ConditionalFeature.SCENE3D``, -start the program with ``-Dprism.verbose=true`` and ``-Djdk.gtk.verbose=true`` \ No newline at end of file +start the program with ``-Dprism.verbose=true`` and ``-Djdk.gtk.verbose=true`` diff --git a/app/3d-viewer/src/main/resources/3d_viewer_examples/box_w_spheres.shp b/app/3d-viewer/src/main/resources/3d_viewer_examples/box_w_spheres.shp index e7eaedb726..13340f35e1 100644 --- a/app/3d-viewer/src/main/resources/3d_viewer_examples/box_w_spheres.shp +++ b/app/3d-viewer/src/main/resources/3d_viewer_examples/box_w_spheres.shp @@ -11,4 +11,3 @@ sphere( 0, 100, 100, 10, 255, 0, 0, 1) sphere(100, 100, 100, 10, 255, 0, 0, 1) box(0, 0, 0, 100, 100, 100, 0, 0, 255, 1) - diff --git a/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor b/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor index efcb548d91..fb4350dffb 100644 --- a/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor +++ b/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor @@ -1 +1 @@ -org.phoebus.applications.viewer3d.Viewer3dApp \ No newline at end of file +org.phoebus.applications.viewer3d.Viewer3dApp diff --git a/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry index 14a16057e7..8d584cc055 100644 --- a/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry +++ b/app/3d-viewer/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry @@ -1,2 +1,2 @@ org.phoebus.applications.viewer3d.Viewer3dMenuEntry -org.phoebus.applications.viewer3d.InstallExamplesMenuEntry \ No newline at end of file +org.phoebus.applications.viewer3d.InstallExamplesMenuEntry diff --git a/app/3d-viewer/src/test/java/org/phoebus/app/viewer3d/Demo3dViewer.java b/app/3d-viewer/src/test/java/org/phoebus/app/viewer3d/Demo3dViewer.java index 992acbf320..e844477f2c 100644 --- a/app/3d-viewer/src/test/java/org/phoebus/app/viewer3d/Demo3dViewer.java +++ b/app/3d-viewer/src/test/java/org/phoebus/app/viewer3d/Demo3dViewer.java @@ -23,12 +23,12 @@ public class Demo3dViewer extends ApplicationWrapper public void start(Stage primaryStage) throws Exception { Viewer3dPane viewerPane = new Viewer3dPane(null, null); - + Scene scene = new Scene(viewerPane, 1000, 1000); primaryStage.setScene(scene); primaryStage.show(); } - + public static void main(String[] args) { launch(Demo3dViewer.class, args); diff --git a/app/alarm/Readme.md b/app/alarm/Readme.md index 1d61dc27bd..15e82c3e46 100644 --- a/app/alarm/Readme.md +++ b/app/alarm/Readme.md @@ -68,7 +68,7 @@ If the following "First steps" generate errors of the type or ERROR ..TimeoutException: Timed out waiting for a node assignment - + then define the host name in `config/server.properties`. For tests, you can use localhost: @@ -115,14 +115,14 @@ but simply meant to learn about Kafka or to test connectivity. # Create new topic kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --replication-factor 1 --partitions 1 --topic test - + # Topic info kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic test kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --describe - - # Produce messages for topic (no key) + + # Produce messages for topic (no key) kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test Message 1 Message 2 @@ -569,4 +569,3 @@ When functional, the file `kafka/logs/log-cleaner.log` shows periodic compaction Start size: 0.1 MB (414 messages) End size: 0.1 MB (380 messages) 8.9% size reduction (8.2% fewer messages) - diff --git a/app/alarm/audio-annunciator/build.xml b/app/alarm/audio-annunciator/build.xml index 019188b2fa..225a0a998b 100644 --- a/app/alarm/audio-annunciator/build.xml +++ b/app/alarm/audio-annunciator/build.xml @@ -10,11 +10,11 @@ - + - + diff --git a/app/alarm/datasource/build.xml b/app/alarm/datasource/build.xml index 0ff30a6d91..c97f3d4d09 100644 --- a/app/alarm/datasource/build.xml +++ b/app/alarm/datasource/build.xml @@ -10,11 +10,11 @@ - + - + diff --git a/app/alarm/datasource/src/main/java/org/phoebus/pv/alarm/AlarmPVInfo.java b/app/alarm/datasource/src/main/java/org/phoebus/pv/alarm/AlarmPVInfo.java index 36410c999c..ca2a935c38 100644 --- a/app/alarm/datasource/src/main/java/org/phoebus/pv/alarm/AlarmPVInfo.java +++ b/app/alarm/datasource/src/main/java/org/phoebus/pv/alarm/AlarmPVInfo.java @@ -106,4 +106,4 @@ public Optional getField() { return field; } -} \ No newline at end of file +} diff --git a/app/alarm/datasource/src/main/resources/META-INF/services/org.phoebus.pv.PVFactory b/app/alarm/datasource/src/main/resources/META-INF/services/org.phoebus.pv.PVFactory index 7ddc6b1ab7..0d3ce031a6 100644 --- a/app/alarm/datasource/src/main/resources/META-INF/services/org.phoebus.pv.PVFactory +++ b/app/alarm/datasource/src/main/resources/META-INF/services/org.phoebus.pv.PVFactory @@ -1 +1 @@ -org.phoebus.pv.alarm.AlarmPVFactory \ No newline at end of file +org.phoebus.pv.alarm.AlarmPVFactory diff --git a/app/alarm/datasource/src/test/java/org/phoebus/pv/alarm/AlarmPVInfoTest.java b/app/alarm/datasource/src/test/java/org/phoebus/pv/alarm/AlarmPVInfoTest.java index af82d23a3f..977a03904a 100644 --- a/app/alarm/datasource/src/test/java/org/phoebus/pv/alarm/AlarmPVInfoTest.java +++ b/app/alarm/datasource/src/test/java/org/phoebus/pv/alarm/AlarmPVInfoTest.java @@ -157,4 +157,4 @@ public void parseFields() alarmPVInfo.getField(), "Failed to parse the field path info for pv: " + onlyRoot); } -} \ No newline at end of file +} diff --git a/app/alarm/examples/alarm_configuration.xsd b/app/alarm/examples/alarm_configuration.xsd index 60a5ba9e3b..3e365ea7df 100644 --- a/app/alarm/examples/alarm_configuration.xsd +++ b/app/alarm/examples/alarm_configuration.xsd @@ -88,4 +88,4 @@ - \ No newline at end of file + diff --git a/app/alarm/examples/delete_alarm_topics.sh b/app/alarm/examples/delete_alarm_topics.sh index f7811d6d4a..165c8ae3b9 100755 --- a/app/alarm/examples/delete_alarm_topics.sh +++ b/app/alarm/examples/delete_alarm_topics.sh @@ -28,4 +28,3 @@ for topic in "$1" "${1}Command" "${1}Talk" do kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic $topic done - diff --git a/app/alarm/examples/kafka.service b/app/alarm/examples/kafka.service index 48449e481e..5f1c84f791 100644 --- a/app/alarm/examples/kafka.service +++ b/app/alarm/examples/kafka.service @@ -27,4 +27,3 @@ ExecStop=/opt/kafka/bin/kafka-server-stop.sh [Install] WantedBy=multi-user.target - diff --git a/app/alarm/examples/monitor_topic.sh b/app/alarm/examples/monitor_topic.sh index 7417752ef5..44c6f804e7 100755 --- a/app/alarm/examples/monitor_topic.sh +++ b/app/alarm/examples/monitor_topic.sh @@ -8,5 +8,4 @@ fi topic=$1 -kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --property print.timestamp=true --property print.key=true --property key.separator=": " --topic $topic --from-beginning - +kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --property print.timestamp=true --property print.key=true --property key.separator=": " --topic $topic --from-beginning diff --git a/app/alarm/examples/send_commands.sh b/app/alarm/examples/send_commands.sh index e8b1497295..350af065b6 100755 --- a/app/alarm/examples/send_commands.sh +++ b/app/alarm/examples/send_commands.sh @@ -24,5 +24,3 @@ echo "restart!" echo "shutdown!" kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --property 'parse.key=true' --property 'key.separator=!' --topic $topic - - diff --git a/app/alarm/examples/stop_all.sh b/app/alarm/examples/stop_all.sh index 3f9c22417f..efe69bb859 100755 --- a/app/alarm/examples/stop_all.sh +++ b/app/alarm/examples/stop_all.sh @@ -1,6 +1,5 @@ #!/bin/sh cd kafka -bin/kafka-server-stop.sh +bin/kafka-server-stop.sh sleep 5 bin/zookeeper-server-stop.sh - diff --git a/app/alarm/examples/talk.sh b/app/alarm/examples/talk.sh index 0709046773..53ba55859b 100755 --- a/app/alarm/examples/talk.sh +++ b/app/alarm/examples/talk.sh @@ -14,5 +14,3 @@ text="$2" kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --property 'parse.key=true' --property key.separator=" : " --topic ${topic}Talk < - + - + diff --git a/app/alarm/logging-ui/build.xml b/app/alarm/logging-ui/build.xml index e2d1a746cb..714ca6e941 100644 --- a/app/alarm/logging-ui/build.xml +++ b/app/alarm/logging-ui/build.xml @@ -11,12 +11,12 @@ - + - + diff --git a/app/alarm/logging-ui/doc/index.rst b/app/alarm/logging-ui/doc/index.rst index d501ffa953..1d1f5ff04f 100644 --- a/app/alarm/logging-ui/doc/index.rst +++ b/app/alarm/logging-ui/doc/index.rst @@ -5,9 +5,8 @@ Overview -------- In order for the alarm system to be effective and functional, proper configuration and periodic tuning is essential. -While the Alarm Server monitors a set of PVs, tracking their alarm state, +While the Alarm Server monitors a set of PVs, tracking their alarm state, the alarm logging service archives all the state, configuration and commands associated with the Alarm Server. The alarm logging table provides a user interface to the alarm logging service allowing users to effectively search, filter, and parse through the archived messages to better configure the Alarm Server. - diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTable.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTable.java index 54e92686ed..fe3d038d2f 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTable.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTable.java @@ -65,7 +65,7 @@ else if(clazz.isAssignableFrom(AdvancedSearchViewController.class)){ public AppDescriptor getAppDescriptor() { return app; } - + public void setPVResource(URI resource) { String query = resource.getQuery(); @@ -77,7 +77,7 @@ public void setPVResource(URI resource) { controller.setSearchString(parsedQuery); controller.setIsNodeTable(false); } - + public void setNodeResource(URI resource) { String query = resource.getQuery(); // TODO URI parsing might be improved. diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java index 6c8800892a..757bf7442b 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java @@ -216,7 +216,7 @@ protected void updateItem(String item, boolean empty) { valueCol.setCellValueFactory( alarmMessage -> { - String value = alarmMessage.getValue().getValue(); + String value = alarmMessage.getValue().getValue(); return new SimpleStringProperty(value); }); tableView.getColumns().add(valueCol); diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItem.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItem.java index 965fb986d7..2af5520ef2 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItem.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItem.java @@ -162,4 +162,4 @@ public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOE return Instant.parse(p.getText()); } } -} \ No newline at end of file +} diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItemAdapterFactory.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItemAdapterFactory.java index 1083802294..7e11d87c56 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItemAdapterFactory.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableItemAdapterFactory.java @@ -10,7 +10,7 @@ /** * A factory which adapts {@link AlarmLogTableItem}s to {@link TimeStampedProcessVariable} and {@link ProcessVariable}s - * + * * @author Kunal Shroff */ public class AlarmLogTableItemAdapterFactory implements AdapterFactory { diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableMenuEntry.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableMenuEntry.java index e1423e4f9f..f7751444b8 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableMenuEntry.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableMenuEntry.java @@ -22,7 +22,7 @@ public String getName() { public String getMenuPath() { return "Alarm"; } - + @Override public Image getIcon() { return AlarmLogTableApp.icon; diff --git a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory index f197cdc05e..a9939ccad0 100644 --- a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory +++ b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory @@ -1 +1 @@ -org.phoebus.applications.alarm.logging.ui.AlarmLogTableItemAdapterFactory \ No newline at end of file +org.phoebus.applications.alarm.logging.ui.AlarmLogTableItemAdapterFactory diff --git a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor index c3ad0ce298..0ad7a26ccc 100644 --- a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor +++ b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor @@ -1 +1 @@ -org.phoebus.applications.alarm.logging.ui.AlarmLogTableApp \ No newline at end of file +org.phoebus.applications.alarm.logging.ui.AlarmLogTableApp diff --git a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry index 59b57ac8a4..8cafa2d317 100644 --- a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry +++ b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry @@ -1,2 +1,2 @@ org.phoebus.applications.alarm.logging.ui.actions.ContextMenuPVAlarmHistory -org.phoebus.applications.alarm.logging.ui.actions.ContextMenuNodeAlarmHistory \ No newline at end of file +org.phoebus.applications.alarm.logging.ui.actions.ContextMenuNodeAlarmHistory diff --git a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry index c0fff00bb8..006d8bf5b1 100644 --- a/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry +++ b/app/alarm/logging-ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry @@ -1 +1 @@ -org.phoebus.applications.alarm.logging.ui.AlarmLogTableMenuEntry \ No newline at end of file +org.phoebus.applications.alarm.logging.ui.AlarmLogTableMenuEntry diff --git a/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages.properties b/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages.properties index 4b39bc9a53..9037af2351 100644 --- a/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages.properties +++ b/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages.properties @@ -44,7 +44,7 @@ EndTime=End Time Mode=Mode # NoSearchResults=No Search Results -Query=Query: +Query=Query: Search=Search Configuration=Configuration(s): # Table Column Visibility @@ -68,4 +68,3 @@ UserVisible=true # Phoebus Host Column HostVisible=true # - diff --git a/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages_fr.properties b/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages_fr.properties index abc45a49fc..86519ca40d 100644 --- a/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages_fr.properties +++ b/app/alarm/logging-ui/src/main/resources/org/phoebus/applications/alarm/logging/ui/messages_fr.properties @@ -12,7 +12,7 @@ Message=Message MessageTime=Heure du message Mode=Mode NoSearchResults=Aucun résultat de recherche -Query=Requête : +Query=Requête : Search=Rechercher Configuration=Configuration(s) : Severity=Gravité @@ -30,4 +30,3 @@ CMessageVisible=true CommandVisible=true UserVisible=true HostVisible=true - diff --git a/app/alarm/model/build.xml b/app/alarm/model/build.xml index 2b1feeb462..a9a7899282 100644 --- a/app/alarm/model/build.xml +++ b/app/alarm/model/build.xml @@ -7,5 +7,5 @@ - + diff --git a/app/alarm/model/src/main/java/org/phoebus/applications/alarm/messages/AlarmMessageUtil.java b/app/alarm/model/src/main/java/org/phoebus/applications/alarm/messages/AlarmMessageUtil.java index 3f1dc0b8e6..f076d5dc00 100644 --- a/app/alarm/model/src/main/java/org/phoebus/applications/alarm/messages/AlarmMessageUtil.java +++ b/app/alarm/model/src/main/java/org/phoebus/applications/alarm/messages/AlarmMessageUtil.java @@ -13,7 +13,7 @@ /** * A utility class with object mapper for the various alarm messages - * + * * @author Kunal Shroff * */ diff --git a/app/alarm/model/src/main/java/org/phoebus/applications/alarm/talk/TalkClientListener.java b/app/alarm/model/src/main/java/org/phoebus/applications/alarm/talk/TalkClientListener.java index 26d2c77b10..3fb92658c1 100644 --- a/app/alarm/model/src/main/java/org/phoebus/applications/alarm/talk/TalkClientListener.java +++ b/app/alarm/model/src/main/java/org/phoebus/applications/alarm/talk/TalkClientListener.java @@ -10,7 +10,7 @@ import org.phoebus.applications.alarm.model.SeverityLevel; /** - * Interface for talk client listener. + * Interface for talk client listener. * @author Evan Smith */ public interface TalkClientListener diff --git a/app/alarm/model/src/main/resources/org/phoebus/applications/alarm/messages_fr.properties b/app/alarm/model/src/main/resources/org/phoebus/applications/alarm/messages_fr.properties index b78344d9be..59050f977e 100644 --- a/app/alarm/model/src/main/resources/org/phoebus/applications/alarm/messages_fr.properties +++ b/app/alarm/model/src/main/resources/org/phoebus/applications/alarm/messages_fr.properties @@ -1,4 +1,3 @@ Disabled=Désactivé Disconnected=Déconnecté NoPV=Pas de PV - diff --git a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmModelSnapshotDemo.java b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmModelSnapshotDemo.java index b682be0603..1df18d675e 100644 --- a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmModelSnapshotDemo.java +++ b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmModelSnapshotDemo.java @@ -26,7 +26,7 @@ public void testAlarmModelWriter() throws Exception // Get alarm configuration final AlarmClient client = new AlarmClient(AlarmDemoSettings.SERVERS, AlarmDemoSettings.ROOT, AlarmDemoSettings.KAFKA_PROPERTIES_FILE); client.start(); - + System.out.println("Wait 10 secs for connection, then for stable configuration, i.e. no changes for 4 seconds..."); final long start = System.currentTimeMillis(); diff --git a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmTreePathUnitTest.java b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmTreePathUnitTest.java index d374b45530..74413c5ca2 100644 --- a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmTreePathUnitTest.java +++ b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/AlarmTreePathUnitTest.java @@ -153,4 +153,4 @@ public void testPathUpdate() path = AlarmTreePath.update("/", "path/to\\/sub"); assertThat(path, equalTo("/path/to\\/sub")); } -} \ No newline at end of file +} diff --git a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/ResettableTimeoutTest.java b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/ResettableTimeoutTest.java index 0488abd727..a038640399 100644 --- a/app/alarm/model/src/test/java/org/phoebus/applications/alarm/ResettableTimeoutTest.java +++ b/app/alarm/model/src/test/java/org/phoebus/applications/alarm/ResettableTimeoutTest.java @@ -61,7 +61,7 @@ public void testReset() assertThat(timer.awaitTimeout(6), equalTo(true)); timer.shutdown(); } - + @Test public void testChangingTimeout() { @@ -70,7 +70,7 @@ public void testChangingTimeout() assertThat(timer.awaitTimeout(8), equalTo(true)); timer.shutdown(); - + timer = new ResettableTimeout(4); System.out.println("Now resetting after just 1 second to a 1 second timeout..."); assertThat(timer.awaitTimeout(1), equalTo(false)); diff --git a/app/alarm/ui/build.xml b/app/alarm/ui/build.xml index db3762ba94..9093f2e27a 100644 --- a/app/alarm/ui/build.xml +++ b/app/alarm/ui/build.xml @@ -10,11 +10,11 @@ - + - + diff --git a/app/alarm/ui/doc/index.rst b/app/alarm/ui/doc/index.rst index 1ee3290cd9..7f35aba09b 100644 --- a/app/alarm/ui/doc/index.rst +++ b/app/alarm/ui/doc/index.rst @@ -22,7 +22,7 @@ A user acknowledges the alarm (2) and starts to address the underlying issue. Eventually, the reason for the alarm is removed, the severity of the PV recovers to `OK`, and the alarm system returns to an overall `OK` state (3). -It is also possible that the underlying issue is short lived, and the +It is also possible that the underlying issue is short lived, and the PV recovers to `OK` on its own. The alarm system latches the alarm, so users can see that there was an alarm (4). When the user acknowledges the alarm, the system returns @@ -110,7 +110,7 @@ The UI includes the following applications: description, alarm time etc. The context menu of selected alarms offers links to guidance messages and - related displays. + related displays. Alarms can be acknowledged, which moves them to a separate table of acknowledged alarms. @@ -134,7 +134,7 @@ They can also be opened from the command line as follows:: Alarm Configuration Options --------------------------- -Alarm configurations are imported into the Alarm Server in an XML +Alarm configurations are imported into the Alarm Server in an XML format, the schema for which may be found `here `_. Behavior - PV entries @@ -285,7 +285,7 @@ system display that shows the actual alarm PV and the surrounding subsystem. and the display tool is recognized by the file extension, i.e. `*.bob` for the display runtime, or `*.html` to open a web page. When passing macros, a complete URL is required. - + Examples:: @@ -335,7 +335,7 @@ The PV needs to hold a string, for example or `ca://NameOfPV.VAL$` for Channel Access where the PV refers to a string record:: - + # Example for "Info PV" # used with automated action set to "infopv:NameOfPV" # @@ -355,8 +355,8 @@ With Channel Access, since the text usually exceeds 40 characters, use ``infopv: Invokes command with list of space-separated arguments. The special argument "*" will be replaced with a list of alarm PVs and their alarm severity. The command is executed in the ``command_directory`` provided in the alarm preferences. - - + + ``sevrpv:SomePV``: Names a PV that will be updated with the severity of the alarm, i.e. a value from 0 to 9 to represent the acknowledged or active @@ -364,12 +364,12 @@ alarm state. The delay is ignored for ``sevrpv:`` actions. Suggested PV template:: - + # Example for "Severity PV" # used with automated action set to "sevrpv:NameOfPV" # # softIoc -s -m N=NameOfPV -d sevrpv.db - + record(mbbi, "$(N)") { field(ZRVL, 0) @@ -401,7 +401,7 @@ Suggested PV template:: field(INP, "0") field(PINI, "YES") } - + Inclusions ^^^^^^^^^^ The Phoebus alarm server supports Xinclude, allowing for the breakup of hierarchies into multiple files. @@ -508,4 +508,3 @@ or leaves, and a leaf itself (training:COUNTER), as their functionalities vary **NOTE:** Any changes performed in the editor will be overwritten when the associated alarm configuration XML file is imported again. - diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/Messages.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/Messages.java index 19a8c1f2c0..9d483e10c9 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/Messages.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/Messages.java @@ -52,7 +52,7 @@ public class Messages NLS.initializeMessages(Messages.class); } - private Messages() + private Messages() { // prevent instantiation } diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/LICENSE.txt b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/LICENSE.txt index 2bb9ad240f..d9a10c0d8e 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/LICENSE.txt +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/LICENSE.txt @@ -173,4 +173,4 @@ incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS \ No newline at end of file + END OF TERMS AND CONDITIONS diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/OptionsTablesController.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/OptionsTablesController.java index f155847d3c..210e318af7 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/OptionsTablesController.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/config/OptionsTablesController.java @@ -52,7 +52,7 @@ public void initialize(){ } /** - * + * * @return The guidance data managed by the user in the {@link javafx.scene.control.TableView} */ public List getGuidance(){ diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/AlarmInfoRow.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/AlarmInfoRow.java index 9b3db017dd..19de54e1ca 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/AlarmInfoRow.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/AlarmInfoRow.java @@ -125,4 +125,4 @@ public String toString() return buf.toString(); } -} \ No newline at end of file +} diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/LinkedColumnResize.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/LinkedColumnResize.java index bad42a82b0..f878c01010 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/LinkedColumnResize.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/LinkedColumnResize.java @@ -57,4 +57,4 @@ private void updateOther() updating = false; } } -} \ No newline at end of file +} diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/AlarmTreeView.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/AlarmTreeView.java index f3d65c9801..59c59cb315 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/AlarmTreeView.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/AlarmTreeView.java @@ -532,7 +532,7 @@ private void performUpdates() } // Remember selection - final ObservableList>> updatedSelectedItems = + final ObservableList>> updatedSelectedItems = FXCollections.observableArrayList(tree_view.getSelectionModel().getSelectedItems()); // How to update alarm tree cells when data changed? diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/MoveTreeItemAction.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/MoveTreeItemAction.java index 93ac6d881b..90d63da0e2 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/MoveTreeItemAction.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/MoveTreeItemAction.java @@ -56,7 +56,7 @@ public MoveTreeItemAction(TreeView> node, path = result.get(); if (AlarmTreeHelper.validateNewPath(path, node.getRoot().getValue())) break; - + // Show error dialog and retry ExceptionDetailsErrorDialog.openError("Invalid Path", "Invalid path. Please try again.", diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/ValidatingTextFieldTableCell.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/ValidatingTextFieldTableCell.java index 7dd3641429..eda4782db8 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/ValidatingTextFieldTableCell.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/tree/ValidatingTextFieldTableCell.java @@ -35,7 +35,7 @@ public void startEdit() { }); } } - + // utility method to simplify usage in column public static Callback, TableCell> forTableColumn() { return forTableColumn(new javafx.util.converter.DefaultStringConverter()); diff --git a/app/alarm/ui/src/main/python/Annunciator.py b/app/alarm/ui/src/main/python/Annunciator.py index 8c751c14d6..0bdd0d26da 100644 --- a/app/alarm/ui/src/main/python/Annunciator.py +++ b/app/alarm/ui/src/main/python/Annunciator.py @@ -27,7 +27,7 @@ print("Annunciator started with server value: {}".format(server)) print("Annunciator started with config value: {}".format(config)) -# Kafka spreads messages across groups so group.id should be unique so that every +# Kafka spreads messages across groups so group.id should be unique so that every # alarm listener gets all of the messages. c = Consumer({ 'bootstrap.servers': '{}'.format(server), @@ -60,17 +60,17 @@ def run(self): while (run): queueLock.acquire() size = annunciationQueue.qsize() - + if size > threshold: self.handleNAnnunciations() - + else: while not annunciationQueue.empty(): annunciation = annunciationQueue.get() self.handleAnnunciation(annunciation) - + queueLock.release() - + annunciateCondition.acquire() annunciateCondition.wait() @@ -86,25 +86,25 @@ def handleNAnnunciations(self): flurry+=1 ex = "echo \"There are {} new messages.\" | festival --tts".format(flurry) subprocess.call(ex, shell=True) - + # Annunciates message def handleAnnunciation(self, annunciation): toSay = annunciation[2] ex = "echo \"{}\" | festival --tts".format(toSay) subprocess.call(ex, shell=True) -# Add a message to the queue. +# Add a message to the queue. def enqueueMessage(message): threading._start_new_thread(annunciationProducer, (message,)) # Add the message to the queue in another thread. Notify all waiting consumer threads. def annunciationProducer(message): annunciation = parseMessage(message) - + queueLock.acquire() annunciationQueue.put(annunciation) queueLock.release() - + annunciateCondition.acquire() annunciateCondition.notify_all() annunciateCondition.release() @@ -112,7 +112,7 @@ def annunciationProducer(message): # Parse the message and create the annunciation tuple (priority, standout, toSay) def parseMessage(message): parsed_json = json.loads(message.value().decode('utf-8')) - + severity = parsed_json['severity'] priority = getMessagePriority(severity) standout = parsed_json['standout'] @@ -122,7 +122,7 @@ def parseMessage(message): severities = ["UNDEFINED", "INVALID", "MAJOR", "MINOR", "UNDEFINED_ACK", "INVALID_ACK", "MAJOR_ACK" , "MINOR_ACK", "OK"] # Determine the priority of the message based on the alarm severity. -def getMessagePriority(severity): +def getMessagePriority(severity): try: priority = severities.index(severity) except ValueError: @@ -136,15 +136,15 @@ def getMessagePriority(severity): print("Beginning to poll for messages.") while True: msg = c.poll() - + if msg is None: continue - + if msg.error(): if msg.error().code() == KafkaError._PARTITION_EOF: continue else: print(msg.error()) - + enqueueMessage(msg) - \ No newline at end of file + diff --git a/app/alarm/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/alarm/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor index 8de2599347..b27950567e 100644 --- a/app/alarm/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor +++ b/app/alarm/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor @@ -1,4 +1,4 @@ org.phoebus.applications.alarm.ui.table.AlarmTableApplication org.phoebus.applications.alarm.ui.tree.AlarmTreeApplication org.phoebus.applications.alarm.ui.area.AlarmAreaApplication -org.phoebus.applications.alarm.ui.annunciator.AnnunciatorTableApplication \ No newline at end of file +org.phoebus.applications.alarm.ui.annunciator.AnnunciatorTableApplication diff --git a/app/alarm/ui/src/main/resources/org/phoebus/applications/alarm/ui/messages_fr.properties b/app/alarm/ui/src/main/resources/org/phoebus/applications/alarm/ui/messages_fr.properties index 88903d7b2e..7dc7a1fcb1 100644 --- a/app/alarm/ui/src/main/resources/org/phoebus/applications/alarm/ui/messages_fr.properties +++ b/app/alarm/ui/src/main/resources/org/phoebus/applications/alarm/ui/messages_fr.properties @@ -10,4 +10,4 @@ partlyDisabled=Partiellement désactivé removeComponentFailed=Échec de la suppression du composant renameItemFailed=Échec du renommage de l'élément timer=Minuteur -unacknowledgeFailed=Échec de la désacquittement de l'alarme ou des alarmes \ No newline at end of file +unacknowledgeFailed=Échec de la désacquittement de l'alarme ou des alarmes diff --git a/app/alarm/ui/src/test/java/org/phoebus/applications/alarm/AnnunciatorTableDemo.java b/app/alarm/ui/src/test/java/org/phoebus/applications/alarm/AnnunciatorTableDemo.java index 9c31a09993..745ccc2a6c 100644 --- a/app/alarm/ui/src/test/java/org/phoebus/applications/alarm/AnnunciatorTableDemo.java +++ b/app/alarm/ui/src/test/java/org/phoebus/applications/alarm/AnnunciatorTableDemo.java @@ -33,7 +33,7 @@ public void start(final Stage stage) throws Exception stage.setTitle("Alarm Annunciator Table Demo"); stage.show(); client.start(); - + stage.setOnCloseRequest(event -> table.shutdown()); } diff --git a/app/alarm/ui/src/test/python/annunciatorDemo.py b/app/alarm/ui/src/test/python/annunciatorDemo.py index 3829b15ddd..d492905390 100644 --- a/app/alarm/ui/src/test/python/annunciatorDemo.py +++ b/app/alarm/ui/src/test/python/annunciatorDemo.py @@ -31,7 +31,7 @@ def delivery_report(err, msg): sleep(3) -# Demo the ability of the annunciator to receive a message ignoring severity. +# Demo the ability of the annunciator to receive a message ignoring severity. p.poll(0) p.produce(topic, coolaid.encode('utf-8'), key.encode('utf-8'), callback=delivery_report) p.flush() diff --git a/app/alarm/ui/src/test/python/festivalTest.py b/app/alarm/ui/src/test/python/festivalTest.py index b86f8290ce..1d631ef2e9 100644 --- a/app/alarm/ui/src/test/python/festivalTest.py +++ b/app/alarm/ui/src/test/python/festivalTest.py @@ -1,3 +1,3 @@ import subprocess str = "echo \"There are {} new messages.\" | festival --tts".format(5) -subprocess.call(str, shell=True) \ No newline at end of file +subprocess.call(str, shell=True) diff --git a/app/channel/channelfinder/build.xml b/app/channel/channelfinder/build.xml index 7667edb657..d89159aa72 100644 --- a/app/channel/channelfinder/build.xml +++ b/app/channel/channelfinder/build.xml @@ -9,11 +9,11 @@ - + - + diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Channel.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Channel.java index 658619897a..b9e0ba8900 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Channel.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Channel.java @@ -16,9 +16,9 @@ * A Channel object represents channel finder channel.
* Each channel has a unique name and an owner and may have zero or more * properties/tags associated with it. - * + * * @author shroffk - * + * */ public class Channel { @@ -30,9 +30,9 @@ public class Channel { /** * Builder class to aid in a construction of a channel. - * + * * @author shroffk - * + * */ public static class Builder { // required @@ -44,7 +44,7 @@ public static class Builder { /** * Create a channel builder initialized to a copy of the channel - * + * * @param channel * - the channel to be copied * @return channel {@link Builder} with all the attributes copied from @@ -66,7 +66,7 @@ public static Builder channel(Channel channel) { /** * Create a channel builder for a channel with the given name - * + * * @param name * - name of the channel you are creating * @return channel {@link Builder} with the channel name set to name @@ -79,7 +79,7 @@ public static Builder channel(String name) { /** * Set owner for the channel to be created - * + * * @param owner * - string owner id * @return channel {@link Builder} with owner set to owner @@ -91,7 +91,7 @@ public Builder owner(String owner) { /** * Add tag to the channel to be created - * + * * @param tag * - tag to be added * @return channel {@link Builder} with tag @@ -103,7 +103,7 @@ public Builder with(Tag.Builder tag) { /** * Add the Collection of tags to the channel to be created - * + * * @param tags * - list of tags to be added * @return channel {@link Builder} with tags @@ -117,7 +117,7 @@ public Builder withTags(Collection tags) { /** * Add property to the channel to be created - * + * * @param property * - property to be added * @return channel {@link Builder} with property @@ -129,7 +129,7 @@ public Builder with(Property.Builder property) { /** * Add the Collection of properties to the channel to be created - * + * * @param properties * - list of properties to be added * @return channel {@link Builder} with properties @@ -143,7 +143,7 @@ public Builder withProperties(Collection properties) { /** * build a {@link XmlChannel} object using this builder. - * + * * @return a {@link XmlChannel} */ public XmlChannel toXml() { @@ -159,7 +159,7 @@ public XmlChannel toXml() { /** * build a {@link Channel} object using this builder. - * + * * @return a {@link Channel} */ public Channel build() { @@ -200,7 +200,7 @@ private Channel(Builder builder) { /** * Returns the Name of the channel. - * + * * @return channel name. */ public String getName() { @@ -209,7 +209,7 @@ public String getName() { /** * Returns the owner of this channel. - * + * * @return owner name. */ public String getOwner() { @@ -218,7 +218,7 @@ public String getOwner() { /** * Returns a list of {@link Tag}s associated with this channel. - * + * * @return a list of {@link Tag} or null is no properties are present. */ public Collection getTags() { @@ -228,7 +228,7 @@ public Collection getTags() { /** * Returns the tag with name = tagName is present on this channel else * returns null - * + * * @param tagName - tag name * @return {@link Tag} with name=tagName else null is tag with same name not * present @@ -244,10 +244,10 @@ public Tag getTag(String tagName) { public Collection getTagNames(){ return tags.keySet(); } - + /** * Returns a list of all the {@link Property}s associated with this channel. - * + * * @return A list of {@link Property} or null if no properties present. */ public Collection getProperties() { @@ -257,7 +257,7 @@ public Collection getProperties() { /** * Returns the {@link Property} with the name = propertyName if present on * this channel else null if no property with given name found. - * + * * @param propertyName * - name of the property * @return A {@link Property} or null if property with name=propertyName not @@ -274,7 +274,7 @@ public Property getProperty(String propertyName) { public Collection getPropertyNames(){ return properties.keySet(); } - + @Override public int hashCode() { final int prime = 31; diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelFinderService.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelFinderService.java index 56bcfc7e19..aedd152cf7 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelFinderService.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelFinderService.java @@ -14,7 +14,7 @@ /** * A lookup service to request clients to various directory services which * implement the {@link ChannelFinderClient} and are registered via java SPI - * + * * @author Kunal Shroff * */ @@ -25,7 +25,7 @@ public class ChannelFinderService { private Map channelFinderClients; private static final String DEFAULT = "default"; - + private ChannelFinderService() { channelFinderClients = new HashMap(); } diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQuery.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQuery.java index f0ada74e7c..d094fd0464 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQuery.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQuery.java @@ -14,7 +14,7 @@ /** * An observable query to channel finder that maintains the cached result. - * + * * @author carcassi */ public class ChannelQuery { @@ -23,11 +23,11 @@ public class ChannelQuery { private final String query; private static Executor defaultQueryExecutor = Executors.newSingleThreadExecutor(); private final Executor queryExecutor; - - + + /** * A new query with the given search string. - * + * * @param query the query; cannot be null * @return a new builder */ @@ -35,21 +35,21 @@ public static Builder query(String query) { return new Builder(query); } - + /** * The executor on which the queries are executed. - * + * * @return the current executor */ public static Executor getDefaultQueryExecutor() { return defaultQueryExecutor; } - + /** * Change the executor on which the queries are executed. *

* TODO: it's not clear who has the responsibility of closing the old executor - * + * * @param defaultQueryExecutor the new executor */ public static void setDefaultQueryExecutor(Executor defaultQueryExecutor) { @@ -57,24 +57,24 @@ public static void setDefaultQueryExecutor(Executor defaultQueryExecutor) { throw new NullPointerException("Executor can't be null"); ChannelQuery.defaultQueryExecutor = defaultQueryExecutor; } - + /** * Result of the query. Groups both result and error so that it's an immutable * and atomic combination. - * + * * @author carcassi */ public static class Result { - public final Exception exception; + public final Exception exception; public final Collection channels; - + public Result(Exception exception, Collection channels) { this.exception = exception; this.channels = channels; } - + } - + private volatile Result result; // Guarded by this: will keep track whether a query is already running private boolean running = false; @@ -96,7 +96,7 @@ private Builder(String query) { /** * Changes which client should be used to execute the query. - * + * * @param client a cliemt * @return this */ @@ -106,10 +106,10 @@ public Builder using(ChannelFinderClient client) { this.client = client; return this; } - + /** * Pre-fills the cached result with the given channels and exception. - * + * * @param channels the result of the query * @param exception the exception for the result; can be null * @return this @@ -121,7 +121,7 @@ public Builder result(Collection channels, Exception exception) { /** * Changes which executor should execute the query. - * + * * @param executor an executor * @return this */ @@ -135,7 +135,7 @@ public Builder on(Executor executor) { /** * Creates the new query. The query is not executed until * is needed. - * + * * @return a new query */ public ChannelQuery build() { @@ -155,7 +155,7 @@ private ChannelQuery(String query, ChannelFinderClient client, Executor queryExe * Adds a new listener that is called every time the query is executed. * Note: if you want the listener to be called at least once, * use {@link #execute(ChannelQueryListener)}. - * + * * @param listener a new listener */ public void addChannelQueryListener(ChannelQueryListener listener) { @@ -164,7 +164,7 @@ public void addChannelQueryListener(ChannelQueryListener listener) { /** * Removes a listener. - * + * * @param listener the listener to be removed */ public void removeChannelQueryListener(ChannelQueryListener listener) { @@ -176,10 +176,10 @@ private void fireGetQueryResult(Result result) { listener.queryExecuted(result); } } - + /** * The text of the query. - * + * * @return the query text */ public String getQuery() { @@ -188,35 +188,35 @@ public String getQuery() { /** * The result of the query, if present. - * + * * @return result or null if the query was never executed */ public Result getResult() { return this.result; } - + /** * Executes the query and calls the listener with the result. * If the query was already executed, the listener is called * immediately with the result. - * + * * @param listener - channel query listener */ public void execute(ChannelQueryListener listener) { addChannelQueryListener(listener); - + // Make a local copy to avoid synchronization Result localResult = result; - + // If the query was executed, just call the listener if (localResult != null) { listener.queryExecuted(localResult); } else { execute(); } - + } - + /** * Triggers a new execution of the query, and calls * all the listeners as a result. @@ -232,7 +232,7 @@ private void execute() { return; running = true; } - + queryExecutor.execute(new Runnable() { @Override @@ -253,21 +253,21 @@ public void run() { } }); } - + @Override public int hashCode() { return getQuery().hashCode(); } - + @Override public boolean equals(Object obj) { if (obj instanceof ChannelQuery) { return query.equals(((ChannelQuery) obj).getQuery()); } - + return false; } - + @Override public String toString() { return getQuery(); diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQueryListener.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQueryListener.java index 3170eb0e68..240e534ce7 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQueryListener.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelQueryListener.java @@ -7,7 +7,7 @@ public interface ChannelQueryListener { - + public void queryExecuted(ChannelQuery.Result result); } diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelUtil.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelUtil.java index d1b8f8bdd1..6601dc02ad 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelUtil.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/ChannelUtil.java @@ -15,7 +15,7 @@ /** * @author shroffk - * + * */ public class ChannelUtil { @@ -28,7 +28,7 @@ private ChannelUtil() { /** * Return a list of tag names associated with this channel - * + * * @param channel * - channel to be processed * @return Collection of names of tags @@ -43,7 +43,7 @@ public static Collection getTagNames(Channel channel) { /** * Return a union of tag names associated with channels - * + * * @param channels * - list of channels * @return a set of all unique tag names associated with atleast one or more @@ -59,7 +59,7 @@ public static Collection getAllTagNames(Collection channels) { /** * Return a list of property names associated with this channel - * + * * @param channel * - channel to be processed * @return Collection of names of properties @@ -75,7 +75,7 @@ public static Collection getPropertyNames(Channel channel) { /** * Return a union of property names associated with channels - * + * * @param channels * - list of channels * @return a set of all unique property names associated with atleast one or @@ -100,7 +100,7 @@ public static Collection getPropValues(Collection channels, Str /** * Returns all the channel Names in the given Collection of channels - * + * * @param channels * - list of channels * @return a set of all the unique names associated with the each channel in @@ -118,7 +118,7 @@ public static Collection getChannelNames(Collection channels) { * Given a Collection of channels returns a new collection of channels * containing only those channels which have all the properties in the * propNames - * + * * @param channels * - the input list of channels * @param propNames @@ -140,7 +140,7 @@ public static Collection filterbyProperties(Collection channel * Given a Collection of channels returns a new collection of channels * containing only those channels which have all the tags in the * tagNames - * + * * @param channels * - the input list of channels * @param tagNames @@ -162,7 +162,7 @@ public static Collection filterbyTags(Collection channels, Col * Given a Collection of channels returns a new collection of channels * containing only those channels which have all the tags in the * tagNames - * + * * @param channels * - the input list of channels * @param propNames @@ -187,7 +187,7 @@ public static Collection filterbyElements(Collection channels, /** * Returns a list of {@link Channel} built from the list of * {@link Channel.Builder}s - * + * * @param channelBuilders * - list of Channel.Builder to be built. * @return Collection of {@link Channel} built from the channelBuilders @@ -203,7 +203,7 @@ public static Collection toChannels(Collection channel /** * Returns a list of {@link Channel} built from the list of * {@link Channel.Builder}s - * + * * @param channelBuilders * - list of Channel.Builder to be built. * @return Collection of {@link Channel} built from the channelBuilders @@ -215,4 +215,4 @@ public static List toCollectionXmlChannels(Collectionname and value - * + * * @param name - property name * @param value - property value * @return {@link Property.Builder} for a property with name and value @@ -50,10 +50,10 @@ public static Builder property(String name, String value) { return propertyBuilder; } - + /** * Returns a {@link Property.Builder} to for a property which is a copy of property. - * + * * @param property - the property to be copied * @return {@link Property.Builder} with attributes initialized to the same as property */ @@ -67,7 +67,7 @@ public static Builder property(Property property) { /** * Set the owner for the property to be built. - * + * * @param owner - owner id * @return property {@link Builder} with owner set to owner */ @@ -78,7 +78,7 @@ public Builder owner(String owner) { /** * Set the value for the property to be built. - * + * * @param value - property value * @return property {@link Builder} with value set to value */ @@ -89,7 +89,7 @@ public Builder value(String value) { /** * Build a {@link XmlProperty} object using this builder. - * + * * @return {@link XmlProperty} xmlProperty object */ public XmlProperty toXml() { @@ -122,7 +122,7 @@ private Property(Builder builder) { /** * returns the property name. - * + * * @return - the property name */ public String getName() { @@ -156,7 +156,7 @@ public int hashCode() { /* * (non-Javadoc) - * + * * @see java.lang.Object#equals(java.lang.Object) */ @Override diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Tag.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Tag.java index 682b7a9445..b9ccf797b5 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Tag.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/Tag.java @@ -8,7 +8,7 @@ /** * A Tag object represents a channel finder tag which consists of the * unique name and an owner. - * + * * @author shroffk * */ @@ -18,9 +18,9 @@ public class Tag { /** * Builder class to aid in a construction of a {@link Tag}. - * + * * @author shroffk - * + * */ public static class Builder { // Required @@ -31,7 +31,7 @@ public static class Builder { /** * Returns a {@link Builder} to build a {@link Tag} which is a copy of * the given tag. - * + * * @param tag * - the tag to be copied * @return tag {@link Builder} with attributes initialized to the same @@ -47,7 +47,7 @@ public static Builder tag(Tag tag) { /** * Returns a tag {@link Builder} to build a {@link Tag} with the name * name - * + * * @param name * - tag name * @return tag {@link Builder} with name name @@ -61,7 +61,7 @@ public static Builder tag(String name) { /** * Returns a tag {@link Builder} to build a {@link Tag} with the name * name and owner owner - * + * * @param name * - the tag name * @param owner @@ -78,7 +78,7 @@ public static Builder tag(String name, String owner) { /** * Set the owner for the tag to be built. - * + * * @param owner - owner id * @return tag {@link Builder} with owner set to owner */ diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlChannel.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlChannel.java index 13ddac69b4..15535ce4aa 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlChannel.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlChannel.java @@ -15,13 +15,13 @@ * @author Kunal Shroff {@literal }, Ralph Lange {@literal } */ -@JsonRootName("channel") +@JsonRootName("channel") public class XmlChannel { private String name; private String owner; private List properties = new ArrayList(); private List tags = new ArrayList(); - + /** Creates a new instance of XmlChannel */ public XmlChannel() { } @@ -47,7 +47,7 @@ public XmlChannel(String name, String owner) { } /** - * + * * @param name - channel name * @param owner - channel owner * @param properties - list of channel properties @@ -109,7 +109,7 @@ public List getProperties() { public void setProperties(List properties) { this.properties = properties; } - + /** * Adds an XmlProperty to the channel. * @@ -137,7 +137,7 @@ public void setTags(List tags) { public void addXmlTag(XmlTag tag) { this.tags.add(tag); } - + /** * Creates a compact string representation for the log. * diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlProperty.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlProperty.java index c0fdd3938d..eff6ee69fd 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlProperty.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlProperty.java @@ -123,7 +123,7 @@ public List getChannels() { /** * set the channels associated with this property - * + * * @param channels - channels to be set to the property */ @JsonProperty("channels") diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlTag.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlTag.java index e318a4b396..9f3ca863ba 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlTag.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/XmlTag.java @@ -122,4 +122,4 @@ public static String toLog(XmlTag data) { return data.getName() + "(" + data.getOwner() + ")" + (data.channels); } } -} \ No newline at end of file +} diff --git a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/package-info.java b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/package-info.java index 32080a2c81..778928df05 100644 --- a/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/package-info.java +++ b/app/channel/channelfinder/src/main/java/org/phoebus/channelfinder/package-info.java @@ -6,14 +6,14 @@ /** * {@literal *

- * + * *

Contents

- * + * *

Creating a ChannelFinderClient

*
    *
  1. Creating a simple client
  2. *
- * + * *

Query Examples

*
    *
  1. Query for channels based on name
  2. @@ -25,69 +25,69 @@ *

    Set/Update/Delete Examples

    *
      *
    - * + * *

    Creating a simple client

    - * + * * The ChannelFinderClient contains a builder to guide users through the process of creating the client. - * + * *
      * // Import from here
      * import gov.bnl.channelfinder.api.ChannelFinderClient.CFCBuilder;
    - * 
    + *
      * // Create a client of the default service URL
    - * 
    + *
      * client = CFCBuilder.serviceURL().create();
    - * 
    - * // Create a client to the specified service with HTTP authentication enabled 
    + *
    + * // Create a client to the specified service with HTTP authentication enabled
      * and with username myUsername and password myPasword
    - * 
    + *
      * authenticatedClient = CFCBuilder.serviceURL("http://my.server.location/ChannelFinder")
      * .withHTTPAuthentication(true).username("myUsername").password("myPassword").create();
      * 
    - * + * *

    Query for channels based on name

    *
    - * 
    + *
      * // search for all channels in the channelfinder with name starting with "SR:C01".
    - *  
    + *
      * Collection foundChannels = client.findByName("SR:C01*");
      * 
    - * + * *

    Query for channels based on tags

    *
    - * 
    + *
      * // search for all channels with the tag "shroffk-favorite-channel".
    - * 
    + *
      * Collection foundChannels = client.findByTag("shroffk-favorite-channel");
      * 
    - * + * *

    Query for channels based on property

    *
    - * 
    + *
      * // search for all channel which have the property "device" with value = "bpm".
    - * 
    + *
      * Collection foundChannels = client.findByProperty("device", "bpm");
    - * 
    + *
      * // search for all channels which have the property "device with value "bpm" or "magnet"
    - * 
    + *
      * Collection foundChannels = client.findByProperty("device", "bpm", "magnet");
      * 
    - * + * *

    Query channels based on multiple criteria

    *
    - * 
    + *
      * // search for channels with name starting with "SR:C01" AND with tag "shroffk-favorite-channel"
      * // AND had property "device" with value "bpm" OR "magnet"
    - *  
    + *
      * Map map = new Hashtable();
      * map.put("~name", "SR:C01*");
      * map.put("~tag", "shroffk-favorite-channel");
      * map.put("device", "bpm, magnet");
      * Collection foundChannels = client.find(map);
    - * 
    + *
      * // search for channels with name starting with "SR:C01" AND with tag "shroffk-favorite-channel"
      * // AND had property "device" with value "bpm" OR "magnet"
    - * 
    + *
      * MultivaluedMapImpl multiValuedMap = new MultivaluedMapImpl();
      * multiValuedMap.put("~name", "SR:C01*");
      * multiValuedMap.put("~tag", "shroffk-favorite-channel");
    @@ -99,4 +99,3 @@
      */
     
     package org.phoebus.channelfinder;
    -
    diff --git a/app/channel/channelfinder/src/main/resources/channelfinder_preferences.properties b/app/channel/channelfinder/src/main/resources/channelfinder_preferences.properties
    index 8a7865624a..7996840ee2 100644
    --- a/app/channel/channelfinder/src/main/resources/channelfinder_preferences.properties
    +++ b/app/channel/channelfinder/src/main/resources/channelfinder_preferences.properties
    @@ -6,4 +6,4 @@ serviceURL=http://localhost:8080/ChannelFinder
     username=admin
     password=adminPass
     
    -rawFiltering=false
    \ No newline at end of file
    +rawFiltering=false
    diff --git a/app/channel/utility/build.xml b/app/channel/utility/build.xml
    index 62e66b49e2..a31c674927 100644
    --- a/app/channel/utility/build.xml
    +++ b/app/channel/utility/build.xml
    @@ -6,15 +6,15 @@
         
           
           
    -      	      	
    +      	
             
           
         
    -  	
    +
         
           
           
         
       
    -	
    +
     
    diff --git a/app/channel/utility/src/main/java/org/phoebus/channelfinder/autocomplete/CFProposalProvider.java b/app/channel/utility/src/main/java/org/phoebus/channelfinder/autocomplete/CFProposalProvider.java
    index 25f83da501..726985fd20 100644
    --- a/app/channel/utility/src/main/java/org/phoebus/channelfinder/autocomplete/CFProposalProvider.java
    +++ b/app/channel/utility/src/main/java/org/phoebus/channelfinder/autocomplete/CFProposalProvider.java
    @@ -18,7 +18,7 @@
     
     /**
      * A basic implementation for supporting autocomplete via channelfinder
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelAdapterFactory.java b/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelAdapterFactory.java
    index 8c75aa583c..1058915df9 100644
    --- a/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelAdapterFactory.java
    +++ b/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelAdapterFactory.java
    @@ -10,7 +10,7 @@
     
     /**
      * A factory which adapts {@link Channel}s to {@link ProcessVariable}s
    - * 
    + *
      * @author Kunal Shroff
      */
     public class ChannelAdapterFactory implements AdapterFactory {
    diff --git a/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelSearchJob.java b/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelSearchJob.java
    index cecaaf8cd6..11677731bd 100644
    --- a/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelSearchJob.java
    +++ b/app/channel/utility/src/main/java/org/phoebus/channelfinder/utility/ChannelSearchJob.java
    @@ -13,7 +13,7 @@
     /**
      * Background job for searching channels from the channelfinder directory
      * service
    - * 
    + *
      * @author Kunal Shroff, Kay Kasemir
      */
     public class ChannelSearchJob extends JobRunnableWithCancel {
    diff --git a/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory b/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    index 923aaa91b0..9b8b32d011 100644
    --- a/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    +++ b/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    @@ -1 +1 @@
    -org.phoebus.channelfinder.utility.ChannelAdapterFactory
    \ No newline at end of file
    +org.phoebus.channelfinder.utility.ChannelAdapterFactory
    diff --git a/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.spi.PVProposalProvider b/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.spi.PVProposalProvider
    index c746a37b62..21b6f2ff0f 100644
    --- a/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.spi.PVProposalProvider
    +++ b/app/channel/utility/src/main/resources/META-INF/services/org.phoebus.framework.spi.PVProposalProvider
    @@ -1 +1 @@
    -org.phoebus.channelfinder.autocomplete.CFProposalProvider
    \ No newline at end of file
    +org.phoebus.channelfinder.autocomplete.CFProposalProvider
    diff --git a/app/channel/views/build.xml b/app/channel/views/build.xml
    index 30294a904f..66ea2daa79 100644
    --- a/app/channel/views/build.xml
    +++ b/app/channel/views/build.xml
    @@ -6,16 +6,16 @@
         
           
           
    -      	      	
    -      	      	
    +      	
    +      	
             
           
         
    -  	
    +
         
           
           
         
       
    -	
    +
     
    diff --git a/app/channel/views/doc/index.rst b/app/channel/views/doc/index.rst
    index 3b2b3d7b5b..efa6def706 100644
    --- a/app/channel/views/doc/index.rst
    +++ b/app/channel/views/doc/index.rst
    @@ -23,9 +23,9 @@ Channel Table
     
     Displays the results of a channelfinder query as a table
     
    -The query can be based on the channel name or based on a group of tag and properties associated with the channel 
    +The query can be based on the channel name or based on a group of tag and properties associated with the channel
     
    -Wildcard character like "*", "?" can be used in the queries  
    +Wildcard character like "*", "?" can be used in the queries
     
     
     
    @@ -38,5 +38,3 @@ It groups the channels returned by a query based on the value of the properties
     
     Based on the order of the selected properties, all channels with a same property value are grouped under the same node.
     In the image above we see the channels ordered by the value of the properties ``hostName`` and then ``iocName``
    -
    -
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTableApp.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTableApp.java
    index fbb10943f0..aa1f4fb93e 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTableApp.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTableApp.java
    @@ -58,7 +58,7 @@ public AppInstance create(URI resource) {
             channelTable.setResource(resource);
             return channelTable;
         }
    -    
    +
         /**
          * Get the default {@link ChannelFinderClient} initialized during the creation of this application descriptor
          * @return {@link ChannelFinderClient} default client
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTreeApp.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTreeApp.java
    index fac447db80..ee19c1ea70 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTreeApp.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ChannelTreeApp.java
    @@ -27,7 +27,7 @@ public class ChannelTreeApp implements AppResourceDescriptor {
         public void start() {
             client = ChannelFinderService.getInstance().getClient();
         }
    -    
    +
         @Override
         public String getName() {
             return NAME;
    @@ -59,7 +59,7 @@ public AppInstance create(URI resource) {
             channelTree.setResource(resource);
             return channelTree;
         }
    -    
    +
         /**
          * Get the default {@link ChannelFinderClient} initialized during the creation of this application descriptor
          * @return {@link ChannelFinderClient} default client
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyController.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyController.java
    index ea7bfe6736..489ed3384f 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyController.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyController.java
    @@ -60,7 +60,7 @@ protected void updateItem(Property property, boolean bln) {
             });
             availableProperties.setItems(available);
             availableProperties.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
    -        
    +
             selectedPropertyText.textProperty().bindBidirectional(selectedProperty);
             selectedPropertyValueText.textProperty().bindBidirectional(selectedPropertyValue);
             selectedPropertyOwnerText.textProperty().bindBidirectional(selectedPropertyOwner);
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyDialog.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyDialog.java
    index 38bc59bf0b..9e861457e8 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyDialog.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddPropertyDialog.java
    @@ -15,7 +15,7 @@
     import static org.phoebus.channel.views.ui.ChannelFinderController.logger;
     /**
      * A dialog for adding a property to a list of channels
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddTagDialog.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddTagDialog.java
    index 14541d1855..f73e9bcf4a 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddTagDialog.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/AddTagDialog.java
    @@ -17,7 +17,7 @@
     import static org.phoebus.channel.views.ui.ChannelFinderController.logger;
     /**
      * A dialog for adding a tag to a list of channels
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelFinderController.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelFinderController.java
    index 67d056b6c0..55a39c032f 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelFinderController.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelFinderController.java
    @@ -16,7 +16,7 @@
      * controller takes care of performing the query off the UI thread using
      * {@link Job}s and then invokes the setChannels method on the UI thread after
      * the query has been completed.
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    @@ -46,7 +46,7 @@ public void search(String searchString) {
         }
     
         /**
    -     * Set a new list of channels. This method is called after the successful execution of a channelfinder query. 
    +     * Set a new list of channels. This method is called after the successful execution of a channelfinder query.
          * @param channels - the new list of channels
          */
         public abstract void setChannels(Collection channels);
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyModel.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyModel.java
    index fb839cbb0e..01698a647f 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyModel.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyModel.java
    @@ -27,7 +27,7 @@ class ChannelTreeByPropertyModel {
     
         List allChannels;
         List properties;
    -    
    +
         // PVs represented by this three
         List nodePVs;
         Map nodePVValues;
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyNode.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyNode.java
    index 0b4a98f9b3..1b039fcf17 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyNode.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeByPropertyNode.java
    @@ -155,7 +155,7 @@ private String formatVType(VType value )
             Alarm alarm = Alarm.alarmOf(value);
             StringBuilder sb = new StringBuilder();
             sb.append(FormatOptionHandler.format(value, FormatOption.DEFAULT, -1, true));
    -        if (!alarm.getSeverity().equals(AlarmSeverity.NONE)) 
    +        if (!alarm.getSeverity().equals(AlarmSeverity.NONE))
             {
                 sb.append(alarm.getSeverity().toString());
             }
    @@ -185,7 +185,7 @@ public ChannelTreeByPropertyNode getParentNode() {
     
         /**
          * True if the node represents a sub-query and not a single channel.
    -     * 
    +     *
          * @return
          */
         public boolean isSubQuery() {
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeController.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeController.java
    index 00f3a243ee..abcff3b3c8 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeController.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/ChannelTreeController.java
    @@ -38,7 +38,7 @@
     
     /**
      * Controller for the Tree view of Channels based on a set of selected properties
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    @@ -123,7 +123,7 @@ public void setChannels(Collection channels) {
         }
     
         /**
    -     * Dispose the existing model, recreate a new one and 
    +     * Dispose the existing model, recreate a new one and
          */
         @FXML
         private void reconstructTree() {
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemovePropertyDialog.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemovePropertyDialog.java
    index df92e9f9cf..1f0d0712cf 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemovePropertyDialog.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemovePropertyDialog.java
    @@ -15,7 +15,7 @@
     import static org.phoebus.channel.views.ui.ChannelFinderController.logger;
     /**
      * A dialog for removing a property to a list of channels
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemoveTagDialog.java b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemoveTagDialog.java
    index ff120ab7e8..3ca21fa245 100644
    --- a/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemoveTagDialog.java
    +++ b/app/channel/views/src/main/java/org/phoebus/channel/views/ui/RemoveTagDialog.java
    @@ -15,7 +15,7 @@
     import static org.phoebus.channel.views.ui.ChannelFinderController.logger;
     /**
      * A dialog for removing a tag to a list of channels
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    index 7c955a2b80..643693c800 100644
    --- a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    +++ b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    @@ -1,2 +1,2 @@
     org.phoebus.channel.views.ChannelTableApp
    -org.phoebus.channel.views.ChannelTreeApp
    \ No newline at end of file
    +org.phoebus.channel.views.ChannelTreeApp
    diff --git a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    index bea7d5bd7f..55cf4c4b3b 100644
    --- a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    +++ b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    @@ -1 +1 @@
    -org.phoebus.channel.views.ChannelInfo
    \ No newline at end of file
    +org.phoebus.channel.views.ChannelInfo
    diff --git a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    index 12c7e5b720..24004c05cb 100644
    --- a/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    +++ b/app/channel/views/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    @@ -1,2 +1,2 @@
     org.phoebus.channel.views.ChannelTableMenuEntry
    -org.phoebus.channel.views.ChannelTreeMenuEntry
    \ No newline at end of file
    +org.phoebus.channel.views.ChannelTreeMenuEntry
    diff --git a/app/channel/views/src/main/resources/org/phoebus/channel/views/messages.properties b/app/channel/views/src/main/resources/org/phoebus/channel/views/messages.properties
    index 881b662c90..f220b44476 100644
    --- a/app/channel/views/src/main/resources/org/phoebus/channel/views/messages.properties
    +++ b/app/channel/views/src/main/resources/org/phoebus/channel/views/messages.properties
    @@ -1,2 +1,2 @@
     ChannelTableNameColumn=name
    -ChannelTableOwnerColumn=owner
    \ No newline at end of file
    +ChannelTableOwnerColumn=owner
    diff --git a/app/channel/views/src/test/resources/testChannels.json b/app/channel/views/src/test/resources/testChannels.json
    index 6e18d81a61..c68acf3f73 100644
    --- a/app/channel/views/src/test/resources/testChannels.json
    +++ b/app/channel/views/src/test/resources/testChannels.json
    @@ -6397,4 +6397,4 @@
           }
         ]
       }
    -]
    \ No newline at end of file
    +]
    diff --git a/app/console/src/main/java/org/phoebus/applications/console/ConsoleApp.java b/app/console/src/main/java/org/phoebus/applications/console/ConsoleApp.java
    index ba56deb93b..ece36ba02f 100644
    --- a/app/console/src/main/java/org/phoebus/applications/console/ConsoleApp.java
    +++ b/app/console/src/main/java/org/phoebus/applications/console/ConsoleApp.java
    @@ -44,4 +44,4 @@ public AppInstance create()
         {
             return new ConsoleInstance(this);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/console/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/console/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    index 661579e6f4..f7ad731e48 100644
    --- a/app/console/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    +++ b/app/console/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    @@ -1 +1 @@
    -org.phoebus.applications.console.ConsoleApp
    \ No newline at end of file
    +org.phoebus.applications.console.ConsoleApp
    diff --git a/app/console/src/main/resources/console_preferences.properties b/app/console/src/main/resources/console_preferences.properties
    index 84b891df60..95369f12e2 100644
    --- a/app/console/src/main/resources/console_preferences.properties
    +++ b/app/console/src/main/resources/console_preferences.properties
    @@ -21,7 +21,7 @@ font_size=14
     # Prompt.
     #
     # May include trailing space.
    -prompt=>>>\ 
    +prompt=>>>\
     
     # Prompt (input field) info.
     prompt_info=Enter console command
    diff --git a/app/console/src/test/resources/demo.py b/app/console/src/test/resources/demo.py
    index d1c78a3c7b..edc11d6473 100644
    --- a/app/console/src/test/resources/demo.py
    +++ b/app/console/src/test/resources/demo.py
    @@ -4,7 +4,7 @@
     class DemoThread(threading.Thread):
         def __init__(self):
             threading.Thread.__init__(self)
    -    
    +
         def run(self):
             i = 1
             while True:
    @@ -14,10 +14,10 @@ def run(self):
                 time.sleep(1)
                 if i>5:
                     break
    -                
    +
     demo = DemoThread()
     demo.start()
     
     print("Running thread...")
     
    -code.interact(local=locals())
    \ No newline at end of file
    +code.interact(local=locals())
    diff --git a/app/credentials-management/doc/index.rst b/app/credentials-management/doc/index.rst
    index 4236ea59bc..8d4bec58ed 100644
    --- a/app/credentials-management/doc/index.rst
    +++ b/app/credentials-management/doc/index.rst
    @@ -29,4 +29,4 @@ If login to a service fails (service off-line or invalid credentials), this is i
     
     .. image:: images/CredentialsManagement_one_failed.png
     
    -If on the other hand login succeeds to a single or all services, the dialog is closed automatically.
    \ No newline at end of file
    +If on the other hand login succeeds to a single or all services, the dialog is closed automatically.
    diff --git a/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    index e23460cdf3..5f389022b2 100644
    --- a/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    +++ b/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    @@ -1 +1 @@
    -org.phoebus.applications.credentialsmanagement.CredentialsManagementApp
    \ No newline at end of file
    +org.phoebus.applications.credentialsmanagement.CredentialsManagementApp
    diff --git a/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry b/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    index 3b0211cf6b..e4bbf88e95 100644
    --- a/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    +++ b/app/credentials-management/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    @@ -1 +1 @@
    -org.phoebus.applications.credentialsmanagement.CredentialsManagementToolbarEntry
    \ No newline at end of file
    +org.phoebus.applications.credentialsmanagement.CredentialsManagementToolbarEntry
    diff --git a/app/credentials-management/src/main/resources/css/credentials-management-style.css b/app/credentials-management/src/main/resources/css/credentials-management-style.css
    index 78412d657e..eb9549f3d1 100644
    --- a/app/credentials-management/src/main/resources/css/credentials-management-style.css
    +++ b/app/credentials-management/src/main/resources/css/credentials-management-style.css
    @@ -23,5 +23,3 @@
     .error{
         -fx-text-fill: red;
     }
    -
    -
    diff --git a/app/credentials-management/src/main/resources/org/phoebus/applications/credentialsmanagement/messages.properties b/app/credentials-management/src/main/resources/org/phoebus/applications/credentialsmanagement/messages.properties
    index 7d7b595e55..fad9c2d63a 100644
    --- a/app/credentials-management/src/main/resources/org/phoebus/applications/credentialsmanagement/messages.properties
    +++ b/app/credentials-management/src/main/resources/org/phoebus/applications/credentialsmanagement/messages.properties
    @@ -34,4 +34,4 @@ ServiceConnectionFailure=Unable to connect to service
     Title=Credentials Management
     UnkownError=Unknown error
     Username=Username
    -UserNotAuthenticated=User not authenticated
    \ No newline at end of file
    +UserNotAuthenticated=User not authenticated
    diff --git a/app/databrowser-timescale/README.md b/app/databrowser-timescale/README.md
    index 65fd56e83e..daed28d8b0 100644
    --- a/app/databrowser-timescale/README.md
    +++ b/app/databrowser-timescale/README.md
    @@ -25,7 +25,7 @@ Instead of storing all samples into one RDB table like this:
     
     
     TimescaleDB allows storing the data in "chunks", for example creating
    -one chunk per month: 
    +one chunk per month:
     
     
     Chunks may additionally split the data by channel IDs:
    diff --git a/app/databrowser-timescale/build.xml b/app/databrowser-timescale/build.xml
    index a7871b647d..e08ca2d160 100644
    --- a/app/databrowser-timescale/build.xml
    +++ b/app/databrowser-timescale/build.xml
    @@ -11,11 +11,11 @@
             
           
         
    -  	
    +
         
           
           
         
       
    -	
    +
     
    diff --git a/app/databrowser-timescale/doc/1_InstallTimescaleDB.md b/app/databrowser-timescale/doc/1_InstallTimescaleDB.md
    index 0c2f9ae71a..dbee7baed7 100644
    --- a/app/databrowser-timescale/doc/1_InstallTimescaleDB.md
    +++ b/app/databrowser-timescale/doc/1_InstallTimescaleDB.md
    @@ -16,7 +16,7 @@ Remove previous installation
         sudo yum remove postgresql12
         sudo yum remove postgresql12-libs
         sudo yum remove timescaledb-tools
    -    
    +
     Register RPM repo
     
     ```
    @@ -41,7 +41,7 @@ sudo yum update -y
     Install
     
         sudo yum install -y timescaledb-2-postgresql-14
    -    
    +
     As a result, `/usr/pgsql-14` has binaries, `/var/lib/pgsql/14` has config and data.
     Initialize the empty data dirrectory:
     
    @@ -92,13 +92,13 @@ Allow Remote Access
         listen_addresses = '*'
     
     
    -    vi /var/lib/pgsql/14/data/pg_hba.conf 
    +    vi /var/lib/pgsql/14/data/pg_hba.conf
     
         # Add these lines to end
         # 'md5' means request password. 'trust' would allow connection without pw
         host    all             all              0.0.0.0/0              md5
         host    all             all              ::/0                   md5
    -    
    +
         # Alternatively, only allow access for specific users
         host    all             report,tsarch    0.0.0.0/0              md5
         host    all             report,tsarch    ::/0                   md5
    diff --git a/app/databrowser-timescale/doc/4_DataRetrieval.md b/app/databrowser-timescale/doc/4_DataRetrieval.md
    index ec37080a93..ea81d5d66d 100644
    --- a/app/databrowser-timescale/doc/4_DataRetrieval.md
    +++ b/app/databrowser-timescale/doc/4_DataRetrieval.md
    @@ -7,7 +7,7 @@ that calls a server-side stored function.
     
     The stored function is installed with the archive table schema,
     see [2 Configure Database](2_ConfigureDatabase.md).
    -  
    +
     The retrieval routine is selected via a "ts:..." URL in the data browser settings,
     basically using a `jdbc:postgresql://..` URL prefixed with `ts:`.
     
    @@ -15,8 +15,8 @@ basically using a `jdbc:postgresql://..` URL prefixed with `ts:`.
         org.csstudio.trends.databrowser3/urls=ts:jdbc:postgresql://your_host:5432/tsarch|Timescale
         # Use TimescaleDB to read data
         org.csstudio.trends.databrowser3/archives=ts:jdbc:postgresql://your_host:5432/tsarch|Timescale
    -    
    +
         # Account with read-only TimescaleDB access
         org.csstudio.archive.ts/user=report
         org.csstudio.archive.ts/password=$report
    -    
    +
    diff --git a/app/databrowser-timescale/doc/5_TimescaleDB_Details.md b/app/databrowser-timescale/doc/5_TimescaleDB_Details.md
    index 755bf02469..23625faa73 100644
    --- a/app/databrowser-timescale/doc/5_TimescaleDB_Details.md
    +++ b/app/databrowser-timescale/doc/5_TimescaleDB_Details.md
    @@ -41,7 +41,7 @@ Version Info
     
     Postgres and the TimescaleDB extension versions,
     which were 14.2 and 2.6.0 for the initial archive implementation:
    - 
    +
         SELECT version() AS PSQL,
                extversion AS Timescale
         FROM pg_extension WHERE extname = 'timescaledb';
    @@ -75,13 +75,13 @@ The basic options are
     The best configuration is likely site-specific.
     At this time we cannot offer much guidance beyond pointing to
     https://docs.timescale.com/timescaledb/latest/how-to-guides/hypertables/best-practices:
    - 
    +
      * "Time interval should be chosen such that recent chunk fits into memory."
      * "TimescaleDB does  _not_  benefit from a very large number of space partitions."
      * "In most cases, it is advised for users not to use space partitions."
      * "We recommend tying the number of space partitions to the number of disks and/or data nodes."
      * "With a RAID setup, no spatial partitioning is required on a single node."
    - 
    +
     
     Configure and Change Partitioning
     ---------------------------------
    @@ -117,27 +117,27 @@ you can update partitions by creating a new schema, copying data over, then rena
         SELECT * FROM create_hypertable('update.sample', 'smpl_time', 'channel_id', 1);
         SELECT set_chunk_time_interval('update.sample', INTERVAL '1 month');
         SELECT * from timescaledb_information.dimensions;
    -   
    +
         -- Import old data into new table, do this for example month by month:
    -    \timing on    
    +    \timing on
         INSERT INTO update.sample
           SELECT smpl_time, nanosecs, channel_id, severity_id, status_id, num_val, float_val, str_val
           FROM public.sample WHERE smpl_time >= '2019-01-01' AND smpl_time < '2019-02-01';
         -- With original example data, 1 month required about 15 minutes and 15 GB.
    - 
    +
     To swap the old/new table format, move them between schemata like this:
     
         -- Move old table out of 'public'
         CREATE SCHEMA old;
         ALTER TABLE public.sample SET SCHEMA old;
    - 
    +
         -- Move updated table into 'public' and allow report account to read from it
         ALTER TABLE update.sample SET SCHEMA public;
         DROP SCHEMA update;
         GRANT SELECT ON sample TO report;
    -    
    +
         -- Import more data, now that the 'public' table is the updated one
    -    \timing on    
    +    \timing on
         INSERT INTO sample
           SELECT smpl_time, nanosecs, channel_id, severity_id, status_id, num_val, float_val, str_val
           FROM old.sample WHERE smpl_time >= '2019-07-01' AND smpl_time < '2019-08-01';
    @@ -147,14 +147,14 @@ To swap the old/new table format, move them between schemata like this:
         -- When no longer needed, the old data can be removed
         DROP TABLE old.sample;
         DROP SCHEMA old;
    -    
    -    
    +
    +
     Overall Statistics, Chunk Information
     -------------------------------------
     
     Channel count:
     
    -    SELECT count(*) from channel; 
    +    SELECT count(*) from channel;
     
     How many samples are there?
     
    @@ -166,12 +166,12 @@ How many samples are there?
         ANALYZE sample;
         -- and this is then instantaneous
         SELECT * FROM approximate_row_count('sample');
    - 
    +
     Overall `sample` size:
     
         # https://en.wikipedia.org/wiki/Gigabyte definition
         SELECT hypertable_size('sample') / 1e9 AS GigaByte;
    -    
    +
         # Close to result of
         #   du -hc /var/lib/pgsql/14/data/base
         SELECT hypertable_size('sample') / (1024.0^3) AS GigaByte;
    @@ -192,21 +192,21 @@ List all chunks:
     
         # Note 'Child tables:'
         \d+ sample
    -    
    +
         # Just list the chunks:
         SELECT show_chunks('sample');
     
     Details for each chunk:
     
         SELECT * FROM timescaledb_information.chunks ORDER BY range_end;
    -    
    +
         SELECT hypertable_name, chunk_schema, chunk_name, range_start, range_end, is_compressed
         FROM timescaledb_information.chunks ORDER BY range_end;
     
     Display chunk details for one year:
    -    
    +
         SELECT * FROM timescaledb_information.chunks WHERE range_start >= '2021-01-01' AND range_end <= '2022-01-01' ORDER BY range_end;
    -    
    +
     Example result: In a setup with 2 chunks by `channel_id`,
     you might find that 2 chunks hold data for the same time range.
     Displaying the detail for those 2 chunks will show that they have the same `smpl_time` constraint but adjacent `channel_id` ranges:
    @@ -225,14 +225,14 @@ Displaying the detail for those 2 chunks will show that they have the same `smpl
     Chunk size:
     
         SELECT * FROM chunks_detailed_size('sample');
    -    
    +
         SELECT min(total_bytes)/1e6 AS Min_MB, max(total_bytes)/1e6 AS Max_MB, avg(total_bytes)/1e6 AS Avg_MB FROM chunks_detailed_size('sample');
    -    
    +
         SELECT c.chunk_schema || '.' || c.chunk_name AS Chunk, s.total_bytes/(1000^3) AS Gigabytes, c.range_start, c.range_end
         FROM timescaledb_information.chunks c
         JOIN chunks_detailed_size('sample') s ON s.chunk_schema = c.chunk_schema AND s.chunk_name = c.chunk_name
         ORDER BY c.range_end;
    -    
    +
     
     Size of chunks for one year
     
    @@ -257,7 +257,7 @@ and re-orders data by `channel_id` to streamline access to samples for one chann
     
     Manually compress older chunks
     ------------------------------
    -    
    +
     Enable compression:
     
         ALTER TABLE sample SET (
    @@ -270,20 +270,20 @@ Determine which chunks to compress:
         SELECT hypertable_name, chunk_schema, chunk_name, range_start, range_end, is_compressed
         FROM timescaledb_information.chunks ORDER BY range_end;
     
    -    SELECT show_chunks('sample');    
    +    SELECT show_chunks('sample');
         SELECT show_chunks('sample', older_than => DATE '2021-02-01');
    -    
    +
         -- Compressing takes a few minutes per chunk
    -    \timing on    
    +    \timing on
         SELECT compress_chunk('_timescaledb_internal._hyper_2_20_chunk', if_not_compressed=>TRUE);
         SELECT compress_chunk('_timescaledb_internal._hyper_2_21_chunk', if_not_compressed=>TRUE);
    -    
    +
         -- Identify chunks within a time range ...
         SELECT show_chunks('sample', newer_than => DATE '2020-12-01', older_than => DATE '2021-02-02');
         -- .. and compress them
    -    SELECT compress_chunk(i, if_not_compressed=>TRUE) 
    +    SELECT compress_chunk(i, if_not_compressed=>TRUE)
         FROM show_chunks('sample', newer_than => DATE '2020-12-01', older_than => DATE '2021-02-02') i;
    -    
    +
     Compression info:
     
         SELECT * FROM hypertable_compression_stats('sample');
    @@ -294,12 +294,12 @@ Compression info:
                after_compression_total_bytes * 100.0 / before_compression_total_bytes AS percent
           FROM chunk_compression_stats('sample')
           ORDER BY chunk_name;
    -      
    +
         SELECT min(percent), max(percent), avg(percent)
         FROM ( SELECT after_compression_total_bytes * 100 / before_compression_total_bytes AS percent
                FROM chunk_compression_stats('sample') ) AS data;
    -      
    -      
    +
    +
     Manually decompress chunks
     --------------------------
     
    @@ -316,9 +316,9 @@ Or manually decompress one or many chunks:
     
     Automatically compress older chunks
     -----------------------------------
    -    
    +
         SELECT add_compression_policy('sample', INTERVAL '7 days');
    -    
    +
         SELECT remove_compression_policy('sample');
     
         SELECT * FROM timescaledb_information.compression_settings;
    @@ -423,7 +423,7 @@ would basically look like this:
         psql -d tsarch -c "\COPY (SELECT * FROM channel) TO channel.csv DELIMITER ',' CSV"
         psql -d tsarch -c "\COPY (SELECT * FROM sample WHERE channel_id=2 AND smpl_time >= '2021-01-01' AND smpl_time < '2021-02-01') TO ch2_2021_01.csv DELIMITER ',' CSV"
         psql ...channel_id=2 .. TO ch2_2021_01.csv ...
    -    
    +
     
     Long-Term Data Maintenance
     --------------------------
    diff --git a/app/databrowser-timescale/postgresqsl/examples.sql b/app/databrowser-timescale/postgresqsl/examples.sql
    index 2ee6c66ec2..979f860e1e 100644
    --- a/app/databrowser-timescale/postgresqsl/examples.sql
    +++ b/app/databrowser-timescale/postgresqsl/examples.sql
    @@ -15,7 +15,7 @@ SELECT s.smpl_time, s.nanosecs, channel.name, severity.name, status.name, s.num_
     
     -- Optimized readout example
     SELECT smpl_time AS bucket, NULL AS min, NULL AS max, NULL AS avg, str_val, 1 AS N
    -  FROM sample                                                                                      
    +  FROM sample
       WHERE channel_id = 4
         AND smpl_time BETWEEN '2019-05-30' AND '2019-06-02'
         AND str_val is not null
    @@ -54,4 +54,3 @@ SELECT bucket, severity.name AS severity, status.name AS STATUS, min, max, avg,
     SELECT * FROM channel WHERE name LIKE '...';
     -- Get optimized data for that channel ID:
     SELECT * FROM auto_optimize(33, '2021-01-01', '2021-06-02', 1000);
    -
    diff --git a/app/databrowser-timescale/postgresqsl/setup.sql b/app/databrowser-timescale/postgresqsl/setup.sql
    index 9d8215a745..e9d00e654e 100644
    --- a/app/databrowser-timescale/postgresqsl/setup.sql
    +++ b/app/databrowser-timescale/postgresqsl/setup.sql
    @@ -13,7 +13,7 @@
     -- Assume you are connected as the 'postgres' super user:
     --
     --   sudo su postgres
    ---   psql -U postgres -h localhost 
    +--   psql -U postgres -h localhost
     
     -- Suggested database name is 'tsarch'.
     -- The original plain RDB archive setup suggested an 'archive' database.
    @@ -117,9 +117,9 @@ CREATE TABLE channel
        grp_id BIGINT NULL,
        smpl_mode_id INT NULL,
        smpl_val DOUBLE PRECISION NULL,
    -   smpl_per DOUBLE PRECISION NULL, 
    +   smpl_per DOUBLE PRECISION NULL,
        retent_id INT NULL,
    -   retent_val DOUBLE PRECISION NULL   
    +   retent_val DOUBLE PRECISION NULL
     );
     
     -- Speed up lookup of channel_id by name
    @@ -142,7 +142,7 @@ SELECT * FROM channel;
     DROP TABLE IF EXISTS severity;
     DROP SEQUENCE IF EXISTS severity_sevid;
     
    -CREATE SEQUENCE severity_sevid; 
    +CREATE SEQUENCE severity_sevid;
     
     CREATE TABLE severity
     (
    @@ -287,7 +287,7 @@ CREATE TABLE sample
     -- ******************************************** --
     -- Turn plain table into TimescaleDB hypertable --
     -- ******************************************** --
    --- 
    +--
     -- At this time, the 'tsarch' table structure is fully compatible with
     -- a plain RDB 'archive' setup. Now the 'sample' table is instrumented
     -- for use with TimescaleDB.
    @@ -322,7 +322,7 @@ SELECT * from timescaledb_information.dimensions;
     -- Should create monthly, not weekly chunks to reduce number of chunks
     SELECT set_chunk_time_interval('sample', INTERVAL '1 month');
     
    --- This creates two indices: 
    +-- This creates two indices:
     --    "sample_channel_id_smpl_time_idx" btree (channel_id, smpl_time DESC)
     --    "sample_smpl_time_idx" btree (smpl_time DESC)
     --
    @@ -330,7 +330,7 @@ SELECT set_chunk_time_interval('sample', INTERVAL '1 month');
     -- for example:
     -- CREATE INDEX sample_id ON sample (channel_id);
     -- CREATE INDEX sample_id_time ON sample (channel_id, smpl_time, nanosecs);
    -  
    +
     -- TODO What about nanosecs? Include in index?
     
     \d+ sample
    @@ -369,11 +369,11 @@ DROP USER IF EXISTS tsarch;
     CREATE USER tsarch WITH PASSWORD '$tsarch';
     
     GRANT SELECT, INSERT, UPDATE, DELETE
    -  ON smpl_eng, smpl_mode, chan_grp, channel, severity, status, sample, num_metadata, enum_metadata  
    +  ON smpl_eng, smpl_mode, chan_grp, channel, severity, status, sample, num_metadata, enum_metadata
       TO tsarch;
     
     GRANT USAGE ON SEQUENCE
    -  channel_chid 
    +  channel_chid
       TO tsarch;
     
     
    @@ -480,9 +480,9 @@ BEGIN
         IF FOUND THEN
             p_start := initial;
         END IF;
    -    
    +
         -- Determine how many raw samples there are
    -    SELECT COUNT(*) INTO count FROM sample WHERE channel_id=p_channel_id AND smpl_time BETWEEN p_start AND p_end;    
    +    SELECT COUNT(*) INTO count FROM sample WHERE channel_id=p_channel_id AND smpl_time BETWEEN p_start AND p_end;
     
         -- Fewer samples than requested, or the buckets are small?
         IF NOT FOUND  OR  count <= p_bucket_count  OR  bucket_size < make_interval(secs=>10) THEN
    @@ -493,7 +493,7 @@ BEGIN
                          FROM sample s
                          WHERE s.channel_id=p_channel_id
                            AND s.smpl_time BETWEEN p_start AND p_end
    -                     ORDER BY bucket;            
    +                     ORDER BY bucket;
         ELSE
             RAISE NOTICE 'Adjusted range % .. %, % buckets sized %, % samples found -> returning optimized data', p_start, p_end, p_bucket_count, bucket_size, count;
             RETURN QUERY -- Select non-float samples "as is" with NULL for min/max
    @@ -529,5 +529,4 @@ $$;
     -- Get optimized data for that channel ID:
     -- SELECT * FROM auto_optimize(33, '2021-01-01', '2021-06-02', 1000);
     
    -   
     
    diff --git a/app/databrowser/build.xml b/app/databrowser/build.xml
    index 58a661cb05..973b70a171 100644
    --- a/app/databrowser/build.xml
    +++ b/app/databrowser/build.xml
    @@ -12,7 +12,7 @@
             
           
         
    -  	
    +
         
           
           
    diff --git a/app/databrowser/doc/index.rst b/app/databrowser/doc/index.rst
    index d35578b5d7..3ed4698cbf 100644
    --- a/app/databrowser/doc/index.rst
    +++ b/app/databrowser/doc/index.rst
    @@ -186,7 +186,7 @@ also be changed using the runtime properties dialog. To launch the dialog, click
     from the underlying plot file. Consequently such changes are **not** persisted when the plot file is saved. To make
     sure plot properties are saved one must perform the changes in the property panel.
     
    -Live Data Sampling 
    +Live Data Sampling
     ^^^^^^^^^^^^^^^^^^
     
     By default, traces will use a ``Scan Period`` of 0 seconds, which means
    @@ -200,7 +200,7 @@ of live data in memory. Older samples are dropped.
     To keep a longer time span of live data in memory, you can increase the ``Buffer Size``,
     which obviously results in using more memory. Alternatively, you can set the ``Scan Period``
     to for example 5 seconds. This will ignore the update rate of the channel and simply take
    -a sample every 5 seconds, allowing a buffer of 5000 samples to hold almost 7 hours of data.  
    +a sample every 5 seconds, allowing a buffer of 5000 samples to hold almost 7 hours of data.
     
     Optimized vs. Raw Archive Data Request
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    @@ -264,7 +264,7 @@ This reflects our assumption that the signal has not significantly changed
     until we receive a new sample.
     
      .. image:: images/stair.png
    - .. image:: images/direct.png 
    + .. image:: images/direct.png
     
     The alternate "Area (direct)" and "Single Line (direct)" Trace Types,
     shown to the right,
    @@ -290,7 +290,7 @@ Time Range
     Source Options
         By default, the export will fetch raw data from the archive,
         not the optimized, reduced min/max/average data that is displayed in the plot.
    -    
    +
         You can modify the time range of the export to differ from the range of the plot,
         and also select to export either the exact data that is displayed in the
         plot, or request optimized data with a different number of "bins" from
    @@ -298,10 +298,10 @@ Source Options
     
         ``Plot``: The exact samples currently displayed in the plot
         will be exported.
    -    
    +
         ``Raw Archived Data``: The exported data will contain data that
         is requested from the archive without modifications.
    -    
    +
         ``Optimized Archived Data``: To reduce the number of exported
         samples, optimized data is requested from the archive. You specify
         the number of desired samples, and the export will then request
    @@ -310,37 +310,37 @@ Source Options
         start..end time range is split into 800 "bins". The the minimum,
         maximum and average value of the raw samples within each bin is then
         exported.
    -    
    +
         ``Linear Interpolation``: As an alternative way to reduce the
         number of exported samples, the exported samples are computed via
         linear interpolation from the raw data. You specify the interpolation
         interval in hours, minutes and seconds, for example 00:10:00 to
         obtain one sample every 10 minutes.
     
    -    
    +
     Format Options
         The format of the exported file defaults to a spreadsheet
         suitable for import into most spreadsheet programs. You can modify
         these settings:
    -  
    +
         ``Tabular``: Instead of a table that lists the samples for all
         channels, you can export the samples for each channel separately.
    -    
    +
         ``.. with error columns``: The min...max range of optimized data
         is by default exported as "error" columns, suitable for an error-bar
         display.
    -    
    +
         ``.. with Severity/Status``: The Severity and Status of each
         sample is by default exported, but you can omit it if not needed.
    - 
    +
         ``Default format``: The number of decimal digits will be
         obtained from the data source.
    -  
    +
         ``Decimal format``: You specify the number of decimal digits.
    -   
    +
         ``Exponential notation``: Use exponential notation, where you
         again specify the number of decimal digits.
    -   
    +
     
     Excel Spreadsheets
     ^^^^^^^^^^^^^^^^^^
    @@ -352,16 +352,16 @@ Excel.
     
     Assume you chose a filename of "test.dat" on your Desktop,
     follow these steps for import into Excel:
    - 
    +
      * In Excel, use File/Open to open the file "test.dat".
        You might have to select ``Files of type: All Files (*.*)`` in the file
        "Open" dialog to do this.
      * A "Text Import Wizard" should appear, and the default
        settings should already be set to
    -   
    +
        * "Delimited - Characters such as ... tabs ..."
        * "Delimiters: Tab"
    -   
    +
      * Even though the time stamp column contains the full date and time,
        Excel will only display time down to minutes,
        omitting the seconds or microseconds.
    @@ -395,7 +395,7 @@ As long as the exported data file has a ".csv" suffix,
     OpenOffice.org/LibreOffice should open the file with an "import"
     dialog similar to MS Excel, where you select "tab" delimited columns
     as explained above.
    -        
    +
     File names ending in ".dat", ".txt" etc. might only open in the
     OpenOffice.org/LibreOffice Writer (word processor), so you have to use
     the correct file suffix.
    @@ -463,7 +463,7 @@ This can be convenient when regularly exporting data for several channels.
     To see available options, run phoebus like this::
     
         phoebus -main org.phoebus.archive.Export -help
    -    
    +
         Usage: -main org.phoebus.archive.Export [options]
     
         Export archived data into files
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/PlotSample.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/PlotSample.java
    index 8a464a9220..b888e14bae 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/PlotSample.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/model/PlotSample.java
    @@ -74,7 +74,7 @@ public class PlotSample implements PlotDataItem
                 else if (value instanceof VEnum) {
                     this.info = (((VEnum) value).getValue() + " " + this.info).trim();
                 }
    -                
    +
             }
             else
                 this.info = info;
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java
    index ff7430b1ff..5b27fc85f7 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java
    @@ -90,7 +90,7 @@ public class Perspective extends SplitPane
         private WaveformView waveform = null;
         private SmoothView smooth = null;
         private WaveformOverlapView overlap = null;
    -    
    +
         private final Controller controller;
         private final TabPane left_tabs = new TabPane(),
                               bottom_tabs = new TabPane();
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/ExchangeAxesUndoableAction.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/ExchangeAxesUndoableAction.java
    index 888987aa14..d017ac5018 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/ExchangeAxesUndoableAction.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/ExchangeAxesUndoableAction.java
    @@ -34,4 +34,4 @@ public void run() {
         public void undo() {
             model.exchangeAxes(axisIndex2, axisIndex1);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/FontButton.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/FontButton.java
    index d1c76f57fe..2d4a655dab 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/FontButton.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/FontButton.java
    @@ -171,4 +171,4 @@ private String getDescription(final Font font)
                 buf.append(",").append(font.getStyle());
             return buf.toString();
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java
    index 22d8e88581..b5d43db795 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java
    @@ -733,11 +733,11 @@ private void createContextMenu()
                     items.add(new EditMultipleItemsAction(trace_table, model, undo, selection));
     
                 items.add(new SeparatorMenuItem());
    -            
    -            
    +
    +
                 items.add(new ShowHideAllAction(model, undo, true));
                 items.add(new ShowHideAllAction(model, undo, false));
    -            
    +
                 items.add(new SeparatorMenuItem());
     
                 // Add PV-based entries
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/BidirectionalFillerOutliers.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/BidirectionalFillerOutliers.java
    index f29147010a..f0de1aab68 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/BidirectionalFillerOutliers.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/BidirectionalFillerOutliers.java
    @@ -72,4 +72,4 @@ private static boolean isOutlier(double value, double lowerBound, double upperBo
         private static double getFallbackValue(double[] data) {
             return Arrays.stream(data).average().orElse(0.0);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ExponentialSmoothingFilter.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ExponentialSmoothingFilter.java
    index 09b051d5c8..4b4b516f88 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ExponentialSmoothingFilter.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ExponentialSmoothingFilter.java
    @@ -44,4 +44,4 @@ private void validateParameters(double[] signal, int windowSize) {
                 throw new IllegalArgumentException("Signal cannot be empty");
             }
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/GaussianFilter.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/GaussianFilter.java
    index 7f901085f0..54d88e6bfc 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/GaussianFilter.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/GaussianFilter.java
    @@ -112,4 +112,4 @@ private void validateParameters(double[] signal, int windowSize) {
                 throw new IllegalArgumentException("Signal cannot be empty");
             }
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingAverageFilter.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingAverageFilter.java
    index 57c1ad82d5..f0b5048d10 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingAverageFilter.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingAverageFilter.java
    @@ -56,4 +56,4 @@ private void validateParameters(double[] signal, int windowSize) {
                 throw new IllegalArgumentException("Signal cannot be empty");
             }
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingStandardDeviation.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingStandardDeviation.java
    index d00245465d..6d6103d01a 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingStandardDeviation.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/MovingStandardDeviation.java
    @@ -76,4 +76,4 @@ private void validateParameters(double[] signal, int windowSize) {
                 throw new IllegalArgumentException("Signal cannot be empty");
             }
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ParallelMedianFilter.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ParallelMedianFilter.java
    index 02e4ac1f10..d5d6a7b338 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ParallelMedianFilter.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/smoothview/filter/ParallelMedianFilter.java
    @@ -176,4 +176,4 @@ private void validateParameters(double[] signal, int windowSize) {
             }
         }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/ExtendedMultiCheckboxCombo.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/ExtendedMultiCheckboxCombo.java
    index 7037a9d714..2027d28658 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/ExtendedMultiCheckboxCombo.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/ExtendedMultiCheckboxCombo.java
    @@ -42,4 +42,4 @@ public void setOnDeselect(Consumer handler) {
             this.onDeselectHandler = handler;
         }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/JetColorTable.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/JetColorTable.java
    index 2e05e0bb7a..b643373b41 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/JetColorTable.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/JetColorTable.java
    @@ -121,4 +121,4 @@ public static Color getColor(double fraction) {
         public static int getTableSize() {
             return TABLE_SIZE;
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/TraceConfig.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/TraceConfig.java
    index 20cdda0d1f..315a02e95a 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/TraceConfig.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/TraceConfig.java
    @@ -131,4 +131,4 @@ private interface TraceUpdater {
         // public TraceType getTraceType() { return traceType; }
         // public int getLineWidth() { return lineWidth; }
         // Additional getters...
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EarliestSample.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EarliestSample.java
    index 5fd0852954..77c0ad6eec 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EarliestSample.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EarliestSample.java
    @@ -53,4 +53,4 @@ public LinkedHashMap applySampling(Map arr
                             LinkedHashMap::new
                     ));
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalAverage.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalAverage.java
    index cf995dd64e..7cb62de1ec 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalAverage.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalAverage.java
    @@ -25,7 +25,7 @@ public class EqualIntervalAverage implements SampleAlgorithm {
         @Override
         public LinkedHashMap applySampling(Map arrayData,
                                                               int maxSampleCount) {
    -       
    +
             // Handle edge cases: empty data or invalid sample count
             if (arrayData.isEmpty() || maxSampleCount <= 0) {
                 return new LinkedHashMap<>();
    @@ -72,4 +72,4 @@ public LinkedHashMap applySampling(Map arr
     
             return result;
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalSample.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalSample.java
    index 7e12dacfed..c712e8b595 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalSample.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/EqualIntervalSample.java
    @@ -56,4 +56,4 @@ public LinkedHashMap applySampling(Map arr
     
             return result;
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupOutlierSampling.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupOutlierSampling.java
    index 78ce5c05df..3e71130e23 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupOutlierSampling.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupOutlierSampling.java
    @@ -134,4 +134,4 @@ private double computeEuclideanDistance(double[] w1, double[] w2) {
             }
             return Math.sqrt(sumOfSquares);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupTypicalSampling.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupTypicalSampling.java
    index 2a4abd5bab..d3207ecb34 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupTypicalSampling.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/GroupTypicalSampling.java
    @@ -134,4 +134,4 @@ private double computeEuclideanDistance(double[] w1, double[] w2) {
             }
             return Math.sqrt(sumOfSquares);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/LatestSample.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/LatestSample.java
    index 10cef3ffd2..81cd854a27 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/LatestSample.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/LatestSample.java
    @@ -49,4 +49,4 @@ public LinkedHashMap applySampling(Map arr
                             LinkedHashMap::new
                     ));
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/SampleManager.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/SampleManager.java
    index 3567d1bf5d..dec0c46cc4 100644
    --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/SampleManager.java
    +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/waveformoverlapview/sample/SampleManager.java
    @@ -71,4 +71,4 @@ public LinkedHashMap applyCurrentFilter(Map
         
       
    -
    \ No newline at end of file
    +
    diff --git a/app/diag/src/main/java/org/phoebus/app/diag/FormulaTreeApp.java b/app/diag/src/main/java/org/phoebus/app/diag/FormulaTreeApp.java
    index 6084de9b40..ca97e86ad5 100644
    --- a/app/diag/src/main/java/org/phoebus/app/diag/FormulaTreeApp.java
    +++ b/app/diag/src/main/java/org/phoebus/app/diag/FormulaTreeApp.java
    @@ -9,7 +9,7 @@ public class FormulaTreeApp implements AppDescriptor {
         static final Image icon = ImageCache.getImage(FormulaTreeApp.class, "/icons/tree-property-16.png");
         public static final String NAME = "formula_tree";
         public static final String DISPLAYNAME = "Formula Tree";
    -    
    +
         @Override
         public String getName() {
             return NAME;
    diff --git a/app/diag/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/diag/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    index a17f3c01da..6ee60f2379 100644
    --- a/app/diag/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    +++ b/app/diag/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    @@ -1,2 +1,2 @@
     org.phoebus.app.diag.DiagApp
    -org.phoebus.app.diag.FormulaTreeApp
    \ No newline at end of file
    +org.phoebus.app.diag.FormulaTreeApp
    diff --git a/app/diag/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/diag/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    index c040b2a189..610febaf57 100644
    --- a/app/diag/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    +++ b/app/diag/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    @@ -1,2 +1,2 @@
     org.phoebus.app.diag.DiagMenuEntry
    -org.phoebus.app.diag.FormulaTreeMenuEntry
    \ No newline at end of file
    +org.phoebus.app.diag.FormulaTreeMenuEntry
    diff --git a/app/display/Readme.md b/app/display/Readme.md
    index d65dcbfd00..5f37fd6676 100644
    --- a/app/display/Readme.md
    +++ b/app/display/Readme.md
    @@ -2,7 +2,7 @@ Display Builder
     ===============
     
     The Display Builder development started in the Eclipse-based version of CS-Studio
    -as an update of CS-Studio 'BOY', i.e. the `org.csstudio.opibuilder.*` code in 
    +as an update of CS-Studio 'BOY', i.e. the `org.csstudio.opibuilder.*` code in
     https://github.com/ControlSystemStudio/cs-studio
     
     It aims for similar functionality and "look",
    @@ -76,9 +76,9 @@ The base `WidgetRuntime` handles the following:
      * If widget has `pv_name` and `pv_value` properties, a primary PV is created for
        the `pv_name`. The `pv_value` is updated with each `VType` received from that PV.
        Representation then needs to reflect the current `pv_value`.
    -   
    +
      * Widget can 'write' to the primary PV.
    -    
    +
      * Each script in the "scripts" property is parsed, its PVs are created,
        and the script is triggered when any of its input PVs change.
        The script can then update widget properties.
    @@ -153,7 +153,7 @@ It is decoupled, because in edit mode there would in fact not be any runtime.
     The representation sends an event via
     `ToolkitRepresentation.fireWrite(Widget widget, Object value)`.
     In runtime mode, the `WidgetRuntime` subscribes to these events
    -and writes to the PV. 
    +and writes to the PV.
     
     ### SPI
     The model, representation and (optional) runtime of a widget
    @@ -269,7 +269,7 @@ This simplifies the behavior of macros, since discussions with the implementor o
     no good reason to duplicate the more complicated previous behavior.
     As a technical detail, the BOY *.opi XML format treated `"include_parent_macros"`,
     the option to inherit parent macros, just like the name of an ordinary macro.
    -This macro name is now ignored. 
    +This macro name is now ignored.
     
     Properties that support macros are based on `MacroizedWidgetProperty`.
     They distinguish between the original value specification,
    @@ -292,7 +292,7 @@ font specifications like "height 12" were in points.
     For SWT as used in the legacy  CS-Studio displays, the on-screen size of fonts depends
     on the resolution and size of the display.
     For existing *.opi files, the desired font sizes are therefore unknown unless one can measure
    -them on the OS and hardware where the display was originally executed. 
    +them on the OS and hardware where the display was originally executed.
     
     Using JavaFX, fonts so far appear to be mapped 1 pixel per 1 "point" on Linux, Windows and Mac OS X.
     To verify, execute `org.csstudio.display.builder.representation.javafx.JFXFontCalibration`.
    @@ -408,7 +408,7 @@ __-> JavaFX tends to be faster than SWT, especially on some Linux__
     
     `RepresentationDemoJavaFX` vs. `RepresentationDemoJavaFXinSWT`
     
    -Windows: 
    +Windows:
     Updates appear the same,  UpdateThrottle waiting for UI is "0 ms",
     but JavaFX in SWT FXCanvas uses about twice the CPU.
     `javafx.embed.swt.FXCanvas.paintControl` shows up in profile.
    @@ -474,4 +474,3 @@ JFX WritableImage has very limited API.
     
     Best option seems to use AWT to draw buffered image in background thread,
     then show that in JFX Canvas.
    -
    diff --git a/app/display/actions/src/main/java/org/csstudio/display/actions/ExecuteScriptAction.java b/app/display/actions/src/main/java/org/csstudio/display/actions/ExecuteScriptAction.java
    index 7af2b07363..5deac4f824 100644
    --- a/app/display/actions/src/main/java/org/csstudio/display/actions/ExecuteScriptAction.java
    +++ b/app/display/actions/src/main/java/org/csstudio/display/actions/ExecuteScriptAction.java
    @@ -126,7 +126,7 @@ public boolean matchesAction(String actionId) {
                     actionId.equalsIgnoreCase(EXECUTE_PYTHONSCRIPT) ||
                     actionId.equalsIgnoreCase(EXECUTE_JAVASCRIPT);
         }
    -    
    +
         public ScriptInfo getScriptInfo() {
             return scriptInfo;
         }
    diff --git a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo
    index 08898016b1..676b10f730 100644
    --- a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo
    +++ b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo
    @@ -5,4 +5,4 @@ org.csstudio.display.actions.ExecuteCommandAction
     org.csstudio.display.actions.OpenFileAction
     org.csstudio.display.actions.OpenWebPageAction
     org.csstudio.display.actions.CloseDisplayAction
    -org.csstudio.display.actions.OpenDataBrowserAction
    \ No newline at end of file
    +org.csstudio.display.actions.OpenDataBrowserAction
    diff --git a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties
    index f00d1f43e8..0f5394d2e5 100644
    --- a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties
    +++ b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties
    @@ -54,7 +54,7 @@ ConvertToEmbeddedPython=Convert to Embedded Python\u2026
     ConvertToScriptFile=Convert to Script File
     Copy=Copy
     Duplicate=Duplicate
    -Edit=Edit\u2026 
    +Edit=Edit\u2026
     ExportWidgetInfo=Export to file
     ExportDone=Exported Widget Info to file {0}.
     ExportFailed=Export failed.
    diff --git a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages_fr.properties b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages_fr.properties
    index d40161beb1..d3d7d15491 100644
    --- a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages_fr.properties
    +++ b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages_fr.properties
    @@ -49,7 +49,7 @@ ConvertToEmbeddedPython=Convertir en Python intégré\u2026
     ConvertToScriptFile=Convertir en fichier script
     Copy=Copier
     Duplicate=Dupliquer
    -Edit=Éditer… 
    +Edit=Éditer…
     ExportWidgetInfo=Exporter vers un fichier
     ExportDone=Exporter les informations sur les widgets dans le fichier {0}.
     ExportFailed=L'exportation a échoué.
    diff --git a/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteCommandTest.java b/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteCommandTest.java
    index 52b18c9e5b..f457660aa1 100644
    --- a/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteCommandTest.java
    +++ b/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteCommandTest.java
    @@ -21,11 +21,11 @@
     
     /**
      * Test Execute Script actions
    - * 
    + *
      * @author Becky Auger-Williams
      */
     public class ExecuteCommandTest {
    -    
    +
         private static final String TMP_OUTFILE = "/tmp/outfile.bob";
     
         @Test
    @@ -55,7 +55,7 @@ public void execute_command() {
                 fail("Exception thrown" + e.getLocalizedMessage());
             }
             // Test clean up
    -        File tmpfile = new File(TMP_OUTFILE); 
    +        File tmpfile = new File(TMP_OUTFILE);
             tmpfile.delete();
         }
     }
    diff --git a/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteScriptTest.java b/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteScriptTest.java
    index bb53c962e1..16711eb698 100644
    --- a/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteScriptTest.java
    +++ b/app/display/actions/src/test/java/org/csstudio/display/actions/ExecuteScriptTest.java
    @@ -21,11 +21,11 @@
     
     /**
      * Test Execute Script actions
    - * 
    + *
      * @author Becky Auger-Williams
      */
     public class ExecuteScriptTest {
    -    
    +
         private static final String TMP_OUTFILE = "/tmp/outfile.bob";
     
         @Test
    @@ -55,10 +55,10 @@ public void execute_embedded_javascript() {
                 fail("Exception thrown" + e.getLocalizedMessage());
             }
             // Test clean up
    -        File tmpfile = new File(TMP_OUTFILE); 
    +        File tmpfile = new File(TMP_OUTFILE);
             tmpfile.delete();
         }
    -    
    +
         @Test
         public void execute_embedded_pythonscript() {
             String xml = ""
    @@ -78,7 +78,7 @@ public void execute_embedded_pythonscript() {
                 assertTrue(model.isClean());
     
                 writer.writeModel(model);
    -            
    +
                 // Check the model gets written correctly
                 String file_content = Files.readString(Path.of(TMP_OUTFILE)).strip();
                 assertTrue(file_content.contains("
           
         
    -  	
    +
         
           
           
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
    index 860f411a6a..cd78543105 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
    @@ -45,7 +45,7 @@ public Convert_relatedDisplayClass(final EdmConverter converter, final Widget pa
                 convertColor(t.getBgColor(), widget.propBackgroundColor());
             convertColor(t.getFgColor(), widget.propForegroundColor());
             convertFont(t.getFont(), widget.propFont());
    -        
    +
             if (widget.propTransparent().getValue())
             {   // EDM used the fore & back colors for the button, not the menu,
                 // which was always black-on-gray.
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_ByteClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_ByteClass.java
    index 86cc9a4e89..db3092c59e 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_ByteClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_ByteClass.java
    @@ -53,4 +53,4 @@ public int getNumBits() {
         public int getShift() {
             return shift;
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeButtonClass.java
    index 9ce3fc9c2f..db29bbf9a1 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeButtonClass.java
    @@ -74,4 +74,4 @@ public boolean useLabelsFromPV()
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeChoiceButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeChoiceButtonClass.java
    index d5943ac0e3..12d1fb59e9 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeChoiceButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeChoiceButtonClass.java
    @@ -38,4 +38,4 @@ public final String getControlPv() {
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeExitButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeExitButtonClass.java
    index 29a780327c..7d4498f6fc 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeExitButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeExitButtonClass.java
    @@ -23,4 +23,4 @@ public String getLabel() {
             return label;
         }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMenuButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMenuButtonClass.java
    index e64afb1e68..431ed2259f 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMenuButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMenuButtonClass.java
    @@ -27,4 +27,4 @@ public final String getControlPv() {
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMessageButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMessageButtonClass.java
    index ce22ec73a4..9b84e07adb 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMessageButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMessageButtonClass.java
    @@ -86,4 +86,4 @@ public final String getOffLabel() {
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMeterClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMeterClass.java
    index 0148e0dc09..78c899dd6c 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMeterClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeMeterClass.java
    @@ -46,4 +46,4 @@ public double getScaleMin() {
         public double getScaleMax() {
             return scaleMax;
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activePngClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activePngClass.java
    index e7a84bb103..d44d272bac 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activePngClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activePngClass.java
    @@ -49,4 +49,3 @@ public boolean isNoErase() {
     
     
     }
    -
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeRadioButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeRadioButtonClass.java
    index 82e7324a8d..c756800004 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeRadioButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeRadioButtonClass.java
    @@ -27,4 +27,4 @@ public final String getControlPv() {
     
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeUpdownButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeUpdownButtonClass.java
    index 094b179090..c873027038 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeUpdownButtonClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeUpdownButtonClass.java
    @@ -68,4 +68,4 @@ public final String getControlPv() {
     
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass.java
    index 17beeee67f..180a812d8e 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass.java
    @@ -50,4 +50,4 @@ public String getFileComponent() {
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass_noedit.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass_noedit.java
    index 498f0f0217..e33bbde0ae 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass_noedit.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_activeXTextDspClass_noedit.java
    @@ -79,4 +79,4 @@ public boolean isAutoHeight() {
         }
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_cfcf6c8a_dbeb_11d2_8a97_00104b8742df.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_cfcf6c8a_dbeb_11d2_8a97_00104b8742df.java
    index d3a4f232ac..03a5ed22df 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_cfcf6c8a_dbeb_11d2_8a97_00104b8742df.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_cfcf6c8a_dbeb_11d2_8a97_00104b8742df.java
    @@ -52,4 +52,3 @@ public boolean isNoErase() {
     
     
     }
    -
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_relatedDisplayClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_relatedDisplayClass.java
    index 6d35e79d7f..7e6addff29 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_relatedDisplayClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_relatedDisplayClass.java
    @@ -111,4 +111,4 @@ public boolean isIcon() {
     
     
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_shellCmdClass.java b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_shellCmdClass.java
    index c5e2a01047..f133e3253c 100644
    --- a/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_shellCmdClass.java
    +++ b/app/display/convert-edm/src/main/java/org/csstudio/opibuilder/converter/model/Edm_shellCmdClass.java
    @@ -54,4 +54,4 @@ public boolean isInvisible() {
             return invisible;
         }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/CalcPvConverterTest.java b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/CalcPvConverterTest.java
    index bb5d7e9421..229125f20e 100644
    --- a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/CalcPvConverterTest.java
    +++ b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/CalcPvConverterTest.java
    @@ -40,4 +40,4 @@ public void testCalcPv()
             formula = ConverterBase.convertPVName("CALC\\{A/B}(RFQ_HPRF:Gate1_RF:Width,32)");
             assertThat(formula, equalTo("=`RFQ_HPRF:Gate1_RF:Width`/32"));
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/EdmConverterTest.java b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/EdmConverterTest.java
    index c8c5d84aca..fac8e01ed4 100644
    --- a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/EdmConverterTest.java
    +++ b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/EdmConverterTest.java
    @@ -50,4 +50,4 @@ public void testConverter() throws Exception
             writer.close();
             System.out.println(buf);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/FontMappingTest.java b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/FontMappingTest.java
    index fd6e24fb77..281427ca67 100644
    --- a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/FontMappingTest.java
    +++ b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/FontMappingTest.java
    @@ -26,4 +26,4 @@ public void testParser()
             assertThat(ConverterPreferences.mapFont("times"), equalTo("Liberation Serif"));
             assertThat(ConverterPreferences.mapFont("anything_else"), equalTo("Liberation Sans"));
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/widgets/ColorRuleTest.java b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/widgets/ColorRuleTest.java
    index c6154b31a8..baaba2797f 100644
    --- a/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/widgets/ColorRuleTest.java
    +++ b/app/display/convert-edm/src/test/java/org/csstudio/display/converter/edm/widgets/ColorRuleTest.java
    @@ -28,4 +28,4 @@ public void testColorRuleExpression()
             assertThat(ConverterBase.convertColorRuleExpression(" >=-0.5 && <0.5"), equalTo(" pv0>=-0.5 && pv0<0.5"));
             assertThat(ConverterBase.convertColorRuleExpression("default"), equalTo("true"));
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-edm/src/test/resources/Maintenance_12hr.edl b/app/display/convert-edm/src/test/resources/Maintenance_12hr.edl
    index 73f02b1994..4c76be1453 100644
    --- a/app/display/convert-edm/src/test/resources/Maintenance_12hr.edl
    +++ b/app/display/convert-edm/src/test/resources/Maintenance_12hr.edl
    @@ -837,4 +837,3 @@ value {
       "W"
     }
     endObjectProperties
    -
    diff --git a/app/display/convert-edm/src/test/resources/colors.list b/app/display/convert-edm/src/test/resources/colors.list
    index 456856dfb8..6c6d933e5d 100644
    --- a/app/display/convert-edm/src/test/resources/colors.list
    +++ b/app/display/convert-edm/src/test/resources/colors.list
    @@ -130,7 +130,7 @@ static 160 "blinking blue"    {  0 0 65535     0 0 0 } #
     static 164 "blinking yellow"  { 65535 65535 0  56026 56026 56026 } #
     
     
    -alarm  { 
    +alarm  {
       disconnected : "Disconn/Invalid"
       invalid      : "Disconn/Invalid"
       minor        : "Monitor: MINOR"
    @@ -166,7 +166,7 @@ rule 84 "Green-Red" {
     }
     
     # Next 2 for Clickable/ON
    -rule 85 "FE-ON 1-bit" { 
    +rule 85 "FE-ON 1-bit" {
      >=-0.5 && <0.5	 : "FE title"
      >=0.5  && <=1.5 : "Monitor: NORMAL"
     }
    @@ -367,7 +367,7 @@ rule 153 "Normal-if-3" {
      default : "Wid-alt/Anno-sec"
     }
     
    -# Next 6 for Ring RF 
    +# Next 6 for Ring RF
     rule 154 "RingRF Remote" {
      >=-0.5 && <0.5	 : "Monitor: MAJOR"
      >=0.5  && <=1.5 : "Monitor: NORMAL"
    @@ -439,7 +439,7 @@ rule 168 "TGT_Alarm" {
      >=2.5 && <=3.5  : "Monitor: MAJOR"
     }
     
    -menumap { 
    +menumap {
      "black"
      "white"
      "Disconn/Invalid"
    @@ -554,24 +554,24 @@ menumap {
      "Green-Red"
      "FE-ON 1-bit"
      "FE-ON-Not 1-bit"
    - "FE-X-X-ON" 
    - "FE-Vlv" 
    - "FE-Vlv-R" 
    + "FE-X-X-ON"
    + "FE-Vlv"
    + "FE-Vlv-R"
      "SNS-Vlv-1"
      "SNS-Vlv-2"
      "Gray-Green"
      "Gray-Red-Green"
      "Seq-3 (RYG)"
      "Seq-4 (RYGB)"
    - "Seq-5 (ROYGB)" 
    + "Seq-5 (ROYGB)"
      "Seq-6 (ROYGBV)"
      "Lights-0"
    - "Lights-1" 
    + "Lights-1"
      "Lights-2"
      "Green-LED"
    - "Yellow-LED" 
    - "Red-LED" 
    - "Not-Green-LED" 
    + "Yellow-LED"
    + "Red-LED"
    + "Not-Green-LED"
      "Not-Yellow-LED"
      "Not-Red-LED"
      "blinking red"
    @@ -608,4 +608,3 @@ menumap {
      "ac-sts"
      "TGT_Alarm"
     }
    -
    diff --git a/app/display/convert-medm/Readme.md b/app/display/convert-medm/Readme.md
    index 816aaa53d5..56597877d1 100644
    --- a/app/display/convert-medm/Readme.md
    +++ b/app/display/convert-medm/Readme.md
    @@ -24,5 +24,3 @@ For example, a rectangle and label which surround a set of widgets will not be r
     a `Group` that contains them.
     A pair of `oval` widgets which are (almost) on top of each other with conditional visibility,
     graphically representing an LED, will not be replaced with an `LED` widget.
    -
    -
    diff --git a/app/display/convert-medm/build.xml b/app/display/convert-medm/build.xml
    index 15a9ca3bb2..04b1d737f8 100644
    --- a/app/display/convert-medm/build.xml
    +++ b/app/display/convert-medm/build.xml
    @@ -12,7 +12,7 @@
             
           
         
    -  	
    +
         
           
           
    diff --git a/app/display/convert-medm/doc/index.rst b/app/display/convert-medm/doc/index.rst
    index 8e5329ca85..90a958ab3b 100644
    --- a/app/display/convert-medm/doc/index.rst
    +++ b/app/display/convert-medm/doc/index.rst
    @@ -92,7 +92,7 @@ which can convert a list of files, including complete directories::
         -output /path/to/folder      - Folder into which converted files are written
         -force                       - Overwrite existing files instead of stopping
         -depth count                 - Convert just the listed files (1), or also referenced files (2), or more levels down
    -    
    +
     The batch converter can also recursively convert referenced files like
     embedded displays or related displays.
     Refer to the complete ``-help`` output for details.
    @@ -119,7 +119,7 @@ To enable the auto-converter, define a folder where the converted files will be
     as well as related settings::
     
         org.csstudio.display.converter.edm/auto_converter_dir=/path/to/AUTOCONVERTED_FILES
    -    org.csstudio.display.converter.edm/auto_converter_strip=/some/prefix/to/strip    
    +    org.csstudio.display.converter.edm/auto_converter_strip=/some/prefix/to/strip
         org.csstudio.display.converter.edm/edm_paths_config=/path/to/my_edm_search_paths.txt
     
     With the auto-converter folder defined, each time the display builder
    @@ -143,7 +143,7 @@ Use these example settings::
         org.csstudio.display.converter.edm/auto_converter_dir=$(user.home)/AUTOCONVERTED_FILES
         org.csstudio.display.converter.edm/auto_converter_strip=$(user.home)/AUTOCONVERTED_FILES
         org.csstudio.display.converter.edm/edm_paths_config=https://my.site.org/opi/edm/paths.txt
    -    
    +
     where the file ``paths.txt`` on the server should include just one line::
     
         https://my.site.org/opi/edm/
    @@ -151,7 +151,7 @@ where the file ``paths.txt`` on the server should include just one line::
     To bootstrap access to the EDM displays from your display builder screens,
     use an action button labeled "EDM Displays"
     with an action to open ``$(user.home)/AUTOCONVERTED_FILES/general/start.bob``.
    -When you first click that button, 
    +When you first click that button,
     ``$(user.home)/AUTOCONVERTED_FILES/general/start.bob`` does not exist,
     and we attempt to auto-convert it from an EDM display:
     
    diff --git a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgetParts/ADLConnected.java b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgetParts/ADLConnected.java
    index 56eef4c1ee..3b1c0f4489 100644
    --- a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgetParts/ADLConnected.java
    +++ b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgetParts/ADLConnected.java
    @@ -122,4 +122,4 @@ public boolean isForeColorDefined() {
             return _isForeColorDefined;
         }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/RelatedDisplay.java b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/RelatedDisplay.java
    index 08691ccd4c..4e0dd31c8b 100644
    --- a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/RelatedDisplay.java
    +++ b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/RelatedDisplay.java
    @@ -200,4 +200,3 @@ public Object[] getChildren() {
             return ret.toArray();
         }
     }
    -
    diff --git a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/TextEntryWidget.java b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/TextEntryWidget.java
    index 8024e92a19..5ff674c8a7 100644
    --- a/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/TextEntryWidget.java
    +++ b/app/display/convert-medm/src/main/java/org/csstudio/utility/adlparser/fileParser/widgets/TextEntryWidget.java
    @@ -126,5 +126,3 @@ public Object[] getChildren() {
         }
     
     }
    -
    -
    diff --git a/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages.properties b/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages.properties
    index e98b1dbb19..9eb294d64d 100644
    --- a/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages.properties
    +++ b/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages.properties
    @@ -1,16 +1,16 @@
     #Created by JInto - www.guh-software.de
     #Thu Sep 17 11:36:23 CEST 2009
    -ADLBasicAttribute_AssertError_Begin=This 
    +ADLBasicAttribute_AssertError_Begin=This
     ADLBasicAttribute_AssertError_End=\ is not a ADL Basic Attribute
    -ADLBasicAttribute_WrongADLFormatException_Begin=This 
    +ADLBasicAttribute_WrongADLFormatException_Begin=This
     ADLBasicAttribute_WrongADLFormatException_End=\ is a wrong ADL Basic Attribute
    -ADLBasicAttribute_WrongADLFormatException_Parameter_Begin=This 
    +ADLBasicAttribute_WrongADLFormatException_Parameter_Begin=This
     ADLBasicAttribute_WrongADLFormatException_Parameter_End=\ is a wrong ADL Basic Attribute parameter
    -ADLControl_AssertError_Begin=This 
    +ADLControl_AssertError_Begin=This
     ADLControl_AssertError_End=\ is not a ADL Control
    -ADLControl_WrongADLFormatException_Begin=This 
    +ADLControl_WrongADLFormatException_Begin=This
     ADLControl_WrongADLFormatException_End=\ is a wrong ADL Control Attribute
    -ADLControl_WrongADLFormatException_Parameter_Begin=This 
    +ADLControl_WrongADLFormatException_Parameter_Begin=This
     ADLControl_WrongADLFormatException_Parameter_End=\ is a wrong ADL Control Attribute parameter
     ADLConverterMainView_ADLFileChooserCancelButton=&Cancel
     ADLConverterMainView_ADLFileChooserDes=folder
    @@ -50,57 +50,57 @@ ADLDisplayImporter_Dialog_No2All_Button=no to all
     ADLDisplayImporter_Dialog_No_Button=no
     ADLDisplayImporter_Dialog_Yes2All_Button=yes to all
     ADLDisplayImporter_Dialog_Yes_Button=yes
    -ADLDisplayImporter_WARN_UNHANDLED_TYPE=Found unhandled type 
    -ADLDynamicAttribute_AssertError_Begin=This 
    +ADLDisplayImporter_WARN_UNHANDLED_TYPE=Found unhandled type
    +ADLDynamicAttribute_AssertError_Begin=This
     ADLDynamicAttribute_AssertError_End=\ is not a ADL dynamic Attribute
    -ADLDynamicAttribute_WrongADLFormatException_Parameter_Begin=This 
    +ADLDynamicAttribute_WrongADLFormatException_Parameter_Begin=This
     ADLDynamicAttribute_WrongADLFormatException_Parameter_End=\ is a wrong ADL dynamic Attribute parameter
    -ADLHelper_AssertError_Begin=This 
    +ADLHelper_AssertError_Begin=This
     ADLHelper_AssertError_End=\ is not a ADL Color Map
    -ADLHelper_WrongADLFormatException_Begin=This 
    +ADLHelper_WrongADLFormatException_Begin=This
     ADLHelper_WrongADLFormatException_End=\ is a invalid ADL Color Map string
    -ADLMenuItem_AssertError_Begin=This 
    +ADLMenuItem_AssertError_Begin=This
     ADLMenuItem_AssertError_End=\ is not a ADL Menu Item
    -ADLMenuItem_WrongADLFormatException_Begin=This 
    +ADLMenuItem_WrongADLFormatException_Begin=This
     ADLMenuItem_WrongADLFormatException_end=\ is a wrong ADL Menu Item
    -ADLMonitor_WrongADLFormatException_Begin=This 
    +ADLMonitor_WrongADLFormatException_Begin=This
     ADLMonitor_WrongADLFormatException_End=\ is a wrong ADL monitor
    -ADLMonitor_WrongADLFormatException_Parameter_Begin=This 
    -ADLMonitor_WrongADLFormatException_Parameter_End=\ is a wrong ADL monitor parameter. 
    -ADLMonitor_AssertError_Begin=This 
    +ADLMonitor_WrongADLFormatException_Parameter_Begin=This
    +ADLMonitor_WrongADLFormatException_Parameter_End=\ is a wrong ADL monitor parameter.
    +ADLMonitor_AssertError_Begin=This
     ADLMonitor_AssertError_End=\ is not a ADL monitor
    -ADLObject_AssertError_Begin=This 
    +ADLObject_AssertError_Begin=This
     ADLObject_AssertError_End=\ is not a ADLObject
    -ADLObject_WrongADLFormatException_Begin=This 
    +ADLObject_WrongADLFormatException_Begin=This
     ADLObject_WrongADLFormatException_End=\ is a wrong ADLObject
    -ADLObject_WrongADLFormatException_Parameter_Begin=This 
    +ADLObject_WrongADLFormatException_Parameter_Begin=This
     ADLObject_WrongADLFormatException_Parameter_End=\ is a wrong ADLObject parameter
    -ADLPoints_AssertError_Begin=This 
    +ADLPoints_AssertError_Begin=This
     ADLPoints_AssertError_End=\ is not a ADL Points
    -ADLPoints_WrongADLFormatException_Begin=This 
    +ADLPoints_WrongADLFormatException_Begin=This
     ADLPoints_WrongADLFormatException_End=\ is a wrong ADL Point
    -ADLSensitive_AssertError_Begin=This 
    +ADLSensitive_AssertError_Begin=This
     ADLSensitive_AssertError_End=\ is not a ADL Sensitive Item
     ADLSensitive_No_Channel_Warning=no channel \:
    -ADLSensitive_WrongADLFormatException_Begin=This 
    +ADLSensitive_WrongADLFormatException_Begin=This
     ADLSensitive_WrongADLFormatException_End=\ is a wrong ADL Sensitive Item
    -ActionButton_WrongADLFormatException=wrong parameter\: 
    +ActionButton_WrongADLFormatException=wrong parameter\:
     Arc_WrongADLFormatException=wrong parameter
     Bargraph_1=wrong parameter
     Bargraph_Clrmod_Debug=Bargraph --> clrmod -->
     Bargraph_Format_Debug=Bargraph --> format -->
     Bargraph_Limit_Type_Debug=Bargraph --> limitType -->
    -Bargraph_WrongADLFormatException=\ from 
    -Bargraph_WrongADLFormatException_Parameter_Begin=wrong parameter\: 
    +Bargraph_WrongADLFormatException=\ from
    +Bargraph_WrongADLFormatException_Parameter_Begin=wrong parameter\:
     Bargraph_WrongADLFormatException_Type=wrong bargraph type
     Display_AssertError=Wrong number of parameter
    -Display_WrongADLFormatException_Begin=This 
    +Display_WrongADLFormatException_Begin=This
     Display_WrongADLFormatException_End=\ is a wrong Display Attribute
    -Display_WrongADLFormatException_Parameter_Begin=This 
    +Display_WrongADLFormatException_Parameter_Begin=This
     Display_WrongADLFormatException_Parameter_End=\ is a wrong ADL Display parameter
    -GroupingContainer_WrongADLFormatException=wrong parameter\: 
    -GroupingContainer_WrongADLFormatException2=wrong parameter\: 
    -Label_Format_Debug=Format \= 
    +GroupingContainer_WrongADLFormatException=wrong parameter\:
    +GroupingContainer_WrongADLFormatException2=wrong parameter\:
    +Label_Format_Debug=Format \=
     Label_WrongADLFormatException_Parameter_Begin=wrong parameter length [
     Label_WrongADLFormatException_Parameter_End=]
     Polygon_AssertError=convertCoordinate abortive
    @@ -109,8 +109,8 @@ RGBColor_WrongADLFormatException=Color String a invalid format
     RelatedDisplayItem_Parameter_Error=no empty Parametres \:
     RelatedDisplayItem_WrongADLFormatException_Begin=This '
     RelatedDisplayItem_WrongADLFormatException_Middle=' is a wrong Related Display Item
    -RelatedDisplay_WrongADLFormatException_Parameter_Begin=wrong parameter\: 
    -Textinput_Align_Debug=Align is 
    -Textinput_Format_Debug=Format is 
    -Textinput_WrongADLFormatException=wrong or untreated Textinput-->clrmod parameter \: 
    -Textinput_WrongADLFormatException_Parameter_Begin=wrong parameter\: 
    +RelatedDisplay_WrongADLFormatException_Parameter_Begin=wrong parameter\:
    +Textinput_Align_Debug=Align is
    +Textinput_Format_Debug=Format is
    +Textinput_WrongADLFormatException=wrong or untreated Textinput-->clrmod parameter \:
    +Textinput_WrongADLFormatException_Parameter_Begin=wrong parameter\:
    diff --git a/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages_fr.properties b/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages_fr.properties
    index b99529f805..213c2e6c1b 100644
    --- a/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages_fr.properties
    +++ b/app/display/convert-medm/src/main/resources/org/csstudio/utility/adlparser/internationalization/messages_fr.properties
    @@ -1,14 +1,14 @@
    -ADLBasicAttribute_AssertError_Begin=Ceci 
    +ADLBasicAttribute_AssertError_Begin=Ceci
     ADLBasicAttribute_AssertError_End=\ n'est pas un attribut de base ADL
    -ADLBasicAttribute_WrongADLFormatException_Begin=Ceci 
    +ADLBasicAttribute_WrongADLFormatException_Begin=Ceci
     ADLBasicAttribute_WrongADLFormatException_End=\ est un attribut de base ADL incorrect
    -ADLBasicAttribute_WrongADLFormatException_Parameter_Begin=Ceci 
    +ADLBasicAttribute_WrongADLFormatException_Parameter_Begin=Ceci
     ADLBasicAttribute_WrongADLFormatException_Parameter_End=\ est un paramètre d'attribut de base ADL incorrect
    -ADLControl_AssertError_Begin=Ceci 
    +ADLControl_AssertError_Begin=Ceci
     ADLControl_AssertError_End=\ n'est pas un contrôle ADL
    -ADLControl_WrongADLFormatException_Begin=Ceci 
    +ADLControl_WrongADLFormatException_Begin=Ceci
     ADLControl_WrongADLFormatException_End=\ est un attribut de contrôle ADL incorrect
    -ADLControl_WrongADLFormatException_Parameter_Begin=Ceci 
    +ADLControl_WrongADLFormatException_Parameter_Begin=Ceci
     ADLControl_WrongADLFormatException_Parameter_End=\ est un paramètre d'attribut de contrôle ADL incorrect
     ADLConverterMainView_ADLFileChooserCancelButton=&Annuler
     ADLConverterMainView_ADLFileChooserDes=dossier
    @@ -48,57 +48,57 @@ ADLDisplayImporter_Dialog_No2All_Button=non à tout
     ADLDisplayImporter_Dialog_No_Button=non
     ADLDisplayImporter_Dialog_Yes2All_Button=oui à tout
     ADLDisplayImporter_Dialog_Yes_Button=oui
    -ADLDisplayImporter_WARN_UNHANDLED_TYPE=Type non pris en charge trouvé 
    -ADLDynamicAttribute_AssertError_Begin=Ceci 
    +ADLDisplayImporter_WARN_UNHANDLED_TYPE=Type non pris en charge trouvé
    +ADLDynamicAttribute_AssertError_Begin=Ceci
     ADLDynamicAttribute_AssertError_End=\ n'est pas un attribut dynamique ADL
    -ADLDynamicAttribute_WrongADLFormatException_Parameter_Begin=Ceci 
    +ADLDynamicAttribute_WrongADLFormatException_Parameter_Begin=Ceci
     ADLDynamicAttribute_WrongADLFormatException_Parameter_End=\ est un paramètre d'attribut dynamique ADL incorrect
    -ADLHelper_AssertError_Begin=Ceci 
    +ADLHelper_AssertError_Begin=Ceci
     ADLHelper_AssertError_End=\ n'est pas une carte de couleurs ADL
    -ADLHelper_WrongADLFormatException_Begin=Ceci 
    +ADLHelper_WrongADLFormatException_Begin=Ceci
     ADLHelper_WrongADLFormatException_End=\ est une chaîne de carte de couleurs ADL invalide
    -ADLMenuItem_AssertError_Begin=Ceci 
    +ADLMenuItem_AssertError_Begin=Ceci
     ADLMenuItem_AssertError_End=\ n'est pas un élément de menu ADL
    -ADLMenuItem_WrongADLFormatException_Begin=Ceci 
    +ADLMenuItem_WrongADLFormatException_Begin=Ceci
     ADLMenuItem_WrongADLFormatException_end=\ est un élément de menu ADL incorrect
    -ADLMonitor_WrongADLFormatException_Begin=Ceci 
    +ADLMonitor_WrongADLFormatException_Begin=Ceci
     ADLMonitor_WrongADLFormatException_End=\ est un moniteur ADL incorrect
    -ADLMonitor_WrongADLFormatException_Parameter_Begin=Ceci 
    +ADLMonitor_WrongADLFormatException_Parameter_Begin=Ceci
     ADLMonitor_WrongADLFormatException_Parameter_End=\ est un paramètre de moniteur ADL incorrect
    -ADLMonitor_AssertError_Begin=Ceci 
    +ADLMonitor_AssertError_Begin=Ceci
     ADLMonitor_AssertError_End=\ n'est pas un moniteur ADL
    -ADLObject_AssertError_Begin=Ceci 
    +ADLObject_AssertError_Begin=Ceci
     ADLObject_AssertError_End=\ n'est pas un objet ADL
    -ADLObject_WrongADLFormatException_Begin=Ceci 
    +ADLObject_WrongADLFormatException_Begin=Ceci
     ADLObject_WrongADLFormatException_End=\ est un objet ADL incorrect
    -ADLObject_WrongADLFormatException_Parameter_Begin=Ceci 
    +ADLObject_WrongADLFormatException_Parameter_Begin=Ceci
     ADLObject_WrongADLFormatException_Parameter_End=\ est un paramètre d'objet ADL incorrect
    -ADLPoints_AssertError_Begin=Ceci 
    +ADLPoints_AssertError_Begin=Ceci
     ADLPoints_AssertError_End=\ ne sont pas des points ADL
    -ADLPoints_WrongADLFormatException_Begin=Ceci 
    +ADLPoints_WrongADLFormatException_Begin=Ceci
     ADLPoints_WrongADLFormatException_End=\ est un point ADL incorrect
    -ADLSensitive_AssertError_Begin=Ceci 
    +ADLSensitive_AssertError_Begin=Ceci
     ADLSensitive_AssertError_End=\ n'est pas un élément sensible ADL
     ADLSensitive_No_Channel_Warning=aucun canal :
    -ADLSensitive_WrongADLFormatException_Begin=Ceci 
    +ADLSensitive_WrongADLFormatException_Begin=Ceci
     ADLSensitive_WrongADLFormatException_End=\ est un élément sensible ADL incorrect
    -ActionButton_WrongADLFormatException=paramètre incorrect : 
    +ActionButton_WrongADLFormatException=paramètre incorrect :
     Arc_WrongADLFormatException=paramètre incorrect
     Bargraph_1=paramètre incorrect
     Bargraph_Clrmod_Debug=Bargraph --> clrmod -->
     Bargraph_Format_Debug=Bargraph --> format -->
     Bargraph_Limit_Type_Debug=Bargraph --> type de limite -->
    -Bargraph_WrongADLFormatException=\ de 
    -Bargraph_WrongADLFormatException_Parameter_Begin=paramètre incorrect : 
    +Bargraph_WrongADLFormatException=\ de
    +Bargraph_WrongADLFormatException_Parameter_Begin=paramètre incorrect :
     Bargraph_WrongADLFormatException_Type=type de barre de graphique incorrect
     Display_AssertError=Nombre de paramètres incorrect
    -Display_WrongADLFormatException_Begin=Ceci 
    +Display_WrongADLFormatException_Begin=Ceci
     Display_WrongADLFormatException_End=\ est un attribut d'affichage incorrect
    -Display_WrongADLFormatException_Parameter_Begin=Ceci 
    +Display_WrongADLFormatException_Parameter_Begin=Ceci
     Display_WrongADLFormatException_Parameter_End=\ est un paramètre d'affichage ADL incorrect
    -GroupingContainer_WrongADLFormatException=paramètre incorrect : 
    -GroupingContainer_WrongADLFormatException2=paramètre incorrect : 
    -Label_Format_Debug=Format = 
    +GroupingContainer_WrongADLFormatException=paramètre incorrect :
    +GroupingContainer_WrongADLFormatException2=paramètre incorrect :
    +Label_Format_Debug=Format =
     Label_WrongADLFormatException_Parameter_Begin=longueur de paramètre incorrecte [
     Label_WrongADLFormatException_Parameter_End=]
     Polygon_AssertError=convertirCoordonnées avorté
    @@ -107,8 +107,8 @@ RGBColor_WrongADLFormatException=Chaîne de couleur dans un format invalide
     RelatedDisplayItem_Parameter_Error=aucun paramètre vide :
     RelatedDisplayItem_WrongADLFormatException_Begin=Ceci '
     RelatedDisplayItem_WrongADLFormatException_Middle=' est un élément d'affichage associé incorrect
    -RelatedDisplay_WrongADLFormatException_Parameter_Begin=paramètre incorrect : 
    -Textinput_Align_Debug=L'alignement est 
    -Textinput_Format_Debug=Le format est 
    -Textinput_WrongADLFormatException=paramètre Textinput incorrect ou non traité --> clrmod : 
    -Textinput_WrongADLFormatException_Parameter_Begin=paramètre incorrect : 
    +RelatedDisplay_WrongADLFormatException_Parameter_Begin=paramètre incorrect :
    +Textinput_Align_Debug=L'alignement est
    +Textinput_Format_Debug=Le format est
    +Textinput_WrongADLFormatException=paramètre Textinput incorrect ou non traité --> clrmod :
    +Textinput_WrongADLFormatException_Parameter_Begin=paramètre incorrect :
    diff --git a/app/display/editor/build.xml b/app/display/editor/build.xml
    index 093613ec08..bdb7086293 100644
    --- a/app/display/editor/build.xml
    +++ b/app/display/editor/build.xml
    @@ -7,7 +7,7 @@
         
         
       
    -	
    +
       
       	
       
    -  
    +
       
         
           
     
     
    diff --git a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/write/LogEntryEditor.fxml b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/write/LogEntryEditor.fxml
    index 92b89d57b4..dad976a547 100644
    --- a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/write/LogEntryEditor.fxml
    +++ b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/write/LogEntryEditor.fxml
    @@ -16,7 +16,7 @@
       ~  You should have received a copy of the GNU General Public License
       ~  along with this program; if not, write to the Free Software
       ~  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    -  ~  
    +  ~
       -->
     
     
    diff --git a/app/logbook/olog/ui/src/main/resources/pagination.css b/app/logbook/olog/ui/src/main/resources/pagination.css
    index f4d3a0e004..d97ab52dee 100644
    --- a/app/logbook/olog/ui/src/main/resources/pagination.css
    +++ b/app/logbook/olog/ui/src/main/resources/pagination.css
    @@ -4,4 +4,4 @@
     .pagination > .pagination-control > .control-box {
         -fx-alignment: bottom-right;
         -fx-padding: 0.416em 2.5em 0 0;
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/olog/ui/src/main/resources/search_result_view.css b/app/logbook/olog/ui/src/main/resources/search_result_view.css
    index 4026a4418d..5e71f8d141 100644
    --- a/app/logbook/olog/ui/src/main/resources/search_result_view.css
    +++ b/app/logbook/olog/ui/src/main/resources/search_result_view.css
    @@ -35,4 +35,4 @@
     
     .label{
         -fx-text-fill: black;
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/olog/ui/src/main/resources/titled_pane_customization.css b/app/logbook/olog/ui/src/main/resources/titled_pane_customization.css
    index 764eddb4be..1c8b8f4457 100644
    --- a/app/logbook/olog/ui/src/main/resources/titled_pane_customization.css
    +++ b/app/logbook/olog/ui/src/main/resources/titled_pane_customization.css
    @@ -9,4 +9,4 @@
     .attachment-properties-header > .title{
         -fx-background-color: #ffffff;
         -fx-font-size: 12px;
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/LogPropertiesDemo.java b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/LogPropertiesDemo.java
    index c515c23128..cba7b39691 100644
    --- a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/LogPropertiesDemo.java
    +++ b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/LogPropertiesDemo.java
    @@ -58,7 +58,7 @@ public void start(Stage primaryStage) throws IOException {
             loader.load();
             final LogPropertiesController controller = loader.getController();
             Node tree = loader.getRoot();
    -        
    +
             CheckBox checkBox = new CheckBox();
             BooleanProperty editable = new SimpleBooleanProperty();
             checkBox.selectedProperty().bindBidirectional(editable);
    diff --git a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java
    index 84e5387e23..7e2884dd81 100644
    --- a/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java
    +++ b/app/logbook/olog/ui/src/test/java/org/phoebus/logbook/olog/ui/write/LogEntryUtilsTest.java
    @@ -30,4 +30,3 @@ public void testCreateLogEntryFromList(){
             assertEquals("\n- [Title01](someURL/1)\n- [Title02](someURL/2)\n- [Title03](someURL/3)", testListLog.getSource());
         }
     }
    -
    diff --git a/app/logbook/olog/ui/src/test/resources/file_phoebus.txt b/app/logbook/olog/ui/src/test/resources/file_phoebus.txt
    index 14a17f1a2b..1f06ce75e9 100644
    --- a/app/logbook/olog/ui/src/test/resources/file_phoebus.txt
    +++ b/app/logbook/olog/ui/src/test/resources/file_phoebus.txt
    @@ -1 +1 @@
    -This is a text example file.
    \ No newline at end of file
    +This is a text example file.
    diff --git a/app/logbook/olog/ui/src/test/resources/websocketexample1.json b/app/logbook/olog/ui/src/test/resources/websocketexample1.json
    index 5eeb172715..842bd9e8e3 100644
    --- a/app/logbook/olog/ui/src/test/resources/websocketexample1.json
    +++ b/app/logbook/olog/ui/src/test/resources/websocketexample1.json
    @@ -1,3 +1,3 @@
     {
       "messageType": "NEW_LOG_ENTRY"
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/olog/ui/src/test/resources/websocketexample2.json b/app/logbook/olog/ui/src/test/resources/websocketexample2.json
    index 1cb8559541..1f0be00472 100644
    --- a/app/logbook/olog/ui/src/test/resources/websocketexample2.json
    +++ b/app/logbook/olog/ui/src/test/resources/websocketexample2.json
    @@ -1,4 +1,4 @@
     {
       "messageType": "LOG_ENTRY_UPDATED",
       "payload" : "logEntryId"
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/olog/ui/src/test/resources/websocketexample3.json b/app/logbook/olog/ui/src/test/resources/websocketexample3.json
    index 0a0274351a..6b332a6906 100644
    --- a/app/logbook/olog/ui/src/test/resources/websocketexample3.json
    +++ b/app/logbook/olog/ui/src/test/resources/websocketexample3.json
    @@ -1,3 +1,3 @@
     {
       "messageType": "INVALID"
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderApp.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderApp.java
    index fd3789b5bf..88a8f87e30 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderApp.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderApp.java
    @@ -32,7 +32,7 @@ public void start() {
         public String getDisplayName() {
             return DISPLAYNAME;
         }
    -    
    +
         @Override
         public String getName() {
             return NAME;
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderMenuEntry.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderMenuEntry.java
    index 0a03d1d8fd..abc1d301b3 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderMenuEntry.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderMenuEntry.java
    @@ -36,7 +36,7 @@ public String getMenuPath()
         {
             return "Utility";
         }
    -    
    +
         @Override
         public Image getIcon()
         {
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderViewController.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderViewController.java
    index 8b539d6fcb..e61fc0009c 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderViewController.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryCalenderViewController.java
    @@ -93,7 +93,7 @@ public class LogEntryCalenderViewController extends LogbookSearchController {
         public LogEntryCalenderViewController(LogClient logClient){
             setClient(logClient);
         }
    -    
    +
         @FXML
         public void initialize() {
     
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTable.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTable.java
    index 530aa5d81e..52e8daa29f 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTable.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTable.java
    @@ -16,7 +16,7 @@
     public class LogEntryTable implements AppInstance {
         final static Logger log = Logger.getLogger(LogEntryTable.class.getName());
         private static final String LOG_TABLE_QUERY = "log_table_query";
    -    
    +
         private final LogEntryTableApp app;
         private LogEntryTableViewController controller;
     
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableApp.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableApp.java
    index 2a5da5ed15..1141ce9bac 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableApp.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableApp.java
    @@ -32,7 +32,7 @@ public void start() {
         public String getDisplayName() {
             return DISPLAYNAME;
         }
    -    
    +
         @Override
         public String getName() {
             return NAME;
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableMenuEntry.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableMenuEntry.java
    index 85c5ff28b5..548f8e98d6 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableMenuEntry.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogEntryTableMenuEntry.java
    @@ -36,7 +36,7 @@ public String getMenuPath()
         {
             return "Utility";
         }
    -    
    +
         @Override
         public Image getIcon()
         {
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchController.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchController.java
    index dc3aa4f06d..e8fed93714 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchController.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchController.java
    @@ -15,7 +15,7 @@
      * controller takes care of performing the query off the ui thread using
      * {@link Job}s and then invokes the setLogs method on the UI thread after
      * the query has been completed.
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchJob.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchJob.java
    index 460cb6ba97..13792a2957 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchJob.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/LogbookSearchJob.java
    @@ -13,7 +13,7 @@
     
     /**
      * Background job for searching log entries
    - * 
    + *
      * @author Kunal Shroff, Kay Kasemir
      */
     public class LogbookSearchJob extends JobRunnableWithCancel {
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/Messages.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/Messages.java
    index f88f1ed60e..b3abc92195 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/Messages.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/Messages.java
    @@ -11,14 +11,14 @@
     
     public class Messages
     {
    -    public static String Add,                              
    +    public static String Add,
                              Add_Tooltip,
                              Apply,
                              Attachments,
                              Available,
                              Cancel,
                              CancelTooltip,
    -                         Clear,                                
    +                         Clear,
                              Clear_Tooltip,
                              CreateLogbookEntry,
                              CurrentDate,
    @@ -54,7 +54,7 @@ public class Messages
             NLS.initializeMessages(Messages.class);
         }
     
    -    private Messages() 
    +    private Messages()
         {
             // prevent instantiation
         }
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/menu/SendToLogBookApp.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/menu/SendToLogBookApp.java
    index ac0b86eea2..97d5d0a658 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/menu/SendToLogBookApp.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/menu/SendToLogBookApp.java
    @@ -31,7 +31,7 @@ public String getDisplayName()
         {
             return DISPLAY_NAME;
         }
    -    
    +
         @Override
         public String getName()
         {
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/LogbooksTagsView.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/LogbooksTagsView.java
    index 88d8cde055..1027afd65d 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/LogbooksTagsView.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/LogbooksTagsView.java
    @@ -314,4 +314,4 @@ private void setFieldText(ContextMenu dropDown, List selectedItems, Text
     
             field.setText(fieldText);
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/PropertiesTab.java b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/PropertiesTab.java
    index c9050d0383..2a3fb168c0 100644
    --- a/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/PropertiesTab.java
    +++ b/app/logbook/ui/src/main/java/org/phoebus/logbook/ui/write/PropertiesTab.java
    @@ -22,7 +22,7 @@ public PropertiesTab()
         {
             formatTab();
         }
    -    
    +
         private void formatTab()
         {
             setClosable(false);
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    index 4885216a25..12b9faf413 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.adapter.AdapterFactory
    @@ -1 +1 @@
    -org.phoebus.logbook.ui.adapters.AppSelectionAdapterFactory
    \ No newline at end of file
    +org.phoebus.logbook.ui.adapters.AppSelectionAdapterFactory
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    index 59df9b3584..ea85613672 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    @@ -1 +1 @@
    -org.phoebus.logbook.ui.menu.SendToLogBookApp
    \ No newline at end of file
    +org.phoebus.logbook.ui.menu.SendToLogBookApp
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    index a8538597f6..b49417367b 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    @@ -1,2 +1,2 @@
     org.phoebus.logbook.ui.LogEntryCalenderApp
    -org.phoebus.logbook.ui.LogEntryTableApp
    \ No newline at end of file
    +org.phoebus.logbook.ui.LogEntryTableApp
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    index 0a0b4034a3..ca6c470dac 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ContextMenuEntry
    @@ -1 +1 @@
    -org.phoebus.logbook.ui.write.ContextMenuLogging
    \ No newline at end of file
    +org.phoebus.logbook.ui.write.ContextMenuLogging
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    index eb43d4dedb..2e16490c39 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    @@ -1,3 +1,3 @@
     org.phoebus.logbook.ui.menu.SendToLogBookMenuEntry
     org.phoebus.logbook.ui.LogEntryCalenderMenuEntry
    -org.phoebus.logbook.ui.LogEntryTableMenuEntry
    \ No newline at end of file
    +org.phoebus.logbook.ui.LogEntryTableMenuEntry
    diff --git a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    index 6b1997e111..4ed26329fa 100644
    --- a/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    +++ b/app/logbook/ui/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    @@ -1 +1 @@
    -org.phoebus.logbook.ui.menu.SendToLogBookToolbarEntry
    \ No newline at end of file
    +org.phoebus.logbook.ui.menu.SendToLogBookToolbarEntry
    diff --git a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/Agenda.css b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/Agenda.css
    index 85862eb9e3..c16d377765 100644
    --- a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/Agenda.css
    +++ b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/Agenda.css
    @@ -1,4 +1,4 @@
     .group0 { -fx-background-color: #000000; -fx-fill: #000000; }
     .group1 { -fx-background-color: #3E36B2; -fx-fill: #3E36B2; }
     .group2 { -fx-background-color: #3E36B2; -fx-fill: #3E36B2; }
    -.group25 { -fx-background-color: #3E36B2; -fx-fill: #3E36B2; }
    \ No newline at end of file
    +.group25 { -fx-background-color: #3E36B2; -fx-fill: #3E36B2; }
    diff --git a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/messages.properties b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/messages.properties
    index 183bf11456..63489e0655 100644
    --- a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/messages.properties
    +++ b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/messages.properties
    @@ -34,4 +34,4 @@ Title=Title:
     Urgent=Urgent
     Username=User Name:
     LogbookServiceUnavailableTitle=Cannot create logbook entry
    -LogbookServiceHasNoLogbooks=Logbook service "{0}" has no logbooks or is not available.
    \ No newline at end of file
    +LogbookServiceHasNoLogbooks=Logbook service "{0}" has no logbooks or is not available.
    diff --git a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/AttachmentsView.fxml b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/AttachmentsView.fxml
    index 294abae7a1..18a782c820 100644
    --- a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/AttachmentsView.fxml
    +++ b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/AttachmentsView.fxml
    @@ -19,7 +19,7 @@
       ~  You should have received a copy of the GNU General Public License
       ~  along with this program; if not, write to the Free Software
       ~  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    -  ~  
    +  ~
       -->
     
     
    diff --git a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/LogEntryEditor.fxml b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/LogEntryEditor.fxml
    index 0e5fd60d75..1af8074941 100644
    --- a/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/LogEntryEditor.fxml
    +++ b/app/logbook/ui/src/main/resources/org/phoebus/logbook/ui/write/LogEntryEditor.fxml
    @@ -16,7 +16,7 @@
       ~  You should have received a copy of the GNU General Public License
       ~  along with this program; if not, write to the Free Software
       ~  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    -  ~  
    +  ~
       -->
     
     
    diff --git a/app/logbook/ui/src/test/java/org/phoebus/logbook/ui/QueryParserTest.java b/app/logbook/ui/src/test/java/org/phoebus/logbook/ui/QueryParserTest.java
    index b3cb0c1bd8..8388a7f5b5 100644
    --- a/app/logbook/ui/src/test/java/org/phoebus/logbook/ui/QueryParserTest.java
    +++ b/app/logbook/ui/src/test/java/org/phoebus/logbook/ui/QueryParserTest.java
    @@ -12,7 +12,7 @@
     
     /**
      * Test the parsing of the logbook query URI syntax
    - * 
    + *
      * @author Kunal Shroff
      *
      */
    diff --git a/app/logbook/ui/src/test/resources/file_phoebus.txt b/app/logbook/ui/src/test/resources/file_phoebus.txt
    index 14a17f1a2b..1f06ce75e9 100644
    --- a/app/logbook/ui/src/test/resources/file_phoebus.txt
    +++ b/app/logbook/ui/src/test/resources/file_phoebus.txt
    @@ -1 +1 @@
    -This is a text example file.
    \ No newline at end of file
    +This is a text example file.
    diff --git a/app/pace/doc/index.rst b/app/pace/doc/index.rst
    index eb4237a435..8efa07b58a 100644
    --- a/app/pace/doc/index.rst
    +++ b/app/pace/doc/index.rst
    @@ -17,7 +17,7 @@ PV writes are only attempted after a successful logbook entry.
     If the logbook entry fails, PVs are restored to their original value.
     
     .. figure:: images/pace1.png
    -   
    +
         PACE
     
     
    @@ -64,10 +64,10 @@ by control system personell, but end users may also create them.
     A PACE file uses an XML format with the following basic structure::
     
         
    -       Your Title goes here   
    +       Your Title goes here  
           
           
    -     
    +    
     
     The columns section describes the columns of the PACE table.
     Each column has a name, optional access mode, and a macroized PV pattern::
    diff --git a/app/pace/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor b/app/pace/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    index 1a845a72e7..7e87500483 100644
    --- a/app/pace/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    +++ b/app/pace/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppResourceDescriptor
    @@ -1 +1 @@
    -org.csstudio.display.pace.PACEApp
    \ No newline at end of file
    +org.csstudio.display.pace.PACEApp
    diff --git a/app/pace/src/main/resources/org/csstudio/display/pace/messages.properties b/app/pace/src/main/resources/org/csstudio/display/pace/messages.properties
    index 29dab955cc..73d6ebb033 100644
    --- a/app/pace/src/main/resources/org/csstudio/display/pace/messages.properties
    +++ b/app/pace/src/main/resources/org/csstudio/display/pace/messages.properties
    @@ -1,5 +1,5 @@
     FileChanged=Values were edited. 'Save' to write them to the control system!
    -InstanceLabelProvider_OrigAppendix=, orig: 
    +InstanceLabelProvider_OrigAppendix=, orig:
     InstanceLabelProvider_PVValueFormat={0} = {1}
     InstanceLabelProvider_PVCommentTipFormat=\nLast change by {0} on {1}:\n{2}
     InstanceLabelProvider_ReadOnlyAppendix=\ (read-only)
    diff --git a/app/pace/src/main/resources/org/csstudio/display/pace/messages_de.properties b/app/pace/src/main/resources/org/csstudio/display/pace/messages_de.properties
    index dbf3c6ac6d..86644ba3af 100644
    --- a/app/pace/src/main/resources/org/csstudio/display/pace/messages_de.properties
    +++ b/app/pace/src/main/resources/org/csstudio/display/pace/messages_de.properties
    @@ -1,5 +1,5 @@
     FileChanged=Werte wurden editiert. 'Save' um \u00c4nderungen ins Kontrollsystem zu schreiben.
    -InstanceLabelProvider_OrigAppendix=, orig: 
    +InstanceLabelProvider_OrigAppendix=, orig:
     InstanceLabelProvider_PVValueFormat={0} = {1}
     InstanceLabelProvider_PVCommentTipFormat=\nLetzte \u00c4nderung {0}, {1}:\n{2}
     InstanceLabelProvider_ReadOnlyAppendix=\ (nicht schreibbar)
    diff --git a/app/pace/src/main/resources/pace_examples/rf_pwr_limits.pace b/app/pace/src/main/resources/pace_examples/rf_pwr_limits.pace
    index 092160814f..b80ea89f4c 100644
    --- a/app/pace/src/main/resources/pace_examples/rf_pwr_limits.pace
    +++ b/app/pace/src/main/resources/pace_examples/rf_pwr_limits.pace
    @@ -44,7 +44,7 @@
          ${S}_HPRF:Cav${N}:DutyLmtAdmName
          ${S}_HPRF:Cav${N}:DutyLmtAdmTSStr
          ${S}_HPRF:Cav${N}:DutyLmtAdmTxt
    -     
    +   
        
          DutyLmtAdmTxt
          rw
    diff --git a/app/perfmon/build.xml b/app/perfmon/build.xml
    index c2998bd3ed..758fada482 100644
    --- a/app/perfmon/build.xml
    +++ b/app/perfmon/build.xml
    @@ -18,4 +18,4 @@
         
       
     
    -
    \ No newline at end of file
    +
    diff --git a/app/perfmon/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/perfmon/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    index e61a392b16..1a607ead89 100644
    --- a/app/perfmon/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    +++ b/app/perfmon/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    @@ -1 +1 @@
    -org.phoebus.app.perfmon.OpenPerfMon
    \ No newline at end of file
    +org.phoebus.app.perfmon.OpenPerfMon
    diff --git a/app/probe/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor b/app/probe/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    index a19b793894..661fb8bf51 100644
    --- a/app/probe/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    +++ b/app/probe/src/main/resources/META-INF/services/org.phoebus.framework.spi.AppDescriptor
    @@ -1 +1 @@
    -org.phoebus.applications.probe.Probe
    \ No newline at end of file
    +org.phoebus.applications.probe.Probe
    diff --git a/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry b/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    index 0ca16c3c84..afcdd361b1 100644
    --- a/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    +++ b/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.MenuEntry
    @@ -1 +1 @@
    -org.phoebus.applications.probe.ProbeMenuEntry
    \ No newline at end of file
    +org.phoebus.applications.probe.ProbeMenuEntry
    diff --git a/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry b/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    index a793104f2f..1a5a1f5d43 100644
    --- a/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    +++ b/app/probe/src/main/resources/META-INF/services/org.phoebus.ui.spi.ToolbarEntry
    @@ -1 +1 @@
    -org.phoebus.applications.probe.ProbeToolbarEntry
    \ No newline at end of file
    +org.phoebus.applications.probe.ProbeToolbarEntry
    diff --git a/app/probe/src/main/resources/org/phoebus/applications/probe/messages.properties b/app/probe/src/main/resources/org/phoebus/applications/probe/messages.properties
    index 966b1d4bd1..ca1983b871 100644
    --- a/app/probe/src/main/resources/org/phoebus/applications/probe/messages.properties
    +++ b/app/probe/src/main/resources/org/phoebus/applications/probe/messages.properties
    @@ -1,20 +1,20 @@
     Alarm=Alarm:
    -Alarms=Alarms: 
    -ControlRange=Control Range: 
    +Alarms=Alarms:
    +ControlRange=Control Range:
     Copy=Copy PV to Clipboard
     CopyWithValue=Copy PV to Clipboard with Value
    -Description=Description: 
    -DisplayRange=Display Range: 
    +Description=Description:
    +DisplayRange=Display Range:
     EnumLbls=Enumeration Labels:
    -Format=Format: 
    +Format=Format:
     Metadata=Metadata:
     Precision=Precision:
     Probe=Probe
     ProbeMenuPath=Display
     PromptTxt=Enter PV Name
    -PvNameLbl=PV Name: 
    +PvNameLbl=PV Name:
     Search=Search
     TimeStamp=Time Stamp:
    -Units=Units: 
    +Units=Units:
     Value=Value:
    -Warnings=Warnings: 
    +Warnings=Warnings:
    diff --git a/app/probe/src/main/resources/org/phoebus/applications/probe/messages_fr.properties b/app/probe/src/main/resources/org/phoebus/applications/probe/messages_fr.properties
    index 9ee783f534..84ec1ac439 100644
    --- a/app/probe/src/main/resources/org/phoebus/applications/probe/messages_fr.properties
    +++ b/app/probe/src/main/resources/org/phoebus/applications/probe/messages_fr.properties
    @@ -1,20 +1,20 @@
     Alarm=Alarme :
    -Alarms=Alarmes : 
    -ControlRange=Plage de contrôle : 
    +Alarms=Alarmes :
    +ControlRange=Plage de contrôle :
     Copy=Copier le PV dans le presse-papiers
     CopyWithValue=Copier la valeur du PV dans le presse-papiers
    -Description=Description: 
    -DisplayRange=Plage d'affichage : 
    +Description=Description:
    +DisplayRange=Plage d'affichage :
     EnumLbls=Étiquettes d'énumération :
    -Format=Format : 
    +Format=Format :
     Metadata=Métadonnées :
     Precision=Précision :
     Probe=Sonde
     ProbeMenuPath=Affichage
     PromptTxt=Entrez le nom du PV
    -PvNameLbl=Nom du PV : 
    +PvNameLbl=Nom du PV :
     Search=Rechercher
     TimeStamp=Horodatage :
    -Units=Unités : 
    +Units=Unités :
     Value=Valeur :
    -Warnings=Avertissements : 
    +Warnings=Avertissements :
    diff --git a/app/probe/src/main/resources/org/phoebus/applications/probe/view/ProbeView.fxml b/app/probe/src/main/resources/org/phoebus/applications/probe/view/ProbeView.fxml
    index 17dc4c9ca8..617f01c1a0 100644
    --- a/app/probe/src/main/resources/org/phoebus/applications/probe/view/ProbeView.fxml
    +++ b/app/probe/src/main/resources/org/phoebus/applications/probe/view/ProbeView.fxml
    @@ -24,19 +24,19 @@
     
     	
     	  
    -	     
    +	    
     	    ";
                     }
    -                
    +
                     row.append( $('').append(item));
     
                     var performed = scan.find('performed_work_units').text();
    diff --git a/services/scan-server/src/main/resources/webroot/simulate.html b/services/scan-server/src/main/resources/webroot/simulate.html
    index 0b7c67fda1..b73223ef15 100644
    --- a/services/scan-server/src/main/resources/webroot/simulate.html
    +++ b/services/scan-server/src/main/resources/webroot/simulate.html
    @@ -39,4 +39,4 @@ 

    Simulate Scan

    Back to main - \ No newline at end of file + diff --git a/services/scan-server/src/main/resources/webroot/simulate.js b/services/scan-server/src/main/resources/webroot/simulate.js index d68d0adeb8..121026686d 100644 --- a/services/scan-server/src/main/resources/webroot/simulate.js +++ b/services/scan-server/src/main/resources/webroot/simulate.js @@ -7,7 +7,7 @@ $(function() $('#runtime').text(""); var commands = $('#scan').val(); - + $.ajax( { type: 'POST', diff --git a/services/scan-server/src/main/resources/webroot/submit.html b/services/scan-server/src/main/resources/webroot/submit.html index b9e3578159..8e6e6e686b 100644 --- a/services/scan-server/src/main/resources/webroot/submit.html +++ b/services/scan-server/src/main/resources/webroot/submit.html @@ -38,13 +38,13 @@

    Submit Scan

    - Optional timeout in + Optional timeout in seconds or execution deadline in format yyyy-MM-dd HH:mm:ss format - +

    @@ -53,4 +53,4 @@

    Submit Scan

    Back to main - \ No newline at end of file + diff --git a/services/scan-server/src/main/resources/webroot/submit.js b/services/scan-server/src/main/resources/webroot/submit.js index 724d6ba3f6..bf420b18e8 100644 --- a/services/scan-server/src/main/resources/webroot/submit.js +++ b/services/scan-server/src/main/resources/webroot/submit.js @@ -6,10 +6,10 @@ $(function() var name = $('input[name=name]').val(); var commands = $('textarea').val(); var queue = $('input[name=queue]').prop('checked'); - var pre_post = $('input[name=pre_post]').prop('checked'); + var pre_post = $('input[name=pre_post]').prop('checked'); var timeout = parseInt($('input[name=timeout]').val()); var deadline = $('input[name=deadline]').val(); - + var url = '/scan/' + encodeURIComponent(name); var flags = false; if (! queue) @@ -30,7 +30,7 @@ $(function() url += "timeout=" + timeout; flags = true; } - if (deadline.length == 19 && deadline != "0000-00-00 00:00:00") + if (deadline.length == 19 && deadline != "0000-00-00 00:00:00") { url += flags ? '&' : '?'; url += "deadline=" + escape(deadline);