Advertisement
scosaje

Untitled

Sep 7th, 2016
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 111.14 KB | None | 0 0
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <mule xmlns:core="http://www.mulesoft.org/schema/mule/core"
  4. xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting"
  5. xmlns:db="http://www.mulesoft.org/schema/mule/db"
  6. xmlns="http://www.mulesoft.org/schema/mule/core"
  7. xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
  8. xmlns:spring="http://www.springframework.org/schema/beans"
  9. xmlns:context="http://www.springframework.org/schema/context"
  10. xmlns:tools="http://www.springframework.org/schema/tool"
  11. xmlns:os-core="http://www.openspaces.org/schema/core"
  12. xmlns:os-events="http://www.openspaces.org/schema/events"
  13. xmlns:os-remoting="http://www.openspaces.org/schema/remoting"
  14. xmlns:os-eventcontainer="http://www.openspaces.org/schema/mule/os-eventcontainer"
  15. xmlns:os-queue="http://www.openspaces.org/schema/mule/os-queue"
  16. xmlns:aop="http://www.springframework.org/schema/aop"
  17. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18. xmlns:json="http://www.mulesoft.org/schema/mule/json"
  19. xmlns:jms="http://www.mulesoft.org/schema/mule/jms"
  20. xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz"
  21. xmlns:mongo="http://www.mulesoft.org/schema/mule/mongo"
  22. xmlns:esper="http://www.mulesoft.org/schema/mule/esper"
  23. xmlns:objectstore="http://www.mulesoft.org/schema/mule/objectstore"
  24. xmlns:validation="http://www.mulesoft.org/schema/mule/validation"
  25. xmlns:ws="http://www.mulesoft.org/schema/mule/ws"
  26. xmlns:http="http://www.mulesoft.org/schema/mule/http"
  27. xmlns:cxf="http://www.mulesoft.org/schema/mule/cxf"
  28. xmlns:schemadoc="http://www.mulesoft.org/schema/mule/schemadoc"
  29. xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core file:///opt/schemas/mule37/mule.xsd
  30. http://www.mulesoft.org/schema/mule/db file:///opt/schemas/mule37/mule-db.xsd
  31. http://www.springframework.org/schema/beans file:///opt/schemas/Spring4/beans/spring-beans-4.0.xsd
  32. http://www.springframework.org/schema/context file:///opt/schemas/Spring4/context/spring-context-4.0.xsd
  33. http://www.springframework.org/schema/tool file:///opt/schemas/Spring4/tool/spring-tool-4.0.xsd
  34. http://www.openspaces.org/schema/events file:///opt/schemas/openspaces-10.2/events/config/openspaces-events.xsd
  35. http://www.openspaces.org/schema/core file:///opt/schemas/openspaces-10.2/core/config/openspaces-core.xsd
  36. http://www.openspaces.org/schema/remoting file:///opt/schemas/openspaces-10.2/remoting/config/openspaces-remoting.xsd
  37. http://www.openspaces.org/schema/mule/os-eventcontainer file:///opt/schemas/openspaces-10.2/esb/mule/eventcontainer/config/mule-os-eventcontainer.xsd
  38. http://www.openspaces.org/schema/mule/os-queue file:///opt/schemas/openspaces-10.2/esb/mule/queue/config/mule-os-queue.xsd
  39. http://www.mulesoft.org/schema/mule/scripting file:///opt/schemas/mule37/mule-scripting.xsd
  40. http://www.springframework.org/schema/aop file:///opt/schemas/Spring4/aop/spring-aop-4.0.xsd
  41. http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/3.7/mule-json.xsd
  42. http://www.mulesoft.org/schema/mule/mongo file:///opt/schemas/mule33/mule-module-mongo-2.2.xsd
  43. http://www.mulesoft.org/schema/mule/esper file:///opt/schemas/esper/mule-esper.xsd
  44. http://www.mulesoft.org/schema/mule/quartz file:///home/opt/schemas/mule37/mule-quartz.xsd
  45. http://www.mulesoft.org/schema/mule/objectstore http://www.mulesoft.org/schema/mule/objectstore/current/mule-objectstore.xsd
  46. http://www.mulesoft.org/schema/mule/validation http://www.mulesoft.org/schema/mule/validation/current/mule-validation.xsd
  47. http://www.mulesoft.org/schema/mule/schemadoc http://www.mulesoft.org/schema/mule/schemadoc/3.7/mule-schemadoc.xsd
  48. http://www.mulesoft.org/schema/mule/cxf http://www.mulesoft.org/schema/mule/cxf/3.7/mule-cxf.xsd
  49. http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/3.7/mule-http.xsd
  50. http://www.mulesoft.org/schema/mule/ws http://www.mulesoft.org/schema/mule/ws/3.7/mule-ws.xsd
  51. http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/3.7/mule-jms.xsd ">
  52.  
  53. <configuration>
  54.  
  55. <default-dispatcher-threading-profile
  56. maxThreadsActive="50" maxThreadsIdle="25" threadTTL="60000" />
  57. <default-receiver-threading-profile
  58. maxThreadsActive="50" maxThreadsIdle="25" threadTTL="60000" />
  59. <default-service-threading-profile
  60. maxThreadsActive="50" maxThreadsIdle="25" threadTTL="60000" />
  61. <expression-language>
  62.  
  63. <import name="sys" class="java.lang.System" />
  64. <import name="uiMessage" class="com.inspired.ui.message.UiMessage"/>
  65. <import name="objectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>
  66. <import name="stringUtils" class="com.inspired.comms.utils.StringUtils"/>
  67. <import class="com.inspired.logistics.utils.Day"/>
  68. <import class="org.jboss.netty.buffer.ChannelBuffer"/>
  69. <import class="com.inspired.maths.MathUtils"/>
  70. <import class="java.util.UUID"/>
  71. <import class="org.joda.time.DateTimeUtils"/>
  72. <import class="org.joda.time.DateTime"/>
  73. <import class="com.espertech.esper.event.map.MapEventBean"/>
  74. <import class="com.inspired.geospatial.location.Point"/>
  75. <import class="com.espertech.esper.collection.Pair"/>
  76. <import class="com.espertech.esper.event.bean.BeanEventBean"/>
  77. <import class="com.espertech.esper.client.EventBean"/>
  78. <import class="java.math.BigDecimal"/>
  79. <import class="com.inspired.time.utils.StoreObjectInSpaceProcessor"/>
  80. <import class="com.gigaspaces.client.WriteModifiers"/>
  81. <import class="org.openspaces.core.GigaSpace"/>
  82. <import class="org.joda.time.DateTime"/>
  83. <import class="com.hazelcast.core.IMap"/>
  84. <import class="net.sf.json.JSONObject"/>
  85. <import class="com.inspired.national.id.exchange.BulkIdentityDataTransportObject"/>
  86. <import class="com.inspired.national.id.NationalIdentityPersonData"/>
  87. <import class="com.inspired.national.id.AgencyBiometricsDataExchObject"/>
  88. <import class="com.inspired.national.id.AgencyIdentityDataType"/>
  89. <import class="com.inspired.national.id.NimcPersonObjectState"/>
  90. <import class="com.inspired.national.id.NimcAgyRegisteredPerson"/>
  91. <import class="com.inspired.national.id.NINUpdatePackage"/>
  92. <import class="com.inspired.national.id.NINAssignmentUpdateState"/>
  93. <import class="com.inspired.national.id.ImageExchangeObject"/>
  94. <import class="com.inspired.national.id.PersonBiometricsMetaData"/>
  95. <import class="com.inspired.national.id.PersonBiometricDetails"/>
  96. <import class="com.espertech.esper.collection.Pair"/>
  97. <import class="com.inspired.national.id.BiometricsQualityIndicator"/>
  98. <import class="com.inspired.image.utils.ImageUtils"/>
  99. <import class="com.inspired.time.utils.AgeCalculator"/>
  100. <import class="com.inspired.comms.utils.TelephoneNumberUtils"/>
  101. <import class="org.jnbis.api.Jnbis"/>
  102. <import class="org.jnbis.api.model.Bitmap"/>
  103. <import class="com.inspired.national.id.exchange.NIMCAcceptedIdentityObject"/>
  104. <import class="com.inspired.national.id.exchange.NIMCFingerprintObjects"/>
  105. <import class="com.inspired.national.id.exchange.NIMCAcceptedPersonBiometrics"/>
  106.  
  107. <alias name="i" expression="message.inboundProperties" />
  108. <!-- <global-functions file="shared-functions.mel"> -->
  109. <global-functions>
  110. def now(){
  111. dateFormat = new java.text.SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
  112. dateFormat.format(new Date());
  113. }
  114. def addTax(d){
  115. d * 1.2
  116. }
  117. def randomBoolean(){
  118. r = new java.util.Random();
  119. r.nextBoolean()
  120. }
  121. def randomDiscount(){
  122. r = new java.util.Random();
  123. r.nextInt(20)/100
  124. }
  125. def formatPrice(price){
  126. df = java.text.NumberFormat.getCurrencyInstance();
  127. df.format((double)price)
  128. }
  129. def getUniqueId(){
  130. UUID.randomUUID().toString();
  131. }
  132. def getCurrentMonth(){
  133. Integer.valueOf(Day.today().getMonth());
  134. }
  135. def getDefaultRate(){
  136. 6.80;
  137. }
  138. def minNumAcceptableFingers(){
  139. 4;
  140. }
  141. def minAgeForAdultRegistration(){
  142. 16
  143. }
  144. </global-functions>
  145. </expression-language>
  146. </configuration>
  147.  
  148. <!-- <mongo:connection-pooling-profile maxActive="10" maxIdle="10" exhaustedAction="WHEN_EXHAUSTED_GROW" maxWait="120"/>-->
  149.  
  150. <mongo:config name="identitiesStoreMongoDbConfig" username="sco"
  151. password="inspired"
  152. database="nimcCentralIdentitiesMongoDb"
  153. host="${mongdb.server}"
  154. autoConnectRetry="true" >
  155. <mongo:connection-pooling-profile maxActive="100" maxIdle="30"
  156. initialisationPolicy="INITIALISE_ONE"
  157. exhaustedAction="WHEN_EXHAUSTED_GROW" maxWait="120"/>
  158. </mongo:config>
  159.  
  160. <!--<os-eventcontainer:connector name="gigaSpacesConnector" />-->
  161.  
  162. <!-- <os-queue:connector name="queueConnectorNIMCSpace"
  163. giga-space="nimcWanIdentitiesGSpace"
  164. fifo="false"
  165. persistent="true"
  166. timeout="35000"/>-->
  167.  
  168. <!-- <queued-asynchronous-processing-strategy name="queued-120-threads-processor"
  169. maxThreads="120"
  170. doc:name="Queued Asynchronous Processing Strategy"/> -->
  171.  
  172. <spring:beans>
  173.  
  174. <spring:import resource="classpath:META-INF/cxf/cxf.xml"/>
  175. <spring:import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
  176. <spring:import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  177.  
  178. <spring:bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
  179. <spring:property name="connectionFactory">
  180. <spring:bean class="org.apache.activemq.spring.ActiveMQConnectionFactory">
  181. <spring:property name="brokerURL" value="tcp://localhost:61616"/>
  182. </spring:bean>
  183. </spring:property>
  184. </spring:bean>
  185.  
  186. <os-events:polling-container id="IdentityServicesExportingPollingContainer"
  187. giga-space="nimcWanIdentitiesGSpace"
  188. concurrent-consumers="10"
  189. max-concurrent-consumers="15">
  190. <os-events:tx-support tx-manager="distribTransactionManager"
  191. tx-timeout="150000"
  192. tx-isolation="READ_COMMITTED"/>
  193. <os-events:receive-operation-handler>
  194. <spring:bean class="org.openspaces.events.polling.receive.MultiTakeReceiveOperationHandler">
  195. <spring:property name="nonBlocking" value="true" />
  196. <spring:property name="nonBlockingFactor" value="10" />
  197. </spring:bean>
  198. </os-events:receive-operation-handler>
  199. <os-events:listener ref="identityServicesExporter"/>
  200. </os-events:polling-container>
  201.  
  202. <os-remoting:service-exporter id="identityServicesExporter" >
  203. <!-- <os-remoting:service ref="mongoDbAuthenticationProvider"/>
  204. <os-remoting:service ref="jdbcUserDetailsManager"/>
  205. <os-remoting:service ref="pooledJdbcDaoProxyBean"/> -->
  206. </os-remoting:service-exporter>
  207.  
  208. <os-events:polling-container id="NIMCWanSpaceBiometricsImageObjPollContainerOne"
  209. giga-space="nimcWanIdentitiesGSpace"
  210. concurrent-consumers="7"
  211. max-concurrent-consumers="7"
  212. receive-timeout="75000"
  213. auto-start="false"
  214. pass-array-as-is="true">
  215. <os-events:tx-support tx-manager="distribTransactionManager"
  216. tx-isolation="READ_COMMITTED"
  217. tx-timeout="75000"/>
  218. <os-core:sql-query where="destinationAgency='NIMC_CENTRAL'"
  219. class="com.inspired.national.id.ImageExchangeObject"/>
  220. <os-events:receive-operation-handler>
  221. <spring:bean class="org.openspaces.events.polling.receive.MultiTakeReceiveOperationHandler">
  222. <spring:property name="nonBlocking" value="true" />
  223. <spring:property name="nonBlockingFactor" value="10" />
  224. <spring:property name="maxEntries" value="10" />
  225. </spring:bean>
  226. </os-events:receive-operation-handler>
  227. </os-events:polling-container>
  228.  
  229. <os-events:polling-container id="NIMCWanSpaceBiometricsImageObjPollContainerTwo"
  230. giga-space="nimcWanIdentitiesGSpace"
  231. concurrent-consumers="7"
  232. max-concurrent-consumers="7"
  233. receive-timeout="75000"
  234. auto-start="false"
  235. pass-array-as-is="true" >
  236. <os-events:tx-support tx-manager="distribTransactionManager"
  237. tx-isolation="READ_COMMITTED"
  238. tx-timeout="75000"/>
  239. <os-core:sql-query where="destinationAgency='NIMC_CENTRAL'"
  240. class="com.inspired.national.id.ImageExchangeObject"/>
  241. <os-events:receive-operation-handler>
  242. <spring:bean class="org.openspaces.events.polling.receive.MultiTakeReceiveOperationHandler">
  243. <spring:property name="nonBlocking" value="true" />
  244. <spring:property name="nonBlockingFactor" value="10" />
  245. <spring:property name="maxEntries" value="100" />
  246. </spring:bean>
  247. </os-events:receive-operation-handler>
  248. </os-events:polling-container>
  249.  
  250. <os-events:polling-container id="NIMCWanSpaceBiometricsImageObjPollContainerThree"
  251. giga-space="nimcWanIdentitiesGSpace"
  252. concurrent-consumers="7"
  253. max-concurrent-consumers="7"
  254. receive-timeout="75000"
  255. auto-start="false"
  256. pass-array-as-is="true">
  257. <os-events:tx-support tx-manager="distribTransactionManager"
  258. tx-isolation="READ_COMMITTED"
  259. tx-timeout="75000"/>
  260. <os-core:sql-query where="destinationAgency='NIMC_CENTRAL'"
  261. class="com.inspired.national.id.ImageExchangeObject"/>
  262. <os-events:receive-operation-handler>
  263. <spring:bean class="org.openspaces.events.polling.receive.MultiTakeReceiveOperationHandler">
  264. <spring:property name="nonBlocking" value="true" />
  265. <spring:property name="nonBlockingFactor" value="10" />
  266. <spring:property name="maxEntries" value="100" />
  267. </spring:bean>
  268. </os-events:receive-operation-handler>
  269. </os-events:polling-container>
  270. </spring:beans>
  271.  
  272. <!-- <ws:consumer-config name="NIMC_Data_Upload_Web_Service_Consumer"
  273. wsdlLocation="http://10.1.0.22:8090/nimcdataupload/DataReception?wsdl"
  274. service="nimcdataupload"
  275. port="nimcdatauploadPort"
  276. serviceAddress="http://10.1.0.22:8090/nimcdataupload/DataReception" doc:name="Identity Enrollment Web Service"/>
  277.  
  278. <ws:consumer-config name="NIMC_BVN_Registration_Web_Service_Consumer"
  279. wsdlLocation="http://10.1.0.22:8090/NIMCDataUploadBVN/DataReception?wsdl"
  280. service="NIMCDataUploadBVN"
  281. port="NIMCDataUploadBVNPort"
  282. serviceAddress="http://10.1.0.22:8090/NIMCDataUploadBVN/DataReception" doc:name="BVN Registration Web Service"/>-->
  283.  
  284. <notifications dynamic="true">
  285. <notification event="COMPONENT-MESSAGE"/>
  286. <notification event="CONNECTION"/>
  287. <notification event="ENDPOINT-MESSAGE"/>
  288. <notification event="MESSAGE-PROCESSOR"/>
  289. <notification event="ROUTING"/>
  290. <notification event="SERVICE"/>
  291. </notifications>
  292.  
  293. <jms:activemq-connector name="jmsConnector-biometrics"
  294. specification="1.1"
  295. brokerURL="vm://${activemq.broker.host}:61616"
  296. connectionFactory-ref="cachingConnectionFactory"
  297. maxRedelivery="6"
  298. cacheJmsSessions="true"
  299. eagerConsumer="true"
  300. createMultipleTransactedReceivers="true"
  301. numberOfConcurrentTransactedReceivers="7"
  302. noLocal="true" />
  303.  
  304. <!-- <flow name="nimcIdentityRegistrationTestWebService">
  305. <http:inbound-endpoint address="http://localhost:63081/nimcRegistrationService"
  306. exchange-pattern="request-response">
  307. <cxf:jaxws-service serviceClass="com.inspired.nat.identity.IdentityRegistration"/>
  308. </http:inbound-endpoint>
  309. <component>
  310. <spring-object bean="nimcIdentityRegWebService"/>
  311. </component>
  312. </flow>-->
  313.  
  314. <flow name="ProcessMessageToLocalSpaceFromWanSpaceProcessor">
  315. <composite-source doc:name="Composite Source">
  316. <inbound-endpoint address="os-eventcontainer://NIMCWanSpaceBiometricsImageObjPollContainerOne"
  317. exchange-pattern="request-response"/>
  318. <inbound-endpoint address="os-eventcontainer://NIMCWanSpaceBiometricsImageObjPollContainerTwo"
  319. exchange-pattern="request-response" />
  320. <inbound-endpoint address="os-eventcontainer://NIMCWanSpaceBiometricsImageObjPollContainerThree"
  321. exchange-pattern="request-response" />
  322. </composite-source>
  323. <expression-component doc:name="Update Activiti Process Parameters">
  324. System.out.println("SPACE WORKER: Biometrics Objects Arrives in Space ");
  325. </expression-component>
  326. <async doc:name="Async" processingStrategy="queued-150-threads-processor">
  327. <processor-chain>
  328. <expression-component doc:name="Update Activiti Process Parameters">
  329. System.out.println("WAN BULK ENTRIES PROCESSOR: Payload after Object to JSON: " + message.payloadAs(java.lang.String));
  330. </expression-component>
  331. <foreach>
  332. <choice>
  333. <when expression="#[payload is ImageExchangeObject]">
  334. <processor-chain>
  335. <expression-transformer expression="#[ biometricsImageBulkObject = (ImageExchangeObject)payload;
  336. bioObjectsInArray = (byte[])biometricsImageBulkObject.getEncryptImageObject();
  337. blProcessed = biometricsImageBulkObject.getProcessed();
  338. flowVars['bioTransactId'] = biometricsImageBulkObject.getTransactionId();
  339. if(!blProcessed){
  340. flowVars['content'] = bioObjectsInArray;
  341. }
  342. flowVars['content']]"/>
  343. <expression-component doc:name="Update Activiti Process Parameters">
  344. System.out.println("BIOMETRICS OBJECTS PROCESSOR: Number of Entries : " + flowVars['bioTransactId']);
  345. System.out.println("BIOMETRICS OBJECTS PROCESSOR: Payload is of type : " + payload.getClass().getName());
  346. </expression-component>
  347. <gzip-uncompress-transformer />
  348. <byte-array-to-object-transformer doc:name="Byte Array to Object" mimeType="application/java"/>
  349. <expression-component doc:name="Decompressed Payload from Central WAN Space">
  350. System.out.println("BIOMETRICS OBJECTS PROCESSOR: Decompressed Bio Payload acquired: " + payload.getClass().getName());
  351. </expression-component>
  352. <choice>
  353. <when expression="#[payload is List]">
  354. <processor-chain>
  355. <foreach>
  356. <processor-chain>
  357. <expression-component doc:name="Decompressed Payload from Central WAN Space">
  358. System.out.println("BIOMETRICS OBJECTS PROCESSOR: Payload of Object for Processing is of type: " + payload.getClass().getName());
  359. flowVars['bvnNumber'] = payload.getId();
  360. System.out.println("BIOMETRICS OBJECTS PROCESSOR: Just Acquired Perons BVN Number: " + flowVars['bvnNumber']);
  361. </expression-component>
  362. <enricher target="#[flowVars['bioObjectsWriteLeaseContextId']]" doc:name="Enrich Space Lease Context ">
  363. <flow-ref name="sendImageObjectsToSpace" doc:name="Send The Bunch to Space"/>
  364. </enricher>
  365. <expression-component doc:name="processFlowMeterStatus">
  366. System.out.println("BIO OBJECTS STORE ENGINE: Identity Object Written Xfer Space with Uid" + flowVars['bioObjectsWriteLeaseContextId']);
  367. </expression-component>
  368. <enricher target="#[flowVars['ageAtLastBirthDate']]" doc:name="Enrich Space Lease Context">
  369. <processor-chain>
  370. <flow-ref name="subFlow-acquireDemoDataAndComputeAgeToAtLastBirthDay" doc:name="Send Response Back to Agency"/>
  371. </processor-chain>
  372. </enricher>
  373. <expression-transformer expression="#[ bioMetaDat = new PersonBiometricsMetaData(flowVars['bioTransactId'],
  374. Long.valueOf(DateTimeUtils.currentTimeMillis()), flowVars['bvnNumber']);
  375. bioMetaDat.setStorageId(flowVars['bioObjectsWriteLeaseContextId']);
  376. bioMetaDat.setProcessed(Boolean.FALSE);
  377. if(flowVars['ageAtLastBirthDate']!=null){
  378. bioMetaDat.setAgeOfPersonAtLastBirthDay(flowVars['ageAtLastBirthDate']);
  379. }
  380. if(flowVars['dateOfBirth']!=null){
  381. bioMetaDat.setDateOfBirth(flowVars['dateOfBirth']);
  382. }
  383. bioMetaDat.setFacialImageState(BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED);
  384. bioMetaDat.setSignatureImageState(BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED);
  385. bioMetaDat.setFingerPrintsState(BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED);
  386. bioMetaDat ]"/>
  387. <expression-component doc:name="processFlowMeterStatus">
  388. System.out.println("BIO OBJECTS STORE ENGINE: Biometrics Meta Data Ready to Send to intel Engine: " + message.payloadAs(java.lang.String));
  389. </expression-component>
  390. <esper:send eventPayload-ref="#[payload:]"/>
  391. <expression-component doc:name="processFlowMeterStatus">
  392. System.out.println("BIO OBJECTS STORE ENGINE: Biometrics Object Sent to Intell Engine: " + payload.getClass().getName());
  393. </expression-component>
  394. </processor-chain>
  395. </foreach>
  396. </processor-chain>
  397. </when>
  398. <otherwise>
  399. <expression-component doc:name="processFlowMeterStatus">
  400. System.out.println("BIO OBJECTS STORE ENGINE: We have different types of Objects: " + payload.getClass().getName());
  401. </expression-component>
  402. </otherwise>
  403. </choice>
  404. </processor-chain>
  405. </when>
  406. <otherwise>
  407. <expression-component doc:name="processFlowMeterStatus">
  408. System.out.println("BIO OBJECTS STORE ENGINE: We have different types of Objects: " + payload.getClass().getName());
  409. </expression-component>
  410. </otherwise>
  411. </choice>
  412. </foreach>
  413. </processor-chain>
  414. </async>
  415. <!-- <default-exception-strategy>
  416. <jms:outbound-endpoint queue="failedProcesses"/>
  417. </default-exception-strategy>-->
  418. </flow>
  419.  
  420. <flow name="prepareAndGradeBiometricsPackageQuality">
  421. <esper:listen statement="select * from PersonBiometricsMetaDataEvent
  422. match_recognize ( partition by agencyUniqueNumber
  423. measures A.transactionId as a_theId, B.transactionId as b_theId, C.transactionId as c_theId
  424. D.transactionId as d_theId
  425. pattern (A+? B+ C+ D+)
  426. define
  427. A as A.processed=false and A.ninNumber = null and A.dateOfBirth!=null,
  428. B as B.facialImageState = BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED
  429. and B.signatureImageState = BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED,
  430. C as C.fingerPrintsState = BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED,
  431. D as D.ageOfPersonAtLastBirthDay>=min_age_for_adult)"/>
  432. <async processingStrategy="queued-120-threads-processor">
  433. <processor-chain>
  434. <expression-component doc:name="prepareAndGradeBiometricsPackageQuality-exp-component">
  435. System.out.println("BIOMETRICS QUALITY ASSURANCE: Message Matched OK: " + message.payloadAs(java.lang.String));
  436. if(payload['unClassifiedPersonsBiometrics']!=null){
  437. personsBiometricsPackMetaData = payload['unClassifiedPersonsBiometrics'].getUnderlying();
  438. if(personsBiometricsPackMetaData!=null){
  439. bioTransactionId = personsBiometricsPackMetaData.getAgencyUniqueNumber();
  440. if(personsBiometricsPackMetaData!=null){
  441. if(bioTransactionId!=null){
  442. flowVars['bvnNumber'] = bioTransactionId;
  443. }
  444. }else{
  445. System.out.println("BIOMETRICS QUALITY ASSURANCE: Biometrics transactionId not contained in Payload");
  446. }
  447. }
  448. flowVars['ageLastBirthDay'] = personsBiometricsPackMetaData.getAgeOfPersonAtLastBirthDay();
  449. payload = personsBiometricsPackMetaData;
  450. </expression-component>
  451. <choice>
  452. <when expression="#[flowVars['ageLastBirthDay']>= minAgeForAdultRegistration()]">
  453. <processor-chain>
  454. <enricher target="#[flowVars['personBiometricsData']]"
  455. doc:name="Enrich Space Lease Context">
  456. <flow-ref name="subFlow-acquireBiometricsObjectsFromStorageSpace"
  457. doc:name="Send Response Back to Agency"/>
  458. </enricher>
  459. <scatter-gather timeout="5000">
  460. <custom-aggregation-strategy class="com.inspired.nat.identity.BiometricsVerificationAggregationStrategy"/>
  461. <threading-profile maxThreadsActive="3"/>
  462. <flow-ref name="subFlow-updateStatusOfFingerPrintsInBioMetaData"
  463. doc:name="Send Response Back to Agency"/>
  464. <flow-ref name="subFlow-processFacialImagesAndSignatures"
  465. doc:name="Send Response Back to Agency"/>
  466. <flow-ref name="subFlow-processSignatureImageVerification"
  467. doc:name="Send Response Back to Agency"/>
  468. </scatter-gather>
  469. <wire-tap>
  470. <processor-chain>
  471. <expression-component doc:name="Update The Identity Object in the Intell Engine">
  472. System.out.println("BIOMETRICS QUALITY ASSURANCE: " + message.payloadAs(java.lang.String));
  473. </expression-component>
  474. <esper:send eventPayload-ref="#[payload:]"/>
  475. </processor-chain>
  476. </wire-tap>
  477. <expression-component doc:name="Update Activiti Process Parameters">
  478. System.out.println("BIOMETRICS QUALITY ASSURANCE: Biometrics Aggregation Completed : " + message.payloadAs(java.lang.String));
  479. if(flowVars['nimc_finger_print_objects']!=null){
  480. System.out.println("BIOMETRICS QUALITY ASSURANCE: Finger prints Object Bean Acquired: " + flowVars['nimc_finger_print_objects']);
  481. }
  482. </expression-component>
  483. <set-property propertyName="mongo_object_coll_name"
  484. value="#['NimcAcceptedBiometricsColl']"/>
  485. <set-property propertyName="correlation_id"
  486. value="#[payload['transactionId']]"/>
  487. <set-property propertyName="source_agency"
  488. value="#[payload['sourceAgency']]"/>
  489. <set-property propertyName="biometrics_object"
  490. value="#[flowVars['nimc_finger_print_objects']]" />
  491. <jms:outbound-endpoint queue="upsert.biometrics.object.in.mongo.db.edp"
  492. connector-ref="jmsConnector-next"
  493. exchange-pattern="request-response">
  494. <jms:transaction action="ALWAYS_BEGIN" />
  495. </jms:outbound-endpoint>
  496. </processor-chain>
  497. </when>
  498. <otherwise>
  499. <expression-component doc:name="Update Activiti Process Parameters">
  500. System.out.println("BIOMETRICS QUALITY ASSURANCE: This Person is Child, Age: "+ flowVars['ageLastBirthDay']);
  501. flowVars['biometricsQuality'] = BiometricsQualityIndicator.PERSON_IS_NOT_ADULT;
  502. </expression-component>
  503. </otherwise>
  504. </choice>
  505. </processor-chain>
  506. </async>
  507. </flow>
  508.  
  509. <flow name="update-biometrics-objects-in-db">
  510. <jms:inbound-endpoint queue="upsert.biometrics.object.in.mongo.db.edp"
  511. connector-ref="jmsConnector-next">
  512. <jms:transaction action="JOIN_IF_POSSIBLE" />
  513. </jms:inbound-endpoint>
  514. <logger message="Updating Biometrics in DB for Person : #[message.inboundProperties['person_unique_id']] -- #[payload] )" level="INFO" doc:name="Logger" />
  515. <async>
  516. <processor-chain>
  517. <enricher target="#[flowVars['collection-exists']]">
  518. <mongo:exists-collection collection="#['NimcAcceptedBiometricsColl']"
  519. config-ref="identitiesStoreMongoDbConfig"/>
  520. </enricher>
  521. <choice>
  522. <when expression="#[flowVars['collection-exists']=='false']">
  523. <processor-chain>
  524. <expression-component doc:name="Update Activiti Process Parameters">
  525. System.out.println("MONGO-DB STORE: Going to Create Collection With Name: " + message.inboundProperties['mongo_object_coll_name'] );
  526. </expression-component>
  527. <mongo:create-collection collection="#['NimcAcceptedBiometricsColl']"
  528. capped="false"
  529. config-ref="identitiesStoreMongoDbConfig"/>
  530. </processor-chain>
  531. </when>
  532. <otherwise>
  533. <expression-component doc:name="Update Activiti Process Parameters">
  534. System.out.println("MONGO-DB BIOMETRICS STORE: Collection " + message.inboundProperties['mongo_object_coll_name'] + " Already Exist");
  535. </expression-component>
  536. </otherwise>
  537. </choice>
  538. <expression-filter expression="#[flowVars['collection-exists']=='true']" doc:name="Expression"/>
  539. <choice>
  540. <when expression="#[groovy:payload.getClass().getName() == 'org.mule.transport.NullPayload' or !(payload is NIMCAcceptedPersonBiometrics)]">
  541. <set-payload value="#[message.inboundProperties['biometrics_object']]" doc:name="Set Journal Voucher as new Payload"/>
  542. </when>
  543. <otherwise>
  544. <expression-component doc:name="Update Activiti Process Parameters">
  545. System.out.println("MONGO-DB BIOMETRICS STORE: Payload is Good to go " + message.payload);
  546. </expression-component>
  547. </otherwise>
  548. </choice>
  549. <first-successful>
  550. <mongo:update-objects-by-function-using-map collection="#['NimcAcceptedBiometricsColl']"
  551. config-ref="identitiesStoreMongoDbConfig"
  552. upsert="true"
  553. function="$set"
  554. multi="false" doc:name="Update Biometrics Image Object">
  555. <mongo:query-attributes>
  556. <mongo:query-attribute key="sourceAgency">#[message.inboundProperties['source_agency']]</mongo:query-attribute>
  557. <mongo:query-attribute key="personUniqueAgencyId">#[message.inboundProperties['person_unique_id']]</mongo:query-attribute>
  558. </mongo:query-attributes>
  559. <mongo:element-attributes>
  560. <mongo:element-attribute value-ref="#[payload]"></mongo:element-attribute>
  561. </mongo:element-attributes>
  562. </mongo:update-objects-by-function-using-map>
  563. <flow-ref name="setNullComponent" />
  564. </first-successful>
  565. </processor-chain>
  566. </async>
  567. </flow>
  568.  
  569.  
  570. <sub-flow name="subFlow-processFacialImagesAndSignatures">
  571. <processor-chain>
  572. <expression-transformer expression="#[ faceImageQuality = new Object();
  573. signatureImageQuality = new Object();
  574. if(flow['personBiometricsData']!=null){
  575. faceScanImageObject = flowVars['personBiometricsData'].getFaceScan();
  576. if(faceScanImageObject!=null){
  577. if(faceScanImageObject is ImageDataBean){
  578. faceImgDataBean = (ImageDataBean)faceScanImageObject;
  579. flowVars['faceImageBuff'] = faceImgDataBean.getImageObject();
  580. }
  581. if(ImageUtils.confirmImageQualityOk(flowVars['faceImageBuff'])){
  582. listOfFacialImages = Jnbis.nist().decode(flowVars['faceImageBuff']).getFacialAndSmtImages();
  583. if(listOfFacialImages!=null){
  584. faceImageQuality = BiometricsQualityIndicator.FACE_IMAGE_ACCEPTABLE;
  585. }
  586. }else{
  587. faceImageQuality = BiometricsQualityIndicator.FACE_IMAGE_QUALITY_NOT_GOOD;
  588. }
  589. }else{
  590. faceImageQuality = BiometricsQualityIndicator.FACE_IMAGE_UNAVAILABLE;
  591. }
  592. }
  593.  
  594. flowVars['updatedFingerBiometricMetaData'].setFacialImageState(faceImageQuality);
  595. flowVars['updatedFingerBiometricMetaData'].setProcessed(Boolean.TRUE);
  596. resultsMap = ['image.processor':'FACIAL_IMAGE_PROCESSOR',
  597. 'FACIAL_IMAGE_PROCESSOR' : flowVars['updatedFingerBiometricMetaData']];
  598. resultsMap ]"/>
  599. </processor-chain>
  600. </sub-flow>
  601.  
  602. <sub-flow name="subFlow-processSignatureImageVerification">
  603. <processor-chain>
  604. <expression-transformer expression="#[ signatureImageQuality = new Object();
  605. signatureImageObject = flowVars['personBiometricsData'].getSignature();
  606. if(signatureImageObject!=null){
  607. if(signatureImageObject is ImageDataBean){
  608. signatureImgDataBean = (ImageDataBean)signatureImageObject;
  609. flowVars['signatureImageBuff'] = signatureImgDataBean.getImageObject();
  610. }
  611. if(ImageUtils.confirmImageQualityOk(flowVars['signatureImageBuff']){
  612. List signatures = Jnbis.nist().decode(flowVars['signatureImageBuff']).getSignatures();
  613. if(signatures!=null and !signatures.isEmpty()){
  614. signatureImageQuality = BiometricsQualityIndicator.SIGNATURE_IMAGE_ACCEPTABLE;
  615. }else{
  616. signatureImageQuality = BiometricsQualityIndicator.SIGNATURE_IMAGE_UNAVAILABLE;
  617. }
  618. }else{
  619. signatureImageQuality = BiometricsQualityIndicator.SIGNATURE_IMAGE_QUALITY_NOT_GOOD;
  620. }
  621. }else{
  622. signatureImageQuality = BiometricsQualityIndicator.SIGNATURE_IMAGE_UNAVAILABLE;
  623. }
  624.  
  625. flowVars['updatedFingerBiometricMetaData'].setSignatureImageState(signatureImageQuality);
  626. flowVars['updatedFingerBiometricMetaData'].setProcessed(Boolean.TRUE);
  627. resultsMap = ['image.processor':'SIGNATURE_IMAGE_IMAGE_PROCESSOR',
  628. 'SIGNATURE_IMAGE_IMAGE_PROCESSOR': flowVars['updatedFingerBiometricMetaData']];
  629. resultsMap]"/>
  630. </processor-chain>
  631. </sub-flow>
  632.  
  633.  
  634. <flow name="prepareAndRateDemographicsData" processingStrategy="queued-120-threads-processor">
  635. <esper:listen statement="select * from AgencyBiometricsDataExchObjectEvent.std:unique(agencyPersonUniqueId) as
  636. unClassifiedPersonsDemographics where processed = Boolean.FALSE
  637. AND (processState in (NimcPersonObjectState.SOURCED_FROM_AGENCY, NimcPersonObjectState.RECEIVED_NOT_VETTED))"/>
  638. <processor-chain>
  639. <expression-component doc:name="prepareAndGradeBiometricsPackageQuality-exp-component">
  640. System.out.println("DEMOGRAPHICS VETTING AGENT: Unvetted Demographics Data Received: " + message.payloadAs(java.lang.String));
  641. if(payload['unClassifiedPersonsDemographics']!=null){
  642. unclassifiedPersonDemoData = payload['unClassifiedPersonsDemographics'].getUnderlying();
  643. if(unclassifiedPersonDemoData!=null){
  644. dateOfBirth = unclassifiedPersonDemoData.getDateOfBirth();
  645. dateTime = new org.mule.el.datetime.DateTime(flowVars['dateTimeToConvert'] , 'MM-dd-yyyy');
  646. personBirthDay = dateTime.toDate();
  647. flowVars['dateOfBirth'] = dateOfBirth;
  648. }
  649. }
  650. payload = unclassifiedPersonDemoData;
  651. </expression-component>
  652. <enricher target="#[flowVars['ageOfPersonToDate']]" doc:name="Enrich Space Lease Context">
  653. <processor-chain>
  654. <flow-ref name="subFlow-getAgeOfPersonDate" doc:name="Send Response Back to Agency"/>
  655. </processor-chain>
  656. </enricher>
  657. <expression-transformer expression="#[ otherDetailsMap = payload.getOtherDetails(); if(otherDetailsMap==null){
  658. otherDetailsMap = ['age_of_person_todate': flowVars['ageOfPersonToDate']];
  659. payload.setOtherDetails(otherDetailsMap);
  660. }else {
  661. otherDetailsMap.put('age_of_person_todate', flowVars['ageOfPersonToDate']);
  662. payload.setOtherDetails(otherDetailsMap);
  663. }
  664. payload.setProcessState(NimcPersonObjectState.DEMOGRAPHICS_DATA_UPDATED);
  665. payload ]"/>
  666. <expression-component doc:name="Update Activiti Process Parameters">
  667. System.out.println("DEMOGRAPHICS VETTING AGENT: Demographics Data Updated:" + message.payloadAs(java.lang.String));
  668. System.out.println("DEMOGRAPHICS VETTING AGENT: Sending to Intell Engine: " + message.payloadAs(java.lang.String));
  669. </expression-component>
  670. <esper:send eventPayload-ref="#[payload:]"/>
  671. <expression-component doc:name="Update Activiti Process Parameters">
  672. System.out.println("DEMOGRAPHICS VETTING AGENT: Demographics Data Updated:" + message.payloadAs(java.lang.String));
  673. </expression-component>
  674. </processor-chain>
  675. </flow>
  676.  
  677. <sub-flow name="subFlow-getAgeOfPersonDate">
  678. <processor-chain>
  679. <expression-component doc:name="Convert date in field 5"><![CDATA[
  680. date = new org.mule.el.datetime.DateTime(flowVars['dateOfBirth'], 'dd-MM-yyyy');
  681. flowVars['formattedDateTime'] = date.format('dd-MM-yy').toDate();
  682. if(flowVars['formattedDateTime'] !=null){
  683. flowVars['ageOfPerson'] = AgeCalculator.agetAtLastBirthDay(flowVars['formattedDateTime']);
  684. }
  685. payload = flowVars['ageOfPerson'];
  686. ]]>
  687. System.out.println("DATE TIME CONVERTER: Age of Person = : " + payload);
  688. </expression-component>
  689. </processor-chain>
  690. </sub-flow>
  691.  
  692. <sub-flow name="subFlow-acquireDemoDataAndComputeAgeToAtLastBirthDay">
  693. <processor-chain>
  694. <enricher target="#[flowVars['demographicsDataOfPerson']]" doc:name="Get Demographics Data of Person">
  695. <processor-chain>
  696. <flow-ref name="subFlow-acquireDemographicsDataFromStorageSpace"
  697. doc:name="Send Response Back to Agency"/>
  698. </processor-chain>
  699. </enricher>
  700. <expression-component doc:name="Update Activiti Process Parameters">
  701. System.out.println("DEMOGRAPHICS VETTING AGENT: Demographics Data Acquired from Space:" + flowVars['demographicsDataOfPerson']);
  702. if(flowVars['demographicsDataOfPerson'] is AgencyBiometricsDataExchObject){
  703. if(flowVars['demographicsDataOfPerson']!=null){
  704. flowVars['dateOfBirthString'] = flowVars['demographicsDataOfPerson'].getDateOfBirth();
  705. }
  706. }
  707. if(flowVars['dateOfBirthString']!=null){
  708. System.out.println("DEMOGRAPHICS VETTING AGENT: Birth Date of Person acquired:" + flowVars['dateOfBirthString']);
  709. flowVars['demographicsDataOfPerson'] = null;
  710. }
  711. </expression-component>
  712. <processor-chain>
  713. <set-variable variableName="dateOfBirth" value="#[flowVars['dateOfBirthString']]"
  714. doc:name="The Payload is the TDO Object "/>
  715. <enricher target="#[flowVars['personAgeAtLastBirthDay']]"
  716. doc:name="Enrich Space Lease Context">
  717. <processor-chain>
  718. <flow-ref name="subFlow-getAgeOfPersonDate"
  719. doc:name="Send Response Back to Agency"/>
  720. </processor-chain>
  721. </enricher>
  722. </processor-chain>
  723. </processor-chain>
  724. </sub-flow>
  725.  
  726.  
  727. <sub-flow name="subFlow-updateStatusOfFingerPrintsInBioMetaData">
  728. <processor-chain>
  729. <set-variable variableName="fingerPrintImagesMap"
  730. value="#[flowVars['personBiometricsData'].getFingerPrintScans()]"
  731. doc:name="Set FingerPrint Scan flowVars"/>
  732. <set-variable variableName="numberOfValidatedFingerPrints"
  733. value="#[Integer.valueOf(0)]"
  734. doc:name="Initialize the Number of Finger prints Validdated "/>
  735. <set-variable variableName="numberOfAvailableFingerPrints"
  736. value="#[payload.size()]"
  737. doc:name="Acquire the Number of Available Fingerprints"/>
  738. <set-variable variableName="confirmedFingerPrintsImagesArray"
  739. value="#[new ArrayList()]"
  740. doc:name="Initalize the Array of Confirmed Fingerprints "/>
  741. <set-variable variableName="biometricsImagesMetaData"
  742. value="#[payload]"
  743. doc:name="Pass payload to biometricsImagesMetaData flowVars"/>
  744. <expression-component doc:name="processFlowMeterStatus">
  745. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  746. flowVars['map_of_good_finger_print'] = [:];
  747. </expression-component>
  748. <foreach collection="#[flowVars['fingerPrintImagesMap'].values()]" doc:name="For Each"
  749. counterVariableName="counter"
  750. rootMessageVariableName="rootMessage">
  751. <expression-transformer expression="#[ if(payload is ImageDataBean){
  752. imageDataBeanObj = (ImageDataBean)payload;
  753. imageCode = imageDataBeanObj.getImageCode();
  754. imageObject = imageDataBeanObj.getImageObject();
  755. if(ImageUtils.confirmImageQualityOk(imageObject)){
  756. if(imageObject is byte[]){
  757. imageBuff = (byte[])imageObject;
  758. imageBitMap = Jnbis.wsq().decode(imageBuff).asBitmap();
  759. if(imageBitMap!=null){
  760. if(imageBitMap.getPixels().lenght()>0){
  761. flowVars['numberOfValidatedFingerPrints'].intValue()++;
  762. flowVars['confirmedFingerPrintsImagesArray'].add(imageCode);
  763. flowVars['map_of_good_finger_print'].put(imageCode, imageBuff);
  764. }
  765. }
  766. }
  767. }
  768. } flowVars['confirmedFingerPrintsImagesArray']]"/>
  769. </foreach>
  770. <expression-component doc:name="Update the Biometrics Status">
  771. if(!flowVars['confirmedFingerPrintsImagesArray'].isEmpty()){
  772. if(flowVars['confirmedFingerPrintsImagesArray'].size() >= minNumAcceptableFingers){
  773. flowVars['fingerPrintsQuality'] = BiometricsQualityIndicator.FINGER_PRINTS_ACCEPTABLE;
  774. }else{
  775. if(flowVars['confirmedFingerPrintsImagesArray'].size()&lt;minNumAcceptableFingers){
  776. flowVars['fingerPrintsQuality'] = BiometricsQualityIndicator.FINGER_PRINTS_NOT_ACCEPTABLE;
  777. }
  778. }
  779. }else{
  780. System.out.println("DEMOGRAPHICS VETTING AGENT: There no Qualitative Finger Prints Tested");
  781. flowVars['fingerPrintsQuality'] = BiometricsQualityIndicator.FINGER_PRINTS_NOT_ACCEPTABLE;
  782. }
  783. flowVars['biometricsImagesMetaData'].setFingerPrintsState(flowVars['fingerPrintsQuality']);
  784. intValueOfverifiedFingerPrints = new Integer(flowVars['confirmedFingerPrintsImagesArray'].size());
  785. flowVars['biometricsImagesMetaData'].setNumberOfFingerPrintsVerified(intValueOfverifiedFingerPrints);
  786. if(flowVars['fingerPrintsQuality']== BiometricsQualityIndicator.FINGER_PRINTS_ACCEPTABLE){
  787. acceptedFingerPrintsObject = new NIMCFingerPrintObjects(flowVars['bvnNumber'], Long.valueOf(DateTimeUtils.currentTimeMillis()));
  788. if(flowVars['ageLastBirthDay']!=null || flowVars['ageLastBirthDay']>=0){
  789. acceptedFingerPrintsObject.setAgeLastBirthDay(flowVars['ageLastBirthDay']);
  790. }
  791. flowVars['nimc_finger_print_objects'] = acceptedFingerPrintsObject;
  792. if(!flowVars['map_of_good_finger_print'].isEmpty()){
  793. flowVars['nimc_finger_print_objects'].setFingersPrintsMap(flowVars['map_of_good_finger_print']);
  794. }
  795. flowVars['nimc_finger_print_objects'].setTotalNumberOfGoodPrints(flowVars['confirmedFingerPrintsImagesArray']);
  796. payload = ['image.processor':'FINGER_PRINTS_IMAGE_PROCESSOR',
  797. 'FINGER_PRINTS_IMAGE_PROCESSOR': flowVars['biometricsImagesMetaData'],
  798. 'nimc.finger.prints.bean': flowVars['nimc_finger_print_objects']];
  799. }else{
  800. payload = flowVars['fingerPrintsQuality'];
  801. }
  802. </expression-component>
  803. </processor-chain>
  804. </sub-flow>
  805.  
  806. <flow name="listenAndQualifyPersonBiometricsIdentityDetailsPass">
  807. <esper:listen statement="select * from AgencyBiometricsDataExchObjectEvent
  808. match_recognize ( partition by agencyPersonUniqueId
  809. measures A.id as a_theId, A.processState as a_processState, B.processState as b_processState, B.id as b_theId
  810. C as demoGraphicsUpdatedState
  811. pattern (A+? B+ match_recognize_permute(C+?,D?))
  812. interval 10 seconds
  813. define
  814. A as (A.processState in (com.inspired.national.id.NimcPersonObjectState.SOURCED_FROM_AGENCY,
  815. com.inspired.national.id.NimcPersonObjectState.RECIEVED_AND_VETTED)),
  816. B as B.processState = com.inspired.national.id.NimcPersonObjectState.DEMOGRAPHICS_DATA_UPDATED,
  817. D as (min_age_for_adult > getAgeAtlastBirthDayFromString(C.dateOfBirth)),
  818. C as (TelephoneNumberUtils.validatePhoneNumbers(C.cellPhoneNumbers[0]) = false))" />
  819. <async>
  820. <processor-chain>
  821. <expression-component doc:name="processFlowMeterStatus">
  822. System.out.println("NOT ELEGIBILE IDENTITIES AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  823. </expression-component>
  824. </processor-chain>
  825. </async>
  826. </flow>
  827.  
  828.  
  829.  
  830. <flow name="listenAndQualifyDemographicsOfPersonToBeRegisteredAdultPass">
  831. <esper:listen statement="select * from AgencyBiometricsDataExchObjectEvent
  832. match_recognize ( partition by agencyPersonUniqueId
  833. measures A.id as a_theId, A.processState as a_processState, B.processState as b_processState, B.id as b_theId
  834. C as demoGraphicsUpdatedState
  835. pattern (A+? B+ C+)
  836. interval 10 seconds
  837. define
  838. A as A.agencyPersonUniqueId=B.agencyPersonUniqueId and A.agencyPersonUniqueId=C.agencyPersonUniqueId and A.agencyPersonUniqueId=D.agencyPersonUniqueId
  839. and A.processState in (com.inspired.national.id.NimcPersonObjectState.SOURCED_FROM_AGENCY,
  840. com.inspired.national.id.NimcPersonObjectState.RECIEVED_AND_VETTED),
  841. B as B.processState = com.inspired.national.id.NimcPersonObjectState.DEMOGRAPHICS_DATA_UPDATED,
  842. C as (TelephoneNumberUtils.validatePhoneNumbers(C.cellPhoneNumbers[0]) = true
  843. and getAgeAtlastBirthDayFromString(C.dateOfBirth)>=min_age_for_adult))"/>
  844. <async>
  845. <processor-chain>
  846. <expression-component doc:name="processFlowMeterStatus">
  847. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  848. if(payload['demoGraphicsUpdatedState']!=null){
  849. flowVars['personUpdatedDemographics'] = payload['demoGraphicsUpdatedState'];
  850. }
  851. if(payload['personUpdatedDemographics']!=null){
  852. flowVars['personUpdatedDemographics'].setProcessState(NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED);
  853. }
  854. payload = flowVars['personUpdatedDemographics'];
  855. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Object Updated with 'DEMOGRAPHICS_DATA_PASSED'");
  856. System.out.println("ELEGIBILITY MATCHING AGENT: Sending Updated Object to Intell Engine");
  857. </expression-component>
  858. <esper:send eventPayload-ref="#[payload:]"/>
  859. </processor-chain>
  860. </async>
  861. </flow>
  862.  
  863. <flow name="listenAndQualifyDemographicsOfPersonToBeRegisteredAdultFail">
  864. <esper:listen statement="select * from AgencyBiometricsDataExchObjectEvent
  865. match_recognize ( partition by agencyPersonUniqueId
  866. measures A.id as a_theId, A.processState as a_processState, B.processState as b_processState, B.id as b_theId
  867. C as demoGraphicsUpdatedState
  868. pattern (A+? B+? match_recognize_permute(C+?,D?))
  869. interval 10 seconds
  870. define
  871. A as (A.processState in (com.inspired.national.id.NimcPersonObjectState.SOURCED_FROM_AGENCY,
  872. com.inspired.national.id.NimcPersonObjectState.RECIEVED_AND_VETTED)),
  873. B as B.processState = com.inspired.national.id.NimcPersonObjectState.DEMOGRAPHICS_DATA_UPDATED,
  874. C as (TelephoneNumberUtils.validatePhoneNumbers(C.cellPhoneNumbers[0]) = false),
  875. D as (min_age_for_adult > getAgeAtlastBirthDayFromString(C.dateOfBirth)))"/>
  876. <async>
  877. <processor-chain>
  878. <expression-component doc:name="processFlowMeterStatus">
  879. System.out.println("ELEGIBILITY MATCHING AGENT; Identity Matched Results:" + message.payloadAs(java.lang.String));
  880. if(payload['demoGraphicsUpdatedState']!=null){
  881. flowVars['personUpdatedDemographics'] = payload['demoGraphicsUpdatedState'];
  882. }
  883. if(payload['personUpdatedDemographics']!=null){
  884. flowVars['personUpdatedDemographics'].setProcessState(NimcPersonObjectState.DEMOGRAPHICS_DATA_INCOMPLETE);
  885. }
  886. payload = flowVars['personUpdatedDemographics'];
  887. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Object Updated with 'DEMOGRAPHICS_DATA_INCOMPLETE'");
  888. System.out.println("ELEGIBILITY MATCHING AGENT: Sending Updated Object to Intell Engine");
  889. </expression-component>
  890. <esper:send eventPayload-ref="#[payload:]"/>
  891. </processor-chain>
  892. </async>
  893. </flow>
  894.  
  895. <flow name="listenForAccptedMaleNIMCNotRegisteredPersons">
  896. <esper:listen statement="select * from PersonBiometricsMetaDataEvent(facialImageState = BiometricsQualityIndicator.FACE_IMAGE_ACCEPTABLE,
  897. signatureImageState=BiometricsQualityIndicator.SIGNATURE_IMAGE_ACCEPTABLE,
  898. numberOfFingerPrintsVerified>=aceptable_number_of_fingers,
  899. fingerPrintsState in(BiometricsQualityIndicator.FINGER_PRINTS_ACCEPTABLE,
  900. BiometricsQualityIndicator.FINGER_PRINTS_IMAGE_QUALITY_OK)).std:unique(transactionId) as acceptMaleBiometricMetaObj,
  901. AgencyBiometricsDataExchObjectEvent(sex='male', processState = NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED).std:unique(id) as acceptedMaleDemoGraphicsData
  902. where acceptMaleBiometricMetaObj.agencyUniqueNumber = acceptedMaleDemoGraphicsData.agencyPersonUniqueId
  903. having getAgeAtlastBirthDayFromString(acceptedMaleDemoGraphicsData.dateOfBirth)>=min_age_for_adult" />
  904. <async>
  905. <processor-chain>
  906. <expression-component doc:name="processFlowMeterStatus">
  907. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  908. if(payload['acceptMaleBiometricMetaObj']!=null){
  909. flowVars['biometricsMetaDataObject']=payload['acceptMaleBiometricMetaObj'].getUnderlying();
  910. }
  911. if(payload['acceptedMaleDemoGraphicsData']!=null){
  912. flowVars['personDemogData'] = payload['acceptedMaleDemoGraphicsData'].getUnderlying();
  913. }
  914. </expression-component>
  915. <flow-ref name="processAcceptedMatchedEventsFromIntellEngine"
  916. doc:name="Send Response Back to Agency"/>
  917. </processor-chain>
  918. </async>
  919. </flow>
  920.  
  921. <flow name="listenForFemaleAcceptedNIMCNotRegisteredPersons">
  922. <esper:listen statement="select * from pattern @SuppressOverlappingMatches [ every-distinct(acceptedFemaleDemoGraphicsData.id, 10 sec)
  923. personUnqBio = PersonBiometricsMetaDataEvent(facialImageState = BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED,
  924. signatureImageState=BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED,
  925. fingerPrintsState = BiometricsQualityIndicator.BIO_PACKAGE_UNQUALIFIED)
  926. -> (acceptedFemaleBiometricMetaObj = PersonBiometricsMetaDataEvent(agencyUniqueNumber = personUnqBio.agencyUniqueNumber,
  927. facialImageState = BiometricsQualityIndicator.FACE_IMAGE_ACCEPTABLE,
  928. signatureImageState=BiometricsQualityIndicator.SIGNATURE_IMAGE_ACCEPTABLE,
  929. numberOfFingerPrintsVerified>=aceptable_number_of_fingers,
  930. fingerPrintsState in (BiometricsQualityIndicator.FINGER_PRINTS_ACCEPTABLE,
  931. BiometricsQualityIndicator.FINGER_PRINTS_IMAGE_QUALITY_OK)) and
  932. acceptedFemaleDemoGraphicsData = AgencyBiometricsDataExchObjectEvent(sex='female',
  933. processState=NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED))]
  934. where acceptedFemaleBiometricMetaObj.agencyUniqueNumber = acceptedFemaleDemoGraphicsData.agencyPersonUniqueId
  935. having getAgeAtlastBirthDayFromString(acceptedFemaleDemoGraphicsData.dateOfBirth)>=min_age_for_adult
  936. or acceptedFemaleBiometricMetaObj.getAgeOfPersonAtLastBirthDay()>=min_age_for_adult"/>
  937. <async>
  938. <processor-chain>
  939. <expression-component doc:name="processFlowMeterStatus">
  940. System.out.println("ACCEPTED FEMALE IDENTITIES AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  941. if(payload['acceptedPersonsBiometricMetaObj']!=null){
  942. flowVars['biometricsMetaDataObject']=payload['acceptedPersonsBiometricMetaObj'].getUnderlying();
  943. }
  944. if(payload['acceptedFemaleDemoGraphicsData']!=null){
  945. flowVars['personDemogData'] = payload['acceptedFemaleDemoGraphicsData'].getUnderlying();
  946. }
  947. if(flowVars['personDemogData']!=null){
  948. flowVars['acceptedfemPersonUniqueId'] = flowVars['personDemogData'].getAgencyPersonUniqueId();
  949. flowVars['acceptedPersonDemographicsState'] = flowVars['personDemogData'].getProcessState();
  950. flowVars['sourceAgency'] = flowVars['personDemogData'].getFromPartyId();
  951. }
  952. if(flowVars['biometricsMetaDataObject']!=null){
  953. System.out.println("ACCEPTED FEMALE IDENTITIES AGENT: Biometrics Metata Data Available: " + flowVars['biometricsMetaDataObject']);
  954. }
  955. if(flowVars['acceptedfemPersonUniqueId']!=null){
  956. System.out.println("ACCEPTED FEMALE IDENTITIES AGENT: Person's Unique Id available: " + flowVars['acceptedfemPersonUniqueId']);
  957. }
  958. </expression-component>
  959. <enricher target="#[flowVars['acceptedAdultDemographicsDataMap']]"
  960. doc:name="Enrich Space Lease Context">
  961. <flow-ref name="subFlow-convertAgencyIdObjectToDemographicsDataMap"
  962. doc:name="Send Response Back to Agency"/>
  963. </enricher>
  964. <expression-transformer expression="#[ acceptedPersonsIdentityObj = new NIMCAcceptedIdentityObject(message.id, flowVars['acceptedfemPersonUniqueId'],
  965. BiometricsQualityIndicator.BIO_PACKAGE_ACCEPTABLE, flowVars['personDemogData'],
  966. flowVars['acceptedPersonDemographicsState'], flowVars['acceptedAdultDemographicsDataMap']);
  967. acceptedPersonsIdentityObj.setTimeStamp(Long.valueOf(DateTimeUtils.currentTimeMillis()));
  968. acceptedPersonsIdentityObj.setProcessed(Boolean.FALSE);
  969. acceptedPersonsIdentityObj.setSex(flowVars['personDemogData'].getSex());
  970. acceptedPersonsIdentityObj.setFromPartyId(flowVars['sourceAgency']);
  971. acceptedPersonsIdentityObj]"/>
  972. <esper:send eventPayload-ref="#[payload:]"/>
  973. </processor-chain>
  974. </async>
  975. </flow>
  976.  
  977. <sub-flow name="subFlow-convertAgencyIdObjectToDemographicsDataMap">
  978. <processor-chain>
  979. <and-filter>
  980. <payload-type-filter expectedType="com.inspired.national.id.AgencyBiometricsDataExchObject"/>
  981. <expression-filter expression="#[groovy:payload.getClass().getName() != 'org.mule.transport.NullPayload']" doc:name="Expression"/>
  982. </and-filter>
  983. <json:object-to-json-transformer name="biometricsToJsonConverter"
  984. sourceClass="com.inspired.national.id.AgencyBiometricsDataExchObject"/>
  985. <json:json-to-object-transformer name="jsonToArrayListOfIdentityObjects"
  986. returnClass="java.util.HashMap"/>
  987. </processor-chain>
  988. </sub-flow>
  989.  
  990. <flow name="acquire-biometrics-object-from-mongo-db">
  991. <enricher target="#[flowVars['person_biometrics_package']]" >
  992. <first-successful>
  993. <processor-chain>
  994. <mongo:find-one-object-using-query-map collection="#['NimcAcceptedBiometricsColl']"
  995. config-ref="identitiesStoreMongoDbConfig">
  996. <mongo:query-attributes>
  997. <mongo:query-attribute key="sourceAgency">#[flowVars['source_agency']]</mongo:query-attribute>
  998. <mongo:query-attribute key="personUniqueAgencyId">#[flowVars['personsUniqueId']]</mongo:query-attribute>
  999. </mongo:query-attributes>
  1000. </mongo:find-one-object-using-query-map>
  1001. <json:json-to-object-transformer doc:name="JSON to Object"
  1002. returnClass="com.inspired.national.id.exchange.NIMCAcceptedPersonBiometrics"/>
  1003. </processor-chain>
  1004. </first-successful>
  1005. </enricher>
  1006. </flow>
  1007.  
  1008. <flow name="listenForNIMCAcceptedIdentitiesAndSendAndRender">
  1009. <esper:listen statement="select * from pattern @SuppressOverlappingMatches [ every-distinct(acceptedFemaleIdentityObj.transactionId, acceptedFemaleIdentityObj.agencyPersonUniqueId, 10 sec)
  1010. acceptedDemoGraphicsData = AgencyBiometricsDataExchObjectEvent(processState=NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED)
  1011. -> nimcAcceptedPersonIdentityObj = NIMCAcceptedIdentityObjectEvent( agencyPersonUniqueId = acceptedDemoGraphicsData.agencyPersonUniqueId,
  1012. genBiometricsStateIndicator=DEMOGRAPHICS_DATA_UNACCEPTABLE,
  1013. genBiometricsStateIndicator=BiometricsQualityIndicator.BIO_PACKAGE_ACCEPTABLE ) where timer:within(10 seconds)]
  1014. where nimcAcceptedPersonIdentityObj.processed = Boolean.FALSE"/>
  1015. <processor-chain>
  1016. <expression-component doc:name="processFlowMeterStatus">
  1017. System.out.println("NIMC ACCEPTED PERSON RECEIVING AGENT: Identity of Accepted person available: " + message.payloadAs(java.lang.String));
  1018. if(payload['acceptedDemoGraphicsData']!=null){
  1019. flowVars['nimcAceptedPeronsDemogData'] = payload['acceptedDemoGraphicsData'].getUnderlying();
  1020. }
  1021. if(payload['nimcAcceptedPersonIdentityObj']!=null){
  1022. flowVars['nimcAcceptedPersonIdentityData'] = payload['nimcAcceptedPersonIdentityObj'].getUnderlying();
  1023. }
  1024. if(flowVars['nimcAcceptedPersonIdentityData']!=null){
  1025. flowVars['personsUniqueId'] = flowVars['nimcAcceptedPersonIdentityData'].getAgencyPersonUniqueId();
  1026. flowVars['source_agency'] = flowVars['nimcAcceptedPersonIdentityData'].getFromPartyId();
  1027. }
  1028. message.outboundProperties['person_bvn_number'] = flowVars['personsUniqueId'];
  1029. message.outboundProperties['source_agency'] = flowVars['source_agency'];
  1030. </expression-component>
  1031. <enricher target="#[flowVars['fullAcceptedBiometricsData']]" doc:name="Enrich Space Lease Context">
  1032. <processor-chain>
  1033. <flow-ref name="subFlow-acquireBiometricsObjectsFromStorageSpace"
  1034. doc:name="Send Response Back to Agency"/>
  1035. </processor-chain>
  1036. </enricher>
  1037. <expression-transformer expression="#[ acceptedPersonsIdentityDetails = (NIMCAcceptedIdentityObject)flowVars['nimcAcceptedPersonIdentityData'];
  1038. if(flowVars['fullAcceptedBiometricsData']!=null){
  1039. acceptedPersonsIdentityDetails.setBioMetricsDetails(flowVars['fullAcceptedBiometricsData']);
  1040. personAgencyIdentityObj = acceptedPersonsIdentityDetails.getPersonIdentityDataObject();
  1041. if(personAgencyIdentityObj!=null){
  1042. personAgencyIdentityObj.setPersonBiometricDetails(flowVars['fullAcceptedBiometricsData']);
  1043. acceptedPersonsIdentityDetails.setPersonIdentityDataObject(personAgencyIdentityObj);
  1044. }
  1045. }
  1046. if(acceptedPersonsIdentityDetails.getPersonIdentityDataObject()==null){
  1047. if(flowVars['nimcAceptedPeronsDemogData']!=null){
  1048. acceptedPersonsIdentityDetails.setPersonIdentityDataObject(flowVars['nimcAceptedPeronsDemogData']);
  1049. }
  1050. }
  1051. acceptedPersonsIdentityDetails ]"/>
  1052. <set-property propertyName="person_bvn" value="#[flowVars['personsUniqueId']]" doc:name="Set Property"/>
  1053. <set-property propertyName="person_bvn_number" value="#[flowVars['personsUniqueId']]" doc:name="Set Property"/>
  1054. <jms:outbound-endpoint queue="process-aggregated-dentity-objct-from-intell-engine"
  1055. connector-ref="jmsConnector-next">
  1056. <message-properties-transformer doc:name="Message Properties"
  1057. scope="invocation">
  1058. <add-message-property key="priority" value="7"/>
  1059. <add-message-property key="person_bvn" value="flowVars['personsUniqueId']"/>
  1060. <add-message-property key="person_bvn_number" value="flowVars['personsUniqueId']"/>
  1061. </message-properties-transformer>
  1062. <jms:transaction action="ALWAYS_BEGIN" />
  1063. </jms:outbound-endpoint>
  1064. </processor-chain>
  1065. </flow>
  1066.  
  1067. <flow name="listenForNotEligibleNIMCNotRegisteredPersonsWithNotGoodBio">
  1068. <esper:listen statement="select * from pattern @SuppressOverlappingMatches [ every-distinct(notAcceptBioPersonsDemoGraphicsData.id, 10 sec)
  1069. notAcceptBioPersonsDemoGraphicsData = AgencyBiometricsDataExchObjectEvent(
  1070. processState in (NimcPersonObjectState.DEMOGRAPHICS_DATA_UPDATED, NimcPersonObjectState.RECIEVED_AND_VETTED))
  1071. -> AgencyBiometricsDataExchObjectEvent(processState NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED)
  1072. and notAcceptBioPersonsBiometricMetaObj = PersonBiometricsMetaDataEvent( agencyUniqueNumber=notAcceptBioPersonsDemoGraphicsData.agencyPersonUniqueId,
  1073. facialImageState != BiometricsQualityIndicator.FACE_IMAGE_ACCEPTABLE OR
  1074. signatureImageState != BiometricsQualityIndicator.SIGNATURE_IMAGE_ACCEPTABLE or
  1075. (aceptable_number_of_fingers > numberOfFingerPrintsVerified)
  1076. or not PersonBiometricsMetaDataEvent(agencyUniqueNumber=notAcceptBioPersonsDemoGraphicsData.agencyPersonUniqueId,
  1077. fingerPrintsState in(BiometricsQualityIndicator.FINGER_PRINTS_ACCEPTABLE,
  1078. BiometricsQualityIndicator.FINGER_PRINTS_IMAGE_QUALITY_OK))) @consume where timer:within(60 sec)]
  1079. where notAcceptBioPersonsBiometricMetaObj.agencyUniqueNumber = notAcceptBioPersonsDemoGraphicsData.agencyPersonUniqueId
  1080. having getAgeAtlastBirthDayFromString(notAcceptBioPersonsDemoGraphicsData.dateOfBirth)>=min_age_for_adult
  1081. or notAcceptBioPersonsBiometricMetaObj.getAgeOfPersonAtLastBirthDay()>=min_age_for_adult"/>
  1082. <async processingStrategy="queued-120-threads-processor">
  1083. <processor-chain>
  1084. <expression-component doc:name="processFlowMeterStatus">
  1085. System.out.println("NOT ELEGIBILE IDENTITIES AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  1086. if(payload['notAcceptBioPersonsDemoGraphicsData']!=null){
  1087. flowVars['notAcceptedBioDemoData'] = payload['notAcceptBioPersonsDemoGraphicsData'].getUnderlying();
  1088. }
  1089. payload = flowVars['notAcceptedBioDemoData'];
  1090. </expression-component>
  1091. <flow-ref name="processUnacceptedDataEventsFromIntellEngine"
  1092. doc:name="Send Response Back to Agency"/>
  1093. </processor-chain>
  1094. </async>
  1095. </flow>
  1096.  
  1097. <flow name="listenForNotEligibleAdultNIMCNotRegisteredPersonsWithNotGoodDemographics">
  1098. <esper:listen statement="select * from pattern @SuppressOverlappingMatches [every-distinct(notAcceptPersonsDemoGraphicsData.id, 10 sec)
  1099. notAcceptPersonsDemoGraphicsData = AgencyBiometricsDataExchObjectEvent(processState != NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED or
  1100. processState = NimcPersonObjectState.DEMOGRAPHICS_DATA_UNACCEPTABLE)
  1101. and notAcceptedPersonsBiometricMetaObj = PersonBiometricsMetaDataEvent(processState != NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED or
  1102. processState = NimcPersonObjectState.DEMOGRAPHICS_DATA_UNACCEPTABLE)]
  1103. where notAcceptedPersonsBiometricMetaObj.agencyUniqueNumber = notAcceptPersonsDemoGraphicsData.agencyPersonUniqueId
  1104. having getAgeAtlastBirthDayFromString(notAcceptPersonsDemoGraphicsData.dateOfBirth)>=min_age_for_adult"/>
  1105. <async processingStrategy="queued-120-threads-processor">
  1106. <processor-chain>
  1107. <expression-component doc:name="processFlowMeterStatus">
  1108. System.out.println("ELEGIBILITY MATCHING AGENT: Identity Matched Results:" + message.payloadAs(java.lang.String));
  1109. if(payload['notAcceptPersonsDemoGraphicsData']!=null){
  1110. flowVars['notAcceptedIdDemodata'] = payload['notAcceptPersonsDemoGraphicsData'].getUnderlying();
  1111. }
  1112. if(flowVars['notAcceptedIdDemodata']!=null){
  1113. System.out.println("REJECTED IDENTITIES AGENT: Identity: " + message.payloadAs(java.lang.String));
  1114. }
  1115. payload = flowVars['notAcceptedIdDemodata'];
  1116. </expression-component>
  1117. <flow-ref name="processUnacceptedDataEventsFromIntellEngine" doc:name="Send Response Back to Agency"/>
  1118. </processor-chain>
  1119. </async>
  1120. </flow>
  1121.  
  1122. <flow name="listenForNonAdultNIMCRegisteredPersonsUsingPatterns">
  1123. <description>
  1124. This Agent listens for a Non Adult Elligible For Registration
  1125. </description>
  1126. <esper:listen statement="select * from PersonBiometricsMetaDataEvent(facialImageState!=null, facialImageState = BiometricsQualityIndicator.FACE_IMAGE_ACCEPTABLE).
  1127. std:unique(transactionId) as infantPersonsBiometricMetaObj,
  1128. AgencyBiometricsDataExchObjectEvent(processState=NimcPersonObjectState.DEMOGRAPHICS_DATA_PASSED).std:unique(id) as infantPersonsDemoGraphicsData
  1129. where infantPersonsBiometricMetaObj.agencyUniqueNumber = infantPersonsDemoGraphicsData.agencyPersonUniqueId
  1130. having min_age_for_adult > getAgeAtlastBirthDayFromString(infantPersonsDemoGraphicsData.dateOfBirth)"/>
  1131.  
  1132. <async processingStrategy="queued-120-threads-processor">
  1133. <processor-chain>
  1134. <expression-component doc:name="Update Activiti Process Parameters">
  1135. System.out.println("ACCEPTED INFANT INTELL AGENT: Data Acquired from iNTELL Intel Engine:" + message.payloadAs(java.lang.String));
  1136. flowVars['payloadReceived'] = payload;
  1137. if(payload['infantPersonsDemoGraphicsData']!=null){
  1138. flowVars['acceptedInfantDemoData'] = payload['infantPersonsDemoGraphicsData'].getUnderlying();
  1139. }
  1140. if(payload['infantPersonsBiometricMetaObj']!=null){
  1141. flowVars['acceptedInfantBioMetaData'] = payload['infantPersonsBiometricMetaObj'];
  1142. }
  1143. if(flowVars['acceptedInfantBioMetaData']!=null){
  1144. flowVars['bioSpaceStorageId'] = flowVars['acceptedInfantBioMetaData'].getStorageId();
  1145. System.out.println("DATA AGGREGATOR AGENTS: Space Storage Id: " + flowVars['bioSpaceStorageId']);
  1146. flowVars['bvnNumber'] = flowVars['acceptedInfantBioMetaData'].getAgencyUniqueNumber();
  1147. System.out.println("DATA AGGREGATOR AGENTS: The Matching Data acquired for person with BVN Number: " + flowVars['bvnNumber']);
  1148. }else{
  1149. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Meta Data unavailable");
  1150. }
  1151. if(flowVars['acceptedInfantDemoData']!=null){
  1152. flowVars['acceptedInfantDemoDataUniqueId'] = flowVars['acceptedInfantDemoData'].getAgencyPersonUniqueId();
  1153. }else{
  1154. System.out.println("DATA AGGREGATOR AGENTS: Demographics data not acquired");
  1155. }
  1156. if(flowVars['bvnNumber']==null){
  1157. if(flowVars['acceptedInfantDemoDataUniqueId']!=null){
  1158. flowVars['bvnNumber'] = flowVars['acceptedInfantDemoDataUniqueId'];
  1159. }
  1160. payload = flowVars['acceptedInfantDemoData'];
  1161. System.out.println("DATA AGGREGATOR AGENTS: Persons DemoGraphics Data: " + message.payloadAs(java.lang.String));
  1162. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Meta Data: " + flowVars['acceptedInfantBioMetaData']);
  1163. System.out.println("DATA AGGREGATOR AGENTS: Person's BVN Number: " + flowVars['bvnNumber']);
  1164. </expression-component>
  1165. <!-- <set-variable variableName="nimcBiometricsStorageGSpace"
  1166. value="#[(GigaSpace)app.registry['nimcCentralStorageGSpace']]"
  1167. doc:name="The Payload is the TDO Object "/>-->
  1168. <enricher target="#[flowVars['acceptedInfantBiometricsData']]"
  1169. doc:name="Enrich Space Lease Context">
  1170. <flow-ref name="subFlow-acquireBiometricsObjectsFromStorageSpace"
  1171. doc:name="Send Response Back to Agency"/>
  1172. </enricher>
  1173. <expression-component doc:name="processFlowMeterStatus">
  1174. if(flowVars['acceptedInfantBiometricsData']!=null){
  1175. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Returned from Space for Person With ID: " + flowVars['personBiometricsData'].getId() + "Acquired");
  1176. flowVars['acceptInfPersonDemogData'].setPersonBiometricDetails(flowVars['acceptedInfantBiometricsData']);
  1177. flowVars['updateInfantIdentityObject'] = flowVars['acceptInfPersonDemogData'];
  1178. payload = flowVars['updateInfantIdentityObject'];
  1179. }else{
  1180. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Returned from Space for Person is Null: ");
  1181. }
  1182. if(payload!=null){
  1183. System.out.println("DATA AGGREGATOR AGENTS: Payload of Person is : " + payload);
  1184. }else{
  1185. System.out.println("DATA AGGREGATOR AGENTS: Demographics Payload is Null: ");
  1186. }
  1187. if(flowVars['acceptInfPersonDemogData']!=null){
  1188. System.out.println("DATA AGGREGATOR AGENTS: Demographics Data for Person is : " + flowVars['acceptInfPersonDemogData']);
  1189. }else{
  1190. System.out.println("DATA AGGREGATOR AGENTS: Demographics Data Object is Null: ");
  1191. }
  1192.  
  1193. </expression-component>
  1194. <expression-component doc:name="processFlowMeterStatus">
  1195. System.out.println("DATA AGGREGATOR AGENTS: Biometrics for : " + flowVars['bvnNumber'] + "Acquired");
  1196. </expression-component>
  1197. <set-property propertyName="priority" value="#[7]" />
  1198. <set-property propertyName="person_bvn" value="#[flowVars['bvnNumber']]" />
  1199. <jms:outbound-endpoint queue="process-aggregated-dentity-objct-from-intell-engine"
  1200. connector-ref="jmsConnector-next">
  1201. <jms:transaction action="ALWAYS_BEGIN" />
  1202. </jms:outbound-endpoint>
  1203. </processor-chain>
  1204. </async>
  1205. </flow>
  1206.  
  1207. <!-- <sub-flow name="computeAgePfpersonAtLastBirthDayFromDateString">
  1208. <processor-chain>
  1209. </processor-chain>
  1210. </sub-flow>-->
  1211.  
  1212. <sub-flow name="processAcceptedMatchedEventsFromIntellEngine">
  1213. <async>
  1214. <processor-chain>
  1215. <expression-component doc:name="processFlowMeterStatus">
  1216. System.out.println("DATA AGGREGATOR AGENTS: Message Matched OK: " + message.payloadAs(java.lang.String));
  1217. if(flowVars['biometricsMetaDataObject']==null){
  1218. flowVars['biometricsMetaDataObject'] = payload['personsBiometricMetaObj'].getUnderlying();
  1219. }
  1220. if(flowVars['biometricsMetaDataObject']!=null){
  1221. flowVars['bioSpaceStorageId'] = flowVars['biometricsMetaDataObject'].getStorageId();
  1222. System.out.println("DATA AGGREGATOR AGENTS: Space Storage Id: " + flowVars['bioSpaceStorageId']);
  1223. flowVars['bvnNumber'] = flowVars['biometricsMetaDataObject'].getAgencyUniqueNumber();
  1224. System.out.println("DATA AGGREGATOR AGENTS: The Matching Data acquired for person with BVN Number: " + flowVars['bvnNumber']);
  1225. }else{
  1226. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Meta Data unavailable");
  1227. }
  1228. if(flowVars['personDemogData']==null){
  1229. flowVars['personDemogData'] = payload['personsDemoGraphicsData'].getUnderlying();
  1230. }
  1231. if(flowVars['personDemogData']!=null){
  1232. flowVars['personDemoDataUniqueId'] = flowVars['personDemogData'].getAgencyPersonUniqueId();
  1233. }else{
  1234. System.out.println("DATA AGGREGATOR AGENTS: Demographics data not acquired");
  1235. }
  1236. if(flowVars['bvnNumber']==null){
  1237. if(flowVars['personDemoDataUniqueId']!=null){
  1238. flowVars['bvnNumber'] = flowVars['personDemoDataUniqueId'];
  1239. }
  1240. }
  1241. payload = flowVars['personDemogData'];
  1242. System.out.println("DATA AGGREGATOR AGENTS: Persons DemoGraphics Data: " + message.payloadAs(java.lang.String));
  1243. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Meta Data: " + flowVars['biometricsMetaDataObject']);
  1244. System.out.println("DATA AGGREGATOR AGENTS: Bioemtrics Storage Id: " + flowVars['bioSpaceStorageId']);
  1245. System.out.println("DATA AGGREGATOR AGENTS: Person's BVN Number: " + flowVars['bvnNumber']);
  1246. </expression-component>
  1247. <set-variable variableName="nimcBiometricsStorageGSpace"
  1248. value="#[(GigaSpace)app.registry['nimcCentralStorageGSpace']]"
  1249. doc:name="The Payload is the TDO Object "/>
  1250. <enricher target="#[flowVars['personBiometricsData']]"
  1251. doc:name="Enrich Space Lease Context">
  1252. <flow-ref name="subFlow-acquireBiometricsObjectsFromStorageSpace"
  1253. doc:name="Send Response Back to Agency"/>
  1254. </enricher>
  1255. <expression-component doc:name="processFlowMeterStatus">
  1256. if(flowVars['personBiometricsData']!=null){
  1257. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Returned from Space for Person With ID: " + flowVars['personBiometricsData'].getId() + "Acquired");
  1258. flowVars['personDemogData'].setPersonBiometricDetails(flowVars['personBiometricsData']);
  1259. flowVars['updatePersonIdentityObject'] = flowVars['personDemogData'];
  1260. payload = flowVars['updatePersonIdentityObject'];
  1261. }else{
  1262. System.out.println("DATA AGGREGATOR AGENTS: Biometrics Returned from Space for Person is Null: ");
  1263. }
  1264. if(payload!=null){
  1265. System.out.println("DATA AGGREGATOR AGENTS: Payload of Person is : " + payload);
  1266. }else{
  1267. System.out.println("DATA AGGREGATOR AGENTS: Demographics Payload is Null: ");
  1268. }
  1269. if(flowVars['personDemogData']!=null){
  1270. System.out.println("DATA AGGREGATOR AGENTS: Demographics Data for Person is : " + flowVars['personDemogData']);
  1271. }else{
  1272. System.out.println("DATA AGGREGATOR AGENTS: Demographics Data Object is Null: ");
  1273. }
  1274. </expression-component>
  1275. <!--</processor-chain>-->
  1276. <expression-component doc:name="processFlowMeterStatus">
  1277. System.out.println("DATA AGGREGATOR AGENTS: Biometrics for : " + flowVars['bvnNumber'] + "Acquired");
  1278. </expression-component>
  1279. <set-property propertyName="priority" value="#[7]" doc:name="Set Property"/>
  1280. <set-property propertyName="person_bvn" value="#[flowVars['bvnNumber']]" doc:name="Set Property"/>
  1281. <jms:outbound-endpoint queue="process-aggregated-dentity-objct-from-intell-engine"
  1282. connector-ref="jmsConnector-next">
  1283. <jms:transaction action="ALWAYS_BEGIN" />
  1284. </jms:outbound-endpoint>
  1285. </processor-chain>
  1286. </async>
  1287. </sub-flow>
  1288.  
  1289. <sub-flow name="subFlow-acquireDemographicsDataFromStorageSpace">
  1290. <processor-chain>
  1291. <expression-component doc:name="processFlowMeterStatus">
  1292. System.out.println("DATA AGGREGATOR AGENTS: Biometrics for : " + flowVars['bvnNumber'] + "Acquired");
  1293. template = new AgencyBiometricsDataExchObject();
  1294. template.setId(flowVars['bvnNumber']);
  1295. flowVars['demographicsSpaceTemplate'] = template;
  1296. </expression-component>
  1297. <first-successful>
  1298. <invoke object-ref="nimcCentralStorageGSpace"
  1299. method="takeIfExistsById"
  1300. methodArguments="#[com.inspired.national.id.AgencyBiometricsDataExchObject.class, flowVars['bvnNumber']]"
  1301. methodArgumentTypes="java.lang.Class, java.lang.Object"
  1302. name="takeIfExistsBysId" doc:name="Invoke"/>
  1303. <invoke object-ref="nimcCentralStorageGSpace"
  1304. method="take"
  1305. methodArguments="#[flowVars['demographicsSpaceTemplate']]"
  1306. methodArgumentTypes="java.lang.Object"
  1307. name="take" doc:name="Invoke"/>
  1308. </first-successful>
  1309. <expression-component doc:name="processFlowMeterStatus">
  1310. if(payload!=null){
  1311. System.out.println("SPACE WORKER AGENTS: Demograpgics Object Acquired for person: " + flowVars['bvnNumber']);
  1312. System.out.println("SPACE WORKER AGENTS: Object Type Acquired from Space: " + payload.getClass().getName());
  1313. }else{
  1314. System.out.println("SPACE WORKER AGENTS: No Demographics Object returned From Space");
  1315. }
  1316. </expression-component>
  1317. </processor-chain>
  1318. </sub-flow>
  1319.  
  1320. <sub-flow name="subFlow-acquireBiometricsObjectsFromStorageSpace">
  1321. <processor-chain>
  1322. <expression-component doc:name="processFlowMeterStatus">
  1323. System.out.println("DATA AGGREGATOR AGENTS: Biometrics for : " + flowVars['personsUniqueId'] + "Acquired");
  1324. template = new PersonBiometricDetails();
  1325. template.setId(flowVars['personsUniqueId']);
  1326. flowVars['biometricsSpaceTemplate'] = template;
  1327. </expression-component>
  1328. <first-successful>
  1329. <invoke object-ref="nimcCentralStorageGSpace"
  1330. method="takeIfExistsById"
  1331. methodArguments="#[com.inspired.national.id.PersonBiometricDetails.class, flowVars['personsUniqueId']]"
  1332. methodArgumentTypes="java.lang.Class, java.lang.Object"
  1333. name="takeIfExistsBysId" doc:name="Invoke"/>
  1334. <invoke object-ref="nimcCentralStorageGSpace"
  1335. method="take"
  1336. methodArguments="#[flowVars['biometricsSpaceTemplate']]"
  1337. methodArgumentTypes="java.lang.Object"
  1338. name="take" doc:name="Invoke"/>
  1339. </first-successful>
  1340. <expression-component doc:name="processFlowMeterStatus">
  1341. if(payload!=null){
  1342. System.out.println("SPACE WORKER AGENTS: Biometrics Object Acquired for person: " + flowVars['personsUniqueId']);
  1343. System.out.println("SPACE WORKER AGENTS: Object Type Acquired from Space: " + payload.getClass().getName());
  1344. }else{
  1345. System.out.println("SPACE WORKER AGENTS: No Object returned From SPace");
  1346. }
  1347. </expression-component>
  1348. </processor-chain>
  1349. </sub-flow>
  1350.  
  1351. <flow name="processUnacceptedDataEventsFromIntellEngine"
  1352. processingStrategy="queued-120-threads-processor">
  1353. <processor-chain>
  1354. <expression-component doc:name="processFlowMeterStatus">
  1355. System.out.println("REJECTED IDENTITIES PROCESSING AGENTS: Entry Rejected for : " + payload.getAgencyPersonUniqueId());
  1356. </expression-component>
  1357. </processor-chain>
  1358. </flow>
  1359.  
  1360. <sub-flow name="sendImageObjectsToSpace">
  1361. <expression-component doc:name="Update Activiti Process Parameters">
  1362. System.out.println("SPACE DISPATCHER: Going to write Message to Space");
  1363. </expression-component>
  1364. <expression-filter expression="#[payload!=null]" doc:name="Filter empty payload"/>
  1365. <enricher target="#[flowVars['writeLeaseContext']]" doc:name="Enrich Space Lease Context ">
  1366. <processor-chain>
  1367. <set-variable variableName="nimcLocalStorageGSpace"
  1368. value="#[(GigaSpace)app.registry['nimcCentralStorageGSpace']]"
  1369. doc:name="The Payload is the TDO Object "/>
  1370. <set-variable variableName="xfer_to_cntrl_write_lease_time" value="#[20000]"
  1371. doc:name="20 Seconds lease Time "/>
  1372. <set-variable variableName="update_time_out" value="#[45000L]"
  1373. doc:name="20 Seconds lease Time "/>
  1374. <choice>
  1375. <when expression="#[payload is Object[]]">
  1376. <expression-component doc:name="Update Activiti Process Parameters">
  1377. System.out.println("BIOMETRIC IMAGE SPACE STORE: This is an Array");
  1378. </expression-component>
  1379. <expression-transformer expression="#[ objectArrayToWrite = (Object[])payload;
  1380. lseCtxObject = flowVars['nimcLocalStorageGSpace'].writeMultiple(
  1381. objectArrayToWrite, flowVars['xfer_to_cntrl_write_lease_time'],
  1382. flowVars['update_time_out'],
  1383. WriteModifiers.UPDATE_OR_WRITE); lseCtxObject]"/>
  1384. </when>
  1385. <when expression="#[!(payload is Object[])]">
  1386. <expression-transformer expression="#[lseCtxObject = flowVars['nimcLocalStorageGSpace'].write(
  1387. payload, flowVars['xfer_to_cntrl_write_lease_time'], flowVars['update_time_out'],
  1388. WriteModifiers.UPDATE_OR_WRITE); lseCtxObject]"/>
  1389. </when>
  1390. <otherwise>
  1391. <expression-component doc:name="Update Activiti Process Parameters">
  1392. System.out.println("BIOMETRIC IMAGE SPACE STORE:: " + message.payloadAs(java.lang.String));
  1393. </expression-component>
  1394. </otherwise>
  1395. </choice>
  1396. </processor-chain>
  1397. </enricher>
  1398. <set-payload value="#[flowVars['writeLeaseContext'].getUID()]"/>
  1399. <expression-component doc:name="processFlowMeterStatus">
  1400. System.out.println("BIOMETRIC IMAGE SPACE STORE: Identity Object Written to Storage Space with Uid: " + flowVars['writeLeaseContext'].getUID());
  1401. payload = flowVars['writeLeaseContext'].getUID();
  1402. </expression-component>
  1403. </sub-flow>
  1404.  
  1405. <flow name="storeIdentityObjectsInMongoDb">
  1406. <jms:inbound-endpoint queue="store.identity.object.in.mongo.db.edp"
  1407. connector-ref="jmsConnector-next">
  1408. <jms:transaction action="JOIN_IF_POSSIBLE" />
  1409. </jms:inbound-endpoint>
  1410. <async>
  1411. <processor-chain>
  1412. <enricher target="#[flowVars['collection-exists']]">
  1413. <mongo:exists-collection collection="#[message.inboundProperties['mongo_object_coll_name']]"
  1414. config-ref="identitiesStoreMongoDbConfig"/>
  1415. </enricher>
  1416. <choice>
  1417. <when expression="#[flowVars['collection-exists']=='false']">
  1418. <processor-chain>
  1419. <expression-component doc:name="Update Activiti Process Parameters">
  1420. System.out.println("MONGO-DB STORE: Going to Create Collection With Name: " + message.inboundProperties['mongo_object_coll_name'] );
  1421. </expression-component>
  1422. <mongo:create-collection collection="#[message.inboundProperties['mongo_object_coll_name']]"
  1423. capped="true"
  1424. config-ref="identitiesStoreMongoDbConfig"/>
  1425. </processor-chain>
  1426. </when>
  1427. <otherwise>
  1428. <expression-component doc:name="Update Activiti Process Parameters">
  1429. System.out.println("MONGO-DB STORE: Collection " + message.inboundProperties['mongo_object_coll_name'] + " Already Exist");
  1430. </expression-component>
  1431. </otherwise>
  1432. </choice>
  1433. <expression-filter expression="#[flowVars['collection-exists']=='true']" doc:name="Expression"/>
  1434. <set-payload value="#[message.inboundProperties['object_of_interest']]"
  1435. doc:name="Set Journal Voucher as new Payload"/>
  1436. <first-successful>
  1437. <mongo:insert-object collection="#[message.inboundProperties['mongo_object_coll_name']]"
  1438. writeConcern="SAFE"
  1439. dbObject-ref="#[payload]"
  1440. config-ref="identitiesStoreMongoDbConfig"/>
  1441. <flow-ref name="setNullComponent" />
  1442. </first-successful>
  1443. <custom-interceptor class="com.inspired.mule.interceptors.GeneralLoggingInterceptor"/>
  1444. <remove-property propertyName="object_of_interest" doc:name="Delete Property"/>
  1445. <remove-property propertyName="mongo_object_coll_name" doc:name="Delete Property"/>
  1446. </processor-chain>
  1447. </async>
  1448. </flow>
  1449. </mule>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement