/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.wicket;
import java.util.regex.Pattern;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
/**
* Checks a string conforms to the XML Name production as declared at {@link http
* ://www.w3.org/TR/REC-xml/#NT-Name}
*
* @author aaime
*
*/
@SuppressWarnings("serial")
public class XMLNameValidator implements IValidator<String> {
private static Pattern XML_NAME_PATTERN;
static {
// Definitions coming from
// NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
// [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
// [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
// NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
// Name ::= NameStartChar (NameChar)*
String nameStartCharSet = "A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F"
+ "\u1FFF\u200C\u200D\u2070-\u218F\u2C00\u2FEF\u3001\uD7FF\uF900-\uFDCF"
+ "\uFDF0-\uFFFD";
String nameStartChar = "[" + nameStartCharSet + "]";
String nameChar = ("[" + nameStartCharSet + "\\-.0-9\u0087\u0300-\u036F\u203F-\u2040]");
String name = "(?:" + nameStartChar + nameChar + "*)";
XML_NAME_PATTERN = Pattern.compile(name, Pattern.CASE_INSENSITIVE);
}
@Override
public void validate(IValidatable<String> validatable) {
String value = (String) validatable.getValue();
if (!XML_NAME_PATTERN.matcher(value).matches()) {
validatable.error(new ValidationError("invalidXMLName")
.addKey("invalidXMLName").setVariable("name", value));
}
}
}