org.elasticsearch.common.util.URIPattern Maven / Gradle / Ivy
The newest version!
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch 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.elasticsearch.common.util;
import org.elasticsearch.common.regex.Regex;
import java.net.URI;
import java.net.URISyntaxException;
/**
* URI Pattern matcher
*
* The pattern is URI in which authority, path, query and fragment can be replace with simple pattern.
*
* For example: foobar://*.local/some_path/*?*#* will match all uris with schema foobar in local domain
* with any port, with path that starts some_path and with any query and fragment.
*/
public class URIPattern {
private final URI uriPattern;
/**
* Constructs uri pattern
*/
public URIPattern(String pattern) {
try {
uriPattern = new URI(pattern);
} catch (URISyntaxException ex) {
throw new IllegalArgumentException("cannot parse URI pattern [" + pattern + "]");
}
}
/**
* Returns true if the given uri matches the pattern
*/
public boolean match(URI uri) {
return matchNormalized(uri.normalize());
}
public static boolean match(URIPattern[] patterns, URI uri) {
URI normalized = uri.normalize();
for (URIPattern pattern : patterns) {
if (pattern.matchNormalized(normalized)) {
return true;
}
}
return false;
}
private boolean matchNormalized(URI uri) {
if(uriPattern.isOpaque()) {
// This url only has scheme, scheme-specific part and fragment
return uri.isOpaque() &&
match(uriPattern.getScheme(), uri.getScheme()) &&
match(uriPattern.getSchemeSpecificPart(), uri.getSchemeSpecificPart()) &&
match(uriPattern.getFragment(), uri.getFragment());
} else {
return match(uriPattern.getScheme(), uri.getScheme()) &&
match(uriPattern.getAuthority(), uri.getAuthority()) &&
match(uriPattern.getQuery(), uri.getQuery()) &&
match(uriPattern.getPath(), uri.getPath()) &&
match(uriPattern.getFragment(), uri.getFragment());
}
}
private boolean match(String pattern, String value) {
if (value == null) {
// If the pattern is empty or matches anything - it's a match
if (pattern == null || Regex.isMatchAllPattern(pattern)) {
return true;
}
}
return Regex.simpleMatch(pattern, value);
}
@Override
public String toString() {
return uriPattern.toString();
}
}