@llm4ts/shell 0.17.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/Cli.d.ts +4 -0
  2. package/dist/Cli.d.ts.map +1 -1
  3. package/dist/Cli.js +69 -8
  4. package/dist/Cli.js.map +1 -1
  5. package/dist/FlowCatalog.d.ts +10 -4
  6. package/dist/FlowCatalog.d.ts.map +1 -1
  7. package/dist/FlowCatalog.js +25 -14
  8. package/dist/FlowCatalog.js.map +1 -1
  9. package/flows/epic-stories.js +1 -8
  10. package/flows/hello.js +15 -0
  11. package/flows/implement.js +1 -8
  12. package/flows/issue-pr.js +1 -8
  13. package/flows/judge-suite.js +1 -4
  14. package/flows/lib/epic-stories.js +3 -4
  15. package/flows/local.js +2 -5
  16. package/flows/modernize-bench.js +3 -12
  17. package/flows/modernize-extract.js +38 -20
  18. package/flows/modernize-implement.js +4 -15
  19. package/flows/modernize-pack-check.js +1 -8
  20. package/flows/modernize-review.js +4 -13
  21. package/flows/modernize-seed.js +3 -11
  22. package/flows/modernize-survey.js +0 -0
  23. package/flows/modernize-verify.js +5 -13
  24. package/flows/sdd.js +2 -12
  25. package/kits/j2ee-nextjs/README.md +29 -0
  26. package/kits/j2ee-nextjs/fixtures/demo-bank/RUNBOOK.md +232 -0
  27. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/PAGES.md +67 -0
  28. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/pom.xml +49 -0
  29. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/AcctOvwDTO.java +58 -0
  30. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/BenfDTO.java +49 -0
  31. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/TrfDTO.java +70 -0
  32. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbAcctListService.java +53 -0
  33. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbBenfListService.java +58 -0
  34. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbBenfMaintService.java +58 -0
  35. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbException.java +21 -0
  36. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbGateway.java +44 -0
  37. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbTrfExecService.java +53 -0
  38. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbTrfValidateService.java +45 -0
  39. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/AccountOverviewServlet.java +90 -0
  40. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/BeneficiaryServlet.java +195 -0
  41. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/TransferDraft.java +62 -0
  42. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/TransferServlet.java +223 -0
  43. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/WEB-INF/web.xml +59 -0
  44. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/accountOverview.jsp +65 -0
  45. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/beneficiaryEdit.jsp +70 -0
  46. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/beneficiaryList.jsp +43 -0
  47. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/css/bank.css +132 -0
  48. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/dashboard.jsp +28 -0
  49. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/footer.jsp +8 -0
  50. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/header.jsp +22 -0
  51. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/help.jsp +32 -0
  52. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/js/jquery-1.12.4.min.js +1 -0
  53. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/js/validate.js +79 -0
  54. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/login.jsp +29 -0
  55. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/messages.jsp +34 -0
  56. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/nav.jsp +14 -0
  57. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/oldTransfer.jsp +34 -0
  58. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/profile.jsp +26 -0
  59. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/promoQ3.jsp +23 -0
  60. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/settings.jsp +34 -0
  61. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/testHarness.jsp +39 -0
  62. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferConfirm.jsp +35 -0
  63. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferStep1.jsp +73 -0
  64. package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferStep2.jsp +40 -0
  65. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/CONTRIBUTING.md +76 -0
  66. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/README.md +46 -0
  67. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/contracts/cards.openapi.yaml +57 -0
  68. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/contracts/profile.openapi.yaml +73 -0
  69. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/eslint.config.mjs +24 -0
  70. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/next-env.d.ts +5 -0
  71. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/next.config.mjs +10 -0
  72. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/package.json +29 -0
  73. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/pnpm-lock.yaml +2895 -0
  74. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/cards/page.tsx +62 -0
  75. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/layout.tsx +41 -0
  76. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/page.tsx +26 -0
  77. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/profile/page.tsx +134 -0
  78. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/signed-in-badge.tsx +9 -0
  79. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/auth/AuthProvider.tsx +36 -0
  80. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Button.tsx +27 -0
  81. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Card.tsx +18 -0
  82. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/DataTable.tsx +57 -0
  83. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Field.tsx +34 -0
  84. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Form.tsx +70 -0
  85. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/PageLayout.tsx +39 -0
  86. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Stepper.tsx +29 -0
  87. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/index.ts +19 -0
  88. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/cards/mock.ts +47 -0
  89. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/cards/port.ts +31 -0
  90. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/profile/mock.ts +45 -0
  91. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/profile/port.ts +24 -0
  92. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/registry.ts +20 -0
  93. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/theme/components.css +269 -0
  94. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/theme/tokens.css +38 -0
  95. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tests/cards.page.test.tsx +81 -0
  96. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tests/profile.page.test.tsx +87 -0
  97. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tsconfig.json +54 -0
  98. package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/vitest.config.ts +17 -0
  99. package/kits/j2ee-nextjs/fixtures/demo-bank/preflight.mjs +53 -0
  100. package/kits/j2ee-nextjs/fixtures/demo-bank/reset-demo.mjs +40 -0
  101. package/kits/j2ee-nextjs/fixtures/demo-bank/seed-legacy-j2ee.mjs +71 -0
  102. package/kits/j2ee-nextjs/fixtures/demo-bank/seed-nextjs.mjs +111 -0
  103. package/kits/j2ee-nextjs/fixtures/demo-bank/smoke-legacy-j2ee.mjs +144 -0
  104. package/kits/j2ee-nextjs/fixtures/demo-bank/smoke-nextjs.mjs +118 -0
  105. package/{flows → kits/j2ee-nextjs/flows}/convert-all.js +1 -7
  106. package/{flows → kits/j2ee-nextjs/flows}/convert-page.js +2 -6
  107. package/{flows → kits/j2ee-nextjs/flows}/lib/convert.js +6 -16
  108. package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/pack.md +2 -1
  109. package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/spec.md +5 -1
  110. package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/pack.md +1 -1
  111. package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/pack.md +1 -1
  112. package/kits/mainframe-java/README.md +31 -0
  113. package/{flows → kits/mainframe-java}/packs/ace-integration/pack.md +1 -1
  114. package/{flows → kits/mainframe-java}/packs/ace-kafka/pack.md +1 -1
  115. package/{flows → kits/mainframe-java}/packs/cobol-kafka/pack.md +1 -1
  116. package/{flows → kits/mainframe-java}/packs/cobol-springboot/pack.md +1 -1
  117. package/package.json +6 -6
  118. package/src/Cli.ts +92 -9
  119. package/src/FlowCatalog.ts +29 -13
  120. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-001-jstl-table.md +0 -0
  121. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-002-jquery-validation.md +0 -0
  122. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-003-session-stepper.md +0 -0
  123. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-004-esb-port.md +0 -0
  124. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-005-include-shell.md +0 -0
  125. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/analysis.md +0 -0
  126. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/bdd.md +0 -0
  127. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/implement.md +0 -0
  128. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/plan.md +0 -0
  129. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/review.md +0 -0
  130. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/survey-refine.md +0 -0
  131. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/survey-triage.md +0 -0
  132. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/reviewers/acl-purity.md +0 -0
  133. /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/reviewers/house-style.md +0 -0
  134. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/lessons.md +0 -0
  135. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/analysis.md +0 -0
  136. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/bdd.md +0 -0
  137. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/implement.md +0 -0
  138. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/plan.md +0 -0
  139. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/review.md +0 -0
  140. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/spec.md +0 -0
  141. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/survey-refine.md +0 -0
  142. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/survey-triage.md +0 -0
  143. /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/reviewers/bff-boundary.md +0 -0
  144. /package/{flows/packs/ace-integration → kits/j2ee-nextjs/packs/jsp-bff-nextjs}/reviewers/traceability.md +0 -0
  145. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/lessons.md +0 -0
  146. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/analysis.md +0 -0
  147. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/bdd.md +0 -0
  148. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/implement.md +0 -0
  149. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/plan.md +0 -0
  150. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/review.md +0 -0
  151. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/spec.md +0 -0
  152. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/survey-refine.md +0 -0
  153. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/survey-triage.md +0 -0
  154. /package/{flows/packs/ace-kafka → kits/j2ee-nextjs/packs/jsp-nextjs}/reviewers/traceability.md +0 -0
  155. /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/reviewers/ux-fidelity.md +0 -0
  156. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/README.md +0 -0
  157. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/app/layout.js +0 -0
  158. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/app/page.js +0 -0
  159. /package/{flows/fixtures/scaffolds/kafka-streams-service/src/test/resources/features → kits/j2ee-nextjs/scaffolds/nextjs-spa/docs/specs}/.gitkeep +0 -0
  160. /package/{flows/fixtures/scaffolds/nextjs-spa/docs/specs → kits/j2ee-nextjs/scaffolds/nextjs-spa/features}/.gitkeep +0 -0
  161. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/next.config.js +0 -0
  162. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/package.json +0 -0
  163. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/tests/smoke.test.js +0 -0
  164. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/README.md +0 -0
  165. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/app/layout.js +0 -0
  166. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/app/page.js +0 -0
  167. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/next.config.js +0 -0
  168. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/package.json +0 -0
  169. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/tests/smoke.test.js +0 -0
  170. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/pom.xml +0 -0
  171. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/scripts/test.sh +0 -0
  172. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/main/java/com/meridian/bff/Application.java +0 -0
  173. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/main/resources/application.yaml +0 -0
  174. /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/test/java/com/meridian/bff/ApplicationTests.java +0 -0
  175. /package/{flows/fixtures/scaffolds/nextjs-spa → kits/j2ee-nextjs/scaffolds/spring-bff/src/test/resources}/features/.gitkeep +0 -0
  176. /package/{flows → kits/mainframe-java}/packs/ace-integration/lessons.md +0 -0
  177. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/analysis.md +0 -0
  178. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/bdd.md +0 -0
  179. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/implement.md +0 -0
  180. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/plan.md +0 -0
  181. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/review.md +0 -0
  182. /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/spec.md +0 -0
  183. /package/{flows → kits/mainframe-java}/packs/ace-integration/reviewers/routing-fidelity.md +0 -0
  184. /package/{flows/packs/cobol-kafka → kits/mainframe-java/packs/ace-integration}/reviewers/traceability.md +0 -0
  185. /package/{flows → kits/mainframe-java}/packs/ace-kafka/lessons.md +0 -0
  186. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/analysis.md +0 -0
  187. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/bdd.md +0 -0
  188. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/implement.md +0 -0
  189. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/plan.md +0 -0
  190. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/review.md +0 -0
  191. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/spec.md +0 -0
  192. /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/vectors.md +0 -0
  193. /package/{flows → kits/mainframe-java}/packs/ace-kafka/reviewers/event-contracts.md +0 -0
  194. /package/{flows → kits/mainframe-java}/packs/ace-kafka/reviewers/routing-fidelity.md +0 -0
  195. /package/{flows/packs/cobol-springboot → kits/mainframe-java/packs/ace-kafka}/reviewers/traceability.md +0 -0
  196. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/lessons.md +0 -0
  197. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-001-record-to-event.md +0 -0
  198. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-002-job-step-topology.md +0 -0
  199. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-003-checkpoint-idempotence.md +0 -0
  200. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-004-eod-totals-window.md +0 -0
  201. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-005-reject-topic.md +0 -0
  202. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-006-keyed-state-store.md +0 -0
  203. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-007-outbox.md +0 -0
  204. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-008-partition-key.md +0 -0
  205. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-009-batch-window-cutoff.md +0 -0
  206. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-010-replay-backfill.md +0 -0
  207. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/analysis.md +0 -0
  208. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/bdd.md +0 -0
  209. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/implement.md +0 -0
  210. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/plan.md +0 -0
  211. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/review.md +0 -0
  212. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/spec.md +0 -0
  213. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/survey-refine.md +0 -0
  214. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/survey-triage.md +0 -0
  215. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/vectors.md +0 -0
  216. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/reviewers/cobol-fidelity.md +0 -0
  217. /package/{flows → kits/mainframe-java}/packs/cobol-kafka/reviewers/pattern-conformance.md +0 -0
  218. /package/{flows/packs/jsp-bff-nextjs → kits/mainframe-java/packs/cobol-kafka}/reviewers/traceability.md +0 -0
  219. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/lessons.md +0 -0
  220. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/analysis.md +0 -0
  221. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/bdd.md +0 -0
  222. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/implement.md +0 -0
  223. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/plan.md +0 -0
  224. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/review.md +0 -0
  225. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/spec.md +0 -0
  226. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/survey-refine.md +0 -0
  227. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/survey-triage.md +0 -0
  228. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/vectors.md +0 -0
  229. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/reviewers/cobol-fidelity.md +0 -0
  230. /package/{flows → kits/mainframe-java}/packs/cobol-springboot/reviewers/pattern-conformance.md +0 -0
  231. /package/{flows/packs/jsp-nextjs → kits/mainframe-java/packs/cobol-springboot}/reviewers/traceability.md +0 -0
  232. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-001-comp3-money.md +0 -0
  233. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-002-redefines.md +0 -0
  234. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-003-88-levels.md +0 -0
  235. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-004-perform-thru.md +0 -0
  236. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-005-file-status.md +0 -0
  237. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-006-sqlcode.md +0 -0
  238. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-007-validation-order.md +0 -0
  239. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-008-zoned-decimal.md +0 -0
  240. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-009-occurs-table.md +0 -0
  241. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-010-copybook-record.md +0 -0
  242. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-011-batch-counters.md +0 -0
  243. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-012-commit-frequency.md +0 -0
  244. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-013-abend.md +0 -0
  245. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-014-reject-file.md +0 -0
  246. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-015-accept-date.md +0 -0
  247. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-016-string-building.md +0 -0
  248. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-017-cursor-loop.md +0 -0
  249. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-018-yn-switches.md +0 -0
  250. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-019-shared-accumulators.md +0 -0
  251. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-020-tiered-fees.md +0 -0
  252. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-021-overdraft-floor.md +0 -0
  253. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-022-jcl-job-net.md +0 -0
  254. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-023-sort-step.md +0 -0
  255. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-024-fixed-width-records.md +0 -0
  256. /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-025-audit-rows.md +0 -0
  257. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/README.md +0 -0
  258. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/pom.xml +0 -0
  259. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/scripts/replay.sh +0 -0
  260. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/src/main/java/com/meridian/scaffold/Application.java +0 -0
  261. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/src/test/java/com/meridian/scaffold/ApplicationTests.java +0 -0
  262. /package/{flows/fixtures/scaffolds/spring-bff → kits/mainframe-java/scaffolds/kafka-streams-service}/src/test/resources/features/.gitkeep +0 -0
  263. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/README.md +0 -0
  264. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/pom.xml +0 -0
  265. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/scripts/replay.sh +0 -0
  266. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/main/java/com/meridian/scaffold/Application.java +0 -0
  267. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/main/resources/application.yaml +0 -0
  268. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/test/java/com/meridian/scaffold/ApplicationTests.java +0 -0
  269. /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/test/resources/features/.gitkeep +0 -0
@@ -0,0 +1,195 @@
1
+ package com.demobank.legacy.web;
2
+
3
+ import java.io.IOException;
4
+ import java.util.ArrayList;
5
+ import java.util.List;
6
+
7
+ import javax.servlet.RequestDispatcher;
8
+ import javax.servlet.ServletException;
9
+ import javax.servlet.http.HttpServlet;
10
+ import javax.servlet.http.HttpServletRequest;
11
+ import javax.servlet.http.HttpServletResponse;
12
+ import javax.servlet.http.HttpSession;
13
+
14
+ import com.demobank.legacy.dto.BenfDTO;
15
+ import com.demobank.legacy.esb.EsbBenfListService;
16
+ import com.demobank.legacy.esb.EsbBenfMaintService;
17
+ import com.demobank.legacy.esb.EsbException;
18
+
19
+ /**
20
+ * HERO 2 controller. Mapped on /beneficiary.
21
+ *
22
+ * GET ?action=list (default) -> beneficiaryList.jsp ("benfList")
23
+ * GET ?action=new -> beneficiaryEdit.jsp (empty "benf")
24
+ * GET ?action=edit&benfId=.. -> beneficiaryEdit.jsp (loaded "benf")
25
+ * GET ?action=delete&benfId= -> delete then redirect to list [sic: GET
26
+ * with side effect, kept legacy-faithful]
27
+ * POST -> server-side validation + ESB_BENF_MAINT
28
+ *
29
+ * Server-side validation deliberately overlaps but does not match the
30
+ * client rules in beneficiaryEdit.jsp / validate.js (see DB-2988, DB-3302):
31
+ * - name required, max 60 chars (client allows 70)
32
+ * - IBAN required, shape check, AND country must be IT/DE/FR (client
33
+ * checks shape only)
34
+ * - bank name required when ccy != EUR (client treats it as optional)
35
+ *
36
+ * ESB dependencies: ESB_BENF_LIST, ESB_BENF_MAINT.
37
+ */
38
+ public class BeneficiaryServlet extends HttpServlet {
39
+
40
+ private static final long serialVersionUID = 1L;
41
+
42
+ private final EsbBenfListService listService = new EsbBenfListService();
43
+ private final EsbBenfMaintService maintService = new EsbBenfMaintService();
44
+
45
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
46
+ throws ServletException, IOException {
47
+
48
+ String custId = custId(request);
49
+ String action = request.getParameter("action");
50
+ if (action == null) action = "list";
51
+
52
+ try {
53
+ if ("new".equals(action)) {
54
+ BenfDTO empty = new BenfDTO();
55
+ empty.setCcyCd("EUR");
56
+ request.setAttribute("benf", empty);
57
+ forward(request, response, "/beneficiaryEdit.jsp");
58
+ } else if ("edit".equals(action)) {
59
+ BenfDTO benf = listService.getBeneficiary(custId,
60
+ request.getParameter("benfId"));
61
+ if (benf == null) {
62
+ response.sendRedirect("beneficiary");
63
+ return;
64
+ }
65
+ request.setAttribute("benf", benf);
66
+ forward(request, response, "/beneficiaryEdit.jsp");
67
+ } else if ("delete".equals(action)) {
68
+ maintService.delete(custId, request.getParameter("benfId"));
69
+ request.getSession().setAttribute("flashOnce", "Beneficiary deleted.");
70
+ response.sendRedirect("beneficiary");
71
+ } else {
72
+ renderList(request, response, custId);
73
+ }
74
+ } catch (EsbException e) {
75
+ System.out.println("BENF esb failure rc=" + e.getEsbRc());
76
+ request.setAttribute("benfList", new ArrayList());
77
+ forward(request, response, "/beneficiaryList.jsp");
78
+ }
79
+ }
80
+
81
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
82
+ throws ServletException, IOException {
83
+
84
+ String custId = custId(request);
85
+
86
+ BenfDTO benf = new BenfDTO();
87
+ benf.setBenfId(trim(request.getParameter("benfId")));
88
+ benf.setBenfNm(trim(request.getParameter("benfNm")));
89
+ benf.setBenfIban(trim(request.getParameter("benfIban")));
90
+ benf.setBankNm(trim(request.getParameter("bankNm")));
91
+ benf.setCcyCd(trim(request.getParameter("ccyCd")));
92
+
93
+ List errs = validate(benf);
94
+ if (!errs.isEmpty()) {
95
+ request.setAttribute("srvErrs", errs);
96
+ request.setAttribute("benf", benf);
97
+ forward(request, response, "/beneficiaryEdit.jsp");
98
+ return;
99
+ }
100
+
101
+ try {
102
+ String rc = maintService.save(custId, benf);
103
+ if (!"0000".equals(rc)) {
104
+ errs.add(hostMessage(rc));
105
+ request.setAttribute("srvErrs", errs);
106
+ request.setAttribute("benf", benf);
107
+ forward(request, response, "/beneficiaryEdit.jsp");
108
+ return;
109
+ }
110
+ } catch (EsbException e) {
111
+ errs.add("Service temporarily unavailable, please retry (rc "
112
+ + e.getEsbRc() + ").");
113
+ request.setAttribute("srvErrs", errs);
114
+ request.setAttribute("benf", benf);
115
+ forward(request, response, "/beneficiaryEdit.jsp");
116
+ return;
117
+ }
118
+
119
+ request.getSession().setAttribute("flashOnce", "Beneficiary saved.");
120
+ response.sendRedirect("beneficiary");
121
+ }
122
+
123
+ /** Server-side rules. Compare with the jQuery rules in the JSP. */
124
+ private List validate(BenfDTO benf) {
125
+ List errs = new ArrayList();
126
+ if (isEmpty(benf.getBenfNm())) {
127
+ errs.add("Beneficiary name is required.");
128
+ } else if (benf.getBenfNm().length() > 60) {
129
+ // client-side allows 70 -- host field is CHAR(60), see DB-2988
130
+ errs.add("Beneficiary name must not exceed 60 characters.");
131
+ }
132
+ String iban = benf.getBenfIban() == null
133
+ ? "" : benf.getBenfIban().replaceAll(" ", "").toUpperCase();
134
+ if (iban.length() == 0) {
135
+ errs.add("IBAN is required.");
136
+ } else if (!iban.matches("[A-Z]{2}[0-9]{2}[A-Z0-9]{10,30}")) {
137
+ errs.add("IBAN format is not valid.");
138
+ } else {
139
+ String country = iban.substring(0, 2);
140
+ // client checks shape only; SEPA scheme subset enforced here
141
+ if (!"IT".equals(country) && !"DE".equals(country) && !"FR".equals(country)) {
142
+ errs.add("Only IT, DE and FR IBANs are accepted online.");
143
+ }
144
+ }
145
+ if (!"EUR".equals(benf.getCcyCd()) && isEmpty(benf.getBankNm())) {
146
+ // client treats bank name as always optional
147
+ errs.add("Bank name is required for non-EUR beneficiaries.");
148
+ }
149
+ return errs;
150
+ }
151
+
152
+ private void renderList(HttpServletRequest request, HttpServletResponse response,
153
+ String custId) throws EsbException, ServletException, IOException {
154
+ List benfList = listService.listBeneficiaries(custId);
155
+ request.setAttribute("benfList", benfList);
156
+ HttpSession session = request.getSession();
157
+ Object flash = session.getAttribute("flashOnce");
158
+ if (flash != null) {
159
+ request.setAttribute("flashMsg", flash);
160
+ session.removeAttribute("flashOnce");
161
+ }
162
+ forward(request, response, "/beneficiaryList.jsp");
163
+ }
164
+
165
+ private String hostMessage(String rc) {
166
+ if ("0102".equals(rc)) return "A beneficiary with this IBAN already exists.";
167
+ if ("0107".equals(rc)) return "Beneficiary refused by compliance vetting.";
168
+ if ("0110".equals(rc)) return "Beneficiary book is full (max 50 entries).";
169
+ return "Operation refused by the bank host (code " + rc + ").";
170
+ }
171
+
172
+ private void forward(HttpServletRequest request, HttpServletResponse response,
173
+ String jsp) throws ServletException, IOException {
174
+ RequestDispatcher rd = request.getRequestDispatcher(jsp);
175
+ rd.forward(request, response);
176
+ }
177
+
178
+ private String custId(HttpServletRequest request) {
179
+ HttpSession session = request.getSession(true);
180
+ String custId = (String) session.getAttribute("custId");
181
+ if (custId == null) {
182
+ custId = "CUST0042";
183
+ session.setAttribute("custId", custId);
184
+ }
185
+ return custId;
186
+ }
187
+
188
+ private String trim(String s) {
189
+ return s == null ? null : s.trim();
190
+ }
191
+
192
+ private boolean isEmpty(String s) {
193
+ return s == null || s.trim().length() == 0;
194
+ }
195
+ }
@@ -0,0 +1,62 @@
1
+ package com.demobank.legacy.web;
2
+
3
+ import java.io.Serializable;
4
+ import java.math.BigDecimal;
5
+
6
+ /**
7
+ * Wire transfer wizard state, held in HttpSession under attribute
8
+ * "trfDraft" between step 1 (entry), step 2 (review) and step 3
9
+ * (execution). Cleared by TransferServlet after execution or abandon.
10
+ *
11
+ * Serializable because the app servers replicate sessions across the
12
+ * cluster (session-timeout 10, see web.xml).
13
+ *
14
+ * @author lgreco (2011)
15
+ */
16
+ public class TransferDraft implements Serializable {
17
+
18
+ private static final long serialVersionUID = 1L;
19
+
20
+ private String benfId;
21
+ private String benfNm;
22
+ private String benfIban;
23
+ private BigDecimal trfAmt;
24
+ private String trfCcy;
25
+ private String trfDesc;
26
+ private String valDt;
27
+ /** Fee computed by ESB_TRF_VAL, shown on the review screen. */
28
+ private BigDecimal feeAmt;
29
+ /** Validation token from ESB_TRF_VAL, required by ESB_TRF_EXEC. */
30
+ private String valToken;
31
+
32
+ public TransferDraft() {
33
+ // bean constructor
34
+ }
35
+
36
+ public String getBenfId() { return benfId; }
37
+ public void setBenfId(String benfId) { this.benfId = benfId; }
38
+
39
+ public String getBenfNm() { return benfNm; }
40
+ public void setBenfNm(String benfNm) { this.benfNm = benfNm; }
41
+
42
+ public String getBenfIban() { return benfIban; }
43
+ public void setBenfIban(String benfIban) { this.benfIban = benfIban; }
44
+
45
+ public BigDecimal getTrfAmt() { return trfAmt; }
46
+ public void setTrfAmt(BigDecimal trfAmt) { this.trfAmt = trfAmt; }
47
+
48
+ public String getTrfCcy() { return trfCcy; }
49
+ public void setTrfCcy(String trfCcy) { this.trfCcy = trfCcy; }
50
+
51
+ public String getTrfDesc() { return trfDesc; }
52
+ public void setTrfDesc(String trfDesc) { this.trfDesc = trfDesc; }
53
+
54
+ public String getValDt() { return valDt; }
55
+ public void setValDt(String valDt) { this.valDt = valDt; }
56
+
57
+ public BigDecimal getFeeAmt() { return feeAmt; }
58
+ public void setFeeAmt(BigDecimal feeAmt) { this.feeAmt = feeAmt; }
59
+
60
+ public String getValToken() { return valToken; }
61
+ public void setValToken(String valToken) { this.valToken = valToken; }
62
+ }
@@ -0,0 +1,223 @@
1
+ package com.demobank.legacy.web;
2
+
3
+ import java.io.IOException;
4
+ import java.math.BigDecimal;
5
+ import java.util.List;
6
+
7
+ import javax.servlet.RequestDispatcher;
8
+ import javax.servlet.ServletException;
9
+ import javax.servlet.http.HttpServlet;
10
+ import javax.servlet.http.HttpServletRequest;
11
+ import javax.servlet.http.HttpServletResponse;
12
+ import javax.servlet.http.HttpSession;
13
+
14
+ import com.demobank.legacy.dto.BenfDTO;
15
+ import com.demobank.legacy.dto.TrfDTO;
16
+ import com.demobank.legacy.esb.EsbBenfListService;
17
+ import com.demobank.legacy.esb.EsbException;
18
+ import com.demobank.legacy.esb.EsbTrfExecService;
19
+ import com.demobank.legacy.esb.EsbTrfValidateService;
20
+
21
+ /**
22
+ * HERO 3 controller. Mapped on /transfer. Drives the 3-step wizard and
23
+ * keeps the in-flight TransferDraft in HttpSession ("trfDraft") -- the
24
+ * hardest conversion case in the fixture.
25
+ *
26
+ * GET /transfer -> start (or resume) at step 1; loads the
27
+ * beneficiary combo via ESB_BENF_LIST
28
+ * POST step=1 -> parse + validate entry, store draft in
29
+ * session, ESB_TRF_VAL, forward to step 2
30
+ * POST step=3 -> ESB_TRF_EXEC with the session draft, clear
31
+ * the draft, forward to confirmation
32
+ *
33
+ * (There is no POST step=2: the review page holds no fields, it re-posts
34
+ * only the confirmation. Numbering kept for the ops runbook.)
35
+ *
36
+ * ESB dependencies: ESB_BENF_LIST, ESB_TRF_VAL, ESB_TRF_EXEC.
37
+ */
38
+ public class TransferServlet extends HttpServlet {
39
+
40
+ private static final long serialVersionUID = 1L;
41
+
42
+ private final EsbBenfListService benfListService = new EsbBenfListService();
43
+ private final EsbTrfValidateService validateService = new EsbTrfValidateService();
44
+ private final EsbTrfExecService execService = new EsbTrfExecService();
45
+
46
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
47
+ throws ServletException, IOException {
48
+ // Entry point and "Back" target: always renders step 1, keeping any
49
+ // draft already in session so the fields come back pre-filled.
50
+ renderStep1(request, response, null);
51
+ }
52
+
53
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
54
+ throws ServletException, IOException {
55
+
56
+ String step = request.getParameter("step");
57
+ if ("1".equals(step)) {
58
+ handleStep1(request, response);
59
+ } else if ("3".equals(step)) {
60
+ handleStep3(request, response);
61
+ } else {
62
+ // Unknown step: restart the wizard (legacy catch-all).
63
+ response.sendRedirect("transfer");
64
+ }
65
+ }
66
+
67
+ /** Parse the entry form, ESB-validate, park the draft in session. */
68
+ private void handleStep1(HttpServletRequest request, HttpServletResponse response)
69
+ throws ServletException, IOException {
70
+
71
+ HttpSession session = request.getSession(true);
72
+ String custId = custId(session);
73
+
74
+ String benfId = trim(request.getParameter("benfId"));
75
+ String amtRaw = trim(request.getParameter("trfAmt"));
76
+
77
+ if (isEmpty(benfId) || isEmpty(amtRaw)) {
78
+ renderStep1(request, response, "Beneficiary and amount are required.");
79
+ return;
80
+ }
81
+
82
+ BigDecimal amt;
83
+ try {
84
+ // Server accepts the dot only; the client tolerates a comma and
85
+ // rewrites it -- known mismatch DB-3302, users with JS disabled
86
+ // hit this branch.
87
+ amt = new BigDecimal(amtRaw);
88
+ } catch (NumberFormatException e) {
89
+ renderStep1(request, response, "Amount format not valid (use 1234.56).");
90
+ return;
91
+ }
92
+ if (amt.compareTo(BigDecimal.ZERO) <= 0 || amt.scale() > 2) {
93
+ renderStep1(request, response, "Amount must be positive with max 2 decimals.");
94
+ return;
95
+ }
96
+
97
+ TransferDraft draft = new TransferDraft();
98
+ draft.setBenfId(benfId);
99
+ draft.setTrfAmt(amt);
100
+ draft.setTrfCcy("EUR"); // only EUR online, combo is decorative
101
+ draft.setTrfDesc(sanitizeDesc(request.getParameter("trfDesc")));
102
+ draft.setValDt(trim(request.getParameter("valDt")));
103
+
104
+ try {
105
+ BenfDTO benf = benfListService.getBeneficiary(custId, benfId);
106
+ if (benf == null) {
107
+ renderStep1(request, response, "Selected beneficiary no longer exists.");
108
+ return;
109
+ }
110
+ draft.setBenfNm(benf.getBenfNm());
111
+ draft.setBenfIban(benf.getBenfIban());
112
+
113
+ String rc = validateService.validate(custId, draft);
114
+ if (!"0000".equals(rc)) {
115
+ renderStep1(request, response, validationMessage(rc));
116
+ return;
117
+ }
118
+ // Real portal: VAL-TOKEN comes back inside ESB_TRF_VAL response;
119
+ // wrapper keeps it on the draft via this setter since rel. 2.5.
120
+ if (draft.getValToken() == null) {
121
+ draft.setValToken("VT-" + session.getId());
122
+ }
123
+ } catch (EsbException e) {
124
+ renderStep1(request, response,
125
+ "Service temporarily unavailable, please retry (rc " + e.getEsbRc() + ").");
126
+ return;
127
+ }
128
+
129
+ // Park the draft for step 2/3. THE session attribute of this app.
130
+ session.setAttribute("trfDraft", draft);
131
+
132
+ request.setAttribute("draft", draft);
133
+ forward(request, response, "/transferStep2.jsp");
134
+ }
135
+
136
+ /** Execute against the host using the session draft, then clear it. */
137
+ private void handleStep3(HttpServletRequest request, HttpServletResponse response)
138
+ throws ServletException, IOException {
139
+
140
+ HttpSession session = request.getSession(true);
141
+ TransferDraft draft = (TransferDraft) session.getAttribute("trfDraft");
142
+ if (draft == null) {
143
+ // Session expired between review and confirm: restart.
144
+ response.sendRedirect("transfer");
145
+ return;
146
+ }
147
+
148
+ TrfDTO res;
149
+ try {
150
+ res = execService.execute(custId(session), draft);
151
+ } catch (EsbException e) {
152
+ res = new TrfDTO();
153
+ res.setStatus("KO");
154
+ res.setHostRc(e.getEsbRc());
155
+ res.setHostMsg("HOST UNREACHABLE - TRANSFER NOT EXECUTED");
156
+ }
157
+
158
+ // Draft must not survive execution (double-submit guard is host-side
159
+ // via VAL-TOKEN, but keep the session clean anyway).
160
+ session.removeAttribute("trfDraft");
161
+
162
+ request.setAttribute("trfRes", res);
163
+ forward(request, response, "/transferConfirm.jsp");
164
+ }
165
+
166
+ private void renderStep1(HttpServletRequest request, HttpServletResponse response,
167
+ String stepErr) throws ServletException, IOException {
168
+
169
+ HttpSession session = request.getSession(true);
170
+ try {
171
+ List combo = benfListService.listBeneficiaries(custId(session));
172
+ request.setAttribute("benfCombo", combo);
173
+ } catch (EsbException e) {
174
+ request.setAttribute("benfCombo", new java.util.ArrayList());
175
+ }
176
+ // Pre-fill from any draft still in session (Back from review).
177
+ TransferDraft draft = (TransferDraft) session.getAttribute("trfDraft");
178
+ if (draft != null) {
179
+ request.setAttribute("draft", draft);
180
+ }
181
+ if (stepErr != null) {
182
+ request.setAttribute("stepErr", stepErr);
183
+ }
184
+ forward(request, response, "/transferStep1.jsp");
185
+ }
186
+
187
+ /** Host charset is restrictive; strip what SEPA remittance rejects. */
188
+ private String sanitizeDesc(String desc) {
189
+ if (desc == null) return null;
190
+ String cleaned = desc.replaceAll("[^A-Za-z0-9 .,/()-]", " ").trim();
191
+ return cleaned.length() > 140 ? cleaned.substring(0, 140) : cleaned;
192
+ }
193
+
194
+ private String validationMessage(String rc) {
195
+ if ("0201".equals(rc)) return "Insufficient available balance.";
196
+ if ("0205".equals(rc)) return "Daily online transfer limit exceeded (EUR 5,000.00).";
197
+ if ("0207".equals(rc)) return "Transfer refused by compliance screening.";
198
+ return "Transfer refused by the bank host (code " + rc + ").";
199
+ }
200
+
201
+ private void forward(HttpServletRequest request, HttpServletResponse response,
202
+ String jsp) throws ServletException, IOException {
203
+ RequestDispatcher rd = request.getRequestDispatcher(jsp);
204
+ rd.forward(request, response);
205
+ }
206
+
207
+ private String custId(HttpSession session) {
208
+ String custId = (String) session.getAttribute("custId");
209
+ if (custId == null) {
210
+ custId = "CUST0042";
211
+ session.setAttribute("custId", custId);
212
+ }
213
+ return custId;
214
+ }
215
+
216
+ private String trim(String s) {
217
+ return s == null ? null : s.trim();
218
+ }
219
+
220
+ private boolean isEmpty(String s) {
221
+ return s == null || s.trim().length() == 0;
222
+ }
223
+ }
@@ -0,0 +1,59 @@
1
+ <?xml version="1.0" encoding="ISO-8859-1"?>
2
+ <web-app xmlns="http://java.sun.com/xml/ns/javaee"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5
+ http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
6
+ version="2.5">
7
+
8
+ <display-name>DemoBank Internet Banking Portal</display-name>
9
+
10
+ <context-param>
11
+ <param-name>demobank.esb.endpoint</param-name>
12
+ <param-value>http://esb-gw.internal.demobank.example:7801/esb/router</param-value>
13
+ </context-param>
14
+ <context-param>
15
+ <param-name>demobank.esb.timeoutMs</param-name>
16
+ <param-value>12000</param-value>
17
+ </context-param>
18
+
19
+ <servlet>
20
+ <servlet-name>AccountOverviewServlet</servlet-name>
21
+ <servlet-class>com.demobank.legacy.web.AccountOverviewServlet</servlet-class>
22
+ </servlet>
23
+ <servlet-mapping>
24
+ <servlet-name>AccountOverviewServlet</servlet-name>
25
+ <url-pattern>/accountOverview</url-pattern>
26
+ </servlet-mapping>
27
+
28
+ <servlet>
29
+ <servlet-name>BeneficiaryServlet</servlet-name>
30
+ <servlet-class>com.demobank.legacy.web.BeneficiaryServlet</servlet-class>
31
+ </servlet>
32
+ <servlet-mapping>
33
+ <servlet-name>BeneficiaryServlet</servlet-name>
34
+ <url-pattern>/beneficiary</url-pattern>
35
+ </servlet-mapping>
36
+
37
+ <servlet>
38
+ <servlet-name>TransferServlet</servlet-name>
39
+ <servlet-class>com.demobank.legacy.web.TransferServlet</servlet-class>
40
+ </servlet>
41
+ <servlet-mapping>
42
+ <servlet-name>TransferServlet</servlet-name>
43
+ <url-pattern>/transfer</url-pattern>
44
+ </servlet-mapping>
45
+
46
+ <session-config>
47
+ <session-timeout>10</session-timeout>
48
+ </session-config>
49
+
50
+ <welcome-file-list>
51
+ <welcome-file>login.jsp</welcome-file>
52
+ </welcome-file-list>
53
+
54
+ <error-page>
55
+ <error-code>500</error-code>
56
+ <location>/help.jsp</location>
57
+ </error-page>
58
+
59
+ </web-app>
@@ -0,0 +1,65 @@
1
+ <%@ page contentType="text/html; charset=ISO-8859-1" %>
2
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
4
+ <%-- HERO 1: account overview. Server-rendered from AccountOverviewServlet
5
+ ("accts" request attribute, list of AcctOvwDTO) plus an AJAX refresh
6
+ that re-reads balances as JSON. --%>
7
+ <jsp:include page="header.jsp" />
8
+
9
+ <h1>Account Overview</h1>
10
+ <p>Position as of <c:out value="${asOfTs}" /> &nbsp;
11
+ <input type="button" id="btnRefresh" class="btn" value="Refresh balances" />
12
+ <span id="refreshMsg"></span>
13
+ </p>
14
+
15
+ <table class="data" id="acctTable">
16
+ <tr>
17
+ <th>Account</th>
18
+ <th>Description</th>
19
+ <th>Ccy</th>
20
+ <th class="num">Current balance</th>
21
+ <th class="num">Available balance</th>
22
+ </tr>
23
+ <c:forEach var="a" items="${accts}" varStatus="st">
24
+ <tr class="${st.index % 2 == 1 ? 'odd' : ''}">
25
+ <td><c:out value="${a.acctNo}" /></td>
26
+ <td><c:out value="${a.acctDesc}" /></td>
27
+ <td><c:out value="${a.ccyCd}" /></td>
28
+ <td class="num curBal"><fmt:formatNumber value="${a.curBal}" minFractionDigits="2" maxFractionDigits="2" /></td>
29
+ <td class="num avlBal"><fmt:formatNumber value="${a.avlBal}" minFractionDigits="2" maxFractionDigits="2" /></td>
30
+ </tr>
31
+ </c:forEach>
32
+ <c:if test="${empty accts}">
33
+ <tr><td colspan="5">No accounts found for customer.</td></tr>
34
+ </c:if>
35
+ </table>
36
+
37
+ <script type="text/javascript">
38
+ $(document).ready(function() {
39
+ $("#btnRefresh").click(function() {
40
+ $("#refreshMsg").text("Refreshing...");
41
+ $.ajax({
42
+ url: "accountOverview",
43
+ type: "GET",
44
+ data: { fmt: "json" },
45
+ dataType: "json",
46
+ cache: false,
47
+ success: function(data) {
48
+ // Row order from the ESB matches the rendered table (host keeps
49
+ // acct order stable per customer), so update positionally.
50
+ var rows = $("#acctTable tr").not(":first");
51
+ for (var i = 0; i < data.accts.length && i < rows.length; i++) {
52
+ $(rows[i]).find("td.curBal").text(data.accts[i].curBal);
53
+ $(rows[i]).find("td.avlBal").text(data.accts[i].avlBal);
54
+ }
55
+ $("#refreshMsg").text("Updated " + data.asOfTs).removeClass("msgErr").addClass("msgOk");
56
+ },
57
+ error: function() {
58
+ $("#refreshMsg").text("Refresh failed, please retry.").removeClass("msgOk").addClass("msgErr");
59
+ }
60
+ });
61
+ });
62
+ });
63
+ </script>
64
+
65
+ <jsp:include page="footer.jsp" />
@@ -0,0 +1,70 @@
1
+ <%@ page contentType="text/html; charset=ISO-8859-1" %>
2
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3
+ <%-- HERO 2 (form): add/edit beneficiary. Client-side jQuery validation
4
+ (inline + validate.js) AND server-side validation in BeneficiaryServlet.
5
+ The two rule sets overlap but are NOT identical on purpose:
6
+ - client allows 70 chars for name, server allows 60 (DB-2988)
7
+ - client IBAN check is shape-only, server also checks country IT/DE/FR
8
+ - client tolerates decimal comma, server does not (DB-3302 pattern)
9
+ "benf" request attribute holds the BenfDTO being edited (may be new). --%>
10
+ <jsp:include page="header.jsp" />
11
+
12
+ <h1><c:choose><c:when test="${empty benf.benfId}">Add beneficiary</c:when><c:otherwise>Edit beneficiary</c:otherwise></c:choose></h1>
13
+
14
+ <c:if test="${not empty srvErrs}">
15
+ <ul>
16
+ <c:forEach var="e" items="${srvErrs}">
17
+ <li class="msgErr"><c:out value="${e}" /></li>
18
+ </c:forEach>
19
+ </ul>
20
+ </c:if>
21
+
22
+ <form id="benfForm" class="legacy" method="post" action="beneficiary">
23
+ <input type="hidden" name="benfId" value="<c:out value='${benf.benfId}' />" />
24
+ <div class="row">
25
+ <label for="benfNm">Beneficiary name</label>
26
+ <input type="text" id="benfNm" name="benfNm" size="50" maxlength="70"
27
+ value="<c:out value='${benf.benfNm}' />" />
28
+ </div>
29
+ <div class="row">
30
+ <label for="benfIban">IBAN</label>
31
+ <input type="text" id="benfIban" name="benfIban" size="40"
32
+ value="<c:out value='${benf.benfIban}' />" />
33
+ </div>
34
+ <div class="row">
35
+ <label for="bankNm">Bank name</label>
36
+ <input type="text" id="bankNm" name="bankNm" size="40"
37
+ value="<c:out value='${benf.bankNm}' />" />
38
+ </div>
39
+ <div class="row">
40
+ <label for="ccyCd">Currency</label>
41
+ <select id="ccyCd" name="ccyCd">
42
+ <option value="EUR" <c:if test="${benf.ccyCd == 'EUR'}">selected="selected"</c:if>>EUR</option>
43
+ <option value="USD" <c:if test="${benf.ccyCd == 'USD'}">selected="selected"</c:if>>USD</option>
44
+ <option value="GBP" <c:if test="${benf.ccyCd == 'GBP'}">selected="selected"</c:if>>GBP</option>
45
+ </select>
46
+ </div>
47
+ <div class="row">
48
+ <input type="submit" class="btn" value="Save" />
49
+ <input type="button" class="btn btnGrey" value="Cancel"
50
+ onclick="window.location='beneficiary';" />
51
+ </div>
52
+ </form>
53
+
54
+ <script type="text/javascript">
55
+ $(document).ready(function() {
56
+ $("#benfForm").submit(function() {
57
+ var ok = true;
58
+ // NB: client allows up to 70 chars, the host field is CHAR(60) --
59
+ // servlet rejects instead of truncating. Kept as-is since 2011, see DB-2988.
60
+ if (!dbRequired("#benfNm", "Beneficiary name is required")) ok = false;
61
+ else if (!dbMaxLen("#benfNm", 70)) ok = false;
62
+ if (!dbRequired("#benfIban", "IBAN is required")) ok = false;
63
+ else if (!dbIbanShape("#benfIban")) ok = false;
64
+ // bankNm optional on the client; server requires it for non-EUR.
65
+ return ok;
66
+ });
67
+ });
68
+ </script>
69
+
70
+ <jsp:include page="footer.jsp" />