Skip to content

Commit f8dd94e

Browse files
committed
Ensure we always save an SVG file
1 parent 3bcfa7b commit f8dd94e

File tree

1 file changed

+53
-19
lines changed

1 file changed

+53
-19
lines changed

Kitodo/src/main/java/org/kitodo/production/forms/WorkflowForm.java

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.List;
2929
import java.util.Map;
3030
import java.util.Objects;
31+
import java.util.stream.Collectors;
3132

3233
import javax.faces.context.ExternalContext;
3334
import javax.faces.context.FacesContext;
@@ -76,6 +77,8 @@ public class WorkflowForm extends BaseForm {
7677
private static final String SVG_EXTENSION = ".svg";
7778
private static final String SVG_DIAGRAM_URI = "svgDiagramURI";
7879
private static final String XML_DIAGRAM_URI = "xmlDiagramURI";
80+
private Map<String, URI> activeDiagramsUris = new HashMap<>();
81+
private String activeWorkflowTitle;
7982
private final String workflowEditPath = MessageFormat.format(REDIRECT_PATH, "workflowEdit");
8083
private Integer roleId;
8184
private boolean migration;
@@ -121,20 +124,19 @@ public void setWorkflowStatus(WorkflowStatus workflowStatus) {
121124
public void readXMLDiagram() {
122125
URI xmlDiagramURI = new File(
123126
ConfigCore.getKitodoDiagramDirectory() + encodeXMLDiagramName(this.workflow.getTitle())).toURI();
124-
if (fileService.fileExist(xmlDiagramURI)) {
125-
try (InputStream inputStream = fileService.read(xmlDiagramURI);
126-
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
127-
StringBuilder sb = new StringBuilder();
128-
String line = bufferedReader.readLine();
129-
while (Objects.nonNull(line)) {
130-
sb.append(line).append("\n");
131-
line = bufferedReader.readLine();
132-
}
133-
xmlDiagram = sb.toString();
127+
xmlDiagram = readFileContent(xmlDiagramURI);
128+
}
129+
130+
private String readFileContent(URI fileUri) {
131+
if (fileService.fileExist(fileUri)) {
132+
try (InputStream inputStream = fileService.read(fileUri);
133+
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
134+
return reader.lines().collect(Collectors.joining("\n"));
134135
} catch (IOException e) {
135136
Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
136137
}
137138
}
139+
return "";
138140
}
139141

140142
/**
@@ -154,6 +156,11 @@ public String saveAndRedirect() {
154156
if (!this.workflow.getTemplates().isEmpty()) {
155157
updateTemplateTasks();
156158
}
159+
if (Objects.nonNull(activeWorkflowTitle)
160+
&& !activeWorkflowTitle.equals(this.workflow.getTitle())) {
161+
deleteOldWorkflowFiles(activeWorkflowTitle);
162+
activeWorkflowTitle = this.workflow.getTitle();
163+
}
157164
if (migration) {
158165
migration = false;
159166
return MIGRATION_FORM_PATH + "&workflowId=" + workflow.getId();
@@ -247,20 +254,33 @@ public void delete() {
247254
} else {
248255
try {
249256
ServiceManager.getWorkflowService().remove(this.workflow);
257+
deleteOldWorkflowFiles(this.workflow.getTitle());
250258

251-
String diagramDirectory = ConfigCore.getKitodoDiagramDirectory();
252-
URI svgDiagramURI = new File(
253-
diagramDirectory + decodeXMLDiagramName(this.workflow.getTitle()) + SVG_EXTENSION).toURI();
254-
URI xmlDiagramURI = new File(diagramDirectory + encodeXMLDiagramName(this.workflow.getTitle()))
255-
.toURI();
259+
} catch (DataException e) {
260+
Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.WORKFLOW.getTranslationSingular() },
261+
logger, e);
262+
}
263+
}
264+
}
256265

266+
private void deleteOldWorkflowFiles(String oldDiagramTitle) {
267+
try {
268+
String diagramDirectory = ConfigCore.getKitodoDiagramDirectory();
269+
URI svgDiagramURI = new File(
270+
diagramDirectory + decodeXMLDiagramName(oldDiagramTitle) + SVG_EXTENSION).toURI();
271+
URI xmlDiagramURI = new File(diagramDirectory + encodeXMLDiagramName(oldDiagramTitle))
272+
.toURI();
273+
if (fileService.fileExist(svgDiagramURI)) {
257274
fileService.delete(svgDiagramURI);
275+
}
276+
if (fileService.fileExist(xmlDiagramURI)) {
258277
fileService.delete(xmlDiagramURI);
259-
} catch (DataException | IOException e) {
260-
Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.WORKFLOW.getTranslationSingular() },
261-
logger, e);
262278
}
279+
} catch (IOException e) {
280+
Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.WORKFLOW.getTranslationSingular() },
281+
logger, e);
263282
}
283+
264284
}
265285

266286
/**
@@ -287,6 +307,8 @@ private boolean saveFiles() throws IOException, WorkflowException {
287307
Helper.setErrorMessage("emptyWorkflow");
288308
return false;
289309
}
310+
activeDiagramsUris.put(XML_DIAGRAM_URI, xmlDiagramURI);
311+
290312

291313
Reader reader = new Reader(new ByteArrayInputStream(xmlDiagram.getBytes(StandardCharsets.UTF_8)));
292314
reader.validateWorkflowTasks();
@@ -296,10 +318,20 @@ private boolean saveFiles() throws IOException, WorkflowException {
296318

297319
if (Objects.nonNull(svgDiagram)) {
298320
saveFile(svgDiagramURI, svgDiagram);
321+
activeDiagramsUris.put(SVG_DIAGRAM_URI, svgDiagramURI);
322+
} else {
323+
if (fileService.fileExist(activeDiagramsUris.get(SVG_DIAGRAM_URI))) {
324+
try (InputStream svgInputStream = ServiceManager.getFileService().read(activeDiagramsUris.get(SVG_DIAGRAM_URI))) {
325+
svgDiagram = IOUtils.toString(svgInputStream, StandardCharsets.UTF_8);
326+
saveFile(svgDiagramURI, svgDiagram);
327+
}
328+
} else {
329+
saveFile(svgDiagramURI, "");
330+
}
331+
activeDiagramsUris.put(SVG_DIAGRAM_URI, svgDiagramURI);
299332
}
300333
saveFile(xmlDiagramURI, xmlDiagram);
301334
}
302-
303335
return fileService.fileExist(xmlDiagramURI) && fileService.fileExist(svgDiagramURI);
304336
}
305337

@@ -433,6 +465,8 @@ public void load(int id) {
433465
Workflow workflow = ServiceManager.getWorkflowService().getById(id);
434466
setWorkflow(workflow);
435467
setWorkflowStatus(workflow.getStatus());
468+
activeDiagramsUris = getDiagramUris(workflow.getTitle());
469+
activeWorkflowTitle = workflow.getTitle();
436470
readXMLDiagram();
437471
this.dataEditorSettingsDefined = this.dataEditorSettingService.areDataEditorSettingsDefinedForWorkflow(workflow);
438472
} else {

0 commit comments

Comments
 (0)