Upon reviewer's request:

(FIX) Deleted .puml file (no longer required or used)
(FIX) Removed @since annotations (they add noise)
This commit is contained in:
George Aristy 2017-12-29 09:35:57 -04:00
parent 10c0879d3b
commit c1ea04e002
13 changed files with 91 additions and 66 deletions

View File

@ -1,38 +0,0 @@
@startuml
package com.iluwatar.retry {
class App {
- LOG : Logger {static}
- op : BusinessOperation<String> {static}
+ App()
- errorNoRetry() {static}
- errorWithRetry() {static}
+ main(args : String[]) {static}
- noErrors() {static}
}
interface BusinessOperation<T> {
+ perform() : T {abstract}
}
class FindCustomer {
- customerId : String
- errors : Deque<BusinessException>
+ FindCustomer(customerId : String, errors : BusinessException[])
+ perform() : String
}
class Retry<T> {
- attempts : AtomicInteger
- delay : long
- errors : List<Exception>
- maxAttempts : int
- op : BusinessOperation<T>
- test : Predicate<Exception>
+ Retry<T>(op : BusinessOperation<T>, maxAttempts : int, delay : long, ignoreTests : Predicate<Exception>[])
+ attempts() : int
+ errors() : List<Exception>
+ perform() : T
}
}
Retry --> "-op" BusinessOperation
App --> "-op" BusinessOperation
FindCustomer ..|> BusinessOperation
Retry ..|> BusinessOperation
@enduml

50
retry/licenseheader.txt Normal file
View File

@ -0,0 +1,50 @@
====
The MIT License
Copyright (c) 2014 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
====
<#if licenseFirst??>
${licenseFirst}
</#if>
${licensePrefix}The MIT License (MIT)
${licensePrefix}
${licensePrefix}Copyright (c) 2014-2016 Ilkka Seppälä
${licensePrefix}
${licensePrefix}Permission is hereby granted, free of charge, to any person obtaining a copy
${licensePrefix}of this software and associated documentation files (the "Software"), to deal
${licensePrefix}in the Software without restriction, including without limitation the rights
${licensePrefix}to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
${licensePrefix}copies of the Software, and to permit persons to whom the Software is
${licensePrefix}furnished to do so, subject to the following conditions:
${licensePrefix}
${licensePrefix}The above copyright notice and this permission notice shall be included in all
${licensePrefix}copies or substantial portions of the Software.
${licensePrefix}
${licensePrefix}THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
${licensePrefix}IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
${licensePrefix}FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
${licensePrefix}AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
${licensePrefix}LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
${licensePrefix}OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
${licensePrefix}SOFTWARE.
<#if licenseLast??>
${licenseLast}
</#if>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-shared-configuration>
<!--
This file contains additional configuration written by modules in the NetBeans IDE.
The configuration is intended to be shared among all the users of project and
therefore it is assumed to be part of version control checkout.
Without this configuration present, some functionality in the IDE may be limited or fail altogether.
-->
<properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
<!--
Properties that influence various parts of the IDE, especially code formatting and the like.
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
<netbeans.hint.licensePath>${project.basedir}/licenseheader.txt</netbeans.hint.licensePath>
</properties>
</project-shared-configuration>

View File

@ -0,0 +1,23 @@
#
# The MIT License
# Copyright (c) 2014 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#

View File

@ -56,7 +56,6 @@ import org.slf4j.LoggerFactory;
*
* @author George Aristy (george.aristy@gmail.com)
* @see <a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/retry">Retry pattern (Microsoft Azure Docs)</a>
* @since 1.18.0
*/
public final class App {
private static final Logger LOG = LoggerFactory.getLogger(App.class);
@ -67,7 +66,6 @@ public final class App {
*
* @param args not used
* @throws Exception not expected
* @since 1.18.0
*/
public static void main(String[] args) throws Exception {
noErrors();

View File

@ -31,7 +31,6 @@ package com.iluwatar.retry;
* be able to handle this error and should be reported to the maintainers immediately.
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public class BusinessException extends Exception {
private static final long serialVersionUID = 6235833142062144336L;
@ -40,7 +39,6 @@ public class BusinessException extends Exception {
* Ctor
*
* @param message the error message
* @since 1.18.0
*/
public BusinessException(String message) {
super(message);

View File

@ -29,7 +29,6 @@ package com.iluwatar.retry;
*
* @author George Aristy (george.aristy@gmail.com)
* @param <T> the return type
* @since 1.18.0
*/
@FunctionalInterface
public interface BusinessOperation<T> {
@ -40,7 +39,6 @@ public interface BusinessOperation<T> {
* @return the return value
* @throws BusinessException if the operation fails. Implementations are allowed to throw more
* specific subtypes depending on the error conditions
* @since 1.18.0
*/
T perform() throws BusinessException;
}

View File

@ -31,7 +31,6 @@ package com.iluwatar.retry;
* by an input from some end user, or were the search parameters pulled from your database?
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public final class CustomerNotFoundException extends BusinessException {
private static final long serialVersionUID = -6972888602621778664L;
@ -40,7 +39,6 @@ public final class CustomerNotFoundException extends BusinessException {
* Ctor.
*
* @param message the error message
* @since 1.18.0
*/
public CustomerNotFoundException(String message) {
super(message);

View File

@ -28,7 +28,6 @@ package com.iluwatar.retry;
* Catastrophic error indicating that we have lost connection to our database.
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public final class DatabaseNotAvailableException extends BusinessException {
private static final long serialVersionUID = -3750769625095997799L;
@ -37,7 +36,6 @@ public final class DatabaseNotAvailableException extends BusinessException {
* Ctor.
*
* @param message the error message
* @since 1.18.0
*/
public DatabaseNotAvailableException(String message) {
super(message);

View File

@ -36,7 +36,6 @@ import java.util.Deque;
* purposes of this example it fails in a programmed way depending on the constructor parameters.
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public final class FindCustomer implements BusinessOperation<String> {
private final String customerId;
@ -47,7 +46,6 @@ public final class FindCustomer implements BusinessOperation<String> {
*
* @param customerId the final result of the remote operation
* @param errors the errors to throw before returning {@code customerId}
* @since 1.18.0
*/
public FindCustomer(String customerId, BusinessException... errors) {
this.customerId = customerId;

View File

@ -36,7 +36,6 @@ import java.util.function.Predicate;
*
* @author George Aristy (george.aristy@gmail.com)
* @param <T> the remote op's return type
* @since 1.18.0
*/
public final class Retry<T> implements BusinessOperation<T> {
private final BusinessOperation<T> op;
@ -54,7 +53,6 @@ public final class Retry<T> implements BusinessOperation<T> {
* @param delay delay (in milliseconds) between attempts
* @param ignoreTests tests to check whether the remote exception can be ignored. No exceptions
* will be ignored if no tests are given
* @since 1.18.0
*/
@SafeVarargs
public Retry(
@ -75,7 +73,6 @@ public final class Retry<T> implements BusinessOperation<T> {
* The errors encountered while retrying, in the encounter order.
*
* @return the errors encountered while retrying
* @since 1.18.0
*/
public List<Exception> errors() {
return Collections.unmodifiableList(this.errors);
@ -85,7 +82,6 @@ public final class Retry<T> implements BusinessOperation<T> {
* The number of retries performed.
*
* @return the number of retries performed
* @since 1.18.0
*/
public int attempts() {
return this.attempts.intValue();

View File

@ -32,13 +32,10 @@ import org.junit.Test;
* Unit tests for {@link FindCustomer}.
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public class FindCustomerTest {
/**
* Returns the given result with no exceptions.
*
* @since 1.18.0
*/
@Test
public void noExceptions() throws Exception {
@ -52,7 +49,6 @@ public class FindCustomerTest {
* Throws the given exception.
*
* @throws Exception the expected exception
* @since 1.18.0
*/
@Test(expected = BusinessException.class)
public void oneException() throws Exception {
@ -63,7 +59,6 @@ public class FindCustomerTest {
* Should first throw the given exceptions, then return the given result.
*
* @throws Exception not an expected exception
* @since 1.18.0
*/
@Test
public void resultAfterExceptions() throws Exception {

View File

@ -33,13 +33,10 @@ import static org.junit.Assert.*;
* Unit tests for {@link Retry}.
*
* @author George Aristy (george.aristy@gmail.com)
* @since 1.18.0
*/
public class RetryTest {
/**
* Should contain all errors thrown.
*
* @since 1.18.0
*/
@Test
public void errors() throws Exception {
@ -64,8 +61,6 @@ public class RetryTest {
/**
* No exceptions will be ignored, hence final number of attempts should be 1 even if we're asking
* it to attempt twice.
*
* @since 1.18.0
*/
@Test
public void attempts() {
@ -90,8 +85,6 @@ public class RetryTest {
/**
* Final number of attempts should be equal to the number of attempts asked because we are
* asking it to ignore the exception that will be thrown.
*
* @since 1.18.0
*/
@Test
public void ignore() throws Exception {