/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.crsh.lang.impl.groovy; import groovy.lang.Binding; import org.crsh.command.CommandContext; import org.crsh.command.InvocationContext; import org.crsh.shell.impl.command.AbstractInvocationContext; import org.crsh.shell.impl.command.spi.CommandInvoker; import org.crsh.text.RenderPrintWriter; import org.crsh.text.Screenable; import org.crsh.shell.impl.command.ShellSession; import org.crsh.shell.impl.command.spi.CommandException; import org.crsh.shell.impl.command.InvocationContextImpl; import org.crsh.shell.impl.command.spi.Command; import org.crsh.lang.impl.groovy.closure.PipeLineClosure; import org.crsh.text.Style; import java.io.IOException; import java.util.Map; /** @author Julien Viet */ class ShellBinding extends Binding { /** . */ private final ShellSession session; /** . */ private InvocationContext<Object> current; public ShellBinding(Map variables, ShellSession session) { super(variables); // this.session = session; } private InvocationContext<Object> proxy = new AbstractInvocationContext<Object>() { public RenderPrintWriter getWriter() { if (current == null) { throw new IllegalStateException("Not under context"); } else { // Warning we don't proxy the writer, should we ? return current.getWriter(); } } public CommandInvoker<?, ?> resolve(String s) throws CommandException { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.resolve(s); } } public void close() throws Exception { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.close(); } } public boolean takeAlternateBuffer() throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.takeAlternateBuffer(); } } public boolean releaseAlternateBuffer() throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.releaseAlternateBuffer(); } } public String readLine(String msg, boolean echo) throws IOException, InterruptedException { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.readLine(msg, echo); } } public int getWidth() { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getWidth(); } } public int getHeight() { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getWidth(); } } public void provide(Object element) throws Exception { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.provide(element); } } public Class<Object> getConsumedType() { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getConsumedType(); } } public void flush() throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.flush(); } } public String getProperty(String propertyName) { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getProperty(propertyName); } } public Map<String, Object> getSession() { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getSession(); } } public Map<String, Object> getAttributes() { if (current == null) { throw new IllegalStateException("Not under context"); } else { return current.getAttributes(); } } public Screenable append(CharSequence s) throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.append(s); } return this; } public Appendable append(char c) throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.append(c); } return this; } public Appendable append(CharSequence csq, int start, int end) throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.append(csq, start, end); } return this; } public Screenable append(Style style) throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.append(style); } return this; } public Screenable cls() throws IOException { if (current == null) { throw new IllegalStateException("Not under context"); } else { current.cls(); } return this; } }; public InvocationContext<Object> getCurrent() { return current; } public void setCurrent(InvocationContext<Object> current) { this.current = current; } @Override public Object getVariable(String name) { if (name.equals("context")) { return proxy; } else { if (session != null) { try { Command<?> cmd = session.getCommand(name); if (cmd != null) { return new PipeLineClosure(new InvocationContextImpl<Object>(proxy), name, cmd); } } catch (CommandException ignore) { // Really ? } return super.getVariable(name); } else { return super.getVariable(name); } } } }