001 /* 002 * Copyright (c) 2006 Henri Sivonen 003 * 004 * Permission is hereby granted, free of charge, to any person obtaining a 005 * copy of this software and associated documentation files (the "Software"), 006 * to deal in the Software without restriction, including without limitation 007 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 008 * and/or sell copies of the Software, and to permit persons to whom the 009 * Software is furnished to do so, subject to the following conditions: 010 * 011 * The above copyright notice and this permission notice shall be included in 012 * all copies or substantial portions of the Software. 013 * 014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 017 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 019 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 020 * DEALINGS IN THE SOFTWARE. 021 */ 022 023 package org.whattf.datatype; 024 025 import org.mozilla.javascript.EcmaError; 026 import org.mozilla.javascript.regexp.RegExpImpl; 027 import org.relaxng.datatype.DatatypeException; 028 029 /** 030 * This datatype shall accept the strings that are allowed as the value of the Web Forms 2.0 031 * <a href="http://whatwg.org/specs/web-forms/current-work/#pattern"><code>pattern</code></a> 032 * attribute. 033 * @version $Id: Pattern.java,v 1.5 2006/11/18 11:51:44 hsivonen Exp $ 034 * @author hsivonen 035 */ 036 public final class Pattern extends AbstractDatatype { 037 038 /** 039 * The singleton instance. 040 */ 041 public static final Pattern THE_INSTANCE = new Pattern(); 042 043 /** 044 * Package-private constructor 045 */ 046 private Pattern() { 047 super(); 048 } 049 050 /** 051 * Checks that the value compiles as an anchored JavaScript regular expression. 052 * @param literal the value 053 * @param context ignored 054 * @throws DatatypeException if the value isn't valid 055 * @see org.relaxng.datatype.Datatype#checkValid(java.lang.String, org.relaxng.datatype.ValidationContext) 056 */ 057 public void checkValid(CharSequence literal) 058 throws DatatypeException { 059 // TODO find out what kind of thread concurrency guarantees are made 060 RegExpImpl rei = new RegExpImpl(); 061 String anchoredRegex = "^(?:" + literal + ")$"; 062 try { 063 rei.compileRegExp(null, anchoredRegex, ""); 064 } catch (EcmaError ee) { 065 throw new DatatypeException("Bad pattern: " + ee.getErrorMessage()); 066 } 067 } 068 }