From 6953869c87c51e0b4048476d4596a497a40e13ab Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 9 Oct 2016 14:04:26 +0300 Subject: [PATCH] Separated FX fragments from FX windows --- numass-control/cryotemp/build.gradle | 4 +- .../java/inr/numass/cryotemp/PKT8App.java | 12 +++- .../inr/numass/cryotemp/PKT8Controller.java | 7 ++- .../inr/numass/cryotemp/PKT8PlotFragment.java | 55 +++++-------------- .../control/msp/fx/MspViewController.java | 5 +- .../readvac/fx/VacCollectorController.java | 5 +- .../workbench/NumassWorkbenchController.java | 7 ++- .../numass/scripts/TestStorageAccess.groovy | 14 +---- .../src/main/java/inr/numass/client/Cli.java | 14 ++--- .../java/inr/numass/client/NumassClient.java | 43 ++++++--------- .../numass/client/RemoteNumassStorage.java | 50 +++++++++++++++++ .../numass/viewer/MainViewerController.java | 7 ++- 12 files changed, 120 insertions(+), 103 deletions(-) create mode 100644 numass-storage/numass-client/src/main/java/inr/numass/client/RemoteNumassStorage.java diff --git a/numass-control/cryotemp/build.gradle b/numass-control/cryotemp/build.gradle index 73fc1ae9..b047f232 100644 --- a/numass-control/cryotemp/build.gradle +++ b/numass-control/cryotemp/build.gradle @@ -8,8 +8,8 @@ mainClassName = mainClass //mainClassName = "inr.numass.readvac.Main" dependencies { - compile 'commons-cli:commons-cli:1.3' - compile 'de.jensd:shichimifx:1.0.5' +// compile 'commons-cli:commons-cli:1.3' +// compile 'de.jensd:shichimifx:1.0.5' compile project(':dataforge-control') compile project(':dataforge-storage') compile project(':dataforge-plots:plots-jfc') diff --git a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8App.java b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8App.java index 3a2319da..bcd67588 100644 --- a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8App.java +++ b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8App.java @@ -19,9 +19,11 @@ import ch.qos.logback.classic.Level; import hep.dataforge.control.connections.Roles; import hep.dataforge.control.connections.StorageConnection; import hep.dataforge.exceptions.ControlException; +import hep.dataforge.exceptions.StorageException; import hep.dataforge.io.MetaFileReader; import hep.dataforge.meta.Meta; import hep.dataforge.meta.MetaUtils; +import hep.dataforge.storage.api.Storage; import hep.dataforge.storage.commons.StorageFactory; import hep.dataforge.storage.commons.StorageManager; import javafx.application.Application; @@ -95,7 +97,15 @@ public class PKT8App extends Application { // setting up storage connections if (config.hasNode("storage")) { config.getNodes("storage").forEach(node -> { - device.connect(new StorageConnection(StorageFactory.buildStorage(device.getContext(), node)), Roles.STORAGE_ROLE); + Storage storage = StorageFactory.buildStorage(device.getContext(), node); + if(config.hasValue("numass.run")){ + try { + storage = storage.buildShelf(config.getString("numass.run"), Meta.empty()); + } catch (StorageException e) { + throw new RuntimeException(e); + } + } + device.connect(new StorageConnection(storage), Roles.STORAGE_ROLE); }); } diff --git a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8Controller.java b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8Controller.java index 25b44d9c..d98a00db 100644 --- a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8Controller.java +++ b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8Controller.java @@ -6,7 +6,8 @@ import hep.dataforge.control.measurements.Measurement; import hep.dataforge.control.measurements.MeasurementListener; import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.MeasurementException; -import hep.dataforge.fx.ConsoleFragment; +import hep.dataforge.fx.fragments.ConsoleFragment; +import hep.dataforge.fx.fragments.FragmentWindow; import hep.dataforge.values.Value; import javafx.application.Platform; import javafx.event.ActionEvent; @@ -59,9 +60,9 @@ public class PKT8Controller implements Initializable, DeviceListener, Measuremen @Override public void initialize(URL location, ResourceBundle resources) { this.consoleFragment = new ConsoleFragment(); - consoleFragment.bindTo(consoleButton); + new FragmentWindow(consoleFragment).bindTo(consoleButton); plotFragment = new PKT8PlotFragment(device); - plotFragment.bindTo(plotButton); + new FragmentWindow(plotFragment).bindTo(plotButton); sensorColumn.setCellValueFactory(new PropertyValueFactory<>("channel")); resColumn.setCellValueFactory(new PropertyValueFactory<>("rawString")); diff --git a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8PlotFragment.java b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8PlotFragment.java index d8b77554..45ddbf22 100644 --- a/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8PlotFragment.java +++ b/numass-control/cryotemp/src/main/java/inr/numass/cryotemp/PKT8PlotFragment.java @@ -1,47 +1,34 @@ package inr.numass.cryotemp; -import hep.dataforge.fx.FXFragment; +import hep.dataforge.fx.fragments.Fragment; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.stage.Stage; -import javafx.stage.Window; import java.io.IOException; /** * Created by darksnake on 07-Oct-16. */ -public class PKT8PlotFragment extends FXFragment { +public class PKT8PlotFragment extends Fragment { private final PKT8Device device; private PKT8PlotController plotController; public PKT8PlotFragment(PKT8Device device) { + super("PKT8 cryogenic temperature viewer", 600, 400); this.device = device; - } - - public PKT8PlotFragment(Window window, PKT8Device device) { - super(window); - this.device = device; + showingProperty().addListener((observable, oldValue, newValue) -> { + if (device.isMeasuring()) { + if (newValue) { + device.getMeasurement().addListener(plotController); + } else { + device.getMeasurement().removeListener(plotController); + } + } + }); } @Override - protected Stage buildStage(Parent root) { - Stage stage = new Stage(); - Scene scene = new Scene(root, 600, 400); - - - stage.setTitle("PKT8 cryogenic temperature viewer"); - stage.setScene(scene); - stage.setMinHeight(400); - stage.setMinWidth(600); - stage.sizeToScene(); - - return stage; - } - - @Override - protected Parent getRoot() { + protected Parent buildRoot() { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/PKT8Plot.fxml")); plotController = new PKT8PlotController(device); loader.setController(plotController); @@ -51,20 +38,4 @@ public class PKT8PlotFragment extends FXFragment { throw new RuntimeException(e); } } - - @Override - protected void onShow() { - super.onShow(); - if (device.isMeasuring()) { - device.getMeasurement().addListener(plotController); - } - } - - @Override - protected void onHide() { - super.onHide(); - if (device.isMeasuring()) { - device.getMeasurement().removeListener(plotController); - } - } } diff --git a/numass-control/msp/src/main/java/inr/numass/control/msp/fx/MspViewController.java b/numass-control/msp/src/main/java/inr/numass/control/msp/fx/MspViewController.java index fef99a59..84f16983 100644 --- a/numass-control/msp/src/main/java/inr/numass/control/msp/fx/MspViewController.java +++ b/numass-control/msp/src/main/java/inr/numass/control/msp/fx/MspViewController.java @@ -22,7 +22,8 @@ import hep.dataforge.control.connections.StorageConnection; import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.PortException; import hep.dataforge.exceptions.StorageException; -import hep.dataforge.fx.ConsoleFragment; +import hep.dataforge.fx.fragments.ConsoleFragment; +import hep.dataforge.fx.fragments.FragmentWindow; import hep.dataforge.io.MetaFileReader; import hep.dataforge.meta.ConfigChangeListener; import hep.dataforge.meta.Configuration; @@ -124,7 +125,7 @@ public class MspViewController implements Initializable, MspListener { @Override public void initialize(URL url, ResourceBundle rb) { logArea = new ConsoleFragment(); - logArea.bindTo(consoleButton); + new FragmentWindow(logArea).bindTo(consoleButton); fillamentSelector.setItems(FXCollections.observableArrayList(1, 2)); fillamentSelector.setConverter(new StringConverter() { @Override diff --git a/numass-control/vac/src/main/java/inr/numass/readvac/fx/VacCollectorController.java b/numass-control/vac/src/main/java/inr/numass/readvac/fx/VacCollectorController.java index 9bfe212c..39ae68c8 100644 --- a/numass-control/vac/src/main/java/inr/numass/readvac/fx/VacCollectorController.java +++ b/numass-control/vac/src/main/java/inr/numass/readvac/fx/VacCollectorController.java @@ -14,7 +14,8 @@ import hep.dataforge.control.measurements.MeasurementListener; import hep.dataforge.control.measurements.Sensor; import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.MeasurementException; -import hep.dataforge.fx.ConsoleFragment; +import hep.dataforge.fx.fragments.ConsoleFragment; +import hep.dataforge.fx.fragments.FragmentWindow; import hep.dataforge.meta.Meta; import hep.dataforge.meta.MetaBuilder; import hep.dataforge.plots.data.TimePlottable; @@ -111,7 +112,7 @@ public class VacCollectorController implements Initializable, DeviceListener, Me }); consoleWindow = new ConsoleFragment(); - consoleWindow.bindTo(logButton); + new FragmentWindow(consoleWindow).bindTo(logButton); consoleWindow.hookStd(); } diff --git a/numass-main/src/main/java/inr/numass/workbench/NumassWorkbenchController.java b/numass-main/src/main/java/inr/numass/workbench/NumassWorkbenchController.java index ffcb1110..210d2df2 100644 --- a/numass-main/src/main/java/inr/numass/workbench/NumassWorkbenchController.java +++ b/numass-main/src/main/java/inr/numass/workbench/NumassWorkbenchController.java @@ -16,10 +16,11 @@ import hep.dataforge.data.FileDataFactory; import hep.dataforge.description.ActionDescriptor; import hep.dataforge.description.DescriptorUtils; import hep.dataforge.exceptions.NameNotFoundException; -import hep.dataforge.fx.ConsoleFragment; import hep.dataforge.fx.FXDataOutputPane; import hep.dataforge.fx.FXReportListener; import hep.dataforge.fx.configuration.MetaEditor; +import hep.dataforge.fx.fragments.ConsoleFragment; +import hep.dataforge.fx.fragments.FragmentWindow; import hep.dataforge.fx.work.WorkManagerFragment; import hep.dataforge.io.IOManager; import hep.dataforge.io.MetaFileReader; @@ -117,12 +118,12 @@ public class NumassWorkbenchController implements Initializable, StagePaneHolder logTab.setContent(logPane.getRoot()); ConsoleFragment consoleWindow = new ConsoleFragment(); - consoleWindow.bindTo(consoleButton); + new FragmentWindow(consoleWindow).bindTo(consoleButton); consoleWindow.addRootLogHandler(); consoleWindow.hookStd(); processWindow = new WorkManagerFragment(); - processWindow.bindTo(processButton); + new FragmentWindow(processWindow).bindTo(processButton); isRunning.addListener((ObservableValue observable, Boolean oldValue, Boolean newValue) -> { runButton.setSelected(newValue); diff --git a/numass-storage/numass-client/src/main/groovy/inr/numass/scripts/TestStorageAccess.groovy b/numass-storage/numass-client/src/main/groovy/inr/numass/scripts/TestStorageAccess.groovy index 0f1aa48e..9818f70e 100644 --- a/numass-storage/numass-client/src/main/groovy/inr/numass/scripts/TestStorageAccess.groovy +++ b/numass-storage/numass-client/src/main/groovy/inr/numass/scripts/TestStorageAccess.groovy @@ -6,23 +6,15 @@ package inr.numass.scripts -import hep.dataforge.io.MetaStreamReader import hep.dataforge.io.MetaStreamWriter import hep.dataforge.io.envelopes.Envelope -import hep.dataforge.io.envelopes.EnvelopeBuilder import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder import hep.dataforge.storage.commons.JSONMetaWriter -import hep.dataforge.storage.commons.StorageManager -import java.io.RandomAccessFile; -import java.nio.ByteBuffer -import inr.numass.client.NumassClient -import java.nio.MappedByteBuffer -import java.nio.channels.FileChannel import hep.dataforge.storage.commons.LoaderFactory -import hep.dataforge.meta.MetaBuilder +import hep.dataforge.storage.commons.StorageManager import hep.dataforge.tables.MapPoint - +import inr.numass.client.NumassClient new StorageManager().startGlobal(); @@ -57,7 +49,7 @@ new NumassClient("127.0.0.1",8335).withCloseable{ .build(); - def response = it.sendAndRecieve(bin); + def response = it.respond(bin); println parser.writeString(response.meta()); diff --git a/numass-storage/numass-client/src/main/java/inr/numass/client/Cli.java b/numass-storage/numass-client/src/main/java/inr/numass/client/Cli.java index 79c3d3d6..88954429 100644 --- a/numass-storage/numass-client/src/main/java/inr/numass/client/Cli.java +++ b/numass-storage/numass-client/src/main/java/inr/numass/client/Cli.java @@ -8,19 +8,15 @@ package inr.numass.client; import hep.dataforge.meta.Meta; import hep.dataforge.storage.commons.StorageManager; import hep.dataforge.values.Value; +import org.apache.commons.cli.*; +import org.slf4j.LoggerFactory; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.slf4j.LoggerFactory; /** - * * @author Alexander Nozik */ public class Cli { @@ -137,8 +133,8 @@ public class Cli { private static Options buildOptions() { Options options = new Options(); - options.addOption("a", true, "IP address of the server. Default: 192.168.111.1"); - options.addOption("p", true, "Server port. Default: 8335"); + options.addOption("a", "ip", true, "IP address of the server. Default: 192.168.111.1"); + options.addOption("p", "port", true, "Server port. Default: 8335"); return options; } diff --git a/numass-storage/numass-client/src/main/java/inr/numass/client/NumassClient.java b/numass-storage/numass-client/src/main/java/inr/numass/client/NumassClient.java index fa3869ba..a0e052b7 100644 --- a/numass-storage/numass-client/src/main/java/inr/numass/client/NumassClient.java +++ b/numass-storage/numass-client/src/main/java/inr/numass/client/NumassClient.java @@ -15,22 +15,17 @@ */ package inr.numass.client; -import hep.dataforge.io.envelopes.DefaultEnvelopeReader; -import hep.dataforge.io.envelopes.DefaultEnvelopeWriter; -import hep.dataforge.io.envelopes.Envelope; -import hep.dataforge.io.envelopes.EnvelopeBuilder; +import hep.dataforge.io.envelopes.*; import hep.dataforge.meta.Meta; import hep.dataforge.meta.MetaBuilder; import hep.dataforge.storage.commons.MessageFactory; import hep.dataforge.storage.commons.StorageUtils; import hep.dataforge.values.Value; import inr.numass.storage.NumassStorage; -import java.io.Closeable; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import org.slf4j.LoggerFactory; +import org.zeroturnaround.zip.ZipUtil; + +import java.io.*; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; @@ -39,14 +34,11 @@ import java.time.Instant; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import org.slf4j.LoggerFactory; -import org.zeroturnaround.zip.ZipUtil; /** - * * @author darksnake */ -public class NumassClient extends MessageFactory implements Closeable { +public class NumassClient extends MessageFactory implements AutoCloseable, Responder { Socket socket; @@ -63,7 +55,8 @@ public class NumassClient extends MessageFactory implements Closeable { socket.close(); } - public Envelope sendAndRecieve(Envelope message) { + @Override + public Envelope respond(Envelope message) { try { write(message, socket.getOutputStream()); return read(socket.getInputStream()); @@ -87,17 +80,17 @@ public class NumassClient extends MessageFactory implements Closeable { } public Meta getCurrentRun() { - return sendAndRecieve(requestActionBase("numass.run", "get").build()).meta(); + return respond(requestActionBase("numass.run", "get").build()).meta(); } public Meta startRun(String name) { - return sendAndRecieve(requestActionBase("numass.run", "start") + return respond(requestActionBase("numass.run", "start") .putMetaValue("path", name) .build()).meta(); } public Meta resetRun() { - return sendAndRecieve(requestActionBase("numass.run", "reset") + return respond(requestActionBase("numass.run", "reset") .build()).meta(); } @@ -132,7 +125,7 @@ public class NumassClient extends MessageFactory implements Closeable { .setData(buffer) .build(); - return sendAndRecieve(bin).meta(); + return respond(bin).meta(); } catch (IOException ex) { return StorageUtils.getErrorMeta(ex); } @@ -142,7 +135,7 @@ public class NumassClient extends MessageFactory implements Closeable { * Get state map for given state names from the root state loader. If * stateNames is empty, return all states. * - * @param stateName + * @param stateNames * @return */ public Map getStates(String... stateNames) { @@ -152,7 +145,7 @@ public class NumassClient extends MessageFactory implements Closeable { env.putMetaValue("name", Arrays.asList(stateNames)); } - Meta response = sendAndRecieve(env.build()).meta(); + Meta response = respond(env.build()).meta(); if (response.getBoolean("success", true)) { Map res = new HashMap<>(); response.getNodes("state").stream().forEach((stateMeta) -> { @@ -178,7 +171,7 @@ public class NumassClient extends MessageFactory implements Closeable { .setValue("value", value) .build()); - return sendAndRecieve(env.build()).meta(); + return respond(env.build()).meta(); } /** @@ -195,7 +188,7 @@ public class NumassClient extends MessageFactory implements Closeable { .setValue("value", state.getValue()) .build()); }); - return sendAndRecieve(env.build()).meta(); + return respond(env.build()).meta(); } public Meta addNote(String text, Instant time) { @@ -204,7 +197,7 @@ public class NumassClient extends MessageFactory implements Closeable { if (time != null) { env.putMetaValue("note.time", time); } - return sendAndRecieve(env.build()).meta(); + return respond(env.build()).meta(); } public Meta getNotes(int limit) { @@ -212,7 +205,7 @@ public class NumassClient extends MessageFactory implements Closeable { if (limit > 0) { env.putMetaValue("limit", limit); } - return sendAndRecieve(env.build()).meta(); + return respond(env.build()).meta(); } diff --git a/numass-storage/numass-client/src/main/java/inr/numass/client/RemoteNumassStorage.java b/numass-storage/numass-client/src/main/java/inr/numass/client/RemoteNumassStorage.java new file mode 100644 index 00000000..96765fb0 --- /dev/null +++ b/numass-storage/numass-client/src/main/java/inr/numass/client/RemoteNumassStorage.java @@ -0,0 +1,50 @@ +package inr.numass.client; + +import hep.dataforge.exceptions.StorageException; +import hep.dataforge.meta.Meta; +import hep.dataforge.storage.api.Loader; +import hep.dataforge.storage.api.Storage; +import hep.dataforge.storage.commons.AbstractStorage; + +import java.io.IOException; + +/** + * Created by darksnake on 09-Oct-16. + */ +public class RemoteNumassStorage extends AbstractStorage { + private NumassClient client; + + + private RemoteNumassStorage(Storage parent, String name, Meta annotation) { + super(parent, name, annotation); + } + + public RemoteNumassStorage(String name) { + super(name); + } + + private String getIP() { + return meta().getString("numass.server.ip", "192.168.111.1"); + } + + private int getPort() { + return meta().getInt("numass.server.port", 8335); + } + + private NumassClient getClient() throws IOException { + if (client == null) { + client = new NumassClient(getIP(), getPort()); + } + return client; + } + + @Override + public Loader buildLoader(Meta loaderConfiguration) throws StorageException { + return null; + } + + @Override + public Storage buildShelf(String shelfName, Meta shelfConfiguration) throws StorageException { + return new RemoteNumassStorage(this, shelfName, shelfConfiguration); + } +} diff --git a/numass-viewer/src/main/java/inr/numass/viewer/MainViewerController.java b/numass-viewer/src/main/java/inr/numass/viewer/MainViewerController.java index a924bbc1..f6331b08 100644 --- a/numass-viewer/src/main/java/inr/numass/viewer/MainViewerController.java +++ b/numass-viewer/src/main/java/inr/numass/viewer/MainViewerController.java @@ -19,7 +19,8 @@ import hep.dataforge.computation.ProgressCallback; import hep.dataforge.context.Context; import hep.dataforge.context.GlobalContext; import hep.dataforge.exceptions.StorageException; -import hep.dataforge.fx.ConsoleFragment; +import hep.dataforge.fx.fragments.ConsoleFragment; +import hep.dataforge.fx.fragments.FragmentWindow; import hep.dataforge.fx.work.WorkManagerFragment; import inr.numass.NumassProperties; import inr.numass.storage.NumassData; @@ -102,8 +103,8 @@ public class MainViewerController implements Initializable { public void initialize(URL url, ResourceBundle rb) { ConsoleFragment consoleFragment = new ConsoleFragment(); consoleFragment.hookStd(); - consoleFragment.bindTo(consoleButton); - WorkManagerFragment.attachToContext(GlobalContext.instance()).bindTo(processManagerButton); + new FragmentWindow(consoleFragment).bindTo(consoleButton); + new FragmentWindow(WorkManagerFragment.attachToContext(GlobalContext.instance())).bindTo(processManagerButton); mspController = new MspViewController(getContext()); this.mspTab.setContent(mspController.getRoot());