/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2011 Akaza Research
*/
package org.akaza.openclinica.control.form.spreadsheet;
import org.akaza.openclinica.domain.crfdata.InstantOnChangeType;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
/**
* SpreadSheet loading validate for instant_calculation func:onChange
*
*/
//ywang (Aug., 2011)
public class OnChangeSheetValidator implements SpreadSheetValidator{
private final SheetValidationContainer sheetValidationContainer;
private List<OnChangeSheetValidationCell> cells;
private SheetErrors sheetErrors;
public OnChangeSheetValidator(SheetValidationContainer spreadSheetValidationContainer,
ResourceBundle resPageMsg) {
this.sheetValidationContainer = spreadSheetValidationContainer;
cells = new ArrayList<OnChangeSheetValidationCell>();
sheetErrors = new SheetErrors(resPageMsg);
}
/**
* Validate cells List.
*/
public void validate() {
for(OnChangeSheetValidationCell cell: this.cells) {
validateWithOrder(cell);
}
}
/*
* If onChangeTypeFirst of cell is true, validate cell's OnChangeValidationType first, then cell's SheetValidationType;
* vise versa.
*/
private void validateWithOrder(OnChangeSheetValidationCell cell) {
if(cell.getOnChangeTypeFirst() == Boolean.TRUE) {
validateOnChangeType(cell);
SheetValidatorHelper.validateSheetValidationCell(cell.getSheetValidationCell(),sheetErrors);
} else {
SheetValidatorHelper.validateSheetValidationCell(cell.getSheetValidationCell(),sheetErrors);
validateOnChangeType(cell);
}
}
/*
* Validate only OnChangeValidationType of an OnChangeSheetValidationCell
*
* @param cell
*/
private void validateOnChangeType(OnChangeSheetValidationCell cell) {
if(cell.getType() == OnChangeSheetValidationType.ALL) {
validateCellResValueAll(cell);
}
}
private void validateCellResValueAll(OnChangeSheetValidationCell onChangeSheetValidationCell) {
boolean printHtmlErr = false;
SheetCell cell = onChangeSheetValidationCell.getSheetValidationCell().getSheetArgumentCell().getSheetCell();
ResourceBundle resPageMsg = sheetErrors.getResPageMsg();
//IS_REQUIRED
if(cell.getColValue() == null || cell.getColValue().isEmpty()) {
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()),
resPageMsg.getString(SheetValidationType.IS_REQUIRED.getDescription()), resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
sheetErrors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), cell.getColNum(), resPageMsg.getString("required_field"));
} else {
//switch (cell.getOnChangeType()) {
//case SHOULD_BE_FUNC_ONCHANGE:
if(!OnChangeSheetValidator.isValidInstantOnChangeSyntax(cell.getColValue())) {
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()),
resPageMsg.getString(OnChangeSheetValidationType.SHOULD_BE_FUNC_ONCHANGE.getDescription()), resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
printHtmlErr = true;
} else {
onChangeSheetValidationCell.setOriAndOption();
// break;
//case SHOULD_BE_FUNC_ONCHANGE_TYPE:
if(!OnChangeSheetValidator.isValidInstantOnChangeType(onChangeSheetValidationCell)) {
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()),
resPageMsg.getString(OnChangeSheetValidationType.SHOULD_BE_FUNC_ONCHANGE_TYPE.getDescription()), resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
printHtmlErr = true;
}
// break;
//case IS_ITEM_PAIR:
if(!isValidInstantOnChangeItemPair(onChangeSheetValidationCell)) {
//printHtmlErr = true;
}
// break;
//case NONE: break;
//}
}
}
//if(printHtmlErr)
// errors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), cell.getColNum(), resPageMsg.getString("INVALID_FIELD"));
//print other message first and "INVALID_FIELD" only once
if(printHtmlErr && !sheetErrors.htmlErrors.containsKey(sheetErrors.htmlErrorKey(cell.getSheetNum(), cell.getRowNum(), cell.getColNum())))
sheetErrors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), cell.getColNum(), resPageMsg.getString("INVALID_FIELD"));
}
public void addValidationCells(OnChangeSheetValidationCell cell) {
this.cells.add(cell);
}
/**
* For func: onChange(item, option)
* @return
*/
public static boolean isValidInstantOnChangeSyntax(String resValues) {
String value = resValues.trim();
if (value.startsWith("func:")) {
String ss = value.substring(5).trim();
String s = ss.substring(0, 8).trim();
if("onChange".equalsIgnoreCase(s)) {
s = ss.substring(8).trim();
if(s.startsWith("(") && s.endsWith(")")) {
s = s.substring(1,s.length()-1).trim();
String[] t = s.split(",");
if(t.length == 2) return true;
}
}
}
return false;
}
private boolean isValidInstantOnChangeItemPair(OnChangeSheetValidationCell onChangeSheetValidationCell) {
SheetCell cell = onChangeSheetValidationCell.getSheetValidationCell().getSheetArgumentCell().getSheetCell();
ResourceBundle resPageMsg = sheetErrors.getResPageMsg();
Map<String, String> allItems = sheetValidationContainer.getAllItems();
if(cell.getColValue() != null && cell.getColValue().length()>0 && allItems.containsKey(onChangeSheetValidationCell.getOriName())) {
if(sheetValidationContainer.inSameSection(cell.getRowName(), onChangeSheetValidationCell.getOriName())) {
if(isValidInstantOnChangeGroupPair(onChangeSheetValidationCell.getOriName(), cell.getRowName())) {
return true;
} else {
StringBuffer s = new StringBuffer(onChangeSheetValidationCell.getOriName());
s.append(" ");
s.append(resPageMsg.getString("and"));
s.append(" ");
s.append(cell.getRowName());
s.append(" ");
s.append(resPageMsg.getString(OnChangeSheetValidationType.SHOULD_IN_SAME_REPEATING_GROUP.getDescription()));
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()), s.toString(),
resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
sheetErrors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), 6, resPageMsg.getString("INVALID_FIELD"));
}
}else {
StringBuffer s = new StringBuffer(cell.getRowName());
s.append(", ");
s.append(onChangeSheetValidationCell.getOriName());
s.append(" ");
s.append(resPageMsg.getString(OnChangeSheetValidationType.SHOULD_IN_SAME_SECTION.getDescription()));
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()),
s.toString(), resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
sheetErrors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), 5, resPageMsg.getString("INVALID_FIELD"));
}
} else {
StringBuffer s = new StringBuffer(onChangeSheetValidationCell.getOriName());
s.append(" ");
s.append(resPageMsg.getString(SheetValidationType.ITEM_NAME_SHOULD_PROVIDED.getDescription()));
StringBuffer message = sheetErrors.errorMessage(resPageMsg.getString(cell.getColTitle()),
s.toString(), resPageMsg.getString(cell.getForWhich()));
sheetErrors.addError(cell.getRowNum(), message);
if(!sheetErrors.htmlErrors.containsKey(sheetErrors.htmlErrorKey(cell.getSheetNum(), cell.getRowNum(), cell.getColNum())))
sheetErrors.putHtmlError(cell.getSheetNum(), cell.getRowNum(), cell.getColNum(), resPageMsg.getString("INVALID_FIELD"));
}
return sheetErrors.getErrors().size() == 0;
}
public static boolean isValidInstantOnChangeType(OnChangeSheetValidationCell cell) {
return cell.getOptionValue() != null && cell.getOptionValue().length()>0
&& InstantOnChangeType.isValidTypeByDescription(cell.getOptionValue());
}
public boolean isValidInstantOnChangeGroupPair(String oriName, String destName) {
if(!sheetValidationContainer.inRepeatingGroup(oriName)
&& !sheetValidationContainer.inRepeatingGroup(destName)) {
return true;
} else {
return sheetValidationContainer.inSameRepeatingGroup(oriName, destName);
}
}
public SheetErrors getSheetErrors() {
return sheetErrors;
}
public List<OnChangeSheetValidationCell> getCells() {
return cells;
}
public void setCells(List<OnChangeSheetValidationCell> cells) {
this.cells = cells;
}
public SheetValidationContainer getSheetValidationContainer() {
return sheetValidationContainer;
}
public void setSheetErrors(SheetErrors sheetErrors) {
this.sheetErrors = sheetErrors;
}
}