View Javadoc
1   package us.codecraft.webmagic.scripts;
2   
3   
4   import java.io.IOException;
5   import java.io.InputStream;
6   import java.nio.charset.Charset;
7   import javax.script.ScriptContext;
8   import javax.script.ScriptEngine;
9   import javax.script.ScriptException;
10  import org.apache.commons.io.IOUtils;
11  import us.codecraft.webmagic.Page;
12  import us.codecraft.webmagic.Site;
13  import us.codecraft.webmagic.processor.PageProcessor;
14  import us.codecraft.webmagic.scripts.languages.Language;
15  
16  /**
17   * @author code4crafter@gmail.com
18   * @since 0.4.1
19   */
20  public class ScriptProcessor implements PageProcessor {
21  
22      private ScriptEnginePool enginePool;
23  
24      private String defines;
25  
26      private String script;
27  
28      private final Language language;
29  
30      private Site site = Site.me();
31  
32      public ScriptProcessor(Language language, String script, int threadNum) {
33          if (language == null || script == null) {
34              throw new IllegalArgumentException("language and script must not be null!");
35          }
36          this.language = language;
37          enginePool = new ScriptEnginePool(language, threadNum);
38          InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(language.getDefineFile());
39          try {
40              defines = IOUtils.toString(resourceAsStream, Charset.defaultCharset());
41          } catch (IOException e) {
42              throw new IllegalArgumentException(e);
43          }
44          this.script = script;
45      }
46  
47      @Override
48      public void process(Page page) {
49          ScriptEngine engine = enginePool.getEngine();
50          try {
51              ScriptContext context = engine.getContext();
52              context.setAttribute("page", page, ScriptContext.ENGINE_SCOPE);
53              context.setAttribute("config", site, ScriptContext.ENGINE_SCOPE);
54              try {
55                  this.language.process(engine, defines, script, page);
56              } catch (ScriptException e) {
57                  e.printStackTrace();
58              }
59          } finally {
60              enginePool.release(engine);
61          }
62      }
63  
64  
65      @Override
66      public Site getSite() {
67          return site;
68      }
69  
70  }