You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by aw...@apache.org on 2019/06/06 07:10:02 UTC
[fineract-cn-notifications] 11/36: Increment One
This is an automated email from the ASF dual-hosted git repository.
awasum pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git
commit 47709b8ec2d1db59629cdc9e1302b208a6dcd93f
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 15:36:24 2018 +0400
Increment One
Commit for increment one
improved the repositories and entities for the configurations
additions
update
fixed the build error
fixed the build
update to testSample
update
test
---
.gitignore | 17 +
.travis.yml | 49 +
HEADER | 16 +
LICENSE | 201 +
NOTICE.txt | 5 +
api/build.gradle | 57 +
.../notification/api/v1/PermittableGroupIds.class | Bin 0 -> 328 bytes
.../api/v1/client/IamATeapotException.class | Bin 0 -> 392 bytes
.../api/v1/client/NotificationManager.class | Bin 0 -> 1474 bytes
.../api/v1/domain/EmailConfiguration.class | Bin 0 -> 3790 bytes
.../notification/api/v1/domain/Notification.class | Bin 0 -> 1820 bytes
.../api/v1/domain/SMSConfiguration.class | Bin 0 -> 2972 bytes
.../cn/notification/api/v1/domain/Sample.class | Bin 0 -> 1752 bytes
.../api/v1/events/NotificationEventConstants.class | Bin 0 -> 666 bytes
api/settings.gradle | 18 +
.../notification/api/v1/PermittableGroupIds.java | 25 +
.../api/v1/client/IamATeapotException.java | 23 +
.../api/v1/client/NotificationManager.java | 59 +
.../api/v1/domain/EmailConfiguration.java | 162 +
.../api/v1/domain/SMSConfiguration.java | 122 +
.../cn/notification/api/v1/domain/Sample.java | 72 +
.../api/v1/events/NotificationEventConstants.java | 31 +
.../cn/notification/api/v1/domain/SampleTest.java | 57 +
build.gradle | 60 +
component-test/build.gradle | 56 +
component-test/settings.gradle | 18 +
.../cn/notification/SuiteTestEnvironment.java | 48 +
.../fineract/cn/notification/TestSample.java | 137 +
.../apache/fineract/cn/notification/TestSuite.java | 30 +
.../listener/MigrationEventListener.java | 50 +
.../notification/listener/SampleEventListener.java | 50 +
gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54212 bytes
gradle/wrapper/gradle-wrapper.properties | 6 +
gradlew | 172 +
gradlew.bat | 84 +
service/build.gradle | 85 +
service/out/production/resources/application.yml | 78 +
service/out/production/resources/bootstrap.yml | 22 +
.../db/migrations/mariadb/V1__initial_setup.sql | 72 +
service/settings.gradle | 18 +
.../service/NotificationApplication.java | 32 +
.../service/NotificationConfiguration.java | 103 +
.../cn/notification/service/ServiceConstants.java | 23 +
.../internal/command/InitializeServiceCommand.java | 31 +
.../service/internal/command/SampleCommand.java | 42 +
.../command/handler/MigrationAggregate.java | 67 +
.../internal/command/handler/SampleAggregate.java | 68 +
.../internal/mapper/EmailConfigurationMapper.java | 49 +
.../internal/mapper/SMSConfigurationMapper.java | 47 +
.../service/internal/mapper/SampleMapper.java | 46 +
.../repository/EmailGatewayConfiguration.java | 124 +
.../EmailGatewayConfigurationRepository.java | 29 +
.../repository/SMSGatewayConfiguration.java | 94 +
.../SMSGatewayConfigurationRepository.java | 29 +
.../internal/repository/SampleJpaEntity.java | 64 +
.../repository/SampleJpaEntityRepository.java | 28 +
.../service/internal/service/EmailSender.java | 60 +
.../service/internal/service/SMSSender.java | 58 +
.../service/internal/service/SampleService.java | 48 +
.../service/listener/AccountingEventListener.java | 124 +
.../service/listener/ChequeEventListener.java | 85 +
.../service/listener/CustomerEventListener.java | 200 +
.../service/listener/DepositEventListener.java | 61 +
.../service/listener/IdentityEventListener.java | 87 +
.../service/listener/OfficeEventListener.java | 136 +
.../service/listener/PayrollEventListener.java | 61 +
.../service/listener/PortfolioEventListener.java | 149 +
.../service/listener/TellerEventListener.java | 146 +
.../service/rest/NotificationRestController.java | 119 +
service/src/main/resources/application.yml | 81 +
service/src/main/resources/bootstrap.yml | 22 +
.../db/migrations/mariadb/V1__initial_setup.sql | 72 +
settings.gradle | 23 +
shared.gradle | 111 +
system-analysis.mdj | 4104 ++++++++++++++++++++
75 files changed, 8523 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..99b514a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+.gradle
+.idea
+build/
+target/
+detail
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+*.iml
+
+*.log
+
+*.toDelete
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..1ee78cd
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,49 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+language: java
+
+jdk: oraclejdk8
+
+sudo: enabled
+
+branches:
+ only:
+ - develop
+
+
+cache:
+ directories:
+ - $HOME/.m2
+
+install:
+ - gradle install
+
+notifications:
+ email: true
+
+ deploy:
+ -
+ on:
+ branch: develop
+ provider: bintray
+ skip_cleanup: true
+ #file: target/bin/bintray.json
+ user: ebenezergraham
+ # key: $BINTRAY_API_KEY
\ No newline at end of file
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..41f69b8
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Notification
+Copyright [2017-2018] The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/api/build.gradle b/api/build.gradle
new file mode 100644
index 0000000..5b9924a
--- /dev/null
+++ b/api/build.gradle
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
+ }
+}
+
+plugins {
+ id "com.github.hierynomus.license" version "0.13.1"
+ id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+dependencies {
+ compile(
+ [group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign'],
+ [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+ [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
+ [group: 'org.hibernate', name: 'hibernate-validator-annotation-processor', version: versions.validator]
+ )
+
+ testCompile(
+ [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+ )
+}
+
+publishing {
+ publications {
+ api(MavenPublication) {
+ from components.java
+ groupId project.group
+ artifactId project.name
+ version project.version
+ }
+ }
+}
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class
new file mode 100644
index 0000000..a1dee5e
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class
new file mode 100644
index 0000000..a197a0a
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class
new file mode 100644
index 0000000..741d5f5
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class
new file mode 100644
index 0000000..dd410b5
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class
new file mode 100644
index 0000000..afe7f46
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class
new file mode 100644
index 0000000..f7e3f18
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class
new file mode 100644
index 0000000..818a105
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class
new file mode 100644
index 0000000..6b2a09d
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class differ
diff --git a/api/settings.gradle b/api/settings.gradle
new file mode 100644
index 0000000..491f745
--- /dev/null
+++ b/api/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'api'
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
new file mode 100644
index 0000000..a854460
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1;
+
+@SuppressWarnings("unused")
+public interface PermittableGroupIds {
+ String SAMPLE_MANAGEMENT = "notification__v1__samples";
+ String SELF_MANAGEMENT = "notification__v1__self";
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
new file mode 100644
index 0000000..9265ed4
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+@SuppressWarnings("WeakerAccess")
+public class IamATeapotException extends RuntimeException {
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
new file mode 100644
index 0000000..6d0a7b1
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import java.util.List;
+import org.apache.fineract.cn.api.annotation.ThrowsException;
+import org.apache.fineract.cn.api.util.CustomFeignClientsConfiguration;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@SuppressWarnings("unused")
+@FeignClient(value="notification-v1", path="/notification/v1", configuration = CustomFeignClientsConfiguration.class)
+public interface NotificationManager {
+
+ @RequestMapping(
+ value = "/notification",
+ method = RequestMethod.GET,
+ produces = MediaType.ALL_VALUE,
+ consumes = MediaType.APPLICATION_JSON_VALUE
+ )
+ List<Sample> findAllEntities();
+
+ @RequestMapping(
+ value = "/notification/{identifier}",
+ method = RequestMethod.GET,
+ produces = MediaType.ALL_VALUE,
+ consumes = MediaType.APPLICATION_JSON_VALUE)
+ Sample getEntity(@PathVariable("identifier") final String identifier);
+
+ @RequestMapping(
+ value = "/notification",
+ method = RequestMethod.POST,
+ produces = MediaType.APPLICATION_JSON_VALUE,
+ consumes = MediaType.APPLICATION_JSON_VALUE
+ )
+ @ThrowsException(status = HttpStatus.I_AM_A_TEAPOT, exception = IamATeapotException.class)
+ void createEntity(final Sample sample);
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
new file mode 100644
index 0000000..24aa0dc
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class EmailConfiguration {
+ @ValidIdentifier
+ private String identifier;
+ @Length(max = 512)
+ private String payload;
+ @Length(max = 512)
+ private String host;
+ @Length(max = 512)
+ private String port;
+ @Length(max = 512)
+ private String username;
+ @Length(max = 512)
+ private String app_id;
+ @Length(max = 512)
+ private String smtp_auth;
+ @Length(max = 512)
+ private String start_tls;
+ @Length(max = 512)
+ private String option;
+
+ public EmailConfiguration(){
+ super();
+ }
+
+ public static EmailConfiguration create (String identifier, String payload,
+ String host, String port,
+ String username, String app_id,
+ String smtp_auth, String start_tls,
+ String option) {
+ EmailConfiguration emailConfiguration = new EmailConfiguration();
+ emailConfiguration.setIdentifier(identifier);
+ emailConfiguration.setPayload(payload);
+ emailConfiguration.setHost(host);
+ emailConfiguration.setPort(port);
+ emailConfiguration.setUsername(username);
+ emailConfiguration.setApp_id(app_id);
+ emailConfiguration.setSmtp_auth(smtp_auth);
+ emailConfiguration.setStart_tls(start_tls);
+ emailConfiguration.setOption(option);
+ return emailConfiguration;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getApp_id() {
+ return app_id;
+ }
+
+ public void setApp_id(String app_id) {
+ this.app_id = app_id;
+ }
+
+ public String getSmtp_auth() {
+ return smtp_auth;
+ }
+
+ public void setSmtp_auth(String smtp_auth) {
+ this.smtp_auth = smtp_auth;
+ }
+
+ public String getStart_tls() {
+ return start_tls;
+ }
+
+ public void setStart_tls(String start_tls) {
+ this.start_tls = start_tls;
+ }
+
+ public String getOption() {
+ return option;
+ }
+
+ public void setOption(String option) {
+ this.option = option;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EmailConfiguration that = (EmailConfiguration) o;
+ return Objects.equals(identifier, that.identifier) &&
+ Objects.equals(payload, that.payload) &&
+ Objects.equals(host, that.host) &&
+ Objects.equals(port, that.port) &&
+ Objects.equals(username, that.username) &&
+ Objects.equals(app_id, that.app_id) &&
+ Objects.equals(smtp_auth, that.smtp_auth) &&
+ Objects.equals(start_tls, that.start_tls) &&
+ Objects.equals(option, that.option);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(identifier, payload, host, port, username,
+ app_id, smtp_auth, start_tls, option);
+ }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
new file mode 100644
index 0000000..cef7f57
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class SMSConfiguration {
+ @ValidIdentifier
+ private String identifier;
+ @Length(max = 512)
+ private String payload;
+ @Length(max = 512)
+ private String organisation;
+ @Length(max = 512)
+ private String auth_token;
+ @Length(max = 512)
+ private String accountid;
+ @Length(max = 256)
+ private String option;
+
+ public SMSConfiguration() {
+ super();
+ }
+
+ public static SMSConfiguration create(String identifier, String payload, String organisation, String auth_token, String accountid, String option) {
+ SMSConfiguration smsconfiguration = new SMSConfiguration();
+ smsconfiguration.setIdentifier(identifier);
+ smsconfiguration.setPayload(payload);
+ smsconfiguration.setOrganisation(organisation);
+ smsconfiguration.setAuth_token(auth_token);
+ smsconfiguration.setAccountid(accountid);
+ smsconfiguration.setOption(option);
+ return smsconfiguration;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+
+ public String getOrganisation() {
+ return organisation;
+ }
+
+ public void setOrganisation(String organisation) {
+ this.organisation = organisation;
+ }
+
+ public String getAuth_token() {
+ return auth_token;
+ }
+
+ public void setAuth_token(String auth_token) {
+ this.auth_token = auth_token;
+ }
+
+ public String getAccountid() {
+ return accountid;
+ }
+
+ public void setAccountid(String accountid) {
+ this.accountid = accountid;
+ }
+
+ public String getOption() {
+ return option;
+ }
+
+ public void setOption(String option) {
+ this.option = option;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SMSConfiguration that = (SMSConfiguration) o;
+ return Objects.equals(identifier, that.identifier) &&
+ Objects.equals(payload, that.payload) &&
+ Objects.equals(organisation, that.organisation) &&
+ Objects.equals(auth_token, that.auth_token) &&
+ Objects.equals(accountid, that.accountid) &&
+ Objects.equals(option, that.option);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(identifier, payload, organisation, auth_token, accountid, option);
+ }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
new file mode 100644
index 0000000..644dda9
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.Objects;
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class Sample {
+ @ValidIdentifier
+ private String identifier;
+ @Length(max = 512)
+ private String payload;
+
+ public Sample() {
+ super();
+ }
+
+ public static Sample create(final String identifier, final String payload) {
+ final Sample sample = new Sample();
+ sample.setIdentifier(identifier);
+ sample.setPayload(payload);
+ return sample;
+ }
+
+ public String getIdentifier() {
+ return this.identifier;
+ }
+
+ public void setIdentifier(final String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Sample sample = (Sample) o;
+ return Objects.equals(identifier, sample.identifier) &&
+ Objects.equals(payload, sample.payload);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(identifier, payload);
+ }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
new file mode 100644
index 0000000..39c6eb0
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.events;
+
+@SuppressWarnings("unused")
+public interface NotificationEventConstants {
+
+ String DESTINATION = "notification-v1";
+ String SELECTOR_NAME = "action";
+ String INITIALIZE = "initialize";
+ String POST_SAMPLE = "post-sample";
+ String SELECTOR_INITIALIZE = SELECTOR_NAME + " = '" + INITIALIZE + "'";
+ String SELECTOR_POST_SAMPLE = SELECTOR_NAME + " = '" + POST_SAMPLE + "'";
+
+}
diff --git a/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
new file mode 100644
index 0000000..65cd1ac
--- /dev/null
+++ b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.fineract.cn.test.domain.ValidationTest;
+import org.apache.fineract.cn.test.domain.ValidationTestCase;
+import org.junit.runners.Parameterized;
+
+public class SampleTest extends ValidationTest<Sample> {
+
+ public SampleTest(ValidationTestCase<Sample> testCase) {
+ super(testCase);
+ }
+
+ @Override
+ protected Sample createValidTestSubject() {
+ return Sample.create("xxxx", "yyy");
+ }
+
+ @Parameterized.Parameters
+ public static Collection testCases() {
+ final Collection<ValidationTestCase> ret = new ArrayList<>();
+ ret.add(new ValidationTestCase<Sample>("basicCase")
+ .adjustment(x -> {})
+ .valid(true));
+ ret.add(new ValidationTestCase<Sample>("nullIdentifier")
+ .adjustment(x -> x.setIdentifier(null))
+ .valid(false));
+ ret.add(new ValidationTestCase<Sample>("tooShortIdentifier")
+ .adjustment(x -> x.setIdentifier("z"))
+ .valid(false));
+ ret.add(new ValidationTestCase<Sample>("tooLongPayload")
+ .adjustment(x -> x.setPayload(RandomStringUtils.randomAlphanumeric(513)))
+ .valid(false));
+ return ret;
+ }
+
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ca2370a
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+
+task publishApiToMavenLocal {
+ dependsOn gradle.includedBuild('api').task(':publishToMavenLocal')
+}
+
+task publishServiceToMavenLocal {
+ mustRunAfter publishApiToMavenLocal
+ dependsOn gradle.includedBuild('service').task(':publishToMavenLocal')
+}
+
+task publishComponentTestToMavenLocal {
+ mustRunAfter publishApiToMavenLocal
+ mustRunAfter publishServiceToMavenLocal
+ dependsOn gradle.includedBuild('component-test').task(':publishToMavenLocal')
+}
+
+task publishToMavenLocal {
+ group 'all'
+ dependsOn publishApiToMavenLocal
+ dependsOn publishServiceToMavenLocal
+ dependsOn publishComponentTestToMavenLocal
+}
+
+task prepareForTest {
+ group 'all'
+ dependsOn publishToMavenLocal
+ dependsOn gradle.includedBuild('component-test').task(':build')
+}
+
+task licenseFormat {
+ group 'all'
+ dependsOn gradle.includedBuild('api').task(':licenseFormat')
+ dependsOn gradle.includedBuild('service').task(':licenseFormat')
+ dependsOn gradle.includedBuild('component-test').task(':licenseFormat')
+}
+
+task rat {
+ group 'all'
+ dependsOn gradle.includedBuild('api').task(':rat')
+ dependsOn gradle.includedBuild('service').task(':rat')
+ dependsOn gradle.includedBuild('component-test').task(':rat')
+}
diff --git a/component-test/build.gradle b/component-test/build.gradle
new file mode 100644
index 0000000..0348f06
--- /dev/null
+++ b/component-test/build.gradle
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+ ext {
+ springBootVersion = '1.4.1.RELEASE'
+ }
+
+ repositories {
+ jcenter()
+ }
+
+ dependencies {
+ classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+ }
+}
+
+plugins {
+ id "com.github.hierynomus.license" version "0.13.1"
+ id("org.nosphere.apache.rat") version "0.3.1"
+}
+apply from: '../shared.gradle'
+
+dependencies {
+ compile(
+ [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+ [group: 'org.apache.fineract.cn.notification', name: 'service', version: project.version],
+ [group: 'org.apache.fineract.cn.anubis', name: 'test', version: versions.frameworkanubis],
+ [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+ [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+ [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+ [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+ )
+}
+
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ from components.java
+ }
+ }
+}
diff --git a/component-test/settings.gradle b/component-test/settings.gradle
new file mode 100644
index 0000000..a07a3bc
--- /dev/null
+++ b/component-test/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'component-test'
\ No newline at end of file
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
new file mode 100644
index 0000000..5f2b5f4
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.test.env.TestEnvironment;
+import org.apache.fineract.cn.test.fixture.cassandra.CassandraInitializer;
+import org.apache.fineract.cn.test.fixture.mariadb.MariaDBInitializer;
+import org.junit.ClassRule;
+import org.junit.rules.RuleChain;
+import org.junit.rules.RunExternalResourceOnce;
+import org.junit.rules.TestRule;
+
+/**
+ * This contains the database resources required by the test. They are in a separate
+ * class so that the test suite can initialize them before the classes it calls. This
+ * makes test runs faster and prevents tests from "stepping on each other's toes" when
+ * initializing and de-initializing external resources.
+ */
+public class SuiteTestEnvironment {
+ static final String APP_VERSION = "1";
+ static final String APP_NAME = "notification-v" + APP_VERSION;
+
+ static final TestEnvironment testEnvironment = new TestEnvironment(APP_NAME);
+ static final CassandraInitializer cassandraInitializer = new CassandraInitializer();
+ static final MariaDBInitializer mariaDBInitializer = new MariaDBInitializer();
+
+ @ClassRule
+ public static TestRule orderClassRules = RuleChain
+ .outerRule(new RunExternalResourceOnce(testEnvironment))
+ .around(new RunExternalResourceOnce(cassandraInitializer))
+ .around(new RunExternalResourceOnce(mariaDBInitializer));
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
new file mode 100644
index 0000000..3b2811e
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.notification.api.v1.client.NotificationManager;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import java.util.List;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.fineract.cn.anubis.test.v1.TenantApplicationSecurityEnvironmentTestRule;
+import org.apache.fineract.cn.api.context.AutoUserContext;
+import org.apache.fineract.cn.notification.service.NotificationConfiguration;
+import org.apache.fineract.cn.test.fixture.TenantDataStoreContextTestRule;
+import org.apache.fineract.cn.test.listener.EnableEventRecording;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.netflix.ribbon.RibbonClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class TestSample extends SuiteTestEnvironment {
+ private static final String LOGGER_NAME = "test-logger";
+ private static final String TEST_USER = "homer";
+
+
+ @Configuration
+ @EnableEventRecording
+ @EnableFeignClients(basePackages = {"org.apache.fineract.cn.notification.api.v1.client"})
+ @RibbonClient(name = APP_NAME)
+ @Import({NotificationConfiguration.class})
+ @ComponentScan("org.apache.fineract.cn.notification.listener")
+ public static class TestConfiguration {
+ public TestConfiguration() {
+ super();
+ }
+
+ @Bean(name = LOGGER_NAME)
+ public Logger logger() {
+ return LoggerFactory.getLogger(LOGGER_NAME);
+ }
+ }
+
+ @ClassRule
+ public final static TenantDataStoreContextTestRule tenantDataStoreContext = TenantDataStoreContextTestRule.forRandomTenantName(cassandraInitializer, mariaDBInitializer);
+
+ @Rule
+ public final TenantApplicationSecurityEnvironmentTestRule tenantApplicationSecurityEnvironment
+ = new TenantApplicationSecurityEnvironmentTestRule(testEnvironment, this::waitForInitialize);
+
+ private AutoUserContext userContext;
+
+ @Autowired
+ private NotificationManager testSubject;
+
+ @Autowired
+ private EventRecorder eventRecorder;
+
+ @SuppressWarnings("WeakerAccess")
+ @Autowired
+ @Qualifier(LOGGER_NAME)
+ Logger logger;
+
+ public TestSample() {
+ super();
+ }
+
+ @Before
+ public void prepTest() {
+ userContext = tenantApplicationSecurityEnvironment.createAutoUserContext(TestSample.TEST_USER);
+ }
+
+ @After
+ public void cleanTest() {
+ userContext.close();
+ eventRecorder.clear();
+ }
+
+ public boolean waitForInitialize() {
+ try {
+ return this.eventRecorder.wait(NotificationEventConstants.INITIALIZE, APP_VERSION);
+ } catch (final InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Test
+ public void shouldCreateSample() throws InterruptedException {
+ logger.info("Running test shouldCreateSample.");
+ final Sample sample = Sample.create(RandomStringUtils.randomAlphanumeric(8), RandomStringUtils.randomAlphanumeric(512));
+ this.testSubject.createEntity(sample);
+
+ Assert.assertTrue(this.eventRecorder.wait(NotificationEventConstants.POST_SAMPLE, sample.getIdentifier()));
+
+ final Sample createdSample = this.testSubject.getEntity(sample.getIdentifier());
+ Assert.assertEquals(sample, createdSample);
+ }
+
+ @Test
+ public void shouldListSamples() {
+ logger.info("Running test shouldListSamples.");
+ final List<Sample> allEntities = this.testSubject.findAllEntities();
+ Assert.assertNotNull(allEntities);
+ }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
new file mode 100644
index 0000000..a4d42bf
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ TestSample.class,
+ //TODO: when you create a new component test, add it here so you can run it with the suite.
+})
+public class TestSuite extends SuiteTestEnvironment {
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
new file mode 100644
index 0000000..c24b97c
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class MigrationEventListener {
+
+ private final EventRecorder eventRecorder;
+
+ @Autowired
+ public MigrationEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+ super();
+ this.eventRecorder = eventRecorder;
+ }
+
+ @JmsListener(
+ subscription = NotificationEventConstants.DESTINATION,
+ destination = NotificationEventConstants.DESTINATION,
+ selector = NotificationEventConstants.SELECTOR_INITIALIZE
+ )
+ public void onInitialization(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, NotificationEventConstants.INITIALIZE, payload, String.class);
+ }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
new file mode 100644
index 0000000..85abe9e
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class SampleEventListener {
+
+ private final EventRecorder eventRecorder;
+
+ @Autowired
+ public SampleEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+ super();
+ this.eventRecorder = eventRecorder;
+ }
+
+ @JmsListener(
+ subscription = NotificationEventConstants.DESTINATION,
+ destination = NotificationEventConstants.DESTINATION,
+ selector = NotificationEventConstants.SELECTOR_POST_SAMPLE
+ )
+ public void onCreateSample(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, NotificationEventConstants.POST_SAMPLE, payload, String.class);
+ }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..400f155
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c563c1a
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri May 18 16:18:58 MUT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..4453cce
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save ( ) {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/service/build.gradle b/service/build.gradle
new file mode 100644
index 0000000..57f507d
--- /dev/null
+++ b/service/build.gradle
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+ ext {
+ springBootVersion = '1.4.1.RELEASE'
+ }
+
+ repositories {
+ jcenter()
+ }
+
+ dependencies {
+ classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+ }
+}
+
+plugins {
+ id "com.github.hierynomus.license" version "0.13.1"
+ id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+apply plugin: 'spring-boot'
+
+springBoot {
+ executable = true
+ classifier = 'boot'
+}
+
+dependencies {
+ compile(
+ [group: 'com.twilio.sdk', name: 'twilio', version: '7.17.+'],
+ [group: 'org.apache.fineract.cn.customer', name: 'api', version: versions.fineractcncustomer],
+ [group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'],
+ [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
+ [group: 'org.springframework.boot', name: 'spring-boot-starter-jetty'],
+ //check this dependency
+ [group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.4.3.RELEASE'],
+ [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+ [group: 'org.apache.fineract.cn.anubis', name: 'library', version: versions.frameworkanubis],
+ [group: 'com.google.code.gson', name: 'gson'],
+ [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+ [group: 'org.apache.fineract.cn', name: 'async', version: versions.frameworkasync],
+ [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
+ [group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
+ [group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
+ [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator]
+ )
+}
+
+publishToMavenLocal.dependsOn bootRepackage
+
+publishing {
+ publications {
+ service(MavenPublication) {
+ from components.java
+ groupId project.group
+ artifactId project.name
+ version project.version
+ }
+ bootService(MavenPublication) {
+ // "boot" jar
+ artifact ("$buildDir/libs/$project.name-$version-boot.jar")
+ groupId project.group
+ artifactId ("$project.name-boot")
+ version project.version
+ }
+ }
+}
diff --git a/service/out/production/resources/application.yml b/service/out/production/resources/application.yml
new file mode 100644
index 0000000..37acaaf
--- /dev/null
+++ b/service/out/production/resources/application.yml
@@ -0,0 +1,78 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+ cloud:
+ discovery:
+ enabled: false
+ config:
+ enabled: false
+
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:8761/eureka/
+
+server:
+ port: 8081
+ contextPath: /notification/v1/*
+
+cassandra:
+ clusterName: staging_cluster
+ contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+ keyspace: seshat
+ cl:
+ read: LOCAL_QUORUM
+ write: LOCAL_QUORUM
+ delete: LOCAL_QUORUM
+
+mariadb:
+ driverClass: org.mariadb.jdbc.Driver
+ database: seshat
+ host: localhost
+ port: 3306
+ user: root
+ password: mysql
+
+bonecp:
+ idleMaxAgeInMinutes: 240
+ idleConnectionTestPeriodInMinutes: 60
+ maxConnectionsPerPartition: 10
+ minConnectionsPerPartition: 1
+ partitionCount: 2
+ acquireIncrement: 5
+ statementsCacheSize: 100
+
+async:
+ corePoolSize: 32
+ maxPoolSize: 16384
+ queueCapacity: 0
+ threadName: async-processor-
+
+flyway:
+ enabled: false
+
+fineract:
+ customer:
+ accountcreated:
+ message: Dear Valued Customer, Your account has been created.
+ accountclosed:
+ message: Dear Valued Customer, Your account has been successfully closed.
+
+
diff --git a/service/out/production/resources/bootstrap.yml b/service/out/production/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/out/production/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+ application:
+ name: notification-v1
diff --git a/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..ff9a61f
--- /dev/null
+++ b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,72 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `identifer` VARCHAR(45) NULL DEFAULT NULL,
+ `host` VARCHAR(45) NOT NULL,
+ `port` VARCHAR(45) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `app_id` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `identifier` VARCHAR(45) NULL DEFAULT NULL,
+ `accountsid` VARCHAR(255) NOT NULL,
+ `auth_token` VARCHAR(255) NOT NULL,
+ `option` VARCHAR(45) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ identifier VARCHAR(8) NOT NULL,
+ payload VARCHAR(512) NULL,
+ CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ identifier VARCHAR(8) NOT NULL,
+ payload VARCHAR(512) NULL,
+ CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/service/settings.gradle b/service/settings.gradle
new file mode 100644
index 0000000..1a4c2fd
--- /dev/null
+++ b/service/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'service'
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
new file mode 100644
index 0000000..5968d0d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.springframework.boot.SpringApplication;
+
+public class NotificationApplication {
+
+ public NotificationApplication() {
+ super();
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(NotificationConfiguration.class, args);
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
new file mode 100644
index 0000000..c38d6bd
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.apache.fineract.cn.anubis.config.EnableAnubis;
+import org.apache.fineract.cn.async.config.EnableAsync;
+import org.apache.fineract.cn.cassandra.config.EnableCassandra;
+import org.apache.fineract.cn.command.config.EnableCommandProcessing;
+import org.apache.fineract.cn.lang.config.EnableServiceException;
+import org.apache.fineract.cn.lang.config.EnableTenantContext;
+import org.apache.fineract.cn.mariadb.config.EnableMariaDB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.Properties;
+
+@SuppressWarnings("WeakerAccess")
+@Configuration
+@EnableAutoConfiguration
+@EnableDiscoveryClient
+@EnableAsync
+@EnableTenantContext
+@EnableCassandra
+@EnableMariaDB
+@EnableCommandProcessing
+@EnableAnubis
+@EnableServiceException
+@ConfigurationProperties(locations = {"details"})
+@ComponentScan({
+ "org.apache.fineract.cn.notification.service.rest",
+ "org.apache.fineract.cn.notification.service.internal.service",
+ "org.apache.fineract.cn.notification.service.internal.repository",
+ "org.apache.fineract.cn.notification.service.internal.command.handler"
+})
+@EnableJpaRepositories({
+ "org.apache.fineract.cn.notification.service.internal.repository"
+})
+public class NotificationConfiguration extends WebMvcConfigurerAdapter {
+
+ public NotificationConfiguration() {
+ super();
+ }
+
+ @Bean(name = ServiceConstants.LOGGER_NAME)
+ public Logger logger() {
+ return LoggerFactory.getLogger(ServiceConstants.LOGGER_NAME);
+ }
+
+ @Override
+ public void configurePathMatch(final PathMatchConfigurer configurer) {
+ configurer.setUseSuffixPatternMatch(Boolean.FALSE);
+ }
+
+
+
+ @Bean
+ @Qualifier("gmail")
+ public JavaMailSender getJavaMailSender() {
+
+ JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+ mailSender.setHost("smtp.gmail.com");
+ mailSender.setPort(587);
+
+ mailSender.setUsername("ebenezergraham69@gmail.com");
+ mailSender.setPassword("fdzmzbhbmtkafzvq");
+
+ Properties props = mailSender.getJavaMailProperties();
+ props.put("mail.transport.protocol", "smtp");
+ props.put("mail.smtp.auth", "true");
+ props.put("mail.smtp.starttls.enable", "true");
+ props.put("mail.debug", "true");
+
+ return mailSender;
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
new file mode 100644
index 0000000..cb4e902
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+public interface ServiceConstants {
+ String LOGGER_NAME = "rest-logger";
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
new file mode 100644
index 0000000..21335ac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+public class InitializeServiceCommand {
+
+ public InitializeServiceCommand() {
+ super();
+ }
+
+ @Override
+ public String toString() {
+ return "InitializeServiceCommand{}";
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
new file mode 100644
index 0000000..3fa3aac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+
+public class SampleCommand {
+
+ private final Sample sample;
+
+ public SampleCommand(final Sample sample) {
+ super();
+ this.sample = sample;
+ }
+
+ public Sample sample() {
+ return this.sample;
+ }
+
+ @Override
+ public String toString() {
+ return "SampleCommand{" +
+ "sample=" + sample.getIdentifier() +
+ '}';
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
new file mode 100644
index 0000000..da7cc6e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import javax.sql.DataSource;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.lang.ApplicationName;
+import org.apache.fineract.cn.mariadb.domain.FlywayFactoryBean;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings({
+ "unused"
+})
+@Aggregate
+public class MigrationAggregate {
+
+ private final Logger logger;
+ private final DataSource dataSource;
+ private final FlywayFactoryBean flywayFactoryBean;
+ private final ApplicationName applicationName;
+
+ @Autowired
+ public MigrationAggregate(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+ final DataSource dataSource,
+ final FlywayFactoryBean flywayFactoryBean,
+ final ApplicationName applicationName) {
+ super();
+ this.logger = logger;
+ this.dataSource = dataSource;
+ this.flywayFactoryBean = flywayFactoryBean;
+ this.applicationName = applicationName;
+ }
+
+ @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+ @Transactional
+ @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.INITIALIZE)
+ public String initialize(final InitializeServiceCommand initializeServiceCommand) {
+ this.logger.debug("Start service migration.");
+ this.flywayFactoryBean.create(this.dataSource).migrate();
+ return this.applicationName.getVersionString();
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
new file mode 100644
index 0000000..a21589d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings("unused")
+@Aggregate
+public class SampleAggregate {
+
+ private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+ @Autowired
+ public SampleAggregate(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+ super();
+ this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+ }
+
+ //TODO: Think about your command handler logging, then delete this comment.
+ // The log levels provided in the command handler cause log messages to be emitted each time this
+ // command handler is called before and after the call. Before the call, the command is logged
+ // using its toString() method, and after the call, the emitted event is logged via its toString()
+ // method.
+ //
+ // If you wish to adjust the information in the log messages, do so via the toString() methods.
+ // Financial transactions, passwords, and customer address data are examples of information which
+ // should not be placed in the logs.
+ //
+ // If a command handler should not emit a log message, change logStart and logFinish to:
+ // CommandLogLevel.NONE.
+ @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+ @Transactional
+ @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.POST_SAMPLE)
+ public String sample(final SampleCommand sampleCommand) {
+
+ final SampleJpaEntity entity = new SampleJpaEntity();
+ entity.setIdentifier(sampleCommand.sample().getIdentifier());
+ entity.setPayload(sampleCommand.sample().getPayload());
+ this.sampleJpaEntityRepository.save(entity);
+
+ return sampleCommand.sample().getIdentifier();
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
new file mode 100644
index 0000000..10e4a86
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.EmailConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class EmailConfigurationMapper {
+
+ private EmailConfigurationMapper() {
+ super();
+ }
+
+ public static EmailConfiguration map(final EmailGatewayConfiguration emailGatewayConfiguration) {
+ final EmailConfiguration emailConfiguration = new EmailConfiguration();
+ emailConfiguration.setIdentifier(emailGatewayConfiguration.getIdentifier());
+ emailConfiguration.setHost(emailGatewayConfiguration.getHost());
+ emailConfiguration.setPort(emailGatewayConfiguration.getPort());
+ emailConfiguration.setUsername(emailGatewayConfiguration.getUsername());
+ emailConfiguration.setApp_id(emailGatewayConfiguration.getApp_id());
+ return emailConfiguration;
+ }
+
+// public static List<EmailGatewayConfiguration> map(final List<EmailGatewayConfiguration> emailGatewayConfiguration) {
+// final ArrayList<EmailGatewayConfiguration> entities = new ArrayList<>(emailGatewayConfiguration.size());
+// entities.addAll(emailGatewayConfiguration.stream().map(EmailGatewayConfiguration::map).collect(Collectors.toList()));
+// return entities;
+// }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
new file mode 100644
index 0000000..43e6c1c
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.SMSConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.SMSGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SMSConfigurationMapper {
+
+ private SMSConfigurationMapper() {
+ super();
+ }
+
+ public static SMSConfiguration map(final SMSGatewayConfiguration smsGatewayConfiguration) {
+ final SMSConfiguration smsConfiguration = new SMSConfiguration();
+ smsConfiguration.setIdentifier(smsGatewayConfiguration.getIdentifier());
+ smsConfiguration.setAccountid(smsGatewayConfiguration.getAccountid());
+ smsConfiguration.setAuth_token(smsGatewayConfiguration.getAuth_token());
+ return smsConfiguration;
+ }
+
+// public static List<SMSGatewayConfiguration> map(final List<SMSGatewayConfiguration> smsGatewayConfiguration) {
+// final ArrayList<SMSGatewayConfiguration> entities = new ArrayList<>(smsGatewayConfiguration.size());
+// entities.addAll(smsGatewayConfiguration.stream().map(SMSConfigurationMapper::map).collect(Collectors.toList()));
+// return entities;
+// }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
new file mode 100644
index 0000000..a56b7aa
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SampleMapper {
+
+ private SampleMapper() {
+ super();
+ }
+
+ public static Sample map(final SampleJpaEntity sampleJpaEntity) {
+ final Sample sample = new Sample();
+ sample.setIdentifier(sampleJpaEntity.getIdentifier());
+ sample.setPayload(sampleJpaEntity.getPayload());
+ return sample;
+ }
+
+ public static List<Sample> map(final List<SampleJpaEntity> sampleJpaEntities) {
+ final ArrayList<Sample> samples = new ArrayList<>(sampleJpaEntities.size());
+ samples.addAll(sampleJpaEntities.stream().map(SampleMapper::map).collect(Collectors.toList()));
+ return samples;
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
new file mode 100644
index 0000000..c344708
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "email_gateway_configuration")
+public class EmailGatewayConfiguration {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "identifier")
+ private String identifier;
+ @Column(name = "host")
+ private String host;
+ @Column(name = "port")
+ private String port;
+ @Column(name = "username")
+ private String username;
+ @Column(name = "app_id")
+ private String app_id;
+ @Column(name = "smtp_auth")
+ private String smtp_auth;
+ @Column(name = "start_tls")
+ private String start_tls;
+ @Column(name = "option")
+ private String option;
+
+ public EmailGatewayConfiguration() {
+ super();
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return this.identifier;
+ }
+
+ public void setIdentifier(final String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getApp_id() {
+ return app_id;
+ }
+
+ public void setApp_id(String app_id) {
+ this.app_id = app_id;
+ }
+
+ public String getSmtp_auth() {
+ return smtp_auth;
+ }
+
+ public void setSmtp_auth(String smtp_auth) {
+ this.smtp_auth = smtp_auth;
+ }
+
+ public String getStart_tls() {
+ return start_tls;
+ }
+
+ public void setStart_tls(String start_tls) {
+ this.start_tls = start_tls;
+ }
+
+ public String getOption() {
+ return option;
+ }
+
+ public void setOption(String option) {
+ this.option = option;
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
new file mode 100644
index 0000000..b380def
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface EmailGatewayConfigurationRepository extends JpaRepository<EmailGatewayConfiguration, Long> {
+ Optional<EmailGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
new file mode 100644
index 0000000..770db6a
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "sms_gateway_configuration")
+public class SMSGatewayConfiguration {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "identifier")
+ private String identifier;
+ @Column(name = "organisation")
+ private String organisation;
+ @Column(name = "auth_token")
+ private String auth_token;
+ @Column(name = "accountid")
+ private String accountid;
+ @Column(name = "option")
+ private String option;
+
+ public SMSGatewayConfiguration() {
+ super();
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return this.identifier;
+ }
+
+ public void setIdentifier(final String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getOrganisation() {
+ return organisation;
+ }
+
+ public void setOrganisation(String organisation) {
+ this.organisation = organisation;
+ }
+
+ public String getAuth_token() {
+ return auth_token;
+ }
+
+ public void setAuth_token(String auth_token) {
+ this.auth_token = auth_token;
+ }
+
+ public String getAccountid() {
+ return accountid;
+ }
+
+ public void setAccountid(String accountid) {
+ this.accountid = accountid;
+ }
+
+ public String getOption() {
+ return option;
+ }
+
+ public void setOption(String option) {
+ this.option = option;
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
new file mode 100644
index 0000000..7daae78
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SMSGatewayConfigurationRepository extends JpaRepository<SMSGatewayConfiguration, Long> {
+ Optional<SMSGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
new file mode 100644
index 0000000..f740d85
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "template_samples")
+public class SampleJpaEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "identifier")
+ private String identifier;
+ @Column(name = "payload")
+ private String payload;
+
+ public SampleJpaEntity() {
+ super();
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return this.identifier;
+ }
+
+ public void setIdentifier(final String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
new file mode 100644
index 0000000..b4d8abd
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SampleJpaEntityRepository extends JpaRepository<SampleJpaEntity, Long> {
+ Optional<SampleJpaEntity> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
new file mode 100644
index 0000000..bebb3c9
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+
+import org.apache.fineract.cn.notification.service.internal.mapper.EmailConfigurationMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfigurationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class EmailSender {
+
+ @Autowired
+ @Qualifier("gmail")
+ private JavaMailSender sender;
+
+ private final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository;
+
+ @Autowired
+ public EmailSender(final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository) {
+ super();
+ this.emailGatewayConfigurationRepository = emailGatewayConfigurationRepository;
+ }
+
+// public Optional<EmailGatewayConfiguration> findByIdentifier(final String identifier) {
+// return this.emailGatewayConfigurationRepository.findByIdentifier(identifier).map(EmailGatewayConfiguration::map);
+// }
+
+ public void sendEmail(String to, String subject, String message) {
+ SimpleMailMessage mail = new SimpleMailMessage();
+ mail.setTo(to);
+ mail.setSubject(subject);
+ mail.setText(message);
+ sender.send(mail);
+ }
+
+}
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
new file mode 100644
index 0000000..d626b22
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+
+import com.twilio.Twilio;
+import com.twilio.rest.api.v2010.account.Message;
+import com.twilio.type.PhoneNumber;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import com.twilio.rest.api.v2010.account.MessageCreator;
+import org.springframework.stereotype.Service;
+
+@Service
+@ConfigurationProperties(prefix ="smssender")
+public class SMSSender {
+
+ //@Value(value = "${smssender.accountSID}")
+ public String ACCOUNT_SID = "AC1fde2c6f26f367b93231c5fdb944c908";
+
+ //@Value("${smssender.authToken}")
+ public String AUTH_TOKEN = "bc9a53e41745b8471e0ecafc859d86aa";
+
+ //@Value("${smssender.senderNumber}")
+ public String sender = "+1 510-944-1898";
+
+ //@Value("${fineract.customer.accountcreated}")
+
+ public String template = "Test from the demo-server";
+
+ public void sendSMS(String receiver, String template) {
+
+ Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
+
+ MessageCreator messageCreator = Message.creator(ACCOUNT_SID,new PhoneNumber(receiver), new PhoneNumber(sender), template);
+ Message message = messageCreator.create();
+ System.out.println(message.getSid());
+ System.out.println(message.getStatus());
+ }
+
+ }
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
new file mode 100644
index 0000000..a0e4f71
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.mapper.SampleMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class SampleService {
+
+ private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+ @Autowired
+ public SampleService(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+ super();
+ this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+ }
+
+ public List<Sample> findAllEntities() {
+ return SampleMapper.map(this.sampleJpaEntityRepository.findAll());
+ }
+
+ public Optional<Sample> findByIdentifier(final String identifier) {
+ return this.sampleJpaEntityRepository.findByIdentifier(identifier).map(SampleMapper::map);
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
new file mode 100644
index 0000000..9266b89
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
@@ -0,0 +1,124 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ package org.apache.fineract.cn.notification.service.listener;
+
+ import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+ import org.apache.fineract.cn.accounting.service.internal.service.AccountService;
+ import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+ import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+ import org.springframework.beans.factory.annotation.Autowired;
+ import org.springframework.jms.annotation.JmsListener;
+ import org.springframework.messaging.handler.annotation.Header;
+ import org.springframework.stereotype.Component;
+ import org.apache.fineract.cn.accounting.api.v1.EventConstants;
+
+
+@SuppressWarnings("unused")
+@Component
+public class AccountingEventListener {
+
+
+ @Autowired
+ public AccountingEventListener( final AccountService accountingManager) {
+ this.accountService = accountingManager;
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onCreateAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant, final String payload) {
+ accountService.findAccount(tenant);
+ String receiver = "";
+ String template = "";
+ smsSender.sendSMS(receiver,template);
+ emailSender.sendEmail(receiver,"Hello", "You account has been created");
+ }
+
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onChangeAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account modified.");
+ this.eventRecorder.event(tenant, EventConstants.PUT_ACCOUNT, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CLOSE_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onCloseAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account closed.");
+ this.eventRecorder.event(tenant, EventConstants.CLOSE_ACCOUNT, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_LOCK_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onLockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account locked.");
+ this.eventRecorder.event(tenant, EventConstants.LOCK_ACCOUNT, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_UNLOCK_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onUnlockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account unlocked.");
+ this.eventRecorder.event(tenant, EventConstants.UNLOCK_ACCOUNT, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_REOPEN_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onReopenAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account reopened.");
+ this.eventRecorder.event(tenant, EventConstants.REOPEN_ACCOUNT, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DELETE_ACCOUNT,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onDeleteAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Account deleted.");
+ this.eventRecorder.event(tenant, EventConstants.DELETE_ACCOUNT, payload, String.class);
+ }
+
+}
+ */
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
new file mode 100644
index 0000000..97dd5e2
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.cheque.AbstractChequeTest;
+import org.apache.fineract.cn.cheque.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ChequeEventListener {
+
+ private final Logger logger;
+
+ public ChequeEventListener(@Qualifier(AbstractChequeTest.TEST_LOGGER) final Logger logger) {
+ super();
+ this.logger = logger;
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_ISSUE_CHEQUES,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onIssueCheques(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Cheques issued.");
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onChequeTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Cheque transaction processed.");
+ this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_APPROVED,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onChequeApproved(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Cheque transaction approved.");
+ this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_APPROVED, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_CANCELED,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onChequeCanceled(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Cheque transaction canceled.");
+ this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_CANCELED, payload, String.class);
+ }
+
+}
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
new file mode 100644
index 0000000..73d3d1d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -0,0 +1,200 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.customer.api.v1.CustomerEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.customer.api.v1.client.CustomerManager;
+import org.apache.fineract.cn.customer.api.v1.domain.ContactDetail;
+import org.apache.fineract.cn.customer.api.v1.domain.Customer;
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class CustomerEventListener {
+
+ private CustomerManager customerManager;
+ private SMSSender smsSender;
+ private EmailSender emailSender;
+
+ @Autowired
+ public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender,
+ final EmailSender emailSender ) {
+ this.customerManager = customerManager;
+ this.smsSender = smsSender;
+ this.emailSender = emailSender;
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_POST_CUSTOMER
+ )
+ public void customerCreatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ Customer customer = customerManager.findCustomer(payload);
+ if (customer.getContactDetails().size() > 0) {
+ customer.getContactDetails().forEach(contactDetail -> {
+ if (contactDetail.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ // TODO: pass receiver number for templating and localization.
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been created");
+ } else if (contactDetail.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been created");
+ }
+ });
+ }
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_ACTIVATE_CUSTOMER
+ )
+ public void customerActivatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ Customer customer = customerManager.findCustomer(payload);
+ if(customer.getCurrentState().equalsIgnoreCase("ACTIVE")){
+ customer.getContactDetails().forEach(contact-> {
+ if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Activated");
+ } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Activated");
+ }
+ });
+ }
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_LOCK_CUSTOMER
+ )
+ public void customerLockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ Customer customer = customerManager.findCustomer(payload);
+ if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+ customer.getContactDetails().forEach(contact-> {
+ if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Locked");
+ } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Locked");
+ }
+ });
+ }
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_UNLOCK_CUSTOMER
+ )
+ public void customerUnlockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ Customer customer = customerManager.findCustomer(payload);
+ if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+ customer.getContactDetails().forEach(contact-> {
+ if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Unlocked");
+ } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Unlocked");
+ }
+ });
+ }
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_CLOSE_CUSTOMER
+ )
+ public void customerClosedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ Customer customer = customerManager.findCustomer(payload);
+ if(customer.getCurrentState().equalsIgnoreCase("CLOSED")){
+ customer.getContactDetails().forEach(contact-> {
+ if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Closed");
+ } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Closed");
+ }
+ });
+ }
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_REOPEN_CUSTOMER
+ )
+ public void customerReopenedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ Customer customer = customerManager.findCustomer(payload);
+ if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+ customer.getContactDetails().forEach(contact-> {
+ if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+ String receiverNumber = customer.getContactDetails().get(0).getValue();
+ smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been reopened");
+ } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+ String emailAddress = customer.getContactDetails().get(0).getValue();
+ // TODO: pass email address for templating and localization.
+ emailSender.sendEmail(emailAddress, "Account Reopened", "Dear Valued Customer, Your account has been reopened");
+ }
+ });
+ }
+ }
+
+/*
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_PUT_ADDRESS
+ )
+ public void addressChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, CustomerEventConstants.PUT_ADDRESS, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = CustomerEventConstants.DESTINATION,
+ selector = CustomerEventConstants.SELECTOR_PUT_IDENTIFICATION_CARD
+ )
+ public void identificationCardChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, CustomerEventConstants.PUT_IDENTIFICATION_CARD, payload, String.class);
+ }
+
+
+*/
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
new file mode 100644
index 0000000..fa66ace
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.deposit.listener;
+
+import org.apache.fineract.cn.deposit.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DepositEventListener {
+
+
+ @Autowired
+ public DepositEventListener() {
+ super();
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_INTEREST_ACCRUED,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onAccrual(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DIVIDEND_DISTRIBUTION,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onDividendDistribution(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Dividend distributed for product {}.", payload);
+ this.eventRecorder.event(tenant, EventConstants.DIVIDEND_DISTRIBUTION, payload, String.class);
+ }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
new file mode 100644
index 0000000..142f138
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.identity.api.v1.events.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class IdentityEventListener {
+
+ private IdentityManager identityManager;
+
+ @Autowired
+ public IdentityEventListener( final IdentityManager identityManager) {
+ this.identityManager = identityManager;
+ }
+
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_USER
+ )
+ public void onCreateUser(
+ @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+ final String payload) throws Exception {
+ eventRecorder.event(tenant, EventConstants.OPERATION_POST_USER, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_USER_ROLEIDENTIFIER
+ )
+ public void onChangeUserRole(
+ @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+ final String payload) throws Exception {
+ eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_ROLEIDENTIFIER, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_USER_PASSWORD
+ )
+ public void onChangeUserPassword(
+ @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+ final String payload) throws Exception {
+ eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_PASSWORD, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_AUTHENTICATE
+ )
+ public void onAuthentication(
+ @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+ final String payload) throws Exception {
+ eventRecorder.event(tenant, EventConstants.OPERATION_AUTHENTICATE, payload, String.class);
+ }
+
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
new file mode 100644
index 0000000..9f083c5
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.apache.fineract.cn.office.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.office.api.v1.client.OrganizationManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OfficeEventListener {
+
+ private OrganizationManager organizationManager;
+ private SMSSender smsSender;
+ private EmailSender emailSender;
+
+ @Autowired
+ public OfficeEventListener(final OrganizationManager organizationManager, SMSSender smsSender,
+ final EmailSender emailSender) {
+ this.organizationManager = organizationManager;
+ this.smsSender = smsSender;
+ this.emailSender = emailSender;
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_OFFICE
+ )
+ public void onCreateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ //for testing purposes
+ String office = this.organizationManager.findOfficeByIdentifier(payload).getName();
+ if (office.equalsIgnoreCase("Head Office")) {
+ smsSender.sendSMS("+23058409206", "Test From Demo");
+ }
+ }
+}
+
+/*
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_EMPLOYEE
+ )
+ public void onCreateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String eventPayload) throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_POST_EMPLOYEE, eventPayload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_EMPLOYEE
+ )
+ public void onUpdateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String eventPayload) throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_EMPLOYEE, eventPayload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DELETE_EMPLOYEE
+ )
+ public void onDeleteEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String eventPayload) throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_EMPLOYEE, eventPayload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_CONTACT_DETAIL
+ )
+ public void onSetContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String eventPayload) throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_CONTACT_DETAIL, eventPayload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DELETE_CONTACT_DETAIL
+ )
+ public void onDeleteContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String eventPayload) throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_CONTACT_DETAIL, eventPayload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DELETE_OFFICE
+ )
+ public void onDeleteOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload)
+ throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_OFFICE, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_OFFICE
+ )
+ public void onUpdateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload)
+ throws Exception {
+ this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_OFFICE, payload, String.class);
+ }
+
+}
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
new file mode 100644
index 0000000..ce4cc70
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
@@ -0,0 +1,61 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ /*
+package org.apache.fineract.cn.payroll.listener;
+
+import org.apache.fineract.cn.payroll.api.v1.EventConstants;
+import org.apache.fineract.cn.payroll.service.ServiceConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PayrollEventListener {
+
+ private final Logger logger;
+ private final EventRecorder eventRecorder;
+
+ @Autowired
+ public PayrollEventListener(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+ final EventRecorder eventRecorder) {
+ super();
+ this.logger = logger;
+ this.eventRecorder = eventRecorder;
+ }
+
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_DISTRIBUTION
+ )
+ public void onPostCollection(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.info("Payment distribution with source account {0} processed.", payload);
+ this.eventRecorder.event(tenant, EventConstants.POST_DISTRIBUTION, payload, String.class);
+ }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
new file mode 100644
index 0000000..758e7f0
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -0,0 +1,149 @@
+package org.apache.fineract.cn.notification.service.listener;/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ /*
+import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Component;
+import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
+
+@SuppressWarnings("unused")
+@Component
+public class PortfolioEventListener {
+
+ @Autowired
+ public PortfolioEventListener() {
+ super();
+ //PortfolioManager portfolioManager = new PortfolioManager();
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_DENY_INDIVIDUALLOAN_CASE
+ )
+ public void onDeny(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_APPROVE_INDIVIDUALLOAN_CASE
+ )
+ public void onApprove(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE
+ )
+ public void onAcceptPayment(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ }
+
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_DISBURSE_INDIVIDUALLOAN_CASE
+ )
+ public void onDisburse(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_CHECK_LATE_INDIVIDUALLOAN_CASE
+ )
+ public void onCheckLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_OPEN_INDIVIDUALLOAN_CASE
+ )
+ public void onOpen(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_MARK_LATE_INDIVIDUALLOAN_CASE
+ )
+ public void onMarkLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+
+ }
+
+ @JmsListener(
+ subscription = IndividualLoanEventConstants.DESTINATION,
+ destination = IndividualLoanEventConstants.DESTINATION,
+ selector = IndividualLoanEventConstants.SELECTOR_CLOSE_INDIVIDUALLOAN_CASE
+ )
+ public void onClose(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ }
+
+
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_GROUP
+ )
+ public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, EventConstants.POST_GROUP, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_ACTIVATE_GROUP
+ )
+ public void onGroupActivated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, EventConstants.ACTIVATE_GROUP, payload, String.class);
+ }
+
+ @JmsListener(
+ subscription = EventConstants.DESTINATION,
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_GROUP
+ )
+ public void onGroupUpdated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.eventRecorder.event(tenant, EventConstants.PUT_GROUP, payload, String.class);
+ }
+
+ }
+ */
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
new file mode 100644
index 0000000..5b461be
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ /*
+package org.apache.fineract.cn.teller.listener;
+
+import org.apache.fineract.cn.teller.AbstractTellerTest;
+import org.apache.fineract.cn.teller.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TellerEventListener {
+
+ private final Logger logger;
+ private final EventRecorder eventRecorder;
+
+ public TellerEventListener(@Qualifier(AbstractTellerTest.LOGGER_NAME) final Logger logger,
+ final EventRecorder eventRecorder) {
+ super();
+ this.logger = logger;
+ this.eventRecorder = eventRecorder;
+ }
+
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_POST_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onCreate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.POST_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PUT_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onChange(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.PUT_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_OPEN_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onOpen(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.OPEN_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CLOSE_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onClose(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.CLOSE_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_AUTHENTICATE_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onAuthenticate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.AUTHENTICATE_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_PAUSE_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onPause(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.PAUSE_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_CONFIRM_TRANSACTION,
+ subscription = EventConstants.DESTINATION
+ )
+ public void confirmTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.CONFIRM_TRANSACTION, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_DELETE_TELLER,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onDeleteTeller(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.DELETE_TELLER, payload, String.class);
+ }
+
+ @JmsListener(
+ destination = EventConstants.DESTINATION,
+ selector = EventConstants.SELECTOR_SAVE_DENOMINATION,
+ subscription = EventConstants.DESTINATION
+ )
+ public void onSaveDenomination(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+ final String payload) {
+ this.logger.debug("Teller {} created.", payload);
+ this.eventRecorder.event(tenant, EventConstants.SAVE_DENOMINATION, payload, String.class);
+ }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
new file mode 100644
index 0000000..983b43e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.rest;
+
+import org.apache.fineract.cn.notification.api.v1.PermittableGroupIds;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.notification.service.internal.service.SampleService;
+import java.util.List;
+import javax.validation.Valid;
+import org.apache.fineract.cn.anubis.annotation.AcceptedTokenType;
+import org.apache.fineract.cn.anubis.annotation.Permittable;
+import org.apache.fineract.cn.command.gateway.CommandGateway;
+import org.apache.fineract.cn.lang.ServiceException;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@SuppressWarnings("unused")
+@RestController
+@RequestMapping("/")
+public class NotificationRestController {
+
+ private final Logger logger;
+ private final CommandGateway commandGateway;
+ private final SampleService sampleService;
+
+ @Autowired
+ public NotificationRestController(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+ final CommandGateway commandGateway,
+ final SampleService sampleService) {
+ super();
+ this.logger = logger;
+ this.commandGateway = commandGateway;
+ this.sampleService = sampleService;
+ }
+
+ @Permittable(value = AcceptedTokenType.SYSTEM)
+ @RequestMapping(
+ value = "/initialize",
+ method = RequestMethod.POST,
+ consumes = MediaType.ALL_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ ResponseEntity<Void> initialize() throws InterruptedException {
+ this.commandGateway.process(new InitializeServiceCommand());
+ return ResponseEntity.accepted().build();
+ }
+
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+ @RequestMapping(
+ value = "/sample",
+ method = RequestMethod.GET,
+ consumes = MediaType.ALL_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ List<Sample> findAllEntities() {
+ return this.sampleService.findAllEntities();
+ }
+
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+ @RequestMapping(
+ value = "/sample/{identifier}",
+ method = RequestMethod.GET,
+ consumes = MediaType.ALL_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ ResponseEntity<Sample> getEntity(@PathVariable("identifier") final String identifier) {
+ return this.sampleService.findByIdentifier(identifier)
+ .map(ResponseEntity::ok)
+ .orElseThrow(() -> ServiceException.notFound("Instance with identifier " + identifier + " doesn't exist."));
+ }
+
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+ @RequestMapping(
+ value = "/sample",
+ method = RequestMethod.POST,
+ consumes = MediaType.APPLICATION_JSON_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ ResponseEntity<Void> createEntity(@RequestBody @Valid final Sample instance) throws InterruptedException {
+ this.commandGateway.process(new SampleCommand(instance));
+ return ResponseEntity.accepted().build();
+ }
+}
diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml
new file mode 100644
index 0000000..ec163fc
--- /dev/null
+++ b/service/src/main/resources/application.yml
@@ -0,0 +1,81 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+ cloud:
+ discovery:
+ enabled: false
+ config:
+ enabled: false
+
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:8761/eureka/
+
+server:
+ port: 8081
+ contextPath: /notification/v1/*
+
+cassandra:
+ clusterName: staging_cluster
+ contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+ keyspace: seshat
+ cl:
+ read: LOCAL_QUORUM
+ write: LOCAL_QUORUM
+ delete: LOCAL_QUORUM
+
+mariadb:
+ driverClass: org.mariadb.jdbc.Driver
+ database: seshat
+ host: localhost
+ port: 3306
+ user: root
+ password: mysql
+
+bonecp:
+ idleMaxAgeInMinutes: 240
+ idleConnectionTestPeriodInMinutes: 60
+ maxConnectionsPerPartition: 10
+ minConnectionsPerPartition: 1
+ partitionCount: 2
+ acquireIncrement: 5
+ statementsCacheSize: 100
+
+async:
+ corePoolSize: 32
+ maxPoolSize: 16384
+ queueCapacity: 0
+ threadName: async-processor-
+
+flyway:
+ enabled: false
+
+fineract:
+ customer:
+ accountcreated:
+ message: Dear Valued Customer, Your account has been created.
+ accountclosed:
+ message: Dear Valued Customer, Your account has been successfully closed.
+
+smssender:
+ accountSID: AC1fde2c6f26f367b93231c5fdb944c908
+ authtoken: bc9a53e41745b8471e0ecafc859d86aa
+ senderNumber: +1 510-944-1898
diff --git a/service/src/main/resources/bootstrap.yml b/service/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/src/main/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+ application:
+ name: notification-v1
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..ff9a61f
--- /dev/null
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,72 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied. See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `identifer` VARCHAR(45) NULL DEFAULT NULL,
+ `host` VARCHAR(45) NOT NULL,
+ `port` VARCHAR(45) NOT NULL,
+ `username` VARCHAR(45) NOT NULL,
+ `app_id` VARCHAR(45) NOT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `identifier` VARCHAR(45) NULL DEFAULT NULL,
+ `accountsid` VARCHAR(255) NOT NULL,
+ `auth_token` VARCHAR(255) NOT NULL,
+ `option` VARCHAR(45) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ identifier VARCHAR(8) NOT NULL,
+ payload VARCHAR(512) NULL,
+ CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ identifier VARCHAR(8) NOT NULL,
+ payload VARCHAR(512) NULL,
+ CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..868411f
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'notification'
+
+includeBuild 'api'
+includeBuild 'service'
+includeBuild 'component-test'
+
diff --git a/shared.gradle b/shared.gradle
new file mode 100644
index 0000000..4a65927
--- /dev/null
+++ b/shared.gradle
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+version '0.1.0-BUILD-SNAPSHOT'
+
+ext.versions = [
+ fineractcnidentity : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnprovisioner : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnrhythm : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnoffice : '0.1.0-BUILD-SNAPSHOT',
+ fineractcncustomer : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnaccounting : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnportfolio : '0.1.0-BUILD-SNAPSHOT',
+ fineractcndeposit : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnteller : '0.1.0-BUILD-SNAPSHOT',
+ kuelapcheques : '0.1.0-BUILD-SNAPSHOT',
+ fineractcnpayroll : '0.1.0-BUILD-SNAPSHOT',
+ fineractcngroup : '0.1.0-BUILD-SNAPSHOT',
+ frameworkapi : '0.1.0-BUILD-SNAPSHOT',
+ frameworklang : '0.1.0-BUILD-SNAPSHOT',
+ frameworkasync : '0.1.0-BUILD-SNAPSHOT',
+ frameworkcassandra : '0.1.0-BUILD-SNAPSHOT',
+ frameworkmariadb : '0.1.0-BUILD-SNAPSHOT',
+ frameworkcommand : '0.1.0-BUILD-SNAPSHOT',
+ frameworktest : '0.1.0-BUILD-SNAPSHOT',
+ frameworkanubis : '0.1.0-BUILD-SNAPSHOT',
+ validator : '5.3.0.Final'
+]
+
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'maven-publish'
+apply plugin: 'io.spring.dependency-management'
+
+tasks.withType(JavaCompile) {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+repositories {
+ jcenter()
+ mavenLocal()
+}
+
+dependencyManagement {
+ imports {
+ mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
+ mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
+ }
+}
+
+// override certain dependency provided by Spring platform using newer releases
+ext['cassandra.version'] = '3.6'
+ext['cassandra-driver.version'] = '3.1.2'
+ext['activemq.version'] = '5.13.2'
+ext['spring-data-releasetrain.version'] = 'Gosling-SR2A'
+
+dependencies {
+ compile(
+ [group: 'com.google.code.findbugs', name: 'jsr305']
+ )
+
+ testCompile(
+ [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+ )
+}
+
+jar {
+ from sourceSets.main.allSource
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+}
+
+license {
+ header rootProject.file('../HEADER')
+ strictCheck true
+ mapping {
+ java = 'SLASHSTAR_STYLE'
+ xml = 'XML_STYLE'
+ yml = 'SCRIPT_STYLE'
+ yaml = 'SCRIPT_STYLE'
+ }
+}
+
+rat {
+ // List of exclude directives, defaults to ['**/.gradle/**']
+ excludes = [
+ "**/.idea/**",
+ "**/.gradle/**",
+ "**/gradle/**",
+ "**/build/**",
+ "gradlew",
+ "gradlew.bat",
+ "README.md"
+ ]
+}
+
diff --git a/system-analysis.mdj b/system-analysis.mdj
new file mode 100644
index 0000000..4c7f1af
--- /dev/null
+++ b/system-analysis.mdj
@@ -0,0 +1,4104 @@
+{
+ "_type": "Project",
+ "_id": "AAAAAAFF+h6SjaM2Hec=",
+ "name": "Untitled",
+ "ownedElements": [
+ {
+ "_type": "UMLModel",
+ "_id": "AAAAAAFF+qBWK6M3Z8Y=",
+ "_parent": {
+ "$ref": "AAAAAAFF+h6SjaM2Hec="
+ },
+ "name": "Model",
+ "ownedElements": [
+ {
+ "_type": "UMLClassDiagram",
+ "_id": "AAAAAAFF+qBtyKM79qY=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "Main",
+ "visible": true,
+ "defaultDiagram": true
+ },
+ {
+ "_type": "UMLActivity",
+ "_id": "AAAAAAFjqASLHqqfH1M=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "Activity1",
+ "ownedElements": [
+ {
+ "_type": "UMLActivityDiagram",
+ "_id": "AAAAAAFjqASLIKqg3FE=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "Notification Activity",
+ "visible": true,
+ "defaultDiagram": false,
+ "ownedViews": [
+ {
+ "_type": "UMLControlNodeView",
+ "_id": "AAAAAAFjqASvhqqmFR0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqASvhaqkmH0="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 178,
+ "top": 32,
+ "width": 20,
+ "height": 20,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqATelaqrA88=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqATelqqsQwY=",
+ "_parent": {
+ "$ref": "AAAAAAFjqATelaqrA88="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqATelqqtdxw=",
+ "_parent": {
+ "$ref": "AAAAAAFjqATelqqsQwY="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 32,
+ "top": 0,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqATel6qupnU=",
+ "_parent": {
+ "$ref": "AAAAAAFjqATelqqsQwY="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 144,
+ "top": 95,
+ "width": 87,
+ "height": 26,
+ "autoResize": false,
+ "underline": false,
+ "text": "JMSListener injects event",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqATemKqvl8w=",
+ "_parent": {
+ "$ref": "AAAAAAFjqATelqqsQwY="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 32,
+ "top": 0,
+ "width": 86,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqATemKqwuws=",
+ "_parent": {
+ "$ref": "AAAAAAFjqATelqqsQwY="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 32,
+ "top": 0,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 139,
+ "top": 88,
+ "width": 97,
+ "height": 38,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqATelqqtdxw="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqATel6qupnU="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqATemKqvl8w="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqATemKqwuws="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 139,
+ "top": 88,
+ "width": 97,
+ "height": 54,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqATelqqsQwY="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqAWrCqrNuOs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqAWrCqrOxcc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAWrCqrNuOs="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAWrC6rPvtY=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAWrCqrOxcc="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -366,
+ "top": 304,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAWrC6rQZmc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAWrCqrOxcc="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 45,
+ "top": 351,
+ "width": 95,
+ "height": 52,
+ "autoResize": false,
+ "underline": false,
+ "text": "retrieve receipt SMS and email contact",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAWrC6rRHbU=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAWrCqrOxcc="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -366,
+ "top": 304,
+ "width": 86,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAWrC6rS8Ik=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAWrCqrOxcc="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -366,
+ "top": 304,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 40,
+ "top": 344,
+ "width": 105,
+ "height": 64,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqAWrC6rPvtY="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqAWrC6rQZmc="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqAWrC6rRHbU="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqAWrC6rS8Ik="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 40,
+ "top": 344,
+ "width": 105,
+ "height": 80,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqAWrCqrOxcc="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqAYmKaro5lo=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAYmKKrmL6s="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqAYmKarpUFk=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAYmKaro5lo="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAYmKKrmL6s="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAYmKqrq62s=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAYmKarpUFk="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 322,
+ "top": 224,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAYmKqrr75M=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAYmKarpUFk="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 213,
+ "top": 351,
+ "width": 111,
+ "height": 39,
+ "autoResize": false,
+ "underline": false,
+ "text": "Prepare Message with template created",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAYmK6rsSQ0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAYmKarpUFk="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 322,
+ "top": 224,
+ "width": 86,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAYmK6rtvPo=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAYmKarpUFk="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 322,
+ "top": 224,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 208,
+ "top": 344,
+ "width": 121,
+ "height": 51,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqAYmKqrq62s="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqAYmKqrr75M="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqAYmK6rsSQ0="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqAYmK6rtvPo="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 208,
+ "top": 344,
+ "width": 121,
+ "height": 67,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqAYmKarpUFk="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqAZdgqsCYJQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAZdgasAyFA="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqAZdgqsDDao=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAZdgqsCYJQ="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAZdgasAyFA="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAZdgqsEhl4=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAZdgqsDDao="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -240,
+ "top": 528,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAZdgqsF8Ko=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAZdgqsDDao="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 136,
+ "top": 591,
+ "width": 103,
+ "height": 39,
+ "autoResize": false,
+ "underline": false,
+ "text": "Senders Objects transmit the data",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAZdgqsGu+E=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAZdgqsDDao="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -240,
+ "top": 528,
+ "width": 86,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqAZdgqsH70w=",
+ "_parent": {
+ "$ref": "AAAAAAFjqAZdgqsDDao="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -240,
+ "top": 528,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 131,
+ "top": 584,
+ "width": 113,
+ "height": 51,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqAZdgqsEhl4="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqAZdgqsF8Ko="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqAZdgqsGu+E="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqAZdgqsH70w="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 131,
+ "top": 584,
+ "width": 113,
+ "height": 67,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqAZdgqsDDao="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLControlNodeView",
+ "_id": "AAAAAAFjqAbQ96sfooI=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqAbQ7asd+Ww="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 175,
+ "top": 680,
+ "width": 26,
+ "height": 26,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqA2/Cata4OI=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqA2/A6tYai0="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqA2/C6tbg3o=",
+ "_parent": {
+ "$ref": "AAAAAAFjqA2/Cata4OI="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqA2/A6tYai0="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqA2/C6tcNpM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqA2/C6tbg3o="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 178,
+ "top": 336,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqA2/DKtd5Og=",
+ "_parent": {
+ "$ref": "AAAAAAFjqA2/C6tbg3o="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 229,
+ "top": 463,
+ "width": 79,
+ "height": 26,
+ "autoResize": false,
+ "underline": false,
+ "text": "Locatize Template",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqA2/DateYyA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqA2/C6tbg3o="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 178,
+ "top": 336,
+ "width": 86,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqA2/Datf4DQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqA2/C6tbg3o="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 178,
+ "top": 336,
+ "width": 0,
+ "height": 13,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 224,
+ "top": 456,
+ "width": 89,
+ "height": 38,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqA2/C6tcNpM="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqA2/DKtd5Og="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqA2/DateYyA="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqA2/Datf4DQ="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Arial;13;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 224,
+ "top": 456,
+ "width": 89,
+ "height": 54,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqA2/C6tbg3o="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLControlNodeView",
+ "_id": "AAAAAAFjqBIJL6ubZ3I=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBIJLquZsRo="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 131,
+ "top": 288,
+ "width": 113,
+ "height": 6,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqBIoa6ugHqY=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBIoaquel/4="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBIoa6uhY6U=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBIoaquel/4="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 151,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBIoa6uivk8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBIoaquel/4="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 216,
+ "top": 151,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBIobKujWVc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBIoaquel/4="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 172,
+ "top": 152,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBIoa6ugHqY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqCEih6yTO40="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqATelaqrA88="
+ },
+ "lineStyle": 1,
+ "points": "187:142;187:175",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqBIoa6uhY6U="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqBIoa6uivk8="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqBIobKujWVc="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqBKjHquxAW0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBKjHquv5CM="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBKjHquyqKs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBKjHquv5CM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 62,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBKjHquzayI=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBKjHquv5CM="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 216,
+ "top": 62,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBKjHqu0+xU=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBKjHquv5CM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 172,
+ "top": 63,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBKjHquxAW0="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqATelaqrA88="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqASvhqqmFR0="
+ },
+ "lineStyle": 1,
+ "points": "187:52;187:87",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqBKjHquyqKs="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqBKjHquzayI="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqBKjHqu0+xU="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqBLYAqvEqog=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLYAqvCSQk="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLYAqvFiZM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLYAqvCSQk="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 282,
+ "top": 426,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLYAqvGPAg=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLYAqvCSQk="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 297,
+ "top": 426,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLYAqvHWRk=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLYAqvCSQk="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 253,
+ "top": 427,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLYAqvEqog="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqA2/Cata4OI="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqAYmKaro5lo="
+ },
+ "lineStyle": 1,
+ "points": "268:411;268:455",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqBLYAqvFiZM="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqBLYAqvGPAg="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqBLYAqvHWRk="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqBLqN6vVVDc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLqNqvTow0="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLqOKvWpw0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLqNqvTow0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 658,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLqOKvX76Y=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLqNqvTow0="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 216,
+ "top": 658,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqBLqOavYEPE=",
+ "_parent": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqBLqNqvTow0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 172,
+ "top": 659,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqBLqN6vVVDc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqAbQ96sfooI="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqAZdgqsCYJQ="
+ },
+ "lineStyle": 1,
+ "points": "187:651;187:679",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqBLqOKvWpw0="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqBLqOKvX76Y="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqBLqOavYEPE="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqB0vKqwHDoM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB0vKawF6iM="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB0vKqwIlNc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB0vKawF6iM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 168,
+ "top": 322,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB0vK6wJ+8E=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB0vKawF6iM="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 179,
+ "top": 333,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB0vK6wKDT8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB0vKawF6iM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 147,
+ "top": 301,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB0vKqwHDoM="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqAWrCqrNuOs="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqBIJL6ubZ3I="
+ },
+ "lineStyle": 1,
+ "points": "183:294;133:343",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqB0vKqwIlNc="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqB0vK6wJ+8E="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqB0vK6wKDT8="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqB14tKwY2QY=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB14s6wWTtM="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB14tKwZWVs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB14s6wWTtM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 224,
+ "top": 301,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB14tKwaFP8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB14s6wWTtM="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 235,
+ "top": 291,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB14tKwbJe8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB14s6wWTtM="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 322,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB14tKwY2QY="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqAYmKaro5lo="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqBIJL6ubZ3I="
+ },
+ "lineStyle": 1,
+ "points": "191:294;236:343",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqB14tKwZWVs="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqB14tKwaFP8="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqB14tKwbJe8="
+ }
+ },
+ {
+ "_type": "UMLControlNodeView",
+ "_id": "AAAAAAFjqB9/Taw5bl4=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB9/S6w3TKM="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 136,
+ "top": 544,
+ "width": 104,
+ "height": 6,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqB+W4qw+0nc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+W4qw8vc8="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+W46w/H0c=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+W4qw8vc8="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 559,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+W46xAJPs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+W4qw8vc8="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 216,
+ "top": 559,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+W46xBhSQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+W4qw8vc8="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 172,
+ "top": 560,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+W4qw+0nc="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqAZdgqsCYJQ="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqB9/Taw5bl4="
+ },
+ "lineStyle": 1,
+ "points": "187:550;187:583",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqB+W46w/H0c="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqB+W46xAJPs="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqB+W46xBhSQ="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqB+mdKxPr44=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+mc6xNTWc="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+mdKxQpVA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+mc6xNTWc="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 221,
+ "top": 531,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+mdKxRB1o=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+mc6xNTWc="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 230,
+ "top": 543,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqB+mdKxSTJo=",
+ "_parent": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqB+mc6xNTWc="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 202,
+ "top": 508,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqB+mdKxPr44="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqB9/Taw5bl4="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqA2/Cata4OI="
+ },
+ "lineStyle": 1,
+ "points": "233:510;191:543",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqB+mdKxQpVA="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqB+mdKxRB1o="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqB+mdKxSTJo="
+ }
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqCBd1Kx5mCs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCBd06x3DWs="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCBd1Kx6qnM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCBd06x3DWs="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 162,
+ "top": 469,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCBd1ax7Ky4=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCBd06x3DWs="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 175,
+ "top": 461,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCBd1ax8vzU=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCBd06x3DWs="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 137,
+ "top": 484,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCBd1Kx5mCs="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqB9/Taw5bl4="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqAWrCqrNuOs="
+ },
+ "lineStyle": 1,
+ "points": "116:424;185:543",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqCBd1Kx6qnM="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqCBd1ax7Ky4="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqCBd1ax8vzU="
+ }
+ },
+ {
+ "_type": "UMLActionView",
+ "_id": "AAAAAAFjqCEih6yTO40=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCEig6yRtTs="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqCEiiayUplA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCEih6yTO40="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCEig6yRtTs="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCEiiqyV3PI=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCEiiayUplA="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -144,
+ "top": -128,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCEii6yWXBY=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCEiiayUplA="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 132,
+ "top": 183,
+ "width": 111,
+ "height": 36,
+ "autoResize": false,
+ "underline": false,
+ "text": "Check if Event has been enabled by MFI",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCEii6yXfwg=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCEiiayUplA="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -144,
+ "top": -128,
+ "width": 80,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Activity1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCEii6yYpPQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCEiiayUplA="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -144,
+ "top": -128,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 127,
+ "top": 176,
+ "width": 121,
+ "height": 48,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqCEiiqyV3PI="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqCEii6yWXBY="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqCEii6yXfwg="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqCEii6yYpPQ="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 127,
+ "top": 176,
+ "width": 121,
+ "height": 64,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqCEiiayUplA="
+ },
+ "wordWrap": true
+ },
+ {
+ "_type": "UMLControlFlowView",
+ "_id": "AAAAAAFjqCJ5HqyxiME=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLIKqg3FE="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCJ5HayvTsA="
+ },
+ "subViews": [
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCJ5H6yynz8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCJ5HayvTsA="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 201,
+ "top": 256,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCJ5IKyzLqE=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCJ5HayvTsA="
+ },
+ "visible": null,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 216,
+ "top": 256,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": 1.5707963267948966,
+ "distance": 30,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "EdgeLabelView",
+ "_id": "AAAAAAFjqCJ5IKy0y/c=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCJ5HayvTsA="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 172,
+ "top": 257,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "alpha": -1.5707963267948966,
+ "distance": 15,
+ "hostEdge": {
+ "$ref": "AAAAAAFjqCJ5HqyxiME="
+ },
+ "edgePosition": 1,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "head": {
+ "$ref": "AAAAAAFjqBIJL6ubZ3I="
+ },
+ "tail": {
+ "$ref": "AAAAAAFjqCEih6yTO40="
+ },
+ "lineStyle": 1,
+ "points": "187:240;187:287",
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showProperty": true,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqCJ5H6yynz8="
+ },
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqCJ5IKyzLqE="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqCJ5IKy0y/c="
+ }
+ }
+ ]
+ }
+ ],
+ "visibility": "public",
+ "isReentrant": true,
+ "isReadOnly": false,
+ "isSingleExecution": false,
+ "nodes": [
+ {
+ "_type": "UMLInitialNode",
+ "_id": "AAAAAAFjqASvhaqkmH0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "InitialNode1",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqATelKqpPIs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "JMSListener injects event",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqAWrCarLlr0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "retrieve receipt SMS and email contact",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqAYmKKrmL6s=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "Prepare Message with template created",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqAZdgasAyFA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "Senders Objects transmit the data",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ },
+ {
+ "_type": "UMLActivityFinalNode",
+ "_id": "AAAAAAFjqAbQ7asd+Ww=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "ActivityFinalNode1",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqA2/A6tYai0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "Locatize Template",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ },
+ {
+ "_type": "UMLForkNode",
+ "_id": "AAAAAAFjqBHP9auQV5g=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "ForkNode1",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLForkNode",
+ "_id": "AAAAAAFjqBIJLquZsRo=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "ForkNode2",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLJoinNode",
+ "_id": "AAAAAAFjqB9/S6w3TKM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "JoinNode1",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLAction",
+ "_id": "AAAAAAFjqCEig6yRtTs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "name": "Check if Event has been enabled by MFI",
+ "visibility": "public",
+ "kind": "opaque",
+ "isLocallyReentrant": false,
+ "isSynchronous": true
+ }
+ ],
+ "edges": [
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqBEKGKt1+H8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqBIoaquel/4=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqCEig6yRtTs="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqBKjHquv5CM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqASvhaqkmH0="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqBLYAqvCSQk=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqAYmKKrmL6s="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqA2/A6tYai0="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqBLqNqvTow0=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqAZdgasAyFA="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAbQ7asd+Ww="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqByuGavpb+Q=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqATelKqpPIs="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqB0vKawF6iM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqBIJLquZsRo="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqB14s6wWTtM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqBIJLquZsRo="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAYmKKrmL6s="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqB+W4qw8vc8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqB9/S6w3TKM="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqAZdgasAyFA="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqB+mc6xNTWc=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqA2/A6tYai0="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqB9/S6w3TKM="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqCBd06x3DWs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqAWrCarLlr0="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqB9/S6w3TKM="
+ },
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLControlFlow",
+ "_id": "AAAAAAFjqCJ5HayvTsA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqASLHqqfH1M="
+ },
+ "source": {
+ "$ref": "AAAAAAFjqCEig6yRtTs="
+ },
+ "target": {
+ "$ref": "AAAAAAFjqBIJLquZsRo="
+ },
+ "visibility": "public"
+ }
+ ]
+ },
+ {
+ "_type": "UMLCollaboration",
+ "_id": "AAAAAAFjqCY2j5u3ys8=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "Collaboration1",
+ "ownedElements": [
+ {
+ "_type": "UMLInteraction",
+ "_id": "AAAAAAFjqCY2kpu4n0I=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2j5u3ys8="
+ },
+ "name": "Interaction1",
+ "ownedElements": [
+ {
+ "_type": "UMLSequenceDiagram",
+ "_id": "AAAAAAFjqCY2kpu5KQk=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2kpu4n0I="
+ },
+ "name": "SequenceDiagram1",
+ "visible": true,
+ "defaultDiagram": false,
+ "ownedViews": [
+ {
+ "_type": "UMLFrameView",
+ "_id": "AAAAAAFjqCY2k5u6GlA=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2kpu5KQk="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCY2kpu5KQk="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCY2lJu7Oe8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2k5u6GlA="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 73,
+ "top": 10,
+ "width": 111,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "SequenceDiagram1",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCY2lZu8kXQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2k5u6GlA="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 10,
+ "top": 10,
+ "width": 58,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "interaction",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 5,
+ "top": 5,
+ "width": 695,
+ "height": 595,
+ "autoResize": false,
+ "nameLabel": {
+ "$ref": "AAAAAAFjqCY2lJu7Oe8="
+ },
+ "frameTypeLabel": {
+ "$ref": "AAAAAAFjqCY2lZu8kXQ="
+ }
+ },
+ {
+ "_type": "UMLSeqLifelineView",
+ "_id": "AAAAAAFjqCbCSJvIsEM=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2kpu5KQk="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCbCSJvHDpo="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjqCbCSZvJ4ng=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSJvIsEM="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCbCSJvHDpo="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCbCSpvKaxs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSZvJ4ng="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCbCSpvLXu8=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSZvJ4ng="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 37,
+ "top": 47,
+ "width": 90,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "EventListener",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCbCSpvMWyQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSZvJ4ng="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 99,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Interaction1)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjqCbCS5vNZUs=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSZvJ4ng="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 32,
+ "top": 40,
+ "width": 100,
+ "height": 40,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjqCbCSpvKaxs="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjqCbCSpvLXu8="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjqCbCSpvMWyQ="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjqCbCS5vNZUs="
+ }
+ },
+ {
+ "_type": "UMLLinePartView",
+ "_id": "AAAAAAFjqCbCS5vOH9k=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCbCSJvIsEM="
+ },
+ "model": {
+ "$ref": "AAAAAAFjqCbCSJvHDpo="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 82,
+ "top": 80,
+ "width": 1,
+ "height": 160,
+ "autoResize": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 32,
+ "top": 40,
+ "width": 100,
+ "height": 200,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjqCbCSZvJ4ng="
+ },
+ "wordWrap": false,
+ "linePart": {
+ "$ref": "AAAAAAFjqCbCS5vOH9k="
+ }
+ }
+ ],
+ "showSequenceNumber": true,
+ "showSignature": true,
+ "showActivation": true
+ }
+ ],
+ "visibility": "public",
+ "isReentrant": true,
+ "participants": [
+ {
+ "_type": "UMLLifeline",
+ "_id": "AAAAAAFjqCbCSJvHDpo=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2kpu4n0I="
+ },
+ "name": "EventListener",
+ "visibility": "public",
+ "represent": {
+ "$ref": "AAAAAAFjqCbCR5vGwmU="
+ },
+ "isMultiInstance": false
+ }
+ ]
+ }
+ ],
+ "visibility": "public",
+ "attributes": [
+ {
+ "_type": "UMLAttribute",
+ "_id": "AAAAAAFjqCbCR5vGwmU=",
+ "_parent": {
+ "$ref": "AAAAAAFjqCY2j5u3ys8="
+ },
+ "name": "Role1",
+ "visibility": "public",
+ "isStatic": false,
+ "isLeaf": false,
+ "type": "",
+ "isReadOnly": false,
+ "isOrdered": false,
+ "isUnique": false,
+ "isDerived": false,
+ "aggregation": "none",
+ "isID": false
+ }
+ ],
+ "isAbstract": false,
+ "isFinalSpecialization": false,
+ "isLeaf": false
+ },
+ {
+ "_type": "UMLUseCaseDiagram",
+ "_id": "AAAAAAFjuvxSC6RUg4A=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "CustomerUseCase",
+ "visible": true,
+ "defaultDiagram": false,
+ "ownedViews": [
+ {
+ "_type": "UMLUseCaseSubjectView",
+ "_id": "AAAAAAFjuv4gOKRa+jQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjuvxSC6RUg4A="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv4gOKRYAw8="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjuv4gOaRbEkE=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv4gOKRa+jQ="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv4gOKRYAw8="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv4gOaRczFQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv4gOaRbEkE="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv4gOaRdgAQ=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv4gOaRbEkE="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 213,
+ "top": 39,
+ "width": 478,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "Notification Microservice",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv4gOaReStM=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv4gOaRbEkE="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 69,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Model)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv4gOaRf7IE=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv4gOaRbEkE="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 0,
+ "top": 0,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 208,
+ "top": 32,
+ "width": 488,
+ "height": 24,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjuv4gOaRczFQ="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjuv4gOaRdgAQ="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjuv4gOaReStM="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjuv4gOaRf7IE="
+ }
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 208,
+ "top": 32,
+ "width": 488,
+ "height": 608,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjuv4gOaRbEkE="
+ },
+ "wordWrap": false
+ },
+ {
+ "_type": "UMLActorView",
+ "_id": "AAAAAAFjuv6kb6R0A6g=",
+ "_parent": {
+ "$ref": "AAAAAAFjuvxSC6RUg4A="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjuv6kcKR1JNo=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kb6R0A6g="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv6kcKR2baE=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kcKR1JNo="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -112,
+ "top": 352,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv6kcaR3JSY=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kcKR1JNo="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 61,
+ "top": 341,
+ "width": 134,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "customer microservice",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv6kcaR4LTc=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kcKR1JNo="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -112,
+ "top": 352,
+ "width": 69,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Model)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv6kcaR5qOc=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kcKR1JNo="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -112,
+ "top": 352,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 56,
+ "top": 334,
+ "width": 144,
+ "height": 24,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjuv6kcKR2baE="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjuv6kcaR3JSY="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjuv6kcaR4LTc="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjuv6kcaR5qOc="
+ }
+ },
+ {
+ "_type": "UMLAttributeCompartmentView",
+ "_id": "AAAAAAFjuv6kcqR6rvs=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kb6R0A6g="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -56,
+ "top": 176,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLOperationCompartmentView",
+ "_id": "AAAAAAFjuv6kcqR7HEk=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kb6R0A6g="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -56,
+ "top": 176,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLReceptionCompartmentView",
+ "_id": "AAAAAAFjuv6kc6R8FZ0=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kb6R0A6g="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -56,
+ "top": 176,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLTemplateParameterCompartmentView",
+ "_id": "AAAAAAFjuv6kdKR9/xc=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv6kb6R0A6g="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv6kbaRyZy0="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -56,
+ "top": 176,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 56,
+ "top": 280,
+ "width": 144,
+ "height": 79,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjuv6kcKR1JNo="
+ },
+ "wordWrap": false,
+ "suppressAttributes": true,
+ "suppressOperations": true,
+ "suppressReceptions": true,
+ "showMultiplicity": true,
+ "showOperationSignature": true,
+ "attributeCompartment": {
+ "$ref": "AAAAAAFjuv6kcqR6rvs="
+ },
+ "operationCompartment": {
+ "$ref": "AAAAAAFjuv6kcqR7HEk="
+ },
+ "receptionCompartment": {
+ "$ref": "AAAAAAFjuv6kc6R8FZ0="
+ },
+ "templateParameterCompartment": {
+ "$ref": "AAAAAAFjuv6kdKR9/xc="
+ }
+ },
+ {
+ "_type": "UMLUseCaseView",
+ "_id": "AAAAAAFjuv/XzaSib0Y=",
+ "_parent": {
+ "$ref": "AAAAAAFjuvxSC6RUg4A="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "subViews": [
+ {
+ "_type": "UMLNameCompartmentView",
+ "_id": "AAAAAAFjuv/XzqSjIc4=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "subViews": [
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv/Xz6SkS8o=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzqSjIc4="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -80,
+ "top": -96,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv/X0KSlY0g=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzqSjIc4="
+ },
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;1",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 330.5,
+ "top": 104,
+ "width": 92,
+ "height": 36,
+ "autoResize": false,
+ "underline": false,
+ "text": "Account Created Notification",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": true
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv/X0KSmuPo=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzqSjIc4="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -80,
+ "top": -96,
+ "width": 69,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "text": "(from Model)",
+ "horizontalAlignment": 2,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ },
+ {
+ "_type": "LabelView",
+ "_id": "AAAAAAFjuv/X0KSnIG4=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzqSjIc4="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -80,
+ "top": -96,
+ "width": 0,
+ "height": 12,
+ "autoResize": false,
+ "underline": false,
+ "horizontalAlignment": 1,
+ "verticalAlignment": 5,
+ "wordWrap": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": 325.5,
+ "top": 97,
+ "width": 102,
+ "height": 48,
+ "autoResize": false,
+ "stereotypeLabel": {
+ "$ref": "AAAAAAFjuv/Xz6SkS8o="
+ },
+ "nameLabel": {
+ "$ref": "AAAAAAFjuv/X0KSlY0g="
+ },
+ "namespaceLabel": {
+ "$ref": "AAAAAAFjuv/X0KSmuPo="
+ },
+ "propertyLabel": {
+ "$ref": "AAAAAAFjuv/X0KSnIG4="
+ }
+ },
+ {
+ "_type": "UMLAttributeCompartmentView",
+ "_id": "AAAAAAFjuv/X0aSocII=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -40,
+ "top": -48,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLOperationCompartmentView",
+ "_id": "AAAAAAFjuv/X0qSpfns=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -40,
+ "top": -48,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLReceptionCompartmentView",
+ "_id": "AAAAAAFjuv/X0qSqNoc=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -40,
+ "top": -48,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLTemplateParameterCompartmentView",
+ "_id": "AAAAAAFjuv/X06Sr5DM=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -40,
+ "top": -48,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ },
+ {
+ "_type": "UMLExtensionPointCompartmentView",
+ "_id": "AAAAAAFjuv/X1KSsXMU=",
+ "_parent": {
+ "$ref": "AAAAAAFjuv/XzaSib0Y="
+ },
+ "model": {
+ "$ref": "AAAAAAFjuv/XzKSgDcQ="
+ },
+ "visible": false,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": false,
+ "containerExtending": false,
+ "left": -40,
+ "top": -48,
+ "width": 10,
+ "height": 10,
+ "autoResize": false
+ }
+ ],
+ "visible": true,
+ "enabled": true,
+ "lineColor": "#000000",
+ "fillColor": "#ffffff",
+ "fontColor": "#000000",
+ "font": "Helvetica;12;0",
+ "showShadow": true,
+ "containerChangeable": true,
+ "containerExtending": false,
+ "left": 304,
+ "top": 88,
+ "width": 145,
+ "height": 67,
+ "autoResize": false,
+ "stereotypeDisplay": "label",
+ "showVisibility": true,
+ "showNamespace": false,
+ "showProperty": true,
+ "showType": true,
+ "nameCompartment": {
+ "$ref": "AAAAAAFjuv/XzqSjIc4="
+ },
+ "wordWrap": true,
+ "suppressAttributes": true,
+ "suppressOperations": true,
+ "suppressReceptions": true,
+ "showMultiplicity": true,
+ "showOperationSignature": true,
+ "attributeCompartment": {
+ "$ref": "AAAAAAFjuv/X0aSocII="
+ },
+ "operationCompartment": {
+ "$ref": "AAAAAAFjuv/X0qSpfns="
+ },
+ "receptionCompartment": {
+ "$ref": "AAAAAAFjuv/X0qSqNoc="
+ },
+ "templateParameterCompartment": {
+ "$ref": "AAAAAAFjuv/X06Sr5DM="
+ },
+ "extensionPointCompartment": {
+ "$ref": "AAAAAAFjuv/X1KSsXMU="
+ }
+ }
+ ]
+ },
+ {
+ "_type": "UMLUseCaseSubject",
+ "_id": "AAAAAAFjuv4gOKRYAw8=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "Notification Microservice",
+ "visibility": "public"
+ },
+ {
+ "_type": "UMLActor",
+ "_id": "AAAAAAFjuv6kbaRyZy0=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "customer microservice",
+ "visibility": "public",
+ "isAbstract": false,
+ "isFinalSpecialization": false,
+ "isLeaf": false
+ },
+ {
+ "_type": "UMLUseCase",
+ "_id": "AAAAAAFjuv/XzKSgDcQ=",
+ "_parent": {
+ "$ref": "AAAAAAFF+qBWK6M3Z8Y="
+ },
+ "name": "Account Created Notification",
+ "visibility": "public",
+ "isAbstract": false,
+ "isFinalSpecialization": false,
+ "isLeaf": false
+ }
+ ],
+ "visibility": "public"
+ }
+ ]
+}
\ No newline at end of file