package net.sourceforge.fenixedu.domain.accessControl.academicAdministration; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; public abstract class EnumArray> implements Serializable { private final Set elements; private static final String SEPARATOR = ";"; public EnumArray(String serialized) { elements = new HashSet(); if (StringUtils.isNotBlank(serialized)) { for (String part : serialized.split(SEPARATOR)) { elements.add(resolve(part)); } } } public EnumArray(Set elements) { this.elements = elements; } protected abstract EnumArray make(Set elements); protected abstract T resolve(String serialize); public boolean same(Set elements) { return CollectionUtils.isEqualCollection(this.elements, elements); } public boolean contains(Set elements) { return this.elements.containsAll(elements); } public EnumArray with(T element) { Set newElements = new HashSet(elements); newElements.add(element); return make(newElements); } public EnumArray without(T element) { Set newElements = new HashSet(elements); newElements.remove(element); return make(newElements); } public Set getValues() { return elements; } public String serialize() { return StringUtils.join(elements, SEPARATOR); } @Override public String toString() { return StringUtils.join(elements, ", "); } @Override public boolean equals(Object obj) { if (obj instanceof EnumArray) { return CollectionUtils.isEqualCollection(elements, ((EnumArray) obj).elements); } return false; } @Override public int hashCode() { int sum = 0; for (T elem : elements) { sum = elem.hashCode(); } return sum; } }