mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2024-11-25 08:32:32 +00:00
Start Tethys GUI
This commit is contained in:
parent
b344b775ec
commit
f51a519d82
@ -1,7 +1,12 @@
|
|||||||
package tethys;
|
package tethys;
|
||||||
|
|
||||||
|
import java.awt.Desktop;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
@ -10,17 +15,20 @@ import javax.swing.JMenuItem;
|
|||||||
|
|
||||||
import PamController.PamControlledUnit;
|
import PamController.PamControlledUnit;
|
||||||
import PamController.PamController;
|
import PamController.PamController;
|
||||||
|
import PamView.PamTabPanel;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import metadata.MetaDataContol;
|
import metadata.MetaDataContol;
|
||||||
import metadata.deployment.DeploymentData;
|
import metadata.deployment.DeploymentData;
|
||||||
import nilus.Deployment.Instrument;
|
import nilus.Deployment.Instrument;
|
||||||
import tethys.dbxml.DBXMLConnect;
|
import tethys.dbxml.DBXMLConnect;
|
||||||
|
import tethys.dbxml.DBXMLQueries;
|
||||||
//import nilus.Deployment;
|
//import nilus.Deployment;
|
||||||
//import nilus.Deployment.Instrument;
|
//import nilus.Deployment.Instrument;
|
||||||
import tethys.output.StreamExportParams;
|
import tethys.output.StreamExportParams;
|
||||||
import tethys.output.TethysExportParams;
|
import tethys.output.TethysExportParams;
|
||||||
import tethys.output.TethysExporter;
|
import tethys.output.TethysExporter;
|
||||||
import tethys.output.swing.TethysExportDialog;
|
import tethys.output.swing.TethysExportDialog;
|
||||||
|
import tethys.swing.TethysTabPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Quick play with a simple system for outputting data to Tethys. At it's start
|
* Quick play with a simple system for outputting data to Tethys. At it's start
|
||||||
@ -39,10 +47,18 @@ public class TethysControl extends PamControlledUnit {
|
|||||||
private TethysExportParams tethysExportParams = new TethysExportParams();
|
private TethysExportParams tethysExportParams = new TethysExportParams();
|
||||||
|
|
||||||
private DBXMLConnect dbxmlConnect;
|
private DBXMLConnect dbxmlConnect;
|
||||||
|
|
||||||
|
private TethysTabPanel tethysTabPanel;
|
||||||
|
|
||||||
|
private DBXMLQueries dbxmlQueries;
|
||||||
|
|
||||||
|
private ArrayList<TethysStateObserver> stateObservers;
|
||||||
|
|
||||||
public TethysControl(String unitName) {
|
public TethysControl(String unitName) {
|
||||||
super(unitType, unitName);
|
super(unitType, unitName);
|
||||||
|
stateObservers = new ArrayList();
|
||||||
dbxmlConnect = new DBXMLConnect(this);
|
dbxmlConnect = new DBXMLConnect(this);
|
||||||
|
dbxmlQueries = new DBXMLQueries(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,15 +76,51 @@ public class TethysControl extends PamControlledUnit {
|
|||||||
JMenuItem tethysExport = new JMenuItem("Export ...");
|
JMenuItem tethysExport = new JMenuItem("Export ...");
|
||||||
tethysMenu.add(tethysExport);
|
tethysMenu.add(tethysExport);
|
||||||
tethysExport.addActionListener(new ActionListener() {
|
tethysExport.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
tethysExport(parentFrame);
|
tethysExport(parentFrame);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
JMenuItem openClient = new JMenuItem("Open client in browser");
|
||||||
|
openClient.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
openTethysClient();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tethysMenu.add(openClient);
|
||||||
return tethysMenu;
|
return tethysMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void openTethysClient() {
|
||||||
|
String urlString = tethysExportParams.getFullServerName() + "/Client";
|
||||||
|
System.out.println("Opening url " + urlString);
|
||||||
|
URL url = null;
|
||||||
|
try {
|
||||||
|
url = new URL(urlString);
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (url == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().browse(url.toURI());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PamTabPanel getTabPanel() {
|
||||||
|
if (tethysTabPanel == null) {
|
||||||
|
tethysTabPanel = new TethysTabPanel(this);
|
||||||
|
}
|
||||||
|
return tethysTabPanel;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the tethysExportParams
|
* @return the tethysExportParams
|
||||||
*/
|
*/
|
||||||
@ -124,7 +176,33 @@ public class TethysControl extends PamControlledUnit {
|
|||||||
|
|
||||||
return deploymentData;
|
return deploymentData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new state observer.
|
||||||
|
* @param stateObserver
|
||||||
|
*/
|
||||||
|
public void addStateObserver(TethysStateObserver stateObserver) {
|
||||||
|
stateObservers.add(stateObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a state observer.
|
||||||
|
* @param stateObserver
|
||||||
|
* @return true if it existed.
|
||||||
|
*/
|
||||||
|
public boolean removeStateObserver(TethysStateObserver stateObserver) {
|
||||||
|
return stateObservers.remove(stateObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send state updates around to all state observers.
|
||||||
|
* @param tethysState
|
||||||
|
*/
|
||||||
|
public void sendStateUpdate(TethysState tethysState) {
|
||||||
|
for (TethysStateObserver stateObserver : this.stateObservers) {
|
||||||
|
stateObserver.updateState(tethysState);
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* A name for any deta selectors.
|
* A name for any deta selectors.
|
||||||
* @return
|
* @return
|
||||||
@ -133,4 +211,8 @@ public class TethysControl extends PamControlledUnit {
|
|||||||
return getUnitName();
|
return getUnitName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DBXMLQueries getDbxmlQueries() {
|
||||||
|
return dbxmlQueries;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
19
src/tethys/TethysState.java
Normal file
19
src/tethys/TethysState.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package tethys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basis for a message system which will get passed around whenever something happens in
|
||||||
|
* Tethys, whether it be a new connection, progress during data output, etc.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TethysState {
|
||||||
|
|
||||||
|
public enum StateType {UPDATESERVER, TRANSFERDATA};
|
||||||
|
|
||||||
|
public StateType stateType;
|
||||||
|
|
||||||
|
public TethysState(StateType stateType) {
|
||||||
|
super();
|
||||||
|
this.stateType = stateType;
|
||||||
|
}
|
||||||
|
}
|
13
src/tethys/TethysStateObserver.java
Normal file
13
src/tethys/TethysStateObserver.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package tethys;
|
||||||
|
|
||||||
|
public interface TethysStateObserver {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Receive state updates when Tethys has done something (made a connection, moved some data, etc.)<br>
|
||||||
|
* Note that this is for RECEIVING state updates, not for sending them. To avoid infinite notifications
|
||||||
|
* loops, use tethysControl.sendStateUpdate(TethysState) if this component knows something.
|
||||||
|
* @param tethysState
|
||||||
|
*/
|
||||||
|
public void updateState(TethysState tethysState);
|
||||||
|
|
||||||
|
}
|
@ -9,6 +9,7 @@ import javax.xml.bind.JAXBException;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import dbxml.JerseyClient;
|
||||||
import dbxml.uploader.Importer;
|
import dbxml.uploader.Importer;
|
||||||
import nilus.Deployment;
|
import nilus.Deployment;
|
||||||
import nilus.MarshalXML;
|
import nilus.MarshalXML;
|
||||||
@ -113,6 +114,22 @@ public class DBXMLConnect {
|
|||||||
public void closeDatabase() {
|
public void closeDatabase() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the server state via a ping ?
|
||||||
|
* @return String descritption of state ?
|
||||||
|
*/
|
||||||
|
public ServerStatus pingServer() {
|
||||||
|
JerseyClient jerseyClient = new JerseyClient(tethysControl.getTethysExportParams().getFullServerName());
|
||||||
|
boolean ok = false;
|
||||||
|
try {
|
||||||
|
ok = jerseyClient.ping();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
return new ServerStatus(false, ex);
|
||||||
|
}
|
||||||
|
return new ServerStatus(ok, null);
|
||||||
|
}
|
||||||
|
|
||||||
// add whatever calls are necessary ...
|
// add whatever calls are necessary ...
|
||||||
|
|
||||||
|
119
src/tethys/dbxml/DBXMLQueries.java
Normal file
119
src/tethys/dbxml/DBXMLQueries.java
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package tethys.dbxml;
|
||||||
|
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
import dbxml.JerseyClient;
|
||||||
|
import tethys.TethysControl;
|
||||||
|
import tethys.output.TethysExportParams;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some standard queries we're going to want to make from various
|
||||||
|
* parts of the system as the user interracts with the GUI.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DBXMLQueries {
|
||||||
|
|
||||||
|
private TethysControl tethysControl;
|
||||||
|
|
||||||
|
public DBXMLQueries(TethysControl tethysControl) {
|
||||||
|
super();
|
||||||
|
this.tethysControl = tethysControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<String> getProjectNames() {
|
||||||
|
DBXMLConnect dbxmlConnect = tethysControl.getDbxmlConnect();
|
||||||
|
ServerStatus serverStatus = dbxmlConnect.pingServer();
|
||||||
|
if (serverStatus.ok == false) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Document doc = null;
|
||||||
|
|
||||||
|
TethysExportParams params = tethysControl.getTethysExportParams();
|
||||||
|
|
||||||
|
try {
|
||||||
|
JerseyClient jerseyClient = new JerseyClient(params.getFullServerName());
|
||||||
|
|
||||||
|
String testJson = "{\"return\":[\"Deployment/Project\"],\"select\":[],\"enclose\":1}";
|
||||||
|
// web browse to http://localhost:9779/Client
|
||||||
|
|
||||||
|
String testResult = jerseyClient.queryJSON(testJson);
|
||||||
|
|
||||||
|
doc = convertStringToXMLDocument(testResult);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (doc == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<String> projectNames = new ArrayList<>();
|
||||||
|
// iterate through the document and make a list of names, then make them unique.
|
||||||
|
/* looking for elements like this:
|
||||||
|
*
|
||||||
|
* check out the jaxb unmarshaller ...
|
||||||
|
<Return>
|
||||||
|
<Deployment>
|
||||||
|
<Project>LJ</Project>
|
||||||
|
</Deployment>
|
||||||
|
</Return>
|
||||||
|
*/
|
||||||
|
NodeList returns = doc.getElementsByTagName("Return");
|
||||||
|
// System.out.println("N projects = " + returns.getLength());
|
||||||
|
int n = returns.getLength();
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Node aNode = returns.item(i);
|
||||||
|
if (aNode instanceof Element) {
|
||||||
|
Node depEl = ((Element) aNode).getFirstChild();
|
||||||
|
if (depEl == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (depEl instanceof Element) {
|
||||||
|
Element projEl = (Element) ((Element) depEl).getFirstChild();
|
||||||
|
String projName = projEl.getTextContent();
|
||||||
|
if (projName != null) {
|
||||||
|
if (projectNames.contains(projName) == false) {
|
||||||
|
projectNames.add(projName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.sort(projectNames);
|
||||||
|
|
||||||
|
return projectNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document convertStringToXMLDocument(String xmlString) {
|
||||||
|
//Parser that produces DOM object trees from XML content
|
||||||
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||||
|
|
||||||
|
//API to obtain DOM Document instance
|
||||||
|
DocumentBuilder builder = null;
|
||||||
|
try {
|
||||||
|
//Create DocumentBuilder with default configuration
|
||||||
|
builder = factory.newDocumentBuilder();
|
||||||
|
|
||||||
|
//Parse the content to Document object
|
||||||
|
Document doc = builder.parse(new InputSource(new StringReader(xmlString)));
|
||||||
|
return doc;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,24 @@
|
|||||||
package tethys.dbxml;
|
package tethys.dbxml;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.transform.Source;
|
||||||
|
import javax.xml.transform.Transformer;
|
||||||
|
import javax.xml.transform.TransformerConfigurationException;
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import javax.xml.transform.TransformerFactoryConfigurationError;
|
||||||
|
import javax.xml.transform.sax.SAXTransformerFactory;
|
||||||
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
import PamController.settings.output.xml.PamguardXMLWriter;
|
||||||
|
import PamUtils.XMLUtils;
|
||||||
import dbxml.JerseyClient;
|
import dbxml.JerseyClient;
|
||||||
import tethys.output.TethysExportParams;
|
import tethys.output.TethysExportParams;
|
||||||
|
|
||||||
@ -14,9 +33,57 @@ public class DMXMLQueryTest {
|
|||||||
|
|
||||||
JerseyClient jerseyClient = new JerseyClient(params.getFullServerName());
|
JerseyClient jerseyClient = new JerseyClient(params.getFullServerName());
|
||||||
|
|
||||||
|
// String testJson = "{\"return\":[\"Deployment/Project\",\"Deployment/DeploymentId\",\"Deployment/Site\",\"Deployment/DeploymentDetails/AudioTimeStamp\",\"Deployment/RecoveryDetails/AudioTimeStamp\"],\"select\":[],\"enclose\":1}";
|
||||||
|
// String testJson = "{\"return\":[\"Deployment/Project\",\"Deployment/Region\",\"Deployment/DeploymentDetails/AudioTimeStamp\",\"Deployment/RecoveryDetails/AudioTimeStamp\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Deployment/DeploymentId\",\"2\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
|
//String testJson = "{\"return\":[\"Deployment/Project\",\"Deployment/Region\",\"Deployment/DeploymentDetails/AudioTimeStamp\",\"Deployment/RecoveryDetails/AudioTimeStamp\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Deployment/DeploymentId\",\"2\"],\"optype\":\"binary\"},{\"op\":\"=\",\"operands\":[\"Deployment/Project\",\"DCLDE2022\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
|
// String testJson = "{\"return\":[\"Deployment/Project\",\"Deployment/Region\",\"Deployment/DeploymentDetails/AudioTimeStamp\",\"Deployment/RecoveryDetails/AudioTimeStamp\",\"Deployment/DeploymentId\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Deployment/DeploymentId\",\"2\"],\"optype\":\"binary\"},{\"op\":\"=\",\"operands\":[\"Deployment/Project\",\"DCLDE2022\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
|
String testJson = "{\"return\":[\"Deployment/Project\"],\"select\":[],\"enclose\":1}";
|
||||||
// web browse to http://localhost:9779/Client
|
// web browse to http://localhost:9779/Client
|
||||||
|
|
||||||
|
String testResult = jerseyClient.queryJSON(testJson);
|
||||||
|
|
||||||
|
Document doc = convertStringToXMLDocument(testResult);
|
||||||
|
|
||||||
|
PamguardXMLWriter pamXMLWriter = PamguardXMLWriter.getXMLWriter();
|
||||||
|
String formettedXML = pamXMLWriter.getAsString(doc, true);
|
||||||
|
|
||||||
|
System.out.println(testResult);
|
||||||
|
System.out.println(formettedXML);
|
||||||
|
// try {
|
||||||
|
// Transformer serializer = SAXTransformerFactory.newInstance()
|
||||||
|
// .newTransformer();
|
||||||
|
// Source source = new StreamSource(testResult);
|
||||||
|
// ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||||
|
// StreamResult res = new StreamResult(bytes);
|
||||||
|
// serializer.transform(source, res);
|
||||||
|
// System.out.println(bytes.toString());
|
||||||
|
// } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// // System.err.println(testResult);
|
||||||
|
// catch (TransformerException e) {
|
||||||
|
// // TODO Auto-generated catch block
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Document convertStringToXMLDocument(String xmlString) {
|
||||||
|
//Parser that produces DOM object trees from XML content
|
||||||
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||||
|
|
||||||
|
//API to obtain DOM Document instance
|
||||||
|
DocumentBuilder builder = null;
|
||||||
|
try {
|
||||||
|
//Create DocumentBuilder with default configuration
|
||||||
|
builder = factory.newDocumentBuilder();
|
||||||
|
|
||||||
|
//Parse the content to Document object
|
||||||
|
Document doc = builder.parse(new InputSource(new StringReader(xmlString)));
|
||||||
|
return doc;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
35
src/tethys/dbxml/ServerStatus.java
Normal file
35
src/tethys/dbxml/ServerStatus.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package tethys.dbxml;
|
||||||
|
|
||||||
|
public class ServerStatus {
|
||||||
|
|
||||||
|
public boolean ok;
|
||||||
|
|
||||||
|
public Exception error;
|
||||||
|
|
||||||
|
public ServerStatus(boolean ok, Exception error) {
|
||||||
|
super();
|
||||||
|
this.ok = ok;
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormatted() {
|
||||||
|
if (ok) {
|
||||||
|
return "Server OK";
|
||||||
|
}
|
||||||
|
if (error == null) {
|
||||||
|
return "Unknown error";
|
||||||
|
}
|
||||||
|
String msg = error.getLocalizedMessage();
|
||||||
|
if (msg.startsWith("Exception")) {
|
||||||
|
msg.substring(9);
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getFormatted();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -20,7 +20,7 @@ public class TethysExportParams implements Serializable, Cloneable{
|
|||||||
*/
|
*/
|
||||||
public String serverName = "http://localhost";
|
public String serverName = "http://localhost";
|
||||||
|
|
||||||
public String port = "9779";
|
public int port = 9779;
|
||||||
|
|
||||||
public String getFullServerName() {
|
public String getFullServerName() {
|
||||||
return serverName + ":" + port;
|
return serverName + ":" + port;
|
||||||
|
89
src/tethys/swing/SelectServerdDialog.java
Normal file
89
src/tethys/swing/SelectServerdDialog.java
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package tethys.swing;
|
||||||
|
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Window;
|
||||||
|
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.border.TitledBorder;
|
||||||
|
|
||||||
|
import PamView.dialog.PamDialog;
|
||||||
|
import PamView.dialog.PamGridBagContraints;
|
||||||
|
import tethys.TethysControl;
|
||||||
|
import tethys.output.TethysExportParams;
|
||||||
|
|
||||||
|
public class SelectServerdDialog extends PamDialog {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private JTextField serverHost, serverPort;
|
||||||
|
|
||||||
|
private TethysExportParams exportParams;
|
||||||
|
|
||||||
|
private static SelectServerdDialog singleInstance;
|
||||||
|
|
||||||
|
private SelectServerdDialog(TethysControl tethysControl, Window parentFrame) {
|
||||||
|
super(parentFrame, "Tethys Server", true);
|
||||||
|
JPanel mainPanel = new JPanel(new GridBagLayout());
|
||||||
|
mainPanel.setBorder(new TitledBorder("Tethys Server"));
|
||||||
|
GridBagConstraints c = new PamGridBagContraints();
|
||||||
|
mainPanel.add(new JLabel("Host: ", JLabel.RIGHT), c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(serverHost = new JTextField(20), c);
|
||||||
|
c.gridx = 0;
|
||||||
|
c.gridy++;
|
||||||
|
c.fill = GridBagConstraints.NONE;
|
||||||
|
mainPanel.add(new JLabel("Port: ", JLabel.RIGHT), c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(serverPort = new JTextField(4), c);
|
||||||
|
|
||||||
|
setDialogComponent(mainPanel);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final TethysExportParams showDialog(TethysControl tethysControl, Window parentFrame, TethysExportParams exportParams) {
|
||||||
|
if (singleInstance == null) {
|
||||||
|
singleInstance = new SelectServerdDialog(tethysControl, parentFrame);
|
||||||
|
}
|
||||||
|
singleInstance.setParams(exportParams);
|
||||||
|
singleInstance.setVisible(true);
|
||||||
|
return singleInstance.exportParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setParams(TethysExportParams exportParams) {
|
||||||
|
this.exportParams = exportParams;
|
||||||
|
serverHost.setText(exportParams.serverName);
|
||||||
|
serverPort.setText(String.format("%d", exportParams.port));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getParams() {
|
||||||
|
String newHost = serverHost.getText();
|
||||||
|
int newPort = 0;
|
||||||
|
try {
|
||||||
|
newPort = Integer.valueOf(serverPort.getText());
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
return showWarning("Server port must be a valid integer number");
|
||||||
|
}
|
||||||
|
exportParams.serverName = newHost;
|
||||||
|
exportParams.port = newPort;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancelButtonPressed() {
|
||||||
|
exportParams = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreDefaultSettings() {
|
||||||
|
TethysExportParams defaultParams = new TethysExportParams();
|
||||||
|
exportParams.serverName = defaultParams.serverName;
|
||||||
|
exportParams.port = defaultParams.port;
|
||||||
|
setParams(exportParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
128
src/tethys/swing/TethysConnectionPanel.java
Normal file
128
src/tethys/swing/TethysConnectionPanel.java
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
package tethys.swing;
|
||||||
|
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.border.TitledBorder;
|
||||||
|
|
||||||
|
import PamView.dialog.PamGridBagContraints;
|
||||||
|
import PamView.dialog.ScrollingPamLabel;
|
||||||
|
import PamView.dialog.SettingsButton;
|
||||||
|
import PamView.panel.PamPanel;
|
||||||
|
import PamView.panel.WestAlignedPanel;
|
||||||
|
import pamViewFX.fxNodes.PamComboBox;
|
||||||
|
import tethys.TethysControl;
|
||||||
|
import tethys.TethysState;
|
||||||
|
import tethys.TethysState.StateType;
|
||||||
|
import tethys.dbxml.ServerStatus;
|
||||||
|
import tethys.output.TethysExportParams;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top strip of main Tethys GUI for connection and project information
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TethysConnectionPanel extends TethysGUIPanel {
|
||||||
|
|
||||||
|
private static final int SERVERNAMELENGTH = 30;
|
||||||
|
private static final int SERVERSTATUSLENGTH = 20;
|
||||||
|
|
||||||
|
private JPanel mainPanel;
|
||||||
|
|
||||||
|
private JTextField serverName;
|
||||||
|
|
||||||
|
private SettingsButton serverSelButton;
|
||||||
|
|
||||||
|
private ScrollingPamLabel serverStatus;
|
||||||
|
|
||||||
|
private JComboBox<String> projectList;
|
||||||
|
|
||||||
|
public TethysConnectionPanel(TethysControl tethysControl) {
|
||||||
|
super(tethysControl);
|
||||||
|
mainPanel = new WestAlignedPanel(new GridBagLayout());
|
||||||
|
mainPanel.setBorder(new TitledBorder("Connection and project details"));
|
||||||
|
serverName = new JTextField(SERVERNAMELENGTH);
|
||||||
|
serverSelButton = new SettingsButton();
|
||||||
|
serverSelButton.setToolTipText("Select server");
|
||||||
|
serverStatus = new ScrollingPamLabel(SERVERSTATUSLENGTH);
|
||||||
|
serverName.setEditable(false);
|
||||||
|
// serverStatus.setEditable(false);
|
||||||
|
serverSelButton.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
selectServer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
GridBagConstraints c = new PamGridBagContraints();
|
||||||
|
mainPanel.add(new JLabel("Tethys Server "), c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(serverName, c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(serverSelButton, c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(serverStatus, c);
|
||||||
|
c.gridx++;
|
||||||
|
|
||||||
|
c.gridx =0;
|
||||||
|
c.gridy++;
|
||||||
|
mainPanel.add(new JLabel("Projects "), c);
|
||||||
|
c.gridx++;
|
||||||
|
mainPanel.add(projectList = new JComboBox<>(), c);
|
||||||
|
|
||||||
|
fillServerControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void selectServer() {
|
||||||
|
// will return the same object at the moment, so no need to do anything.
|
||||||
|
TethysExportParams newParams = SelectServerdDialog.showDialog(getTethysControl(), getTethysControl().getGuiFrame(), getTethysControl().getTethysExportParams());
|
||||||
|
if (newParams != null) {
|
||||||
|
getTethysControl().sendStateUpdate(new TethysState(TethysState.StateType.UPDATESERVER));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillServerControl() {
|
||||||
|
TethysExportParams exportParams = getTethysControl().getTethysExportParams();
|
||||||
|
serverName.setText(exportParams.getFullServerName());
|
||||||
|
ServerStatus status = getTethysControl().getDbxmlConnect().pingServer();
|
||||||
|
serverStatus.setText(status.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JComponent getComponent() {
|
||||||
|
return mainPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(TethysState tethysState) {
|
||||||
|
super.updateState(tethysState);
|
||||||
|
if (tethysState.stateType == StateType.UPDATESERVER) {
|
||||||
|
fillServerControl();
|
||||||
|
updateProjectList();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateProjectList() {
|
||||||
|
projectList.removeAllItems();
|
||||||
|
ArrayList<String> dbNames = getTethysControl().getDbxmlQueries().getProjectNames();
|
||||||
|
if (dbNames == null || dbNames.size() == 0) {
|
||||||
|
System.out.println("No existing projects");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < dbNames.size(); i++) {
|
||||||
|
projectList.addItem(dbNames.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
31
src/tethys/swing/TethysGUIPanel.java
Normal file
31
src/tethys/swing/TethysGUIPanel.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package tethys.swing;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
|
||||||
|
import tethys.TethysControl;
|
||||||
|
import tethys.TethysState;
|
||||||
|
import tethys.TethysStateObserver;
|
||||||
|
|
||||||
|
public abstract class TethysGUIPanel implements TethysStateObserver {
|
||||||
|
|
||||||
|
private TethysControl tethysControl;
|
||||||
|
|
||||||
|
public TethysGUIPanel(TethysControl tethysControl) {
|
||||||
|
super();
|
||||||
|
this.tethysControl = tethysControl;
|
||||||
|
tethysControl.addStateObserver(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TethysControl getTethysControl() {
|
||||||
|
return tethysControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract JComponent getComponent();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(TethysState tethysState) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
36
src/tethys/swing/TethysMainPanel.java
Normal file
36
src/tethys/swing/TethysMainPanel.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package tethys.swing;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import tethys.TethysControl;
|
||||||
|
|
||||||
|
public class TethysMainPanel extends TethysGUIPanel {
|
||||||
|
|
||||||
|
private TethysControl tethysControl;
|
||||||
|
|
||||||
|
private JPanel mainPanel;
|
||||||
|
|
||||||
|
private TethysConnectionPanel connectionPanel;
|
||||||
|
|
||||||
|
public TethysMainPanel(TethysControl tethysControl) {
|
||||||
|
super(tethysControl);
|
||||||
|
this.tethysControl = tethysControl;
|
||||||
|
mainPanel = new JPanel(new BorderLayout());
|
||||||
|
connectionPanel = new TethysConnectionPanel(tethysControl);
|
||||||
|
mainPanel.add(BorderLayout.NORTH, connectionPanel.getComponent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPanel getMainPanel() {
|
||||||
|
return mainPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JComponent getComponent() {
|
||||||
|
return getMainPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
40
src/tethys/swing/TethysTabPanel.java
Normal file
40
src/tethys/swing/TethysTabPanel.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package tethys.swing;
|
||||||
|
|
||||||
|
import java.awt.Frame;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JToolBar;
|
||||||
|
|
||||||
|
import PamView.PamTabPanel;
|
||||||
|
import tethys.TethysControl;
|
||||||
|
|
||||||
|
public class TethysTabPanel implements PamTabPanel {
|
||||||
|
|
||||||
|
private TethysControl tethysContol;
|
||||||
|
|
||||||
|
private TethysMainPanel tethysMainPanel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JMenu createMenu(Frame parentFrame) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TethysTabPanel(TethysControl tethysContol) {
|
||||||
|
super();
|
||||||
|
this.tethysContol = tethysContol;
|
||||||
|
tethysMainPanel = new TethysMainPanel(tethysContol);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JComponent getPanel() {
|
||||||
|
return tethysMainPanel.getMainPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JToolBar getToolBar() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user