1 package us.codecraft.webmagic.model;
2
3 import us.codecraft.webmagic.ResultItems;
4 import us.codecraft.webmagic.Task;
5 import us.codecraft.webmagic.model.annotation.ExtractBy;
6 import us.codecraft.webmagic.pipeline.PageModelPipeline;
7 import us.codecraft.webmagic.pipeline.Pipeline;
8
9 import java.lang.annotation.Annotation;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.concurrent.ConcurrentHashMap;
13
14
15
16
17
18
19
20 class ModelPipeline implements Pipeline {
21
22 private Map<Class, PageModelPipeline> pageModelPipelines = new ConcurrentHashMap<Class, PageModelPipeline>();
23
24 public ModelPipeline() {
25 }
26
27 public ModelPipeline put(Class clazz, PageModelPipeline pageModelPipeline) {
28 pageModelPipelines.put(clazz, pageModelPipeline);
29 return this;
30 }
31
32 @Override
33 public void process(ResultItems resultItems, Task task) {
34 for (Map.Entry<Class, PageModelPipeline> classPageModelPipelineEntry : pageModelPipelines.entrySet()) {
35 Object o = resultItems.get(classPageModelPipelineEntry.getKey().getCanonicalName());
36 if (o != null) {
37 Annotation annotation = classPageModelPipelineEntry.getKey().getAnnotation(ExtractBy.class);
38 if (annotation == null || !((ExtractBy) annotation).multi()) {
39 classPageModelPipelineEntry.getValue().process(o, task);
40 } else {
41 List<Object> list = (List<Object>) o;
42 for (Object o1 : list) {
43 classPageModelPipelineEntry.getValue().process(o1, task);
44 }
45 }
46 }
47 }
48 }
49 }