1   package eu.fbk.rdfpro;
2   
3   import java.util.List;
4   
5   import javax.script.Invocable;
6   import javax.script.ScriptContext;
7   import javax.script.ScriptEngine;
8   import javax.script.ScriptEngineFactory;
9   import javax.script.ScriptEngineManager;
10  
11  import org.junit.Test;
12  import org.openrdf.model.Statement;
13  import org.openrdf.model.impl.StatementImpl;
14  import org.openrdf.model.impl.URIImpl;
15  import org.openrdf.model.vocabulary.OWL;
16  import org.openrdf.model.vocabulary.RDF;
17  import org.openrdf.rio.RDFHandler;
18  import org.slf4j.Logger;
19  import org.slf4j.LoggerFactory;
20  
21  import eu.fbk.rdfpro.util.Tracker;
22  
23  public class ScriptTest {
24  
25      private static final Logger LOGGER = LoggerFactory.getLogger(ScriptTest.class);
26  
27      private static final String SCRIPT = "var k = new org.openrdf.model.impl.URIImpl(\"ex:blabla\"); logger.info(pippo); function filter (s, h) { if (s.getSubject().equals(new org.openrdf.model.impl.URIImpl(\"ex:blabla\"))) { print(1); } h.handleStatement(s); }";
28  
29      // private static final String SCRIPT =
30      // "def k = new org.openrdf.model.impl.URIImpl(\"ex:blabla\"); def filter (s, h) { if (s.getSubject() == new org.openrdf.model.impl.URIImpl(\"ex:blabla\")) { println(1); }; h.handleStatement(s); }";
31  
32      @Test
33      public void test() throws Throwable {
34          final ScriptEngineManager manager = new ScriptEngineManager();
35          final List<ScriptEngineFactory> factories = manager.getEngineFactories();
36  
37          for (final ScriptEngineFactory factory : factories) {
38  
39              System.out.println("ScriptEngineFactory Info");
40  
41              final String engName = factory.getEngineName();
42              final String engVersion = factory.getEngineVersion();
43              final String langName = factory.getLanguageName();
44              final String langVersion = factory.getLanguageVersion();
45  
46              System.out.printf("\tScript Engine: %s (%s)%n", engName, engVersion);
47  
48              final List<String> engNames = factory.getNames();
49              for (final String name : engNames) {
50                  System.out.printf("\tEngine Alias: %s%n", name);
51              }
52  
53              System.out.printf("\tLanguage: %s (%s)%n", langName, langVersion);
54  
55          }
56  
57          final ScriptEngine engine = manager.getEngineByExtension("js");
58          engine.getContext().setAttribute("logger", LOGGER, ScriptContext.ENGINE_SCOPE);
59          engine.eval("var pippo=\"ouch\";\n");
60          engine.eval(SCRIPT);
61          @SuppressWarnings("unchecked")
62          final Filter<Statement> filter = ((Invocable) engine).getInterface(Filter.class);
63          final RDFHandler handler = RDFProcessors.track(
64                  new Tracker(LOGGER, "Started", "Done %d %d", "%d %d %d")).wrap(RDFHandlers.NIL);
65          handler.startRDF();
66          for (int i = 0; i < 100000000; ++i) {
67              final Statement statement = new StatementImpl(new URIImpl("ex:entity" + i), RDF.TYPE,
68                      OWL.THING);
69              // handler.handleStatement(statement);
70              filter.filter(statement, handler);
71          }
72          handler.endRDF();
73      }
74  
75      public interface Filter<T> {
76  
77          void filter(Statement T, RDFHandler handler);
78  
79      }
80  
81  }