Commit 81be0b1d authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev_GUI' into 'dev'

Open source release of CityDoctorGUI and other extensions.

See merge request !6
parents 12d96d95 5a4d0a74
Pipeline #10056 passed with stage
in 1 minute and 6 seconds
package de.hft.stuttgart.citydoctor2.healer.genetic.gui;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import javafx.scene.image.Image;
public class ImageComparisonTest {
@Test
public void test() {
Image image = new Image(getClass().getResourceAsStream("genetic.png"));
assertEquals(1.0, ImageComparison.compare(image, image), 0.001);
}
}
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<core:CityModel xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:tex="http://www.opengis.net/citygml/texturedsurface/2.0" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:tran="http://www.opengis.net/citygml/transportation/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0" xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0" xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0" xmlns:brid="http://www.opengis.net/citygml/bridge/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:luse="http://www.opengis.net/citygml/landuse/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/waterbody/2.0 http://schemas.opengis.net/citygml/waterbody/2.0/waterBody.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/texturedsurface/2.0 http://schemas.opengis.net/citygml/texturedsurface/2.0/texturedSurface.xsd http://www.opengis.net/citygml/vegetation/2.0 http://schemas.opengis.net/citygml/vegetation/2.0/vegetation.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/transportation/2.0 http://schemas.opengis.net/citygml/transportation/2.0/transportation.xsd http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/cityobjectgroup/2.0 http://schemas.opengis.net/citygml/cityobjectgroup/2.0/cityObjectGroup.xsd http://www.opengis.net/citygml/tunnel/2.0 http://schemas.opengis.net/citygml/tunnel/2.0/tunnel.xsd http://www.opengis.net/citygml/cityfurniture/2.0 http://schemas.opengis.net/citygml/cityfurniture/2.0/cityFurniture.xsd http://www.opengis.net/citygml/bridge/2.0 http://schemas.opengis.net/citygml/bridge/2.0/bridge.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd http://www.opengis.net/citygml/landuse/2.0 http://schemas.opengis.net/citygml/landuse/2.0/landUse.xsd">
<core:cityObjectMember>
<bldg:Building gml:id="CityDoctor_1554214838753_127">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838751_87">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838751_88">
<gml:posList srsDimension="3">14.287969134242111 6.980188861133052 11.705669515625218 8.176969134266791 11.854188861900461 17.075669515625194 8.176969134266791 11.854188861900461 17.075669515625194 8.513969134266326 6.604188861900462 11.705669515625218 9.511969134229538 6.669188861378921 11.705669515625218 14.287969134242111 6.980188861133052 11.705669515625218</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838751_89">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838751_90">
<gml:posList srsDimension="3">8.176969134266791 11.854188861900461 17.075669515625194 8.176969134266791 11.854188861900461 17.075669515625194 14.287969134242111 6.980188861133052 11.705669515625218 13.9599691342626 12.015188861282063 16.851669515625204 13.9599691342626 12.015188861282063 16.851669515625204 13.94496913424863 12.234188861788702 17.075669515625194 13.94496913424863 12.234188861788702 17.075669515625194 8.176969134266791 11.854188861900461 17.075669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838751_91">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838751_92">
<gml:posList srsDimension="3">7.835969134251889 17.16018886176635 11.705669515625218 10.890969134244905 14.697188861311865 14.390669515625191 13.94496913424863 12.234188861788702 17.075669515625194 13.94496913424863 12.234188861788702 17.075669515625194 13.59996913427657 17.532188861274612 11.705669515625218 7.835969134251889 17.16018886176635 11.705669515625218</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838751_93">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838751_94">
<gml:posList srsDimension="3">10.890969134244905 14.697188861311865 14.390669515625191 7.835969134251889 17.16018886176635 11.705669515625218 8.176969134266791 11.854188861900461 17.075669515625194 8.176969134266791 11.854188861900461 17.075669515625194 13.94496913424863 12.234188861788702 17.075669515625194 13.94496913424863 12.234188861788702 17.075669515625194 10.890969134244905 14.697188861311865 14.390669515625191</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838751_95">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_96">
<gml:posList srsDimension="3">14.287969134242111 6.980188861133052 16.845669515625204 13.9599691342626 12.015188861282063 16.851669515625204 13.9599691342626 12.015188861282063 16.851669515625204 9.511969134229538 6.669188861378921 11.705669515625218 14.287969134242111 6.980188861133052 16.845669515625204 14.287969134242111 6.980188861133052 16.845669515625204</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_97">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_98">
<gml:posList srsDimension="3">11.757969134272379 16.75918886122991 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191 9.761969134229538 16.627188861013842 14.390669515625191 9.761969134229538 16.627188861013842 14.390669515625191 9.892969134281692 14.631188861669493 14.390669515625191 9.892969134281692 14.631188861669493 14.390669515625191 11.888969134266326 14.76318886188556 14.390669515625191 11.888969134266326 14.76318886188556 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_99">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_100">
<gml:posList srsDimension="3">7.835969134251889 17.16018886176635 6.105669515625194 13.59996913427657 17.532188861274612 6.105669515625194 14.287969134242111 6.980188861133052 6.105669515625194 8.513969134266326 6.604188861900462 6.105669515625194 7.835969134251889 17.16018886176635 6.105669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_101">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_102">
<gml:posList srsDimension="3">13.59996913427657 17.532188861274612 11.705669515625218 7.835969134251889 17.16018886176635 11.705669515625218 8.513969134266326 6.604188861900462 11.705669515625218 9.511969134229538 6.669188861378921 11.705669515625218 14.287969134242111 6.980188861133052 11.705669515625218 13.59996913427657 17.532188861274612 11.705669515625218</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_103">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_104">
<gml:posList srsDimension="3">13.59996913427657 17.532188861274612 6.105669515625194 7.835969134251889 17.16018886176635 6.105669515625194 7.835969134251889 17.16018886176635 11.705669515625218 13.59996913427657 17.532188861274612 11.705669515625218 13.59996913427657 17.532188861274612 6.105669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_105">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_106">
<gml:posList srsDimension="3">14.287969134242111 6.980188861133052 6.105669515625194 13.59996913427657 17.532188861274612 6.105669515625194 13.59996913427657 17.532188861274612 11.705669515625218 14.287969134242111 6.980188861133052 11.705669515625218 14.287969134242111 6.980188861133052 6.105669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_107">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_108">
<gml:posList srsDimension="3">8.513969134266326 6.604188861900462 6.105669515625194 14.287969134242111 6.980188861133052 6.105669515625194 14.287969134242111 6.980188861133052 11.705669515625218 9.511969134229538 6.669188861378921 11.705669515625218 8.513969134266326 6.604188861900462 11.705669515625218 8.513969134266326 6.604188861900462 6.105669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_109">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_110">
<gml:posList srsDimension="3">7.835969134251889 17.16018886176635 6.105669515625194 8.513969134266326 6.604188861900462 6.105669515625194 8.513969134266326 6.604188861900462 11.705669515625218 7.835969134251889 17.16018886176635 11.705669515625218 7.835969134251889 17.16018886176635 6.105669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_111">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_112">
<gml:posList srsDimension="3">8.176969134266791 11.854188861900461 17.075669515625194 8.176969134266791 11.854188861900461 17.075669515625194 7.835969134251889 17.16018886176635 11.705669515625218 8.513969134266326 6.604188861900462 11.705669515625218 8.176969134266791 11.854188861900461 17.075669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_113">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_114">
<gml:posList srsDimension="3">13.94496913424863 12.234188861788702 17.075669515625194 13.94496913424863 12.234188861788702 17.075669515625194 13.9599691342626 12.015188861282063 16.851669515625204 13.9599691342626 12.015188861282063 16.851669515625204 14.287969134242111 6.980188861133052 11.705669515625218 13.59996913427657 17.532188861274612 11.705669515625218 13.94496913424863 12.234188861788702 17.075669515625194</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_115">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_116">
<gml:posList srsDimension="3">13.9599691342626 12.015188861282063 16.851669515625204 13.9599691342626 12.015188861282063 16.851669515625204 9.511969134229538 6.669188861378921 11.705669515625218 14.287969134242111 6.980188861133052 11.705669515625218 13.9599691342626 12.015188861282063 16.851669515625204</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_117">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_118">
<gml:posList srsDimension="3">13.9599691342626 12.015188861282063 16.851669515625204 13.9599691342626 12.015188861282063 16.851669515625204 14.287969134242111 6.980188861133052 16.845669515625204 14.287969134242111 6.980188861133052 16.845669515625204 14.287969134242111 6.980188861133052 11.705669515625218 13.9599691342626 12.015188861282063 16.851669515625204</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_119">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838752_120">
<gml:posList srsDimension="3">11.757969134272379 16.75918886122991 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191 11.757969134272379 16.75918886122991 12.36666951562519 9.761969134229538 16.627188861013842 12.3686695156252 9.761969134229538 16.627188861013842 14.390669515625191 9.761969134229538 16.627188861013842 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838752_121">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838753_122">
<gml:posList srsDimension="3">9.761969134229538 16.627188861013842 12.3686695156252 9.892969134281692 14.631188861669493 14.390669515625191 9.892969134281692 14.631188861669493 14.390669515625191 9.761969134229538 16.627188861013842 14.390669515625191 9.761969134229538 16.627188861013842 14.390669515625191 9.761969134229538 16.627188861013842 12.3686695156252</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838753_123">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838753_124">
<gml:posList srsDimension="3">14.287969134242111 6.980188861133052 11.705669515625218 14.287969134242111 6.980188861133052 16.845669515625204 14.287969134242111 6.980188861133052 16.845669515625204 14.287969134242111 6.980188861133052 16.845669515625204 9.511969134229538 6.669188861378921 11.705669515625218 14.287969134242111 6.980188861133052 11.705669515625218</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="CityDoctor_1554214838753_125">
<gml:exterior>
<gml:LinearRing gml:id="CityDoctor_1554214838753_126">
<gml:posList srsDimension="3">11.757969134272379 16.75918886122991 12.36666951562519 11.757969134272379 16.75918886122991 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191 11.757969134272379 16.75918886122991 14.390669515625191 11.888969134266326 14.76318886188556 14.390669515625191 11.888969134266326 14.76318886188556 14.390669515625191 11.757969134272379 16.75918886122991 12.36666951562519</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
localhost:5432:*:postgres:admin
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId>
<version>3.14.1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>CityDoctorWebService</artifactId>
<packaging>war</packaging>
<name>CityDoctorWebService</name>
<dependencies>
<dependency>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorModel</artifactId>
</dependency>
<dependency>
<groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorValidation</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.6</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.29</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.29</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.29</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.29</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
</dependencies>
<build>
<finalName>CityDoctorWebService</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package de.hft.stuttgart.citydoctor2.webservice;
public class AuthenticationException extends Exception {
private static final long serialVersionUID = 1734788211196618632L;
public AuthenticationException() {
super();
}
public AuthenticationException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public AuthenticationException(String message, Throwable cause) {
super(message, cause);
}
public AuthenticationException(String message) {
super(message);
}
public AuthenticationException(Throwable cause) {
super(cause);
}
}
package de.hft.stuttgart.citydoctor2.webservice;
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.BuildingEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.ChecksEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.LoginEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.LogoutEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.ModelsEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.RegisterEndpoint;
import de.hft.stuttgart.citydoctor2.webservice.endpoints.ValidationEndpoint;
@ApplicationPath("/rest")
public class CityDoctorWebService extends ResourceConfig {
public CityDoctorWebService() {
register(LoginEndpoint.class);
register(RegisterEndpoint.class);
register(ModelsEndpoint.class);
register(MultiPartFeature.class);
register(BuildingEndpoint.class);
register(ValidationEndpoint.class);
register(LogoutEndpoint.class);
register(ChecksEndpoint.class);
}
}
package de.hft.stuttgart.citydoctor2.webservice;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.webservice.database.ModelQueries;
import de.hft.stuttgart.citydoctor2.webservice.utils.HibernateUtils;
@WebListener
public class ServletInitListener implements ServletContextListener {
private static Logger logger = LogManager.getLogger(ServletInitListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
HibernateUtils.init();
logger.info("Removing models in state 'parsing'");
ModelQueries.cleanup();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
HibernateUtils.shutdown();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
if (driver.getClass().getClassLoader() == cl) {
try {
DriverManager.deregisterDriver(driver);
logger.info("Deregistering JDBC driver: {}", driver);
} catch (SQLException e) {
logger.error("Error deregistering driver {}", driver);
logger.error("", e);
}
}
}
}
}
package de.hft.stuttgart.citydoctor2.webservice;
public class UnknownUserException extends Exception {
private static final long serialVersionUID = -8582004030128118170L;
public UnknownUserException() {
super();
}
public UnknownUserException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UnknownUserException(String message, Throwable cause) {
super(message, cause);
}
public UnknownUserException(String message) {
super(message);
}
public UnknownUserException(Throwable cause) {
super(cause);
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import de.hft.stuttgart.citydoctor2.webservice.model.BuildingReference;
import de.hft.stuttgart.citydoctor2.webservice.model.BuildingReferenceWithErrorIndicator;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebBuilding;
public class BuildingQueries {
private BuildingQueries() {
// only static use
}
public static void persistBuilding(WebBuilding buildingRef, EntityManager manager) {
manager.getTransaction().begin();
try {
manager.persist(buildingRef);
} finally {
manager.getTransaction().commit();
}
}
public static List<BuildingReference> getBuildingsForModel(int from, int modelId, EntityManager manager) {
Session session = manager.unwrap(Session.class);
try {
session.getTransaction().begin();
Query<BuildingReference> query = session.createQuery("SELECT new de.hft.stuttgart.citydoctor2."
+ "webservice.model.BuildingReference(b.id, b.gmlId, b.modelWidth) FROM WebBuilding b WHERE model.id = ?1",
BuildingReference.class);
query.setParameter(1, modelId);
query.setMaxResults(20);
query.setFirstResult(from);
return query.getResultList();
} finally {
session.getTransaction().commit();
}
}
public static List<String> getBuildingsForSearchString(String s, int modelId, EntityManager manager) {
FullTextEntityManager textEntityManager = Search.getFullTextEntityManager(manager);
textEntityManager.getTransaction().begin();
try {
QueryBuilder queryBuilder = textEntityManager.getSearchFactory().buildQueryBuilder().forEntity(WebBuilding.class).get();
org.apache.lucene.search.Query luceneQ = queryBuilder.keyword().onField("gmlId").matching(s).createQuery();
FullTextQuery query = textEntityManager.createFullTextQuery(luceneQ, WebBuilding.class);
query.setMaxResults(5);
@SuppressWarnings("unchecked")
List<WebBuilding> resultList = query.getResultList();
for (WebBuilding b : resultList) {
System.out.println(b.getGmlId());
}
return null;
} finally {
textEntityManager.getTransaction().commit();
}
}
public static WebBuilding getBuildingForGmlId(String gmlId, int modelId, EntityManager manager) {
manager.getTransaction().begin();
try {
TypedQuery<WebBuilding> query = manager.createQuery("FROM WebBuilding WHERE model.id = ?1 AND gmlId = ?2",
WebBuilding.class);
query.setParameter(1, modelId);
query.setParameter(2, gmlId);
return query.getSingleResult();
} finally {
manager.getTransaction().commit();
}
}
public static long getBuildingCountForModel(int modelId, EntityManager manager) {
manager.getTransaction().begin();
try {
javax.persistence.Query query = manager
.createQuery("SELECT COUNT (b.id) FROM WebBuilding b WHERE b.model.id = ?1");
query.setParameter(1, modelId);
return (Long) query.getSingleResult();
} finally {
manager.getTransaction().commit();
}
}
public static List<BuildingReference> getBuildingsWithErrorIndicator(int from, int modelId,
Integer validationId, EntityManager manager) {
Session session = manager.unwrap(Session.class);
try {
session.getTransaction().begin();
@SuppressWarnings("unchecked")
NativeQuery<Object[]> nQuery = session.createSQLQuery(
"SELECT b.id, b.gml_id, b.model_width, CASE WHEN e.id IS NULL THEN FALSE ELSE TRUE END "
+ "FROM building_reference b "
+ "LEFT JOIN (SELECT br.id FROM building_reference br WHERE EXISTS "
+ "(SELECT 1 FROM weberror ee WHERE ee.building_id = br.id AND ee.validation_id = ?2)) AS e ON (e.id = b.id) "
+ "WHERE b.model_id = ?1");
nQuery.setParameter(1, modelId);
nQuery.setParameter(2, validationId);
nQuery.setFirstResult(from);
nQuery.setMaxResults(20);
List<Object[]> list = nQuery.list();
List<BuildingReference> result = new ArrayList<>();
for (Object[] objects : list) {
result.add(new BuildingReferenceWithErrorIndicator((Integer) objects[0], (String) objects[1], (Double) objects[2], (Boolean) objects[3]));
}
return result;
} finally {
session.getTransaction().commit();
}
}
public static long getErrorBuildingCountForModel(int modelId, Integer validationId, EntityManager manager) {
Session session = manager.unwrap(Session.class);
session.getTransaction().begin();
try {
@SuppressWarnings("unchecked")
NativeQuery<Object> nQuery = session.createSQLQuery(
"SELECT COUNT(b.id) "
+ "FROM building_reference b "
+ "JOIN (SELECT br.id FROM building_reference br WHERE EXISTS "
+ "(SELECT 1 FROM weberror ee WHERE ee.building_id = br.id AND ee.validation_id = ?2)) AS e ON (e.id = b.id) "
+ "WHERE b.model_id = ?1");
nQuery.setParameter(1, modelId);
nQuery.setParameter(2, validationId);
return ((BigInteger) nQuery.getSingleResult()).longValueExact();
} finally {
session.getTransaction().commit();
}
}
public static List<BuildingReference> getErrorBuildingsWithErrorIndicator(int from, int modelId,
Integer validationId, EntityManager manager) {
Session session = manager.unwrap(Session.class);
try {
session.getTransaction().begin();
@SuppressWarnings("unchecked")
NativeQuery<Object[]> nQuery = session.createSQLQuery(
"SELECT b.id, b.gml_id, b.model_width, TRUE "
+ "FROM building_reference b "
+ "JOIN (SELECT br.id FROM building_reference br WHERE EXISTS "
+ "(SELECT 1 FROM weberror ee WHERE ee.building_id = br.id AND ee.validation_id = ?2)) AS e ON (e.id = b.id) "
+ "WHERE b.model_id = ?1");
nQuery.setParameter(1, modelId);
nQuery.setParameter(2, validationId);
nQuery.setFirstResult(from);
nQuery.setMaxResults(20);
List<Object[]> list = nQuery.list();
List<BuildingReference> result = new ArrayList<>();
for (Object[] objects : list) {
result.add(new BuildingReferenceWithErrorIndicator((Integer) objects[0], (String) objects[1], (Double) objects[2], (Boolean) objects[3]));
}
return result;
} finally {
session.getTransaction().commit();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.Validation;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebBuilding;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebError;
public class ErrorQueries {
public static void addErrorToBuilding(WebBuilding building, Validation validation, WebError webError, EntityManager manager) {
manager.getTransaction().begin();
try {
building.getErrors().add(webError);
validation.getErrors().add(webError);
manager.persist(webError);
} finally {
manager.getTransaction().commit();
}
}
public static List<WebError> getErrorsForBuilding(int buildingId, int validationId, EntityManager manager) {
manager.getTransaction().begin();
try {
TypedQuery<WebError> query = manager.createQuery("FROM WebError WHERE building.id = ?1 AND validation.id =?2", WebError.class);
query.setParameter(1, buildingId);
query.setParameter(2, validationId);
return query.getResultList();
} finally {
manager.getTransaction().commit();
}
}
public static void deleteErrorsForBuilding(int buildingId, EntityManager manager) {
manager.getTransaction().begin();
try {
Query query = manager.createQuery("DELETE FROM WebError WHERE building.id = ?1");
query.setParameter(1, buildingId);
query.executeUpdate();
} finally {
manager.getTransaction().commit();
}
}
public static void deleteErrorsForValidation(int validationId, EntityManager manager) {
manager.getTransaction().begin();
try {
Query query = manager.createQuery("DELETE FROM WebError WHERE validation.id = ?1");
query.setParameter(1, validationId);
query.executeUpdate();
} finally {
manager.getTransaction().commit();
}
}
public static void deleteErrorsForModel(int modelId, EntityManager manager) {
manager.getTransaction().begin();
try {
Query query = manager.createQuery("DELETE er FROM WebError er JOIN FETCH er.building b WHERE b.model.id = ?1");
query.setParameter(1, modelId);
query.executeUpdate();
} finally {
manager.getTransaction().commit();
}
}
public static List<WebError> getErrorsForModel(int modelId, EntityManager manager) {
manager.getTransaction().begin();
try {
TypedQuery<WebError> query = manager.createQuery("FROM WebError WHERE building.model.id = ?1", WebError.class);
query.setParameter(1, modelId);
return query.getResultList();
} finally {
manager.getTransaction().commit();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import javax.persistence.EntityManager;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebBuilding;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebGeometry;
public class GeometryQueries {
private GeometryQueries() {
// only static use
}
public static void persistGeometryAndApplyToBuilding(WebGeometry geom, WebBuilding ref, EntityManager manager) {
manager.getTransaction().begin();
try {
manager.persist(geom);
} finally {
manager.getTransaction().commit();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import de.hft.stuttgart.citydoctor2.webservice.model.ParseStatus;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.GmlFile;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebCityDoctorModel;
import de.hft.stuttgart.citydoctor2.webservice.utils.HibernateUtils;
public class ModelQueries {
private ModelQueries() {
// only static usage
}
public static void storeModel(WebCityDoctorModel webModel, EntityManager manager) {
try {
manager.getTransaction().begin();
manager.persist(webModel);
} finally {
manager.getTransaction().commit();
}
}
public static void updateStatus(WebCityDoctorModel webModel, ParseStatus status, EntityManager manager) {
try {
manager.getTransaction().begin();
webModel.setStatus(status);
} finally {
manager.getTransaction().commit();
}
}
public static void updateModelWithBlob(WebCityDoctorModel webModel, GmlFile blob, EntityManager manager) {
try {
manager.getTransaction().begin();
manager.persist(blob);
webModel.setZipFile(blob);
} finally {
manager.getTransaction().commit();
}
}
public static void cleanup() {
EntityManager manager = HibernateUtils.createManager();
try {
manager.getTransaction().begin();
Query query = manager.createQuery("DELETE FROM WebCityDoctorModel WHERE status = " + ParseStatus.PARSING.ordinal());
query.executeUpdate();
manager.getTransaction().commit();
} finally {
manager.close();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import java.time.LocalDateTime;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.Token;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.User;
public class TokenQueries {
private TokenQueries() {
// not used
}
public static Token getTokenForTokenString(String inputToken, String address, EntityManager manager) {
manager.getTransaction().begin();
Token token = null;
try {
TypedQuery<Token> q = manager.createQuery("FROM Token t WHERE t.tokenString = ?1 AND address = ?2", Token.class);
q.setParameter(1, inputToken);
q.setParameter(2, address);
token = q.getSingleResult();
} catch (NoResultException e) {
// ignore
} finally {
manager.getTransaction().commit();
}
return token;
}
public static void persistToken(Token token, EntityManager manager) {
manager.getTransaction().begin();
try {
manager.persist(token);
} finally {
manager.getTransaction().commit();
}
}
public static void updateExpirationDate(LocalDateTime expirationDate, Token token, EntityManager manager) {
manager.getTransaction().begin();
try {
token.setExpires(expirationDate);
} finally {
manager.getTransaction().commit();
}
}
public static Token getTokenForUser(User user, String addr, EntityManager manager) {
manager.getTransaction().begin();
Token token = null;
try {
TypedQuery<Token> q = manager.createQuery("FROM Token t WHERE t.user.id = ?1 AND address = ?2", Token.class);
q.setParameter(1, user.getId());
q.setParameter(2, addr);
token = q.getSingleResult();
} catch (NoResultException e) {
// ignore
} finally {
manager.getTransaction().commit();
}
return token;
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.User;
public class UserQueries {
private UserQueries() {
// only static use
}
public static User getUserForUsername(String username, EntityManager manager) {
manager.getTransaction().begin();
TypedQuery<User> q = manager.createQuery("FROM User WHERE mail = ?1", User.class);
q.setParameter(1, username);
User user = null;
try {
user = q.getSingleResult();
} catch (NoResultException e) {
// ignore
} finally {
manager.getTransaction().commit();
}
return user;
}
public static void createUser(User user, EntityManager manager) {
manager.getTransaction().begin();
try {
manager.persist(user);
} finally {
manager.getTransaction().commit();
}
}
public static void deleteUser(User user, EntityManager manager) {
manager.getTransaction().begin();
try {
manager.remove(user);
} finally {
manager.getTransaction().commit();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.database;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import de.hft.stuttgart.citydoctor2.webservice.model.ValidationStatus;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.FeatureValidationStatus;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.Validation;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebBuilding;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebCityDoctorModel;
public class ValidationQueries {
private ValidationQueries() {
// only static use
}
public static void addFeatureValidationStatus(WebBuilding b, Validation v, FeatureValidationStatus s, EntityManager manager) {
try {
manager.getTransaction().begin();
b.getErrorStatus().add(s);
v.getErrorStatus().add(s);
manager.persist(s);
} finally {
manager.getTransaction().commit();
}
}
public static void persistValidation(EntityManager manager, WebCityDoctorModel model, Validation validation) {
try {
manager.getTransaction().begin();
manager.persist(validation);
model.getValidations().add(validation);
} finally {
manager.getTransaction().commit();
}
}
public static void updateStatus(Validation valid, ValidationStatus status, EntityManager manager) {
try {
manager.getTransaction().begin();
valid.setStatus(status);
} finally {
manager.getTransaction().commit();
}
}
public static void updateValidationWithReports(Validation validation, byte[] pdfArray,
byte[] xmlArray, EntityManager manager) {
try {
manager.getTransaction().begin();
validation.setPdfReport(pdfArray);
validation.setXmlReport(xmlArray);
} finally {
manager.getTransaction().commit();
}
}
public static Validation getValidation(int validationId, EntityManager manager) {
return manager.find(Validation.class, validationId);
}
public static boolean hasFeatureErrors(WebBuilding b, Validation validation, EntityManager manager) {
try {
manager.getTransaction().begin();
Query query = manager.createQuery("SELECT 1 FROM WebError WHERE EXISTS (SELECT 1 FROM WebError WHERE building = ?1 AND validation = ?2)");
query.setParameter(1, b);
query.setParameter(2, validation);
return !query.getResultList().isEmpty();
} finally {
manager.getTransaction().commit();
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.endpoints;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.webservice.AuthenticationException;
import de.hft.stuttgart.citydoctor2.webservice.database.ErrorQueries;
import de.hft.stuttgart.citydoctor2.webservice.model.ErrorReference;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.User;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebBuilding;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebCityDoctorModel;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.WebError;
import de.hft.stuttgart.citydoctor2.webservice.utils.AuthenticationUtils;
import de.hft.stuttgart.citydoctor2.webservice.utils.HibernateUtils;
@Path("")
public class BuildingEndpoint {
private static final Logger logger = LogManager.getLogger(BuildingEndpoint.class);
@GET
@Path("buildings/{buildingId}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getGeometry(@PathParam("buildingId") int buildingId, @Context HttpServletRequest request) {
EntityManager manager = null;
try {
manager = HibernateUtils.createManager();
User user = AuthenticationUtils.authenticateUser(request, manager);
WebBuilding building = manager.find(WebBuilding.class, buildingId);
Response response = checkAccessRightsForBuilding(buildingId, user, building);
if (response != null) {
return response;
}
byte[] array = building.getViewData();
return Response.ok(array).build();
} catch (AuthenticationException e) {
logger.trace(AuthenticationUtils.AUTHENTICATION_DENIED, request.getRemoteAddr(), e);
return Response.status(Status.FORBIDDEN).build();
} catch (Exception e) {
logger.fatal("Error while retrieving building with id {}", buildingId);
logger.catching(e);
return Response.serverError().build();
} finally {
if (manager != null) {
manager.close();
}
}
}
@GET
@Path("buildings/{buildingId}/validation/{validationId}/errors")
@Produces(MediaType.APPLICATION_JSON)
public Response getErrors(@PathParam("buildingId") int buildingId, @PathParam("validationId") int validationId,
@Context HttpServletRequest request) {
EntityManager manager = null;
try {
manager = HibernateUtils.createManager();
User user = AuthenticationUtils.authenticateUser(request, manager);
WebBuilding building = manager.find(WebBuilding.class, buildingId);
Response response = checkAccessRightsForBuilding(buildingId, user, building);
if (response != null) {
return response;
}
List<ErrorReference> refs = new ArrayList<>();
List<WebError> errors = ErrorQueries.getErrorsForBuilding(buildingId, validationId, manager);
for (WebError err : errors) {
refs.add(ErrorReference.of(err));
}
return Response.ok(refs).build();
} catch (AuthenticationException e) {
logger.trace(AuthenticationUtils.AUTHENTICATION_DENIED, request.getRemoteAddr(), e);
return Response.status(Status.FORBIDDEN).build();
} catch (Exception e) {
logger.fatal("Error while retrieving errors for building with id {}", buildingId);
logger.catching(e);
return Response.serverError().build();
} finally {
if (manager != null) {
manager.close();
}
}
}
private Response checkAccessRightsForBuilding(int buildingId, User user, WebBuilding building) {
if (building == null) {
logger.warn("User {} tried to access non existing building with id {}", user.getId(), buildingId);
return Response.status(Status.FORBIDDEN).build();
}
WebCityDoctorModel model = building.getModel();
if (model.getOwner().getId() != user.getId()) {
logger.warn("User {} tried to access not owned model with id {}", user.getId(), model.getId());
return Response.status(Status.FORBIDDEN).build();
}
return null;
}
}
package de.hft.stuttgart.citydoctor2.webservice.endpoints;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.checks.CheckPrototype;
import de.hft.stuttgart.citydoctor2.checks.Checks;
import de.hft.stuttgart.citydoctor2.webservice.model.AvailableChecksReturnType;
import de.hft.stuttgart.citydoctor2.webservice.model.CheckReturnType;
@Path("checks")
public class ChecksEndpoint {
private AvailableChecksReturnType returnValue;
public ChecksEndpoint() {
returnValue = new AvailableChecksReturnType();
List<CheckReturnType> geometricChecks = new ArrayList<>();
List<CheckReturnType> semanticChecks = new ArrayList<>();
returnValue.setGeometricChecks(geometricChecks);
returnValue.setSemanticChecks(semanticChecks);
List<CheckPrototype> prototypes = Checks.getCheckPrototypes();
for (CheckPrototype prototype : prototypes) {
CheckReturnType returnVal = new CheckReturnType();
returnVal.setName(prototype.getCheckId().toString());
List<DefaultParameter> defaultParameters = new ArrayList<>();
for (Requirement req : prototype.checksRequirements()) {
defaultParameters.addAll(req.getDefaultParameter());
}
returnVal.setParameters(defaultParameters);
if (prototype.getType() == RequirementType.GEOMETRY) {
geometricChecks.add(returnVal);
} else if (prototype.getType() == RequirementType.SEMANTIC) {
semanticChecks.add(returnVal);
} else {
throw new IllegalStateException("Cannot handle check type: " + prototype.getType());
}
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getChecks() {
return Response.ok(returnValue).build();
}
}
package de.hft.stuttgart.citydoctor2.webservice.endpoints;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.webservice.AuthenticationException;
import de.hft.stuttgart.citydoctor2.webservice.database.TokenQueries;
import de.hft.stuttgart.citydoctor2.webservice.database.UserQueries;
import de.hft.stuttgart.citydoctor2.webservice.model.LoginSuccessfulReturnType;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.Token;
import de.hft.stuttgart.citydoctor2.webservice.model.entities.User;
import de.hft.stuttgart.citydoctor2.webservice.utils.AuthenticationUtils;
import de.hft.stuttgart.citydoctor2.webservice.utils.HashUtils;
import de.hft.stuttgart.citydoctor2.webservice.utils.HexUtils;
import de.hft.stuttgart.citydoctor2.webservice.utils.HibernateUtils;
@Path("/login")
public class LoginEndpoint {
private static Logger logger = LogManager.getLogger(LoginEndpoint.class);
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response authenticateUser(@FormParam("username") String username, @FormParam("password") String password,
@Context HttpServletRequest request) {
logger.trace("Login attempt from {}, password hidden", username);
if (username == null || password == null) {
return Response.status(Status.BAD_REQUEST).build();
}
EntityManager manager = HibernateUtils.createManager();
try {
User user = UserQueries.getUserForUsername(username, manager);
if (user == null) {
throw new AuthenticationException("Unknown user");
}
authenticate(user, password);
String addr = request.getLocalAddr();
Token token = TokenQueries.getTokenForUser(user, addr, manager);
if (token == null) {
token = createToken(user, addr);
TokenQueries.persistToken(token, manager);
} else {
LocalDateTime expires = token.getExpires();
if (expires.isBefore(LocalDateTime.now())) {
manager.getTransaction().begin();
manager.remove(token);
manager.getTransaction().commit();
// token expired, issue new one
token = createToken(user, addr);
TokenQueries.persistToken(token, manager);
}
}
logger.trace("Login successful by user {}", user.getId());
LoginSuccessfulReturnType returnType = new LoginSuccessfulReturnType(token.getTokenString(),
token.getExpires(), user.getId());
return Response.status(Status.OK).entity(returnType).build();
} catch (AuthenticationException e) {
logger.trace("Authentication denied for user {}, reason: {}", username, e);
return Response.status(Status.FORBIDDEN).build();
} catch (Exception e) {
logger.catching(Level.FATAL, e);
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
} finally {
manager.close();
}
}
@GET
public Response logout(@Context HttpServletRequest request) {
EntityManager manager = null;
try {
manager = HibernateUtils.createManager();
AuthenticationUtils.removeTokenFromUser(request, manager);
return Response.ok().build();
} catch (AuthenticationException e) {
logger.trace(AuthenticationUtils.AUTHENTICATION_DENIED, request.getRemoteAddr(), e);
return Response.status(Status.FORBIDDEN).build();
} finally {
if (manager != null) {
manager.close();
}
}
}
private Token createToken(User user, String addr) {
byte[] bytes = new byte[16];
SecureRandom r = new SecureRandom();
r.nextBytes(bytes);
String tokenString = HexUtils.encode(bytes);
Token token = new Token();
token.setAddress(addr);
token.setUser(user);
token.setExpires(LocalDateTime.now().plusHours(3));
token.setTokenString(tokenString);
return token;
}
private void authenticate(User user, String password) throws AuthenticationException, NoSuchAlgorithmException {
String hash = HashUtils.createPasswordHash(password, user.getSalt());
String storedPassword = user.getPasswordHash();
if (!storedPassword.equals(hash)) {
throw new AuthenticationException("Wrong password");
}
}
}
package de.hft.stuttgart.citydoctor2.webservice.endpoints;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.webservice.AuthenticationException;
import de.hft.stuttgart.citydoctor2.webservice.utils.AuthenticationUtils;
import de.hft.stuttgart.citydoctor2.webservice.utils.HibernateUtils;
@Path("logout")
public class LogoutEndpoint {
private static final Logger logger = LogManager.getLogger(LogoutEndpoint.class);
@POST
public Response logout(@Context HttpServletRequest request) {
EntityManager manager = null;
try {
manager = HibernateUtils.createManager();
AuthenticationUtils.removeTokenFromUser(request, manager);
return Response.ok().build();
} catch (AuthenticationException e) {
logger.trace(AuthenticationUtils.AUTHENTICATION_DENIED, request.getRemoteAddr(), e);
return Response.status(Status.FORBIDDEN).build();
} catch (Exception e) {
logger.fatal("Error while logging out unknown user");
logger.catching(e);
return Response.serverError().build();
} finally {
if (manager != null) {
manager.close();
}
}
}
}
Supports Markdown
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