Skip to content

Commit

Permalink
Application Import error management
Browse files Browse the repository at this point in the history
Fix #158
Fix #156
  • Loading branch information
mauvaisetroupe committed Apr 21, 2024
1 parent a0dafab commit 94bf4f4
Show file tree
Hide file tree
Showing 25 changed files with 316 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.mauvaisetroupe.eadesignit.service.dto;

import com.mauvaisetroupe.eadesignit.domain.ApplicationImport;
import com.mauvaisetroupe.eadesignit.domain.enumeration.ImportStatus;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.ErrorLine;
import java.util.List;

public class ApplicationsImportDTO {

private ImportStatus status;
private List<ErrorLine> errorLines;
private String errorMessage;
private List<ApplicationImport> applicationImports;

public ApplicationsImportDTO(
List<ApplicationImport> applicationImports,
ImportStatus status,
List<ErrorLine> errorLines,
String errorMessage
) {
this.status = status;
this.errorLines = errorLines;
this.errorMessage = errorMessage;
this.applicationImports = applicationImports;
}

public ApplicationsImportDTO() {}

public ImportStatus getStatus() {
return status;
}

public void setStatus(ImportStatus status) {
this.status = status;
}

public List<ErrorLine> getErrorLines() {
return errorLines;
}

public void setErrorLines(List<ErrorLine> errorLines) {
this.errorLines = errorLines;
}

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}

public List<ApplicationImport> getApplicationImports() {
return applicationImports;
}

public void setApplicationImports(List<ApplicationImport> applicationImports) {
this.applicationImports = applicationImports;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.mauvaisetroupe.eadesignit.domain.ApplicationImport;
import com.mauvaisetroupe.eadesignit.domain.enumeration.ImportStatus;
import com.mauvaisetroupe.eadesignit.repository.ApplicationRepository;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.ErrorLine;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.ErrorLineException;
import com.mauvaisetroupe.eadesignit.service.importfile.util.ApplicationMapperUtil;
import jakarta.transaction.Transactional;
import java.io.IOException;
Expand Down Expand Up @@ -36,41 +38,57 @@ public ApplicationImportService(ApplicationRepository applicationRepository, App

@Transactional
public List<ApplicationImport> importExcel(InputStream inputStream, String originalFilename)
throws EncryptedDocumentException, IOException {
throws EncryptedDocumentException, IOException, ErrorLineException {
ExcelReader excelReader = new ExcelReader(inputStream);

List<ErrorLine> errorLines = new ArrayList();

// Browse Owner sheet and update or create Owners
List<Map<String, Object>> ownerDF = excelReader.getSheet(OWNER_SHEET_NAME);
for (Map<String, Object> map : ownerDF) {
applicationMapperUtil.mapArrayToOwner(map);
try {
applicationMapperUtil.mapArrayToOwner(map);
} catch (Exception e) {
log.error("Error adding owner " + map, e);
errorLines.add(new ErrorLine("Error adding owner " + map));
}
}

List<Map<String, Object>> applicationDF = excelReader.getSheet(APPLICATION_SHEET_NAME);
log.info("Found Excel sheet " + applicationDF);

List<ApplicationImport> result = new ArrayList<ApplicationImport>();
for (Map<String, Object> map : applicationDF) {
// Map to ApplicationImport DTO
ApplicationImport applicationImport = applicationMapperUtil.mapArrayToImportApplication(map);

// Check if Application with same Alias and Name already exist
Application application = findOrCreateApplication(applicationImport);
if (application.getId() != null) {
applicationImport.setImportStatus(ImportStatus.EXISTING);
} else {
applicationImport.setImportStatus(ImportStatus.NEW);
try {
// Map to ApplicationImport DTO
ApplicationImport applicationImport = applicationMapperUtil.mapArrayToImportApplication(map);

// Check if Application with same Alias and Name already exist
Application application = findApplication(applicationImport);
if (application.getId() != null) {
applicationImport.setImportStatus(ImportStatus.EXISTING);
} else {
applicationImport.setImportStatus(ImportStatus.NEW);
}

// Map ApplicationImport DTO to Application
applicationMapperUtil.mapApplicationImportToApplication(applicationImport, application);

applicationRepository.save(application);
result.add(applicationImport);
} catch (Exception e) {
log.error("Error adding application " + map, e);
errorLines.add(new ErrorLine("Error adding application " + map + ". Error message = " + e.getMessage()));
}

// Map ApplicationImport DTO to Application
applicationMapperUtil.mapApplicationImportToApplication(applicationImport, application);

applicationRepository.save(application);
result.add(applicationImport);
}
if (!errorLines.isEmpty()) {
throw new ErrorLineException("Error importing Applications Excel File", errorLines);
}

return result;
}

public Application findOrCreateApplication(ApplicationImport applicationImport) {
public Application findApplication(ApplicationImport applicationImport) {
// Check if alias not used for another application
Application application = applicationRepository.findByAlias(applicationImport.getIdFromExcel()).orElseGet(Application::new);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mauvaisetroupe.eadesignit.service.importfile.dto;

public class ErrorLine {

private String errorMessage;

public ErrorLine(String errorMessage) {
this.errorMessage = errorMessage;
}

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.mauvaisetroupe.eadesignit.service.importfile.dto;

import java.util.List;

public class ErrorLineException extends Exception {

private List<ErrorLine> errorLines;

public ErrorLineException(String message, List<ErrorLine> errorLines) {
super(message);
this.errorLines = errorLines;
}

public List<ErrorLine> getErrorLines() {
return errorLines;
}

public void setErrorLines(List<ErrorLine> errorLines) {
this.errorLines = errorLines;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,15 @@ public void mapApplicationImportToApplication(ApplicationImport applicationImpor
application.setAlias(applicationImport.getIdFromExcel());
application.setApplicationType(getApplicationType(applicationImport));
application.setSoftwareType(getSoftwareType(applicationImport));
application.setTechnologies(getTechnologies(applicationImport));
application.setCategories(getCategories(applicationImport));
application.setOwner(getOwner(applicationImport.getOwner()));
application.setItOwner(getOwner(applicationImport.getItOwner()));
application.setBusinessOwner(getOwner(applicationImport.getBusinessOwner()));
application.setTechnologies(findOrCreateTechnologies(applicationImport));
application.setCategories(findOrCreateCategories(applicationImport));
application.setOwner(findOrCreateOwner(applicationImport.getOwner()));
application.setItOwner(findOrCreateOwner(applicationImport.getItOwner()));
application.setBusinessOwner(findOrCreateOwner(applicationImport.getBusinessOwner()));

Set<ExternalReference> references = getExternalReferencesFromImport(applicationImport);
application.setExternalIDS(references);
application.setOrganizationalEntity(getOrganizationalEntity(applicationImport.getOrganizationalEntity()));
application.setOrganizationalEntity(findOrCreateOrganizationalEntity(applicationImport.getOrganizationalEntity()));
}

public void mapApplicationImportToComponent(ApplicationImport applicationImport, final ApplicationComponent application) {
Expand All @@ -155,8 +155,8 @@ public void mapApplicationImportToComponent(ApplicationImport applicationImport,
application.setAlias(applicationImport.getIdFromExcel());
application.setApplicationType(getApplicationType(applicationImport));
application.setSoftwareType(getSoftwareType(applicationImport));
application.setTechnologies(getTechnologies(applicationImport));
application.setCategories(getCategories(applicationImport));
application.setTechnologies(findOrCreateTechnologies(applicationImport));
application.setCategories(findOrCreateCategories(applicationImport));

Set<ExternalReference> references = getExternalReferencesFromImport(applicationImport);
application.setExternalIDS(references);
Expand All @@ -180,7 +180,7 @@ private ApplicationType getApplicationType(ApplicationImport applicationImport)
return applicationType;
}

private Set<Technology> getTechnologies(ApplicationImport applicationImport) {
private Set<Technology> findOrCreateTechnologies(ApplicationImport applicationImport) {
Set<Technology> technologies = new HashSet<>();
for (String _technology : applicationImport.getTechnologies()) {
if (StringUtils.hasText(_technology)) {
Expand All @@ -196,7 +196,7 @@ private Set<Technology> getTechnologies(ApplicationImport applicationImport) {
return technologies;
}

private Set<ApplicationCategory> getCategories(ApplicationImport applicationImport) {
private Set<ApplicationCategory> findOrCreateCategories(ApplicationImport applicationImport) {
Set<ApplicationCategory> categories = new HashSet<>();
for (String _category : applicationImport.getCategories()) {
ApplicationCategory applicationCategory = applicationCategoryRepository.findByNameIgnoreCase(_category);
Expand All @@ -210,7 +210,7 @@ private Set<ApplicationCategory> getCategories(ApplicationImport applicationImpo
return categories;
}

private Owner getOwner(String ownerName) {
private Owner findOrCreateOwner(String ownerName) {
Owner owner = null;
if (StringUtils.hasText(ownerName)) {
owner = ownerRepository.findByNameIgnoreCase(ownerName);
Expand All @@ -223,7 +223,7 @@ private Owner getOwner(String ownerName) {
return owner;
}

private OrganizationalEntity getOrganizationalEntity(String organizationalEntityName) {
private OrganizationalEntity findOrCreateOrganizationalEntity(String organizationalEntityName) {
OrganizationalEntity organizationalEntity = null;
if (StringUtils.hasText(organizationalEntityName)) {
organizationalEntity = organizationalEntityRepository.findByNameIgnoreCase(organizationalEntityName);
Expand Down Expand Up @@ -252,6 +252,8 @@ public void mapArrayToOwner(Map<String, Object> map) {
Matcher matcher = pattern.matcher(potentialEmail);
if (matcher.matches()) {
owner.setEmail(potentialEmail);
} else {
owner.setEmail(null);
}
}
ownerRepository.save(owner);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import com.mauvaisetroupe.eadesignit.domain.FlowImport;
import com.mauvaisetroupe.eadesignit.domain.FunctionalFlow;
import com.mauvaisetroupe.eadesignit.domain.LandscapeView;
import com.mauvaisetroupe.eadesignit.domain.enumeration.ImportStatus;
import com.mauvaisetroupe.eadesignit.repository.LandscapeViewRepository;
import com.mauvaisetroupe.eadesignit.service.dto.ApplicationsImportDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.ApplicationCapabilityImportService;
import com.mauvaisetroupe.eadesignit.service.importfile.ApplicationExportService;
import com.mauvaisetroupe.eadesignit.service.importfile.ApplicationImportService;
Expand All @@ -25,6 +27,7 @@
import com.mauvaisetroupe.eadesignit.service.importfile.dto.CapabilityImportAnalysisDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.CapabilityImportDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.DataObjectDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.ErrorLineException;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.FlowImportDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.dto.SummarySheetDTO;
import com.mauvaisetroupe.eadesignit.service.importfile.util.SummaryImporterService;
Expand Down Expand Up @@ -118,9 +121,18 @@ public List<SummarySheetDTO> getSummary(@RequestPart MultipartFile file) throws
}

@PostMapping("/import/application/upload-file")
public List<ApplicationImport> uploadFile(@RequestPart MultipartFile file) throws Exception {
public ApplicationsImportDTO uploadFile(@RequestPart MultipartFile file) throws Exception {
List<ApplicationImport> applicationImports = null;
ApplicationsImportDTO applicationsImportDTO = new ApplicationsImportDTO();
try {
return applicationImportService.importExcel(file.getInputStream(), file.getOriginalFilename());
applicationImports = applicationImportService.importExcel(file.getInputStream(), file.getOriginalFilename());
applicationsImportDTO.setApplicationImports(applicationImports);
return applicationsImportDTO;
} catch (ErrorLineException e) {
applicationsImportDTO.setErrorLines(e.getErrorLines());
applicationsImportDTO.setStatus(ImportStatus.ERROR);
applicationsImportDTO.setErrorMessage(e.getMessage());
return applicationsImportDTO;
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationImportException(e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { defineComponent, inject, ref, type Ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useAlertService } from '@/shared/alert/alert.service';

import { type IApplicationImport } from '@/shared/model/application-import.model';
import { type IApplicationImport, type IApplicationsImportDTO } from '@/shared/model/application-import.model';
import ApplicationImportService from './application-import.service';

export default defineComponent({
Expand All @@ -15,7 +15,7 @@ export default defineComponent({
const route = useRoute();
const router = useRouter();

const applicationImports: Ref<IApplicationImport[]> = ref([]);
const applicationsImportDTO: Ref<IApplicationsImportDTO> = ref({});
const excelFile = ref();
const isFetching = ref(false);
const fileSubmited = ref(false);
Expand All @@ -31,7 +31,7 @@ export default defineComponent({
fileSubmited.value = true;
try {
const res = await applicationImportService().uploadFile(excelFile.value.files[0]);
applicationImports.value = res.data;
applicationsImportDTO.value = res.data;
isFetching.value = false;
rowsLoaded.value = true;
} catch (error) {
Expand All @@ -46,7 +46,7 @@ export default defineComponent({
excelFileName,
isFetching,
rowsLoaded,
applicationImports,
applicationsImportDTO,
handleFileUpload,
submitFile,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,26 @@
</div>

<br />
<div class="alert alert-warning" v-if="rowsLoaded && applicationImports && applicationImports.length === 0">
<div class="alert alert-warning" v-if="rowsLoaded && applicationsImportDTO?.applicationImports?.length === 0">
<span>No applicationImports found</span>
</div>

<div class="table-responsive" v-if="applicationImports && applicationImports.length > 0">
<div class="table-responsive" v-if="applicationsImportDTO?.errorLines?.length > 0">
<table class="table table-striped" aria-describedby="applicationImports">
<thead>
<tr>
<th scope="row"><span>Error Message</span></th>
</tr>
</thead>
<tbody>
<tr v-for="(errorLine, i) in applicationsImportDTO?.errorLines" :key="i" data-cy="entityTable">
<td>{{ errorLine.errorMessage }}</td>
</tr>
</tbody>
</table>
</div>

<div class="table-responsive" v-if="applicationsImportDTO?.applicationImports?.length > 0">
<table class="table table-striped" aria-describedby="applicationImports">
<thead>
<tr>
Expand All @@ -56,7 +71,7 @@
</tr>
</thead>
<tbody>
<tr v-for="applicationImport in applicationImports" :key="applicationImport.id" data-cy="entityTable">
<tr v-for="applicationImport in applicationsImportDTO?.applicationImports" :key="applicationImport.id" data-cy="entityTable">
<td>{{ applicationImport.id }}</td>
<td>{{ applicationImport.importId }}</td>
<td>{{ applicationImport.excelFileName }}</td>
Expand Down
12 changes: 12 additions & 0 deletions src/main/webapp/app/shared/model/application-import.model.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import { type ImportStatus } from '@/shared/model/enumerations/import-status.model';

export interface ErrorLine {
errorMessage: string;
}

export interface IApplicationsImportDTO {
status?: ImportStatus | null;
errorMessage?: string | null;
applicationImports?: IApplicationImport[] | null;
errorLines?: ErrorLine[] | null;
}

export interface IApplicationImport {
id?: number;
importId?: string | null;
Expand Down
Loading

0 comments on commit 94bf4f4

Please sign in to comment.