/*
* @(#)$Id: LengthFacet.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 java.util.Hashtable;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* "length", "minLength", and "maxLength" facet validator.
*
* this class also detects inconsistent facet setting
* (for example, minLength=100 and maxLength=0)
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
public class LengthFacet extends DataTypeWithValueConstraintFacet {
public final int length;
protected LengthFacet( String nsUri, String typeName, XSDatatypeImpl baseType, TypeIncubator facets )
throws DatatypeException {
super(nsUri,typeName,baseType,FACET_LENGTH,facets);
length = facets.getNonNegativeInteger(FACET_LENGTH);
// loosened facet check
DataTypeWithFacet o = baseType.getFacetObject(FACET_LENGTH);
if(o!=null && ((LengthFacet)o).length != this.length )
throw new DatatypeException(
localize(ERR_LOOSENED_FACET, FACET_LENGTH, o.displayName() ) );
// consistency with minLength/maxLength is checked in XSDatatypeImpl.derive method.
}
public Object _createValue( String content, ValidationContext context ) {
Object o = baseType._createValue(content,context);
if(o==null || ((Discrete)concreteType).countLength(o)!=length) 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!=length)
throw new DatatypeException( DatatypeException.UNKNOWN,
localize(ERR_LENGTH, new Integer(cnt), new Integer(length)) );
}
}