Skip to content

Commit 989019c

Browse files
committed
Initialize SciJava Parse2
1 parent 6652b12 commit 989019c

File tree

24 files changed

+1220
-152
lines changed

24 files changed

+1220
-152
lines changed

pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
<module>scijava/scijava-ops-engine</module>
5555
<module>scijava/scijava-ops-serviceloader</module>
5656
<module>scijava/scijava-ops-spi</module>
57+
<module>scijava/scijava-parse2</module>
5758
<module>scijava/scijava-persist</module>
5859
<module>scijava/scijava-progress</module>
5960
<module>scijava/scijava-struct</module>

scijava/scijava-discovery-therapi/pom.xml

+12-3
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,24 @@
9393
<therapi.packages></therapi.packages>
9494
</properties>
9595
<dependencies>
96+
<dependency>
97+
<groupId>com.github.therapi</groupId>
98+
<artifactId>therapi-runtime-javadoc</artifactId>
99+
<version>${therapi-runtime-javadoc.version}</version>
100+
</dependency>
96101
<dependency>
97102
<groupId>org.scijava</groupId>
98103
<artifactId>scijava-discovery</artifactId>
99104
<version>${project.version}</version>
100105
</dependency>
101106
<dependency>
102-
<groupId>com.github.therapi</groupId>
103-
<artifactId>therapi-runtime-javadoc</artifactId>
104-
<version>${therapi-runtime-javadoc.version}</version>
107+
<groupId>org.scijava</groupId>
108+
<artifactId>scijava-parse2</artifactId>
109+
<version>${project.version}</version>
110+
</dependency>
111+
<dependency>
112+
<groupId>org.scijava</groupId>
113+
<artifactId>scijava-common</artifactId>
105114
</dependency>
106115
<!-- Test scope dependencies -->
107116
<dependency>

scijava/scijava-discovery-therapi/src/main/java/module-info.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
opens org.scijava.discovery.therapi to therapi.runtime.javadoc;
55

66
requires org.scijava.discovery;
7+
requires transitive org.scijava.parse2;
78
requires therapi.runtime.javadoc;
8-
9-
provides org.scijava.discovery.Discoverer with org.scijava.discovery.therapi.TherapiDiscoverer;
10-
119
}

scijava/scijava-discovery-therapi/src/main/java/org/scijava/discovery/therapi/TherapiDiscoverer.java

+78-97
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.github.therapi.runtimejavadoc.BaseJavadoc;
55
import com.github.therapi.runtimejavadoc.ClassJavadoc;
6+
import com.github.therapi.runtimejavadoc.FieldJavadoc;
67
import com.github.therapi.runtimejavadoc.MethodJavadoc;
78
import com.github.therapi.runtimejavadoc.RuntimeJavadoc;
89

@@ -14,25 +15,32 @@
1415
import java.util.ArrayList;
1516
import java.util.Arrays;
1617
import java.util.Collection;
17-
import java.util.Collections;
1818
import java.util.Enumeration;
1919
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22+
import java.util.Map.Entry;
2223
import java.util.Objects;
2324
import java.util.Optional;
24-
import java.util.WeakHashMap;
2525
import java.util.function.BiFunction;
26+
import java.util.function.Supplier;
2627
import java.util.jar.JarEntry;
2728
import java.util.jar.JarFile;
2829
import java.util.stream.Collectors;
2930
import java.util.stream.Stream;
3031

3132
import org.scijava.discovery.Discoverer;
3233
import org.scijava.discovery.Discovery;
34+
import org.scijava.parse2.ParseService;
3335

3436
public class TherapiDiscoverer implements Discoverer {
3537

38+
private ParseService parser;
39+
40+
public TherapiDiscoverer(ParseService parser) {
41+
this.parser = parser;
42+
}
43+
3644
@Override
3745
public List<Discovery<AnnotatedElement>> elementsTaggedWith(String tagType) {
3846
// combine class and module path resources into a single list
@@ -144,7 +152,6 @@ private static Class<?> getClass(String name) throws ClassNotFoundException {
144152
* <p>
145153
* Forked from SciJava Common's Context class.
146154
*
147-
* @implNote test
148155
* @see Thread#getContextClassLoader()
149156
* @see ClassLoader#getSystemClassLoader()
150157
*/
@@ -183,116 +190,89 @@ private static List<String> getJarContent(String jarPath) throws IOException {
183190
return content;
184191
}
185192

186-
private ThreadLocal<WeakHashMap<BaseJavadoc, String>> funcJavadocMap =
187-
new ThreadLocal<>()
188-
{
189-
190-
@Override
191-
protected WeakHashMap<BaseJavadoc, String> initialValue() {
192-
return new WeakHashMap<>();
193-
}
194-
195-
};
196-
197-
BiFunction<BaseJavadoc, String, Optional<String>> getTag = (javadoc,
193+
private BiFunction<BaseJavadoc, String, Optional<String>> getTag = (javadoc,
198194
tagType) -> {
199195
return javadoc.getOther().stream() //
200196
.filter(m -> m.getName().equals("implNote") && m.getComment().toString()
201197
.startsWith(tagType)).map(m -> m.getComment().toString()).findFirst();
202-
203198
};
204199

205-
private ThreadLocal<WeakHashMap<MethodJavadoc, String>> methodJavadocMap =
206-
new ThreadLocal<>()
207-
{
208-
209-
@Override
210-
protected WeakHashMap<MethodJavadoc, String> initialValue() {
211-
return new WeakHashMap<>();
212-
}
213-
214-
};
215-
216-
private final BiFunction<Map.Entry<BaseJavadoc, String>, Field[], Discovery<AnnotatedElement>> fieldFinder =
217-
(e, fields) -> {
218-
Optional<Field> taggedField = Arrays.stream(fields).filter(field -> e
219-
.getKey().getName().equals(field.getName())).findAny(); //
220-
if (taggedField.isEmpty()) return null;
221-
return new Discovery<>(taggedField.get(), e.getValue());
222-
};
223-
224-
private final BiFunction<Map.Entry<ClassJavadoc, String>, String, List<Discovery<AnnotatedElement>>> taggedFieldFinder =
225-
(entry, tagType) -> {
226-
// find each field with the tag in the given Class
227-
funcJavadocMap.get().clear();
228-
entry.getKey().getFields().parallelStream() //
229-
.forEach(j -> {
230-
Optional<String> tag = getTag.apply(j, tagType);
231-
if (tag.isPresent()) {
232-
funcJavadocMap.get().put(j, tag.get());
233-
}
200+
private Map<String, ?> itemsFromTag(String tagType, String tag) {
201+
String tagBody = tag.substring(tag.indexOf(tagType) + tagType.length()).trim();
202+
System.out.println("Parser: " + parser);
203+
System.out.println("Tag Body: " + tagBody);
204+
return parser.parse(tagBody.replaceAll("\\s+",""), true).asMap();
205+
}
234206

235-
});
236-
if (funcJavadocMap.get().isEmpty()) return Collections.emptyList();
207+
private Discovery<AnnotatedElement> mapFieldToDiscovery(FieldJavadoc javadoc,
208+
String tagType, Field[] fields)
209+
{
210+
Optional<String> tag = getTag.apply(javadoc, tagType);
211+
if (tag.isEmpty()) return null;
212+
213+
Optional<Field> taggedField = Arrays.stream(fields) //
214+
.filter(field -> javadoc.getName().equals(field.getName())) //
215+
.findAny();
216+
if (taggedField.isEmpty()) return null;
217+
Supplier<Map<String, ?>> tagOptions = () -> itemsFromTag(tagType, tag
218+
.get());
219+
return new Discovery<>(taggedField.get(), tagType, tagOptions);
220+
}
237221

238-
// match each tagged FieldJavadoc with the Field it was generated from
239-
Field[] fields;
240-
try {
241-
fields = getClass(entry.getValue()).getDeclaredFields();
242-
}
243-
catch (ClassNotFoundException exc) {
244-
return Collections.emptyList();
245-
}
246-
List<Discovery<AnnotatedElement>> taggedClassFields = funcJavadocMap.get()
247-
.entrySet().parallelStream() //
248-
.map(e -> fieldFinder.apply(e, fields)) //
222+
private List<Discovery<AnnotatedElement>> fieldsToDiscoveries
223+
(Map.Entry<ClassJavadoc, String> entry, String tagType) {
224+
Field[] fields = extractDeclaredFields(entry);
225+
// stream FieldJavadocs of the given ClassJavadoc
226+
return entry.getKey().getFields().parallelStream() //
227+
.map(j -> mapFieldToDiscovery(j, tagType, fields)) //
249228
.filter(Objects::nonNull) //
250229
.collect(Collectors.toList());
251-
return taggedClassFields;
252-
253-
};
230+
}
254231

255-
private final BiFunction<Map.Entry<MethodJavadoc, String>, Method[], Discovery<AnnotatedElement>> methodFinder =
256-
(e, methods) -> {
257-
Optional<Method> taggedMethod = Arrays.stream(methods).filter(m -> e
258-
.getKey().matches(m)).findAny(); //
259-
if (taggedMethod.isEmpty()) return null;
260-
return new Discovery<>(taggedMethod.get(), e.getValue());
261-
};
232+
private Discovery<AnnotatedElement> mapMethodToDiscovery(
233+
MethodJavadoc javadoc, String tagType, Method[] methods)
234+
{
235+
Optional<String> tag = getTag.apply(javadoc, tagType);
236+
if (tag.isEmpty()) return null;
237+
238+
Optional<Method> taggedMethod = Arrays.stream(methods).filter(m -> javadoc
239+
.matches(m)).findAny(); //
240+
if (taggedMethod.isEmpty()) return null;
241+
Supplier<Map<String, ?>> tagOptions = () -> itemsFromTag(tagType, tag
242+
.get());
243+
return new Discovery<>(taggedMethod.get(), tagType, tagOptions);
244+
}
262245

263246
/**
264247
* Using a string {@code className}, finds a list of tagged methods
265248
*/
266-
private final BiFunction<Map.Entry<ClassJavadoc, String>, String, List<Discovery<AnnotatedElement>>> taggedMethodFinder =
267-
(entry, tagType) -> {
268-
// finds each tagged method in the Class
269-
methodJavadocMap.get().clear();
270-
entry.getKey().getMethods().parallelStream() //
271-
.forEach(j -> {
272-
Optional<String> tag = getTag.apply(j, tagType);
273-
if (tag.isPresent()) {
274-
methodJavadocMap.get().put(j, tag.get());
275-
}
276-
277-
});
278-
if (methodJavadocMap.get().isEmpty()) return Collections.emptyList();
249+
private List<Discovery<AnnotatedElement>> methodsToDiscoveries(Map.Entry<ClassJavadoc, String> entry, String tagType ) {
250+
Method[] methods = extractDeclaredMethods(entry);
279251

280-
// maps each MethodJavadoc to the method it was scraped from
281-
Method[] methods;
282-
try {
283-
methods = getClass(entry.getValue()).getDeclaredMethods();
284-
}
285-
catch (ClassNotFoundException exc) {
286-
return Collections.emptyList();
287-
}
288-
List<Discovery<AnnotatedElement>> taggedClassMethods = methodJavadocMap
289-
.get().entrySet().parallelStream() //
290-
.map(e -> methodFinder.apply(e, methods)) //
252+
// stream MethodJavadocs of the given ClassJavadoc
253+
return entry.getKey().getMethods().parallelStream() //
254+
.map(j -> mapMethodToDiscovery(j, tagType, methods)) //
291255
.filter(Objects::nonNull) //
292256
.collect(Collectors.toList());
293-
return taggedClassMethods;
257+
}
294258

295-
};
259+
private Method[] extractDeclaredMethods(Entry<ClassJavadoc, String> entry) {
260+
try {
261+
return getClass(entry.getValue()).getDeclaredMethods();
262+
}
263+
catch (ClassNotFoundException exc) {
264+
return new Method[0];
265+
}
266+
}
267+
268+
private Field[] extractDeclaredFields(Entry<ClassJavadoc, String> entry) {
269+
try {
270+
return getClass(entry.getValue()).getDeclaredFields();
271+
}
272+
catch (ClassNotFoundException exc) {
273+
return new Field[0];
274+
}
275+
}
296276

297277
private List<Discovery<AnnotatedElement>> discoverTaggedClasses(
298278
String tagType, Map<ClassJavadoc, String> javadocData)
@@ -309,7 +289,8 @@ private List<Discovery<AnnotatedElement>> discoverTaggedClasses(
309289
Class<?> taggedClass = getClass(e.getValue());
310290
Optional<String> tag = getTag.apply(e.getKey(), tagType);
311291
if (tag.isEmpty()) return null;
312-
return new Discovery<>(taggedClass, tag.get());
292+
Supplier<Map<String, ?>> tagOptions = () -> itemsFromTag(tagType, e.getValue());
293+
return new Discovery<>(taggedClass, tagType, tagOptions);
313294
}
314295
catch (ClassNotFoundException exc) {
315296
return null;
@@ -321,7 +302,7 @@ private List<Discovery<AnnotatedElement>> discoverTaggedFields(String tagType,
321302
Map<ClassJavadoc, String> javadocData)
322303
{
323304
return javadocData.entrySet().parallelStream() //
324-
.map(e -> taggedFieldFinder.apply(e, tagType)) //
305+
.map(e -> fieldsToDiscoveries(e, tagType)) //
325306
.flatMap(list -> list.parallelStream()) //
326307
.collect(Collectors.toList());
327308
}
@@ -330,7 +311,7 @@ private List<Discovery<AnnotatedElement>> discoverTaggedMethods(
330311
String tagType, Map<ClassJavadoc, String> javadocData)
331312
{
332313
return javadocData.entrySet().parallelStream() //
333-
.map(e -> taggedMethodFinder.apply(e, tagType)) //
314+
.map(e -> methodsToDiscoveries(e, tagType)) //
334315
.flatMap(list -> list.parallelStream()) //
335316
.collect(Collectors.toList());
336317
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--add-reads
2+
org.scijava.discovery.therapi=org.scijava

0 commit comments

Comments
 (0)