001 package org.apache.commons.contract.constraints; 002 003 import java.util.Iterator; 004 import java.util.List; 005 import java.util.Locale; 006 007 import org.apache.commons.contract.Context; 008 import org.apache.commons.i18n.bundles.ErrorBundle; 009 import org.apache.commons.i18n.bundles.TextBundle; 010 011 public class ArrayConstraints implements Constraints { 012 public static final ArrayConstraints UNCONSTRAINED = new ArrayConstraints(); 013 014 protected Constraints entryValueDescriptor; 015 016 public ArrayConstraints() { 017 entryValueDescriptor = Unconstrained.UNCONSTRAINED; 018 } 019 020 public ArrayConstraints(Constraints entryValueDescriptor) { 021 this.entryValueDescriptor = entryValueDescriptor; 022 } 023 024 public void setEntryValueDescriptor(Constraints entryValueDescriptor) { 025 this.entryValueDescriptor = entryValueDescriptor; 026 } 027 028 public Constraints getEntryValueDescriptor() { 029 return entryValueDescriptor; 030 } 031 032 public Object cast(Object value, Context context) throws CastException { 033 Object[] array = null; 034 if ( value instanceof String[] ) { 035 array = new Object[((String[])value).length]; 036 for ( int i = 0; i < array.length; i++ ) { 037 array[i] = entryValueDescriptor.cast(((String [])value)[i], context); 038 } 039 } else if ( value instanceof List ) { 040 array = new Object[((List)value).size()]; 041 int counter = 0; 042 for ( Iterator i = ((List)value).iterator(); i.hasNext(); ) { 043 Object entry = i.next(); 044 if ( entry instanceof Evaluatable ) { 045 try { 046 entry = ((Evaluatable)entry).evaluate(context); 047 } catch (Exception e) { 048 throw new CastException(new ErrorBundle("evaluatingAnyFailed"), e); 049 } 050 } 051 array[counter] = entryValueDescriptor.cast(entry, context); 052 counter++; 053 } 054 } else if ( value instanceof Object[] ) { 055 array = new Object[((Object[])value).length]; 056 for ( int i = 0; i < array.length; i++ ) { 057 Object entry = ((Object[])value)[i]; 058 if ( entry instanceof Evaluatable ) { 059 try { 060 entry = ((Evaluatable)entry).evaluate(context); 061 } catch (Exception e) { 062 throw new CastException(new ErrorBundle("evaluatingAnyFailed"), e); 063 } 064 } 065 array[i] = entryValueDescriptor.cast(entry, context); 066 } 067 } else { 068 throw new CastException(new ErrorBundle("uncastableArray", new Object[] { value })); 069 } 070 return array; 071 } 072 073 public void validate(Object value, Context context) throws ValidationException { 074 try { 075 Object[] array = (Object [])value; 076 for ( int i = 0; i < array.length; i++ ) { 077 if ( array[i] != null ) { 078 entryValueDescriptor.validate(array[i], context); 079 } 080 } 081 } catch ( ValidationException exception ) { 082 throw new ValidationException(new ErrorBundle("invalidArrayEntry", new Object[] { value }), exception); 083 } 084 } 085 086 public TextBundle verboseConstraints() { 087 if ( entryValueDescriptor == Unconstrained.UNCONSTRAINED ) { 088 return new TextBundle("unconstrainedArray"); 089 } else { 090 TextBundle verbosedEntryContrstaints = entryValueDescriptor.verboseConstraints(); 091 return new TextBundle("constrainedArray", new String[] { verbosedEntryContrstaints.getText(Locale.getDefault()) }); 092 } 093 } 094 }