View Javadoc
1   /*******************************************************************************
2    * Portions created by Sebastian Thomschke are copyright (c) 2005-2011 Sebastian
3    * Thomschke.
4    * 
5    * All Rights Reserved. This program and the accompanying materials
6    * are made available under the terms of the Eclipse Public License v1.0
7    * which accompanies this distribution, and is available at
8    * http://www.eclipse.org/legal/epl-v10.html
9    * 
10   * Contributors:
11   *     Sebastian Thomschke - initial implementation.
12   *******************************************************************************/
13  package net.sf.oval.constraint;
14  
15  import static net.sf.oval.Validator.getCollectionFactory;
16  
17  import java.util.Map;
18  
19  import net.sf.oval.Validator;
20  import net.sf.oval.configuration.annotation.AbstractAnnotationCheck;
21  import net.sf.oval.context.OValContext;
22  import net.sf.oval.internal.util.StringUtils;
23  
24  /**
25   * @author Sebastian Thomschke
26   */
27  public class InstanceOfAnyCheck extends AbstractAnnotationCheck<InstanceOfAny>
28  {
29  	private static final long serialVersionUID = 1L;
30  
31  	private Class< ? >[] types;
32  
33  	/**
34  	 * {@inheritDoc}
35  	 */
36  	@Override
37  	public void configure(final InstanceOfAny constraintAnnotation)
38  	{
39  		super.configure(constraintAnnotation);
40  		setTypes(constraintAnnotation.value());
41  	}
42  
43  	/**
44  	 * {@inheritDoc}
45  	 */
46  	@Override
47  	protected Map<String, String> createMessageVariables()
48  	{
49  		final Map<String, String> messageVariables = getCollectionFactory().createMap(2);
50  		if (types.length == 1)
51  			messageVariables.put("types", types[0].getName());
52  		else
53  		{
54  			final String[] classNames = new String[types.length];
55  			for (int i = 0, l = classNames.length; i < l; i++)
56  				classNames[i] = types[i].getName();
57  			messageVariables.put("types", StringUtils.implode(classNames, ","));
58  		}
59  		return messageVariables;
60  	}
61  
62  	/**
63  	 * @return the type
64  	 */
65  	public Class< ? >[] getTypes()
66  	{
67  		return types;
68  	}
69  
70  	/**
71  	 * {@inheritDoc}
72  	 */
73  	public boolean isSatisfied(final Object validatedObject, final Object valueToValidate, final OValContext context,
74  			final Validator validator)
75  	{
76  		if (valueToValidate == null) return true;
77  
78  		for (final Class< ? > type : types)
79  			if (type.isInstance(valueToValidate)) return true;
80  		return false;
81  	}
82  
83  	/**
84  	 * @param types the types to set
85  	 */
86  	public void setTypes(final Class< ? >... types)
87  	{
88  		this.types = types;
89  		requireMessageVariablesRecreation();
90  	}
91  }