package dbfit.util.oracle;
import static dbfit.util.oracle.OraclePlSqlGenerateUtils.callExpr;
import static dbfit.util.oracle.OraclePlSqlGenerateUtils.getSpCallLeftSide;
public class OracleBooleanSpInnerWrapperGenerator {
OracleBooleanSpCommand cmd;
public OracleBooleanSpInnerWrapperGenerator(OracleBooleanSpCommand cmd) {
this.cmd = cmd;
}
public void generate() {
genWrapperHeader();
append("\n");
append(" is\n");
genWrapperVariables();
append(" begin\n");
append(" ");
genSpCallWithinWrapper();
append(";\n");
assignOutputVariables();
genWrapperReturnStatement();
append(" end ").append(getWrapperName()).append(";\n");
append("\n");
}
private String getWrapperArguments() {
return new Gen() {{ genWrapperArguments(); }}.toString();
}
private String getSpCallArguments() {
return new Gen() {{ genSpCallArguments(); }}.toString();
}
public void genSpCallArguments() {
String separator = "";
for (OracleSpParameter arg: cmd.getArguments()) {
append(separator);
arg.genSpCallArgumentWithinWrapper();
separator = ", ";
}
}
public void genWrapperArguments() {
String separator = "";
for (OracleSpParameter arg: cmd.getArguments()) {
append(separator);
arg.declareArgument();
separator = ", ";
}
}
private void genWrapperVariables() {
declareArgumentVars();
declareReturnValueVar();
}
private void declareArgumentVars() {
for (OracleSpParameter arg: cmd.getArguments()) {
arg.declareVariable();
}
}
private void declareReturnValueVar() {
if (cmd.isFunction()) {
cmd.getReturnValue().declareVariable();
}
}
private void assignOutputVariables() {
for (OracleSpParameter arg: cmd.getArguments()) {
arg.assignOutputVariable();
}
}
private String getWrapperReturnVar() {
return cmd.isFunction() ? cmd.getReturnValue().getWrapperVarName() : null;
}
private void genWrapperReturnStatement() {
if (cmd.isFunction()) {
append(" ").append("return ")
.append(getWrapperReturnVar()).append(";\n");
}
}
public void genSpCallWithinWrapper() {
append(getSpCallLeftSide(getWrapperReturnVar()));
append(callExpr(cmd.getProcName(), getSpCallArguments()));
}
private String getSpKind() {
return cmd.isFunction() ? "function" : "procedure";
}
public void genWrapperHeader() {
append(" ").append(getSpKind()).append(" ");
append(callExpr(getWrapperName(), getWrapperArguments()));
if (cmd.isFunction()) {
cmd.getReturnValue().declareReturnValue();
}
}
public String getWrapperName() {
return cmd.getPrefix() + "_wrapper";
}
protected SpGeneratorOutput append(String s) {
return cmd.append(s);
}
@Override
public String toString() {
return cmd.toString();
}
/*
* Utility class for short notation of capturing append() output.
*
* Usage:
* String result = new Gen() {{ doStuff(); }}.toString();
*
* Will temporariliy redirect output and return result as string.
*/
class Gen {
SpGeneratorOutput savedOut = cmd.getOutput();
SpGeneratorOutput wrkOut = new SpGeneratorOutput();
public Gen() {
cmd.setOutput(wrkOut);
}
@Override public String toString() {
cmd.setOutput(savedOut);
return wrkOut.toString();
}
}
}