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:

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:

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:

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;
	} }

Fault handling support


Related concepts:

How to support fault handling

Configuration for fault handling

Defining custom faults


Related reference:

Fault artifacts