/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qualogy.qafe.bind.resource.query;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.qualogy.qafe.commons.db.procedure.CallArguments;
/**
* class intended for holding callablestatement properties
* @author
*
*/
public class Call extends Query{
public final static String CALLABLESTATEMENT_KEYWORD = "call";
/**
*
*/
private static final long serialVersionUID = 1993445288733951190L;
private CallArguments arguments;
private String callName;
private String sqlAsText;
private String sqlAsAttribute;
public String getSqlAsAttribute() {
return sqlAsAttribute;
}
public void setSqlAsAttribute(String sqlAsAttribute) {
this.sqlAsAttribute = sqlAsAttribute;
}
public Call() {
super();
}
public static Call createWithCallName(String callName){
Call call = new Call();
call.callName = callName;
return call;
}
public static Call createWithSQLStr(String sql){
Call call = new Call();
call.sqlAsText = sql;
return call;
}
/**
* retrieve the call name either from the bound value or the
* fullblown sql string to perform the call (also set through binding)
* @return
*/
public String getCallName() {
String result = null;
if(callName!=null){
result = callName;
}else{
result = parseProcedureNameFromSQL(getSql());
}
if(result == null)
throw new NullPointerException("cannot determine call name");
return result.toUpperCase();
}
public void setArgumentInformation(List argumentInformation) {
this.arguments = new CallArguments(argumentInformation);
}
public CallArguments getArguments() {
return arguments;
}
/**
* based upon the existence of return or result parameters (when true
* it's a function)
*/
public boolean isFunction(){
return arguments.containsResultArgument();
}
public String getSql() {
String sql = null;
if(StringUtils.isNotBlank(sqlAsAttribute))
sql = sqlAsAttribute;
else if(StringUtils.isNotBlank(sqlAsText))
sql = sqlAsText;
return sql;
}
/**
* a call is prepared when a full blown sql statement is supplied
* @return
*/
public boolean isPrepared(){
return StringUtils.isNotBlank(getSql());
}
/**
* parse the calls name from a fullblown statement
*
* { call ? = cursors_pkg.getdirect( from_city ?, to_city ?) }
* { call cursors_pkg.getdirect( from_city ?, to_city ?) }
*
* @param call
* @return
*/
private String parseProcedureNameFromSQL(String call){
int start = 0;
if (call.indexOf(CALLABLESTATEMENT_KEYWORD)!= -1){
start =call.indexOf(CALLABLESTATEMENT_KEYWORD) + CALLABLESTATEMENT_KEYWORD.length();
}
call = call.substring(start);
if(call.indexOf("=")>0)
call = call.substring(call.indexOf("=")+1);
call = StringUtils.trim(call);
if(call.indexOf(" ")>-1)
call = call.substring(0, call.indexOf(" "));
if(call.indexOf("(")>-1)
call = call.substring(0, call.indexOf("("));
if(call.indexOf(";")>-1)
call = call.substring(0, call.indexOf(";"));
return call;
}
public void validate() {
}
}