Skip to content

Commit

Permalink
fix: 346 bug importing 3rd party json misses detecting non stop trans…
Browse files Browse the repository at this point in the history
…itions (#347)

* fix: non-stop transition is fine and user information with the help of logService

* fix: non-stop transition detection and refactoring done
  • Loading branch information
aiAdrian authored Nov 13, 2024
1 parent 5adbfc4 commit 9d71b4a
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 50 deletions.
154 changes: 104 additions & 50 deletions src/app/view/editor-tools-view-component/editor-tools-view.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,64 +73,34 @@ export class EditorToolsViewComponent {
const file = param.target.files[0];
const reader = new FileReader();
reader.onload = () => {
const netzgrafikDto: NetzgrafikDto = JSON.parse(reader.result.toString());
let netzgrafikDto: any;
try {
netzgrafikDto = JSON.parse(reader.result.toString());
} catch (err: any) {
const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`;
this.logger.error(msg);
return;
}

if (netzgrafikDto === undefined) {
const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`;
this.logger.error(msg);
return;
}

if (
"nodes" in netzgrafikDto &&
"trainrunSections" in netzgrafikDto &&
"trainruns" in netzgrafikDto &&
"resources" in netzgrafikDto &&
"metadata" in netzgrafikDto
) {
// prepare JSON import
this.uiInteractionService.showNetzgrafik();
this.uiInteractionService.closeNodeStammdaten();
this.uiInteractionService.closePerlenkette();
this.nodeService.unselectAllNodes();

// check for 3rd Party JSON generated files
const detect3rdParty =
netzgrafikDto.nodes.find((n: NodeDto) =>
n.ports === undefined) !== undefined
||
netzgrafikDto.nodes.filter((n: NodeDto) =>
n.ports?.length === 0).length === netzgrafikDto.nodes.length
||
netzgrafikDto.trainrunSections.find((ts: TrainrunSectionDto) =>
ts.path === undefined ||
ts.path?.path === undefined ||
ts.path?.path?.length === 0
) !== undefined;

// import data
if (
netzgrafikDto.trainrunSections.length === 0
||
!detect3rdParty
) {
// -----------------------------------------------
// Default: Netzgrafik-Editor exported JSON
// -----------------------------------------------
this.dataService.loadNetzgrafikDto(netzgrafikDto);
// -----------------------------------------------
} else {
// --------------------------------------------------------------------------------
// 3rd party generated JSON detected
// --------------------------------------------------------------------------------
console.log("Import: Automatic Port Alignment Detection - 3rd Party Data Import.");
// --------------------------------------------------------------------------------
// (Step 1) Import only nodes
// (Step 2) Import nodes and trainrunSectiosn by trainrun inseration (copy => create)
const netzgrafikOnlyNodeDto: NetzgrafikDto = JSON.parse(reader.result.toString());
netzgrafikOnlyNodeDto.trainruns = [];
netzgrafikOnlyNodeDto.trainrunSections = [];
this.dataService.loadNetzgrafikDto(netzgrafikOnlyNodeDto);
this.dataService.insertCopyNetzgrafikDto(netzgrafikDto);
this.trainrunService.propagateInitialConsecutiveTimes();
}

// recompute viewport
this.uiInteractionService.viewportCenteringOnNodesBoundingBox();
this.processNetzgrafikJSON(netzgrafikDto);
return;
}

const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`;
this.logger.error(msg);
};
reader.readAsText(file);

Expand Down Expand Up @@ -605,4 +575,88 @@ export class EditorToolsViewComponent {

return this.buildCSVString(headers, rows);
}

private detectNetzgrafikJSON3rdParty(netzgrafikDto: NetzgrafikDto): boolean {
return netzgrafikDto.nodes.find((n: NodeDto) =>
n.ports === undefined) !== undefined
||
netzgrafikDto.nodes.filter((n: NodeDto) =>
n.ports?.length === 0).length === netzgrafikDto.nodes.length
||
netzgrafikDto.trainrunSections.find((ts: TrainrunSectionDto) =>
ts.path === undefined ||
ts.path?.path === undefined ||
ts.path?.path?.length === 0
) !== undefined;
}

private processNetzgrafikJSON3rdParty(netzgrafikDto: NetzgrafikDto) {
// --------------------------------------------------------------------------------
// 3rd party generated JSON detected
// --------------------------------------------------------------------------------
console.log("Import: Automatic Port Alignment Detection - 3rd Party Data Import.");
const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-as-json-info-3rd-party:3rd party import`;
this.logger.info(msg);


// --------------------------------------------------------------------------------
// (Step 1) Import only nodes
const netzgrafikOnlyNodeDto: NetzgrafikDto = Object.assign({}, netzgrafikDto);
netzgrafikOnlyNodeDto.trainruns = [];
netzgrafikOnlyNodeDto.trainrunSections = [];
this.dataService.loadNetzgrafikDto(netzgrafikOnlyNodeDto);

// (Step 2) Import nodes and trainrunSectiosn by trainrun inseration (copy => create)
this.dataService.insertCopyNetzgrafikDto(netzgrafikDto);

// step(3) Check whether a transitions object was given when not
// departureTime - arrivatelTime == 0 => non-stop
this.nodeService.getNodes().forEach((n) => {
n.getTransitions().forEach((trans) => {
const p1 = n.getPort(trans.getPortId1());
const p2 = n.getPort(trans.getPortId2());
let arrivalTime = p1.getTrainrunSection().getTargetArrival();
if (p1.getTrainrunSection().getSourceNodeId() === n.getId()) {
arrivalTime = p1.getTrainrunSection().getSourceArrival();
}
let departureTime = p2.getTrainrunSection().getTargetDeparture();
if (p2.getTrainrunSection().getSourceNodeId() === n.getId()) {
departureTime = p2.getTrainrunSection().getSourceDeparture();
}
trans.setIsNonStopTransit(arrivalTime - departureTime === 0);
});
});

// step(4) Recalc/propagte consecutive times
this.trainrunService.propagateInitialConsecutiveTimes();
}

private processNetzgrafikJSON(netzgrafikDto: NetzgrafikDto) {
// prepare JSON import
this.uiInteractionService.showNetzgrafik();
this.uiInteractionService.closeNodeStammdaten();
this.uiInteractionService.closePerlenkette();
this.nodeService.unselectAllNodes();

// import data
if (
netzgrafikDto.trainrunSections.length === 0
||
!this.detectNetzgrafikJSON3rdParty(netzgrafikDto)
) {
// -----------------------------------------------
// Default: Netzgrafik-Editor exported JSON
// -----------------------------------------------
this.dataService.loadNetzgrafikDto(netzgrafikDto);
// -----------------------------------------------
} else {
// -----------------------------------------------
// 3rd Party: Netzgrafik-Editor exported JSON
// -----------------------------------------------
this.processNetzgrafikJSON3rdParty(netzgrafikDto);
}

// recompute viewport
this.uiInteractionService.viewportCenteringOnNodesBoundingBox();
}
}
2 changes: 2 additions & 0 deletions src/assets/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,9 @@
"export-netzgrafik": "Netzgrafik exportieren",
"export-netzgrafik-as-json": "Netzgrafik als JSON exportieren",
"import-netzgrafik": "Netzgrafik importieren",
"import-netzgrafik-error": "Netzgrafik konnte nicht importiert werden.",
"import-netzgrafik-as-json": "Netzgrafik aus JSON importieren",
"import-netzgrafik-as-json-info-3rd-party": "Drittanbieter JSON Daten erkannt: Import Heuristik angewandt.",
"export-trainruns": "Zugfahrten exportieren",
"export-trainruns-as-csv": "Zugfahrten als CSV exportieren",
"export-trainruns-as-csv-excel": "In Excel: Daten -> Aus Text/CSV -> Filename ... importieren",
Expand Down
2 changes: 2 additions & 0 deletions src/assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,9 @@
"export-netzgrafik": "Export netzgrafik",
"export-netzgrafik-as-json": "Export netzgrafik as JSON",
"import-netzgrafik": "Import netzgrafik",
"import-netzgrafik-error": "Netzgrafik could not be imported.",
"import-netzgrafik-as-json": "Import netzgrafik as JSON",
"import-netzgrafik-as-json-info-3rd-party": "Third-party JSON data detected: Import heuristic applied.",
"export-trainruns": "Export trainruns",
"export-trainruns-as-csv": "Export trainruns as CSV",
"export-trainruns-as-csv-excel": "In Excel: Data -> From Text/CSV -> Import ... filename",
Expand Down
2 changes: 2 additions & 0 deletions src/assets/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,9 @@
"export-netzgrafik": "Exporter le réticulaire",
"export-netzgrafik-as-json": "Exporter le réticulaire au format JSON",
"import-netzgrafik": "Importer le réticulaire",
"import-netzgrafik-error": "Le réticulaire au format JSON n'ont pas pu être importés.",
"import-netzgrafik-as-json": "Importer le réticulaire au format JSON",
"import-netzgrafik-as-json-info-3rd-party": "Réticulaire au format JSON de tiers détectées: heuristique d'importation appliquée.",
"export-trainruns": "Exporter les trajets de train",
"export-trainruns-as-csv": "Exporter les trajets de train au format CSV",
"export-trainruns-as-csv-excel": "Dans Excel : Données -> txt/CSV -> Importer ... nom de fichier",
Expand Down
2 changes: 2 additions & 0 deletions src/assets/i18n/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -438,9 +438,11 @@
"print": "Print",
"netzgrafik": "Netzgrafik",
"export-netzgrafik": "Export netzgrafik",
"import-netzgrafik-error": "Netzgrafik could not be imported.",
"export-netzgrafik-as-json": "Export netzgrafik as JSON",
"import-netzgrafik": "Import netzgrafik",
"import-netzgrafik-as-json": "Import netzgrafik as JSON",
"import-netzgrafik-as-json-info-3rd-party": "Third-party JSON data detected: Import heuristic applied.",
"export-trainruns": "Export trainruns",
"export-trainruns-as-csv": "Export trainruns as CSV",
"export-trainruns-as-csv-excel": "In Excel: Data -> From Text/CSV -> Import ... filename",
Expand Down

0 comments on commit 9d71b4a

Please sign in to comment.