/** * 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.hadoop.tools.rumen; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.util.regex.Matcher; import org.apache.hadoop.tools.rumen.datatypes.NodeName; public class ParsedHost { private final String rackName; private final String nodeName; /** * TODO the following only works for /rack/host format. Change to support * arbitrary level of network names. */ private static final Pattern splitPattern = Pattern .compile("/([^/]+)/([^/]+)"); /** * TODO handle arbitrary level of network names. */ static int numberOfDistances() { return 3; } String nameComponent(int i) throws IllegalArgumentException { switch (i) { case 0: return rackName; case 1: return nodeName; default: throw new IllegalArgumentException( "Host location component index out of range."); } } @Override public int hashCode() { return rackName.hashCode() * 17 + nodeName.hashCode(); } public static ParsedHost parse(String name) { // separate out the node name Matcher matcher = splitPattern.matcher(name); if (!matcher.matches()) return null; return new ParsedHost(matcher.group(1), matcher.group(2)); } private String process(String name) { return name == null ? null : name.startsWith("/") ? name.substring(1) : name; } public ParsedHost(LoggedLocation loc) { List<NodeName> coordinates = loc.getLayers(); rackName = coordinates.get(0).getRackName(); nodeName = coordinates.get(1).getHostName(); } LoggedLocation makeLoggedLocation() { LoggedLocation result = new LoggedLocation(); List<String> coordinates = new ArrayList<String>(); coordinates.add(rackName); coordinates.add(nodeName); result.setLayers(coordinates); return result; } public String getNodeName() { return nodeName; } public String getRackName() { return rackName; } // expects the broadest name first ParsedHost(String rackName, String nodeName) { this.rackName = process(rackName); this.nodeName = process(nodeName); } @Override public boolean equals(Object other) { if (!(other instanceof ParsedHost)) { return false; } ParsedHost host = (ParsedHost) other; return (nodeName.equals(host.nodeName) && rackName.equals(host.rackName)); } int distance(ParsedHost other) { if (nodeName.equals(other.nodeName)) { return 0; } if (rackName.equals(other.rackName)) { return 1; } return 2; } }