// Path: hystrix-application/src/main/java/de/ahus1/hystrix/rest/HystrixSaveAccount.java
// @Path("/hystrix")
// @Api("/hystrix")
// public class HystrixSaveAccount extends AbstractSaveAccount {
// 
//     private static Logger LOG = LoggerFactory
//             .getLogger(HystrixSaveAccount.class);
// 
//     @GET
//     @Produces("text/plain")
//     @ApiOperation("simple hello")
//     public Response hello() {
//         return Response.status(Status.OK).entity("Hello world").build();
//     }
// 
//     // tag::hystrix[]
//     private static class IBANValidatorCommand extends HystrixCommand<Boolean> {
//         private Account account;
// 
//         protected IBANValidatorCommand(Account account) {
//             super(Setter.withGroupKey(HystrixCommandGroupKey.Factory
//                     .asKey("iban")));
//             this.account = account; // <2>
//         }
// 
//         @Override
//         protected Boolean run() throws Exception {
//             return IBANValidator.isValid(account); // <3>
//         }
// 
//     }
// 
//     @POST
//     @ApiOperation("save account data")
//     public Response save(Account account) throws ValidationException,
//             InterruptedException {
//         try {
//             if (!new IBANValidatorCommand(account).execute()) { // <1>
//                 throw new ValidationException("invalid");
//             }
//         } catch (HystrixRuntimeException e) { // <4>
//             if (e.getCause() instanceof InterruptedException) {
//                 throw (InterruptedException) e.getCause();
//             }
//             LOG.error("problem with command: {}", e.getMessage());
//             return Response.status(Status.SERVICE_UNAVAILABLE).build();
//         }
//         super.saveToDatabase(account);
//         return Response.status(Status.OK).build();
//     }
//     // end::hystrix[]
// }
// 
// Path: hystrix-application/src/main/java/de/ahus1/hystrix/rest/SimpleSaveAccount.java
// @Path("/simple")
// public class SimpleSaveAccount extends AbstractSaveAccount {
// 
//     @GET
//     @Produces("text/plain")
//     public Response hello() {
//         return Response.status(Status.OK).entity("Hello world").build();
//     }
// 
//     @POST
//     public Response save(Account account) throws ValidationException,
//             InterruptedException {
//         if (!IBANValidator.isValid(account)) {
//             throw new ValidationException("invalid");
//         }
//         super.saveToDatabase(account);
//         return Response.status(Status.OK).build();
//     }
// }


import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import de.ahus1.hystrix.rest.HystrixSaveAccount;
import de.ahus1.hystrix.rest.SimpleSaveAccount;
package de.ahus1.hystrix.base;




// tag::classdef[]
@ApplicationPath("/api")
public class HystrixApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();

    public HystrixApplication() {
        singletons.add(new SimpleSaveAccount());
        singletons.add(new HystrixSaveAccount());
        singletons.add(new ValidationExceptionMapper());
        singletons.add(new InterruptedExceptionMapper());
    }

    @Override
    public Set<Object> getSingletons() {
// Path: hystrix-application/src/main/java/de/ahus1/hystrix/rest/HystrixSaveAccount.java
// @Path("/hystrix")
// @Api("/hystrix")
// public class HystrixSaveAccount extends AbstractSaveAccount {
// 
//     private static Logger LOG = LoggerFactory
//             .getLogger(HystrixSaveAccount.class);
// 
//     @GET
//     @Produces("text/plain")
//     @ApiOperation("simple hello")
//     public Response hello() {
//         return Response.status(Status.OK).entity("Hello world").build();
//     }
// 
//     // tag::hystrix[]
//     private static class IBANValidatorCommand extends HystrixCommand<Boolean> {
//         private Account account;
// 
//         protected IBANValidatorCommand(Account account) {
//             super(Setter.withGroupKey(HystrixCommandGroupKey.Factory
//                     .asKey("iban")));
//             this.account = account; // <2>
//         }
// 
//         @Override
//         protected Boolean run() throws Exception {
//             return IBANValidator.isValid(account); // <3>
//         }
// 
//     }
// 
//     @POST
//     @ApiOperation("save account data")
//     public Response save(Account account) throws ValidationException,
//             InterruptedException {
//         try {
//             if (!new IBANValidatorCommand(account).execute()) { // <1>
//                 throw new ValidationException("invalid");
//             }
//         } catch (HystrixRuntimeException e) { // <4>
//             if (e.getCause() instanceof InterruptedException) {
//                 throw (InterruptedException) e.getCause();
//             }
//             LOG.error("problem with command: {}", e.getMessage());
//             return Response.status(Status.SERVICE_UNAVAILABLE).build();
//         }
//         super.saveToDatabase(account);
//         return Response.status(Status.OK).build();
//     }
//     // end::hystrix[]
// }
// 
// Path: hystrix-application/src/main/java/de/ahus1/hystrix/rest/SimpleSaveAccount.java
// @Path("/simple")
// public class SimpleSaveAccount extends AbstractSaveAccount {
// 
//     @GET
//     @Produces("text/plain")
//     public Response hello() {
//         return Response.status(Status.OK).entity("Hello world").build();
//     }
// 
//     @POST
//     public Response save(Account account) throws ValidationException,
//             InterruptedException {
//         if (!IBANValidator.isValid(account)) {
//             throw new ValidationException("invalid");
//         }
//         super.saveToDatabase(account);
//         return Response.status(Status.OK).build();
//     }
// }


// Path: hystrix-application/src/main/java/de/ahus1/hystrix/base/HystrixApplication.java
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import de.ahus1.hystrix.rest.HystrixSaveAccount;
import de.ahus1.hystrix.rest.SimpleSaveAccount;

package de.ahus1.hystrix.base;




// tag::classdef[]
@ApplicationPath("/api")
public class HystrixApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();

    public HystrixApplication() {
        singletons.add(new SimpleSaveAccount());
        singletons.add(new HystrixSaveAccount());
        singletons.add(new ValidationExceptionMapper());
        singletons.add(new InterruptedExceptionMapper());
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;