package edu.ualberta.med.biobank.common.wrappers; import edu.ualberta.med.biobank.common.wrappers.actions.WrapperAction; import edu.ualberta.med.biobank.common.wrappers.listener.WrapperEvent; import edu.ualberta.med.biobank.common.wrappers.listener.WrapperEvent.WrapperEventType; import edu.ualberta.med.biobank.common.wrappers.tasks.RebindableWrapperQueryTask; import edu.ualberta.med.biobank.server.applicationservice.exceptions.BiobankSessionException; import gov.nih.nci.system.query.SDKQuery; import gov.nih.nci.system.query.SDKQueryResult; import org.hibernate.Session; /** * Persist the wrapped object of the given {@link ModelWrapper<?>} on the * server. Also sets the given {@link ModelWrapper<?>}'s wrapped model object to * be the object result of the {@link SDKQueryResult}, when informed and * notifies listeners. * * @author jferland * */ public class PersistModelWrapperQueryTask<E> implements RebindableWrapperQueryTask { private final ModelWrapper<E> modelWrapper; public PersistModelWrapperQueryTask(ModelWrapper<E> modelWrapper) { this.modelWrapper = modelWrapper; } @Override public SDKQuery getSDKQuery() { return new PersistAction<E>(modelWrapper); } @Override public void afterExecute(SDKQueryResult result) { WrapperEventType eventType; if (modelWrapper.isNew()) { eventType = WrapperEventType.INSERT; } else { eventType = WrapperEventType.UPDATE; } WrapperEvent event = new WrapperEvent(eventType, modelWrapper); modelWrapper.notifyListeners(event); } @Override public ModelWrapper<?> getWrapperToRebind() { return modelWrapper; } /** * Persist the wrapped object of the given {@link ModelWrapper}. Determine * what to do (insert or update) on the server instead of the client. * * @author jferland * * @param <E> */ private static class PersistAction<E> extends WrapperAction<E> { private static final long serialVersionUID = 1L; public PersistAction(ModelWrapper<E> wrapper) { super(wrapper); } @Override public Object doAction(Session session) throws BiobankSessionException { E model = getModel(); session.saveOrUpdate(model); return model; } } }