Skip to content

Commit 18572da

Browse files
author
Thilo Kogge
committed
removed use of reflection in PatternsManager.java. For this the Code to generate the Localization files was extracted into its own submodule.
The generator now also creates a class that Holds a Map of all Localizations for the timeago-parser.
1 parent 0b99100 commit 18572da

9 files changed

Lines changed: 168 additions & 32 deletions

File tree

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
include 'extractor', 'timeago-parser'
1+
include 'extractor', 'timeago-parser', 'timeago-generator'
22
rootProject.name = 'NewPipeExtractor'

timeago-generator/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
dependencies {
2+
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
3+
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
4+
implementation project(":timeago-parser")
5+
}

timeago-parser/raw/java/CheckAll.java renamed to timeago-generator/src/main/java/com/github/TeamNewPipe/CheckAll.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package com.github.TeamNewPipe;
2+
13
import com.grack.nanojson.JsonObject;
24
import com.grack.nanojson.JsonParser;
35

timeago-parser/raw/java/GenerateOverview.java renamed to timeago-generator/src/main/java/com/github/TeamNewPipe/GenerateOverview.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package com.github.TeamNewPipe;
2+
13
import com.grack.nanojson.JsonAppendableWriter;
24
import com.grack.nanojson.JsonObject;
35
import com.grack.nanojson.JsonParser;

timeago-parser/raw/java/GeneratePatternClasses.java renamed to timeago-generator/src/main/java/com/github/TeamNewPipe/GeneratePatternClasses.java

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
package com.github.TeamNewPipe;
2+
3+
import java.io.FileInputStream;
4+
import java.io.FileNotFoundException;
5+
import java.io.FileWriter;
6+
import java.io.IOException;
7+
import java.io.InputStream;
8+
import java.time.temporal.ChronoUnit;
9+
import java.util.Iterator;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.TreeMap;
13+
114
import com.grack.nanojson.JsonArray;
215
import com.grack.nanojson.JsonObject;
316
import com.grack.nanojson.JsonParser;
417
import com.grack.nanojson.JsonParserException;
5-
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
6-
import org.schabi.newpipe.extractor.timeago.TimeAgoUnit;
7-
8-
import java.io.*;
9-
import java.util.*;
1018

1119
public class GeneratePatternClasses {
1220
public static void main(String[] args) throws FileNotFoundException, JsonParserException {
@@ -16,6 +24,8 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
1624
final JsonObject from = JsonParser.object().from(resourceAsStream);
1725
final TreeMap<String, Object> map = new TreeMap<>(from);
1826

27+
final StringBuilder patternMapEntries = new StringBuilder();
28+
1929
for (Map.Entry<String, Object> entry : map.entrySet()) {
2030
final String languageCode = entry.getKey().replace('-', '_');
2131
final Map<String, Object> unitsList = (Map<String, Object>) entry.getValue();
@@ -31,24 +41,25 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
3141
final JsonArray years = (JsonArray) unitsList.get("years");
3242

3343
final StringBuilder specialCasesString = new StringBuilder();
34-
specialCasesConstruct(TimeAgoUnit.SECONDS, seconds, specialCasesString);
35-
specialCasesConstruct(TimeAgoUnit.MINUTES, minutes, specialCasesString);
36-
specialCasesConstruct(TimeAgoUnit.HOURS, hours, specialCasesString);
37-
specialCasesConstruct(TimeAgoUnit.DAYS, days, specialCasesString);
38-
specialCasesConstruct(TimeAgoUnit.WEEKS, weeks, specialCasesString);
39-
specialCasesConstruct(TimeAgoUnit.MONTHS, months, specialCasesString);
40-
specialCasesConstruct(TimeAgoUnit.YEARS, years, specialCasesString);
44+
specialCasesConstruct(ChronoUnit.SECONDS, seconds, specialCasesString);
45+
specialCasesConstruct(ChronoUnit.MINUTES, minutes, specialCasesString);
46+
specialCasesConstruct(ChronoUnit.HOURS, hours, specialCasesString);
47+
specialCasesConstruct(ChronoUnit.DAYS, days, specialCasesString);
48+
specialCasesConstruct(ChronoUnit.WEEKS, weeks, specialCasesString);
49+
specialCasesConstruct(ChronoUnit.MONTHS, months, specialCasesString);
50+
specialCasesConstruct(ChronoUnit.YEARS, years, specialCasesString);
4151

4252
System.out.println("Generating \"" + languageCode + "\" pattern class...");
4353

54+
4455
try (final FileWriter fileOut = new FileWriter(
4556
"timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/patterns/" +
4657
languageCode + ".java")) {
4758
final String test = INFO_CLASS_GENERATED + "\n" +
4859
"\n" +
4960
"package org.schabi.newpipe.extractor.timeago.patterns;\n\n" +
5061
"import org.schabi.newpipe.extractor.timeago.PatternsHolder;\n" +
51-
(specialCasesString.length() > 0 ? "import org.schabi.newpipe.extractor.timeago.TimeAgoUnit;\n" : "") +
62+
(specialCasesString.length() > 0 ? "\nimport java.time.temporal.ChronoUnit;\n" : "") +
5263
"\n" +
5364
"public class " + languageCode + " extends PatternsHolder {\n" +
5465
" private static final String WORD_SEPARATOR = \"" + wordSeparator + "\";\n" +
@@ -76,10 +87,38 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
7687
} catch (IOException e) {
7788
e.printStackTrace();
7889
}
90+
91+
patternMapEntries.append(" patternMap.put(\"")
92+
.append(languageCode).append("\", ")
93+
.append(languageCode).append(".getInstance());\n");
94+
}
95+
96+
try (final FileWriter fileOut = new FileWriter(
97+
"timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java")) {
98+
final String patternMapClass = INFO_CLASS_GENERATED + "\n" +
99+
"\n" +
100+
"package org.schabi.newpipe.extractor.timeago;\n\n" +
101+
"import org.schabi.newpipe.extractor.timeago.patterns.*;\n" +
102+
"import java.util.HashMap;\n" +
103+
"import java.util.Map;\n\n" +
104+
"public class PatternMap {\n" +
105+
" private static final Map<String, PatternsHolder> patternMap = new HashMap<>();\n" +
106+
"\n" +
107+
" static {\n" +
108+
patternMapEntries +
109+
" }\n" +
110+
"\n" +
111+
" public static PatternsHolder getPattern(String languageCode) {\n" +
112+
" return patternMap.get(languageCode);\n" +
113+
" }\n" +
114+
"}";
115+
fileOut.write(patternMapClass);
116+
} catch (IOException e) {
117+
e.printStackTrace();
79118
}
80119
}
81120

82-
private static void specialCasesConstruct(TimeAgoUnit unit, JsonArray array, StringBuilder stringBuilder) {
121+
private static void specialCasesConstruct(ChronoUnit unit, JsonArray array, StringBuilder stringBuilder) {
83122
final Iterator<Object> iterator = array.iterator();
84123
while (iterator.hasNext()) {
85124
final Object o = iterator.next();
@@ -91,7 +130,7 @@ private static void specialCasesConstruct(TimeAgoUnit unit, JsonArray array, Str
91130
iterator.remove();
92131

93132
stringBuilder.append(" ")
94-
.append("putSpecialCase(TimeAgoUnit.").append(unit.name())
133+
.append("putSpecialCase(ChronoUnit.").append(unit.name())
95134
.append(", \"").append(caseText).append("\"")
96135
.append(", ").append(caseAmount).append(");").append("\n");
97136
}
@@ -113,4 +152,4 @@ private static String join(List<Object> list) {
113152

114153
return toReturn.toString();
115154
}
116-
}
155+
}

timeago-parser/raw/java/Utils.java renamed to timeago-generator/src/main/java/com/github/TeamNewPipe/Utils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package com.github.TeamNewPipe;
2+
13
import java.util.*;
24

35
public class Utils {

timeago-parser/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
dependencies {
2-
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
32
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
43
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/**/// DO NOT MODIFY THIS FILE MANUALLY
2+
/**/// This class was automatically generated by "GeneratePatternClasses.java",
3+
/**/// modify the "unique_patterns.json" and re-generate instead.
4+
5+
package org.schabi.newpipe.extractor.timeago;
6+
7+
import org.schabi.newpipe.extractor.timeago.patterns.*;
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
public class PatternMap {
12+
private static final Map<String, PatternsHolder> patternMap = new HashMap<>();
13+
14+
static {
15+
patternMap.put("af", af.getInstance());
16+
patternMap.put("am", am.getInstance());
17+
patternMap.put("ar", ar.getInstance());
18+
patternMap.put("az", az.getInstance());
19+
patternMap.put("be", be.getInstance());
20+
patternMap.put("bg", bg.getInstance());
21+
patternMap.put("bn", bn.getInstance());
22+
patternMap.put("bs", bs.getInstance());
23+
patternMap.put("ca", ca.getInstance());
24+
patternMap.put("cs", cs.getInstance());
25+
patternMap.put("da", da.getInstance());
26+
patternMap.put("de", de.getInstance());
27+
patternMap.put("el", el.getInstance());
28+
patternMap.put("en", en.getInstance());
29+
patternMap.put("en_GB", en_GB.getInstance());
30+
patternMap.put("es", es.getInstance());
31+
patternMap.put("es_419", es_419.getInstance());
32+
patternMap.put("es_US", es_US.getInstance());
33+
patternMap.put("et", et.getInstance());
34+
patternMap.put("eu", eu.getInstance());
35+
patternMap.put("fa", fa.getInstance());
36+
patternMap.put("fi", fi.getInstance());
37+
patternMap.put("fil", fil.getInstance());
38+
patternMap.put("fr", fr.getInstance());
39+
patternMap.put("fr_CA", fr_CA.getInstance());
40+
patternMap.put("gl", gl.getInstance());
41+
patternMap.put("gu", gu.getInstance());
42+
patternMap.put("hi", hi.getInstance());
43+
patternMap.put("hr", hr.getInstance());
44+
patternMap.put("hu", hu.getInstance());
45+
patternMap.put("hy", hy.getInstance());
46+
patternMap.put("id", id.getInstance());
47+
patternMap.put("is", is.getInstance());
48+
patternMap.put("it", it.getInstance());
49+
patternMap.put("iw", iw.getInstance());
50+
patternMap.put("ja", ja.getInstance());
51+
patternMap.put("ka", ka.getInstance());
52+
patternMap.put("kk", kk.getInstance());
53+
patternMap.put("km", km.getInstance());
54+
patternMap.put("kn", kn.getInstance());
55+
patternMap.put("ko", ko.getInstance());
56+
patternMap.put("ky", ky.getInstance());
57+
patternMap.put("lo", lo.getInstance());
58+
patternMap.put("lt", lt.getInstance());
59+
patternMap.put("lv", lv.getInstance());
60+
patternMap.put("mk", mk.getInstance());
61+
patternMap.put("ml", ml.getInstance());
62+
patternMap.put("mn", mn.getInstance());
63+
patternMap.put("mr", mr.getInstance());
64+
patternMap.put("ms", ms.getInstance());
65+
patternMap.put("my", my.getInstance());
66+
patternMap.put("ne", ne.getInstance());
67+
patternMap.put("nl", nl.getInstance());
68+
patternMap.put("no", no.getInstance());
69+
patternMap.put("pa", pa.getInstance());
70+
patternMap.put("pl", pl.getInstance());
71+
patternMap.put("pt", pt.getInstance());
72+
patternMap.put("pt_PT", pt_PT.getInstance());
73+
patternMap.put("ro", ro.getInstance());
74+
patternMap.put("ru", ru.getInstance());
75+
patternMap.put("si", si.getInstance());
76+
patternMap.put("sk", sk.getInstance());
77+
patternMap.put("sl", sl.getInstance());
78+
patternMap.put("sq", sq.getInstance());
79+
patternMap.put("sr", sr.getInstance());
80+
patternMap.put("sr_Latn", sr_Latn.getInstance());
81+
patternMap.put("sv", sv.getInstance());
82+
patternMap.put("sw", sw.getInstance());
83+
patternMap.put("ta", ta.getInstance());
84+
patternMap.put("te", te.getInstance());
85+
patternMap.put("th", th.getInstance());
86+
patternMap.put("tr", tr.getInstance());
87+
patternMap.put("uk", uk.getInstance());
88+
patternMap.put("ur", ur.getInstance());
89+
patternMap.put("uz", uz.getInstance());
90+
patternMap.put("vi", vi.getInstance());
91+
patternMap.put("zh_CN", zh_CN.getInstance());
92+
patternMap.put("zh_HK", zh_HK.getInstance());
93+
patternMap.put("zh_TW", zh_TW.getInstance());
94+
patternMap.put("zu", zu.getInstance());
95+
}
96+
97+
public static PatternsHolder getPattern(String languageCode) {
98+
return patternMap.get(languageCode);
99+
}
100+
}

timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternsManager.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import javax.annotation.Nonnull;
44
import javax.annotation.Nullable;
5-
import java.lang.reflect.InvocationTargetException;
65

76
public class PatternsManager {
87
/**
@@ -14,18 +13,6 @@ public class PatternsManager {
1413
public static PatternsHolder getPatterns(@Nonnull String languageCode, @Nullable String countryCode) {
1514
final String targetLocalizationClassName = languageCode +
1615
(countryCode == null || countryCode.isEmpty() ? "" : "_" + countryCode);
17-
18-
try {
19-
final Class<?> targetClass = Class.forName(
20-
"org.schabi.newpipe.extractor.timeago.patterns." + targetLocalizationClassName);
21-
22-
return (PatternsHolder) targetClass.getDeclaredMethod("getInstance").invoke(null);
23-
} catch (ClassNotFoundException ignored) {
24-
// Target localization is not supported
25-
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
26-
e.printStackTrace();
27-
}
28-
29-
return null;
16+
return PatternMap.getPattern(targetLocalizationClassName);
3017
}
3118
}

0 commit comments

Comments
 (0)