1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.neo4j.server.webadmin.console;
21
22 import groovy.lang.Binding;
23 import groovy.lang.GroovyRuntimeException;
24
25 import java.io.BufferedOutputStream;
26 import java.io.ByteArrayOutputStream;
27 import java.io.PrintStream;
28 import java.io.StringWriter;
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33
34 import org.codehaus.groovy.tools.shell.IO;
35 import org.neo4j.server.database.Database;
36 import org.neo4j.server.database.DatabaseBlockedException;
37
38 import com.tinkerpop.blueprints.pgm.TransactionalGraph;
39 import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jGraph;
40
41 public class GremlinSession implements ScriptSession
42 {
43
44 private static final String INIT_FUNCTION = "init()";
45
46 protected GremlinWebConsole scriptEngine;
47 protected StringWriter outputWriter;
48 private final Database database;
49 private final IO io;
50 private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
51 private final List<String> initialBindings;
52
53 public GremlinSession( Database database )
54 {
55 this.database = database;
56 PrintStream out = new PrintStream(new BufferedOutputStream( baos ));
57
58 io = new IO( System.in, out, out);
59
60 Map<String, Object> bindings = new HashMap<String, Object>();
61 bindings.put( "g", getGremlinWrappedGraph() );
62 bindings.put( "out", out );
63
64 initialBindings = new ArrayList<String>(bindings.keySet());
65
66 try
67 {
68 scriptEngine = new GremlinWebConsole( new Binding( bindings ), io );
69 }
70 catch ( final Exception failure )
71 {
72 scriptEngine = new GremlinWebConsole()
73 {
74 @Override
75 public void execute( String script )
76 {
77 io.out.println( "Could not start Groovy during Gremlin initialization, reason:" );
78 failure.printStackTrace( io.out );
79 }
80 };
81 }
82 }
83
84
85
86
87
88
89
90
91 @Override
92 public String evaluate( String script )
93 {
94 try {
95
96 if( script.equals( INIT_FUNCTION )) {
97 return init();
98 }
99
100 scriptEngine.execute( script );
101 String result = baos.toString();
102 resetIO();
103 return result;
104 } catch(GroovyRuntimeException ex) {
105 return ex.getMessage();
106 }
107
108 }
109
110 private String init() {
111 StringBuffer out = new StringBuffer();
112 out.append("\n");
113 out.append(" \\,,,/\n");
114 out.append(" (o o)\n");
115 out.append("-----oOOo-(_)-oOOo-----\n");
116 out.append("\n");
117
118 out.append("Available variables:\n");
119 for(String variable : initialBindings) {
120 out.append(" " + variable + "\t= ");
121 out.append(evaluate(variable));
122 }
123 out.append("\n");
124
125 return out.toString();
126 }
127
128 private void resetIO()
129 {
130 baos.reset();
131 }
132
133 private TransactionalGraph getGremlinWrappedGraph()
134 throws DatabaseBlockedException
135 {
136 return new Neo4jGraph( database.graph );
137 }
138 }