Skip to content

Commit

Permalink
MID-7955: fixed CSV report to honour selected encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Aug 8, 2022
1 parent e966dbf commit 70eb34a
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 94 deletions.
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.report.impl.activity;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.repo.common.activity.run.ActivityRunException;
import com.evolveum.midpoint.repo.common.activity.run.*;
import com.evolveum.midpoint.repo.common.activity.run.processing.ItemProcessingRequest;
import com.evolveum.midpoint.report.impl.activity.ExportDashboardActivitySupport.DashboardWidgetHolder;
import com.evolveum.midpoint.report.impl.ReportServiceImpl;
import com.evolveum.midpoint.report.impl.ReportUtils;
import com.evolveum.midpoint.report.impl.activity.ExportDashboardActivitySupport.DashboardWidgetHolder;
import com.evolveum.midpoint.report.impl.controller.*;
import com.evolveum.midpoint.schema.ObjectHandler;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.RunningTask;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

/**
* Activity execution specifics for classical report export.
*/
Expand All @@ -45,7 +43,7 @@ public final class ClassicDashboardReportExportActivityRun
@NotNull private final ReportServiceImpl reportService;

/**
* Data writer which completize context of report.
* Data writer which complete context of report.
*/
private ReportDataWriter<? extends ExportedReportDataRow, ? extends ExportedReportHeaderRow> dataWriter;

Expand Down Expand Up @@ -197,7 +195,7 @@ private <C extends Containerable> ExportController<C> getController(@NotNull Exp
}

@Override
public void afterRun(OperationResult result) throws CommonException, ActivityRunException {
public void afterRun(OperationResult result) throws CommonException {
support.saveReportFile(dataWriter, result);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.report.impl.activity;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.*;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand Down Expand Up @@ -37,16 +46,6 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;

/**
* Contains common functionality for save exported report file executions.
* This is an experiment - using object composition instead of inheritance.
Expand Down Expand Up @@ -85,15 +84,15 @@ class SaveReportFileSupport {
void saveReportFile(String aggregatedData,
ReportDataWriter<? extends ExportedReportDataRow, ? extends ExportedReportHeaderRow> dataWriter,
OperationResult result) throws CommonException {
storeExportedReport(dataWriter.completizeReport(aggregatedData), dataWriter, result);
storeExportedReport(dataWriter.completeReport(aggregatedData), dataWriter, result);
}

void saveReportFile(ReportDataWriter<? extends ExportedReportDataRow, ? extends ExportedReportHeaderRow> dataWriter,
OperationResult result) throws CommonException {
storeExportedReport(dataWriter.completizeReport(), dataWriter, result);
storeExportedReport(dataWriter.completeReport(), dataWriter, result);
}

private void storeExportedReport(String completizedReport,
private void storeExportedReport(String completedReport,
ReportDataWriter<? extends ExportedReportDataRow, ? extends ExportedReportHeaderRow> dataWriter,
OperationResult result) throws CommonException {

Expand All @@ -106,15 +105,15 @@ private void storeExportedReport(String completizedReport,

if (StoreExportedWidgetDataType.ONLY_FILE.equals(storeType)
|| StoreExportedWidgetDataType.WIDGET_AND_FILE.equals(storeType)) {
writeToReportFile(completizedReport, aggregatedFilePath);
writeToReportFile(completedReport, aggregatedFilePath, dataWriter.getEncoding());
saveReportDataObject(dataWriter, aggregatedFilePath, result);
if (report.getPostReportScript() != null) {
processPostReportScript(report, aggregatedFilePath, runningTask, result);
}
}
if ((StoreExportedWidgetDataType.ONLY_WIDGET.equals(storeType)
|| StoreExportedWidgetDataType.WIDGET_AND_FILE.equals(storeType))
&& dataWriter instanceof DashboardReportDataWriter){
&& dataWriter instanceof DashboardReportDataWriter) {
DashboardType dashboard = reportService.getObjectResolver().resolve(
report.getDashboard().getDashboardRef(),
DashboardType.class,
Expand All @@ -128,11 +127,11 @@ private void storeExportedReport(String completizedReport,
widgets.forEach(widget -> {
String widgetData = widgetsData.get(widget.getIdentifier());
if (StringUtils.isEmpty(widgetData)) {
return;
return;
}
DashboardWidgetDataType data = widget.getData();
if (data == null) {
data = new DashboardWidgetDataType().storedData(widgetData);
data = new DashboardWidgetDataType().storedData(widgetData);
PrismContainerDefinition<Containerable> def = dashboard.asPrismObject().getDefinition().findContainerDefinition(
ItemPath.create(DashboardType.F_WIDGET, DashboardWidgetType.F_DATA));
ContainerDelta<Containerable> delta = def.createEmptyDelta(
Expand Down Expand Up @@ -185,11 +184,11 @@ private static String getDateTime() {
return formatDate.format(createDate);
}

private void writeToReportFile(String contextOfFile, String aggregatedFilePath) {
private void writeToReportFile(String contextOfFile, String aggregatedFilePath, @NotNull Charset encoding) {
try {
FileUtils.writeByteArrayToFile(
new File(aggregatedFilePath),
contextOfFile.getBytes(Charset.defaultCharset()));
contextOfFile.getBytes(encoding));
} catch (IOException e) {
throw new SystemException("Couldn't write aggregated report to " + aggregatedFilePath, e);
}
Expand All @@ -198,7 +197,7 @@ private void writeToReportFile(String contextOfFile, String aggregatedFilePath)
private void saveReportDataObject(
ReportDataWriter<? extends ExportedReportDataRow, ? extends ExportedReportHeaderRow> dataWriter,
String filePath,
OperationResult parentResult) throws CommonException {
OperationResult parentResult) throws CommonException {

String reportDataName = getNameOfExportedReportData(report, dataWriter.getType());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.report.impl.controller;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

import org.jetbrains.annotations.NotNull;

/**
* Creates and manipulates exported reports.
*/
public abstract class AbstractReportDataWriter<ED extends ExportedReportDataRow, EH extends ExportedReportHeaderRow> implements ReportDataWriter<ED, EH> {
public abstract class AbstractReportDataWriter<ED extends ExportedReportDataRow, EH extends ExportedReportHeaderRow>
implements ReportDataWriter<ED, EH> {

/**
* Header row to be put into resulting CSV file.
Expand Down Expand Up @@ -76,12 +76,12 @@ public void reset() {
public abstract boolean shouldWriteHeader();

@Override
public String completizeReport(String aggregatedData) {
public String completeReport(String aggregatedData) {
return aggregatedData;
}

@Override
public String completizeReport() {
return completizeReport(getStringData());
public String completeReport() {
return completeReport(getStringData());
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.report.impl.controller;

import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FileFormatConfigurationType;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FileFormatConfigurationType;

/**
* Creates and manipulates exported reports in CSV format.
*/
public class CsvReportDataWriter extends AbstractReportDataWriter<ExportedReportDataRow, ExportedReportHeaderRow> implements DashboardReportDataWriter {
public class CsvReportDataWriter extends AbstractReportDataWriter<ExportedReportDataRow, ExportedReportHeaderRow>
implements DashboardReportDataWriter {

@NotNull private final CommonCsvSupport support;

Expand Down Expand Up @@ -114,7 +115,18 @@ private String formatColumn(List<String> values) {
}

@Override
@NotNull public Map<String, String> getWidgetsData() {
@NotNull
public Map<String, String> getWidgetsData() {
return widgetsData;
}

@Override
public @NotNull Charset getEncoding() {
String encoding = support.getEncoding();
try {
return encoding != null ? Charset.forName(encoding) : super.getEncoding();
} catch (Exception e) {
return super.getEncoding();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.report.impl.controller;

import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.report.impl.ReportServiceImpl;

import com.evolveum.midpoint.xml.ns._public.common.common_3.FileFormatConfigurationType;
import java.util.*;
import java.util.function.Function;

import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;
import java.util.function.Function;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.report.impl.ReportServiceImpl;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FileFormatConfigurationType;

/**
* Creates and manipulates exported reports in HTML format for dashboard reports.
*/
public class HtmlDashboardReportDataWriter
extends HtmlReportDataWriter<ExportedDashboardReportDataRow, ExportedDashboardReportHeaderRow> implements DashboardReportDataWriter{
extends HtmlReportDataWriter<ExportedDashboardReportDataRow, ExportedDashboardReportHeaderRow> implements DashboardReportDataWriter {

private static final String BASIC_WIDGET_ROW_KEY = "BaseWidgetID";

Expand Down Expand Up @@ -129,7 +127,7 @@ public boolean shouldWriteHeader() {
}

@Override
public String completizeReport(String aggregatedData) {
public String completeReport(String aggregatedData) {
CommonHtmlSupport support = getDefaultSupport();
String cssStyle = support.getCssStyle();

Expand All @@ -152,7 +150,7 @@ public String completizeReport(String aggregatedData) {
}

@Override
public String completizeReport() {
public String completeReport() {
CommonHtmlSupport support = getDefaultSupport();
String cssStyle = support.getCssStyle();

Expand Down Expand Up @@ -183,7 +181,8 @@ private CommonHtmlSupport getDefaultSupport() {
}

@Override
@NotNull public Map<String, String> getWidgetsData() {
@NotNull
public Map<String, String> getWidgetsData() {
return widgetsData;
}

Expand Down

0 comments on commit 70eb34a

Please sign in to comment.