import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.net.InetSocketAddress;
public class GroovyShellServer {
private static Logger log = Logger.getLogger(GroovyShellServer.class);
private NioSocketAcceptor acceptor;
private int port;
@Autowired
private GroovyShellStreamIoHandler groovyShellStreamIoHandler;
public void start() {
acceptor = new NioSocketAcceptor();
acceptor.setHandler(groovyShellStreamIoHandler);
try {
log.info("Mina Groovy Server is starting");
acceptor.bind(new InetSocketAddress(port));
log.info("Mina Groovy Server started at port : " + port);
} catch (IOException ex) {
log.error("Mina Groovy Server failed", ex);
}
}
public void stop() {
log.info("Mina Groovy Server is stopping");
acceptor.dispose(true);
log.info("Mina Groovy Server stopped");
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
import groovy.lang.Binding;
import groovy.ui.InteractiveShell;
import org.springframework.context.ApplicationContext;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class GroovyShellThread extends Thread {
public static final String OUT_KEY = "out";
private Binding binding;
private InputStream inputStream;
private OutputStream outputStream;
public GroovyShellThread(ApplicationContext context, InputStream inputStream, OutputStream outputStream) {
binding = new Binding();
binding.setVariable("context", context);
this.inputStream = inputStream;
this.outputStream = outputStream;
}
@Override
public void run() {
try {
final PrintStream out = new PrintStream(outputStream);
binding.setVariable(OUT_KEY, out);
final InteractiveShell groovy = new InteractiveShell(binding, inputStream,
out, out);
try {
groovy.run();
}
catch (Exception e) {
e.printStackTrace();
}
out.close();
inputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
import org.apache.mina.core.session.IoSession;
import org.apache.mina.handler.stream.StreamIoHandler;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class GroovyShellStreamIoHandler extends StreamIoHandler
implements ApplicationContextAware {
private ApplicationContext context;
private ExecutorService executorService;
public GroovyShellStreamIoHandler() {
}
public void start() {
executorService = Executors.newCachedThreadPool();
}
public void stop() {
executorService.shutdown();
}
@Override
protected void processStreamIo(IoSession ioSession, InputStream stream, OutputStream stream2) {
executorService.execute(new GroovyShellThread(context, stream, stream2));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
}