package org.om.core.impl.mapping; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.om.core.api.exception.MappingException; import org.om.core.api.mapping.Fields; import org.om.core.api.mapping.MappedField; import org.om.core.api.mapping.field.Mapping; /** * Immutable implementation of {@link Fields}. * * @author Jakob Külzer * */ public class ImmutableFields implements Fields { private final Map<String, MappedField> fields; private MappedField id; public ImmutableFields(Set<MappedField> inputFields) { final Map<String, MappedField> tmpFields = new HashMap<String, MappedField>(); for (MappedField mf : inputFields) { final Mapping mapping = mf.getMapping(); if (mapping.isId()) { if (id != null) throw new MappingException("Found more than one @Id property!"); id = mf; } tmpFields.put(mf.getName(), mf); } this.fields = Collections.unmodifiableMap(tmpFields); } public Collection<MappedField> getAll() { return fields.values(); } public MappedField getField(String fieldname) { return fields.get(fieldname); } @Override public MappedField getFieldByMapping(Mapping mapping) { for (MappedField mf : fields.values()) { // This should use .equals(), but for now it works: if (mf.getMapping() == mapping) return mf; } throw new IllegalArgumentException("Looking for a mapped field with mapping " + mapping + " but it doesn't exist."); } public MappedField getIdProperty() { return id; } public int getSize() { return fields.size(); } public boolean hasField(String name) { return fields.containsKey(name); } public boolean isEmpty() { return getSize() == 0; } public Iterator<MappedField> iterator() { return fields.values().iterator(); } }