package org.xmlsh.modules.text; import java.io.IOException; import java.io.PrintWriter; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.regex.Pattern; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.xmlsh.core.CoreException; import org.xmlsh.core.InputPort; import org.xmlsh.core.InvalidArgumentException; import org.xmlsh.core.Options; import org.xmlsh.core.Options.OptionDefs; import org.xmlsh.core.UnexpectedException; import org.xmlsh.core.UnimplementedException; import org.xmlsh.core.UnknownOption; import org.xmlsh.core.XCommand; import org.xmlsh.core.XValue; import org.xmlsh.core.io.OutputPort; import org.xmlsh.sh.shell.SerializeOpts; import org.xmlsh.util.Util; abstract public class TextCommand extends XCommand { protected Logger mLogger = LogManager.getLogger( this.getClass() ); @Override public int run(List<XValue> args) throws Exception { mLogger.entry(args); parseOpts(args); process(); return mLogger.exit(0); } protected InputPort mInput ; protected OutputPort mOutput; protected Options mOptions; private static OptionDefs sOptionDefs = new OptionDefs( "i=input:,o=output:").withOptions(SerializeOpts.getOptionDefs()); protected abstract void process() throws Exception; // Override protected OptionDefs getOptionDefs() { return sOptionDefs; } protected Options getOptions() { return mOptions; } protected List<XValue> parseOpts(List<XValue> args) throws UnexpectedException, InvalidArgumentException, UnknownOption, IOException, CoreException { mOptions = new Options(getOptionDefs()); mOptions.parse(args); mInput = mOptions.hasOpt("i") ? getShell().getEnv().getInput(mOptions.getOptValue("i")) : getShell().getEnv().getStdin() ; mOutput = mOptions.hasOpt("o") ? getShell().getEnv().getOutput(mOptions.getOptValue("o"),false) : getShell().getEnv().getStdout() ; return mOptions.getRemainingArgs(); } protected void processStream( ) throws UnsupportedEncodingException, IOException, CoreException { mLogger.entry(); try ( Reader r = mInput.asReader(getSerializeOpts()) ; PrintWriter w = mOutput.asPrintWriter(getSerializeOpts()) ){ processStream( r , w ); } mLogger.exit(); } protected void processStream(Reader r, PrintWriter w) throws IOException, UnimplementedException { throw new UnimplementedException( "processStream() not implemented"); } }