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.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.vader.utils.logging.SybLogger; import com.sybase.sup.sap3.SAPOperationHandler; import com.sybase.dataservices.OHLog; import com.sybase.dataservices.OHException; public class DefaultSAPOperationHandler extends SAPOperationHandler { private static Set<String> nonErrorMessages; static { nonErrorMessages = new HashSet<String>(); nonErrorMessages.add("No data found"); nonErrorMessages.add("Data was not found for the document"); nonErrorMessages.add("No customer was found with these selection criteria"); } public void resultCheck(JCoFunction f) { JCoRecord returnStructure = null; JCoParameterList jpl = f.getExportParameterList(); String errorMsg = null; int errorNumber = 0; String errorDebugMsg = null; boolean success = true; if ( jpl != null ) { try { returnStructure = jpl.getStructure("RETURN"); if ( returnStructure != null ) { SybLogger.debug("JCoRecord = '" + returnStructure.toXML() + '"'); String type = returnStructure.getString("TYPE"); String message = returnStructure.getString("MESSAGE"); // generally TYPE is S for success, I for informational, // or empty if ( type.equals("") || type.equals("S") || type.equals("I") ) { SybLogger.debug("Success"); //sendDebugMsg(returnStructure); OHLog.info(OHLog.EIS_SUCCESS, returnStructure.getInt("NUMBER"), message.isEmpty()?"Success":message); } else { SybLogger.debug("TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>"); if ( type.equals("W") || nonErrorMessages.contains(message) ) { SybLogger.debug("Success"); //sendDebugMsg(returnStructure); OHLog.warn(OHLog.EIS_SUCCESS, returnStructure.getInt("NUMBER"), message.isEmpty()?"Success":message); } else { SybLogger.debug("Error"); sendDebugMsg(returnStructure, OHLog.INTERNAL_SERVER_ERROR); SybLogger.debug("Throwing OHException. NUMBER="+ returnStructure.getInt("NUMBER")); throw new OHException(OHLog.INTERNAL_SERVER_ERROR, returnStructure.getInt("NUMBER"), returnStructure.getString("MESSAGE")); } } } } catch (OHException ohe) { throw ohe; } catch (Exception e) { SybLogger.debug("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 { JCoTable returnTable = jpl.getTable("RETURN"); SybLogger.debug("JCoTable = '" + returnTable.toXML() + '"'); for (int i = 0; i < returnTable.getNumRows(); i++) { returnTable.setRow(i); String type = returnTable.getString("TYPE"); String message = returnTable.getString("MESSAGE"); // generally TYPE is S for success, I for // informational, or empty if ( type.equals("") || type.equals("S") || type.equals("I") ) { SybLogger.debug("Success"); //sendDebugMsg(returnTable); OHLog.warn(OHLog.EIS_SUCCESS, returnTable.getInt("NUMBER"), message.isEmpty()?"Success":message); } else { SybLogger.debug("TYPE: <<" + type + ">>, MESSAGE: <<" + message + ">>"); // throw an exception on error, but need to discover if other rows exist first if ( type.equals("W") || nonErrorMessages.contains(message) ) { SybLogger.debug("Success"); //sendDebugMsg(returnTable); OHLog.warn(OHLog.EIS_SUCCESS, returnTable.getInt("NUMBER"), message.isEmpty()?"Success":message); } else { // If we previously discovered an error we can log this one and throw the other, later if(!success) { SybLogger.debug("Error"); sendDebugMsg(returnTable, OHLog.INTERNAL_SERVER_ERROR); OHLog.error(OHLog.INTERNAL_SERVER_ERROR, returnTable.getInt("NUMBER"), returnTable.getString("MESSAGE")); } else { SybLogger.debug("Error"); success = false; errorMsg = message; errorNumber = returnTable.getInt("NUMBER"); errorDebugMsg = makeDebugMsg(returnTable); } } } } } catch (Exception e) { success = false; errorMsg = e.getMessage(); errorNumber = 0; if (errorMsg == null || errorMsg.isEmpty()) { errorMsg = e.toString(); } } } } if(!success) { if(errorDebugMsg != null) { OHLog.debug(OHLog.INTERNAL_SERVER_ERROR, errorNumber, errorDebugMsg); } throw new OHException(OHLog.INTERNAL_SERVER_ERROR, errorNumber, errorMsg); } } // JCoTables are JCoRecords, so this works private String makeDebugMsg (JCoRecord r) { String s = ""; // Some fields may not be present, which will throw an exception we want to ignore try{s+="ID='" + r.getString("ID") + "'";} catch(Exception e){} try{s+=",LOG_NO='" + r.getString("LOG_NO") + "'";} catch(Exception e){} try{s+=",LOG_MSG_NO=" + r.getInt("LOG_MSG_NO");} catch(Exception e){} try{s+=",PARAMETER='" + r.getString("PARAMETER") + "'";} catch(Exception e){} try{s+=",ROW=" + r.getInt("ROW");} catch(Exception e){} try{s+=",FIELD='" + r.getString("FIELD") + "'";} catch(Exception e){} try{s+=",SYSTEM='" + r.getString("SYSTEM") + "'";} catch(Exception e){} return s; } private void sendDebugMsg (JCoRecord r, int supCode) { String s = makeDebugMsg(r); OHLog.debug(supCode, r.getInt("NUMBER"), s); } private void sendDebugMsg (JCoRecord r) { sendDebugMsg(r, OHLog.EIS_SUCCESS); } }