/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.control.managestudy;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean;
import org.akaza.openclinica.control.form.FormProcessor;
import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.view.Page;
import java.util.ArrayList;
/**
* Processes request to change CRF ordinals in a study event definition
*
* @author jxu
*/
public class ChangeDefinitionCRFOrdinalServlet extends ChangeOrdinalServlet {
/**
* Override processRequest in super class
*/
@Override
public void processRequest() throws Exception {
FormProcessor fp = new FormProcessor(request);
int current = fp.getInt("current");
int previous = fp.getInt("previous");
int currOrdinal = fp.getInt("currentOrdinal");
int prevOrdinal = fp.getInt("previousOrdinal");
int definitionId = fp.getInt("id");
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(sm.getDataSource());
increase(current, previous, currOrdinal, prevOrdinal, definitionId, edcdao);
StudyDAO sdao = new StudyDAO(sm.getDataSource());
int siteId = fp.getInt("siteId");
if (siteId > 0) {
request.setAttribute("idToSort", new Integer(definitionId).toString());
request.setAttribute("siteId", siteId);
forwardPage(Page.VIEW_SITE_SERVLET);
} else {
request.setAttribute("id", new Integer(definitionId).toString());
forwardPage(Page.VIEW_EVENT_DEFINITION_SERVLET);
}
}
/**
* Increases the ordinal for current object and decrease the ordinal of the
* previous one
*
* @param idCurrent
* @param idPrevious
* @param dao
*/
private void increase(int idCurrent, int idPrevious, int currOrdinal, int prevOrdinal, int defId, EventDefinitionCRFDAO dao) {
EventDefinitionCRFBean current = (EventDefinitionCRFBean) dao.findByPK(idCurrent);
EventDefinitionCRFBean previous = (EventDefinitionCRFBean) dao.findByPK(idPrevious);
if (current.getOrdinal() == currOrdinal && previous.getOrdinal() == prevOrdinal) {
if (idCurrent > 0) {
int currentOrdinal = current.getOrdinal();
current.setOrdinal(currentOrdinal - 1);
current.setUpdater((UserAccountBean) session.getAttribute("userBean"));
dao.update(current);
}
if (idPrevious > 0) {
int previousOrdinal = previous.getOrdinal();
previous.setOrdinal(previousOrdinal + 1);
previous.setUpdater((UserAccountBean) session.getAttribute("userBean"));
dao.update(previous);
}
ArrayList currOrdlist = dao.findAllByEventDefinitionIdAndOrdinal(defId, current.getOrdinal());
ArrayList prevOrdlist = dao.findAllByEventDefinitionIdAndOrdinal(defId, previous.getOrdinal());
if (currOrdlist.size() > 1 || prevOrdlist.size() > 1 ) {
fixDuplicates(defId, dao);
}
}
}
/**
* Fixes ordinal values if there is any duplicates
*
* @param definitionId
* @param dao
*/
private void fixDuplicates(int definitionId, EventDefinitionCRFDAO dao) {
ArrayList list = dao.findAllByEventDefinitionId(definitionId);
int prevOrdinal = 0;
boolean incrementNextOrdinal = false;
for (int i =0; i < list.size(); i++) {
EventDefinitionCRFBean edc = (EventDefinitionCRFBean) list.get(i);
if (i == 0) {
if (edc.getOrdinal() != 0) {
edc.setOrdinal(i);
dao.update(edc);
}
continue;
}
if (incrementNextOrdinal) {
edc.setOrdinal(i);
dao.update(edc);
continue;
}
if (edc.getOrdinal() != i) {
edc.setOrdinal(i);
dao.update(edc);
incrementNextOrdinal = true;
}
}
}
}