IBM BPM, V8.0.1, All platforms > Authoring services in Integration Designer > Services and service-related functions > Access external services with adapters > Configure and using adapters > IBM WebSphere Adapters > Adapter Toolkit > Implementing code from the IBM WebSphere Adapter Toolkit > Problem determination > Fault handling support
Implementing faults
As part of the external service discovery process, you generate fault business objects and create the method that copies them to your outbound module.
The following examples show these fault exceptions:
- DuplicateRecord
- MatchesExceedLimit
To implement fault handling in the adapter, add getXMLListFunctions method and getBFFunctions method in the extension to WBIOutboundFunctionDescriptionImpl.
Modify getXMLListFunctions method
Modifying getXMLListFunctions involves the following changes:
- Adding a line to invoke a new method.
- Creating the new method or add some lines to an existing method to specify the faults
- Completing the stub to implement the FaultDataDescription class
The following example shows the first two changes:
private void getXMLListFunctions(ArrayList functionDescriptions, PropertyGroup pg, String relativePath, JDEXMLListMetadataObject metadataObj, WBIMetadataImportConfigurationImpl spec) throws MetadataException{ ... while(iterator.hasNext()) { String operation = JDEESDConstants.RETRIEVEALL; /* this is only operation supported for XML Lists */ WBIOutboundFunctionDescriptionImpl funcDesc = new WBIOutboundFunctionDescriptionImpl(); JDEXMLListQueryDataDescription queryDataDesc = (JDEXMLListQueryDataDescription)iterator.next(); //Added for Faults addFaultsToXMLListDataDescriptionBasedOnOperationName (funcDesc,operation); //Added for Faults funcDesc.setName(operation.toLowerCase() + queryDataDesc.getBOName()); getLogUtils().trace(LogLevel.FINEST, CLASSNAME, "getXMLListFunctions", "Setting input data description to: " + queryDataDesc.getName().toString() + " for function: " + funcDesc.getName()); //$NON-NLS-1$ funcDesc.setInputDataDescription(queryDataDesc); funcDesc.setOutputDataDescription(containerDataDesc); JDEInteractionSpec iSpec = new JDEInteractionSpec(); WBISingleValuedPropertyImpl maxCount = (WBISingleValuedPropertyImpl)pg.getProperty (JDEESDProperties.MAXRECORDS); if (maxCount.getValue() == null) iSpec.setMaxRecords(((Integer) maxCount.getPropertyType() .getDefaultValue ()).intValue()); else iSpec.setMaxRecords(((Integer) maxCount.getValue()).intValue()); WBISingleValuedPropertyImpl timeoutProp = (WBISingleValuedPropertyImpl) pg.getProperty(JDEESDProperties.ISPECTIMEOUT); if (timeoutProp.getValue() != null && ((Integer) timeoutProp.getValue ()).intValue()>0){ iSpec.setTimeout(((Integer) timeoutProp.getValue()).intValue()); } iSpec.setFunctionName(operation); funcDesc.setInteractionSpec(iSpec); functionDescriptions.add(funcDesc); } ...} private void addFaultsToXMLListDataDescriptionBasedOnOperationName( WBIOutboundFunctionDescriptionImpl funcDesc, String operationName) throws MetadataException { // Define XSDs for faults supported by this adapter. try { // During implementation - add faults based on the operationName // parameter. For ex an operation may have more than one fault. // And so the below logic will have to be using conditions // if(operationName.equals("CREATE")) {} then do this etc. JDEXMLListFaultDataDescription fdesc1 = new JDEXMLListFaultDataDescription(); JDEXMLListFaultDataDescription fdesc2 = new JDEXMLListFaultDataDescription(); BusinessObjectDefinition bo = FaultBOUtil.createDuplicateRecordBO(); URI uri = new URI("./" + FaultBOUtil.DUPLICATE_RECORD_NAME //$NON-NLS-1$ + EMDConstants.XSD); fdesc1.put(FaultBOUtil.FAULT_TARGET_NS, uri, bo.serialize()); fdesc1.setGenericDataBindingClassName ("com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"); fdesc1.setFaultName(FaultBOUtil.DUPLICATE_RECORD_NAME); bo = FaultBOUtil.createMatchesExceededLimitBO(); uri = new URI("./" + FaultBOUtil.MATCHES_EXCEEDED_LIMIT_NAME //$NON-NLS-1$ + EMDConstants.XSD); fdesc2.put(FaultBOUtil.FAULT_TARGET_NS, uri, bo.serialize()); fdesc2.setGenericDataBindingClassName ("com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"); fdesc2.setFaultName(FaultBOUtil.MATCHES_EXCEEDED_LIMIT_NAME); FaultDataDescription desc[] = new FaultDataDescription[] { fdesc1, fdesc2 }; funcDesc.setFaultSelectorClassname ("com.ibm.j2ca.extension.emd.runtime.WBIFaultSelectorImpl"); funcDesc.setFaultDataDescriptions(desc); } catch (Exception e) { throw new MetadataException( "Unable to create fault BO definitions " + e.getMessage(), e); //$NON-NLS-1$ } }The following example shows code for implementing FaultDataDescription in the JDEXMLListFaultDataDescription class:
public class JDEXMLListFaultDataDescription implements FaultDataDescription { public JDEXMLListFaultDataDescription() { super(); // TODO Auto-generated constructor stub } private String faultName = null; public String getFaultName() { // TODO Auto-generated method stub return faultName; } public void setFaultName(String faultName) { this.faultName = faultName; } }
Modify getBFFunctions method
Modifying getBFFunctions involves the following changes:
- Adding a line to invoke a new method
- Creating the new method or add some lines to an existing method to specify the faults
- Completing the stub to implement the FaultDataDescription class
The following example shows the first two changes:
private void getBFFunctions(ArrayList functionDescriptions, PropertyGroup pg, String relativePath, ArrayList dataDescriptions) throws MetadataException { Iterator iterator = dataDescriptions.iterator(); while(iterator.hasNext()){ JDEBFContainerDataDescription dataDesc = (JDEBFContainerDataDescription)iterator.next(); JDEBFOperationASI[] ops = dataDesc.getOperationASI(); ArrayList operations = new ArrayList(); for(int i=0; i<ops.length; i++) { if(ops[i].getBsfnNames().length>0){ operations.add(ops[i].getName()); } } Iterator opIterator = operations.iterator(); while (opIterator.hasNext()) { String operation = (String)opIterator.next(); WBIOutboundFunctionDescriptionImpl funcDesc = new WBIOutboundFunctionDescriptionImpl(); //Added for Faults addFaultsToBFDataDescriptionBasedOnOperationName (funcDesc,operation); //Added for Faults funcDesc.setName(operation.toLowerCase() + dataDesc.getBOName()); funcDesc.setInputDataDescription(dataDesc); funcDesc.setOutputDataDescription(dataDesc); JDEInteractionSpec iSpec = new JDEInteractionSpec(); iSpec.setFunctionName(operation); funcDesc.setInteractionSpec(iSpec); functionDescriptions.add(funcDesc); } } } private void addFaultsToBFDataDescriptionBasedOnOperationName (WBIOutboundFunctionDescriptionImpl funcDesc, String operationName) throws MetadataException { // Define XSDs for faults supported by this adapter. try { //During implementation - add faults based on the operationName parameter.For example,an operation may have more than one fault. //And so the below logic will have to be using conditions if(operationName.equals("CREATE")) {} then do this etc. JDEBFFaultDataDescription fdesc1 = new JDEBFFaultDataDescription(); JDEBFFaultDataDescription fdesc2 = new JDEBFFaultDataDescription(); BusinessObjectDefinition bo = FaultBOUtil.createDuplicateRecordBO(); URI uri = new URI("./" + FaultBOUtil.DUPLICATE_RECORD_NAME //$NON-NLS-1$ + EMDConstants.XSD); fdesc1.put(FaultBOUtil.FAULT_TARGET_NS, uri, bo.serialize()); fdesc1.setGenericDataBindingClassName ("com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"); fdesc1.setFaultName(FaultBOUtil.DUPLICATE_RECORD_NAME); bo = FaultBOUtil.createMatchesExceededLimitBO(); uri = new URI("./" + FaultBOUtil.MATCHES_EXCEEDED_LIMIT_NAME //$NON-NLS-1$ + EMDConstants.XSD); fdesc2.put(FaultBOUtil.FAULT_TARGET_NS, uri, bo.serialize()); fdesc2.setGenericDataBindingClassName ("com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"); fdesc2.setFaultName(FaultBOUtil.MATCHES_EXCEEDED_LIMIT_NAME); FaultDataDescription desc[] = new FaultDataDescription[] {fdesc1, fdesc2}; funcDesc.setFaultSelectorClassname ("com.ibm.j2ca.extension.emd.runtime.WBIFaultSelectorImpl"); funcDesc.setFaultDataDescriptions(desc); } catch (Exception e) { throw new MetadataException( "Unable to create fault BO definitions " + e.getMessage(), e); //$NON-NLS-1$ } }
The following example shows code for implementing FaultDataDescription in the JDEBFFaultDataDescription class:
public class JDEBFFaultDataDescription implements FaultDataDescription { public JDEBFFaultDataDescription() { super(); // TODO Auto-generated constructor stub } private String faultName = null; public String getFaultName() { // TODO Auto-generated method stub return faultName; } public void setFaultName(String faultName) { this.faultName = faultName; } }
Related concepts:
Configuration for fault handling
Related reference: