Suspect processing: entity suspect processors

The following is a description of the changes to how InfoSphere® MDM uses and handles entity suspect processors.

Before OSGi

Suspect processors are programs whose job it is to determine if the changes made to a business object warrant redetermining if any parties that have those business objects (names, addresses, and so forth) are possible duplicates to other parties. This is called suspect re-identification. Before OSGi, these were mapped using properties files as follows:
## EntitySuspectProcessor
## suspectProcessor.<fully qualified class name>=<fully qualified processor class name>
###############################################################################################
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPersonBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPersonNameBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMOrganizationBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMOrganizationNameBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyAddressBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyIdentificationBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyContactMethodBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyBankAccountBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyChargeCardBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyPayrollDeductionBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMIncomeSourceBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyPayrollDeductionBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMFinancialProfileBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyLobRelationshipBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMAddressBObj=com.ibm.mdm.suspect.UnhandledEntitySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMContactMethodBObj=com.ibm.mdm.suspect.UnhandledEntitySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMPartyCDCBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor
suspectProcessor.com.dwl.tcrm.coreParty.component.TCRMMultiplePartyCDCBObj=com.ibm.mdm.party.suspect.component.PartySuspectProcessor

The left hand side of the equation, prefixed by suspectprocessor denoted the object being examined for suspect reidentification. The left hand side denoted the processor that would perform the examination.

With OSGi

With OSGi, these have been moved to blueprint files as illustrated here:
<service id="PartyEntity.SuspectProcessor" 
interface="com.ibm.mdm.common.servicefactory.api.CommonServiceFactory">
	<service-properties>
		<entry key="common.service">
			<list value-type="java.lang.String">
				<value>EntitySuspectProcessor.TCRMPartyBObj</value>
				<value>EntitySuspectProcessor.TCRMPersonBObj</value>
				<value>EntitySuspectProcessor.TCRMPersonNameBObj</value>
				<value>EntitySuspectProcessor.TCRMOrganizationBObj</value>
				<value>EntitySuspectProcessor.TCRMOrganizationNameBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyAddressBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyIdentificationBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyContactMethodBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyBankAccountBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyChargeCardBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyPayrollDeductionBObj</value>
				<value>EntitySuspectProcessor.TCRMIncomeSourceBObj</value>
				<value>EntitySuspectProcessor.TCRMFinancialProfileBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyLobRelationshipBObj</value>
				<value>EntitySuspectProcessor.TCRMPartyCDCBObj</value>
				<value>EntitySuspectProcessor.TCRMMultiplePartyCDCBObj</value>
			</list>
		</entry>			
	</service-properties>
	<bean class="com.ibm.mdm.common.servicefactory.CommonServiceFactoryImpl">
		<argument type="java.lang.Class" value="com.ibm.mdm.suspect.EntitySuspectProcessor"/>
		<argument type="java.lang.Class" 
			value="com.ibm.mdm.party.suspect.component.PartySuspectProcessor" />
		<argument ref="blueprintBundle"/>			
	</bean>
</service>

In the preceding example, the list of business objects that may contain an attribute used for determining suspect duplicates are contained in list of service-properties. The program that makes the determination is specified in the second argument to the bean com.ibm.mdm.party.suspect.component.PartySuspectProcessor. The first argument, com.ibm.mdm.suspect.EntitySuspectProcessor, is the common interface for all suspect processors.

If you have written your own suspect processors, this is the pattern to follow:
<service id="PartyEntity.SuspectProcessor" 
interface="com.ibm.mdm.common.servicefactory.api.CommonServiceFactory" ranking="10">
	<service-properties>
		<entry key="common.service">
			<list value-type="java.lang.String">
				<value>EntitySuspectProcessor.<the BOBJ your processor will examine></value>
				<value>EntitySuspectProcessor.<...></value>
			</list>
		</entry>			
	</service-properties>
	<bean class="com.ibm.mdm.common.servicefactory.CommonServiceFactoryImpl">
		<argument type="java.lang.Class" 
			value="com.ibm.mdm.suspect.EntitySuspectProcessor"/>
		<argument type="java.lang.Class" 
			value="<the class name of the processor that does the examining>" />
		<argument ref="blueprintBundle"/>			
	</bean>
</service>
Make sure you’ve included ranking="10", especially if you have written entity suspect processors that override the ones provided with InfoSphere MDM out of the box.