Commit abf9c2bd authored by duminil's avatar duminil
Browse files

NovaFactory download directly from RegionChooserFX

parent eb9862a4
package eu.simstadt.nf4j;
import java.io.File;
import java.util.ArrayList;
import netscape.javascript.JSObject;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import eu.simstadt.nf4j.async.AsyncExportJob;
import eu.simstadt.nf4j.async.Coord;
import eu.simstadt.nf4j.async.ExportJobDescription;
import eu.simstadt.nf4j.async.HTTPConnection;
import eu.simstadt.nf4j.async.JobStatusEvent;
import eu.simstadt.nf4j.async.JobStatusListener;
import eu.simstadt.nf4j.async.Layer;
/**
* This class contains client oriented export job tests. It will send an export job and listens to status updates. Every
* of the subsequent status' LOCAL, SENT, PENDING, RUNNING, FINISHED and DOWNLOAD have to be signaled to this test
* class.
*
* @author Marcel Bruse
*/
//TODO: DRY with SuccessfulExportJob
public class ExportJobFromJavaFXRegionChooser implements JobStatusListener
{
public AsyncExportJob job;
private JSObject nfButton;
public void processJob(Geometry poly, JSObject nfButton) throws InterruptedException {
this.nfButton = nfButton;
ExportJobDescription description = ExportJobDescription.getDefaultDescriptor();
description.setInitiator("2758");
description.setAccount("Bruse");
description.setProduct("WU3");
description.setJobnumber("Bruse_0815");
//FIXME: Zipped GMLs coming from nF don't have any defined srsName
//FIXME: Save files somewhere else
ArrayList<Coord> regionPolygon = new ArrayList<>();
for (Coordinate point : poly.getCoordinates()) {
regionPolygon.add(new Coord(point.y, point.x));
}
description.setRegionPolygon(regionPolygon);
Layer layer = Layer.getDefaultLayer();
layer.setProduct("WU3");
layer.setName("GML");
description.addLayer(layer);
job = new AsyncExportJob(description, new HTTPConnection("193.196.136.164"));
job.addJobStatusListener(this);
try {
job.send();
} catch (FailedTransmissionException ex) {
ex.printStackTrace();
} catch (InvalidJobDescriptorException ex) {
ex.printStackTrace();
}
// Wait for timeout, failure or that all tests pass
long timeout = 1000 * 60 * 3l; // 3 minutes maximum
long interval = 10000l;
while (!job.hasFinished() && !job.hasFailed() && timeout > 0) {
Thread.sleep(interval);
timeout -= interval;
System.out.println("+");
}
}
@Override
public void jobStatusChanged(JobStatusEvent event) {
JobStatus status = (JobStatus) event.getSource();
System.out.println(status);
if (status == JobStatus.LOCAL) {
nfButton.call("updateStatus", "Local");
} else if (status == JobStatus.SENT) {
nfButton.call("updateStatus", "SENT");
} else if (status == JobStatus.PENDING) {
nfButton.call("updateStatus", "PENDING");
} else if (status == JobStatus.RUNNING) {
nfButton.call("updateStatus", "RUNNING");
} else if (status == JobStatus.FINISHED) {
try {
nfButton.call("updateStatus", "FINISHED");
job.downloadResult();
} catch (FailedTransmissionException ex) {
ex.printStackTrace();
}
} else if (status == JobStatus.DOWNLOAD) {
try {
File file = job.getResult();
nfButton.call("updateStatus", "DOWNLOAD");
System.out.println("CityGML at " + file.getAbsolutePath());
} catch (FailedTransmissionException ex) {
ex.printStackTrace();
}
}
}
}
\ No newline at end of file
...@@ -7,13 +7,11 @@ ...@@ -7,13 +7,11 @@
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javafx.application.Application; import javafx.application.Application;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.concurrent.Worker.State; import javafx.concurrent.Worker.State;
import javafx.geometry.HPos; import javafx.geometry.HPos;
import javafx.geometry.VPos; import javafx.geometry.VPos;
...@@ -24,20 +22,14 @@ ...@@ -24,20 +22,14 @@
import javafx.scene.web.WebView; import javafx.scene.web.WebView;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import javafx.stage.Stage; import javafx.stage.Stage;
import javax.xml.stream.XMLStreamException;
import netscape.javascript.JSObject; import netscape.javascript.JSObject;
import org.citygml4j.model.gml.feature.BoundingShape;
import org.citygml4j.model.gml.geometry.primitives.Envelope;
import org.xml.sax.SAXParseException;
import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.io.WKTReader;
import de.hft.stuttgart.citydoctor.datastructure.Building; import eu.simstadt.nf4j.ExportJobFromJavaFXRegionChooser;
import eu.simstadt.admin.SimStadtModel;
import eu.simstadt.admin.SimStadtProject;
public class RegionChooserFX extends Application public class RegionChooserFX extends Application
...@@ -70,8 +62,19 @@ public JavaScriptFXBridge() { ...@@ -70,8 +62,19 @@ public JavaScriptFXBridge() {
repo = Paths.get("../TestRepository"); repo = Paths.get("../TestRepository");
} }
public void downloadRegion(String wktPolygon) { public void downloadRegion(String wktPolygon, JSObject nfButton) throws InterruptedException {
System.out.println("FROM JAVA : DO SOMETHING with " + wktPolygon); //TODO: Ask nf Server about available regions
Task<Integer> task = new Task<Integer>() {
@Override
protected Integer call() throws Exception {
ExportJobFromJavaFXRegionChooser nfJob = new ExportJobFromJavaFXRegionChooser();
Geometry poly = wktReader.read(wktPolygon);
nfJob.processJob(poly, nfButton);
nfButton.call("downloadFinished");
return 0;
}
};
new Thread(task).start();
} }
public void downloadRegionFromCityGML(String wktPolygon, String project, String citygml, JSObject featureOverlay) public void downloadRegionFromCityGML(String wktPolygon, String project, String citygml, JSObject featureOverlay)
......
...@@ -36,6 +36,7 @@ public void processJob() throws InterruptedException { ...@@ -36,6 +36,7 @@ public void processJob() throws InterruptedException {
description.setJobnumber("Bruse_0815"); description.setJobnumber("Bruse_0815");
//FIXME: Zipped GMLs coming from nF don't have any defined srsName //FIXME: Zipped GMLs coming from nF don't have any defined srsName
//FIXME: Save files somewhere else
//NOTE: Unit is a predefined Map Region. //NOTE: Unit is a predefined Map Region.
// Some of those units are empty. 821 (Finsterrot) and 824 (Neulautern) are available on HFT nF Server. // Some of those units are empty. 821 (Finsterrot) and 824 (Neulautern) are available on HFT nF Server.
...@@ -118,7 +119,6 @@ public void processJob() throws InterruptedException { ...@@ -118,7 +119,6 @@ public void processJob() throws InterruptedException {
@Override @Override
public void jobStatusChanged(JobStatusEvent event) { public void jobStatusChanged(JobStatusEvent event) {
System.out.println("BOOM BOOM");
JobStatus status = (JobStatus) event.getSource(); JobStatus status = (JobStatus) event.getSource();
System.out.println(status); System.out.println(status);
if (status == JobStatus.LOCAL) { if (status == JobStatus.LOCAL) {
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<div id="map" class="map" tabindex="0"></div> <div id="map" class="map" tabindex="0"></div>
<div id="side"> <div id="side">
<input id="reset" value="Reset" type="button" class="navi" disabled/> <input id="reset" value="Reset" type="button" class="navi" disabled/>
<input id="send" value="Send" type="button" class="navi" disabled/> <input id="nfDownload" value="NovaFactory download" type="button" class="navi" disabled/>
<div id="dataPanel"> <div id="dataPanel">
</div> </div>
</div> </div>
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
//TODO: Try to leave everything in 4326 //TODO: Try to leave everything in 4326
var reset_btn = $('#reset')[0]; var reset_btn = $('#reset')[0];
var send_btn = $('#send')[0]; var novafactory_btn = $('#nfDownload')[0];
var dataPanel = $('#dataPanel');
var br = document.createElement('br');
proj4.defs("EPSG:31467", "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0" proj4.defs("EPSG:31467", "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0"
+ " +ellps=bessel +datum=potsdam +units=m +no_defs"); // http://spatialreference.org/ref/epsg/31467/proj4js/ + " +ellps=bessel +datum=potsdam +units=m +no_defs"); // http://spatialreference.org/ref/epsg/31467/proj4js/
...@@ -206,7 +208,7 @@ function findIntersections() { ...@@ -206,7 +208,7 @@ function findIntersections() {
var jsonIntersection = turf.intersect(poly1, feature["geoJSON"]); var jsonIntersection = turf.intersect(poly1, feature["geoJSON"]);
if (undefined != jsonIntersection) { if (undefined != jsonIntersection) {
if (!intersection_found) { if (!intersection_found) {
$('#dataPanel').append("Intersection found with :<br/>\n"); dataPanel.append("Intersection found with :<br/>\n");
intersection_found = true; intersection_found = true;
} }
var intersection = geoJSONformat.readFeature(jsonIntersection); var intersection = geoJSONformat.readFeature(jsonIntersection);
...@@ -223,11 +225,11 @@ function findIntersections() { ...@@ -223,11 +225,11 @@ function findIntersections() {
description = feature['description']; description = feature['description'];
} }
$('#dataPanel').append(description + " (" + citygml_percentage + "%"); dataPanel.append(description + " (" + citygml_percentage + "%");
if (sketch_percentage == 100) { if (sketch_percentage == 100) {
$('#dataPanel').append(", all inside"); dataPanel.append(", all inside");
} }
$('#dataPanel').append(")<br/>\n"); dataPanel.append(")<br/>\n");
} }
} catch (err) { } catch (err) {
...@@ -236,7 +238,7 @@ function findIntersections() { ...@@ -236,7 +238,7 @@ function findIntersections() {
i++; i++;
}) })
if (!intersection_found) { if (!intersection_found) {
$('#dataPanel').append("No intersection found with any CityGML<br/>\n"); dataPanel.append("No intersection found with any CityGML<br/>\n");
} }
} }
...@@ -253,14 +255,14 @@ function downloadRegionFromCityGML(i) { ...@@ -253,14 +255,14 @@ function downloadRegionFromCityGML(i) {
console.log('DL Execution time: ' + time); console.log('DL Execution time: ' + time);
setTimeout(function() { setTimeout(function() {
$("html").removeClass("wait"); $("html").removeClass("wait");
$("#dataPanel").append("Done<br/>\n"); dataPanel.append("Done<br/>\n");
}, 100); }, 100);
}, 100); }, 100);
} }
function displayInfo() { function displayInfo() {
var start = new Date().getTime(); var start = new Date().getTime();
$('#dataPanel').empty(); dataPanel.empty();
var geom = /** @type {ol.geom.Polygon} */ var geom = /** @type {ol.geom.Polygon} */
(sketch.getGeometry().clone().transform(sourceProj, 'EPSG:4326')); (sketch.getGeometry().clone().transform(sourceProj, 'EPSG:4326'));
var coordinates = geom.getLinearRing(0).getCoordinates(); var coordinates = geom.getLinearRing(0).getCoordinates();
...@@ -279,13 +281,13 @@ function displayInfo() { ...@@ -279,13 +281,13 @@ function displayInfo() {
var gsk3_coord = ol.proj.transform(coords[i], ol.proj.get('EPSG:4326'), ol.proj.get('EPSG:31467')) var gsk3_coord = ol.proj.transform(coords[i], ol.proj.get('EPSG:4326'), ol.proj.get('EPSG:31467'))
gsk3_coords += "(" + gsk3_coord[0] + "," + gsk3_coord[1] + ")<br/>"; gsk3_coords += "(" + gsk3_coord[0] + "," + gsk3_coord[1] + ")<br/>";
} }
$('#dataPanel').append("WGS84 Coordinates<br/>"); dataPanel.append("WGS84 Coordinates<br/>");
$('#dataPanel').append(wgs84_coords + "<br/>\n"); dataPanel.append(wgs84_coords + "<br/>\n");
$('#dataPanel').append("GSK3 Coordinates<br/>"); dataPanel.append("GSK3 Coordinates<br/>");
$('#dataPanel').append(gsk3_coords + "<br/>\n"); dataPanel.append(gsk3_coords + "<br/>\n");
} }
$('#dataPanel').append("Area" + "<br/>\n"); dataPanel.append("Area" + "<br/>\n");
$('#dataPanel').append((Math.round(area / 1000) / 10).toString() + " ha<br/><br/>\n"); dataPanel.append((Math.round(area / 1000) / 10).toString() + " ha<br/><br/>\n");
findIntersections(); findIntersections();
var end = new Date().getTime(); var end = new Date().getTime();
var time = end - start; var time = end - start;
...@@ -295,7 +297,7 @@ function displayInfo() { ...@@ -295,7 +297,7 @@ function displayInfo() {
draw.on('drawend', function(e) { draw.on('drawend', function(e) {
displayInfo(); displayInfo();
if (fromJavaFX) { if (fromJavaFX) {
send_btn.disabled = false; novafactory_btn.disabled = false;
} }
draw.setActive(false); draw.setActive(false);
}); });
...@@ -304,26 +306,38 @@ $('#reset').click(function() { ...@@ -304,26 +306,38 @@ $('#reset').click(function() {
try { try {
draw.finishDrawing(); draw.finishDrawing();
} finally { } finally {
$('#dataPanel').empty(); dataPanel.empty();
$("html").removeClass("wait"); $("html").removeClass("wait");
draw.setActive(true); draw.setActive(true);
featureOverlay.getFeatures().clear(); featureOverlay.getFeatures().clear();
intersections.clear(); intersections.clear();
reset_btn.disabled = true; reset_btn.disabled = true;
send_btn.disabled = true; novafactory_btn.disabled = true;
focusOnMap(); focusOnMap();
} }
}); });
$('#send').click(function() { novafactory_btn.downloadFinished = function() {
focusOnMap(); //FIXME: Weird <br>s are inserted between lines
fxapp.downloadRegion(sketchAsWKT()); dataPanel.append("NovaFactory : DONE <br/>\n");
this.disabled = false;
}
novafactory_btn.updateStatus = function(status) {
dataPanel.append("NovaFactory : "+status+"<br/>\n");
}
$('#nfDownload').click(function() {
novafactory_btn.disabled = true;
dataPanel.append("NovaFactory BEGIN <br/>\n");
fxapp.downloadRegion(sketchAsWKT('4326'), novafactory_btn);
}); });
function sketchAsWKT() { function sketchAsWKT(epsgId) {
var epsgId = (typeof epsgId === 'undefined') ? '31467' : epsgId;
var wktFormat = new ol.format.WKT(); var wktFormat = new ol.format.WKT();
return wktFormat.writeFeature(sketch, { return wktFormat.writeFeature(sketch, {
dataProjection : ol.proj.get('EPSG:31467'), dataProjection : ol.proj.get('EPSG:'+epsgId),
featureProjection : ol.proj.get('EPSG:3857') featureProjection : ol.proj.get('EPSG:3857')
}) })
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment