Java tutorial
/** * Copyright (C) 2014 Couchbase, Inc. * * 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 DEALING * IN THE SOFTWARE. */ package com.couchbase.client.core.config; import com.couchbase.client.core.CouchbaseException; import com.couchbase.client.core.service.ServiceType; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.net.InetAddress; import java.net.URI; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; /** * Default implementation of {@link NodeInfo}. * * @author Michael Nitschinger * @since 1.0 */ public class DefaultNodeInfo implements NodeInfo { private final InetAddress hostname; private final Map<ServiceType, Integer> directServices; private final Map<ServiceType, Integer> sslServices; private int configPort; /** * Creates a new {@link DefaultNodeInfo} with no SSL services. * * @param viewUri the URI of the view service. * @param hostname the hostname of the node. * @param ports the port list of the node services. */ @JsonCreator public DefaultNodeInfo(@JsonProperty("couchApiBase") String viewUri, @JsonProperty("hostname") String hostname, @JsonProperty("ports") Map<String, Integer> ports) { if (hostname == null) { throw new CouchbaseException(new IllegalArgumentException("NodeInfo hostname cannot be null")); } try { this.hostname = InetAddress.getByName(trimPort(hostname)); } catch (UnknownHostException e) { throw new CouchbaseException("Could not analyze hostname from config.", e); } this.directServices = parseDirectServices(viewUri, ports); this.sslServices = new HashMap<ServiceType, Integer>(); } /** * Creates a new {@link DefaultNodeInfo} with SSL services. * * @param hostname the hostname of the node. * @param direct the port list of the direct node services. * @param ssl the port list of the ssl node services. */ public DefaultNodeInfo(InetAddress hostname, Map<ServiceType, Integer> direct, Map<ServiceType, Integer> ssl) { if (hostname == null) { throw new CouchbaseException(new IllegalArgumentException("NodeInfo hostname cannot be null")); } this.hostname = hostname; this.directServices = direct; this.sslServices = ssl; } @Override public InetAddress hostname() { return hostname; } @Override public Map<ServiceType, Integer> services() { return directServices; } @Override public Map<ServiceType, Integer> sslServices() { return sslServices; } private Map<ServiceType, Integer> parseDirectServices(final String viewUri, final Map<String, Integer> input) { Map<ServiceType, Integer> services = new HashMap<ServiceType, Integer>(); for (Map.Entry<String, Integer> entry : input.entrySet()) { String type = entry.getKey(); Integer port = entry.getValue(); if (type.equals("direct")) { services.put(ServiceType.BINARY, port); } } services.put(ServiceType.CONFIG, configPort); if (viewUri != null) { services.put(ServiceType.VIEW, URI.create(viewUri).getPort()); } return services; } private String trimPort(String hostname) { String[] parts = hostname.split(":"); configPort = Integer.parseInt(parts[1]); return parts[0]; } @Override public String toString() { return "NodeInfo{" + ", hostname=" + hostname + ", configPort=" + configPort + ", directServices=" + directServices + ", sslServices=" + sslServices + '}'; } }