/* * This software is Copyright 2005,2006,2007,2008 Langdale Consultants. * Langdale Consultants can be contacted at: http://www.langdale.com.au */ package au.com.langdale.ui.binding; import java.io.File; import java.util.regex.Pattern; /** * A set of validators to use in bindings. */ public class Validators { public static final Pattern NAMESPACE_REGEX = Pattern.compile("[A-Za-z]+:.*#"); public static final Pattern NCNAME_REGEX = Pattern.compile("[A-Za-z_][A-Za-z0-9-_.]*"); public static final Validator NONE = new Validator() { @Override public String validate(String value) { return null; } }; public static final Validator DOUBLE = new Validator() { @Override public String validate(String value) { try { Double.valueOf(value); return null; } catch( NumberFormatException ex) { return ex.getMessage(); } } }; public static final Validator INTEGER = new Validator() { @Override public String validate(String value) { try { Integer.valueOf(value); return null; } catch( NumberFormatException ex) { return ex.getMessage(); } } }; public static final Validator NATURAL = new Validator() { @Override public String validate(String value) { try { if( Integer.valueOf(value) < 0 ) return "value may not be negative"; else return null; } catch( NumberFormatException ex) { return ex.getMessage(); } } }; public static final Validator OptionalFileWithExt(final String ext) { return SimpleFile( new String[] { ext }, false, true ); } public static final Validator OptionalFileAnyExt() { return SimpleFile( new String[0], false, false); } public static final Validator SimpleFile(String ext, boolean required) { return SimpleFile( new String[] { ext }, required, false ); } public static final Validator SimpleFile(final String[] exts, boolean required) { return SimpleFile(exts, required, true); } public static final Validator SimpleFile(final String[] exts, final boolean required, final boolean requireExt) { return new Validator() { @Override public String validate(String value) { if( value.length() == 0 ) if(required) return "A project resource name is required"; else return null; if( value.contains("/") || value.contains("\\") || value.contains(" ")) return "A simple project resource name with no folders is required"; for(int ix = 0; ix < exts.length; ix++) { String ext = exts[ix]; if( ext.startsWith("*.")) ext = ext.substring(2); if(value.endsWith("." + ext)) return null; } if( requireExt ) return "A project resource name with a valid extension is required"; if( value.contains(".")) return "If given, the extension of the project resource must be valid"; return null; } }; } public static final Validator EXTANT_FILE = ExtantFile(true); public static final Validator OPTIONAL_EXTANT_FILE = ExtantFile(false); public static final Validator ExtantFile(final boolean required) { return new Validator() { @Override public String validate(String pathname) { if( pathname.length() == 0) if(required) return "A file name is required"; else return null; File source = new File(pathname); if( ! source.isFile()) return "An existing, plain file is required"; if( ! source.canRead()) return "The file cannot be read"; return null; } }; } public static final Validator NEW_FILE = new Validator() { @Override public String validate(String pathname) { if( pathname.length() == 0) return "A file name is required"; File destin = new File(pathname).getAbsoluteFile(); if( destin.exists()) return "File already exists"; if( ! destin.getParentFile().canWrite()) return "Directory is not writable"; return null; }; }; public static final Validator NCNAME = new Validator() { @Override public String validate(String value) { if( value.length() == 0 ) return "A name is required"; else return NCNAME_OPT.validate(value); } }; public static final Validator NCNAME_OPT = new Validator() { @Override public String validate(String value) { if( value.length() > 0 && ! NCNAME_REGEX.matcher(value).matches()) return "A valid XML element name is required"; else return null; } }; public static final Validator NAMESPACE = new Validator() { @Override public String validate(String value) { if( value.length() == 0 ) return "A symbolic namespace URI is required"; if( ! NAMESPACE_REGEX.matcher(value).matches()) return "The namespace must begin with a scheme such as 'http:' and end with a '#'"; return null; } }; }