diff --git a/.travis.yml b/.travis.yml
index 0a115e0f9..071cf2329 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,13 +1,26 @@
sudo: required
language: java
-jdk: oraclejdk8
+jdk:
+ - oraclejdk8
+ - oraclejdk9
+ - oraclejdk10
+matrix:
+ include:
+ - jdk: openjdk8
+ before_install:
+ - export MVN_OPT='--projects "!gpclient/gpclient-javafx"'
+ - jdk: openjdk10
+ before_install:
+ - rm "${JAVA_HOME}/lib/security/cacerts"
+ - ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts"
+ - export MVN_OPT='--projects "!gpclient/gpclient-javafx"'
env:
- EPICS_PVA_ADDR_LIST=127.255.255.255
install: true
script:
- - mvn clean verify -B
+ - mvn clean verify ${MVN_OPT} -B
after_failure:
- find ./ -type d -name "surefire-reports" -print0 | xargs -0 -I {} find {} -iname "*.txt" -type f | xargs cat
diff --git a/epics-vtype/pom.xml b/epics-vtype/pom.xml
index 30b58566d..791dc9b95 100644
--- a/epics-vtype/pom.xml
+++ b/epics-vtype/pom.xml
@@ -24,32 +24,6 @@
1.8
-
- org.apache.maven.plugins
- maven-source-plugin
- 3.0.1
-
-
- attach-sources
-
- jar
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.10.4
-
-
- attach-javadocs
-
- jar
-
-
-
-
com.mycila
license-maven-plugin
diff --git a/exampleJava b/exampleJava
index d2dd1b46b..c427828ba 160000
--- a/exampleJava
+++ b/exampleJava
@@ -1 +1 @@
-Subproject commit d2dd1b46baab148e3a7c846082428655c2b3d9b6
+Subproject commit c427828bafbe351598893bbc1d6a2f28d83fc92a
diff --git a/gpclient/gpclient-javafx/src/main/java/org/epics/gpclient/javafx/tools/ValueViewer.java b/gpclient/gpclient-javafx/src/main/java/org/epics/gpclient/javafx/tools/ValueViewer.java
index 164cc8060..4bef01122 100644
--- a/gpclient/gpclient-javafx/src/main/java/org/epics/gpclient/javafx/tools/ValueViewer.java
+++ b/gpclient/gpclient-javafx/src/main/java/org/epics/gpclient/javafx/tools/ValueViewer.java
@@ -1,194 +1,199 @@
-/**
- * Copyright information and license terms for this software can be
- * found in the file LICENSE.TXT included with the distribution.
- */
-package org.epics.gpclient.javafx.tools;
-
-import com.sun.javafx.collections.ImmutableObservableList;
-import java.io.IOException;
-import javafx.collections.FXCollections;
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.control.Button;
-import javafx.scene.control.ListView;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
-import javafx.scene.control.TextField;
-import javafx.scene.control.TitledPane;
-import javafx.scene.control.cell.PropertyValueFactory;
-import org.epics.vtype.Alarm;
-import org.epics.vtype.Display;
-import org.epics.vtype.Time;
-import org.epics.vtype.VEnum;
-import org.epics.vtype.VType;
-
-public final class ValueViewer extends ScrollPane {
-
- @FXML
- private TitledPane commonMetadata;
- @FXML
- private TextField typeField;
- @FXML
- private TextField alarmField;
- @FXML
- private TextField timeField;
- @FXML
- private TitledPane numberMetadata;
- @FXML
- private TextField displayRangeField;
- @FXML
- private TextField alarmRangeField;
- @FXML
- private TextField warningRangeField;
- @FXML
- private TextField controlRangeField;
- @FXML
- private TextField unitField;
- @FXML
- private TitledPane enumMetadata;
- @FXML
- private TitledPane tableMetadata;
- @FXML
- private TableView columnsTable;
- @FXML
- private TableColumn columnNameColumn;
- @FXML
- private TableColumn columnTypeColumn;
- @FXML
- private TableColumn columnSizeColumn;
- @FXML
- private ListView labelsField;
- @FXML
- private Button inspectTableButton;
-
- public ValueViewer() {
- FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("ValueViewer.fxml"));
-
- fxmlLoader.setRoot(this);
- fxmlLoader.setController(this);
-
- try {
- fxmlLoader.load();
- } catch (IOException exception) {
- throw new RuntimeException(exception);
- }
-
- columnNameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
- columnTypeColumn.setCellValueFactory(new PropertyValueFactory<>("type"));
- columnSizeColumn.setCellValueFactory(new PropertyValueFactory<>("size"));
-
- setValue(null, false);
- }
-
- private Object value;
-
- public void setValue(Object value, boolean connection) {
- commonMetadata(value, connection);
- numberDisplay(Display.displayOf(value));
- enumMetadata(value);
- tableMetadata(value);
- this.value = value;
- }
-
- private void commonMetadata(Object value, boolean connection) {
- if (value == null) {
- typeField.setText(null);
- alarmField.setText(null);
- timeField.setText(null);
- } else {
- Class> clazz = VType.typeOf(value);
- if (clazz == null) {
- typeField.setText(null);
- } else {
- typeField.setText(clazz.getSimpleName());
- }
- alarmField.setText(Alarm.alarmOf(value, connection).toString());
- timeField.setText(Time.timeOf(value).toString());
- }
- }
-
- private void numberDisplay(Display display) {
- if (display == null || display.equals(Display.none())) {
- numberMetadata.setVisible(false);
- numberMetadata.setManaged(false);
- } else {
- numberMetadata.setVisible(true);
- numberMetadata.setManaged(true);
- displayRangeField.setText(display.getDisplayRange().toString());
- alarmRangeField.setText(display.getAlarmRange().toString());
- warningRangeField.setText(display.getWarningRange().toString());
- controlRangeField.setText(display.getControlRange().toString());
- unitField.setText(display.getUnit());
- }
- }
-
- private void enumMetadata(Object value) {
- if (value instanceof VEnum) {
- enumMetadata.setVisible(true);
- enumMetadata.setManaged(true);
- labelsField.setItems(FXCollections.observableList(((VEnum) value).getDisplay().getChoices()));
- } else {
- enumMetadata.setVisible(false);
- enumMetadata.setManaged(false);
- }
- }
-
- public static class VTableColumn {
- private final Object vTable;
- private final int columnIndex;
-
- public VTableColumn(Object vTable, int columnIndex) {
- this.vTable = vTable;
- this.columnIndex = columnIndex;
- }
-
- public String getName() {
-// return vTable.getColumnName(columnIndex);
- return "None";
- }
-
- public String getType() {
-// return vTable.getColumnType(columnIndex).getSimpleName();
- return "None";
- }
-
- public int getSize() {
-// Object data = vTable.getColumnData(columnIndex);
-// if (data instanceof ListNumber) {
-// return ((ListNumber) data).size();
-// } else if (data instanceof List) {
-// return ((List) data).size();
-// } else {
-// return 0;
-// }
- return 0;
- }
-
-
- }
-//
- private void tableMetadata(Object value) {
-// if (value instanceof org.diirt.vtype.VTable) {
-// tableMetadata.setVisible(true);
-// tableMetadata.setManaged(true);
-// VTable vTable = (VTable) value;
-// List columns = new ArrayList<>();
-// for (int n = 0; n < vTable.getColumnCount(); n++) {
-// columns.add(new VTableColumn(vTable, n));
-// }
-// columnsTable.setItems(FXCollections.observableList(columns));
-// } else {
- tableMetadata.setVisible(false);
- tableMetadata.setManaged(false);
- columnsTable.setItems(new ImmutableObservableList<>());
-// }
- }
-
- @FXML
- private void onInspectTable(ActionEvent event) {
-// VTableInspector.instpectValue((VTable) value);
- }
-
-}
+/**
+ * Copyright information and license terms for this software can be
+ * found in the file LICENSE.TXT included with the distribution.
+ */
+package org.epics.gpclient.javafx.tools;
+
+import static javafx.collections.FXCollections.emptyObservableList;
+import static javafx.collections.FXCollections.unmodifiableObservableList;
+
+import java.io.IOException;
+
+import org.epics.vtype.Alarm;
+import org.epics.vtype.Display;
+import org.epics.vtype.Time;
+import org.epics.vtype.VEnum;
+import org.epics.vtype.VType;
+
+import javafx.collections.FXCollections;
+
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.control.Button;
+import javafx.scene.control.ListView;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TitledPane;
+import javafx.scene.control.cell.PropertyValueFactory;
+
+public final class ValueViewer extends ScrollPane {
+
+ @FXML
+ private TitledPane commonMetadata;
+ @FXML
+ private TextField typeField;
+ @FXML
+ private TextField alarmField;
+ @FXML
+ private TextField timeField;
+ @FXML
+ private TitledPane numberMetadata;
+ @FXML
+ private TextField displayRangeField;
+ @FXML
+ private TextField alarmRangeField;
+ @FXML
+ private TextField warningRangeField;
+ @FXML
+ private TextField controlRangeField;
+ @FXML
+ private TextField unitField;
+ @FXML
+ private TitledPane enumMetadata;
+ @FXML
+ private TitledPane tableMetadata;
+ @FXML
+ private TableView columnsTable;
+ @FXML
+ private TableColumn columnNameColumn;
+ @FXML
+ private TableColumn columnTypeColumn;
+ @FXML
+ private TableColumn columnSizeColumn;
+ @FXML
+ private ListView labelsField;
+ @FXML
+ private Button inspectTableButton;
+
+ public ValueViewer() {
+ FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("ValueViewer.fxml"));
+
+ fxmlLoader.setRoot(this);
+ fxmlLoader.setController(this);
+
+ try {
+ fxmlLoader.load();
+ } catch (IOException exception) {
+ throw new RuntimeException(exception);
+ }
+
+ columnNameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
+ columnTypeColumn.setCellValueFactory(new PropertyValueFactory<>("type"));
+ columnSizeColumn.setCellValueFactory(new PropertyValueFactory<>("size"));
+
+ setValue(null, false);
+ }
+
+ private Object value;
+
+ public void setValue(Object value, boolean connection) {
+ commonMetadata(value, connection);
+ numberDisplay(Display.displayOf(value));
+ enumMetadata(value);
+ tableMetadata(value);
+ this.value = value;
+ }
+
+ private void commonMetadata(Object value, boolean connection) {
+ if (value == null) {
+ typeField.setText(null);
+ alarmField.setText(null);
+ timeField.setText(null);
+ } else {
+ Class> clazz = VType.typeOf(value);
+ if (clazz == null) {
+ typeField.setText(null);
+ } else {
+ typeField.setText(clazz.getSimpleName());
+ }
+ alarmField.setText(Alarm.alarmOf(value, connection).toString());
+ timeField.setText(Time.timeOf(value).toString());
+ }
+ }
+
+ private void numberDisplay(Display display) {
+ if (display == null || display.equals(Display.none())) {
+ numberMetadata.setVisible(false);
+ numberMetadata.setManaged(false);
+ } else {
+ numberMetadata.setVisible(true);
+ numberMetadata.setManaged(true);
+ displayRangeField.setText(display.getDisplayRange().toString());
+ alarmRangeField.setText(display.getAlarmRange().toString());
+ warningRangeField.setText(display.getWarningRange().toString());
+ controlRangeField.setText(display.getControlRange().toString());
+ unitField.setText(display.getUnit());
+ }
+ }
+
+ private void enumMetadata(Object value) {
+ if (value instanceof VEnum) {
+ enumMetadata.setVisible(true);
+ enumMetadata.setManaged(true);
+ labelsField.setItems(FXCollections.observableList(((VEnum) value).getDisplay().getChoices()));
+ } else {
+ enumMetadata.setVisible(false);
+ enumMetadata.setManaged(false);
+ }
+ }
+
+ public static class VTableColumn {
+ private final Object vTable;
+ private final int columnIndex;
+
+ public VTableColumn(Object vTable, int columnIndex) {
+ this.vTable = vTable;
+ this.columnIndex = columnIndex;
+ }
+
+ public String getName() {
+// return vTable.getColumnName(columnIndex);
+ return "None";
+ }
+
+ public String getType() {
+// return vTable.getColumnType(columnIndex).getSimpleName();
+ return "None";
+ }
+
+ public int getSize() {
+// Object data = vTable.getColumnData(columnIndex);
+// if (data instanceof ListNumber) {
+// return ((ListNumber) data).size();
+// } else if (data instanceof List) {
+// return ((List) data).size();
+// } else {
+// return 0;
+// }
+ return 0;
+ }
+
+
+ }
+//
+ private void tableMetadata(Object value) {
+// if (value instanceof org.diirt.vtype.VTable) {
+// tableMetadata.setVisible(true);
+// tableMetadata.setManaged(true);
+// VTable vTable = (VTable) value;
+// List columns = new ArrayList<>();
+// for (int n = 0; n < vTable.getColumnCount(); n++) {
+// columns.add(new VTableColumn(vTable, n));
+// }
+// columnsTable.setItems(FXCollections.observableList(columns));
+// } else {
+ tableMetadata.setVisible(false);
+ tableMetadata.setManaged(false);
+ columnsTable.setItems(unmodifiableObservableList(emptyObservableList()));
+// }
+ }
+
+ @FXML
+ private void onInspectTable(ActionEvent event) {
+// VTableInspector.instpectValue((VTable) value);
+ }
+
+}
diff --git a/gpclient/gpclient-sample/src/test/java/org/epics/gpclient/sample/WriteTest.java b/gpclient/gpclient-sample/src/test/java/org/epics/gpclient/sample/WriteTest.java
index c091895d7..1d80d1620 100644
--- a/gpclient/gpclient-sample/src/test/java/org/epics/gpclient/sample/WriteTest.java
+++ b/gpclient/gpclient-sample/src/test/java/org/epics/gpclient/sample/WriteTest.java
@@ -1,143 +1,143 @@
-/**
- * Copyright information and license terms for this software can be
- * found in the file LICENSE.TXT included with the distribution.
- */
-package org.epics.gpclient.sample;
-
-import java.time.Duration;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicReference;
-import org.epics.gpclient.PV;
-import org.epics.gpclient.PVEvent;
-import org.epics.gpclient.PVEventRecorder;
-import static org.epics.gpclient.PVEventRecorder.*;
-import static org.epics.gpclient.PVEvent.Type.*;
-import org.epics.gpclient.PVListener;
-import org.epics.gpclient.PVWriter;
-import org.epics.gpclient.datasource.ReadOnlyChannelException;
-import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.hamcrest.Matchers.*;
-import org.epics.vtype.VString;
-import org.epics.vtype.VType;
-
-/**
- *
- * @author carcassi
- */
-public class WriteTest extends BlackBoxTestBase {
-
- @Test
- public void writeInexistentChannel() {
- PVEventRecorder recorder = new PVEventRecorder();
- PV pv = gpClient.readAndWrite("none://nothing")
- .addListener(recorder)
- .start();
- recorder.dontExpect(500, anEventOfType(READ_CONNECTION));
- recorder.wait(1000, anEventOfType(EXCEPTION));
- assertThat(pv.isWriteConnected(), equalTo(false));
- }
-
- @Test
- public void writeReadOnlyChannel() {
- for (int i = 0; i < 100; i++) {
- PVEventRecorder recorder = new PVEventRecorder();
- PV pv = gpClient.readAndWrite("sim://ramp")
- .addListener(recorder)
- .start();
- recorder.wait(1000, anEventOfType(READ_CONNECTION));
- recorder.wait(1000, anEventOfType(EXCEPTION));
- assertThat(pv.isConnected(), equalTo(true));
- assertThat(pv.isWriteConnected(), equalTo(false));
- assertThat(recorder.getEvents().get(recorder.getEvents().size() - 1).getException(), instanceOf(ReadOnlyChannelException.class));
- }
- }
-
- @Test(expected = RuntimeException.class)
- public void writeDisconnectedChannel() {
- PV pv = gpClient.readAndWrite("loc://writeDisconnectedChannel")
- .addListener((PVListener) (PVEvent event, PV pv1) -> {
- // Do nothing
- })
- .start();
-// assertThat(pv.isWriteConnected(), equalTo(false));
- pv.write("Value");
- }
-
- @Test(expected = RuntimeException.class)
- public void writeDisconnectedChannelAsynch() {
- PV pv = gpClient.readAndWrite("loc://writeDisconnectedChannelAsynch")
- .addListener((PVEvent event, PV pv1) -> {
- // Do nothing
- })
- .start();
-// assertThat(pv.isWriteConnected(), equalTo(false));
- pv.write("Value", (PVEvent event, PVWriter