package edu.ualberta.med.biobank.common.wrappers.checks; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import org.hibernate.Query; import org.hibernate.Session; import edu.ualberta.med.biobank.common.peer.MembershipPeer; import edu.ualberta.med.biobank.common.peer.PrincipalPeer; import edu.ualberta.med.biobank.common.util.HibernateUtil; import edu.ualberta.med.biobank.common.wrappers.ModelWrapper; import edu.ualberta.med.biobank.common.wrappers.Property; import edu.ualberta.med.biobank.common.wrappers.actions.UncachedAction; import edu.ualberta.med.biobank.common.wrappers.property.GetterInterceptor; import edu.ualberta.med.biobank.common.wrappers.property.LazyLoaderInterceptor; import edu.ualberta.med.biobank.model.Membership; import edu.ualberta.med.biobank.server.applicationservice.exceptions.BiobankSessionException; import edu.ualberta.med.biobank.server.applicationservice.exceptions.DuplicatePropertySetException; /** * Checks that the {@link Collection} of {@link Property}-s is unique for the * model object in the {@link ModelWrapper}, excluding the instance itself (if * it is already persisted). * * @author delphine * */ public class MembershipUniquePreCheck extends UncachedAction<Membership> { private static final long serialVersionUID = 1L; private static final String HQL_START = "SELECT COUNT(*) FROM " //$NON-NLS-1$ + Membership.class.getName() + " WHERE"; //$NON-NLS-1$ private static final String EXCEPTION_STRING = Messages .getString("MembershipUniquePreCheck.exception.string"); //$NON-NLS-1$ /** * * @param wrapper {@link ModelWrapper} which holds the model object * @param properties to ensure uniqueness on */ public MembershipUniquePreCheck(ModelWrapper<Membership> wrapper) { super(wrapper); } @Override public void doUncachedAction(Session session) throws BiobankSessionException { Query query = getQuery(session); Long count = HibernateUtil.getCountFromQuery(query); if (count > 0) { throwException(); } } private void throwException() throws DuplicatePropertySetException { String modelClass = Format.modelClass(getModelClass()); Collection<Property<?, ? super Membership>> properties = new ArrayList<Property<?, ? super Membership>>(); properties.add(MembershipPeer.PRINCIPAL); // properties.add(MembershipPeer.CENTER); // properties.add(MembershipPeer.STUDY); String values = Format.propertyValues(getModel(), properties); String names = Format.propertyNames(properties); String msg = MessageFormat.format(EXCEPTION_STRING, modelClass, values, names); throw new DuplicatePropertySetException(msg); } private Query getQuery(Session session) { StringBuffer hql = new StringBuffer(HQL_START); appendValueTest(hql, session, MembershipPeer.PRINCIPAL.to(PrincipalPeer.ID)); hql.append(" and "); //$NON-NLS-1$ // appendValueTest(hql, session, // MembershipPeer.CENTER.to(CenterPeer.ID)); hql.append(" and "); //$NON-NLS-1$ // appendValueTest(hql, session, MembershipPeer.STUDY.to(StudyPeer.ID)); hql.append(getNotSelfCondition()); Query query = session.createQuery(hql.toString()); return query; } private String getNotSelfCondition() { String idCheck = ""; //$NON-NLS-1$ Integer id = getModelId(); if (id != null) { String idName = getIdProperty().getName(); idCheck = " AND " + idName + " <> " + id; //$NON-NLS-1$ //$NON-NLS-2$ } return idCheck; } private void appendValueTest(StringBuffer sb, Session session, Property<?, ? super Membership> property) { Membership model = getModel(); GetterInterceptor lazyLoad = new LazyLoaderInterceptor(session, 1); Object value = property.get(model, lazyLoad); sb.append(" ").append(property.getName()); //$NON-NLS-1$ if (value == null) sb.append(" is null"); //$NON-NLS-1$ else sb.append(" = '").append(value).append("'"); //$NON-NLS-1$ //$NON-NLS-2$ } }