Java tutorial
/************************************************************************* * Copyright 2009-2015 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ package com.eucalyptus.loadbalancing.dns; import static com.eucalyptus.loadbalancing.LoadBalancer.Scheme; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nullable; import org.xbill.DNS.Name; import com.eucalyptus.loadbalancing.LoadBalancerDnsRecord; import com.eucalyptus.util.Pair; import com.eucalyptus.util.dns.DomainNames; import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Predicate; /** * */ public enum LoadBalancerDomainName implements Predicate<Name> { INTERNAL("internal-([a-zA-Z0-9-]{1,255})-([0-9]{12})", "internal-%s-%s"), // most specific first for matching EXTERNAL("([a-zA-Z0-9-]{1,255})-([0-9]{12})", "%s-%s"),; private final Pattern hostPattern; private final String hostFormat; private LoadBalancerDomainName(final String pattern, final String format) { hostPattern = Pattern.compile(pattern); hostFormat = format; } public static Name getLoadBalancerSubdomain() { return DomainNames.absolute(lookupLoadBalancerSubdomainProperty(), DomainNames.externalSubdomain()); } public static LoadBalancerDomainName forScheme(@Nullable final Scheme scheme) { if (Scheme.Internal == scheme) { return INTERNAL; } return EXTERNAL; } public static Optional<LoadBalancerDomainName> findMatching(final Name name) { for (final LoadBalancerDomainName domainName : values()) { if (domainName.apply(name)) { return Optional.of(domainName); } } return Optional.absent(); } public String generate(String loadBalancerName, String accountNumber) { final String dnsPrefix = String.format(hostFormat, loadBalancerName, accountNumber); return Joiner.on('.').join(dnsPrefix, getLoadBalancerSubdomain().relativize(Name.root)); } private Matcher matcher(final Name name) { return hostPattern.matcher(name.toString()); } /** * Extract info from a known good name. * * @param name The DNS name * @return A pair of account number and load balancer name */ public Pair<String, String> toScopedLoadBalancerName(final Name name) { final Matcher nameMatcher = matcher(name); nameMatcher.matches(); return Pair.pair(nameMatcher.group(2), nameMatcher.group(1)); } private static Name lookupLoadBalancerSubdomainProperty() { return Name.fromConstantString(LoadBalancerDnsRecord.DNS_SUBDOMAIN); } @Override public boolean apply(@Nullable final Name name) { return name != null && matcher(name).matches(); } }