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
18
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 }