Skip to content

Commit e5b190d

Browse files
committed
fix #5043: preserve encoding while copy and pasting in maintable
1 parent eb42850 commit e5b190d

File tree

2 files changed

+51
-37
lines changed

2 files changed

+51
-37
lines changed

src/main/java/org/jabref/gui/ClipBoardManager.java

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jabref.gui;
22

3+
import java.io.ByteArrayInputStream;
34
import java.io.IOException;
5+
import java.nio.charset.StandardCharsets;
46
import java.util.Collections;
57
import java.util.List;
68
import java.util.Optional;
@@ -28,13 +30,11 @@
2830
import org.slf4j.LoggerFactory;
2931

3032
public class ClipBoardManager {
33+
private static final Logger LOGGER = LoggerFactory.getLogger(ClipBoardManager.class);
3134

3235
public static final DataFormat XML = new DataFormat("application/xml");
33-
34-
private static final Logger LOGGER = LoggerFactory.getLogger(ClipBoardManager.class);
3536

3637
private final Clipboard clipboard;
37-
3838
private final ImportFormatReader importFormatReader;
3939

4040
public ClipBoardManager() {
@@ -63,9 +63,8 @@ public String getContents() {
6363
String result = clipboard.getString();
6464
if (result == null) {
6565
return "";
66-
} else {
67-
return result;
6866
}
67+
return result;
6968
}
7069

7170
public void setHtmlContent(String html) {
@@ -89,40 +88,55 @@ public void setContent(List<BibEntry> entries) throws IOException {
8988
clipboard.setContent(content);
9089
}
9190

92-
public List<BibEntry> extractEntries() {
91+
public List<BibEntry> extractData() {
9392
Object entries = clipboard.getContent(DragAndDropDataFormats.ENTRIES);
9493

94+
if (entries == null) {
95+
return handleStringData(clipboard.getString());
96+
}
97+
return handleBibTeXData((String) entries);
98+
}
99+
100+
private List<BibEntry> handleBibTeXData(String entries) {
95101
BibtexParser parser = new BibtexParser(Globals.prefs.getImportFormatPreferences(), Globals.getFileUpdateMonitor());
96-
if (entries != null) {
97-
// We have determined that the clipboard data is a set of entries (serialized as a string).
98-
try {
99-
return parser.parseEntries((String) entries);
100-
} catch (ParseException ex) {
101-
LOGGER.error("Could not paste", ex);
102-
}
103-
} else {
104-
String data = clipboard.getString();
105-
if (data != null) {
106-
try {
107-
// fetch from doi
108-
Optional<DOI> doi = DOI.parse(data);
109-
if (doi.isPresent()) {
110-
LOGGER.info("Found DOI in clipboard");
111-
Optional<BibEntry> entry = new DoiFetcher(Globals.prefs.getImportFormatPreferences()).performSearchById(doi.get().getDOI());
112-
return OptionalUtil.toList(entry);
113-
} else {
114-
try {
115-
UnknownFormatImport unknownFormatImport = importFormatReader.importUnknownFormat(data);
116-
return unknownFormatImport.parserResult.getDatabase().getEntries();
117-
} catch (ImportException e) {
118-
// import failed and result will be empty
119-
}
120-
}
121-
} catch (FetcherException ex) {
122-
LOGGER.error("Error while fetching", ex);
123-
}
124-
}
102+
try {
103+
return parser.parseEntries(new ByteArrayInputStream(entries.getBytes(StandardCharsets.UTF_8)));
104+
} catch (ParseException ex) {
105+
LOGGER.error("Could not paste", ex);
106+
return Collections.emptyList();
107+
}
108+
}
109+
110+
private List<BibEntry> handleStringData(String data) {
111+
if (data == null || data.isEmpty()) {
112+
return Collections.emptyList();
113+
}
114+
115+
Optional<DOI> doi = DOI.parse(data);
116+
if (doi.isPresent()) {
117+
return fetchByDOI(doi.get());
118+
}
119+
120+
return tryImportFormats(data);
121+
}
122+
123+
private List<BibEntry> tryImportFormats(String data) {
124+
try {
125+
UnknownFormatImport unknownFormatImport = importFormatReader.importUnknownFormat(data);
126+
return unknownFormatImport.parserResult.getDatabase().getEntries();
127+
} catch (ImportException ignored) {
128+
return Collections.emptyList();
129+
}
130+
}
131+
132+
private List<BibEntry> fetchByDOI(DOI doi) {
133+
LOGGER.info("Found DOI in clipboard");
134+
try {
135+
Optional<BibEntry> entry = new DoiFetcher(Globals.prefs.getImportFormatPreferences()).performSearchById(doi.getDOI());
136+
return OptionalUtil.toList(entry);
137+
} catch (FetcherException ex) {
138+
LOGGER.error("Error while fetching", ex);
139+
return Collections.emptyList();
125140
}
126-
return Collections.emptyList();
127141
}
128142
}

src/main/java/org/jabref/gui/maintable/MainTable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ private void clearAndSelectLast() {
209209

210210
public void paste() {
211211
// Find entries in clipboard
212-
List<BibEntry> entriesToAdd = Globals.clipboardManager.extractEntries();
212+
List<BibEntry> entriesToAdd = Globals.clipboardManager.extractData();
213213

214214
if (!entriesToAdd.isEmpty()) {
215215
// Add new entries

0 commit comments

Comments
 (0)