/**
* $Id$
* $Date$
*
*/
package org.xmlsh.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.log4j.Logger;
import org.xmlsh.sh.core.SourceLocation;
import org.xmlsh.sh.shell.Module;
import org.xmlsh.sh.shell.SerializeOpts;
import org.xmlsh.sh.shell.Shell;
import org.xmlsh.util.Util;
public class ScriptCommand implements ICommand {
private static Logger mLogger = Logger.getLogger(ScriptCommand.class);
private String mScriptName;
private InputStream mScript;
private boolean mSourceMode;
private File mScriptFile; // file for script, may be null if internal script
private Module mModule;
private SourceLocation mLocation;
// Finalize script command make sure to close
protected void finalize()
{
close();
}
public ScriptCommand( File script, boolean bSourceMode , SourceLocation location) throws FileNotFoundException
{
mScript = new FileInputStream(script);
mScriptName = Util.toJavaPath(script.getPath());
mSourceMode = bSourceMode;
mScriptFile = script;
mLocation = location ;
}
public ScriptCommand( String script , SerializeOpts opts ) throws UnsupportedEncodingException
{
mScript = Util.toInputStream(script, opts );
mSourceMode = true ;
}
public ScriptCommand(String name , InputStream is, boolean bSourceMode, Module module ) {
mScriptName = Util.toJavaPath(name);
mScript = is;
mSourceMode = bSourceMode;
mModule = module ;
}
public int run(Shell shell, String cmd, List<XValue> args) throws Exception {
try {
if( mSourceMode ){
return shell.runScript(mScript,mScriptName,true);
} else {
Shell sh = shell.clone();
try {
if( args != null )
sh.setArgs(args);
sh.setArg0(mScriptName);
int ret = sh.runScript(mScript,mScriptName,true);
return ret;
} finally {
// Close shell - even if exception is thrown through sh.runScript and up
sh.close();
}
}
} finally {
close();
}
}
public void close() {
if( mScript != null ){
try {
mScript.close();
} catch (IOException e) {
mLogger.warn("Exception closing script" , e );
}
mScript = null ;
}
}
/* (non-Javadoc)
* @see org.xmlsh.core.ICommand#getType()
*/
public CommandType getType() {
return CommandType.CMD_TYPE_SCRIPT ;
}
public File getFile() {
return mScriptFile ; // may be null
}
public Module getModule() {
return mModule ;
}
@Override
public SourceLocation getLocation() {
return mLocation ;
}
@Override
public void setLocation(SourceLocation loc) {
mLocation = loc ;
}
public String getScriptName() {
return mScriptName;
}
}