You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ju...@apache.org on 2020/04/21 14:51:37 UTC

[fineract-cn-api] branch spring_boot_2 updated (a2df9f4 -> 0afb065)

This is an automated email from the ASF dual-hosted git repository.

juhan pushed a change to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git.


    from a2df9f4  FINCN-172 create separate Artifactory version for Spring Boot 2 update
     new 21826cf  update spring boot and spring cloud dep
     new c92ac89  update spring cloud version
     new dd34578  update deprecated methods
     new 0afb065  Merge pull request #12 from muellners/develop

The 44 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitignore                                         |  5 ++-
 build.gradle                                       | 26 ++++++++------
 .../apache/fineract/cn/api/util/ApiFactory.java    |  2 +-
 .../api/util/CustomFeignClientsConfiguration.java  |  2 +-
 .../cn/api/util/AnnotatedErrorDecoderTest.java     | 40 ++++++++++++++--------
 .../cn/api/util/CookieInterceptingClientTest.java  |  5 +--
 6 files changed, 50 insertions(+), 30 deletions(-)


[fineract-cn-api] 17/44: Merge pull request #2 from markusgeiss/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit b00a37ea9849a0db285ede50847e7c8c7031d192
Merge: 5e21d66 801863f
Author: Markus Geiss <ma...@kuelap.io>
AuthorDate: Wed Sep 27 09:35:18 2017 +0200

    Merge pull request #2 from markusgeiss/develop
    
    made constructor public

 src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


[fineract-cn-api] 11/44: Merge pull request #3 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 5b7e04e8d533d904205c6ce10fac47ee221328bf
Merge: 78e28e6 2399a6c
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon May 15 09:18:40 2017 +0200

    Merge pull request #3 from myrle-krantz/develop
    
    Made cookie jar accessible

 .../java/io/mifos/core/api/util/ApiFactory.java    | 16 +++++++++
 .../core/api/util/CookieInterceptingClient.java    | 10 ++++++
 .../core/api/util/FeignTargetWithCookieJar.java    | 38 ++++++++++++++++++++++
 .../api/util/CookieInterceptingClientTest.java     | 11 +++++++
 4 files changed, 75 insertions(+)


[fineract-cn-api] 31/44: Merge pull request #6 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit dd539070de8e48670de1b4d13efb4a785393a470
Merge: aff2b04 5628239
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Apr 16 21:25:02 2018 +0200

    Merge pull request #6 from myrle-krantz/develop
    
    Updating package names.

 .../apache/fineract/cn}/api/annotation/ThrowsException.java   |  2 +-
 .../apache/fineract/cn}/api/annotation/ThrowsExceptions.java  |  2 +-
 .../apache/fineract/cn}/api/config/ApiConfiguration.java      |  4 ++--
 .../apache/fineract/cn}/api/config/EnableApiFactory.java      |  2 +-
 .../apache/fineract/cn}/api/context/AutoGuest.java            |  2 +-
 .../apache/fineract/cn}/api/context/AutoSeshat.java           |  4 ++--
 .../apache/fineract/cn}/api/context/AutoUserContext.java      |  6 +++---
 .../apache/fineract/cn}/api/util/AnnotatedErrorDecoder.java   |  6 +++---
 .../apache/fineract/cn}/api/util/ApiConstants.java            |  2 +-
 .../core => org/apache/fineract/cn}/api/util/ApiFactory.java  |  4 ++--
 .../fineract/cn}/api/util/CookieInterceptingClient.java       |  2 +-
 .../cn}/api/util/CustomFeignClientsConfiguration.java         | 11 +++++------
 .../apache/fineract/cn}/api/util/EmptyBodyInterceptor.java    |  2 +-
 .../fineract/cn}/api/util/FeignTargetWithCookieJar.java       |  2 +-
 .../apache/fineract/cn}/api/util/InternalServerError.java     |  2 +-
 .../apache/fineract/cn}/api/util/InvalidTokenException.java   |  2 +-
 .../apache/fineract/cn}/api/util/NotFoundException.java       |  2 +-
 .../fineract/cn}/api/util/TenantedTargetInterceptor.java      |  8 ++++----
 .../fineract/cn}/api/util/TokenedTargetInterceptor.java       |  2 +-
 .../core => org/apache/fineract/cn}/api/util/UserContext.java |  2 +-
 .../apache/fineract/cn}/api/util/UserContextHolder.java       |  2 +-
 .../apache/fineract/cn}/api/context/AutoUserContextTest.java  |  6 ++----
 .../fineract/cn}/api/util/AnnotatedErrorDecoderTest.java      |  4 ++--
 .../fineract/cn}/api/util/CookieInterceptingClientTest.java   |  2 +-
 .../fineract/cn}/api/util/TenantedTargetInterceptorTest.java  |  4 ++--
 .../fineract/cn}/api/util/TokenedTargetInterceptorTest.java   |  4 ++--
 .../apache/fineract/cn}/api/util/UserContextHolderTest.java   |  2 +-
 27 files changed, 45 insertions(+), 48 deletions(-)


[fineract-cn-api] 13/44: Merge pull request #4 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 042eff5d00b374a6b07aa0c917f757d096f4cbfd
Merge: 5b7e04e 69fee90
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Wed Jun 14 16:01:08 2017 +0200

    Merge pull request #4 from myrle-krantz/develop
    
    De-uglified some twisted optional use.

 .../java/io/mifos/core/api/util/AnnotatedErrorDecoder.java | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)


[fineract-cn-api] 26/44: Update README.md

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 7fad102d6a0077d40dcefcc4fdfaee19617c4243
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Apr 6 21:45:24 2018 +0400

    Update README.md
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 77f2b69..6055c3c 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 [![Join the chat at https://gitter.im/mifos-initiative/mifos.io](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mifos-initiative/mifos.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 
-This project is an umbrella for all Mifos I/O Core components.
+This project is an umbrella for all Apache Fineract CN Core components.
 
 ## Abstract
 Apache Fineract CN is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.


[fineract-cn-api] 22/44: Merge pull request #2 from Izakey/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit bde3abd076430d3b947159c35062423fabbbee57
Merge: 943b8a0 5f6cc6f
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Mar 5 12:38:10 2018 +0100

    Merge pull request #2 from Izakey/develop
    
    Update Copyright Information

 HEADER                                             | 25 ++++++++++++----------
 NOTICE.txt                                         |  5 +++++
 README.md                                          |  4 ++--
 build.gradle                                       |  2 +-
 .../mifos/core/api/annotation/ThrowsException.java | 25 ++++++++++++----------
 .../core/api/annotation/ThrowsExceptions.java      | 25 ++++++++++++----------
 .../io/mifos/core/api/config/ApiConfiguration.java | 25 ++++++++++++----------
 .../io/mifos/core/api/config/EnableApiFactory.java | 25 ++++++++++++----------
 .../java/io/mifos/core/api/context/AutoGuest.java  | 25 ++++++++++++----------
 .../java/io/mifos/core/api/context/AutoSeshat.java | 25 ++++++++++++----------
 .../io/mifos/core/api/context/AutoUserContext.java | 25 ++++++++++++----------
 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/ApiConstants.java  | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/ApiFactory.java    | 25 ++++++++++++----------
 .../core/api/util/CookieInterceptingClient.java    | 25 ++++++++++++----------
 .../api/util/CustomFeignClientsConfiguration.java  | 25 ++++++++++++----------
 .../mifos/core/api/util/EmptyBodyInterceptor.java  | 25 ++++++++++++----------
 .../core/api/util/FeignTargetWithCookieJar.java    | 25 ++++++++++++----------
 .../mifos/core/api/util/InternalServerError.java   | 25 ++++++++++++----------
 .../mifos/core/api/util/InvalidTokenException.java | 25 ++++++++++++----------
 .../io/mifos/core/api/util/NotFoundException.java  | 25 ++++++++++++----------
 .../core/api/util/TenantedTargetInterceptor.java   | 25 ++++++++++++----------
 .../core/api/util/TokenedTargetInterceptor.java    | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/UserContext.java   | 25 ++++++++++++----------
 .../io/mifos/core/api/util/UserContextHolder.java  | 25 ++++++++++++----------
 .../core/api/context/AutoUserContextTest.java      | 25 ++++++++++++----------
 .../core/api/util/AnnotatedErrorDecoderTest.java   | 25 ++++++++++++----------
 .../api/util/CookieInterceptingClientTest.java     | 25 ++++++++++++----------
 .../api/util/TenantedTargetInterceptorTest.java    | 25 ++++++++++++----------
 .../api/util/TokenedTargetInterceptorTest.java     | 25 ++++++++++++----------
 .../mifos/core/api/util/UserContextHolderTest.java | 25 ++++++++++++----------
 31 files changed, 400 insertions(+), 311 deletions(-)


[fineract-cn-api] 05/44: Merge pull request #1 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 4f4b0da07bb456cb1f82fe08cefcd35fc80bbcad
Merge: 32a899b 8514adc
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Tue Mar 28 11:25:49 2017 +0200

    Merge pull request #1 from myrle-krantz/develop
    
    response body is now transported by exceptions including via custom exceptions

 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 42 +++++++++----
 .../io/mifos/core/api/util/NotFoundException.java  |  3 +
 .../core/api/util/AnnotatedErrorDecoderTest.java   | 68 +++++++++++++++++++---
 3 files changed, 93 insertions(+), 20 deletions(-)


[fineract-cn-api] 08/44: Merge pull request #2 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 78e28e6548d43c6748474e6d5669a6b0d8166690
Merge: 4f4b0da 3a4a2b7
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Tue Apr 11 16:17:00 2017 +0200

    Merge pull request #2 from myrle-krantz/develop
    
    Made annotated error decoder public

 src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)


[fineract-cn-api] 24/44: Merge branch 'develop' of https://github.com/apache/fineract-cn-api into develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 4ca986408ac26132792df42a5c61ef428cbe9347
Merge: 482267d bde3abd
Author: Isaac Kamga <u2...@gmail.com>
AuthorDate: Fri Mar 9 12:27:46 2018 +0100

    Merge branch 'develop' of https://github.com/apache/fineract-cn-api into develop



[fineract-cn-api] 20/44: Update copyright information to suit Apache standards

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 74632d44443d4b3ce22ddb2bd2f8ca8b359c49c5
Author: Isaac Kamga <u2...@gmail.com>
AuthorDate: Fri Mar 2 10:25:15 2018 +0100

    Update copyright information to suit Apache standards
---
 HEADER                                             | 25 ++++++++++++----------
 NOTICE.txt                                         |  5 +++++
 README.md                                          |  4 ++--
 build.gradle                                       |  2 +-
 .../mifos/core/api/annotation/ThrowsException.java | 25 ++++++++++++----------
 .../core/api/annotation/ThrowsExceptions.java      | 25 ++++++++++++----------
 .../io/mifos/core/api/config/ApiConfiguration.java | 25 ++++++++++++----------
 .../io/mifos/core/api/config/EnableApiFactory.java | 25 ++++++++++++----------
 .../java/io/mifos/core/api/context/AutoGuest.java  | 25 ++++++++++++----------
 .../java/io/mifos/core/api/context/AutoSeshat.java | 25 ++++++++++++----------
 .../io/mifos/core/api/context/AutoUserContext.java | 25 ++++++++++++----------
 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/ApiConstants.java  | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/ApiFactory.java    | 25 ++++++++++++----------
 .../core/api/util/CookieInterceptingClient.java    | 25 ++++++++++++----------
 .../api/util/CustomFeignClientsConfiguration.java  | 25 ++++++++++++----------
 .../mifos/core/api/util/EmptyBodyInterceptor.java  | 25 ++++++++++++----------
 .../core/api/util/FeignTargetWithCookieJar.java    | 25 ++++++++++++----------
 .../mifos/core/api/util/InternalServerError.java   | 25 ++++++++++++----------
 .../mifos/core/api/util/InvalidTokenException.java | 25 ++++++++++++----------
 .../io/mifos/core/api/util/NotFoundException.java  | 25 ++++++++++++----------
 .../core/api/util/TenantedTargetInterceptor.java   | 25 ++++++++++++----------
 .../core/api/util/TokenedTargetInterceptor.java    | 25 ++++++++++++----------
 .../java/io/mifos/core/api/util/UserContext.java   | 25 ++++++++++++----------
 .../io/mifos/core/api/util/UserContextHolder.java  | 25 ++++++++++++----------
 .../core/api/context/AutoUserContextTest.java      | 25 ++++++++++++----------
 .../core/api/util/AnnotatedErrorDecoderTest.java   | 25 ++++++++++++----------
 .../api/util/CookieInterceptingClientTest.java     | 25 ++++++++++++----------
 .../api/util/TenantedTargetInterceptorTest.java    | 25 ++++++++++++----------
 .../api/util/TokenedTargetInterceptorTest.java     | 25 ++++++++++++----------
 .../mifos/core/api/util/UserContextHolderTest.java | 25 ++++++++++++----------
 31 files changed, 400 insertions(+), 311 deletions(-)

diff --git a/HEADER b/HEADER
index d47a70e..60b675e 100644
--- a/HEADER
+++ b/HEADER
@@ -1,13 +1,16 @@
-Copyright ${year} ${name}.
+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
 
-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
 
-   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.
+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..460662d
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Lang
+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/README.md b/README.md
index 605c049..77f2b69 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
-# Mifos I/O Core API
+# Apache Fineract CN Api
 
 [![Join the chat at https://gitter.im/mifos-initiative/mifos.io](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mifos-initiative/mifos.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 
 This project is an umbrella for all Mifos I/O Core components.
 
 ## Abstract
-Mifos I/O is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.
+Apache Fineract CN is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.
 
 ## Prerequisites
 ### Runtime
diff --git a/build.gradle b/build.gradle
index ea25c40..ba6b763 100644
--- a/build.gradle
+++ b/build.gradle
@@ -83,5 +83,5 @@ license {
         java = 'SLASHSTAR_STYLE'
     }
     ext.year = Calendar.getInstance().get(Calendar.YEAR)
-    ext.name = 'The Mifos Initiative'
+    ext.name = 'The Apache Software Foundation'
 }
diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsException.java b/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
index bbd7f27..5d0c3ab 100644
--- a/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
+++ b/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.annotation;
 
diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java b/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
index e4a64d1..0a78ef7 100644
--- a/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
+++ b/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.annotation;
 
diff --git a/src/main/java/io/mifos/core/api/config/ApiConfiguration.java b/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
index 12b74c2..db170a0 100644
--- a/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
+++ b/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.config;
 
diff --git a/src/main/java/io/mifos/core/api/config/EnableApiFactory.java b/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
index 3071995..c332dad 100644
--- a/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
+++ b/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.config;
 
diff --git a/src/main/java/io/mifos/core/api/context/AutoGuest.java b/src/main/java/io/mifos/core/api/context/AutoGuest.java
index 6c0b122..0256303 100644
--- a/src/main/java/io/mifos/core/api/context/AutoGuest.java
+++ b/src/main/java/io/mifos/core/api/context/AutoGuest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.context;
 
diff --git a/src/main/java/io/mifos/core/api/context/AutoSeshat.java b/src/main/java/io/mifos/core/api/context/AutoSeshat.java
index bfe5d4a..acb2322 100644
--- a/src/main/java/io/mifos/core/api/context/AutoSeshat.java
+++ b/src/main/java/io/mifos/core/api/context/AutoSeshat.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.context;
 
diff --git a/src/main/java/io/mifos/core/api/context/AutoUserContext.java b/src/main/java/io/mifos/core/api/context/AutoUserContext.java
index 4caef7f..5643f79 100644
--- a/src/main/java/io/mifos/core/api/context/AutoUserContext.java
+++ b/src/main/java/io/mifos/core/api/context/AutoUserContext.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.context;
 
diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
index 367b741..792ab28 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/ApiConstants.java b/src/main/java/io/mifos/core/api/util/ApiConstants.java
index aa9cb79..ed19428 100644
--- a/src/main/java/io/mifos/core/api/util/ApiConstants.java
+++ b/src/main/java/io/mifos/core/api/util/ApiConstants.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/ApiFactory.java b/src/main/java/io/mifos/core/api/util/ApiFactory.java
index df67d44..b60472b 100644
--- a/src/main/java/io/mifos/core/api/util/ApiFactory.java
+++ b/src/main/java/io/mifos/core/api/util/ApiFactory.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
index 408a4d7..faa634e 100644
--- a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
+++ b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java b/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
index 9fa905d..783c6d1 100644
--- a/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
+++ b/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
index 1183432..9c9371a 100644
--- a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
+++ b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java b/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
index 2a9b661..700acd6 100644
--- a/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
+++ b/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/InternalServerError.java b/src/main/java/io/mifos/core/api/util/InternalServerError.java
index 037d2ff..9fcfe19 100644
--- a/src/main/java/io/mifos/core/api/util/InternalServerError.java
+++ b/src/main/java/io/mifos/core/api/util/InternalServerError.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/InvalidTokenException.java b/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
index d6916ba..609d672 100644
--- a/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
+++ b/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/NotFoundException.java b/src/main/java/io/mifos/core/api/util/NotFoundException.java
index 98650e8..db0fb2d 100644
--- a/src/main/java/io/mifos/core/api/util/NotFoundException.java
+++ b/src/main/java/io/mifos/core/api/util/NotFoundException.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
index e820d1e..dadda82 100644
--- a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
+++ b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java b/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
index 6e9a226..c4d108d 100644
--- a/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
+++ b/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/UserContext.java b/src/main/java/io/mifos/core/api/util/UserContext.java
index 0a98719..1dd20ad 100644
--- a/src/main/java/io/mifos/core/api/util/UserContext.java
+++ b/src/main/java/io/mifos/core/api/util/UserContext.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/main/java/io/mifos/core/api/util/UserContextHolder.java b/src/main/java/io/mifos/core/api/util/UserContextHolder.java
index 8991d3c..f4cc13a 100644
--- a/src/main/java/io/mifos/core/api/util/UserContextHolder.java
+++ b/src/main/java/io/mifos/core/api/util/UserContextHolder.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java b/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
index df0d8e8..43b5ce7 100644
--- a/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
+++ b/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.context;
 
diff --git a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
index fc53e4c..7316f82 100644
--- a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
+++ b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
index ebbf23f..0a7c520 100644
--- a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
+++ b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
index 5b5f8a3..2f87f3d 100644
--- a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
+++ b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java b/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
index 582943d..b907bc0 100644
--- a/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
+++ b/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 
diff --git a/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java b/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
index a5365bd..9f56a9a 100644
--- a/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
+++ b/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
@@ -1,17 +1,20 @@
 /*
- * Copyright 2017 The Mifos Initiative.
+ * 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
  *
- * 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
  *
- *    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.
+ * 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 io.mifos.core.api.util;
 


[fineract-cn-api] 10/44: Merge branch 'develop' of https://github.com/mifosio/api into develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 2399a6c76d30566b8f5697331dab1960fc8bff5c
Merge: 394486e 78e28e6
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Mon May 15 09:16:42 2017 +0200

    Merge branch 'develop' of https://github.com/mifosio/api into develop



[fineract-cn-api] 29/44: Adjusting to package name changes in upstream repositories.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 054d7e0370579a0e89bbb4197a7b2fa960a4b075
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Thu Apr 12 12:07:16 2018 +0200

    Adjusting to package name changes in upstream repositories.
---
 src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java | 6 +++---
 .../java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java  | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
index dadda82..7d95895 100644
--- a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
+++ b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
@@ -18,11 +18,11 @@
  */
 package io.mifos.core.api.util;
 
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
-import io.mifos.core.lang.TenantContextHolder;
-
-import static io.mifos.core.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import org.apache.fineract.cn.lang.TenantContextHolder;
 
 
 /**
diff --git a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
index 2f87f3d..acea4f5 100644
--- a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
+++ b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
@@ -19,7 +19,7 @@
 package io.mifos.core.api.util;
 
 import feign.RequestTemplate;
-import io.mifos.core.lang.TenantContextHolder;
+import org.apache.fineract.cn.lang.TenantContextHolder;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;


[fineract-cn-api] 38/44: Merge pull request #9 from aasaru/gradle_4.10.3

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit bb5af8dd2a4dc0f2345cc29eb21a1f13a7e4a5ee
Merge: e53cebb 2eaec86
Author: aasaru <aa...@gmail.com>
AuthorDate: Wed Oct 9 10:38:57 2019 +0300

    Merge pull request #9 from aasaru/gradle_4.10.3
    
    FINCN-179 gradle to 4.10.3, FINCN-178 make Travis build forks

 build.gradle                             |  12 +++++-------
 gradle/wrapper/gradle-wrapper.jar        | Bin 54212 -> 54212 bytes
 gradle/wrapper/gradle-wrapper.properties |   4 ++--
 travis.sh                                |  16 ++++++++++++----
 4 files changed, 19 insertions(+), 13 deletions(-)


[fineract-cn-api] 36/44: FINCN-179 minor improvements

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 85f0a2a00f04c3d35ecdd06611249aa37c8b303a
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Mon Sep 30 22:52:34 2019 +0300

    FINCN-179 minor improvements
---
 build.gradle | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/build.gradle b/build.gradle
index 04f7231..03f86b3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -28,6 +28,9 @@ plugins {
     id 'com.github.hierynomus.license' version '0.13.1'
     id("org.nosphere.apache.rat") version "0.3.1"
     id "com.jfrog.artifactory" version "4.9.5"
+    id 'maven-publish'
+    id 'idea'
+    id 'java'
 }
 
 group 'org.apache.fineract.cn'
@@ -41,11 +44,6 @@ ext.versions = [
         frameworklangversion : '0.1.0-BUILD-SNAPSHOT'
 ]
 
-apply plugin: 'java'
-apply plugin: 'idea'
-apply plugin: 'maven'
-apply plugin: 'maven-publish'
-apply plugin: 'license'
 apply plugin: 'io.spring.dependency-management'
 
 tasks.withType(JavaCompile) {


[fineract-cn-api] 06/44: Made annotated error decoder public so it can be used from anubis feign factory.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 6552ca6f0601f7bc8e0f677d798a84cbfd19fd0f
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Tue Apr 11 16:13:33 2017 +0200

    Made annotated error decoder public so it can be used from anubis feign factory.
---
 src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
index 0a23b40..192ad8c 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -35,12 +35,13 @@ import java.util.Optional;
 /**
  * @author Myrle Krantz
  */
-class AnnotatedErrorDecoder implements ErrorDecoder {
+@SuppressWarnings("WeakerAccess")
+public class AnnotatedErrorDecoder implements ErrorDecoder {
 
   private final Class feignClientClass;
   private final Logger logger;
 
-  AnnotatedErrorDecoder(final Logger logger, final Class feignClientClass) {
+  public AnnotatedErrorDecoder(final Logger logger, final Class feignClientClass) {
     this.logger = logger;
     this.feignClientClass = feignClientClass;
   }


[fineract-cn-api] 33/44: FINCN-148 build with travis-ci.com and upload artifacts to Artifactory

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 0194d1aa0f001afec03293ab76180c5c0bb4baac
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Thu Apr 25 11:44:19 2019 +0300

    FINCN-148 build with travis-ci.com and upload artifacts to Artifactory
---
 .travis.yml  | 30 +++++++++++++++++++++++++
 README.md    |  4 +---
 build.gradle | 24 +++++++++++++++++---
 travis.sh    | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 123 insertions(+), 6 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..83e9879
--- /dev/null
+++ b/.travis.yml
@@ -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.
+#
+language: java
+sudo: false
+jdk:
+- openjdk8
+install: true
+script: "./travis.sh"
+env:
+  global:
+    - BUILD_SNAPSHOTS_BRANCH=develop
+    - ARTIFACTORY_URL=https://mifos.jfrog.io/mifos
+    - ARTIFACTORY_USER=travis-ci
+    - secure: "pBilHkQXEbjH9CrtGQ4lwDEWEfk89kDFvGTKTWya4y0riQ/czOCbt+4pQ3NNHqVNMvsPQgtuh0ABIaVV1Ksc6FM8haRD74ehCyGMp+7NTKRmm2Yp41QezvWJ4IW/T0oIquimUXAbmL/0kWDv3NhrgJQVEBOdBAxqwxeY3iwRlTVqHmUgszGlRSbfDhxqe5ydSqAhhcYh2qFdfaXoTMrRqRZn5F3UWoxz0K0Hc2u05xkMgejJuZt4fJzHpLNL92/hBPSa5TiZwJSxWBJIte+mzFG/UxqmDc70/mQUHw5U76K/xJoYrLP7N40+tpcWUYwCPX/P8uus4ZvYSDoNQ6Q7/VDLyQChHjxr2IXKJ1DLWjRRnLFmXooeIPXyEJoZWWxKNcpNBNQ69h2RezL7q4UhP9Xr0LVlBuTti8W7NCpXSqeYuuuhJERy2kPtRRhlatsTagmR9v5c0YximTbouamdHybr8aGJH [...]
diff --git a/README.md b/README.md
index 6055c3c..2cebb38 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,4 @@
-# Apache Fineract CN Api
-
-[![Join the chat at https://gitter.im/mifos-initiative/mifos.io](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mifos-initiative/mifos.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+# Apache Fineract CN Api [![Build Status](https://api.travis-ci.com/apache/fineract-cn-api.svg?branch=develop)](https://travis-ci.com/apache/fineract-cn-api)
 
 This project is an umbrella for all Apache Fineract CN Core components.
 
diff --git a/build.gradle b/build.gradle
index 385aa95..a096f0e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,6 +27,7 @@ buildscript {
 plugins {
     id 'com.github.hierynomus.license' version '0.13.1'
     id("org.nosphere.apache.rat") version "0.3.1"
+    id "com.jfrog.artifactory" version "4.9.5"
 }
 
 group 'org.apache.fineract.cn'
@@ -55,6 +56,7 @@ tasks.withType(JavaCompile) {
 repositories {
     jcenter()
     mavenLocal()
+    maven { url 'https://mifos.jfrog.io/mifos/libs-snapshot/' }
 }
 
 dependencyManagement {
@@ -82,18 +84,34 @@ jar {
     from sourceSets.main.allSource
 }
 
-
 publishing {
     publications {
         apiPublication(MavenPublication) {
             from components.java
             groupId project.group
             artifactId project.name
-            version project.version
+            version findProperty('externalVersion') ?: project.version
         }
     }
 }
 
+artifactory {
+    contextUrl = System.getenv("ARTIFACTORY_URL")
+    publish {
+        repository {
+            repoKey = project.findProperty('artifactoryRepoKey')
+            username = System.getenv("ARTIFACTORY_USER")
+            password = System.getenv("ARTIFACTORY_PASSWORD")
+        }
+
+        defaults {
+            publications ('apiPublication')
+        }
+    }
+}
+artifactoryPublish.dependsOn('clean','publishToMavenLocal')
+
+
 license {
     header rootProject.file('HEADER')
     strictCheck true
@@ -114,4 +132,4 @@ rat {
             "gradlew.bat",
             "README.md"
     ]
-}
\ No newline at end of file
+}
diff --git a/travis.sh b/travis.sh
new file mode 100755
index 0000000..03a75ee
--- /dev/null
+++ b/travis.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+#
+# 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.
+#
+
+# Documentation: https://cwiki.apache.org/confluence/display/FINERACT/Fineract-CN+Artifactory
+
+#Exit immediately if a command exits with a non-zero status.
+set -e
+EXIT_STATUS=0
+
+# Builds and Publishes a SNAPSHOT
+function build_snapshot() {
+  echo -e "Building and publishing a snapshot out of branch [$TRAVIS_BRANCH]"
+  ./gradlew -PartifactoryRepoKey=libs-snapshot-local -DbuildInfo.build.number=${TRAVIS_COMMIT::7} artifactoryPublish --stacktrace || EXIT_STATUS=$?
+}
+
+# Builds a Pull Request
+function build_pullrequest() {
+  echo -e "Building pull request #$TRAVIS_PULL_REQUEST of branch [$TRAVIS_BRANCH]. Won't publish anything to Artifactory."
+  ./gradlew publishToMavenLocal rat || EXIT_STATUS=$?
+}
+
+# For other branches we need to add branch name as prefix
+function build_otherbranch() {
+  echo -e "Building a snapshot out of branch [$TRAVIS_BRANCH] and publishing it with prefix '${TRAVIS_BRANCH}-SNAPSHOT'"
+  ./gradlew -PartifactoryRepoKey=libs-snapshot-local -DbuildInfo.build.number=${TRAVIS_COMMIT::7} -PexternalVersion=${TRAVIS_BRANCH}-SNAPSHOT artifactoryPublish --stacktrace || EXIT_STATUS=$?
+}
+
+# Builds and Publishes a Tag
+function build_tag() {
+  echo -e "Building tag [$TRAVIS_TAG] and publishing it as a release"
+  ./gradlew -PartifactoryRepoKey=libs-release-local -PexternalVersion=$TRAVIS_TAG artifactoryPublish --stacktrace || EXIT_STATUS=$?
+
+}
+
+echo -e "TRAVIS_BRANCH=$TRAVIS_BRANCH"
+echo -e "TRAVIS_TAG=$TRAVIS_TAG"
+echo -e "TRAVIS_COMMIT=${TRAVIS_COMMIT::7}"
+echo -e "TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST"
+
+# Build Logic
+if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
+  build_pullrequest
+elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" != "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ]  ; then
+  build_otherbranch
+elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ] ; then
+  build_snapshot
+elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then
+  build_tag
+else
+  echo -e "WARN: Unexpected env variable values => Branch [$TRAVIS_BRANCH], Tag [$TRAVIS_TAG], Pull Request [#$TRAVIS_PULL_REQUEST]"
+  ./gradlew clean build
+fi
+
+exit ${EXIT_STATUS}


[fineract-cn-api] 09/44: Made cookie jar accessible so I can put stuff in it. This isn't going to solve my autowiring problem though.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 394486ea41df1b9bd8a6fc1e425052a0f7901ea0
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Mon May 15 09:16:04 2017 +0200

    Made cookie jar accessible so I can put stuff in it.  This isn't going to solve my autowiring problem though.
---
 .../java/io/mifos/core/api/util/ApiFactory.java    | 16 +++++++++
 .../core/api/util/CookieInterceptingClient.java    | 10 ++++++
 .../core/api/util/FeignTargetWithCookieJar.java    | 38 ++++++++++++++++++++++
 .../api/util/CookieInterceptingClientTest.java     | 11 +++++++
 4 files changed, 75 insertions(+)

diff --git a/src/main/java/io/mifos/core/api/util/ApiFactory.java b/src/main/java/io/mifos/core/api/util/ApiFactory.java
index aa8a7bf..a2535c1 100644
--- a/src/main/java/io/mifos/core/api/util/ApiFactory.java
+++ b/src/main/java/io/mifos/core/api/util/ApiFactory.java
@@ -52,4 +52,20 @@ public class ApiFactory {
         .encoder(new GsonEncoder())
         .target(clazz, target);
   }
+
+  public <T> FeignTargetWithCookieJar<T> createWithCookieJar(final Class<T> clazz, final String target) {
+    final CookieInterceptingClient client = new CookieInterceptingClient(target);
+    final T feignTarget = Feign.builder()
+            .contract(new SpringMvcContract())
+            .client(client)
+            .errorDecoder(new AnnotatedErrorDecoder(logger, clazz))
+            .requestInterceptor(new TenantedTargetInterceptor())
+            .requestInterceptor(new TokenedTargetInterceptor())
+            .requestInterceptor(client.getCookieInterceptor())
+            .decoder(new GsonDecoder())
+            .encoder(new GsonEncoder())
+            .target(clazz, target);
+
+    return new FeignTargetWithCookieJar<>(feignTarget, client);
+  }
 }
diff --git a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
index 98ef622..408a4d7 100644
--- a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
+++ b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
@@ -48,6 +48,16 @@ class CookieInterceptingClient extends Client.Default {
     return new CookieInterceptor();
   }
 
+  void putCookie(final String relativeUrl, final String cookieName, final String cookieValue) {
+    try {
+      final Map<String, List<String>> map = new HashMap<>();
+      map.put("Set-Cookie", Collections.singletonList(cookieName + "=" + cookieValue));
+      cookieManager.put(mapUriType(target + relativeUrl), map);
+    } catch (final IOException e) {
+      throw new IllegalStateException("Mapping cookies failed unexpectedly.");
+    }
+  }
+
   private class CookieInterceptor implements RequestInterceptor {
     @Override
     public void apply(final RequestTemplate template) {
diff --git a/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java b/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
new file mode 100644
index 0000000..2a9b661
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class FeignTargetWithCookieJar<T> {
+  private final T feignTarget;
+  private final CookieInterceptingClient cookieInterceptor;
+
+  FeignTargetWithCookieJar(final T feignTarget, final CookieInterceptingClient cookieInterceptor) {
+    this.feignTarget = feignTarget;
+    this.cookieInterceptor = cookieInterceptor;
+  }
+
+  public void putCookie(final String relativeUrl, final String cookieName, final String cookieValue) {
+    this.cookieInterceptor.putCookie(relativeUrl, cookieName, cookieValue);
+  }
+
+  public T getFeignTarget() {
+    return feignTarget;
+  }
+}
diff --git a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
index 9d9cb33..ebbf23f 100644
--- a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
+++ b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
@@ -78,4 +78,15 @@ public class CookieInterceptingClientTest {
 
     testSubject.getCookieInterceptor().apply(dummyRequestTemplate);
   }
+
+  @Test()
+  public void setCookieBetweenRemoteCalls() {
+    final CookieInterceptingClient testSubject = new CookieInterceptingClient(TEST_URL);
+    testSubject.putCookie("/blah", "token", "Bearerbear");
+    //request
+    final RequestTemplate dummyRequestTemplate = new RequestTemplate();
+    dummyRequestTemplate.append("/request");
+    testSubject.getCookieInterceptor().apply(dummyRequestTemplate);
+    Assert.assertEquals(Collections.singletonList("token=Bearerbear"), dummyRequestTemplate.headers().get("Cookie"));
+  }
 }
\ No newline at end of file


[fineract-cn-api] 30/44: Change package names from mifos to apache fineract.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 562823965ca23656daf5345f6bddc8c0dba8376d
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Thu Apr 12 12:13:30 2018 +0200

    Change package names from mifos to apache fineract.
---
 .../apache/fineract/cn}/api/annotation/ThrowsException.java   |  2 +-
 .../apache/fineract/cn}/api/annotation/ThrowsExceptions.java  |  2 +-
 .../apache/fineract/cn}/api/config/ApiConfiguration.java      |  4 ++--
 .../apache/fineract/cn}/api/config/EnableApiFactory.java      |  2 +-
 .../apache/fineract/cn}/api/context/AutoGuest.java            |  2 +-
 .../apache/fineract/cn}/api/context/AutoSeshat.java           |  4 ++--
 .../apache/fineract/cn}/api/context/AutoUserContext.java      |  6 +++---
 .../apache/fineract/cn}/api/util/AnnotatedErrorDecoder.java   |  6 +++---
 .../apache/fineract/cn}/api/util/ApiConstants.java            |  2 +-
 .../core => org/apache/fineract/cn}/api/util/ApiFactory.java  |  4 ++--
 .../fineract/cn}/api/util/CookieInterceptingClient.java       |  2 +-
 .../cn}/api/util/CustomFeignClientsConfiguration.java         | 11 +++++------
 .../apache/fineract/cn}/api/util/EmptyBodyInterceptor.java    |  2 +-
 .../fineract/cn}/api/util/FeignTargetWithCookieJar.java       |  2 +-
 .../apache/fineract/cn}/api/util/InternalServerError.java     |  2 +-
 .../apache/fineract/cn}/api/util/InvalidTokenException.java   |  2 +-
 .../apache/fineract/cn}/api/util/NotFoundException.java       |  2 +-
 .../fineract/cn}/api/util/TenantedTargetInterceptor.java      |  2 +-
 .../fineract/cn}/api/util/TokenedTargetInterceptor.java       |  2 +-
 .../core => org/apache/fineract/cn}/api/util/UserContext.java |  2 +-
 .../apache/fineract/cn}/api/util/UserContextHolder.java       |  2 +-
 .../apache/fineract/cn}/api/context/AutoUserContextTest.java  |  6 ++----
 .../fineract/cn}/api/util/AnnotatedErrorDecoderTest.java      |  4 ++--
 .../fineract/cn}/api/util/CookieInterceptingClientTest.java   |  2 +-
 .../fineract/cn}/api/util/TenantedTargetInterceptorTest.java  |  2 +-
 .../fineract/cn}/api/util/TokenedTargetInterceptorTest.java   |  4 ++--
 .../apache/fineract/cn}/api/util/UserContextHolderTest.java   |  2 +-
 27 files changed, 41 insertions(+), 44 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsException.java b/src/main/java/org/apache/fineract/cn/api/annotation/ThrowsException.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/annotation/ThrowsException.java
rename to src/main/java/org/apache/fineract/cn/api/annotation/ThrowsException.java
index 5d0c3ab..040aec3 100644
--- a/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
+++ b/src/main/java/org/apache/fineract/cn/api/annotation/ThrowsException.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.annotation;
+package org.apache.fineract.cn.api.annotation;
 
 import org.springframework.http.HttpStatus;
 
diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java b/src/main/java/org/apache/fineract/cn/api/annotation/ThrowsExceptions.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
rename to src/main/java/org/apache/fineract/cn/api/annotation/ThrowsExceptions.java
index 0a78ef7..06dd0e6 100644
--- a/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
+++ b/src/main/java/org/apache/fineract/cn/api/annotation/ThrowsExceptions.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.annotation;
+package org.apache.fineract.cn.api.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/src/main/java/io/mifos/core/api/config/ApiConfiguration.java b/src/main/java/org/apache/fineract/cn/api/config/ApiConfiguration.java
similarity index 93%
rename from src/main/java/io/mifos/core/api/config/ApiConfiguration.java
rename to src/main/java/org/apache/fineract/cn/api/config/ApiConfiguration.java
index db170a0..56d4994 100644
--- a/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
+++ b/src/main/java/org/apache/fineract/cn/api/config/ApiConfiguration.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.config;
+package org.apache.fineract.cn.api.config;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,7 +28,7 @@ import org.springframework.context.annotation.Configuration;
  * @author Myrle Krantz
  */
 @Configuration
-@ComponentScan({"io.mifos.core.api.util"})
+@ComponentScan({"org.apache.fineract.cn.api.util"})
 public class ApiConfiguration {
 
   public static final String LOGGER_NAME = "api-logger";
diff --git a/src/main/java/io/mifos/core/api/config/EnableApiFactory.java b/src/main/java/org/apache/fineract/cn/api/config/EnableApiFactory.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/config/EnableApiFactory.java
rename to src/main/java/org/apache/fineract/cn/api/config/EnableApiFactory.java
index c332dad..d010d5c 100644
--- a/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
+++ b/src/main/java/org/apache/fineract/cn/api/config/EnableApiFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.config;
+package org.apache.fineract.cn.api.config;
 
 import org.springframework.context.annotation.Import;
 
diff --git a/src/main/java/io/mifos/core/api/context/AutoGuest.java b/src/main/java/org/apache/fineract/cn/api/context/AutoGuest.java
similarity index 95%
rename from src/main/java/io/mifos/core/api/context/AutoGuest.java
rename to src/main/java/org/apache/fineract/cn/api/context/AutoGuest.java
index 0256303..e936cba 100644
--- a/src/main/java/io/mifos/core/api/context/AutoGuest.java
+++ b/src/main/java/org/apache/fineract/cn/api/context/AutoGuest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.context;
+package org.apache.fineract.cn.api.context;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/context/AutoSeshat.java b/src/main/java/org/apache/fineract/cn/api/context/AutoSeshat.java
similarity index 91%
rename from src/main/java/io/mifos/core/api/context/AutoSeshat.java
rename to src/main/java/org/apache/fineract/cn/api/context/AutoSeshat.java
index acb2322..f111b60 100644
--- a/src/main/java/io/mifos/core/api/context/AutoSeshat.java
+++ b/src/main/java/org/apache/fineract/cn/api/context/AutoSeshat.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.context;
+package org.apache.fineract.cn.api.context;
 
-import io.mifos.core.api.util.ApiConstants;
+import org.apache.fineract.cn.api.util.ApiConstants;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/context/AutoUserContext.java b/src/main/java/org/apache/fineract/cn/api/context/AutoUserContext.java
similarity index 90%
rename from src/main/java/io/mifos/core/api/context/AutoUserContext.java
rename to src/main/java/org/apache/fineract/cn/api/context/AutoUserContext.java
index 5643f79..1b6f48c 100644
--- a/src/main/java/io/mifos/core/api/context/AutoUserContext.java
+++ b/src/main/java/org/apache/fineract/cn/api/context/AutoUserContext.java
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.context;
+package org.apache.fineract.cn.api.context;
 
-import io.mifos.core.api.util.UserContext;
-import io.mifos.core.api.util.UserContextHolder;
+import org.apache.fineract.cn.api.util.UserContext;
+import org.apache.fineract.cn.api.util.UserContextHolder;
 
 import java.util.Optional;
 
diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoder.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
rename to src/main/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoder.java
index 792ab28..a50025b 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoder.java
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.Feign;
 import feign.FeignException;
 import feign.Response;
 import feign.Util;
 import feign.codec.ErrorDecoder;
-import io.mifos.core.api.annotation.ThrowsException;
-import io.mifos.core.api.annotation.ThrowsExceptions;
+import org.apache.fineract.cn.api.annotation.ThrowsException;
+import org.apache.fineract.cn.api.annotation.ThrowsExceptions;
 import org.slf4j.Logger;
 import org.springframework.http.HttpStatus;
 
diff --git a/src/main/java/io/mifos/core/api/util/ApiConstants.java b/src/main/java/org/apache/fineract/cn/api/util/ApiConstants.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/util/ApiConstants.java
rename to src/main/java/org/apache/fineract/cn/api/util/ApiConstants.java
index ed19428..aa83a42 100644
--- a/src/main/java/io/mifos/core/api/util/ApiConstants.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/ApiConstants.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/util/ApiFactory.java b/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/util/ApiFactory.java
rename to src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
index b60472b..1a574bd 100644
--- a/src/main/java/io/mifos/core/api/util/ApiFactory.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.Feign;
 import feign.gson.GsonDecoder;
 import feign.gson.GsonEncoder;
-import io.mifos.core.api.config.ApiConfiguration;
+import org.apache.fineract.cn.api.config.ApiConfiguration;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
diff --git a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java b/src/main/java/org/apache/fineract/cn/api/util/CookieInterceptingClient.java
similarity index 98%
rename from src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
rename to src/main/java/org/apache/fineract/cn/api/util/CookieInterceptingClient.java
index faa634e..fdc64aa 100644
--- a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/CookieInterceptingClient.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.*;
 
diff --git a/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
similarity index 89%
rename from src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
rename to src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
index 783c6d1..d8e4b60 100644
--- a/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.Feign;
 import feign.Target;
@@ -24,6 +24,7 @@ import feign.codec.Decoder;
 import feign.codec.Encoder;
 import feign.gson.GsonDecoder;
 import feign.gson.GsonEncoder;
+import org.apache.fineract.cn.api.config.ApiConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -32,8 +33,6 @@ import org.springframework.cloud.netflix.feign.FeignClientsConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Scope;
 
-import static io.mifos.core.api.config.ApiConfiguration.LOGGER_NAME;
-
 /**
  * @author Myrle Krantz
  */
@@ -79,15 +78,15 @@ public class CustomFeignClientsConfiguration extends FeignClientsConfiguration {
     return new GsonEncoder();
   }
 
-  @Bean(name = LOGGER_NAME)
+  @Bean(name = ApiConfiguration.LOGGER_NAME)
   public Logger logger() {
-    return LoggerFactory.getLogger(LOGGER_NAME);
+    return LoggerFactory.getLogger(ApiConfiguration.LOGGER_NAME);
   }
 
   @Bean
   @Scope("prototype")
   @ConditionalOnMissingBean
-  public Feign.Builder feignBuilder(@Qualifier(LOGGER_NAME) final Logger logger) {
+  public Feign.Builder feignBuilder(@Qualifier(ApiConfiguration.LOGGER_NAME) final Logger logger) {
     return new AnnotatedErrorDecoderFeignBuilder(logger);
   }
 }
\ No newline at end of file
diff --git a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java b/src/main/java/org/apache/fineract/cn/api/util/EmptyBodyInterceptor.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
rename to src/main/java/org/apache/fineract/cn/api/util/EmptyBodyInterceptor.java
index 9c9371a..0a0bb04 100644
--- a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/EmptyBodyInterceptor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
diff --git a/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java b/src/main/java/org/apache/fineract/cn/api/util/FeignTargetWithCookieJar.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
rename to src/main/java/org/apache/fineract/cn/api/util/FeignTargetWithCookieJar.java
index 700acd6..3af9fcc 100644
--- a/src/main/java/io/mifos/core/api/util/FeignTargetWithCookieJar.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/FeignTargetWithCookieJar.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/util/InternalServerError.java b/src/main/java/org/apache/fineract/cn/api/util/InternalServerError.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/util/InternalServerError.java
rename to src/main/java/org/apache/fineract/cn/api/util/InternalServerError.java
index 9fcfe19..abac3fb 100644
--- a/src/main/java/io/mifos/core/api/util/InternalServerError.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/InternalServerError.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/util/InvalidTokenException.java b/src/main/java/org/apache/fineract/cn/api/util/InvalidTokenException.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/util/InvalidTokenException.java
rename to src/main/java/org/apache/fineract/cn/api/util/InvalidTokenException.java
index 609d672..29a0087 100644
--- a/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/InvalidTokenException.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/util/NotFoundException.java b/src/main/java/org/apache/fineract/cn/api/util/NotFoundException.java
similarity index 96%
rename from src/main/java/io/mifos/core/api/util/NotFoundException.java
rename to src/main/java/org/apache/fineract/cn/api/util/NotFoundException.java
index db0fb2d..095f5a5 100644
--- a/src/main/java/io/mifos/core/api/util/NotFoundException.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/NotFoundException.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 /**
  * @author Myrle Krantz
diff --git a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java b/src/main/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptor.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
rename to src/main/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptor.java
index 7d95895..c73b970 100644
--- a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
 
diff --git a/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java b/src/main/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptor.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
rename to src/main/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptor.java
index c4d108d..072cc9c 100644
--- a/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
diff --git a/src/main/java/io/mifos/core/api/util/UserContext.java b/src/main/java/org/apache/fineract/cn/api/util/UserContext.java
similarity index 97%
rename from src/main/java/io/mifos/core/api/util/UserContext.java
rename to src/main/java/org/apache/fineract/cn/api/util/UserContext.java
index 1dd20ad..ceb6226 100644
--- a/src/main/java/io/mifos/core/api/util/UserContext.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/UserContext.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import javax.annotation.Nonnull;
 import java.util.Objects;
diff --git a/src/main/java/io/mifos/core/api/util/UserContextHolder.java b/src/main/java/org/apache/fineract/cn/api/util/UserContextHolder.java
similarity index 98%
rename from src/main/java/io/mifos/core/api/util/UserContextHolder.java
rename to src/main/java/org/apache/fineract/cn/api/util/UserContextHolder.java
index f4cc13a..3673db3 100644
--- a/src/main/java/io/mifos/core/api/util/UserContextHolder.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/UserContextHolder.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import org.springframework.util.Assert;
 
diff --git a/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java b/src/test/java/org/apache/fineract/cn/api/context/AutoUserContextTest.java
similarity index 92%
rename from src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
rename to src/test/java/org/apache/fineract/cn/api/context/AutoUserContextTest.java
index 43b5ce7..15afe80 100644
--- a/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/context/AutoUserContextTest.java
@@ -16,14 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.context;
+package org.apache.fineract.cn.api.context;
 
-import io.mifos.core.api.util.UserContextHolder;
+import org.apache.fineract.cn.api.util.UserContextHolder;
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.util.Optional;
-
 /**
  * @author Myrle Krantz
  */
diff --git a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java b/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
similarity index 99%
rename from src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
rename to src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
index 7316f82..b272ab7 100644
--- a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.Feign;
 import feign.FeignException;
 import feign.Response;
-import io.mifos.core.api.annotation.ThrowsException;
+import org.apache.fineract.cn.api.annotation.ThrowsException;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java b/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
similarity index 98%
rename from src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
rename to src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
index 0a7c520..0b64af1 100644
--- a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.Request;
 import feign.RequestTemplate;
diff --git a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java b/src/test/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptorTest.java
similarity index 97%
rename from src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
rename to src/test/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptorTest.java
index acea4f5..e9f0a4f 100644
--- a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/TenantedTargetInterceptorTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.RequestTemplate;
 import org.apache.fineract.cn.lang.TenantContextHolder;
diff --git a/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java b/src/test/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptorTest.java
similarity index 93%
rename from src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
rename to src/test/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptorTest.java
index b907bc0..b6dd9dc 100644
--- a/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/TokenedTargetInterceptorTest.java
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import feign.RequestTemplate;
-import io.mifos.core.api.context.AutoUserContext;
+import org.apache.fineract.cn.api.context.AutoUserContext;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java b/src/test/java/org/apache/fineract/cn/api/util/UserContextHolderTest.java
similarity index 98%
rename from src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
rename to src/test/java/org/apache/fineract/cn/api/util/UserContextHolderTest.java
index 9f56a9a..dcdefc0 100644
--- a/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/UserContextHolderTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package io.mifos.core.api.util;
+package org.apache.fineract.cn.api.util;
 
 import org.apache.commons.lang.RandomStringUtils;
 import org.junit.Assert;


[fineract-cn-api] 34/44: Merge pull request #8 from aasaru/artifactory

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit e53cebbd8a67f40952feeb66998fa56d05d652c9
Merge: d528dcc 0194d1a
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Tue Apr 30 09:21:01 2019 +0100

    Merge pull request #8 from aasaru/artifactory
    
    FINCN-148 build with travis-ci.com and upload artifacts to Artifactory

 .travis.yml  | 30 +++++++++++++++++++++++++
 README.md    |  4 +---
 build.gradle | 24 +++++++++++++++++---
 travis.sh    | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 123 insertions(+), 6 deletions(-)


[fineract-cn-api] 42/44: update spring cloud version

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit c92ac89d7c8aa93be47149af2965f61a58b677b2
Author: xurror <ka...@outlook.com>
AuthorDate: Mon Apr 20 09:37:09 2020 +0100

    update spring cloud version
---
 .gitignore                                                          | 3 ++-
 build.gradle                                                        | 6 ++++--
 .../fineract/cn/api/util/CustomFeignClientsConfiguration.java       | 2 +-
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/.gitignore b/.gitignore
index 536de5a..a7c2d8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,8 @@
 .idea
 build/
 target/
-
+.project
+.settings/
 # Ignore Gradle GUI config
 gradle-app.setting
 
diff --git a/build.gradle b/build.gradle
index ea77300..1916846 100644
--- a/build.gradle
+++ b/build.gradle
@@ -59,7 +59,7 @@ repositories {
 
 dependencyManagement {
     imports {
-        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
+        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR2'
     }
 }
 
@@ -128,6 +128,8 @@ rat {
             "build/**",
             "gradlew",
             "gradlew.bat",
-            "README.md"
+            "README.md",
+            ".project",
+            ".settings/**"
     ]
 }
diff --git a/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
index d8e4b60..76888a1 100644
--- a/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java
@@ -29,7 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.cloud.netflix.feign.FeignClientsConfiguration;
+import org.springframework.cloud.openfeign.FeignClientsConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Scope;
 


[fineract-cn-api] 44/44: Merge pull request #12 from muellners/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 0afb0658a10eddd4b79de9b3225e8f87e4c66315
Merge: a2df9f4 dd34578
Author: aasaru <aa...@gmail.com>
AuthorDate: Tue Apr 21 17:51:28 2020 +0300

    Merge pull request #12 from muellners/develop
    
    Update spring to version 2.x.x

 .gitignore                                         |  5 ++-
 build.gradle                                       | 26 ++++++++------
 .../apache/fineract/cn/api/util/ApiFactory.java    |  2 +-
 .../api/util/CustomFeignClientsConfiguration.java  |  2 +-
 .../cn/api/util/AnnotatedErrorDecoderTest.java     | 40 ++++++++++++++--------
 .../cn/api/util/CookieInterceptingClientTest.java  |  5 +--
 6 files changed, 50 insertions(+), 30 deletions(-)


[fineract-cn-api] 41/44: update spring boot and spring cloud dep

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 21826cfa79e14fdfad6a5db9e885a82727f45aa7
Author: xurror <ka...@outlook.com>
AuthorDate: Sun Apr 19 14:49:51 2020 +0100

    update spring boot and spring cloud dep
---
 build.gradle                                         | 20 ++++++++++----------
 .../org/apache/fineract/cn/api/util/ApiFactory.java  |  2 +-
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/build.gradle b/build.gradle
index 96abe59..ea77300 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,9 +25,9 @@ buildscript {
 }
 
 plugins {
-    id 'com.github.hierynomus.license' version '0.13.1'
-    id("org.nosphere.apache.rat") version "0.3.1"
-    id "com.jfrog.artifactory" version "4.9.5"
+    id 'com.github.hierynomus.license' version '0.15.0'
+    id("org.nosphere.apache.rat") version "0.6.0"
+    id "com.jfrog.artifactory" version "4.15.1"
     id 'maven-publish'
     id 'idea'
     id 'java'
@@ -37,10 +37,10 @@ group 'org.apache.fineract.cn'
 version 'spring_boot_2-SNAPSHOT'
 
 ext.versions = [
-        springcontext        : '4.3.3.RELEASE',
-        springboot           : '1.4.1.RELEASE',
-        feigngson            : '8.16.2',
-        findbugs             : '3.0.1',
+        springcontext        : '5.2.5.RELEASE',
+        springboot           : '2.2.6.RELEASE',
+        feigngson            : '8.18.0',
+        findbugs             : '3.0.2',
         frameworklangversion : 'spring_boot_2-SNAPSHOT'
 ]
 
@@ -59,14 +59,14 @@ repositories {
 
 dependencyManagement {
     imports {
-        mavenBom 'org.springframework.cloud:spring-cloud-netflix:1.2.0.RELEASE'
+        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
     }
 }
 
 dependencies {
     compile(
-            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign'],
-            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign'],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client'],
             [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
             [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
             [group: 'com.netflix.feign', name: 'feign-gson', version: versions.feigngson],
diff --git a/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java b/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
index 1a574bd..7ac1e2b 100644
--- a/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
+++ b/src/main/java/org/apache/fineract/cn/api/util/ApiFactory.java
@@ -25,7 +25,7 @@ import org.apache.fineract.cn.api.config.ApiConfiguration;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.cloud.netflix.feign.support.SpringMvcContract;
+import org.springframework.cloud.openfeign.support.SpringMvcContract;
 import org.springframework.stereotype.Component;
 
 /**


[fineract-cn-api] 12/44: De-uglified some twisted optional use.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 69fee9001e89b69e9e301cb5098bfc9613ed01a5
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Wed Jun 14 15:29:07 2017 +0200

    De-uglified some twisted optional use.
---
 .../java/io/mifos/core/api/util/AnnotatedErrorDecoder.java | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
index 192ad8c..367b741 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -50,16 +50,16 @@ public class AnnotatedErrorDecoder implements ErrorDecoder {
   public Exception decode(
       final String methodKey,
       final Response response) {
-    final Optional<Optional<Optional<Exception>>> ret =
+    final Optional<Exception> ret =
         Arrays.stream(feignClientClass.getMethods())
             .filter(method -> Feign.configKey(feignClientClass, method).equals(methodKey))
             .map(method -> {
               final Optional<ThrowsException> annotation = getMatchingAnnotation(response, method);
-              return annotation.map(a -> constructException(response, a));
+              return annotation.flatMap(a -> constructException(response, a));
             })
-            .findAny();
+            .findAny().flatMap(x -> x);
 
-    return unwrapEmbeddedOptional(ret, getAlternative(methodKey, response));
+    return ret.orElse(getAlternative(methodKey, response));
   }
 
   private RuntimeException getAlternative(final String methodKey, final Response response) {
@@ -115,12 +115,6 @@ public class AnnotatedErrorDecoder implements ErrorDecoder {
     return throwsExceptionAnnotation.status().value() == response.status();
   }
 
-  @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
-  private <T> T unwrapEmbeddedOptional(
-      final Optional<Optional<Optional<T>>> embeddedOptional, T alternative) {
-    return embeddedOptional.orElse(Optional.empty()).orElse(Optional.empty()).orElse(alternative);
-  }
-
   private Optional<Exception> constructException(
       final Response response,
       final ThrowsException throwsExceptionAnnotations) {


[fineract-cn-api] 37/44: upgrade bugfix version

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 2eaec86073ecc74211ce711f05a99261272da767
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Mon Sep 30 22:55:16 2019 +0300

    upgrade bugfix version
---
 build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.gradle b/build.gradle
index 03f86b3..cf9bc49 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,7 +20,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
+        classpath 'io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE'
     }
 }
 


[fineract-cn-api] 16/44: made constructor public

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 801863f049954a8e2fe90ed40abbc07aa9c5d1df
Author: mgeiss <mg...@mifos.org>
AuthorDate: Wed Sep 27 09:34:51 2017 +0200

    made constructor public
---
 src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
index dbfd105..1183432 100644
--- a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
+++ b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
@@ -27,7 +27,7 @@ import java.nio.charset.Charset;
  */
 public class EmptyBodyInterceptor implements RequestInterceptor {
 
-  EmptyBodyInterceptor() {
+  public EmptyBodyInterceptor() {
     super();
   }
 


[fineract-cn-api] 03/44: Improving default exception handling to include response body.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 601a8d09531b4132b8c1e7f5ca55f910b4814aef
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Mon Mar 27 18:19:29 2017 +0200

    Improving default exception handling to include response body.
---
 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 29 +++++++++++++++-------
 .../io/mifos/core/api/util/NotFoundException.java  |  3 +++
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
index cb6f0d5..af7387c 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -18,12 +18,14 @@ package io.mifos.core.api.util;
 import feign.Feign;
 import feign.FeignException;
 import feign.Response;
+import feign.Util;
 import feign.codec.ErrorDecoder;
 import io.mifos.core.api.annotation.ThrowsException;
 import io.mifos.core.api.annotation.ThrowsExceptions;
 import org.slf4j.Logger;
 import org.springframework.http.HttpStatus;
 
+import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -60,16 +62,25 @@ class AnnotatedErrorDecoder implements ErrorDecoder {
   }
 
   private RuntimeException getAlternative(final String methodKey, final Response response) {
-    if (response.status() == HttpStatus.BAD_REQUEST.value()) {
-      return new IllegalArgumentException(response.reason());
-    } else if (response.status() == HttpStatus.FORBIDDEN.value()) {
-      return new InvalidTokenException(response.reason());
-    } else if (response.status() == HttpStatus.NOT_FOUND.value()) {
-      return new NotFoundException();
-    } else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
-      return new InternalServerError(response.reason());
-    } else {
+    try {
+      final String bodyText = Util.toString(response.body().asReader());
+
+      if (response.status() == HttpStatus.BAD_REQUEST.value()) {
+        return new IllegalArgumentException(bodyText);
+      } else if (response.status() == HttpStatus.FORBIDDEN.value()) {
+        return new InvalidTokenException(bodyText);
+      } else if (response.status() == HttpStatus.NOT_FOUND.value()) {
+        return new NotFoundException(bodyText);
+      } else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
+        return new InternalServerError(bodyText);
+      } else {
+        return FeignException.errorStatus(methodKey, response);
+      }
+
+    } catch (IOException e) {
+
       return FeignException.errorStatus(methodKey, response);
+
     }
   }
 
diff --git a/src/main/java/io/mifos/core/api/util/NotFoundException.java b/src/main/java/io/mifos/core/api/util/NotFoundException.java
index 9649cd5..98650e8 100644
--- a/src/main/java/io/mifos/core/api/util/NotFoundException.java
+++ b/src/main/java/io/mifos/core/api/util/NotFoundException.java
@@ -21,4 +21,7 @@ package io.mifos.core.api.util;
 @SuppressWarnings("WeakerAccess")
 public class NotFoundException extends RuntimeException {
 
+  public NotFoundException(final String reason) {
+    super(reason);
+  }
 }


[fineract-cn-api] 19/44: Merge pull request #1 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 943b8a02ed8a6bf53b4f576b7541f38c819c2ede
Merge: b00a37e ac10dc3
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Feb 26 18:26:12 2018 +0100

    Merge pull request #1 from myrle-krantz/develop
    
    updating artifact ids to apache fineract from mifos io

 build.gradle | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)


[fineract-cn-api] 04/44: Adding the ability to define exceptions via ThrowException which accept a string as a parameter.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 8514adc3e8f28c7e19246576eadb21e8b32d50fc
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Tue Mar 28 11:14:56 2017 +0200

    Adding the ability to define exceptions via ThrowException which accept a string as a parameter.
---
 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 57 ++++++++++--------
 .../core/api/util/AnnotatedErrorDecoderTest.java   | 68 +++++++++++++++++++---
 2 files changed, 92 insertions(+), 33 deletions(-)

diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
index af7387c..0a23b40 100644
--- a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -62,26 +62,28 @@ class AnnotatedErrorDecoder implements ErrorDecoder {
   }
 
   private RuntimeException getAlternative(final String methodKey, final Response response) {
-    try {
-      final String bodyText = Util.toString(response.body().asReader());
-
-      if (response.status() == HttpStatus.BAD_REQUEST.value()) {
-        return new IllegalArgumentException(bodyText);
-      } else if (response.status() == HttpStatus.FORBIDDEN.value()) {
-        return new InvalidTokenException(bodyText);
-      } else if (response.status() == HttpStatus.NOT_FOUND.value()) {
-        return new NotFoundException(bodyText);
-      } else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
-        return new InternalServerError(bodyText);
-      } else {
-        return FeignException.errorStatus(methodKey, response);
-      }
-
-    } catch (IOException e) {
-
+    final String bodyText = stringifyBody(response);
+
+    if (response.status() == HttpStatus.BAD_REQUEST.value()) {
+      return new IllegalArgumentException(bodyText);
+    } else if (response.status() == HttpStatus.FORBIDDEN.value()) {
+      return new InvalidTokenException(bodyText);
+    } else if (response.status() == HttpStatus.NOT_FOUND.value()) {
+      return new NotFoundException(bodyText);
+    } else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
+      return new InternalServerError(bodyText);
+    } else {
       return FeignException.errorStatus(methodKey, response);
+    }
+  }
 
+  private String stringifyBody(final Response response) {
+    try {
+      if (response.body() != null)
+        return Util.toString(response.body().asReader());
+    } catch (IOException ignored) {
     }
+    return null;
   }
 
   private Optional<ThrowsException> getMatchingAnnotation(
@@ -123,16 +125,23 @@ class AnnotatedErrorDecoder implements ErrorDecoder {
       final ThrowsException throwsExceptionAnnotations) {
     try {
       try {
-        final Constructor<? extends RuntimeException> oneArgumentConstructor =
+        final Constructor<? extends RuntimeException> oneResponseArgumentConstructor =
             throwsExceptionAnnotations.exception().getConstructor(Response.class);
 
-        return Optional.of(oneArgumentConstructor.newInstance(response));
+        return Optional.of(oneResponseArgumentConstructor.newInstance(response));
       } catch (final NoSuchMethodException e) {
-
-        final Constructor<? extends RuntimeException> noArgumentConstructor =
-            throwsExceptionAnnotations.exception().getConstructor();
-
-        return Optional.of(noArgumentConstructor.newInstance());
+        try {
+          final Constructor<? extends RuntimeException> noArgumentConstructor =
+                  throwsExceptionAnnotations.exception().getConstructor();
+
+          return Optional.of(noArgumentConstructor.newInstance());
+        }
+        catch (final NoSuchMethodException e2) {
+          final Constructor<? extends RuntimeException> noStringArgumentConstructor =
+                  throwsExceptionAnnotations.exception().getConstructor(String.class);
+
+          return Optional.of(noStringArgumentConstructor.newInstance(stringifyBody(response)));
+        }
       }
     } catch (final InvocationTargetException
         | IllegalAccessException
diff --git a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
index 7dc1104..fc53e4c 100644
--- a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
+++ b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
@@ -26,6 +26,7 @@ import org.junit.runners.Parameterized;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -48,37 +49,48 @@ public class AnnotatedErrorDecoderTest {
 
     final Response emptyInternalServerErrorResponse = Response.builder()
             .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
     final Response emptyBadRequestResponse = Response.builder()
             .status(HttpStatus.BAD_REQUEST.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyBadRequestResponseWithNoBody = Response.builder()
+            .status(HttpStatus.BAD_REQUEST.value())
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyNotFoundRequestResponse = Response.builder()
+            .status(HttpStatus.NOT_FOUND.value())
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
     final Response emptyConflictResponse = Response.builder()
             .status(HttpStatus.CONFLICT.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
     final Response emptyIAmATeapotResponse = Response.builder()
             .status(HttpStatus.I_AM_A_TEAPOT.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
     final Response emptyUnauthorizedResponse = Response.builder()
             .status(HttpStatus.UNAUTHORIZED.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
     final Response emptyForbiddenResponse = Response.builder()
             .status(HttpStatus.FORBIDDEN.value())
-            .reason("blah")
+            .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
             .build();
 
@@ -91,7 +103,10 @@ public class AnnotatedErrorDecoderTest {
         Feign.configKey(OneMethodInterface.class, OneMethodInterface.class.getMethod("method"));
 
     final String onceAnnotatedMethodKey =
-        Feign.configKey(OneMethodOneAnnotationInterface.class, OneMethodOneAnnotationInterface.class.getMethod("method"));
+            Feign.configKey(OneMethodOneAnnotationInterface.class, OneMethodOneAnnotationInterface.class.getMethod("method"));
+
+    final String onceAnnotatedWithStringExceptionMethodKey =
+            Feign.configKey(OneMethodOneAnnotationStringParameteredExceptionInterface.class, OneMethodOneAnnotationStringParameteredExceptionInterface.class.getMethod("method"));
 
     ret.add(new TestCase("Methodless interface")
         .clazz(MethodlessInterface.class)
@@ -135,12 +150,31 @@ public class AnnotatedErrorDecoderTest {
         .response(emptyBadRequestResponse)
         .expectedResult(new ParameterlessException()));
 
+    ret.add(new TestCase("Interface with one method that has one annotation containing an exception which accepts a string parameter.")
+            .clazz(OneMethodOneAnnotationStringParameteredExceptionInterface.class)
+            .methodKey(onceAnnotatedWithStringExceptionMethodKey)
+            .response(emptyBadRequestResponse)
+            .expectedResult(new StringParameteredException("blah")));
+
     ret.add(new TestCase("Bad request on an interface in which bad request isn't mapped.")
         .clazz(AnnotationlessInterface.class)
         .methodKey(annotationlessMethodKey)
         .response(emptyBadRequestResponse)
         .expectedResult(new IllegalArgumentException("blah")));
 
+    ret.add(new TestCase("Bad request with no body on an interface in which bad request isn't mapped.")
+            .clazz(AnnotationlessInterface.class)
+            .methodKey(annotationlessMethodKey)
+            .response(emptyBadRequestResponseWithNoBody)
+            .expectedResult(new IllegalArgumentException((String)null)));
+
+
+    ret.add(new TestCase("Not found request on an interface in which not found request isn't mapped.")
+            .clazz(AnnotationlessInterface.class)
+            .methodKey(annotationlessMethodKey)
+            .response(emptyNotFoundRequestResponse)
+            .expectedResult(new NotFoundException("blah")));
+
     ret.add(new TestCase("Request with invalid token.")
         .clazz(OneMethodOneAnnotationInterface.class)
         .methodKey(onceAnnotatedMethodKey)
@@ -199,6 +233,14 @@ public class AnnotatedErrorDecoderTest {
     void method();
   }
 
+
+  private interface OneMethodOneAnnotationStringParameteredExceptionInterface {
+
+    @SuppressWarnings("unused")
+    @ThrowsException(status = HttpStatus.BAD_REQUEST, exception = StringParameteredException.class)
+    void method();
+  }
+
   private static class TestCase {
 
     private final String name;
@@ -272,10 +314,18 @@ public class AnnotatedErrorDecoderTest {
     }
   }
 
+  private static class StringParameteredException extends RuntimeException {
+
+    @SuppressWarnings("WeakerAccess")
+    public StringParameteredException(final String response) {
+      super(response);
+    }
+  }
+
   private static class WrongParameteredException extends RuntimeException {
 
-    public WrongParameteredException(final String message) {
-      super(message);
+    public WrongParameteredException(final Integer message) {
+      super(message.toString());
     }
   }
 }


[fineract-cn-api] 43/44: update deprecated methods

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit dd34578d7f316ae21ca02ea50445d4e10b550bd7
Author: xurror <ka...@outlook.com>
AuthorDate: Tue Apr 21 08:18:39 2020 +0100

    update deprecated methods
---
 .gitignore                                         |  2 ++
 build.gradle                                       |  4 ++-
 .../cn/api/util/AnnotatedErrorDecoderTest.java     | 40 ++++++++++++++--------
 .../cn/api/util/CookieInterceptingClientTest.java  |  5 +--
 4 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/.gitignore b/.gitignore
index a7c2d8b..c0af34f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,8 +2,10 @@
 .idea
 build/
 target/
+bin/
 .project
 .settings/
+.classpath
 # Ignore Gradle GUI config
 gradle-app.setting
 
diff --git a/build.gradle b/build.gradle
index 1916846..24c0680 100644
--- a/build.gradle
+++ b/build.gradle
@@ -59,7 +59,7 @@ repositories {
 
 dependencyManagement {
     imports {
-        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR2'
+        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR3'
     }
 }
 
@@ -130,6 +130,8 @@ rat {
             "gradlew.bat",
             "README.md",
             ".project",
+            "bin/**",
+            ".classpath",
             ".settings/**"
     ]
 }
diff --git a/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java b/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
index b272ab7..aed2d6d 100644
--- a/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/AnnotatedErrorDecoderTest.java
@@ -21,6 +21,7 @@ package org.apache.fineract.cn.api.util;
 import feign.Feign;
 import feign.FeignException;
 import feign.Response;
+import feign.Request;
 import org.apache.fineract.cn.api.annotation.ThrowsException;
 import org.junit.Assert;
 import org.junit.Test;
@@ -50,51 +51,62 @@ public class AnnotatedErrorDecoderTest {
   public static Collection testCases() throws NoSuchMethodException {
     final Collection<TestCase> ret = new ArrayList<>();
 
+    final String TEST_URL = "http://igle.pop.org/app/v1/";
+    final Request request = Request.create("GET", TEST_URL, Collections.emptyMap(), new byte[]{}, Charset.defaultCharset());
+  
     final Response emptyInternalServerErrorResponse = Response.builder()
             .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyBadRequestResponse = Response.builder()
             .status(HttpStatus.BAD_REQUEST.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyBadRequestResponseWithNoBody = Response.builder()
             .status(HttpStatus.BAD_REQUEST.value())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyNotFoundRequestResponse = Response.builder()
             .status(HttpStatus.NOT_FOUND.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyConflictResponse = Response.builder()
             .status(HttpStatus.CONFLICT.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyIAmATeapotResponse = Response.builder()
             .status(HttpStatus.I_AM_A_TEAPOT.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyUnauthorizedResponse = Response.builder()
             .status(HttpStatus.UNAUTHORIZED.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final Response emptyForbiddenResponse = Response.builder()
             .status(HttpStatus.FORBIDDEN.value())
             .body("blah", Charset.defaultCharset())
             .headers(Collections.emptyMap())
+            .request(request)
             .build();
 
     final String madeUpMethodKey = "x";
@@ -106,10 +118,10 @@ public class AnnotatedErrorDecoderTest {
         Feign.configKey(OneMethodInterface.class, OneMethodInterface.class.getMethod("method"));
 
     final String onceAnnotatedMethodKey =
-            Feign.configKey(OneMethodOneAnnotationInterface.class, OneMethodOneAnnotationInterface.class.getMethod("method"));
+        Feign.configKey(OneMethodOneAnnotationInterface.class, OneMethodOneAnnotationInterface.class.getMethod("method"));
 
     final String onceAnnotatedWithStringExceptionMethodKey =
-            Feign.configKey(OneMethodOneAnnotationStringParameteredExceptionInterface.class, OneMethodOneAnnotationStringParameteredExceptionInterface.class.getMethod("method"));
+        Feign.configKey(OneMethodOneAnnotationStringParameteredExceptionInterface.class, OneMethodOneAnnotationStringParameteredExceptionInterface.class.getMethod("method"));
 
     ret.add(new TestCase("Methodless interface")
         .clazz(MethodlessInterface.class)
@@ -154,10 +166,10 @@ public class AnnotatedErrorDecoderTest {
         .expectedResult(new ParameterlessException()));
 
     ret.add(new TestCase("Interface with one method that has one annotation containing an exception which accepts a string parameter.")
-            .clazz(OneMethodOneAnnotationStringParameteredExceptionInterface.class)
-            .methodKey(onceAnnotatedWithStringExceptionMethodKey)
-            .response(emptyBadRequestResponse)
-            .expectedResult(new StringParameteredException("blah")));
+        .clazz(OneMethodOneAnnotationStringParameteredExceptionInterface.class)
+        .methodKey(onceAnnotatedWithStringExceptionMethodKey)
+        .response(emptyBadRequestResponse)
+        .expectedResult(new StringParameteredException("blah")));
 
     ret.add(new TestCase("Bad request on an interface in which bad request isn't mapped.")
         .clazz(AnnotationlessInterface.class)
@@ -166,17 +178,17 @@ public class AnnotatedErrorDecoderTest {
         .expectedResult(new IllegalArgumentException("blah")));
 
     ret.add(new TestCase("Bad request with no body on an interface in which bad request isn't mapped.")
-            .clazz(AnnotationlessInterface.class)
-            .methodKey(annotationlessMethodKey)
-            .response(emptyBadRequestResponseWithNoBody)
-            .expectedResult(new IllegalArgumentException((String)null)));
+        .clazz(AnnotationlessInterface.class)
+        .methodKey(annotationlessMethodKey)
+        .response(emptyBadRequestResponseWithNoBody)
+        .expectedResult(new IllegalArgumentException((String)null)));
 
 
     ret.add(new TestCase("Not found request on an interface in which not found request isn't mapped.")
-            .clazz(AnnotationlessInterface.class)
-            .methodKey(annotationlessMethodKey)
-            .response(emptyNotFoundRequestResponse)
-            .expectedResult(new NotFoundException("blah")));
+        .clazz(AnnotationlessInterface.class)
+        .methodKey(annotationlessMethodKey)
+        .response(emptyNotFoundRequestResponse)
+        .expectedResult(new NotFoundException("blah")));
 
     ret.add(new TestCase("Request with invalid token.")
         .clazz(OneMethodOneAnnotationInterface.class)
diff --git a/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java b/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
index 0b64af1..1c4102c 100644
--- a/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
+++ b/src/test/java/org/apache/fineract/cn/api/util/CookieInterceptingClientTest.java
@@ -38,12 +38,12 @@ import java.util.*;
  */
 public class CookieInterceptingClientTest {
   private final static String TEST_URL = "http://igle.pop.org/app/v1/";
+  private final Request request = Request.create("GET", TEST_URL, Collections.emptyMap(), new byte[]{}, Charset.defaultCharset());
 
   @Test
   public void cookiesPlacedInJarThenAttachedToRequest() throws IOException, URISyntaxException {
     final CookieInterceptingClient testSubject = new CookieInterceptingClient(TEST_URL);
 
-    //response
     final CookieInterceptingClient spiedTestSubject = Mockito.spy(testSubject);
 
     final Map<String, Collection<String>> cookieHeaders = new HashMap<>();
@@ -52,11 +52,12 @@ public class CookieInterceptingClientTest {
             .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
             .reason("blah")
             .headers(cookieHeaders)
+            .request(this.request)
             .build();
 
     Mockito.doReturn(dummyResponse).when(spiedTestSubject).superExecute(Mockito.anyObject(), Mockito.anyObject());
 
-    spiedTestSubject.execute(Request.create("", TEST_URL +"request", Collections.emptyMap(), new byte[]{}, Charset.defaultCharset()), new Request.Options());
+    spiedTestSubject.execute(this.request, new Request.Options());
 
     final Map<String, List<String>> ret = testSubject.cookieManager.get(new URI(TEST_URL), Collections.emptyMap());
     Assert.assertEquals(ret.get("Cookie"), Collections.singletonList("x=y"));


[fineract-cn-api] 32/44: Merge pull request #4 from ebenezergraham/patch-1

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit d528dcca5fa09f87e3898245fbafee23175aecd1
Merge: dd53907 7fad102
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Apr 30 20:59:34 2018 +0200

    Merge pull request #4 from ebenezergraham/patch-1
    
    Update README.md to use Apache Fineract CN

 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


[fineract-cn-api] 14/44: Added interceptor to set content length if no body is given

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit f84927be951b6277efb9c33c24372e48bd970c52
Author: mgeiss <mg...@mifos.org>
AuthorDate: Wed Sep 27 07:31:27 2017 +0200

    Added interceptor to set content length if no body is given
---
 .../java/io/mifos/core/api/util/ApiFactory.java    |  2 ++
 .../mifos/core/api/util/EmptyBodyInterceptor.java  | 42 ++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/src/main/java/io/mifos/core/api/util/ApiFactory.java b/src/main/java/io/mifos/core/api/util/ApiFactory.java
index a2535c1..df67d44 100644
--- a/src/main/java/io/mifos/core/api/util/ApiFactory.java
+++ b/src/main/java/io/mifos/core/api/util/ApiFactory.java
@@ -47,6 +47,7 @@ public class ApiFactory {
         .errorDecoder(new AnnotatedErrorDecoder(logger, clazz))
         .requestInterceptor(new TenantedTargetInterceptor())
         .requestInterceptor(new TokenedTargetInterceptor())
+        .requestInterceptor(new EmptyBodyInterceptor())
         .requestInterceptor(client.getCookieInterceptor())
         .decoder(new GsonDecoder())
         .encoder(new GsonEncoder())
@@ -61,6 +62,7 @@ public class ApiFactory {
             .errorDecoder(new AnnotatedErrorDecoder(logger, clazz))
             .requestInterceptor(new TenantedTargetInterceptor())
             .requestInterceptor(new TokenedTargetInterceptor())
+            .requestInterceptor(new EmptyBodyInterceptor())
             .requestInterceptor(client.getCookieInterceptor())
             .decoder(new GsonDecoder())
             .encoder(new GsonEncoder())
diff --git a/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
new file mode 100644
index 0000000..dbfd105
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/EmptyBodyInterceptor.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.nio.charset.Charset;
+
+/**
+ * Sets the content length of a request to zero if the request is of type POST or PUT, and contains
+ * no request body.
+ */
+public class EmptyBodyInterceptor implements RequestInterceptor {
+
+  EmptyBodyInterceptor() {
+    super();
+  }
+
+  @Override
+  public void apply(final RequestTemplate template) {
+    if ((template.method().equalsIgnoreCase(RequestMethod.POST.name())
+        || template.method().equalsIgnoreCase(RequestMethod.PUT.name()))
+        && template.body() == null) {
+      template.body(new byte[0], Charset.defaultCharset());
+    }
+  }
+}


[fineract-cn-api] 27/44: Adding rat checks.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit bd7ca7893c5ca9eb2e99f51da8b8a559335fb38e
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Apr 9 16:48:17 2018 +0200

    Adding rat checks.
---
 build.gradle    | 34 +++++++++++++++++++++++++++++++++-
 settings.gradle | 17 +++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/build.gradle b/build.gradle
index 80213cf..385aa95 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +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.
+ */
+
 buildscript {
     repositories {
-        jcenter();
+        jcenter()
     }
     dependencies {
         classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
@@ -9,6 +26,7 @@ buildscript {
 
 plugins {
     id 'com.github.hierynomus.license' version '0.13.1'
+    id("org.nosphere.apache.rat") version "0.3.1"
 }
 
 group 'org.apache.fineract.cn'
@@ -83,3 +101,17 @@ license {
         java = 'SLASHSTAR_STYLE'
     }
 }
+
+
+rat {
+    // List of exclude directives, defaults to ['**/.gradle/**']
+    excludes = [
+            ".idea/**",
+            ".gradle/**",
+            "gradle/**",
+            "build/**",
+            "gradlew",
+            "gradlew.bat",
+            "README.md"
+    ]
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 7c8e3dc..491f745 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +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


[fineract-cn-api] 35/44: FINCN-179 minimum changes to upgrade gradle to 4.10.3, FINCN-178 make Travis build forks,

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 4a2c7b57ef73a1271207bae948d0c4d9ac23d127
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Mon Sep 30 22:40:35 2019 +0300

    FINCN-179 minimum changes to upgrade gradle to 4.10.3, FINCN-178 make Travis build forks,
---
 build.gradle                             |   2 +-
 gradle/wrapper/gradle-wrapper.jar        | Bin 54212 -> 54212 bytes
 gradle/wrapper/gradle-wrapper.properties |   4 ++--
 travis.sh                                |  16 ++++++++++++----
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/build.gradle b/build.gradle
index a096f0e..04f7231 100644
--- a/build.gradle
+++ b/build.gradle
@@ -81,7 +81,7 @@ dependencies {
 }
 
 jar {
-    from sourceSets.main.allSource
+    from sourceSets.main.java
 }
 
 publishing {
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index c537cf6..968586f 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 82c49d9..a33354b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon Mar 13 18:26:40 CET 2017
+#Mon Sep 30 22:29:06 EEST 2019
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
diff --git a/travis.sh b/travis.sh
index 03a75ee..d54330d 100755
--- a/travis.sh
+++ b/travis.sh
@@ -36,6 +36,12 @@ function build_pullrequest() {
   ./gradlew publishToMavenLocal rat || EXIT_STATUS=$?
 }
 
+# Builds Forked (non-apache) Repository
+function build_fork() {
+  echo -e "Building branch $TRAVIS_BRANCH of fork $TRAVIS_REPO_SLUG. Won't publish anything to Artifactory."
+  ./gradlew publishToMavenLocal rat || EXIT_STATUS=$?
+}
+
 # For other branches we need to add branch name as prefix
 function build_otherbranch() {
   echo -e "Building a snapshot out of branch [$TRAVIS_BRANCH] and publishing it with prefix '${TRAVIS_BRANCH}-SNAPSHOT'"
@@ -49,17 +55,19 @@ function build_tag() {
 
 }
 
+echo -e "TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG"
 echo -e "TRAVIS_BRANCH=$TRAVIS_BRANCH"
 echo -e "TRAVIS_TAG=$TRAVIS_TAG"
 echo -e "TRAVIS_COMMIT=${TRAVIS_COMMIT::7}"
 echo -e "TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST"
 
-# Build Logic
-if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
+if [[ $TRAVIS_REPO_SLUG != apache* ]]; then
+  build_fork
+elif [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
   build_pullrequest
-elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" != "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ]  ; then
+elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" != "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ]; then
   build_otherbranch
-elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ] ; then
+elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "$BUILD_SNAPSHOTS_BRANCH" ] && [ "$TRAVIS_TAG" == "" ]; then
   build_snapshot
 elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then
   build_tag


[fineract-cn-api] 02/44: Minor build adjustment

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 32a899b93138cbe804c8c4a4d0feae6938ff22ed
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Wed Mar 15 14:15:59 2017 +0100

    Minor build adjustment
---
 build.gradle | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/build.gradle b/build.gradle
index 180a316..d4fff01 100644
--- a/build.gradle
+++ b/build.gradle
@@ -60,6 +60,10 @@ dependencies {
     )
 }
 
+jar {
+    from sourceSets.main.allSource
+}
+
 
 publishing {
     publications {


[fineract-cn-api] 40/44: FINCN-172 create separate Artifactory version for Spring Boot 2 update

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit a2df9f4ad2b918471a07ca8238e9f3a2e5248c97
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Jan 22 14:01:28 2020 +0200

    FINCN-172 create separate Artifactory version for Spring Boot 2 update
---
 build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/build.gradle b/build.gradle
index a540fce..96abe59 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,14 +34,14 @@ plugins {
 }
 
 group 'org.apache.fineract.cn'
-version 'spring_boot_2'
+version 'spring_boot_2-SNAPSHOT'
 
 ext.versions = [
         springcontext        : '4.3.3.RELEASE',
         springboot           : '1.4.1.RELEASE',
         feigngson            : '8.16.2',
         findbugs             : '3.0.1',
-        frameworklangversion : 'spring_boot_2'
+        frameworklangversion : 'spring_boot_2-SNAPSHOT'
 ]
 
 apply plugin: 'io.spring.dependency-management'


[fineract-cn-api] 39/44: FINCN-172 create separate Artifactory version for Spring Boot 2 update

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit ff7f500e89fa3dbb73a67e0feda3c6f5faf731a5
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Jan 22 13:47:18 2020 +0200

    FINCN-172 create separate Artifactory version for Spring Boot 2 update
---
 build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/build.gradle b/build.gradle
index cf9bc49..a540fce 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,14 +34,14 @@ plugins {
 }
 
 group 'org.apache.fineract.cn'
-version '0.1.0-BUILD-SNAPSHOT'
+version 'spring_boot_2'
 
 ext.versions = [
         springcontext        : '4.3.3.RELEASE',
         springboot           : '1.4.1.RELEASE',
         feigngson            : '8.16.2',
         findbugs             : '3.0.1',
-        frameworklangversion : '0.1.0-BUILD-SNAPSHOT'
+        frameworklangversion : 'spring_boot_2'
 ]
 
 apply plugin: 'io.spring.dependency-management'


[fineract-cn-api] 28/44: Merge pull request #5 from myrle-krantz/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit aff2b04f6b50be28f76ecdd4d0c05dc2d20ce8ea
Merge: 7edeaab bd7ca78
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Apr 9 16:49:24 2018 +0200

    Merge pull request #5 from myrle-krantz/develop
    
    Adding rat checks.

 build.gradle    | 34 +++++++++++++++++++++++++++++++++-
 settings.gradle | 17 +++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)


[fineract-cn-api] 07/44: Merge branch 'develop' of https://github.com/mifosio/api into develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 3a4a2b7cd1cabd5eab96c15196ebbe50d4674cce
Merge: 6552ca6 4f4b0da
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Tue Apr 11 16:14:59 2017 +0200

    Merge branch 'develop' of https://github.com/mifosio/api into develop



[fineract-cn-api] 15/44: Merge pull request #1 from markusgeiss/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 5e21d66c8179f9f9cd9e56ab198ae892ed1d449f
Merge: 042eff5 f84927b
Author: Markus Geiss <ma...@kuelap.io>
AuthorDate: Wed Sep 27 07:43:05 2017 +0200

    Merge pull request #1 from markusgeiss/develop
    
    Added interceptor to set content length if no body is given

 .../java/io/mifos/core/api/util/ApiFactory.java    |  2 ++
 .../mifos/core/api/util/EmptyBodyInterceptor.java  | 42 ++++++++++++++++++++++
 2 files changed, 44 insertions(+)


[fineract-cn-api] 23/44: Removed unused year and name variables

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 482267dbf8abf9415540a97842cb7518e1fc176d
Author: Isaac Kamga <u2...@gmail.com>
AuthorDate: Mon Mar 5 21:50:57 2018 +0100

    Removed unused year and name variables
---
 build.gradle | 2 --
 1 file changed, 2 deletions(-)

diff --git a/build.gradle b/build.gradle
index ba6b763..80213cf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -82,6 +82,4 @@ license {
     mapping {
         java = 'SLASHSTAR_STYLE'
     }
-    ext.year = Calendar.getInstance().get(Calendar.YEAR)
-    ext.name = 'The Apache Software Foundation'
 }


[fineract-cn-api] 25/44: Merge pull request #3 from Izakey/develop

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 7edeaab38d8ccd71bd7ed499cb1d17d56c45ec71
Merge: bde3abd 4ca9864
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Fri Mar 16 11:43:30 2018 +0100

    Merge pull request #3 from Izakey/develop
    
    Removed unused year and name variables

 build.gradle | 2 --
 1 file changed, 2 deletions(-)


[fineract-cn-api] 18/44: updating artifact ids to apache fineract from mifos io

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit ac10dc369b524e7c42a5332ba7ab5decb81d51d0
Author: Myrle Krantz <my...@apache.org>
AuthorDate: Mon Feb 26 17:39:22 2018 +0100

    updating artifact ids to apache fineract from mifos io
---
 build.gradle | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/build.gradle b/build.gradle
index d4fff01..ea25c40 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,7 +11,7 @@ plugins {
     id 'com.github.hierynomus.license' version '0.13.1'
 }
 
-group 'io.mifos.core'
+group 'org.apache.fineract.cn'
 version '0.1.0-BUILD-SNAPSHOT'
 
 ext.versions = [
@@ -52,7 +52,7 @@ dependencies {
             [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
             [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
             [group: 'com.netflix.feign', name: 'feign-gson', version: versions.feigngson],
-            [group: 'io.mifos.core', name: 'lang', version: versions.frameworklangversion],
+            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklangversion],
     )
 
     testCompile(
@@ -84,4 +84,4 @@ license {
     }
     ext.year = Calendar.getInstance().get(Calendar.YEAR)
     ext.name = 'The Mifos Initiative'
-}
\ No newline at end of file
+}


[fineract-cn-api] 01/44: Open Sourcing core.api.

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 7bd388d5b56ab453b2318b22169fe1d320dba188
Author: myrle-krantz <mk...@mifos.org>
AuthorDate: Mon Mar 13 18:37:19 2017 +0100

    Open Sourcing core.api.
---
 .gitignore                                         |  14 +
 HEADER                                             |  13 +
 LICENSE                                            | 201 +++++++++++++++
 README.md                                          |  28 ++
 build.gradle                                       |  83 ++++++
 gradle/wrapper/gradle-wrapper.jar                  | Bin 0 -> 54212 bytes
 gradle/wrapper/gradle-wrapper.properties           |   6 +
 gradlew                                            | 172 +++++++++++++
 gradlew.bat                                        |  84 ++++++
 settings.gradle                                    |   1 +
 .../mifos/core/api/annotation/ThrowsException.java |  34 +++
 .../core/api/annotation/ThrowsExceptions.java      |  31 +++
 .../io/mifos/core/api/config/ApiConfiguration.java |  37 +++
 .../io/mifos/core/api/config/EnableApiFactory.java |  36 +++
 .../java/io/mifos/core/api/context/AutoGuest.java  |  26 ++
 .../java/io/mifos/core/api/context/AutoSeshat.java |  28 ++
 .../io/mifos/core/api/context/AutoUserContext.java |  40 +++
 .../mifos/core/api/util/AnnotatedErrorDecoder.java | 136 ++++++++++
 .../java/io/mifos/core/api/util/ApiConstants.java  |  27 ++
 .../java/io/mifos/core/api/util/ApiFactory.java    |  55 ++++
 .../core/api/util/CookieInterceptingClient.java    |  92 +++++++
 .../api/util/CustomFeignClientsConfiguration.java  |  90 +++++++
 .../mifos/core/api/util/InternalServerError.java   |  27 ++
 .../mifos/core/api/util/InvalidTokenException.java |  27 ++
 .../io/mifos/core/api/util/NotFoundException.java  |  24 ++
 .../core/api/util/TenantedTargetInterceptor.java   |  36 +++
 .../core/api/util/TokenedTargetInterceptor.java    |  36 +++
 .../java/io/mifos/core/api/util/UserContext.java   |  56 ++++
 .../io/mifos/core/api/util/UserContextHolder.java  |  75 ++++++
 .../core/api/context/AutoUserContextTest.java      |  46 ++++
 .../core/api/util/AnnotatedErrorDecoderTest.java   | 281 +++++++++++++++++++++
 .../api/util/CookieInterceptingClientTest.java     |  81 ++++++
 .../api/util/TenantedTargetInterceptorTest.java    |  43 ++++
 .../api/util/TokenedTargetInterceptorTest.java     |  42 +++
 .../mifos/core/api/util/UserContextHolderTest.java |  77 ++++++
 35 files changed, 2085 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..536de5a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+/.gradle
+.idea
+build/
+target/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+*.iml
+
+*.log
\ No newline at end of file
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..d47a70e
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,13 @@
+Copyright ${year} ${name}.
+
+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/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/README.md b/README.md
new file mode 100644
index 0000000..605c049
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+# Mifos I/O Core API
+
+[![Join the chat at https://gitter.im/mifos-initiative/mifos.io](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mifos-initiative/mifos.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+This project is an umbrella for all Mifos I/O Core components.
+
+## Abstract
+Mifos I/O is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.
+
+## Prerequisites
+### Runtime
+Install Java 8 as described at https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html.
+
+## Versioning
+The version numbers follow the [Semantic Versioning](http://semver.org/) scheme.
+
+In addition to MAJOR.MINOR.PATCH the following postfixes are used to indicate the development state.
+
+* BUILD-SNAPSHOT - A release currently in development. 
+* RELEASE - _General availability_ indicates that this release is the best available version and is recommended for all usage.
+
+The versioning layout is {MAJOR}.{MINOR}.{PATCH}-{INDICATOR}[.{PATCH}]. Only milestones and release candidates can  have patch versions. Some examples:
+
+1.2.3-BUILD-SNAPSHOT  
+1.3.5-RELEASE  
+
+## License
+See [LICENSE](LICENSE) file.
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..180a316
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,83 @@
+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'
+}
+
+group 'io.mifos.core'
+version '0.1.0-BUILD-SNAPSHOT'
+
+ext.versions = [
+        springcontext        : '4.3.3.RELEASE',
+        springboot           : '1.4.1.RELEASE',
+        feigngson            : '8.16.2',
+        findbugs             : '3.0.1',
+        frameworklangversion : '0.1.0-BUILD-SNAPSHOT'
+]
+
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'maven'
+apply plugin: 'maven-publish'
+apply plugin: 'license'
+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 'org.springframework.cloud:spring-cloud-netflix:1.2.0.RELEASE'
+    }
+}
+
+dependencies {
+    compile(
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign'],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
+            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
+            [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
+            [group: 'com.netflix.feign', name: 'feign-gson', version: versions.feigngson],
+            [group: 'io.mifos.core', name: 'lang', version: versions.frameworklangversion],
+    )
+
+    testCompile(
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot]
+    )
+}
+
+
+publishing {
+    publications {
+        apiPublication(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+    }
+}
+
+license {
+    header rootProject.file('HEADER')
+    strictCheck true
+    mapping {
+        java = 'SLASHSTAR_STYLE'
+    }
+    ext.year = Calendar.getInstance().get(Calendar.YEAR)
+    ext.name = 'The Mifos Initiative'
+}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..c537cf6
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..82c49d9
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Mar 13 18:26:40 CET 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.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/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..7c8e3dc
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'api'
\ No newline at end of file
diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsException.java b/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
new file mode 100644
index 0000000..bbd7f27
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/annotation/ThrowsException.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.annotation;
+
+import org.springframework.http.HttpStatus;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Repeatable(value = ThrowsExceptions.class)
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ThrowsException {
+
+  HttpStatus status();
+
+  Class<? extends RuntimeException> exception();
+}
diff --git a/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java b/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
new file mode 100644
index 0000000..e4a64d1
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/annotation/ThrowsExceptions.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Myrle Krantz
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ThrowsExceptions {
+
+  ThrowsException[] value();
+}
diff --git a/src/main/java/io/mifos/core/api/config/ApiConfiguration.java b/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
new file mode 100644
index 0000000..12b74c2
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/config/ApiConfiguration.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Myrle Krantz
+ */
+@Configuration
+@ComponentScan({"io.mifos.core.api.util"})
+public class ApiConfiguration {
+
+  public static final String LOGGER_NAME = "api-logger";
+
+  @Bean(name = LOGGER_NAME)
+  public Logger logger() {
+    return LoggerFactory.getLogger(LOGGER_NAME);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/config/EnableApiFactory.java b/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
new file mode 100644
index 0000000..3071995
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/config/EnableApiFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.config;
+
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("unused")
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Import({ApiConfiguration.class})
+public @interface EnableApiFactory {
+
+}
diff --git a/src/main/java/io/mifos/core/api/context/AutoGuest.java b/src/main/java/io/mifos/core/api/context/AutoGuest.java
new file mode 100644
index 0000000..6c0b122
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/context/AutoGuest.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.context;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("unused")
+public class AutoGuest extends AutoUserContext {
+  public AutoGuest() {
+    super("guest", "N/A");
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/context/AutoSeshat.java b/src/main/java/io/mifos/core/api/context/AutoSeshat.java
new file mode 100644
index 0000000..bfe5d4a
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/context/AutoSeshat.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.context;
+
+import io.mifos.core.api.util.ApiConstants;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class AutoSeshat extends AutoUserContext{
+  public AutoSeshat(String token) {
+    super(ApiConstants.SYSTEM_SU, token);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/context/AutoUserContext.java b/src/main/java/io/mifos/core/api/context/AutoUserContext.java
new file mode 100644
index 0000000..4caef7f
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/context/AutoUserContext.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.context;
+
+import io.mifos.core.api.util.UserContext;
+import io.mifos.core.api.util.UserContextHolder;
+
+import java.util.Optional;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "WeakerAccess"})
+public class AutoUserContext implements AutoCloseable {
+  private final Optional<UserContext> previousUserContext;
+
+  public AutoUserContext(final String userName, final String accessToken) {
+    previousUserContext = UserContextHolder.getUserContext();
+
+    UserContextHolder.setAccessToken(userName, accessToken);
+  }
+
+  @Override public void close() {
+    UserContextHolder.clear();
+    previousUserContext.ifPresent(UserContextHolder::setUserContext);
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
new file mode 100644
index 0000000..cb6f0d5
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/AnnotatedErrorDecoder.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.Feign;
+import feign.FeignException;
+import feign.Response;
+import feign.codec.ErrorDecoder;
+import io.mifos.core.api.annotation.ThrowsException;
+import io.mifos.core.api.annotation.ThrowsExceptions;
+import org.slf4j.Logger;
+import org.springframework.http.HttpStatus;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * @author Myrle Krantz
+ */
+class AnnotatedErrorDecoder implements ErrorDecoder {
+
+  private final Class feignClientClass;
+  private final Logger logger;
+
+  AnnotatedErrorDecoder(final Logger logger, final Class feignClientClass) {
+    this.logger = logger;
+    this.feignClientClass = feignClientClass;
+  }
+
+  @Override
+  public Exception decode(
+      final String methodKey,
+      final Response response) {
+    final Optional<Optional<Optional<Exception>>> ret =
+        Arrays.stream(feignClientClass.getMethods())
+            .filter(method -> Feign.configKey(feignClientClass, method).equals(methodKey))
+            .map(method -> {
+              final Optional<ThrowsException> annotation = getMatchingAnnotation(response, method);
+              return annotation.map(a -> constructException(response, a));
+            })
+            .findAny();
+
+    return unwrapEmbeddedOptional(ret, getAlternative(methodKey, response));
+  }
+
+  private RuntimeException getAlternative(final String methodKey, final Response response) {
+    if (response.status() == HttpStatus.BAD_REQUEST.value()) {
+      return new IllegalArgumentException(response.reason());
+    } else if (response.status() == HttpStatus.FORBIDDEN.value()) {
+      return new InvalidTokenException(response.reason());
+    } else if (response.status() == HttpStatus.NOT_FOUND.value()) {
+      return new NotFoundException();
+    } else if (response.status() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
+      return new InternalServerError(response.reason());
+    } else {
+      return FeignException.errorStatus(methodKey, response);
+    }
+  }
+
+  private Optional<ThrowsException> getMatchingAnnotation(
+      final Response response,
+      final Method method) {
+
+    final ThrowsExceptions throwsExceptionsAnnotation =
+        method.getAnnotation(ThrowsExceptions.class);
+    if (throwsExceptionsAnnotation == null) {
+      final ThrowsException throwsExceptionAnnotation =
+          method.getAnnotation(ThrowsException.class);
+      if ((throwsExceptionAnnotation != null) &&
+          statusMatches(response, throwsExceptionAnnotation)) {
+        return Optional.of(throwsExceptionAnnotation);
+      }
+    } else {
+      return Arrays.stream(throwsExceptionsAnnotation.value())
+          .filter(throwsExceptionAnnotation -> statusMatches(response,
+              throwsExceptionAnnotation))
+          .findAny();
+    }
+
+    return Optional.empty();
+  }
+
+  private boolean statusMatches(final Response response,
+                                final ThrowsException throwsExceptionAnnotation) {
+    return throwsExceptionAnnotation.status().value() == response.status();
+  }
+
+  @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
+  private <T> T unwrapEmbeddedOptional(
+      final Optional<Optional<Optional<T>>> embeddedOptional, T alternative) {
+    return embeddedOptional.orElse(Optional.empty()).orElse(Optional.empty()).orElse(alternative);
+  }
+
+  private Optional<Exception> constructException(
+      final Response response,
+      final ThrowsException throwsExceptionAnnotations) {
+    try {
+      try {
+        final Constructor<? extends RuntimeException> oneArgumentConstructor =
+            throwsExceptionAnnotations.exception().getConstructor(Response.class);
+
+        return Optional.of(oneArgumentConstructor.newInstance(response));
+      } catch (final NoSuchMethodException e) {
+
+        final Constructor<? extends RuntimeException> noArgumentConstructor =
+            throwsExceptionAnnotations.exception().getConstructor();
+
+        return Optional.of(noArgumentConstructor.newInstance());
+      }
+    } catch (final InvocationTargetException
+        | IllegalAccessException
+        | InstantiationException
+        | NoSuchMethodException e) {
+      logger.error("Instantiating exception {}, in for status {} failed with an exception",
+          throwsExceptionAnnotations.exception(), throwsExceptionAnnotations.status(), e);
+
+      return Optional.empty();
+    }
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/ApiConstants.java b/src/main/java/io/mifos/core/api/util/ApiConstants.java
new file mode 100644
index 0000000..aa9cb79
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/ApiConstants.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public interface ApiConstants {
+
+  String AUTHORIZATION_HEADER = "Authorization";
+  String USER_HEADER = "User";
+  String SYSTEM_SU = "wepemnefret";
+}
diff --git a/src/main/java/io/mifos/core/api/util/ApiFactory.java b/src/main/java/io/mifos/core/api/util/ApiFactory.java
new file mode 100644
index 0000000..aa8a7bf
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/ApiFactory.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.Feign;
+import feign.gson.GsonDecoder;
+import feign.gson.GsonEncoder;
+import io.mifos.core.api.config.ApiConfiguration;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.cloud.netflix.feign.support.SpringMvcContract;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("unused")
+@Component
+public class ApiFactory {
+
+  private final Logger logger;
+
+  @Autowired
+  public ApiFactory(@Qualifier(ApiConfiguration.LOGGER_NAME) final Logger logger) {
+    this.logger = logger;
+  }
+
+  public <T> T create(final Class<T> clazz, final String target) {
+    final CookieInterceptingClient client = new CookieInterceptingClient(target);
+    return Feign.builder()
+        .contract(new SpringMvcContract())
+        .client(client)
+        .errorDecoder(new AnnotatedErrorDecoder(logger, clazz))
+        .requestInterceptor(new TenantedTargetInterceptor())
+        .requestInterceptor(new TokenedTargetInterceptor())
+        .requestInterceptor(client.getCookieInterceptor())
+        .decoder(new GsonDecoder())
+        .encoder(new GsonEncoder())
+        .target(clazz, target);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
new file mode 100644
index 0000000..98ef622
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/CookieInterceptingClient.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.*;
+
+import java.io.IOException;
+import java.net.CookieManager;
+import java.net.URI;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Keeps the cookies for this client and appends them to requests.
+ * See also CookieInterceptor.
+ *
+ * @author Myrle Krantz
+ */
+class CookieInterceptingClient extends Client.Default {
+  final CookieManager cookieManager;
+  private final String target;
+
+  CookieInterceptingClient(final String target) {
+    this(target, new CookieManager());
+  }
+
+  CookieInterceptingClient(final String target, final CookieManager cookieManager)
+  {
+    super(null, null);
+    this.cookieManager = cookieManager;
+    this.target = target;
+  }
+
+  RequestInterceptor getCookieInterceptor() {
+    return new CookieInterceptor();
+  }
+
+  private class CookieInterceptor implements RequestInterceptor {
+    @Override
+    public void apply(final RequestTemplate template) {
+      try {
+        final Map<String, List<String>> cookieHeaders =
+                cookieManager.get(mapUriType(target + template.url()), mapHeadersType(template.headers()));
+        cookieHeaders.entrySet().forEach(entry -> template.header(entry.getKey(), entry.getValue()));
+      } catch (final IOException e) {
+        throw new IllegalStateException("Mapping cookies failed unexpectedly.");
+      }
+    }
+  }
+
+  /**
+   * Seam for testing
+   */
+  Response superExecute(final Request request, final Request.Options options) throws IOException {
+    return super.execute(request, options);
+  }
+
+  @Override
+  public Response execute(final Request request, final Request.Options options) throws IOException {
+    final Response ret = superExecute(request, options);
+    cookieManager.put(mapUriType(request.url()), mapHeadersType(ret.headers()));
+    return ret;
+  }
+
+  private static URI mapUriType(final String url) {
+    return URI.create(url);
+  }
+
+  private static Map<String, List<String>> mapHeadersType(final Map<String, Collection<String>> headers) {
+    final HashMap<String, List<String>> ret = new HashMap<>();
+    headers.entrySet().forEach(entry ->
+            ret.put(entry.getKey(), changeCollectionToList(entry.getValue())));
+    return ret;
+  }
+
+  private static List<String> changeCollectionToList(final Collection<String> value) {
+    return value.stream().collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java b/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
new file mode 100644
index 0000000..9fa905d
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/CustomFeignClientsConfiguration.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.Feign;
+import feign.Target;
+import feign.codec.Decoder;
+import feign.codec.Encoder;
+import feign.gson.GsonDecoder;
+import feign.gson.GsonEncoder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cloud.netflix.feign.FeignClientsConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Scope;
+
+import static io.mifos.core.api.config.ApiConfiguration.LOGGER_NAME;
+
+/**
+ * @author Myrle Krantz
+ */
+//@EnableApiFactory (for logger)
+@SuppressWarnings({"unused"})
+public class CustomFeignClientsConfiguration extends FeignClientsConfiguration {
+  private static class AnnotatedErrorDecoderFeignBuilder extends Feign.Builder {
+    private final Logger logger;
+
+    AnnotatedErrorDecoderFeignBuilder(final Logger logger) {
+      this.logger = logger;
+    }
+
+    public <T> T target(Target<T> target) {
+      this.errorDecoder(new AnnotatedErrorDecoder(logger, target.type()));
+      return build().newInstance(target);
+    }
+  }
+
+  @Bean
+  @ConditionalOnMissingBean
+  public TenantedTargetInterceptor tenantedTargetInterceptor()
+  {
+    return new TenantedTargetInterceptor();
+  }
+
+  @Bean
+  @ConditionalOnMissingBean
+  public TokenedTargetInterceptor tokenedTargetInterceptor()
+  {
+    return new TokenedTargetInterceptor();
+  }
+
+  @Bean
+  @ConditionalOnMissingBean
+  public Decoder feignDecoder() {
+    return new GsonDecoder();
+  }
+
+  @Bean
+  @ConditionalOnMissingBean
+  public Encoder feignEncoder() {
+    return new GsonEncoder();
+  }
+
+  @Bean(name = LOGGER_NAME)
+  public Logger logger() {
+    return LoggerFactory.getLogger(LOGGER_NAME);
+  }
+
+  @Bean
+  @Scope("prototype")
+  @ConditionalOnMissingBean
+  public Feign.Builder feignBuilder(@Qualifier(LOGGER_NAME) final Logger logger) {
+    return new AnnotatedErrorDecoderFeignBuilder(logger);
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/io/mifos/core/api/util/InternalServerError.java b/src/main/java/io/mifos/core/api/util/InternalServerError.java
new file mode 100644
index 0000000..037d2ff
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/InternalServerError.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public class InternalServerError extends RuntimeException {
+
+  InternalServerError(final String reason) {
+    super(reason);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/InvalidTokenException.java b/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
new file mode 100644
index 0000000..d6916ba
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/InvalidTokenException.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public class InvalidTokenException extends RuntimeException {
+
+  public InvalidTokenException(final String reason) {
+    super(reason);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/NotFoundException.java b/src/main/java/io/mifos/core/api/util/NotFoundException.java
new file mode 100644
index 0000000..9649cd5
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/NotFoundException.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public class NotFoundException extends RuntimeException {
+
+}
diff --git a/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
new file mode 100644
index 0000000..e820d1e
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/TenantedTargetInterceptor.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import io.mifos.core.lang.TenantContextHolder;
+
+import static io.mifos.core.lang.config.TenantHeaderFilter.TENANT_HEADER;
+
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public class TenantedTargetInterceptor implements RequestInterceptor {
+
+  @Override
+  public void apply(final RequestTemplate template) {
+    TenantContextHolder.identifier()
+        .ifPresent(tenantIdentifier -> template.header(TENANT_HEADER, tenantIdentifier));
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java b/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
new file mode 100644
index 0000000..6e9a226
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/TokenedTargetInterceptor.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings("WeakerAccess")
+public class TokenedTargetInterceptor implements RequestInterceptor {
+
+  @Override
+  public void apply(final RequestTemplate template) {
+    UserContextHolder.getUserContext()
+            .map(UserContext::getAccessToken)
+            .ifPresent(token -> template.header(ApiConstants.AUTHORIZATION_HEADER, token));
+    UserContextHolder.getUserContext()
+            .map(UserContext::getUser)
+            .ifPresent(user -> template.header(ApiConstants.USER_HEADER, user));
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/UserContext.java b/src/main/java/io/mifos/core/api/util/UserContext.java
new file mode 100644
index 0000000..0a98719
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/UserContext.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import javax.annotation.Nonnull;
+import java.util.Objects;
+
+/**
+ * @author Myrle Krantz
+ */
+public class UserContext {
+  private final String user;
+  private final String accessToken;
+
+  UserContext(@Nonnull String user, @Nonnull String accessToken) {
+    this.user = user;
+    this.accessToken = accessToken;
+  }
+
+  @SuppressWarnings("WeakerAccess")
+  @Nonnull public String getUser() {
+    return user;
+  }
+
+  @SuppressWarnings("WeakerAccess")
+  @Nonnull public String getAccessToken() {
+    return accessToken;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    UserContext that = (UserContext) o;
+    return Objects.equals(user, that.user) &&
+            Objects.equals(accessToken, that.accessToken);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(user, accessToken);
+  }
+}
diff --git a/src/main/java/io/mifos/core/api/util/UserContextHolder.java b/src/main/java/io/mifos/core/api/util/UserContextHolder.java
new file mode 100644
index 0000000..8991d3c
--- /dev/null
+++ b/src/main/java/io/mifos/core/api/util/UserContextHolder.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import org.springframework.util.Assert;
+
+import javax.annotation.Nonnull;
+import java.util.Optional;
+
+/**
+ * @author Myrle Krantz
+ */
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class UserContextHolder {
+
+  private static final InheritableThreadLocal<UserContext> THREAD_LOCAL = new InheritableThreadLocal<>();
+
+  private UserContextHolder() {
+  }
+
+  @Nonnull
+  public static String checkedGetAccessToken() {
+    return Optional.ofNullable(UserContextHolder.THREAD_LOCAL.get())
+            .map(UserContext::getAccessToken)
+            .orElseThrow(IllegalStateException::new);
+  }
+
+  @Nonnull
+  public static String checkedGetUser() {
+    return Optional.ofNullable(UserContextHolder.THREAD_LOCAL.get())
+            .map(UserContext::getUser)
+            .map(UserContextHolder::cropIdentifier)
+            .orElseThrow(IllegalStateException::new);
+  }
+
+  private static String cropIdentifier(final String identifier) {
+    if (identifier.length() > 32)
+      return identifier.substring(0, 32);
+    else
+      return identifier;
+  }
+
+  @Nonnull
+  public static Optional<UserContext> getUserContext() {
+    return Optional.ofNullable(UserContextHolder.THREAD_LOCAL.get());
+  }
+
+  public static void setAccessToken(@Nonnull final String user, @Nonnull final String accessToken) {
+    Assert.notNull(user, "User may not be null.");
+    Assert.notNull(accessToken, "Access token may not be null.");
+    UserContextHolder.THREAD_LOCAL.set(new UserContext(user, accessToken));
+  }
+
+  public static void setUserContext(@Nonnull final UserContext userContext)
+  {
+    UserContextHolder.THREAD_LOCAL.set(userContext);
+  }
+
+  public static void clear() {
+    UserContextHolder.THREAD_LOCAL.remove();
+  }
+}
diff --git a/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java b/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
new file mode 100644
index 0000000..df0d8e8
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/context/AutoUserContextTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.context;
+
+import io.mifos.core.api.util.UserContextHolder;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Optional;
+
+/**
+ * @author Myrle Krantz
+ */
+public class AutoUserContextTest {
+  @Test
+  public void stateIsUndisturbedOutsideOfTryBlock()
+  {
+    UserContextHolder.setAccessToken("x", "y");
+
+    //noinspection EmptyTryBlock
+    try (final AutoUserContext ignored = new AutoUserContext("m", "n"))
+    {
+      Assert.assertEquals(UserContextHolder.checkedGetUser(), "m");
+      Assert.assertEquals(UserContextHolder.checkedGetAccessToken(), "n");
+    }
+
+    Assert.assertEquals(UserContextHolder.checkedGetUser(), "x");
+    Assert.assertEquals(UserContextHolder.checkedGetAccessToken(), "y");
+
+    UserContextHolder.clear();
+  }
+
+}
\ No newline at end of file
diff --git a/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
new file mode 100644
index 0000000..7dc1104
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/util/AnnotatedErrorDecoderTest.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.Feign;
+import feign.FeignException;
+import feign.Response;
+import io.mifos.core.api.annotation.ThrowsException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * @author Myrle Krantz
+ */
+@RunWith(Parameterized.class)
+public class AnnotatedErrorDecoderTest {
+
+  private final TestCase testCase;
+
+  public AnnotatedErrorDecoderTest(final TestCase testCase) {
+    this.testCase = testCase;
+  }
+
+  @Parameterized.Parameters
+  public static Collection testCases() throws NoSuchMethodException {
+    final Collection<TestCase> ret = new ArrayList<>();
+
+    final Response emptyInternalServerErrorResponse = Response.builder()
+            .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyBadRequestResponse = Response.builder()
+            .status(HttpStatus.BAD_REQUEST.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyConflictResponse = Response.builder()
+            .status(HttpStatus.CONFLICT.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyIAmATeapotResponse = Response.builder()
+            .status(HttpStatus.I_AM_A_TEAPOT.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyUnauthorizedResponse = Response.builder()
+            .status(HttpStatus.UNAUTHORIZED.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final Response emptyForbiddenResponse = Response.builder()
+            .status(HttpStatus.FORBIDDEN.value())
+            .reason("blah")
+            .headers(Collections.emptyMap())
+            .build();
+
+    final String madeUpMethodKey = "x";
+
+    final String annotationlessMethodKey =
+        Feign.configKey(AnnotationlessInterface.class, AnnotationlessInterface.class.getMethod("method"));
+
+    final String oneAnnotatedMethodKey =
+        Feign.configKey(OneMethodInterface.class, OneMethodInterface.class.getMethod("method"));
+
+    final String onceAnnotatedMethodKey =
+        Feign.configKey(OneMethodOneAnnotationInterface.class, OneMethodOneAnnotationInterface.class.getMethod("method"));
+
+    ret.add(new TestCase("Methodless interface")
+        .clazz(MethodlessInterface.class)
+        .methodKey(madeUpMethodKey)
+        .response(emptyConflictResponse)
+        .expectedResult(FeignException.errorStatus(madeUpMethodKey, emptyConflictResponse)));
+
+    ret.add(new TestCase("Annotationless interface")
+        .clazz(AnnotationlessInterface.class)
+        .methodKey(annotationlessMethodKey)
+        .response(emptyConflictResponse)
+        .expectedResult(FeignException.errorStatus(annotationlessMethodKey, emptyConflictResponse)));
+
+    ret.add(new TestCase("Interface with one method mapped to parameterless exception")
+        .clazz(OneMethodInterface.class)
+        .methodKey(oneAnnotatedMethodKey)
+        .response(emptyBadRequestResponse)
+        .expectedResult(new ParameterlessException()));
+
+    ret.add(new TestCase("Interface with one method mapped to parametered exception")
+        .clazz(OneMethodInterface.class)
+        .methodKey(oneAnnotatedMethodKey)
+        .response(emptyConflictResponse)
+        .expectedResult(new ParameteredException(emptyConflictResponse)));
+
+    ret.add(new TestCase("Interface with one method mapped to an exception which can't be constructed by reflection")
+        .clazz(OneMethodInterface.class)
+        .methodKey(oneAnnotatedMethodKey)
+        .response(emptyIAmATeapotResponse)
+        .expectedResult(FeignException.errorStatus(oneAnnotatedMethodKey, emptyIAmATeapotResponse)));
+
+    ret.add(new TestCase("Interface with one method, not mapped to the response code returned")
+        .clazz(OneMethodInterface.class)
+        .methodKey(oneAnnotatedMethodKey)
+        .response(emptyUnauthorizedResponse)
+        .expectedResult(FeignException.errorStatus(oneAnnotatedMethodKey, emptyUnauthorizedResponse)));
+
+    ret.add(new TestCase("Interface with one method that has one annotation")
+        .clazz(OneMethodOneAnnotationInterface.class)
+        .methodKey(onceAnnotatedMethodKey)
+        .response(emptyBadRequestResponse)
+        .expectedResult(new ParameterlessException()));
+
+    ret.add(new TestCase("Bad request on an interface in which bad request isn't mapped.")
+        .clazz(AnnotationlessInterface.class)
+        .methodKey(annotationlessMethodKey)
+        .response(emptyBadRequestResponse)
+        .expectedResult(new IllegalArgumentException("blah")));
+
+    ret.add(new TestCase("Request with invalid token.")
+        .clazz(OneMethodOneAnnotationInterface.class)
+        .methodKey(onceAnnotatedMethodKey)
+        .response(emptyForbiddenResponse)
+        .expectedResult(new InvalidTokenException("blah")));
+
+    ret.add(new TestCase("Internal Server Error on an interface in which internal server error isn't mapped.")
+        .clazz(AnnotationlessInterface.class)
+        .methodKey(annotationlessMethodKey)
+        .response(emptyInternalServerErrorResponse)
+        .expectedResult(new InternalServerError("blah")));
+
+    return ret;
+  }
+
+  @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+  @Test
+  public void checkMapping() {
+
+    final AnnotatedErrorDecoder testSubject = new AnnotatedErrorDecoder(
+        LoggerFactory.getLogger(AnnotatedErrorDecoderTest.class.getName()), testCase.getClazz());
+
+    final Exception result = testSubject.decode(testCase.getMethodKey(), testCase.getResponse());
+
+    Assert.assertEquals("Test case \"" + testCase.getName() + "\" failed.",
+        testCase.expectedResult().getClass(), result.getClass());
+
+    Assert.assertEquals("Test case \"" + testCase.getName() + "\" failed.",
+        testCase.expectedResult().getMessage(), result.getMessage());
+  }
+
+  private interface MethodlessInterface {
+
+  }
+
+  private interface AnnotationlessInterface {
+
+    @SuppressWarnings("unused")
+    void method();
+  }
+
+  private interface OneMethodInterface {
+
+    @SuppressWarnings("unused")
+    @ThrowsException(status = HttpStatus.BAD_REQUEST, exception = ParameterlessException.class)
+    @ThrowsException(status = HttpStatus.CONFLICT, exception = ParameteredException.class)
+    @ThrowsException(status = HttpStatus.I_AM_A_TEAPOT, exception = WrongParameteredException.class)
+    void method();
+  }
+
+
+  private interface OneMethodOneAnnotationInterface {
+
+    @SuppressWarnings("unused")
+    @ThrowsException(status = HttpStatus.BAD_REQUEST, exception = ParameterlessException.class)
+    void method();
+  }
+
+  private static class TestCase {
+
+    private final String name;
+    private Class clazz;
+    private String methodKey;
+    private Response response;
+    private Exception expectedResult;
+
+    private TestCase(final String name) {
+      this.name = name;
+    }
+
+    public String toString() {
+      return name;
+    }
+
+    TestCase clazz(final Class newVal) {
+      clazz = newVal;
+      return this;
+    }
+
+    TestCase methodKey(final String newVal) {
+      methodKey = newVal;
+      return this;
+    }
+
+    TestCase response(final Response newVal) {
+      response = newVal;
+      return this;
+    }
+
+    TestCase expectedResult(final Exception newVal) {
+      expectedResult = newVal;
+      return this;
+    }
+
+    Class getClazz() {
+      return clazz;
+    }
+
+    String getMethodKey() {
+      return methodKey;
+    }
+
+    Response getResponse() {
+      return response;
+    }
+
+    Exception expectedResult() {
+      return expectedResult;
+    }
+
+    String getName() {
+      return name;
+    }
+  }
+
+  private static class ParameterlessException extends RuntimeException {
+
+    @SuppressWarnings("WeakerAccess")
+    public ParameterlessException() {
+      super("I am a parameterless exception.  Aren't I cool.");
+    }
+  }
+
+  private static class ParameteredException extends RuntimeException {
+
+    @SuppressWarnings("WeakerAccess")
+    public ParameteredException(final Response response) {
+      super("I am a parametered exception with a response of " + response.toString());
+    }
+  }
+
+  private static class WrongParameteredException extends RuntimeException {
+
+    public WrongParameteredException(final String message) {
+      super(message);
+    }
+  }
+}
diff --git a/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
new file mode 100644
index 0000000..9d9cb33
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/util/CookieInterceptingClientTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.Request;
+import feign.RequestTemplate;
+import feign.Response;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.http.HttpStatus;
+
+import java.io.IOException;
+import java.net.CookieManager;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.util.*;
+
+/**
+ * @author Myrle Krantz
+ */
+public class CookieInterceptingClientTest {
+  private final static String TEST_URL = "http://igle.pop.org/app/v1/";
+
+  @Test
+  public void cookiesPlacedInJarThenAttachedToRequest() throws IOException, URISyntaxException {
+    final CookieInterceptingClient testSubject = new CookieInterceptingClient(TEST_URL);
+
+    //response
+    final CookieInterceptingClient spiedTestSubject = Mockito.spy(testSubject);
+
+    final Map<String, Collection<String>> cookieHeaders = new HashMap<>();
+    cookieHeaders.put("Set-Cookie", Collections.singleton("x=y;Path=/app/v1"));
+    final Response dummyResponse =  Response.builder()
+            .status(HttpStatus.INTERNAL_SERVER_ERROR.value())
+            .reason("blah")
+            .headers(cookieHeaders)
+            .build();
+
+    Mockito.doReturn(dummyResponse).when(spiedTestSubject).superExecute(Mockito.anyObject(), Mockito.anyObject());
+
+    spiedTestSubject.execute(Request.create("", TEST_URL +"request", Collections.emptyMap(), new byte[]{}, Charset.defaultCharset()), new Request.Options());
+
+    final Map<String, List<String>> ret = testSubject.cookieManager.get(new URI(TEST_URL), Collections.emptyMap());
+    Assert.assertEquals(ret.get("Cookie"), Collections.singletonList("x=y"));
+
+    //request
+    final RequestTemplate dummyRequestTemplate = new RequestTemplate();
+    dummyRequestTemplate.append("/request");
+    testSubject.getCookieInterceptor().apply(dummyRequestTemplate);
+    Assert.assertEquals(dummyRequestTemplate.headers().get("Cookie"), Collections.singletonList("x=y"));
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void unexpectedCookieManagerFailure() throws IOException {
+    final CookieManager cookieManagerMock = Mockito.mock(CookieManager.class);
+    //noinspection unchecked
+    Mockito.when(cookieManagerMock.get(Mockito.anyObject(), Mockito.anyObject())).thenThrow(IOException.class);
+
+    final CookieInterceptingClient testSubject = new CookieInterceptingClient(TEST_URL, cookieManagerMock);
+
+    final RequestTemplate dummyRequestTemplate = new RequestTemplate();
+    dummyRequestTemplate.append("/request");
+
+    testSubject.getCookieInterceptor().apply(dummyRequestTemplate);
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
new file mode 100644
index 0000000..5b5f8a3
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/util/TenantedTargetInterceptorTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.RequestTemplate;
+import io.mifos.core.lang.TenantContextHolder;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+/**
+ * @author Myrle Krantz
+ */
+@RunWith(BlockJUnit4ClassRunner.class)
+public class TenantedTargetInterceptorTest {
+
+  @Test
+  public void test() {
+    final TenantedTargetInterceptor testSubject = new TenantedTargetInterceptor();
+
+    final RequestTemplate requestTemplate = new RequestTemplate();
+    final String tenantId = "bleblablub";
+
+    TenantContextHolder.setIdentifier(tenantId);
+    testSubject.apply(requestTemplate);
+
+    Assert.assertTrue(requestTemplate.headers().get("X-Tenant-Identifier").contains(tenantId));
+  }
+}
diff --git a/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java b/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
new file mode 100644
index 0000000..582943d
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/util/TokenedTargetInterceptorTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import feign.RequestTemplate;
+import io.mifos.core.api.context.AutoUserContext;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/**
+ * @author Myrle Krantz
+ */
+public class TokenedTargetInterceptorTest {
+
+  @Test
+  public void test() {
+    final TokenedTargetInterceptor testSubject = new TokenedTargetInterceptor();
+
+    final RequestTemplate requestTemplate = new RequestTemplate();
+
+    try (final AutoUserContext ignored = new AutoUserContext("x", "y")) {
+      testSubject.apply(requestTemplate);
+    }
+
+    Assert.assertTrue(requestTemplate.headers().get(ApiConstants.USER_HEADER).contains("x"));
+    Assert.assertTrue(requestTemplate.headers().get(ApiConstants.AUTHORIZATION_HEADER).contains("y"));
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java b/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
new file mode 100644
index 0000000..a5365bd
--- /dev/null
+++ b/src/test/java/io/mifos/core/api/util/UserContextHolderTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * 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.
+ */
+package io.mifos.core.api.util;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Optional;
+
+/**
+ * @author Myrle Krantz
+ */
+public class UserContextHolderTest {
+  @Test
+  public void testUserIdentifierCropping()
+  {
+    final String userIdentifier16 = RandomStringUtils.randomAlphanumeric(16);
+    UserContextHolder.setAccessToken(userIdentifier16, "x");
+
+    Assert.assertEquals(UserContextHolder.checkedGetUser(), userIdentifier16);
+
+    final String userIdentifier32 = RandomStringUtils.randomAlphanumeric(32);
+    UserContextHolder.setAccessToken(userIdentifier32, "x");
+
+    Assert.assertEquals(UserContextHolder.checkedGetUser(), userIdentifier32);
+
+    final String userIdentifier64 = userIdentifier32 + userIdentifier32;
+    UserContextHolder.setAccessToken(userIdentifier64, "x");
+
+    Assert.assertEquals(UserContextHolder.checkedGetUser(), userIdentifier32);
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testUnsetUserIdentifier()
+  {
+    UserContextHolder.clear();
+    UserContextHolder.checkedGetUser();
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testUnsetAccessToken()
+  {
+    UserContextHolder.clear();
+    UserContextHolder.checkedGetAccessToken();
+  }
+
+  @Test
+  public void testSimpleUnSetAndGet()
+  {
+    UserContextHolder.clear();
+    final Optional<UserContext> userContext = UserContextHolder.getUserContext();
+    Assert.assertTrue(!userContext.isPresent());
+  }
+
+  @Test
+  public void testSimpleSetAndGet()
+  {
+    final UserContext setUserContext = new UserContext("x", "y");
+    UserContextHolder.clear();
+    UserContextHolder.setUserContext(setUserContext);
+    UserContextHolder.getUserContext().ifPresent(x -> Assert.assertEquals(setUserContext, x));
+  }
+}


[fineract-cn-api] 21/44: Correct project name in NOTICE.txt file

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch spring_boot_2
in repository https://gitbox.apache.org/repos/asf/fineract-cn-api.git

commit 5f6cc6f1a2610d6952ac4760eace49f94f52e503
Author: Isaac Kamga <u2...@gmail.com>
AuthorDate: Fri Mar 2 10:36:27 2018 +0100

    Correct project name in NOTICE.txt file
---
 NOTICE.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/NOTICE.txt b/NOTICE.txt
index 460662d..4d83690 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,4 +1,4 @@
-Apache Fineract CN Lang
+Apache Fineract CN Api
 Copyright [2017-2018] The Apache Software Foundation
 
 This product includes software developed at