-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
/
TexGroup.java
146 lines (123 loc) · 4.93 KB
/
TexGroup.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package org.jabref.model.groups;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.jabref.architecture.AllowedToUseLogic;
import org.jabref.logic.auxparser.AuxParser;
import org.jabref.logic.auxparser.AuxParserResult;
import org.jabref.logic.util.io.FileUtil;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.metadata.MetaData;
import org.jabref.model.util.DummyFileUpdateMonitor;
import org.jabref.model.util.FileUpdateListener;
import org.jabref.model.util.FileUpdateMonitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@AllowedToUseLogic("because it needs access to aux parser")
public class TexGroup extends AbstractGroup implements FileUpdateListener {
private static final Logger LOGGER = LoggerFactory.getLogger(TexGroup.class);
private final Path filePath;
private Set<String> keysUsedInAux;
private final FileUpdateMonitor fileMonitor;
private final AuxParser auxParser;
private final MetaData metaData;
private final String user;
TexGroup(String name, GroupHierarchyType context, Path filePath, AuxParser auxParser, FileUpdateMonitor fileMonitor, MetaData metaData, String user) {
super(name, context);
this.metaData = metaData;
this.user = user;
this.filePath = expandPath(Objects.requireNonNull(filePath));
this.auxParser = auxParser;
this.fileMonitor = fileMonitor;
}
TexGroup(String name, GroupHierarchyType context, Path filePath, AuxParser auxParser, FileUpdateMonitor fileMonitor, MetaData metaData) throws IOException {
this(name, context, filePath, auxParser, fileMonitor, metaData, System.getProperty("user.name") + '-' + InetAddress.getLocalHost().getHostName());
}
public static TexGroup create(String name, GroupHierarchyType context, Path filePath, AuxParser auxParser, FileUpdateMonitor fileMonitor, MetaData metaData) throws IOException {
TexGroup group = new TexGroup(name, context, filePath, auxParser, fileMonitor, metaData);
fileMonitor.addListenerForFile(group.getFilePathResolved(), group);
return group;
}
// without FileUpdateMonitor
public static TexGroup create(String name, GroupHierarchyType context, Path filePath, AuxParser auxParser, MetaData metaData) throws IOException {
return new TexGroup(name, context, filePath, auxParser, new DummyFileUpdateMonitor(), metaData);
}
public Path getFilePathResolved() {
return this.filePath;
}
@Override
public boolean contains(BibEntry entry) {
if (keysUsedInAux == null) {
AuxParserResult auxResult = auxParser.parse(filePath);
keysUsedInAux = auxResult.getUniqueKeys();
}
return entry.getCitationKey().map(keysUsedInAux::contains).orElse(false);
}
@Override
public boolean isDynamic() {
return false;
}
@Override
public AbstractGroup deepCopy() {
try {
return new TexGroup(name.getValue(), context, filePath, auxParser, fileMonitor, metaData);
} catch (IOException ex) {
// This should never happen because we were able to monitor the file just fine until now
LOGGER.error("Problem creating copy of group", ex);
return null;
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if ((o == null) || (getClass() != o.getClass())) {
return false;
}
if (!super.equals(o)) {
return false;
}
TexGroup group = (TexGroup) o;
return Objects.equals(filePath, group.filePath);
}
@Override
public String toString() {
return "TexGroup{" +
"filePath=" + filePath +
", keysUsedInAux=" + keysUsedInAux +
", auxParser=" + auxParser +
", fileMonitor=" + fileMonitor +
"} " + super.toString();
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), filePath);
}
public Path getFilePath() {
return relativize(filePath);
}
@Override
public void fileUpdated() {
// Reset previous parse result
keysUsedInAux = null;
metaData.groupsBinding().invalidate();
}
private Path relativize(Path path) {
List<Path> fileDirectories = getFileDirectoriesAsPaths();
return FileUtil.relativize(path, fileDirectories);
}
private Path expandPath(Path path) {
List<Path> fileDirectories = getFileDirectoriesAsPaths();
return FileUtil.find(path.toString(), fileDirectories).orElse(path);
}
private List<Path> getFileDirectoriesAsPaths() {
return metaData.getLatexFileDirectory(user)
.map(List::of)
.orElse(Collections.emptyList());
}
}