Skip to content

Commit 57923cc

Browse files
committed
fix: robustness of template import for non-UTF8 characters
1 parent 5338cca commit 57923cc

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ category: Administration
1313

1414
* fix: always open documentation in subtasks dialog in new window
1515
* feat: ensure compatibility with Jira 9.15.0, 9.12.5, 9.4.18
16+
* fix: robustness of template import for non-UTF8 characters
1617

1718
### [24.01.0] - 2024-01-27
1819

src/main/java/de/codescape/jira/plugins/multiplesubtasks/action/SubtaskTemplateImportAction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@
2020
import org.w3c.dom.Document;
2121
import org.w3c.dom.Node;
2222
import org.w3c.dom.NodeList;
23+
import org.xml.sax.InputSource;
2324
import org.xml.sax.SAXException;
2425

2526
import javax.xml.parsers.DocumentBuilder;
2627
import javax.xml.parsers.DocumentBuilderFactory;
2728
import javax.xml.parsers.ParserConfigurationException;
2829
import java.io.ByteArrayInputStream;
2930
import java.io.IOException;
31+
import java.io.InputStreamReader;
3032
import java.io.StringWriter;
33+
import java.nio.charset.StandardCharsets;
3134
import java.util.ArrayList;
3235
import java.util.Arrays;
3336
import java.util.List;
@@ -223,11 +226,11 @@ private long importQuickSubtasksTemplatesForUser(ApplicationUser applicationUser
223226
/**
224227
* Returns {@link ShowSubtaskTemplate} objects from the given XML.
225228
*/
226-
private List<ShowSubtaskTemplate> extractQuickSubtasksTemplatesFromXml(String templatesXml, boolean isProjectTemplate) {
229+
List<ShowSubtaskTemplate> extractQuickSubtasksTemplatesFromXml(String templatesXml, boolean isProjectTemplate) {
227230
List<ShowSubtaskTemplate> templates = new ArrayList<>();
228231
try {
229232
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
230-
Document doc = builder.parse(new ByteArrayInputStream(templatesXml.getBytes()));
233+
Document doc = builder.parse(new InputSource(new InputStreamReader(new ByteArrayInputStream(templatesXml.getBytes()))));
231234
doc.getDocumentElement().normalize();
232235

233236
// templates for users and projects are saved with different element names

src/test/java/de/codescape/jira/plugins/multiplesubtasks/action/SubtaskTemplateImportActionTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package de.codescape.jira.plugins.multiplesubtasks.action;
22

3+
import de.codescape.jira.plugins.multiplesubtasks.model.ShowSubtaskTemplate;
34
import org.junit.Rule;
45
import org.junit.Test;
56
import org.mockito.InjectMocks;
67
import org.mockito.junit.MockitoJUnit;
78
import org.mockito.junit.MockitoRule;
89

10+
import java.util.List;
11+
912
import static org.hamcrest.MatcherAssert.assertThat;
1013
import static org.hamcrest.Matchers.*;
1114

@@ -256,6 +259,22 @@ public void shouldAcceptColonAndQuestionMarkInSummary() {
256259
"- a test: will it work?\n");
257260
}
258261

262+
/* fix: do not fail on uncommon characters */
263+
264+
@Test
265+
public void shouldAcceptUncommonLetters() {
266+
String input = "<list>\n" +
267+
" <subtaskTemplate>\n" +
268+
" <text>- Serve a drink in the Café / assignee:&quot;bartender&quot;</text>\n" +
269+
" <title>drinking</title>\n" +
270+
" <id>84634E96-7E97-4490-903E-6C159E3CE590</id>\n" +
271+
" </subtaskTemplate>\n" +
272+
" </list>";
273+
List<ShowSubtaskTemplate> templates = subtaskTemplateImportAction.extractQuickSubtasksTemplatesFromXml(input, true);
274+
assertThat(templates.size(), is(equalTo(1)));
275+
assertThat(templates.get(0).getTemplate(), containsString("Serve a drink in the Café"));
276+
}
277+
259278
/* helper methods */
260279

261280
private void assertTransformation(String input, String output) {

0 commit comments

Comments
 (0)