package org.mongodb.morphia.mapping.validation.fieldrules;


import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Reference;
import org.mongodb.morphia.mapping.MappedClass;
import org.mongodb.morphia.mapping.MappedField;
import org.mongodb.morphia.mapping.Mapper;
import org.mongodb.morphia.mapping.MappingException;
import org.mongodb.morphia.mapping.validation.ConstraintViolation;
import org.mongodb.morphia.mapping.validation.ConstraintViolation.Level;

import java.util.Set;


Author:Uwe Schaefer, (us@thomas-daily.de)
/** * @author Uwe Schaefer, (us@thomas-daily.de) */
public class ReferenceToUnidentifiable extends FieldConstraint { @Override protected void check(final Mapper mapper, final MappedClass mc, final MappedField mf, final Set<ConstraintViolation> ve) { if (mf.hasAnnotation(Reference.class)) { final Class realType = (mf.isSingleValue()) ? mf.getType() : mf.getSubClass(); if (realType == null) { throw new MappingException("Type is null for this MappedField: " + mf); } if ((!realType.isInterface() && mapper.getMappedClass(realType).getIdField() == null)) { ve.add(new ConstraintViolation(Level.FATAL, mc, mf, getClass(), mf.getFullName() + " is annotated as a @" + Reference.class.getSimpleName() + " but the " + mf.getType().getName() + " class is missing the @" + Id.class.getSimpleName() + " annotation")); } } } }