package fr.imag.adele.apam.maven.plugin.validation.property; import java.util.HashSet; import java.util.Set; import fr.imag.adele.apam.util.Util; /** * This class represents a type that is a set of values of a single type */ public class CollectionType implements Type { /** * The name of this type */ private final String name; /** * The type of the elements */ private final Type elementType; /** * Whether the collection is internally represented as a set of objects or a set of strings */ private final boolean storeStrings; public CollectionType(Type elementType, boolean storeStrings) { this.name = "{"+elementType.getName()+"}"; this.elementType = elementType; this.storeStrings = storeStrings; } @Override public String getName() { return name; } public Type getElementType() { return elementType; } @Override public boolean isValue(Object value) { if ( !(value instanceof Set)) return false; for (Object element : (Set<?>)value) { if (storeStrings && ! (element instanceof String)) { return false; } if ( !storeStrings && ! elementType.isValue(element)) return false; } return true; } @Override public Object value(String value) { Set<Object> conversion = new HashSet<Object>(); /* * Convert elements */ for (String element : Util.splitList(value)) { Object converted = elementType.value(element); if (converted == null) { return null; } conversion.add(storeStrings ? element : converted); } return conversion; } @Override public String toString(Object value) { StringBuilder result = new StringBuilder(); result.append("{"); boolean first = true; for (Object element : (Set<?>)value ) { if ( !first) { result.append(","); } if (storeStrings) { result.append((String) element); } else { result.append(elementType.toString(element)); } first = false; } result.append("}"); return result.toString(); } @Override public boolean isAssignableTo(String className) { return Mapping.isAssignableFrom(className,Set.class); } @Override public boolean isAssignableFrom(String className) { return Mapping.isAssignableFrom(Set.class,className); } @Override public int hashCode() { return elementType.hashCode(); } @Override public boolean equals(Object object) { if (this == object) return true; if (object == null) return false; if ( ! (object instanceof CollectionType)) return false; CollectionType that = (CollectionType) object; return this.elementType.equals(that.elementType) && this.storeStrings == that.storeStrings; } @Override public boolean isAssignableTo(Type type) { if (this == type) return true; if (type == ANY) return true; if ( ! (type instanceof CollectionType)) return false; CollectionType that = (CollectionType) type; return (this.elementType.isAssignableTo(that.elementType) && this.storeStrings == that.storeStrings) || (this.storeStrings && PrimitiveType.STRING.isAssignableTo(that.elementType)); } @Override public String toString() { return getName(); } }