I wanted to use the ProcessShellFactory, but I needed to manipulate the
current working directory and the environment -- which could be done
through the ProcessBuilder that gets constructed but was hidden in the
ProcessShellFactory interface.  So, I added a couple of new methods to the
ProcessShellFactory API:

    public void setEnv(Map<String, String> env){
        this.env_settings = env;
        }

    
        public void setWorkingDir(File dir){
        this.working_dir = dir;
        }

And changed the implementation of ProcessShell.start to reflect these
changes:


        public void start(Map<String,String> env) throws IOException {
                String[] cmds = new String[command.length];
                for (int i = 0; i < cmds.length; i++) {
                if ("$USER".equals(command[i])) {
                        cmds[i] = env.get("USER");
                        } else {
                                cmds[i] = command[i];
                        }
                }
                ProcessBuilder builder = new ProcessBuilder(cmds);
                if(working_dir != null){
                        builder.directory(working_dir);
                }
                if(env_settings != null){
                        builder.environment().putAll(env_settings);
                }
                if (env != null) {
                        try {
                                builder.environment().putAll(env);
                        } catch (Exception e) {
                                LOG.info("Could not set environment for 
command", e);
                        }
                }
                LOG.info("Starting shell with command: '{}' and env: {}",
builder.command(), builder.environment());
                try{
                        process = builder.start();
                        out = new 
TtyFilterInputStream(process.getInputStream());
                        err = new 
TtyFilterInputStream(process.getErrorStream());
                        in = new 
TtyFilterOutputStream(process.getOutputStream(), err);
                        }
                catch(Exception e){
                        System.out.println("Exception: " + e.getMessage());
                }
        }

It's a small change but it gave me just what I needed to do a simple
connection between an SshServer and Scala shell applications.  So I though
I'd offer it as a suggested change Š


Jim Donahue
Adobe Systems



Reply via email to