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 package org.apache.hc.client5.http.psl;
28
29 import java.io.File;
30 import java.io.FileInputStream;
31 import java.io.IOException;
32 import java.io.InputStream;
33 import java.io.InputStreamReader;
34 import java.net.URL;
35 import java.nio.charset.StandardCharsets;
36 import java.util.Collections;
37 import java.util.List;
38 import java.util.concurrent.locks.ReentrantLock;
39
40 import org.apache.hc.core5.annotation.Contract;
41 import org.apache.hc.core5.annotation.ThreadingBehavior;
42 import org.apache.hc.core5.util.Args;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49
50
51 @Contract(threading = ThreadingBehavior.SAFE)
52 public final class PublicSuffixMatcherLoader {
53
54 private static final String PUBLIC_SUFFIX_LIST = "/org/publicsuffix/list/effective_tld_names.dat";
55
56 private static final Logger LOG = LoggerFactory.getLogger(PublicSuffixMatcherLoader.class);
57
58 private static final ReentrantLock lock = new ReentrantLock();
59
60 private static PublicSuffixMatcher load(final InputStream in) throws IOException {
61 final List<PublicSuffixList> lists = PublicSuffixListParser.INSTANCE.parseByType(
62 new InputStreamReader(in, StandardCharsets.UTF_8));
63 return new PublicSuffixMatcher(lists);
64 }
65
66 public static PublicSuffixMatcher load(final URL url) throws IOException {
67 Args.notNull(url, "URL");
68 try (InputStream in = url.openStream()) {
69 return load(in);
70 }
71 }
72
73 public static PublicSuffixMatcher load(final File file) throws IOException {
74 Args.notNull(file, "File");
75 try (InputStream in = new FileInputStream(file)) {
76 return load(in);
77 }
78 }
79
80 private static volatile PublicSuffixMatcher DEFAULT_INSTANCE;
81
82 public static PublicSuffixMatcher getDefault() {
83 if (DEFAULT_INSTANCE == null) {
84 lock.lock();
85 try {
86 if (DEFAULT_INSTANCE == null) {
87 final URL url = PublicSuffixMatcherLoader.class.getResource(PUBLIC_SUFFIX_LIST);
88 if (url != null) {
89 try {
90 DEFAULT_INSTANCE = load(url);
91 } catch (final IOException ex) {
92
93 LOG.warn("Failure loading public suffix list from default resource", ex);
94 }
95 } else {
96 DEFAULT_INSTANCE = new PublicSuffixMatcher(DomainType.ICANN, Collections.singletonList("com"), null);
97 }
98 }
99 } finally {
100 lock.unlock();
101 }
102 }
103 return DEFAULT_INSTANCE;
104 }
105
106 }