Java tutorial
/** * 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.gateway.util; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.net.URLCodec; /** * */ public class Urls { public static String ensureLeadingSlash(String s) { if (s == null) { return "/"; } else if (s.startsWith("/")) { return s; } else { return "/" + s; } } public static String stripLeadingSlash(String s) { if (s != null) { s = s.trim(); while (s.startsWith("/")) { s = s.substring(1); } } return s; } public static String concatUrl(String prefix, String suffix) { if (suffix == null) { return prefix; } else if (prefix.endsWith("/") && suffix.startsWith("/")) { return prefix + stripLeadingSlash(suffix); } else if (!prefix.endsWith("/") && !suffix.startsWith("/")) { return prefix + "/" + suffix; } else { return prefix + suffix; } } public static boolean isIp(String domain) { Pattern p = Pattern.compile( "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); Matcher m = p.matcher(domain); return m.find(); } public static int dotOccurrences(String domain) { return domain.length() - domain.replace(".", "").length(); } /** * Compute the domain name from an URL. * * @param url a given URL * @param domainSuffix a domain suffix (can be <code>null</code>) * @return the extracted domain name * @throws URISyntaxException */ public static String getDomainName(String url, String domainSuffix) throws MalformedURLException { final URL originalUrl = new URL(url); final String domain = originalUrl.getHost(); // if the configured domainSuffix is '*' assume that it should be // the default domain which should be the FQHN if ("*".equals(domainSuffix)) { return domain; } // if the hostname ends with the domainSuffix the use the domainSuffix as // the cookie domain if (domainSuffix != null && domain.endsWith(domainSuffix)) { return (domainSuffix.startsWith(".")) ? domainSuffix : "." + domainSuffix; } // if accessing via ip address do not wildcard the cookie domain // let's use the default domain if (isIp(domain)) { return null; } // if there are fewer than 2 dots than this is likely a // specific host and we should use the default domain if (dotOccurrences(domain) < 2) { return null; } // assume any non-ip address with more than // 3 dots will need the first element removed and // all subdmains accepted int idx = domain.indexOf('.'); if (idx == -1) { idx = 0; } return domain.substring(idx); } public static String encode(String str) { URLCodec codec = new URLCodec(); try { return codec.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } } public static String decode(String str) { URLCodec codec = new URLCodec(); try { return codec.decode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } catch (DecoderException e) { throw new IllegalArgumentException(e); } } public static String trimLeadingAndTrailingSlash(String s) { if (s == null) { return ""; } else { int b = 0; int e = s.length(); while (b < e && s.charAt(b) == '/') { b++; } while (e > b && s.charAt(e - 1) == '/') { e--; } return s.substring(b, e); } } public static String trimLeadingAndTrailingSlashJoin(String... parts) { StringBuilder s = new StringBuilder(); if (parts != null) { String p = ""; String n = ""; for (int i = 0; i < parts.length; i++) { n = trimLeadingAndTrailingSlash(parts[i]); if (!n.isEmpty()) { if (!p.isEmpty()) { s.append('/'); } s.append(n); p = n; } } } return s.toString(); } }