View Javadoc
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   * The extension to Pipeline for page model extractor.
16   *
17   * @author code4crafter@gmail.com <br>
18   * @since 0.2.0
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  }