Commit 86e2e4f7 authored by Rushikesh Padsala's avatar Rushikesh Padsala
Browse files

fixes in TimeSeries imp-exp, importmanager and marshaller/unmarshaller

parent 96d46e05
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
......@@ -17,7 +16,7 @@
</compositeBuild>
</compositeConfiguration>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="C:/Gradle" />
<option name="gradleJvm" value="#JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
......
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="transformers" />
<item index="1" class="java.lang.String" itemvalue="pygls" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$/../digitwins4peds" />
<file type="web" url="file://$PROJECT_DIR$/../energy-ade-2-citygml4j" />
<file type="web" url="file://$PROJECT_DIR$" />
<file type="web" url="file://$PROJECT_DIR$/../energy-ade-3-citygml4j" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="liberica-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="liberica-17" project-jdk-type="JavaSDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
......@@ -2,6 +2,5 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../energy-ade-3-citygml4j" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -8,8 +8,8 @@ plugins {
}
group = 'de.stuttgart.hft'
version = 'beta7-0.2'
description 'Energy ADE 3 (beta 7) extension for the 3DCityDB - release 0.2'
version = 'beta7-0.3'
description 'Energy ADE 3 (beta 7) extension for the 3DCityDB - release 0.3'
repositories {
maven {
......
package de.stuttgart.hft.ade.energy3.exporter;
import de.stuttgart.hft.ade.energy3.schema.ADETable;
import net.opengis.gml.UnitOfMeasureType;
import org.citydb.core.ade.exporter.ADEExporter;
import org.citydb.core.ade.exporter.CityGMLExportHelper;
import org.citydb.core.operation.exporter.CityGMLExportException;
......@@ -8,6 +9,7 @@ import org.citygml4j.ade.energy3.model.supportingClasses.*;
import org.citygml4j.model.gml.basicTypes.Code;
import org.citygml4j.model.gml.basicTypes.MeasureList;
import java.net.URI;
import java.sql.*;
import java.time.*;
......@@ -17,6 +19,8 @@ import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
public class TimeSeriesExporter implements ADEExporter {
private final CityGMLExportHelper helper;
......@@ -71,13 +75,30 @@ public class TimeSeriesExporter implements ADEExporter {
if (abstractTimeSeries instanceof RegularTimeSeries) {
RegularTimeSeries regularTimeSeries = (RegularTimeSeries) abstractTimeSeries;
Timestamp period_begin = rs.getTimestamp(7);
Timestamp period_end = rs.getTimestamp(8);
if (period_begin != null && period_end != null) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime beginZdt = period_begin.toInstant().atZone(zoneId);
ZonedDateTime endZdt = period_end.toInstant().atZone(zoneId);
//Timestamp period_begin = rs.getTimestamp(7);
//Timestamp period_end = rs.getTimestamp(8);
//if (period_begin != null && period_end != null) {
// ZoneId zoneId = ZoneId.systemDefault();
// ZonedDateTime beginZdt = period_begin.toInstant().atZone(zoneId);
// ZonedDateTime endZdt = period_end.toInstant().atZone(zoneId);
//TimePeriod timePeriod = new TimePeriod();
// timePeriod.setBeginPosition(beginZdt);
// timePeriod.setEndPosition(endZdt);
// TimePeriodProperty timePeriodProperty = new TimePeriodProperty();
// timePeriodProperty.setTimePeriod(timePeriod);
//regularTimeSeries.setTemporalExtent(timePeriodProperty);
// }
OffsetDateTime beginOffset = rs.getObject(7, OffsetDateTime.class);
OffsetDateTime endOffset = rs.getObject(8, OffsetDateTime.class);
if (beginOffset != null && endOffset != null) {
ZonedDateTime beginZdt = beginOffset.atZoneSameInstant(ZoneOffset.UTC);
ZonedDateTime endZdt = endOffset.atZoneSameInstant(ZoneOffset.UTC);
TimePeriod timePeriod = new TimePeriod();
timePeriod.setBeginPosition(beginZdt);
......@@ -113,10 +134,27 @@ public class TimeSeriesExporter implements ADEExporter {
} else if (abstractTimeSeries instanceof RegularTimeSeriesFile) {
RegularTimeSeriesFile regularTimeSeriesFile = (RegularTimeSeriesFile) abstractTimeSeries;
ZonedDateTime beginZdt = rs.getObject(7, ZonedDateTime.class);
ZonedDateTime endZdt = rs.getObject(8, ZonedDateTime.class);
//ZonedDateTime beginZdt = rs.getObject(7, ZonedDateTime.class);
//ZonedDateTime endZdt = rs.getObject(8, ZonedDateTime.class);
//if (beginZdt != null && endZdt != null) {
// TimePeriod timePeriod = new TimePeriod();
// timePeriod.setBeginPosition(beginZdt);
// timePeriod.setEndPosition(endZdt);
// TimePeriodProperty timePeriodProperty = new TimePeriodProperty();
// timePeriodProperty.setTimePeriod(timePeriod);
// regularTimeSeriesFile.setTemporalExtent(timePeriodProperty);
// }
OffsetDateTime beginOffset = rs.getObject(7, OffsetDateTime.class);
OffsetDateTime endOffset = rs.getObject(8, OffsetDateTime.class);
if (beginOffset != null && endOffset != null) {
// Convert to ZonedDateTime if your model requires it
ZonedDateTime beginZdt = beginOffset.atZoneSameInstant(ZoneOffset.UTC);
ZonedDateTime endZdt = endOffset.atZoneSameInstant(ZoneOffset.UTC);
if (beginZdt != null && endZdt != null) {
TimePeriod timePeriod = new TimePeriod();
timePeriod.setBeginPosition(beginZdt);
timePeriod.setEndPosition(endZdt);
......@@ -225,12 +263,17 @@ public class TimeSeriesExporter implements ADEExporter {
} else if (abstractTimeSeries instanceof TypicalValuesTimeSeriesFile) {
TypicalValuesTimeSeriesFile timeSeriesFile = (TypicalValuesTimeSeriesFile) abstractTimeSeries;
Time start_time = rs.getTime(9);
if (start_time != null) {
LocalTime localTime = start_time.toLocalTime();
ZonedDateTime zonedDateTime = localTime.atDate(LocalDate.now())
.atZone(ZoneId.systemDefault());
timeSeriesFile.setStartTime(zonedDateTime);
// Read the TIME column (no date)
Time sqlTime = rs.getTime(9);
if (sqlTime != null) {
LocalTime localTime = sqlTime.toLocalTime();
// Combine with dummy date and force UTC → exports as 12:30:00Z
ZonedDateTime utcTime = localTime
.atDate(LocalDate.of(2000, 1, 1))
.atZone(ZoneOffset.UTC);
timeSeriesFile.setStartTime(utcTime); // Will export as ...T12:30:00Z
}
Integer start_day = rs.getObject(10) != null ? rs.getInt(10) : null;
......@@ -326,7 +369,9 @@ public class TimeSeriesExporter implements ADEExporter {
}
String uom = rs.getString(18);
if (uom != null) {
if (uom != null && !uom.trim().isEmpty()) {
UnitOfMeasureType uomType = new UnitOfMeasureType();
uomType.setUom(uom.trim());
sensorConnection.setUom(uom);
}
......@@ -353,7 +398,7 @@ public class TimeSeriesExporter implements ADEExporter {
String base_url = rs.getString(27);
if (base_url != null) {
try {
sensorConnection.setBaseURL(URI.create(base_url));
sensorConnection.setBaseURL(URI.create(base_url.replace("%20", " ")));
} catch (IllegalArgumentException e) {
System.out.println("Invalid base_url for TimeSeries id=" + timeSeriesId + ": " + base_url);
}
......
......@@ -132,3 +132,4 @@ public class ImportManager implements ADEImportManager {
return type.cast(importer);
}
}
......@@ -9,9 +9,13 @@ import org.citydb.core.operation.importer.CityGMLImportException;
import org.citydb.core.operation.importer.util.AttributeValueJoiner;
import org.citygml4j.ade.energy3.model.supportingClasses.*;
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.util.Collections;
import java.time.ZoneOffset;
public class TimeSeriesImporter implements ADEImporter {
......@@ -49,10 +53,15 @@ public class TimeSeriesImporter implements ADEImporter {
psTimeSeries.setString(17, regularTimeSeries.getValues().getUom());
}
if (regularTimeSeries.isSetTemporalExtent()){
Timestamp beginPosition = Timestamp.from(regularTimeSeries.getTemporalExtent().getTimePeriod().getBeginPosition().toInstant());
Timestamp endPosition = Timestamp.from(regularTimeSeries.getTemporalExtent().getTimePeriod().getEndPosition().toInstant());
psTimeSeries.setTimestamp(7, beginPosition);
psTimeSeries.setTimestamp(8, endPosition);
ZonedDateTime begin = regularTimeSeries.getTemporalExtent().getTimePeriod().getBeginPosition();
ZonedDateTime end = regularTimeSeries.getTemporalExtent().getTimePeriod().getEndPosition();
// FIX 1: Force UTC so no timezone offset is applied
ZonedDateTime beginUTC = begin.withZoneSameInstant(ZoneOffset.UTC);
ZonedDateTime endUTC = end.withZoneSameInstant(ZoneOffset.UTC);
psTimeSeries.setTimestamp(7, Timestamp.from(beginUTC.toInstant()));
psTimeSeries.setTimestamp(8, Timestamp.from(endUTC.toInstant()));
}
if (regularTimeSeries.isSetTimeInterval()) {
psTimeSeries.setDouble(14, regularTimeSeries.getTimeInterval().getValue());
......@@ -76,10 +85,15 @@ public class TimeSeriesImporter implements ADEImporter {
if (timeSeriesFile.isSetValueColumnNumber())
psTimeSeries.setLong(23, timeSeriesFile.getValueColumnNumber());
if (timeSeriesFile.isSetTemporalExtent()){
Timestamp beginPosition = Timestamp.from(timeSeriesFile.getTemporalExtent().getTimePeriod().getBeginPosition().toInstant());
Timestamp endPosition = Timestamp.from(timeSeriesFile.getTemporalExtent().getTimePeriod().getEndPosition().toInstant());
psTimeSeries.setTimestamp(7, beginPosition);
psTimeSeries.setTimestamp(8, endPosition);
ZonedDateTime begin = timeSeriesFile.getTemporalExtent().getTimePeriod().getBeginPosition();
ZonedDateTime end = timeSeriesFile.getTemporalExtent().getTimePeriod().getEndPosition();
// FIX 1: Force UTC
ZonedDateTime beginUTC = begin.withZoneSameInstant(ZoneOffset.UTC);
ZonedDateTime endUTC = end.withZoneSameInstant(ZoneOffset.UTC);
psTimeSeries.setTimestamp(7, Timestamp.from(beginUTC.toInstant()));
psTimeSeries.setTimestamp(8, Timestamp.from(endUTC.toInstant()));
}
if (timeSeriesFile.isSetTimeInterval()) {
psTimeSeries.setDouble(14, timeSeriesFile.getTimeInterval().getValue());
......@@ -115,8 +129,10 @@ public class TimeSeriesImporter implements ADEImporter {
TypicalValuesTimeSeriesFile file = (TypicalValuesTimeSeriesFile) abstractTimeSeries;
if (file.isSetStartTime()) {
LocalTime localTime = file.getStartTime().toLocalTime();
Time sqlTime = Time.valueOf(localTime);
psTimeSeries.setTime(9, sqlTime);
// Store as UTC timestamp (dummy date doesn't matter)
ZonedDateTime utc = localTime.atDate(LocalDate.of(2000, 1, 1))
.atZone(ZoneOffset.UTC);
psTimeSeries.setTimestamp(9, Timestamp.from(utc.toInstant()));
}
if (file.isSetStartDay()) {
psTimeSeries.setInt(10, file.getStartDay());
......@@ -160,8 +176,9 @@ public class TimeSeriesImporter implements ADEImporter {
}
if (sensorConnection.isSetObservationProperty())
psTimeSeries.setString(36, sensorConnection.getObservationProperty());
if (sensorConnection.isSetUom())
if (sensorConnection.isSetUom() && sensorConnection.getUom() != null) {
psTimeSeries.setString(18, sensorConnection.getUom());
}
if (sensorConnection.isSetSensorID())
psTimeSeries.setString(37, sensorConnection.getSensorID());
if (sensorConnection.isSetSensorName())
......@@ -172,8 +189,11 @@ public class TimeSeriesImporter implements ADEImporter {
psTimeSeries.setString(36, sensorConnection.getObservationProperty());
if (sensorConnection.isSetDataStreamID())
psTimeSeries.setString(30, sensorConnection.getDataStreamID());
if (sensorConnection.isSetBaseURL())
psTimeSeries.setString(27, sensorConnection.getBaseURL().toString());
if (sensorConnection.isSetBaseURL()) {
String url = sensorConnection.getBaseURL().toString();
// Convert space → %20 so PostgreSQL doesn't turn it into +
psTimeSeries.setString(27, url.replace(" ", "%20"));
}
if (sensorConnection.isSetAuthType())
psTimeSeries.setString(25, sensorConnection.getAuthType().getValue());
psTimeSeries.setString(26, sensorConnection.getAuthType().getCodeSpace());
......
......@@ -118,4 +118,4 @@ public class WeatherDataImporter implements ADEImporter {
public void close() throws CityGMLImportException, SQLException {
ps.close();
}
}
}
\ No newline at end of file
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