/* * @(#)$Id: MinLengthFacet.java,v 1.21 2002/06/24 19:57:28 kk122374 Exp $ * * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. * * This software is the proprietary information of Sun Microsystems, Inc. * Use is subject to license terms. * */ package com.sun.msv.datatype.xsd; import org.relaxng.datatype.DatatypeException; import org.relaxng.datatype.ValidationContext; /** * 'minLength' facet * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class MinLengthFacet extends DataTypeWithValueConstraintFacet { public final int minLength; protected MinLengthFacet( String nsUri, String typeName, XSDatatypeImpl baseType, TypeIncubator facets ) throws DatatypeException { super(nsUri,typeName,baseType,FACET_MINLENGTH,facets); minLength = facets.getNonNegativeInteger(FACET_MINLENGTH); // loosened facet check DataTypeWithFacet o = baseType.getFacetObject(FACET_MINLENGTH); if(o!=null && ((MinLengthFacet)o).minLength > this.minLength ) throw new DatatypeException( localize( ERR_LOOSENED_FACET, FACET_MINLENGTH, o.displayName() ) ); // consistency with maxLength is checked in XSDatatypeImpl.derive method. } public Object _createValue( String literal, ValidationContext context ) { Object o = baseType._createValue(literal,context); if(o==null || ((Discrete)concreteType).countLength(o)<minLength) return null; return o; } protected void diagnoseByFacet(String content, ValidationContext context) throws DatatypeException { Object o = concreteType._createValue(content,context); // base type must have accepted this lexical value, otherwise // this method is never called. if(o==null) throw new IllegalStateException(); // assertion int cnt = ((Discrete)concreteType).countLength(o); if(cnt<minLength) throw new DatatypeException( DatatypeException.UNKNOWN, localize(ERR_MINLENGTH, new Integer(cnt), new Integer(minLength)) ); } }