package edu.ualberta.med.biobank.common.action.scanprocess;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.action.scanprocess.result.CellProcessResult;
import edu.ualberta.med.biobank.common.action.scanprocess.result.ProcessResult;
import edu.ualberta.med.biobank.common.action.scanprocess.result.ScanProcessResult;
import edu.ualberta.med.biobank.common.peer.SpecimenPeer;
import edu.ualberta.med.biobank.common.util.RowColPos;
import edu.ualberta.med.biobank.model.Specimen;
import edu.ualberta.med.biobank.model.User;
public abstract class ServerProcessAction implements Action<ProcessResult> {
private static final long serialVersionUID = 1L;
protected Integer currentWorkingCenterId;
private List<String> logs;
protected Locale locale;
private Map<RowColPos, CellInfo> cells;
private boolean isRescanMode = false;
private boolean processOneCell;
private CellInfo cell;
protected User user;
protected Session session;
protected ActionContext actionContext;
public ServerProcessAction(
Integer currentWorkingCenterId,
Map<RowColPos, CellInfo> cells,
boolean isRescanMode, Locale locale) {
this.currentWorkingCenterId = currentWorkingCenterId;
this.cells = cells;
this.isRescanMode = isRescanMode;
this.locale = locale;
this.processOneCell = false;
logs = new ArrayList<String>();
}
public ServerProcessAction(
Integer currentWorkingCenterId,
CellInfo cell,
Locale locale) {
this.currentWorkingCenterId = currentWorkingCenterId;
this.cell = cell;
this.locale = locale;
this.processOneCell = true;
logs = new ArrayList<String>();
}
@Override
public ProcessResult run(ActionContext context)
throws ActionException {
ProcessResult res;
this.user = context.getUser();
this.session = context.getSession();
this.actionContext = new ActionContext(user, session, null);
if (processOneCell)
res = getCellProcessResult(cell);
else
res = getScanProcessResult(cells, isRescanMode);
res.setLogs(logs);
return res;
}
protected abstract ScanProcessResult getScanProcessResult(
Map<RowColPos, CellInfo> cells, boolean isRescanMode)
throws ActionException;
protected abstract CellProcessResult getCellProcessResult(CellInfo cell)
throws ActionException;
public void appendNewLog(String log) {
logs.add(log);
}
protected Specimen searchSpecimen(Session session, String value) {
Criteria criteria = session.createCriteria(Specimen.class).add(
Restrictions.eq(SpecimenPeer.INVENTORY_ID.getName(),
value));
@SuppressWarnings("unchecked")
List<Specimen> list = criteria.list();
if (list.size() == 1) {
return list.get(0);
}
return null;
}
}