Default Result Checkers are built-in result checkers that are applied automatically on MBO operations by Unwired Server. They can be replaced by implementing and deploying a Custom Result Checker. This is the default result checker used to check results in SAP® data sources.
package com.sybase.sap3;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoRecord;
import com.sap.conn.jco.JCoTable;
import com.sybase.dataservices.DSException;
import com.sybase.sup.sap3.SAPResultChecker;
import com.sybase.vader.utils.logging.SybLogger;
public class DefaultSAPResultCheck implements SAPResultChecker
{
private static Set<String> nonErrorMessages;
static
{
nonErrorMessages = new HashSet<String>();
nonErrorMessages.add("No data found");
nonErrorMessages.add("Data was not found for the document");
}
public Map.Entry<Boolean, String> checkReturn(JCoFunction f)
{
JCoRecord returnStructure = null;
JCoParameterList jpl = f.getExportParameterList();
String msg = null;
boolean success = true;
if ( jpl != null )
{
try
{
returnStructure = jpl.getStructure("RETURN");
if ( returnStructure != null )
{
String type = returnStructure.getString("TYPE");
// generally TYPE is S for success, I for informational,
// or empty
if ( !(type.equals("") || type.equals("S") || type.equals("I")) )
{
String message = returnStructure.getString("MESSAGE");
/*UWPLogger.LogWarning*/
SybLogger.warn("SapUtils.execute: TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>, NUMBER: <<" + returnStructure.getInt("NUMBER") + ">>");
if ( !type.equals("W") && !nonErrorMessages.contains(message) )
{
success = false;
msg = "TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>";
throw new DSException(DSException.INTERNAL_SERVER_ERROR, returnStructure.getInt("NUMBER"), msg);
}
else
{
msg = "TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>";
}
}
else
{
if (SybLogger.isDebugEnabled())
{
String message = returnStructure.getString("MESSAGE");
SybLogger.debug("SapUtils.execute: TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>");
}
}
}
}
catch (DSException dse) {
throw dse;
}
catch (Exception e)
{
/*
if (UWPLogger.isTrace())
UWPLogger.LogTrace
*/
SybLogger.debug("SapUtils::execute: Unable to retrieve RETURN structure - Will try to retrieve RETURN table next.", e);
}
}
// if there is no RETURN structure, look for RETURN table
if ( returnStructure == null )
{
jpl = f.getTableParameterList();
if ( jpl != null )
{
try
{
StringBuilder retMessage = new StringBuilder();
JCoTable returnTable = jpl.getTable("RETURN");
for (int i = 0; i < returnTable.getNumRows(); i++)
{
returnTable.setRow(i);
String type = returnTable.getString("TYPE");
// generally TYPE is S for success, I for
// informational, or empty
if ( !(type.equals("") || type.equals("S") || type.equals("I")) )
{
String message = returnTable.getString("MESSAGE");
/*UWPLogger.LogWarning*/ SybLogger.warn("SapUtils.execute[" + i + "]: TYPE: <<" + type + ">>, MESSAGE: <<"
+ message + ">>, NUMBER: <<" + returnTable.getInt("NUMBER") + ">>");
if ( !type.equals("W") && !nonErrorMessages.contains(message) )
{
success = false;
retMessage
.append("[" + i + "]TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>");
throw new DSException(DSException.INTERNAL_SERVER_ERROR, returnTable.getInt("NUMBER"), retMessage.toString());
}
else
{
retMessage
.append("[" + i + "]TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>");
}
}
else
{
if (SybLogger.isDebugEnabled())
{
String message = returnTable.getString("MESSAGE");
SybLogger.debug("SapUtils.execute[" + i + "]: TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>");
}
}
}
if( retMessage.length() > 0 )
{
msg = retMessage.toString();
}
}
catch (DSException dse) {
throw dse;
}
catch (Exception e)
{
/*UWPLogger.LogWarning*/ SybLogger.warn("SapUtils::execute: error in execution while retrieving RETURN table: ", e);
success = false;
msg = e.getMessage();
if (msg == null || msg.isEmpty())
{
// Revert to old behavior if no message is supplied.
msg = e.toString();
}
}
}
}
return new CheckReturnMapEntry<Boolean, String>(success, msg);
}
class CheckReturnMapEntry<Boolean, String> extends java.util.AbstractMap.SimpleImmutableEntry<Boolean, String> {
public CheckReturnMapEntry(Boolean success, String msg) {
super(success, msg);
}
}
}