From 4b52586f397c5c2921eca04b0e5d912fee3920d3 Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Fri, 29 Nov 2024 15:36:31 +0100 Subject: [PATCH] add page for upload of old report --- .../src/model/factories/OverviewFactory.ts | 59 +++++++----- report-viewer/src/router/index.ts | 7 ++ .../src/viewWrapper/ClusterViewWrapper.vue | 10 +- .../src/viewWrapper/ComparisonViewWrapper.vue | 10 +- .../viewWrapper/InformationViewWrapper.vue | 10 +- .../src/viewWrapper/OverviewViewWrapper.vue | 10 +- .../src/views/OldVersionRedirectView.vue | 95 +++++++++++++++++++ 7 files changed, 163 insertions(+), 38 deletions(-) create mode 100644 report-viewer/src/views/OldVersionRedirectView.vue diff --git a/report-viewer/src/model/factories/OverviewFactory.ts b/report-viewer/src/model/factories/OverviewFactory.ts index e388353e1b..565bd38181 100644 --- a/report-viewer/src/model/factories/OverviewFactory.ts +++ b/report-viewer/src/model/factories/OverviewFactory.ts @@ -15,7 +15,7 @@ export class OverviewFactory extends BaseFactory { /** * Gets the overview file based on the used mode (zip, local, single). */ - public static async getOverview(): Promise { + public static async getOverview(): Promise { return this.extractOverview(JSON.parse(await this.getFile('overview.json'))) } @@ -23,11 +23,16 @@ export class OverviewFactory extends BaseFactory { * Creates an overview object from a json object created by JPlag * @param json the json object */ - private static extractOverview(json: Record): Overview { + private static extractOverview(json: Record): OverviewExtractionResult { const versionField = json.jplag_version as Record const jplagVersion = Version.fromJsonField(versionField) - OverviewFactory.compareVersions(jplagVersion, reportViewerVersion, minimalReportVersion) + if (!OverviewFactory.compareVersions(jplagVersion, reportViewerVersion, minimalReportVersion)) { + return { + result: 'oldReport', + version: jplagVersion + } + } const submissionFolder = json.submission_folder_path as Array const baseCodeFolder = json.base_code_folder_path as string @@ -42,19 +47,25 @@ export class OverviewFactory extends BaseFactory { this.saveIdToDisplayNameMap(json) this.saveComparisonFilesLookup(json) - return new Overview( - submissionFolder, - baseCodeFolder, - language, - fileExtensions, - matchSensitivity, - dateOfExecution, - duration, - this.extractTopComparisons(json.top_comparisons as Array>, clusters), - this.extractDistributions(json.distributions as Record>), - clusters, - totalComparisons - ) + return { + result: 'success', + overview: new Overview( + submissionFolder, + baseCodeFolder, + language, + fileExtensions, + matchSensitivity, + dateOfExecution, + duration, + this.extractTopComparisons( + json.top_comparisons as Array>, + clusters + ), + this.extractDistributions(json.distributions as Record>), + clusters, + totalComparisons + ) + } } private static extractDistributions( @@ -153,6 +164,7 @@ export class OverviewFactory extends BaseFactory { * @param jsonVersion the version of the json file * @param reportViewerVersion the version of the report viewer * @param minimalVersion the minimal report version expected + * @return true if the version is supported, false if the version is old */ static compareVersions( jsonVersion: Version, @@ -179,15 +191,10 @@ export class OverviewFactory extends BaseFactory { } sessionStorage.setItem('versionAlert', 'true') } - if (jsonVersion.compareTo(minimalVersion) < 0) { - throw new Error( - "The result's version(" + - jsonVersion.toString() + - ') is older than the minimal support version of the report viewer(' + - minimalVersion.toString() + - '). ' + - 'Can not read the report.' - ) - } + return jsonVersion.compareTo(minimalVersion) >= 0 } } + +export type OverviewExtractionResult = + | { result: 'success'; overview: Overview } + | { result: 'oldReport'; version: Version } diff --git a/report-viewer/src/router/index.ts b/report-viewer/src/router/index.ts index 644c5c914c..5375338cbb 100644 --- a/report-viewer/src/router/index.ts +++ b/report-viewer/src/router/index.ts @@ -5,6 +5,7 @@ import ComparisonViewWrapper from '@/viewWrapper/ComparisonViewWrapper.vue' import ErrorView from '@/views/ErrorView.vue' import InformationViewWrapper from '@/viewWrapper/InformationViewWrapper.vue' import ClusterViewWrapper from '@/viewWrapper/ClusterViewWrapper.vue' +import OldVersionRedirectView from '@/views/OldVersionRedirectView.vue' /** * The router is used to navigate between the different views of the application. @@ -45,6 +46,12 @@ const router = createRouter({ name: 'InfoView', component: InformationViewWrapper }, + { + path: '/old/:version', + name: 'OldVersionRedirectView', + component: OldVersionRedirectView, + props: true + }, { path: '/:pathMatch(.*)*', redirect: '/error/Could not find the requested page/FileUploadView/Back to file upload' diff --git a/report-viewer/src/viewWrapper/ClusterViewWrapper.vue b/report-viewer/src/viewWrapper/ClusterViewWrapper.vue index 51876a6f08..3c203a8b74 100644 --- a/report-viewer/src/viewWrapper/ClusterViewWrapper.vue +++ b/report-viewer/src/viewWrapper/ClusterViewWrapper.vue @@ -18,7 +18,7 @@ import { OverviewFactory } from '@/model/factories/OverviewFactory' import ClusterView from '@/views/ClusterView.vue' import LoadingCircle from '@/components/LoadingCircle.vue' import type { Overview } from '@/model/Overview' -import { redirectOnError } from '@/router' +import { redirectOnError, router } from '@/router' import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' const props = defineProps({ @@ -33,8 +33,12 @@ const clusterIndex = computed(() => parseInt(props.clusterIndex)) const overview: Ref = ref(null) OverviewFactory.getOverview() - .then((o) => { - overview.value = o + .then((r) => { + if (r.result == 'success') { + overview.value = r.overview + } else if (r.result == 'oldReport') { + router.push({ name: 'OldVersionRedirectView', params: { version: r.version.toString() } }) + } }) .catch((error) => { redirectOnError(error, 'Could not load cluster:\n', 'OverviewView', 'Back to overview') diff --git a/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue b/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue index 47f04aac03..f7a9b22b64 100644 --- a/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue +++ b/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue @@ -25,7 +25,7 @@ import ComparisonView from '@/views/ComparisonView.vue' import type { Comparison } from '@/model/Comparison' import { ComparisonFactory } from '@/model/factories/ComparisonFactory' import LoadingCircle from '@/components/LoadingCircle.vue' -import { redirectOnError } from '@/router' +import { redirectOnError, router } from '@/router' import type { Language } from '@/model/Language' import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' import type { BaseCodeMatch } from '@/model/BaseCodeReport' @@ -55,8 +55,12 @@ const comparisonPromise = ComparisonFactory.getComparison(props.comparisonFileNa }) OverviewFactory.getOverview() - .then((overview) => { - language.value = overview.language + .then((r) => { + if (r.result == 'success') { + language.value = r.overview.language + } else if (r.result == 'oldReport') { + router.push({ name: 'OldVersionRedirectView', params: { version: r.version.toString() } }) + } }) .catch((error) => { redirectOnError(error, 'Could not load comparison:\n') diff --git a/report-viewer/src/viewWrapper/InformationViewWrapper.vue b/report-viewer/src/viewWrapper/InformationViewWrapper.vue index a939749582..7bacc094f5 100644 --- a/report-viewer/src/viewWrapper/InformationViewWrapper.vue +++ b/report-viewer/src/viewWrapper/InformationViewWrapper.vue @@ -18,7 +18,7 @@ import { OverviewFactory } from '@/model/factories/OverviewFactory' import InformationView from '@/views/InformationView.vue' import type { Overview } from '@/model/Overview' import LoadingCircle from '@/components/LoadingCircle.vue' -import { redirectOnError } from '@/router' +import { redirectOnError, router } from '@/router' import { OptionsFactory } from '@/model/factories/OptionsFactory' import type { CliOptions } from '@/model/CliOptions' import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' @@ -27,8 +27,12 @@ const overview: Ref = ref(null) const cliOptions: Ref = ref(undefined) OverviewFactory.getOverview() - .then((o) => { - overview.value = o + .then((r) => { + if (r.result == 'success') { + overview.value = r.overview + } else if (r.result == 'oldReport') { + router.push({ name: 'OldVersionRedirectView', params: { version: r.version.toString() } }) + } }) .catch((error) => { redirectOnError(error, 'Could not load information:\n', 'OverviewView', 'Back to overview') diff --git a/report-viewer/src/viewWrapper/OverviewViewWrapper.vue b/report-viewer/src/viewWrapper/OverviewViewWrapper.vue index e73d074db5..80e8e2f2d5 100644 --- a/report-viewer/src/viewWrapper/OverviewViewWrapper.vue +++ b/report-viewer/src/viewWrapper/OverviewViewWrapper.vue @@ -18,14 +18,18 @@ import { OverviewFactory } from '@/model/factories/OverviewFactory' import OverviewView from '@/views/OverviewView.vue' import type { Overview } from '@/model/Overview' import LoadingCircle from '@/components/LoadingCircle.vue' -import { redirectOnError } from '@/router' +import { redirectOnError, router } from '@/router' import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' const overview: Ref = ref(null) OverviewFactory.getOverview() - .then((o) => { - overview.value = o + .then((r) => { + if (r.result == 'success') { + overview.value = r.overview + } else if (r.result == 'oldReport') { + router.push({ name: 'OldVersionRedirectView', params: { version: r.version.toString() } }) + } }) .catch((error) => { redirectOnError(error, 'Could not load overview:\n') diff --git a/report-viewer/src/views/OldVersionRedirectView.vue b/report-viewer/src/views/OldVersionRedirectView.vue new file mode 100644 index 0000000000..cf60110ed3 --- /dev/null +++ b/report-viewer/src/views/OldVersionRedirectView.vue @@ -0,0 +1,95 @@ + + +