1 package us.codecraft.webmagic.selector;
2
3
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.apache.commons.collections4.CollectionUtils;
8
9
10
11
12
13 public abstract class AbstractSelectable implements Selectable {
14
15 protected abstract List<String> getSourceTexts();
16
17 @Override
18 public Selectable css(String selector) {
19 return $(selector);
20 }
21
22 @Override
23 public Selectable css(String selector, String attrName) {
24 return $(selector, attrName);
25 }
26
27 protected Selectable select(Selector selector, List<String> strings) {
28 List<String> results = new ArrayList<String>();
29 for (String string : strings) {
30 String result = selector.select(string);
31 if (result != null) {
32 results.add(result);
33 }
34 }
35 return new PlainText(results);
36 }
37
38 protected Selectable selectList(Selector selector, List<String> strings) {
39 List<String> results = new ArrayList<String>();
40 for (String string : strings) {
41 List<String> result = selector.selectList(string);
42 results.addAll(result);
43 }
44 return new PlainText(results);
45 }
46
47 @Override
48 public List<String> all() {
49 return getSourceTexts();
50 }
51
52 @Override
53 public Selectable jsonPath(String jsonPath) {
54 throw new UnsupportedOperationException();
55 }
56
57 @Override
58 public String get() {
59 List<String> sourceTexts = all();
60 if (CollectionUtils.isNotEmpty(sourceTexts)) {
61 return sourceTexts.get(0);
62 }
63 return null;
64
65 }
66
67 @Override
68 public Selectable select(Selector selector) {
69 return select(selector, getSourceTexts());
70 }
71
72 @Override
73 public Selectable selectList(Selector selector) {
74 return selectList(selector, getSourceTexts());
75 }
76
77 @Override
78 public Selectable regex(String regex) {
79 RegexSelector regexSelector = Selectors.regex(regex);
80 return selectList(regexSelector, getSourceTexts());
81 }
82
83 @Override
84 public Selectable regex(String regex, int group) {
85 RegexSelector regexSelector = Selectors.regex(regex, group);
86 return selectList(regexSelector, getSourceTexts());
87 }
88
89 @Override
90 public Selectable replace(String regex, String replacement) {
91 ReplaceSelector replaceSelector = new ReplaceSelector(regex,replacement);
92 return select(replaceSelector, getSourceTexts());
93 }
94
95 public String getFirstSourceText() {
96 List<String> sourceTexts = getSourceTexts();
97 if (CollectionUtils.isNotEmpty(sourceTexts)) {
98 return sourceTexts.get(0);
99 }
100 return null;
101 }
102
103 @Override
104 public String toString() {
105 return get();
106 }
107
108 @Override
109 public boolean match() {
110 return CollectionUtils.isNotEmpty(getSourceTexts());
111 }
112 }