// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/client/MarathonClient.java
// public class MarathonClient {
// 
//     private MarathonClientConfiguration marathonClientConfiguration;
// 
//     public MarathonClient(MarathonClientConfiguration marathonClientConfiguration){
//         this.marathonClientConfiguration = marathonClientConfiguration;
//     }
// 
//      public Invocation.Builder getServiceInstanceDetails() {
//             Client client = JerseyClientBuilder.newClient();
//             WebTarget target= client.target(marathonClientConfiguration.getMarathonApiUrl() + "/v2/apps"+ marathonClientConfiguration.getMarathonAppNameSpace());
//             return target.request();
//     }
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/config/MarathonClientConfiguration.java
// public class MarathonClientConfiguration {
//     @NotEmpty
//     private String marathonApiUrl;
//     @NotEmpty
//     private String marathonAppNameSpace;
//     @NotEmpty
//     private Integer marathonAppPort;
//     // this is the custom clustername that you can have for the services cluster
//     @NotEmpty
//     private String cluster;
// 
//     public String getCluster() { return cluster; }
// 
//     public String getMarathonApiUrl() {
//         return marathonApiUrl;
//     }
// 
//     public String getMarathonAppNameSpace() {
//         return marathonAppNameSpace;
//     }
// 
//     public Integer getMarathonAppPort() {
//         return marathonAppPort;
//     }
// 
// 
//     public void setMarathonApiUrl(String marathonApiUrl) {
//         this.marathonApiUrl = marathonApiUrl;
//     }
// 
//     public void setMarathonAppNameSpace(String marathonAppNameSpace) {
//         this.marathonAppNameSpace = marathonAppNameSpace;
//     }
// 
//     public void setMarathonAppPort(Integer marathonAppPort) {
//         this.marathonAppPort = marathonAppPort;
//     }
// 
//     public void setCluster(String cluster) {
//         this.cluster = cluster;
//     }
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/MarathonClientResponse.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class MarathonClientResponse {
// 
//     private App app;
// 
// 
//     public App getApp() {
//         return app;
//     }
// 
//     public void setApp(App app) {
//         this.app = app;
//     }
// 
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/PortMapping.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class PortMapping {
// 
//     private Integer containerPort;
//     private Integer servicePort;
// 
//     public Integer getContainerPort() {
//         return containerPort;
//     }
// 
//     public void setContainerPort(Integer containerPort) {
//         this.containerPort = containerPort;
//     }
// 
//     public Integer getServicePort() {
//         return servicePort;
//     }
// 
//     public void setServicePort(Integer servicePort) {
//         this.servicePort = servicePort;
//     }
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/Task.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class Task {
//     private String host;
//     private List<Integer> ports = null;
//     private String state;
// 
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public List<Integer> getPorts() {
//         return ports;
//     }
// 
//     public void setPorts(List<Integer> ports) {
//         this.ports = ports;
//     }
// 
//     public String getState() {
//         return state;
//     }
// 
//     public void setState(String state) {
//         this.state = state;
//     }
// 
// }


import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.turbine.discovery.Instance;
import com.netflix.turbine.discovery.InstanceDiscovery;
import com.yammer.breakerbox.turbine.client.MarathonClient;
import com.yammer.breakerbox.turbine.config.MarathonClientConfiguration;
import com.yammer.breakerbox.turbine.model.marathon.MarathonClientResponse;
import com.yammer.breakerbox.turbine.model.marathon.PortMapping;
import com.yammer.breakerbox.turbine.model.marathon.Task;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
            } finally {
                if (response != null) {
                    response.close();
                }
            }
        });
        return instances;
    }

     public List<Instance> createServiceInstanceList(String marathonApiResponse,MarathonClientConfiguration marathonClientConfiguration) {
         MarathonClientResponse marathonClientResponse = null;
         try {
             marathonClientResponse = mapper.readValue(marathonApiResponse, MarathonClientResponse.class);
         } catch (IOException e) {
             LOGGER.error("io exception",e);
         }
         if (marathonClientResponse != null && marathonClientResponse.getApp() != null) {
            List<PortMapping> portMappingList = marathonClientResponse.getApp().getContainer().getDocker().getPortMappings();
            int portIndex = -1;
            for (int i = 0; i < portMappingList.size(); i++) {
                if (portMappingList.get(i).getContainerPort().equals(marathonClientConfiguration.getMarathonAppPort())) {
                    portIndex = i;
                    break;
                }
            }
            if (portIndex < 0) {
                LOGGER.error("marathon app port non present in port mapping");
                return Collections.emptyList();
            }

// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/client/MarathonClient.java
// public class MarathonClient {
// 
//     private MarathonClientConfiguration marathonClientConfiguration;
// 
//     public MarathonClient(MarathonClientConfiguration marathonClientConfiguration){
//         this.marathonClientConfiguration = marathonClientConfiguration;
//     }
// 
//      public Invocation.Builder getServiceInstanceDetails() {
//             Client client = JerseyClientBuilder.newClient();
//             WebTarget target= client.target(marathonClientConfiguration.getMarathonApiUrl() + "/v2/apps"+ marathonClientConfiguration.getMarathonAppNameSpace());
//             return target.request();
//     }
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/config/MarathonClientConfiguration.java
// public class MarathonClientConfiguration {
//     @NotEmpty
//     private String marathonApiUrl;
//     @NotEmpty
//     private String marathonAppNameSpace;
//     @NotEmpty
//     private Integer marathonAppPort;
//     // this is the custom clustername that you can have for the services cluster
//     @NotEmpty
//     private String cluster;
// 
//     public String getCluster() { return cluster; }
// 
//     public String getMarathonApiUrl() {
//         return marathonApiUrl;
//     }
// 
//     public String getMarathonAppNameSpace() {
//         return marathonAppNameSpace;
//     }
// 
//     public Integer getMarathonAppPort() {
//         return marathonAppPort;
//     }
// 
// 
//     public void setMarathonApiUrl(String marathonApiUrl) {
//         this.marathonApiUrl = marathonApiUrl;
//     }
// 
//     public void setMarathonAppNameSpace(String marathonAppNameSpace) {
//         this.marathonAppNameSpace = marathonAppNameSpace;
//     }
// 
//     public void setMarathonAppPort(Integer marathonAppPort) {
//         this.marathonAppPort = marathonAppPort;
//     }
// 
//     public void setCluster(String cluster) {
//         this.cluster = cluster;
//     }
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/MarathonClientResponse.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class MarathonClientResponse {
// 
//     private App app;
// 
// 
//     public App getApp() {
//         return app;
//     }
// 
//     public void setApp(App app) {
//         this.app = app;
//     }
// 
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/PortMapping.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class PortMapping {
// 
//     private Integer containerPort;
//     private Integer servicePort;
// 
//     public Integer getContainerPort() {
//         return containerPort;
//     }
// 
//     public void setContainerPort(Integer containerPort) {
//         this.containerPort = containerPort;
//     }
// 
//     public Integer getServicePort() {
//         return servicePort;
//     }
// 
//     public void setServicePort(Integer servicePort) {
//         this.servicePort = servicePort;
//     }
// 
// }
// 
// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/model/marathon/Task.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class Task {
//     private String host;
//     private List<Integer> ports = null;
//     private String state;
// 
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public List<Integer> getPorts() {
//         return ports;
//     }
// 
//     public void setPorts(List<Integer> ports) {
//         this.ports = ports;
//     }
// 
//     public String getState() {
//         return state;
//     }
// 
//     public void setState(String state) {
//         this.state = state;
//     }
// 
// }


// Path: breakerbox-turbine/src/main/java/com/yammer/breakerbox/turbine/MarathonInstanceDiscovery.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.turbine.discovery.Instance;
import com.netflix.turbine.discovery.InstanceDiscovery;
import com.yammer.breakerbox.turbine.client.MarathonClient;
import com.yammer.breakerbox.turbine.config.MarathonClientConfiguration;
import com.yammer.breakerbox.turbine.model.marathon.MarathonClientResponse;
import com.yammer.breakerbox.turbine.model.marathon.PortMapping;
import com.yammer.breakerbox.turbine.model.marathon.Task;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

            } finally {
                if (response != null) {
                    response.close();
                }
            }
        });
        return instances;
    }

     public List<Instance> createServiceInstanceList(String marathonApiResponse,MarathonClientConfiguration marathonClientConfiguration) {
         MarathonClientResponse marathonClientResponse = null;
         try {
             marathonClientResponse = mapper.readValue(marathonApiResponse, MarathonClientResponse.class);
         } catch (IOException e) {
             LOGGER.error("io exception",e);
         }
         if (marathonClientResponse != null && marathonClientResponse.getApp() != null) {
            List<PortMapping> portMappingList = marathonClientResponse.getApp().getContainer().getDocker().getPortMappings();
            int portIndex = -1;
            for (int i = 0; i < portMappingList.size(); i++) {
                if (portMappingList.get(i).getContainerPort().equals(marathonClientConfiguration.getMarathonAppPort())) {
                    portIndex = i;
                    break;
                }
            }
            if (portIndex < 0) {
                LOGGER.error("marathon app port non present in port mapping");
                return Collections.emptyList();
            }

            List<Task> tasks = marathonClientResponse.getApp().getTasks();