/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.cassandra.locator;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Logger;

import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;

import com.scylladb.jmx.api.APIClient;
import com.scylladb.jmx.metrics.APIMBean;

public class EndpointSnitchInfo extends APIMBean implements EndpointSnitchInfoMBean {
    public static final String MBEAN_NAME = "org.apache.cassandra.db:type=EndpointSnitchInfo";
    private static final Logger logger = Logger.getLogger(EndpointSnitchInfo.class.getName());

    public EndpointSnitchInfo(APIClient c) {
        super(c);
    }

    public void log(String str) {
        logger.finest(str);
    }

    /**
     * Provides the Rack name depending on the respective snitch used, given the
     * host name/ip
     *
     * @param host
     * @throws UnknownHostException
     */
    @Override
    public String getRack(String host) throws UnknownHostException {
        log("getRack(String host) throws UnknownHostException");
        MultivaluedMap<String, String> queryParams = new MultivaluedHashMap<String, String>();
        if (host == null) {
            host = InetAddress.getLoopbackAddress().getHostAddress();
        }
        queryParams.add("host", host);
        return client.getStringValue("/snitch/rack", queryParams, 10000);
    }

    /**
     * Provides the Datacenter name depending on the respective snitch used,
     * given the hostname/ip
     *
     * @param host
     * @throws UnknownHostException
     */
    @Override
    public String getDatacenter(String host) throws UnknownHostException {
        log(" getDatacenter(String host) throws UnknownHostException");
        MultivaluedMap<String, String> queryParams = new MultivaluedHashMap<String, String>();
        if (host == null) {
            host = InetAddress.getLoopbackAddress().getHostAddress();
        }
        queryParams.add("host", host);
        return client.getStringValue("/snitch/datacenter", queryParams, 10000);
    }

    /**
     * Provides the snitch name of the cluster
     *
     * @return Snitch name
     */
    @Override
    public String getSnitchName() {
        log(" getSnitchName()");
        return client.getStringValue("/snitch/name");
    }

    @Override
    public String getRack() {
        return client.getStringValue("/snitch/rack", null, 10000);
    }

    @Override
    public String getDatacenter() {
        return client.getStringValue("/snitch/datacenter", null, 10000);
    }
}

@@ -834,24 +834,75 @@
 a.locator;%0A%0A
+import static java.util.Collections.singletonMap;%0A%0A
 import java.
@@ -1944,32 +1944,47 @@
 g%3E queryParams =
+ host != null ?
  new Multivalued
@@ -1999,34 +1999,32 @@
 String, String%3E(
-);
 %0A        if (hos
@@ -2020,46 +2020,36 @@
     
-if (host == null) %7B%0A            
+        singletonMap(%22
 host
- =
+%22,
  Ine
@@ -2060,32 +2060,27 @@
 ress.get
-LoopbackAddress(
+ByName(host
 ).getHos
@@ -2093,57 +2093,17 @@
 ss()
-;%0A        %7D%0A        queryParams.add(%22host%22, host)
+)) : null
 ;%0A  
@@ -2578,16 +2578,31 @@
 Params =
+ host != null ?
  new Mul
@@ -2633,18 +2633,16 @@
 String%3E(
-);
 %0A       
@@ -2646,46 +2646,36 @@
     
-if (host == null) %7B%0A            
+        singletonMap(%22
 host
- =
+%22,
  Ine
@@ -2690,24 +2690,19 @@
 .get
-LoopbackAddress(
+ByName(host
 ).ge
@@ -2719,57 +2719,17 @@
 ss()
-;%0A        %7D%0A        queryParams.add(%22host%22, host)
+)) : null
 ;%0A  

Fix getRack/DC host handling