use of org.akaza.openclinica.bean.submit.CRFVersionBean in project OpenClinica by OpenClinica.
the class SpreadSheetTableClassic method toNewCRF.
public NewCRFBean toNewCRF(javax.sql.DataSource ds, ResourceBundle resPageMsg) throws IOException, CRFReadingException {
String dbName = SQLInitServlet.getDBName();
NewCRFBean ncrf = new NewCRFBean(ds, crfId);
// set crf id
ncrf.setCrfId(crfId);
StringBuffer buf = new StringBuffer();
HSSFWorkbook wb = new HSSFWorkbook(fs);
int numSheets = wb.getNumberOfSheets();
ArrayList queries = new ArrayList();
ArrayList errors = new ArrayList();
ArrayList repeats = new ArrayList();
HashMap tableNames = new HashMap();
HashMap items = new HashMap();
String pVersion = "";
String pVerDesc = "";
int parentId = 0;
// default is ST(String) type
int dataTypeId = 5;
HashMap itemCheck = ncrf.getItemNames();
HashMap GroupCheck = ncrf.getItemGroupNames();
HashMap openQueries = new LinkedHashMap();
// save all the item
HashMap backupItemQueries = new LinkedHashMap();
// queries if
// deleting item happens
// check for dupes, also
ArrayList secNames = new ArrayList();
// YW 1-30-2008
HashMap<String, String> allItems = new HashMap<String, String>();
ArrayList<String> itemGroupOids = new ArrayList<String>();
ArrayList<String> itemOids = new ArrayList<String>();
CRFDAO cdao = new CRFDAO(ds);
CRFBean crf = (CRFBean) cdao.findByPK(crfId);
ItemDataDAO iddao = new ItemDataDAO(ds);
ItemDAO idao = new ItemDAO(ds);
CRFVersionDAO cvdao = new CRFVersionDAO(ds);
ItemGroupDAO itemGroupDao = new ItemGroupDAO(ds);
int validSheetNum = 0;
for (int j = 0; j < numSheets; j++) {
// sheetIndex);
HSSFSheet sheet = wb.getSheetAt(j);
String sheetName = wb.getSheetName(j);
if (sheetName.equalsIgnoreCase("CRF") || sheetName.equalsIgnoreCase("Sections") || sheetName.equalsIgnoreCase("Items")) {
validSheetNum++;
}
}
if (validSheetNum != 3) {
// errors.add("The excel spreadsheet doesn't have required valid
// worksheets. Please check whether it contains" +
// " sheets of CRF, Sections and Items.");
errors.add(resPageMsg.getString("excel_not_have_valid_worksheet"));
}
// 7/30
for (int j = 0; j < numSheets; j++) {
// sheetIndex);
HSSFSheet sheet = wb.getSheetAt(j);
String sheetName = wb.getSheetName(j);
if (sheetName.equalsIgnoreCase("Instructions")) {
// totally ignore instructions
} else {
/*
* current strategem: build out the queries by hand and revisit
* this as part of the data loading module. We begin to check
* for errors here and look for blank cells where there should
* be data, tbh, 7/28
*/
int numRows = sheet.getPhysicalNumberOfRows();
int lastNumRow = sheet.getLastRowNum();
// logger.info("PhysicalNumberOfRows" +
// sheet.getPhysicalNumberOfRows());
logger.info("PhysicalNumberOfRows" + sheet.getPhysicalNumberOfRows());
// logger.info("LastRowNum()" + sheet.getLastRowNum());
String secName = "";
String page = "";
// records all the
ArrayList resNames = new ArrayList();
// response_labels
HashMap htmlErrors = new HashMap();
// the above two need to persist across mult. queries,
// and they should be created FIRST anyway, since instrument is
// first
// also need to add to VERSIONING_MAP, tbh, 6-6-3
// try to count how many blank rows, if 5 concective blank rows
// found, stop reading
int blankRowCount = 0;
if (sheetName.equalsIgnoreCase("Items")) {
logger.info("read an item in sheet" + sheetName);
Map labelWithType = new HashMap<String, String>();
// let's insert the default group first
ItemGroupBean defaultGroup = new ItemGroupBean();
defaultGroup.setName("Ungrouped");
defaultGroup.setCrfId(crfId);
defaultGroup.setStatus(Status.AVAILABLE);
// Create oid for Item Group
String defaultGroupOid = itemGroupDao.getValidOid(defaultGroup, crfName, defaultGroup.getName(), itemGroupOids);
itemGroupOids.add(defaultGroupOid);
String defaultSql = "";
if (dbName.equals("oracle")) {
defaultSql = "INSERT INTO ITEM_GROUP ( " + "name, crf_id, status_id, date_created ,owner_id,oc_oid)" + "VALUES ('" + defaultGroup.getName() + "', " + defaultGroup.getCrfId() + "," + defaultGroup.getStatus().getId() + "," + "sysdate," + ub.getId() + ",'" + defaultGroupOid + "')";
} else {
defaultSql = "INSERT INTO ITEM_GROUP ( " + "name, crf_id, status_id, date_created ,owner_id,oc_oid)" + "VALUES ('" + defaultGroup.getName() + "', " + defaultGroup.getCrfId() + "," + defaultGroup.getStatus().getId() + "," + "now()," + ub.getId() + ",'" + defaultGroupOid + "')";
}
if (!GroupCheck.containsKey("Ungrouped")) {
queries.add(defaultSql);
}
//Adding itemnames for further use
HashMap itemNames = new HashMap();
for (int k = 1; k < numRows; k++) {
HSSFCell cell = sheet.getRow(k).getCell((short) 0);
String itemName = getValue(cell);
itemName = itemName.replaceAll("<[^>]*>", "");
itemNames.put(k, itemName);
}
for (int k = 1; k < numRows; k++) {
// logger.info("hit row "+k);
if (blankRowCount == 5) {
logger.info("hit end of the row ");
break;
}
if (sheet.getRow(k) == null) {
blankRowCount++;
continue;
}
HSSFCell cell = sheet.getRow(k).getCell((short) 0);
String itemName = getValue(cell);
itemName = itemName.replaceAll("<[^>]*>", "");
// regexp to make sure it is all word characters, '\w+' in regexp terms
if (!Utils.isMatchingRegexp(itemName, "\\w+")) {
// different item error to go here
errors.add(resPageMsg.getString("item_name_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("you_can_only_use_letters_or_numbers"));
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("INVALID_FIELD"));
}
if (StringUtil.isBlank(itemName)) {
// errors.add("The ITEM_NAME column was blank at row
// " + k + ", Items worksheet.");
// htmlErrors.put(j + "," + k + ",0", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("item_name_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". ");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("required_field"));
}
if (itemName != null && itemName.length() > 255) {
errors.add(resPageMsg.getString("item_name_length_error"));
}
if (repeats.contains(itemName)) {
// errors.add("A duplicate ITEM_NAME of " + itemName
// + " was detected at row " + k
// + ", Items worksheet.");
// htmlErrors.put(j + "," + k + ",0", "DUPLICATE
// FIELD");
errors.add(resPageMsg.getString("duplicate") + " " + resPageMsg.getString("item_name_column") + " " + itemName + " " + resPageMsg.getString("was_detected_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("required_field"));
} else if (itemName.length() > 0) {
allItems.put(itemName, "Ungrouped");
}
repeats.add(itemName);
cell = sheet.getRow(k).getCell((short) 1);
String descLabel = getValue(cell);
descLabel = descLabel.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(descLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DESCRIPTION_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + "," + resPageMsg.getString("items_worksheet") + ".");
// errors.add("The DESCRIPTION_LABEL column was
// blank at row " + k + "," +
// resPageMsg.getString("items_worksheet") +".");
htmlErrors.put(j + "," + k + ",1", resPageMsg.getString("required_field"));
}
if (descLabel != null && descLabel.length() > 4000) {
errors.add(resPageMsg.getString("item_desc_length_error"));
}
cell = sheet.getRow(k).getCell((short) 2);
String leftItemText = getValue(cell);
if (leftItemText != null && leftItemText.length() > 4000) {
errors.add(resPageMsg.getString("left_item_length_error"));
}
// Commented out to resolve issue-2413
// if (StringUtil.isBlank(leftItemText)) {
// errors.add(resPageMsg.getString("the") + " " +
// resPageMsg.getString("LEFT_ITEM_TEXT_column") + " "
// + resPageMsg.getString("was_blank_at_row") + k + ","
// + resPageMsg.getString("items_worksheet") + ".");
// htmlErrors.put(j + "," + k + ",2",
// resPageMsg.getString("required_field"));
// }
cell = sheet.getRow(k).getCell((short) 3);
String unit = getValue(cell).trim();
if (unit != null && unit.length() > 0) {
String muSql = "";
if (this.existingUnits.size() > 0) {
} else {
this.existingUnits = this.measurementUnitDao.findAllNamesInUpperCase();
if (this.existingUnits == null) {
this.existingUnits = new TreeSet<String>();
}
}
if (this.existingOIDs.size() > 0) {
} else {
this.existingOIDs = this.measurementUnitDao.findAllOIDs();
if (this.existingOIDs == null) {
this.existingOIDs = new TreeSet<String>();
}
}
if (this.existingUnits.contains(unit.toUpperCase())) {
this.logger.error("unit=" + unit + " existed.");
} else {
String oid = "";
try {
oid = new MeasurementUnitOidGenerator().generateOidNoValidation(unit);
} catch (Exception e) {
throw new RuntimeException("CANNOT GENERATE OID");
}
if (this.existingOIDs.contains(oid)) {
if (oid.length() > 40) {
oid = oid.substring(0, 35);
}
oid = new MeasurementUnitOidGenerator().randomizeOid(oid);
}
this.existingOIDs.add(oid);
this.existingUnits.add(unit.toUpperCase());
muSql = this.getMUInsertSql(oid, unit, ub.getId(), dbName);
queries.add(muSql);
}
}
cell = sheet.getRow(k).getCell((short) 4);
String rightItemText = getValue(cell);
if (rightItemText != null && rightItemText.length() > 2000) {
errors.add(resPageMsg.getString("right_item_length_error"));
}
cell = sheet.getRow(k).getCell((short) 5);
if (cell != null) {
secName = getValue(cell);
secName = secName.replaceAll("<[^>]*>", "");
}
if (secName != null && secName.length() > 2000) {
errors.add(resPageMsg.getString("section_label_length_error"));
}
if (!secNames.contains(secName)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_LABEL_column") + " " + resPageMsg.getString("not_valid_section_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("check_to_see_that_there_is_valid_LABEL"));
htmlErrors.put(j + "," + k + ",5", resPageMsg.getString("NOT_A_VALID_LABEL"));
}
cell = sheet.getRow(k).getCell((short) 6);
String header = getValue(cell);
if (header != null && header.length() > 2000) {
errors.add(resPageMsg.getString("item_header_length_error"));
}
cell = sheet.getRow(k).getCell((short) 7);
String subHeader = getValue(cell);
if (subHeader != null && subHeader.length() > 240) {
errors.add(resPageMsg.getString("item_subheader_length_error"));
}
cell = sheet.getRow(k).getCell((short) 8);
String parentItem = getValue(cell);
parentItem = parentItem.replaceAll("<[^>]*>", "");
// Checking for a valid paren item name
if (!StringUtil.isBlank(parentItem)) {
if (!itemNames.containsValue(parentItem)) {
errors.add("the Parent item specified on row " + k + " does not exist in the CRF template. Please update the value. ");
}
}
// BWP>>Prevent parent names that equal the Item names
if (itemName != null && itemName.equalsIgnoreCase(parentItem)) {
parentItem = "";
}
cell = sheet.getRow(k).getCell((short) 9);
int columnNum = 0;
String column = getValue(cell);
if (!StringUtil.isBlank(column)) {
try {
columnNum = Integer.parseInt(column);
} catch (NumberFormatException ne) {
columnNum = 0;
}
}
cell = sheet.getRow(k).getCell((short) 10);
if (cell != null) {
page = getValue(cell);
}
cell = sheet.getRow(k).getCell((short) 11);
String questionNum = getValue(cell);
cell = sheet.getRow(k).getCell((short) 12);
String responseType = getValue(cell);
int responseTypeId = 1;
if (StringUtil.isBlank(responseType)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_TYPE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",12", resPageMsg.getString("required_field"));
} else {
if (!ResponseType.findByName(responseType.toLowerCase())) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_TYPE_column") + " " + resPageMsg.getString("was_invalid_at_row") + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",12", resPageMsg.getString("INVALID_FIELD"));
} else {
responseTypeId = ResponseType.getByName(responseType.toLowerCase()).getId();
}
}
cell = sheet.getRow(k).getCell((short) 13);
String responseLabel = getValue(cell);
// "");
if (StringUtil.isBlank(responseLabel) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId()) {
// << tbh #4180
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",13", resPageMsg.getString("required_field"));
} else if ("file".equalsIgnoreCase(responseType) && !"file".equalsIgnoreCase(responseLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_LABEL_column") + " " + resPageMsg.getString("should_be_file") + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",13", resPageMsg.getString("should_be_file"));
}
cell = sheet.getRow(k).getCell((short) 14);
String resOptions = getValue(cell);
// resOptions = resOptions.replaceAll("<[^>]*>", "");
if (responseLabel.equalsIgnoreCase("text") || responseLabel.equalsIgnoreCase("textarea")) {
resOptions = "text";
}
if ("file".equalsIgnoreCase(responseType)) {
resOptions = "file";
}
// YW 2-5-2008 << set default resOptions for calculation
// and group-calculation type
// if(responseTypeId==8 || responseTypeId==9) {
// resOptions = resOptions.length()>0 ? resOptions :
// "can not calculate";
// }
// YW >>
int numberOfOptions = 0;
if (!resNames.contains(responseLabel) && StringUtil.isBlank(resOptions) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId()) {
// << tbh #4180
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_OPTIONS_TEXT_column") + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",14", resPageMsg.getString("required_field"));
}
if (!resNames.contains(responseLabel) && !StringUtil.isBlank(resOptions)) {
// old template
if (responseTypeId == 8 || responseTypeId == 9) {
numberOfOptions = 1;
// YW >>
} else {
// String[] resArray = resOptions.split(",");
String text1 = resOptions.replaceAll("\\\\,", "##");
String[] resArray = text1.split(",");
numberOfOptions = resArray.length;
}
}
cell = sheet.getRow(k).getCell((short) 15);
String resValues = getValue(cell);
String value1 = resValues.replaceAll("\\\\,", "##");
String[] resValArray = value1.split(",");
if (responseLabel.equalsIgnoreCase("text") || responseLabel.equalsIgnoreCase("textarea")) {
resValues = "text";
}
if ("file".equalsIgnoreCase(responseType)) {
resValues = "file";
}
if (!resNames.contains(responseLabel) && StringUtil.isBlank(resValues) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId()) {
// << tbh, #4180, add textarea too?
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("required_field"));
}
// YW 1-25-2008 << validate scoring expression
if (responseTypeId == 8 || responseTypeId == 9) {
// func, it must be correctly spelled
if (resValues.contains(":")) {
String[] s = resValues.split(":");
if (!"func".equalsIgnoreCase(s[0].trim())) {
errors.add(resPageMsg.getString("expression_not_start_with_func_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". ");
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("INVALID_FIELD"));
}
}
String exp = resValues;
// make both \\, and , works for functions
exp = exp.replace("\\\\,", "##");
exp = exp.replace("##", ",");
exp = exp.replace(",", "\\\\,");
resValues = exp;
if (exp.startsWith("func:")) {
exp = exp.substring(5).trim();
}
exp = exp.replace("\\\\,", "##");
StringBuffer err = new StringBuffer();
ArrayList<String> variables = new ArrayList<String>();
ScoreValidator scoreValidator = new ScoreValidator(locale);
if (!scoreValidator.isValidExpression(exp, err, variables)) {
errors.add(resPageMsg.getString("expression_invalid_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ": " + err);
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("INVALID_FIELD"));
}
String group = "Ungrouped";
for (String v : variables) {
if (!allItems.containsKey(v)) {
errors.add(resPageMsg.getString("item") + v + resPageMsg.getString("must_listed_before_item") + itemName + resPageMsg.getString("item_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". ");
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("INVALID_FIELD"));
}
}
} else if (numberOfOptions > 0) {
// YW >>
if (resValArray.length != numberOfOptions) {
errors.add(resPageMsg.getString("incomplete_option_value_pair") + " " + resPageMsg.getString("RESPONSE_OPTIONS_column") + " " + resPageMsg.getString("and") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("at_row") + k + " " + resPageMsg.getString("items_worksheet") + "; " + resPageMsg.getString("perhaps_missing_comma"));
htmlErrors.put(j + ", " + k + ", 14", resPageMsg.getString("number_option_not_match"));
htmlErrors.put(j + ", " + k + ", 15", resPageMsg.getString("number_value_not_match"));
}
}
cell = sheet.getRow(k).getCell((short) 16);
String dataType = getValue(cell);
dataType = dataType.replaceAll("<[^>]*>", "");
String dataTypeIdString = "1";
if (StringUtil.isBlank(dataType)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet"));
htmlErrors.put(j + ", " + k + ", 16", resPageMsg.getString("required_field"));
} else {
if (!ItemDataType.findByName(dataType.toLowerCase())) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + ", " + k + ", 16", resPageMsg.getString("INVALID_FIELD"));
} else {
if ("file".equalsIgnoreCase(responseType) && !"FILE".equalsIgnoreCase(dataType)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("should_be_file") + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + ", " + k + ", 16", resPageMsg.getString("should_be_file"));
}
// dataTypeId =
// (ItemDataType.getByName(dataType)).getId();
dataTypeIdString = "(SELECT ITEM_DATA_TYPE_ID From ITEM_DATA_TYPE Where CODE='" + dataType.toUpperCase() + "')";
}
}
if (responseTypeId == 3 || responseTypeId == 5 || responseTypeId == 6 || responseTypeId == 7) {
// make sure same responseLabels have same datatype
if (labelWithType.containsKey(responseLabel)) {
logger.debug("in label=" + responseLabel);
if (!dataType.equalsIgnoreCase(labelWithType.get(responseLabel).toString())) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("does_not_match_the_item_data_type_with_the_same_response_label") + " " + k + ", " + resPageMsg.getString("items_worksheet"));
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("INVALID_FIELD"));
}
} else {
labelWithType.put(responseLabel, dataType);
// make sure response values matching datatype
if (resValArray.length > 0) {
boolean wrongType = false;
if ("int".equalsIgnoreCase(dataType)) {
for (String s : resValArray) {
String st = s != null && s.length() > 0 ? s.trim() : "";
if (st.length() > 0) {
try {
Integer I = Integer.parseInt(s.trim());
// but 2.3 is not integer
if (!I.toString().equals(s.trim())) {
wrongType = true;
}
} catch (Exception e) {
wrongType = true;
}
}
}
if (wrongType) {
wrongType = false;
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("should_be_integer") + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + ", " + k + ", 15", resPageMsg.getString("should_be_integer"));
}
} else if ("real".equalsIgnoreCase(dataType)) {
for (String s : resValArray) {
String st = s != null && s.length() > 0 ? s.trim() : "";
if (st.length() > 0) {
try {
Double I = Double.parseDouble(s.trim());
} catch (Exception e) {
wrongType = true;
}
}
}
if (wrongType) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("should_be_real") + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + ", " + k + ", 15", resPageMsg.getString("should_be_real"));
}
}
}
}
}
cell = sheet.getRow(k).getCell((short) 17);
String regexp = getValue(cell);
String regexp1 = "";
if (!StringUtil.isBlank(regexp)) {
// parse the string and get reg exp eg. regexp:
// /[0-9]*/
regexp1 = regexp.trim();
if (regexp1.startsWith("regexp:")) {
String finalRegexp = regexp1.substring(7).trim();
if (finalRegexp.contains("\\\\")) {
// \\ in the regular expression it should
// not be allowed
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + " " + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("regular_expression_contained") + " '\\\\', " + resPageMsg.getString("it_should_only_contain_one") + "'\\'. ");
htmlErrors.put(j + "," + k + ",17", resPageMsg.getString("INVALID_FIELD"));
} else {
if (finalRegexp.startsWith("/") && finalRegexp.endsWith("/")) {
finalRegexp = finalRegexp.substring(1, finalRegexp.length() - 1);
try {
Pattern p = Pattern.compile(finalRegexp);
// YW 11-21-2007 << add another \ if
// there is \ in regexp
char[] chars = regexp1.toCharArray();
regexp1 = "";
for (char c : chars) {
if (c == '\\' && !dbName.equals("oracle")) {
regexp1 += c + "\\";
} else {
regexp1 += c;
}
}
// YW >>
} catch (PatternSyntaxException pse) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("Example:") + " regexp: /[0-9]*/ ");
htmlErrors.put(j + "," + k + ",17", resPageMsg.getString("INVALID_FIELD"));
}
} else {
// errors.add("The VALIDATION column has
// an invalid regular expression at row
// " + k
// + ", Items worksheet. Example:
// regexp: /[0-9]*/ ");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + " " + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("Example") + " regexp: /[0-9]*/ ");
htmlErrors.put(j + "," + k + ",17", resPageMsg.getString("INVALID_FIELD"));
}
}
} else if (regexp1.startsWith("func:")) {
boolean isProperFunction = false;
try {
Validator.processCRFValidationFunction(regexp1);
isProperFunction = true;
} catch (Exception e) {
errors.add(e.getMessage() + ", " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". ");
htmlErrors.put(j + "," + k + ",17", resPageMsg.getString("INVALID_FIELD"));
}
} else {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". ");
htmlErrors.put(j + "," + k + ",17", resPageMsg.getString("INVALID_FIELD"));
}
}
cell = sheet.getRow(k).getCell((short) 18);
String regexpError = getValue(cell);
regexpError = regexpError.replaceAll("<[^>]*>", "");
if (!StringUtil.isBlank(regexp) && StringUtil.isBlank(regexpError)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_ERROR_MESSAGE_column") + resPageMsg.getString("was_blank_at_row") + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("cannot_be_blank_if_VALIDATION_not_blank"));
htmlErrors.put(j + "," + k + ",18", resPageMsg.getString("required_field"));
}
if (regexpError != null && regexpError.length() > 255) {
errors.add(resPageMsg.getString("regexp_errror_length_error"));
}
boolean phiBoolean = false;
cell = sheet.getRow(k).getCell((short) 19);
// String phi = getValue(cell);
String phi = "";
if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dphi = cell.getNumericCellValue();
if ((dphi - (int) dphi) * 1000 == 0) {
phi = (int) dphi + "";
}
}
if (!"0".equals(phi) && !"1".equals(phi)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("PHI_column") + resPageMsg.getString("was_invalid_at_row") + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("PHI_column") + " " + resPageMsg.getString("can_only_be_either_0_or_1"));
htmlErrors.put(j + "," + k + ",19", resPageMsg.getString("INVALID_VALUE"));
} else {
phiBoolean = "1".equals(phi) ? true : false;
}
boolean isRequired = false;
cell = sheet.getRow(k).getCell((short) 20);
String required = getValue(cell);
logger.info(getValue(cell));
// String required = "";
if (StringUtil.isBlank(required)) {
required = "0";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dr = cell.getNumericCellValue();
if ((dr - (int) dr) * 1000 == 0) {
required = (int) dr + "";
}
}
if (!"0".equals(required) && !"1".equals(required)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("REQUIRED_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ". " + resPageMsg.getString("REQUIRED_column") + resPageMsg.getString("can_only_be_either_0_or_1"));
htmlErrors.put(j + "," + k + ",20", resPageMsg.getString("INVALID_VALUE"));
} else {
isRequired = "1".equals(required) ? true : false;
}
// Create oid for Item Bean
String itemOid = idao.getValidOid(new ItemBean(), crfName, itemName, itemOids);
itemOids.add(itemOid);
// better spot for checking item might be right here,
// tbh 7-25
String vlSql = "";
if (dbName.equals("oracle")) {
vlSql = "INSERT INTO ITEM (NAME,DESCRIPTION,UNITS,PHI_STATUS," + "ITEM_DATA_TYPE_ID, ITEM_REFERENCE_TYPE_ID,STATUS_ID,OWNER_ID,DATE_CREATED,OC_OID) " + "VALUES ('" + stripQuotes(itemName) + "','" + stripQuotes(descLabel) + "','" + stripQuotes(unit) + "'," + (phiBoolean == true ? 1 : 0) + "," + dataTypeIdString + ",1,1," + ub.getId() + ", sysdate" + ",'" + itemOid + "')";
} else {
vlSql = "INSERT INTO ITEM (NAME,DESCRIPTION,UNITS,PHI_STATUS," + "ITEM_DATA_TYPE_ID, ITEM_REFERENCE_TYPE_ID,STATUS_ID,OWNER_ID,DATE_CREATED,OC_OID) " + "VALUES ('" + stripQuotes(itemName) + "','" + stripQuotes(descLabel) + "','" + stripQuotes(unit) + "'," + phiBoolean + "," + dataTypeIdString + ",1,1," + ub.getId() + ", NOW()" + ",'" + itemOid + "')";
}
backupItemQueries.put(itemName, vlSql);
// to compare items from DB later, if two items have the
// same name,
// but different units or phiStatus, they are different
ItemBean ib = new ItemBean();
ib.setName(itemName);
ib.setUnits(unit);
ib.setPhiStatus(phiBoolean);
ib.setDescription(descLabel);
ib.setDataType(ItemDataType.getByName(dataType.toLowerCase()));
// put metadata into item
ResponseSetBean rsb = new ResponseSetBean();
// notice that still "\\," in options - jxu-08-31-06
String resOptions1 = resOptions.replaceAll("\\\\,", "\\,");
String resValues1 = resValues.replaceAll("\\\\,", "\\,");
rsb.setOptions(stripQuotes(resOptions1), stripQuotes(resValues1));
ItemFormMetadataBean ifmb = new ItemFormMetadataBean();
ifmb.setResponseSet(rsb);
ib.setItemMeta(ifmb);
items.put(itemName, ib);
int ownerId = ub.getId();
if (!itemCheck.containsKey(itemName)) {
// item not in
// the DB
openQueries.put(itemName, vlSql);
} else {
// item in the DB
ItemBean oldItem = (ItemBean) idao.findByNameAndCRFId(itemName, crfId);
if (oldItem.getOwnerId() == ub.getId()) {
// update
if (!cvdao.hasItemData(oldItem.getId())) {
// no
// item
// data
String upSql = "";
if (dbName.equals("oracle")) {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "UNITS='" + stripQuotes(unit) + "'," + "PHI_STATUS=" + (phiBoolean ? 1 : 0) + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + " WHERE exists (SELECT versioning_map.item_id from versioning_map, crf_version where" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id= " + crfId + " AND item.item_id = versioning_map.item_id)" + " AND item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId;
} else {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "UNITS='" + stripQuotes(unit) + "'," + "PHI_STATUS=" + phiBoolean + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + " FROM versioning_map, crf_version" + " WHERE item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId + " AND item.item_id = versioning_map.item_id AND" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id = " + crfId;
}
// end of if dbname
openQueries.put(itemName, upSql);
} else {
String upSql = "";
if (dbName.equals("oracle")) {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "PHI_STATUS=" + (phiBoolean ? 1 : 0) + " WHERE exists (SELECT versioning_map.item_id from versioning_map, crf_version where" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id= " + crfId + " AND item.item_id = versioning_map.item_id)" + " AND item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId;
} else {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "PHI_STATUS=" + phiBoolean + " FROM versioning_map, crf_version" + " WHERE item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId + " AND item.item_id = versioning_map.item_id AND" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id = " + crfId;
}
// end of if dbName
openQueries.put(itemName, upSql);
}
} else {
ownerId = oldItem.getOwner().getId();
}
}
String sql = "";
if (dbName.equals("oracle")) {
// resOptions = resOptions.replaceAll("\\\\,",
// "\\,");
sql = "INSERT INTO RESPONSE_SET (LABEL, OPTIONS_TEXT, OPTIONS_VALUES, " + "RESPONSE_TYPE_ID, VERSION_ID)" + " VALUES ('" + stripQuotes(responseLabel) + "', '" + stripQuotes(resOptions.replaceAll("\\\\,", "\\,")) + "','" + stripQuotes(resValues.replace("\\\\", "\\")) + "'," + "(SELECT RESPONSE_TYPE_ID From RESPONSE_TYPE Where NAME='" + stripQuotes(responseType.toLowerCase()) + "')," + versionIdString + ")";
} else {
sql = "INSERT INTO RESPONSE_SET (LABEL, OPTIONS_TEXT, OPTIONS_VALUES, " + "RESPONSE_TYPE_ID, VERSION_ID)" + " VALUES ('" + stripQuotes(responseLabel) + "', E'" + stripQuotes(resOptions) + "', E'" + stripQuotes(resValues) + "'," + "(SELECT RESPONSE_TYPE_ID From RESPONSE_TYPE Where NAME='" + stripQuotes(responseType.toLowerCase()) + "')," + versionIdString + ")";
}
if (!resNames.contains(responseLabel)) {
queries.add(sql);
resNames.add(responseLabel);
// this will have to change since we have some data
// in the actual
// spreadsheet
// change it to caching response set names in a
// collection?
// or just delete the offending cells from the
// spreadsheet?
}
String parentItemString = "0";
if (!StringUtil.isBlank(parentItem)) {
if (dbName.equals("oracle")) {
parentItemString = "(SELECT MAX(ITEM_ID) FROM ITEM WHERE NAME='" + stripQuotes(parentItem) + "' AND owner_id = " + ownerId + " )";
} else {
parentItemString = "(SELECT ITEM_ID FROM ITEM WHERE NAME='" + stripQuotes(parentItem) + "' AND owner_id = " + ownerId + " ORDER BY OC_OID DESC LIMIT 1)";
}
}
String selectCorrectItemQueryPostgres = " (SELECT I.ITEM_ID FROM ITEM I LEFT OUTER JOIN ITEM_FORM_METADATA IFM ON I.ITEM_Id = IFM.ITEM_ID LEFT OUTER JOIN CRF_VERSION CV ON IFM.CRF_VERSION_ID = CV.CRF_VERSION_ID WHERE " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is null )" + " OR " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is not null AND CV.CRF_ID =" + crfId + " ) " + " ORDER BY I.OC_ID DESC LIMIT 1) ";
String selectCorrectItemQueryOracle = " (SELECT MAX(I.ITEM_ID) FROM ITEM I LEFT OUTER JOIN ITEM_FORM_METADATA IFM ON I.ITEM_Id = IFM.ITEM_ID LEFT OUTER JOIN CRF_VERSION CV ON IFM.CRF_VERSION_ID = CV.CRF_VERSION_ID WHERE " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is null )" + " OR " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is not null AND CV.CRF_ID =" + crfId + " )) ";
String sql2 = "";
if (dbName.equals("oracle")) {
sql2 = "INSERT INTO ITEM_FORM_METADATA (CRF_VERSION_ID, RESPONSE_SET_ID," + "ITEM_ID,SUBHEADER,header,LEFT_ITEM_TEXT," + "RIGHT_ITEM_TEXT,PARENT_ID,SECTION_ID,ORDINAL,PARENT_LABEL,COLUMN_NUMBER,PAGE_NUMBER_LABEL,question_number_label," + "REGEXP,REGEXP_ERROR_MSG,REQUIRED)" + " VALUES (" + versionIdString + ",(SELECT RESPONSE_SET_ID FROM RESPONSE_SET WHERE LABEL='" + stripQuotes(responseLabel) + "'" + " AND VERSION_ID=" + versionIdString + ")," + selectCorrectItemQueryOracle + ",'" + stripQuotes(subHeader) + "','" + stripQuotes(header) + "','" + stripQuotes(leftItemText) + "','" + stripQuotes(rightItemText) + "'," + parentItemString + ", (SELECT SECTION_ID FROM SECTION WHERE LABEL='" + secName + "' AND " + "CRF_VERSION_ID IN " + versionIdString + "), " + k + ",'" + parentItem + "'," + columnNum + ",'" + stripQuotes(page) + "','" + stripQuotes(questionNum) + "','" + stripQuotes(regexp1) + "','" + stripQuotes(regexpError) + "', " + (isRequired ? 1 : 0) + ")";
logger.warn(sql2);
} else {
sql2 = "INSERT INTO ITEM_FORM_METADATA (CRF_VERSION_ID, RESPONSE_SET_ID," + "ITEM_ID,SUBHEADER,HEADER,LEFT_ITEM_TEXT," + "RIGHT_ITEM_TEXT,PARENT_ID,SECTION_ID,ORDINAL,PARENT_LABEL,COLUMN_NUMBER,PAGE_NUMBER_LABEL,question_number_label," + "REGEXP,REGEXP_ERROR_MSG,REQUIRED)" + " VALUES (" + versionIdString + ",(SELECT RESPONSE_SET_ID FROM RESPONSE_SET WHERE LABEL='" + stripQuotes(responseLabel) + "'" + " AND VERSION_ID=" + versionIdString + ")," + selectCorrectItemQueryPostgres + ",'" + stripQuotes(subHeader) + "','" + stripQuotes(header) + "','" + stripQuotes(leftItemText) + "','" + stripQuotes(rightItemText) + "'," + parentItemString + ", (SELECT SECTION_ID FROM SECTION WHERE LABEL='" + secName + "' AND " + "CRF_VERSION_ID IN " + versionIdString + "), " + k + ",'" + parentItem + "'," + columnNum + ",'" + stripQuotes(page) + "','" + stripQuotes(questionNum) + "','" + stripQuotes(regexp1) + "','" + stripQuotes(regexpError) + "', " + isRequired + ")";
}
queries.add(sql2);
// link version with items now
String sql3 = "";
if (dbName.equals("oracle")) {
sql3 = "INSERT INTO VERSIONING_MAP (CRF_VERSION_ID, ITEM_ID) VALUES ( " + versionIdString + "," + selectCorrectItemQueryOracle + ")";
} else {
sql3 = "INSERT INTO VERSIONING_MAP (CRF_VERSION_ID, ITEM_ID) VALUES ( " + versionIdString + "," + selectCorrectItemQueryPostgres + ")";
}
queries.add(sql3);
// this item doesn't have group, so put it into
// 'Ungrouped' group
String sqlGroupLabel = "";
if (dbName.equals("oracle")) {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (" + "item_group_id,header," + "subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, borders) VALUES (" + "(SELECT MAX(ITEM_GROUP_ID) FROM ITEM_GROUP WHERE NAME='Ungrouped' AND crf_id = " + crfId + " ),'" + "" + "', '" + "" + "', '" + "" + "', " + 1 + ", " + 1 + ", '', 1," + versionIdString + "," + // + itemName + "' ),"
"(SELECT MAX(ITEM.ITEM_ID) FROM ITEM,ITEM_FORM_METADATA,CRF_VERSION WHERE ITEM.NAME='" + itemName + "' " + "AND ITEM.ITEM_ID = ITEM_FORM_METADATA.ITEM_ID and ITEM_FORM_METADATA.CRF_VERSION_ID=CRF_VERSION.CRF_VERSION_ID " + "AND CRF_VERSION.CRF_ID= " + crfId + " )," + k + ",0)";
} else {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (" + "item_group_id,HEADER," + "subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, borders) VALUES (" + "(SELECT ITEM_GROUP_ID FROM ITEM_GROUP WHERE NAME='Ungrouped' AND crf_id = " + crfId + " ORDER BY oc_oid DESC LIMIT 1),'" + "" + "', '" + "" + "', '" + "" + "', " + 1 + ", " + 1 + ", '', 1," + versionIdString + "," + // LIMIT 1),"
"(SELECT ITEM.ITEM_ID FROM ITEM,ITEM_FORM_METADATA,CRF_VERSION WHERE ITEM.NAME='" + itemName + "' " + "AND ITEM.ITEM_ID = ITEM_FORM_METADATA.ITEM_ID and ITEM_FORM_METADATA.CRF_VERSION_ID=CRF_VERSION.CRF_VERSION_ID " + "AND CRF_VERSION.CRF_ID= " + crfId + " ORDER BY ITEM.OC_OID DESC LIMIT 1)," + k + ",0)";
}
queries.add(sqlGroupLabel);
}
} else if (sheetName.equalsIgnoreCase("Sections")) {
logger.info("read sections");
// multiple rows, six cells, last one is number
for (int k = 1; k < numRows; k++) {
if (blankRowCount == 5) {
logger.info("hit end of the row ");
break;
}
if (sheet.getRow(k) == null) {
blankRowCount++;
continue;
}
HSSFCell cell = sheet.getRow(k).getCell((short) 0);
String secLabel = getValue(cell);
secLabel = secLabel.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(secLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + k + " " + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("required_field"));
}
if (secLabel != null && secLabel.length() > 2000) {
errors.add(resPageMsg.getString("section_label_length_error"));
}
if (secNames.contains(secLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_LABEL_column") + resPageMsg.getString("was_a_duplicate_of") + secLabel + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("DUPLICATE_FIELD"));
}
// logger.info("section name:" + secLabel + "row num:"
// +k);
secNames.add(secLabel);
cell = sheet.getRow(k).getCell((short) 1);
String title = getValue(cell);
title = title.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(title)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_TITLE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",1", resPageMsg.getString("required_field"));
}
if (title != null && title.length() > 2000) {
errors.add(resPageMsg.getString("section_title_length_error"));
}
cell = sheet.getRow(k).getCell((short) 2);
String subtitle = getValue(cell);
if (subtitle != null && subtitle.length() > 2000) {
errors.add(resPageMsg.getString("section_subtitle_length_error"));
}
cell = sheet.getRow(k).getCell((short) 3);
String instructions = getValue(cell);
if (instructions != null && instructions.length() > 2000) {
errors.add(resPageMsg.getString("section_instruction_length_error"));
}
cell = sheet.getRow(k).getCell((short) 4);
String pageNumber = getValue(cell);
if (pageNumber != null && pageNumber.length() > 5) {
errors.add(resPageMsg.getString("section_page_number_length_error"));
}
cell = sheet.getRow(k).getCell((short) 5);
String parentSection = getValue(cell);
parentSection = parentSection.replaceAll("<[^>]*>", "");
if (!StringUtil.isBlank(parentSection)) {
try {
parentId = Integer.parseInt(parentSection);
} catch (NumberFormatException ne) {
parentId = 0;
}
}
String sql = "";
if (dbName.equals("oracle")) {
sql = "INSERT INTO SECTION (CRF_VERSION_ID," + "STATUS_ID,LABEL, TITLE, INSTRUCTIONS, SUBTITLE, PAGE_NUMBER_LABEL," + "ORDINAL, PARENT_ID, OWNER_ID, DATE_CREATED) " + "VALUES (" + versionIdString + ",1,'" + secLabel + "','" + stripQuotes(title) + "', '" + stripQuotes(instructions) + "', '" + stripQuotes(subtitle) + "','" + pageNumber + "'," + k + "," + parentId + "," + ub.getId() + ",sysdate)";
} else {
sql = "INSERT INTO SECTION (CRF_VERSION_ID," + "STATUS_ID,LABEL, TITLE, INSTRUCTIONS, SUBTITLE, PAGE_NUMBER_LABEL," + "ORDINAL, PARENT_ID, OWNER_ID, DATE_CREATED) " + "VALUES (" + versionIdString + ",1,'" + secLabel + "','" + stripQuotes(title) + "', '" + stripQuotes(instructions) + "', '" + stripQuotes(subtitle) + "','" + pageNumber + "'," + k + "," + parentId + "," + ub.getId() + ",NOW())";
}
queries.add(sql);
}
// end for loop
} else if (sheetName.equalsIgnoreCase("CRF")) {
logger.info("read crf");
// one row, four cells, all strings
if (sheet == null || sheet.getRow(1) == null || sheet.getRow(1).getCell((short) 0) == null) {
throw new CRFReadingException("Blank row found in sheet CRF.");
}
HSSFCell cell = sheet.getRow(1).getCell((short) 0);
crfName = getValue(cell);
crfName = crfName.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(crfName)) {
// resPageMsg.getString("required_field"));
throw new CRFReadingException("The CRF_NAME column was blank in the CRF worksheet.");
}
if (crfName.length() > 255) {
errors.add(resPageMsg.getString("crf_name_length_error"));
}
CRFBean existingCRFWithSameName = (CRFBean) cdao.findByName(crfName);
if (this.getCrfId() == 0) {
if (existingCRFWithSameName.getName() != null && existingCRFWithSameName.getName().equals(crfName)) {
errors.add(resPageMsg.getString("crf_name_already_used"));
}
}
// TODO Why the following codes are commented out? -jxu
// try {
// CRFBean checkName = (CRFBean) cdao.findByPK(crfId);
// if (!checkName.getName().equals(crfName)) {
// logger.info("crf name is mismatch");
// errors.add(resPageMsg.getString("the") + " " +
// resPageMsg.getString("CRF_NAME_column") +
// resPageMsg.getString("did_not_match_crf_version") + " '"
// + checkName.getName()
// + "' " + resPageMsg.getString("before_you_continue"));
// htmlErrors.put(j + ",1,0",
// resPageMsg.getString("DID_NOT_MATCH_CRF"));
// }
// } catch (Exception pe) {
// logger.warn("Exception happened when check CRF name" +
// pe.getMessage());
// }
cell = sheet.getRow(1).getCell((short) 1);
String version = getValue(cell);
version = version.replaceAll("<[^>]*>", "");
ncrf.setVersionName(version);
if (version != null && version.length() > 255) {
errors.add(resPageMsg.getString("version_length_error"));
}
// YW, 08-22-2007, since versionName is now obtained from
// spreadsheet,
// blank check has been moved to
// CreateCRFVersionServlet.java
// and mismatch check is not necessary
// if (StringUtil.isBlank(version)) {
// errors.add("The VERSION column was blank in the CRF
// worksheet.");
// htmlErrors.put(j + ",1,1", "REQUIRED FIELD");
// }else if (!version.equals(versionName)) {
// errors.add("The VERSION column did not match the intended
// version name "
// + "you want to upload. Make sure this reads '" +
// versionName
// + "' before you continue.");
// htmlErrors.put(j + ",1,1", "DID NOT MATCH VERSION");
// }
cell = sheet.getRow(1).getCell((short) 2);
String versionDesc = getValue(cell);
versionDesc = versionDesc.replaceAll("<[^>]*>", "");
if (versionDesc != null && versionDesc.length() > 4000) {
errors.add(resPageMsg.getString("version_description_length_error"));
}
cell = sheet.getRow(1).getCell((short) 3);
String revisionNotes = getValue(cell);
revisionNotes = revisionNotes.replaceAll("<[^>]*>", "");
if (revisionNotes != null && revisionNotes.length() > 255) {
errors.add(resPageMsg.getString("revision_notes_length_error"));
}
if (StringUtil.isBlank(revisionNotes)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("REVISION_NOTES_column") + " " + resPageMsg.getString("was_blank_in_the_CRF_worksheet"));
htmlErrors.put(j + ",1,3", resPageMsg.getString("required_field"));
}
// Generating query string for the new CRF
Connection con = null;
String crfOid = null;
if (crfId == 0) {
crfOid = cdao.getValidOid(new CRFBean(), crfName);
int nextCRFId;
try {
con = ds.getConnection();
CoreResources.setSchema(con);
/*
* We are selecting the crf id which will be used to
* save the new CRF. Selecting the crf id in advance
* will not cause any problem in a multi threaded
* environment because the nextVal() method always
* returns unique values. So there is no chance of
* processing two CRF simultaneously with same crf
* id.
*/
ResultSet nextIdRs;
if (dbName.equals("oracle")) {
nextIdRs = con.createStatement().executeQuery("select crf_id_seq.nextval from dual");
} else {
nextIdRs = con.createStatement().executeQuery("select nextval('crf_crf_id_seq')");
}
nextIdRs.next();
nextCRFId = nextIdRs.getInt(1);
crfId = nextCRFId;
ncrf.setCrfId(crfId);
String createCRFSql = "";
if (dbName.equals("oracle")) {
createCRFSql = "INSERT INTO CRF (CRF_ID, STATUS_ID, NAME, DESCRIPTION, OWNER_ID, DATE_CREATED, OC_OID, SOURCE_STUDY_ID) VALUES (" + crfId + ", 1,'" + stripQuotes(crfName) + "','" + stripQuotes(versionDesc) + "'," + ub.getId() + ",sysdate" + ",'" + crfOid + "'," + studyId + ")";
} else {
createCRFSql = "INSERT INTO CRF (CRF_ID, STATUS_ID, NAME, DESCRIPTION, OWNER_ID, DATE_CREATED, OC_OID, SOURCE_STUDY_ID) VALUES (" + crfId + ", 1,'" + stripQuotes(crfName) + "','" + stripQuotes(versionDesc) + "'," + ub.getId() + ",NOW()" + ",'" + crfOid + "'," + studyId + ")";
}
queries.add(createCRFSql);
} catch (SQLException e) {
logger.warn("Exception encountered with query select nextval('crf_crf_id_seq'), Message-" + e.getMessage());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.warn("Connectin can't be closed");
}
}
}
}
// check for instrument existence here??? tbh 7/28
// engaging in new validation, tbh, 6-4-04
// modify nib.getinstversions to look for version name and
// description
// need to stop uploads of same name-description pairs
HashMap checkCRFVersions = ncrf.getCrfVersions();
// this now returns a hash map of key:version_name
// ->value:version_description
boolean overwrite = false;
if (checkCRFVersions.containsKey(version)) {
logger.info("found a matching version name..." + version);
errors.add(resPageMsg.getString("version_not_unique_cause_confusion"));
htmlErrors.put(j + ",1,2", resPageMsg.getString("NOT_UNIQUE"));
}
// Create oid for Crf Version
String oid;
if (crfOid != null) {
oid = cvdao.getValidOid(new CRFVersionBean(), crfOid, version);
} else {
CRFBean crfBean = (CRFBean) cdao.findByName(crfName);
oid = cvdao.getValidOid(new CRFVersionBean(), crfBean.getOid(), version);
}
String sql = "";
if (dbName.equals("oracle")) {
logger.warn("TEST 2");
if (crfId == 0) {
sql = "INSERT INTO CRF_VERSION (NAME, DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + stripQuotes(version) + "','" + stripQuotes(versionDesc) + "'," + "(SELECT CRF_ID FROM CRF WHERE NAME='" + crfName + "'),1,sysdate," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
} else {
sql = "INSERT INTO CRF_VERSION (NAME,DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + version + "','" + stripQuotes(versionDesc) + "'," + crfId + ",1,sysdate," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
}
} else {
if (crfId == 0) {
sql = "INSERT INTO CRF_VERSION (NAME, DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + stripQuotes(version) + "','" + stripQuotes(versionDesc) + "'," + "(SELECT CRF_ID FROM CRF WHERE NAME='" + crfName + "'),1,NOW()," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
} else {
sql = "INSERT INTO CRF_VERSION (NAME,DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + version + "','" + stripQuotes(versionDesc) + "'," + crfId + ",1,NOW()," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
}
}
queries.add(sql);
for (int i = 0; i < queries.size(); i++) {
String s = (String) queries.get(i);
logger.info("====================" + s);
}
pVersion = version;
pVerDesc = versionDesc;
}
versionIdString = "(SELECT CRF_VERSION_ID FROM CRF_VERSION WHERE NAME ='" + pVersion + "' AND CRF_ID=" + crfId + ")";
// move html creation to here, include error creation as well,
// tbh 7/28
buf.append(sheetName + "<br>");
buf.append("<div class=\"box_T\"><div class=\"box_L\"><div class=\"box_R\"><div class=\"box_B\"><div class=\"box_TL\"><div class=\"box_TR\"><div class=\"box_BL\"><div class=\"box_BR\">");
buf.append("<div class=\"textbox_center\">");
buf.append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"");
buf.append("caption=\"" + wb.getSheetName(j) + "\"" + ">");
for (int i = 0; i < numRows; i++) {
buf.append("<tr>");
if (sheet.getRow(i) == null) {
continue;
}
int numCells = sheet.getRow(i).getLastCellNum();
for (int y = 0; y < numCells; y++) {
HSSFCell cell = sheet.getRow(i).getCell((short) y);
int cellType = 0;
String error = " ";
String errorKey = j + "," + i + "," + y;
if (htmlErrors.containsKey(errorKey)) {
error = "<span class=\"alert\">" + htmlErrors.get(errorKey) + "</span>";
}
if (cell == null) {
cellType = HSSFCell.CELL_TYPE_BLANK;
} else {
cellType = cell.getCellType();
}
switch(cellType) {
case HSSFCell.CELL_TYPE_BLANK:
buf.append("<td class=\"table_cell\">" + error + "</td>");
break;
case HSSFCell.CELL_TYPE_NUMERIC:
buf.append("<td class=\"table_cell\">" + cell.getNumericCellValue() + " " + error + "</td>");
break;
case HSSFCell.CELL_TYPE_STRING:
buf.append("<td class=\"table_cell\">" + cell.getStringCellValue() + " " + error + "</td>");
break;
default:
buf.append("<td class=\"table_cell\">" + error + "</td>");
}
}
buf.append("</tr>");
}
buf.append("</table>");
buf.append("<br></div>");
buf.append("</div></div></div></div></div></div></div></div>");
buf.append("</div><br>");
}
// end of the else sheet loop
}
// end of the for loop for sheets
ncrf.setQueries(queries);
ncrf.setItemQueries(openQueries);
ncrf.setBackupItemQueries(backupItemQueries);
ncrf.setItems(items);
if (!errors.isEmpty()) {
ncrf.setErrors(errors);
}
// logger.info("html table:" + buf.toString());
ncrf.setHtmlTable(buf.toString());
return ncrf;
}
use of org.akaza.openclinica.bean.submit.CRFVersionBean in project OpenClinica by OpenClinica.
the class SpreadSheetTableRepeating method toNewCRF.
public NewCRFBean toNewCRF(javax.sql.DataSource ds, ResourceBundle resPageMsg) throws IOException, CRFReadingException {
String dbName = SQLInitServlet.getDBName();
NewCRFBean ncrf = new NewCRFBean(ds, crfId);
// set crf id
ncrf.setCrfId(crfId);
StringBuffer buf = new StringBuffer();
HSSFWorkbook wb = new HSSFWorkbook(fs);
int numSheets = wb.getNumberOfSheets();
ArrayList queries = new ArrayList();
// ArrayList groupItemMapQueries = new ArrayList();
ArrayList errors = new ArrayList();
// ArrayList repeats = new ArrayList();
HashMap tableNames = new HashMap();
HashMap items = new HashMap();
SpreadSheetItemUtil item_from_row = null;
String pVersion = "";
String pVerDesc = "";
int parentId = 0;
// default is ST(String) type
int dataTypeId = 5;
HashMap itemCheck = ncrf.getItemNames();
HashMap GroupCheck = ncrf.getItemGroupNames();
HashMap openQueries = new LinkedHashMap();
// save all the item
HashMap backupItemQueries = new LinkedHashMap();
// queries if
// deleting item happens
// check for dupes, also
ArrayList secNames = new ArrayList();
ArrayList<String> itemGroupOids = new ArrayList<String>();
ArrayList<String> itemOids = new ArrayList<String>();
CRFDAO cdao = new CRFDAO(ds);
CRFBean crf = (CRFBean) cdao.findByPK(crfId);
ItemDAO idao = new ItemDAO(ds);
CRFVersionDAO cvdao = new CRFVersionDAO(ds);
ItemGroupDAO itemGroupDao = new ItemGroupDAO(ds);
SheetValidationContainer sheetContainer = new SheetValidationContainer();
HashMap<String, String> allItems = (HashMap<String, String>) sheetContainer.getAllItems();
//HashMap<String, String> allItems = new HashMap<String, String>();
Map<String, String[]> controlValues = new HashMap<String, String[]>();
int maxItemFormMetadataId = new ItemFormMetadataDAO(ds).findMaxId();
OnChangeSheetValidator instantValidator = new OnChangeSheetValidator(sheetContainer, resPageMsg);
int validSheetNum = 0;
for (int j = 0; j < numSheets; j++) {
// sheetIndex);
HSSFSheet sheet = wb.getSheetAt(j);
String sheetName = wb.getSheetName(j);
if (sheetName.equalsIgnoreCase("CRF") || sheetName.equalsIgnoreCase("Sections") || sheetName.equalsIgnoreCase("Items")) {
validSheetNum++;
}
}
if (validSheetNum != 3) {
errors.add("The excel spreadsheet doesn't have required valid worksheets. Please check whether it contains" + " sheets of CRF, Sections and Items.");
}
HSSFSheet sheet = wb.getSheetAt(4);
HSSFCell insCell = sheet.getRow(1).getCell((short) 0);
String versionNo = insCell.toString();
// 7/30
for (int j = 0; j < numSheets; j++) {
// sheetIndex);
sheet = wb.getSheetAt(j);
String sheetName = wb.getSheetName(j);
if (sheetName.equalsIgnoreCase("Instructions")) {
// totally ignore instructions
} else {
/*
* current strategem: build out the queries by hand and revisit
* this as part of the data loading module. We begin to check
* for errors here and look for blank cells where there should
* be data, tbh, 7/28
*/
int numRows = sheet.getPhysicalNumberOfRows();
int lastNumRow = sheet.getLastRowNum();
// logger.debug("PhysicalNumberOfRows" +
// sheet.getPhysicalNumberOfRows());
// great minds apparently think alike...tbh, commented out
// 06/19/2007
// logger.debug("LastRowNum()" + sheet.getLastRowNum());
String secName = "";
String page = "";
// YW << for holding "responseLabel_responseType"
ArrayList resPairs = new ArrayList();
// YW >>
// records all the
ArrayList resNames = new ArrayList();
// response_labels
HashMap htmlErrors = new HashMap();
// the above two need to persist across mult. queries,
// and they should be created FIRST anyway, since instrument is
// first
// also need to add to VERSIONING_MAP, tbh, 6-6-3
// try to count how many blank rows, if 5 concective blank rows
// found, stop reading
int blankRowCount = 0;
String itemName = null;
String default_value = null;
if (sheetName.equalsIgnoreCase("Items")) {
logger.debug("read an item in sheet" + sheetName);
Map labelWithOptions = new HashMap();
Map labelWithValues = new HashMap();
Map labelWithType = new HashMap<String, String>();
logger.debug("row20 is: " + getValue(sheet.getRow(0).getCell((short) 20)));
boolean hasWDColumn = "width_decimal".equalsIgnoreCase(getValue(sheet.getRow(0).getCell((short) 20))) ? true : false;
//Adding itemnames for further use
// HashMap itemNames = new HashMap();
//htaycher : code should be competly refactored to use stucture to hold all data per row
ArrayList<SpreadSheetItemUtil> row_items = new ArrayList<SpreadSheetItemUtil>();
for (int k = 1; k < numRows; k++) {
if (sheet.getRow(k) == null) {
blankRowCount++;
if (blankRowCount == 5) {
break;
}
continue;
}
int cellIndex = 0;
HSSFCell cell = sheet.getRow(k).getCell((short) 0);
item_from_row = new SpreadSheetItemUtil();
row_items.add(item_from_row);
item_from_row.setItemName(getValue(cell));
item_from_row.verifyItemName(row_items, errors, htmlErrors, j, resPageMsg);
itemName = item_from_row.getItemName();
//}
cell = sheet.getRow(k).getCell((short) 1);
String descLabel = getValue(cell);
descLabel = descLabel.replaceAll("<[^>]*>", "");
item_from_row.setDescriptionLabel(descLabel);
if (StringUtil.isBlank(descLabel)) {
// errors.add("The DESCRIPTION_LABEL column was
// blank at row " + k + ", Items worksheet.");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DESCRIPTION_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",1", resPageMsg.getString("required_field"));
}
if (descLabel != null && descLabel.length() > 4000) {
errors.add(resPageMsg.getString("item_desc_length_error"));
}
cell = sheet.getRow(k).getCell((short) 2);
String leftItemText = getValue(cell);
if (leftItemText != null && leftItemText.length() > 4000) {
errors.add(resPageMsg.getString("left_item_length_error"));
}
item_from_row.setLeftItemText(leftItemText);
// Commented out to resolve issue-2413
// if (StringUtil.isBlank(leftItemText)) {
// errors.add(resPageMsg.getString("the") + " " +
// resPageMsg.getString("LEFT_ITEM_TEXT_column") + " "
// + resPageMsg.getString("was_blank_at_row") + k + ","
// + resPageMsg.getString("items_worksheet") + ".");
// htmlErrors.put(j + "," + k + ",2",
// resPageMsg.getString("required_field"));
// }
cell = sheet.getRow(k).getCell((short) 3);
String unit = getValue(cell).trim();
if (unit != null && unit.length() > 0) {
String muSql = "";
//htaycher max length=64
if (unit.length() > 64) {
errors.add(resPageMsg.getString("units_length_error"));
htmlErrors.put(j + "," + k + "," + CrfTemplateColumnNameEnum.UNITS.getCellNumber(), resPageMsg.getString("INVALID_FIELD"));
}
if (this.existingUnits.size() > 0) {
} else {
this.existingUnits = this.measurementUnitDao.findAllNames();
if (this.existingUnits == null) {
this.existingUnits = new TreeSet<String>();
}
}
if (this.existingOIDs.size() > 0) {
} else {
this.existingOIDs = this.measurementUnitDao.findAllOIDs();
if (this.existingOIDs == null) {
this.existingOIDs = new TreeSet<String>();
}
}
if (this.existingUnits.contains(unit)) {
this.logger.debug("unit=" + unit + " existed.");
} else {
String oid = "";
try {
oid = new MeasurementUnitOidGenerator().generateOid(unit);
} catch (Exception e) {
throw new RuntimeException("CANNOT GENERATE OID");
}
if (this.existingOIDs.contains(oid)) {
if (oid.length() > 40) {
oid = oid.substring(0, 35);
}
oid = new MeasurementUnitOidGenerator().randomizeOid(oid);
}
this.existingOIDs.add(oid);
this.existingUnits.add(unit);
muSql = this.getMUInsertSql(oid, unit, ub.getId(), dbName);
queries.add(muSql);
}
}
cell = sheet.getRow(k).getCell((short) 4);
String rightItemText = getValue(cell);
if (rightItemText != null && rightItemText.length() > 2000) {
errors.add(resPageMsg.getString("right_item_length_error"));
}
//section label
cell = sheet.getRow(k).getCell((short) 5);
item_from_row.setSectionLabel(getValue(cell));
item_from_row.verifySectionLabel(row_items, errors, secNames, htmlErrors, j, resPageMsg);
secName = item_from_row.getSectionLabel();
// *******************************************
// group_label will go here, tbh in place 6
// have to advance all the rest by one at least (if
// there are
// no other columns) tbh, 5-14-2007
//group label
cell = sheet.getRow(k).getCell((short) 6);
item_from_row.setGroupLabel(getValue(cell));
//is it a reason for 13816
if (item_from_row.getItemName().length() > 0) {
if (!StringUtil.isBlank(item_from_row.getGroupLabel())) {
allItems.put(item_from_row.getItemName(), item_from_row.getGroupLabel());
} else {
allItems.put(item_from_row.getItemName(), "Ungrouped");
}
}
String groupLabel = item_from_row.getGroupLabel();
sheetContainer.getItemSectionNameMap().put(itemName, secName);
sheetContainer.collectRepGrpItemNameMap(itemName, item_from_row.getGroupLabel());
//header
cell = sheet.getRow(k).getCell((short) 7);
String header = getValue(cell);
if (header != null && header.length() > 2000) {
errors.add(resPageMsg.getString("item_header_length_error"));
}
//subheader
cell = sheet.getRow(k).getCell((short) 8);
String subHeader = getValue(cell);
if (subHeader != null && subHeader.length() > 240) {
errors.add(resPageMsg.getString("item_subheader_length_error"));
htmlErrors.put(j + "," + k + "," + CrfTemplateColumnNameEnum.SUBHEADER.getCellNumber(), resPageMsg.getString("INVALID_FIELD"));
}
//parentid
cell = sheet.getRow(k).getCell((short) 9);
String parentItem = getValue(cell);
item_from_row.setParentItem(parentItem);
item_from_row.verifyParentID(row_items, errors, htmlErrors, j, resPageMsg, itemGroups);
//for now , when(if ) code refactoring will be done, item will be written by SpreadSheetItemUtil
parentItem = item_from_row.getParentItem();
//column id
cell = sheet.getRow(k).getCell((short) 10);
int columnNum = 0;
String column = getValue(cell);
if (!StringUtil.isBlank(column)) {
try {
columnNum = Integer.parseInt(column);
} catch (NumberFormatException ne) {
columnNum = 0;
}
}
//page number
cell = sheet.getRow(k).getCell((short) 11);
if (cell != null) {
page = getValue(cell);
}
//question number
cell = sheet.getRow(k).getCell((short) 12);
String questionNum = getValue(cell);
//response type
cell = sheet.getRow(k).getCell((short) 13);
String responseType = getValue(cell);
int responseTypeId = 1;
if (StringUtil.isBlank(responseType)) {
// errors.add("The RESPONSE_TYPE column was blank at
// row " + k + ", items worksheet.");
// htmlErrors.put(j + "," + k + ",13", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_TYPE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",13", resPageMsg.getString("required_field"));
} else {
if (!ResponseType.findByName(responseType.toLowerCase())) {
// errors.add("The RESPONSE_TYPE column was
// invalid at row " + k
// + ", items worksheet.");
// htmlErrors.put(j + "," + k + ",13", "INVALID
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_TYPE_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",13", resPageMsg.getString("INVALID_FIELD"));
} else {
responseTypeId = ResponseType.getByName(responseType.toLowerCase()).getId();
item_from_row.setResponseTypeId(responseTypeId);
}
if (responseTypeId == 5) {
cell = sheet.getRow(k).getCell((short) 18);
String def = getValue(cell);
if (!StringUtil.isBlank(def)) {
errors.add(resPageMsg.getString("radio_with_default") + item_from_row.getItemName() + resPageMsg.getString("change_radio"));
htmlErrors.put(j + "," + k + "," + CrfTemplateColumnNameEnum.DEFAULT_VALUE.getCellNumber(), resPageMsg.getString("INVALID_FIELD"));
}
} else if (responseTypeId == ResponseType.INSTANT_CALCULATION.getId()) {
unit = "";
}
}
cell = sheet.getRow(k).getCell((short) 14);
String responseLabel = getValue(cell);
if (StringUtil.isBlank(responseLabel) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId()) {
// << tbh #4180
// errors.add("The RESPONSE_LABEL column was blank
// at row " + k + ", items worksheet.");
// htmlErrors.put(j + "," + k + ",14", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",14", resPageMsg.getString("required_field"));
} else if ("file".equalsIgnoreCase(responseType) && !"file".equalsIgnoreCase(responseLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_LABEL_column") + " " + resPageMsg.getString("should_be_file") + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",14", resPageMsg.getString("should_be_file"));
}
cell = sheet.getRow(k).getCell((short) 15);
String resOptions = getValue(cell);
// >> tbh #4180, we cant have blanks since they will trip us up later in the process
if (responseTypeId == ResponseType.TEXT.getId()) {
responseLabel = "text";
} else if (responseTypeId == ResponseType.TEXTAREA.getId()) {
responseLabel = "textarea";
}
// << tbh
if (responseLabel.equalsIgnoreCase("text") || responseLabel.equalsIgnoreCase("textarea")) {
resOptions = "text";
} else if ("file".equalsIgnoreCase(responseType)) {
resOptions = "file";
}
int numberOfOptions = 0;
if (!resNames.contains(responseLabel) && StringUtil.isBlank(resOptions) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId()) {
// << tbh #4180
// errors.add("The RESPONSE_OPTIONS_TEXT column was
// blank at row " + k
// + ", Items worksheet.");
// htmlErrors.put(j + "," + k + ",15", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_OPTIONS_TEXT_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("required_field"));
}
if (!resNames.contains(responseLabel) && !StringUtil.isBlank(resOptions)) {
if (responseTypeId == 8 || responseTypeId == 9) {
// YW 1-29-2008 << only one option for
// "calculation" type and "group-calculation"
// type
// but do we really need this variable these two
// types?
numberOfOptions = 1;
// YW >>
} else {
// String[] resArray = resOptions.split(",");
String text1 = resOptions.replaceAll("\\\\,", "##");
String[] resArray = text1.split(",");
numberOfOptions = resArray.length;
}
}
/**
* The application will show error on page if two
* identical RESPONSE_LABEL has different
* RESPONSE_OPTIONS_TEXT
*/
String[] mapResArray = (String[]) labelWithOptions.get(responseLabel);
String text1 = resOptions.replaceAll("\\\\,", "##");
String[] resArray = text1.split(",");
item_from_row.setResponseOptions(resArray);
logger.debug(item_from_row.getItemName());
if (labelWithOptions.containsKey(responseLabel)) {
if (!StringUtil.isBlank(resOptions)) {
for (int i = 0; i < resArray.length; i++) {
if (!resArray[i].equals(mapResArray[i])) {
errors.add(resPageMsg.getString("resp_label_with_different_resp_options") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("resp_label_with_different_resp_options_html_error"));
break;
}
}
}
} else {
labelWithOptions.put(responseLabel, resArray);
}
cell = sheet.getRow(k).getCell((short) 16);
String resValues = getValue(cell);
if (responseLabel.equalsIgnoreCase("text") || responseLabel.equalsIgnoreCase("textarea")) {
resValues = "text";
} else if ("file".equalsIgnoreCase(responseType)) {
resValues = "file";
}
if (!resNames.contains(responseLabel) && StringUtil.isBlank(resValues) && responseTypeId != ResponseType.TEXT.getId() && responseTypeId != ResponseType.TEXTAREA.getId() && responseTypeId != ResponseType.INSTANT_CALCULATION.getId()) {
// << tbh #4180
// errors.add("The RESPONSE_VALUES column was blank
// at row " + k + ", Items worksheet.");
// htmlErrors.put(j + "," + k + ",16", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + ", " + k + ",16", resPageMsg.getString("required_field"));
}
// YW 1-25-2008 << validate scoring expression
if (responseTypeId == ResponseType.CALCULATION.getId() || responseTypeId == ResponseType.GROUP_CALCULATION.getId()) {
// func, it must be correctly spelled
if (resValues.contains(":")) {
String[] s = resValues.split(":");
if (!"func".equalsIgnoreCase(s[0].trim())) {
errors.add(resPageMsg.getString("expression_not_start_with_func_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("INVALID_FIELD"));
}
}
String exp = resValues;
// make both \\, and , works for functions
exp = exp.replace("\\\\,", "##");
exp = exp.replace("##", ",");
exp = exp.replace(",", "\\\\,");
resValues = exp;
if (exp.startsWith("func:")) {
exp = exp.substring(5).trim();
}
exp = exp.replace("\\\\,", "##");
StringBuffer err = new StringBuffer();
ArrayList<String> variables = new ArrayList<String>();
ScoreValidator scoreValidator = new ScoreValidator(locale);
if (!scoreValidator.isValidExpression(exp, err, variables)) {
errors.add(resPageMsg.getString("expression_invalid_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ": " + err);
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("INVALID_FIELD"));
}
if (exp.startsWith("getexternalvalue") || exp.startsWith("getExternalValue")) {
// do a different set of validations here, tbh
} else {
String group = groupLabel.length() > 0 ? groupLabel : "Ungrouped";
for (String v : variables) {
if (!allItems.containsKey(v)) {
errors.add("Item '" + v + "' must be listed before the item '" + itemName + "' at row " + k + ", items worksheet. ");
htmlErrors.put(j + "," + k + ",16", "INVALID FIELD");
} else {
if (responseTypeId == 8 && !allItems.get(v).equalsIgnoreCase(group)) {
errors.add("Item '" + v + "' and item '" + itemName + "' must have a same GROUP_LABEL at row " + k + ", items worksheet. ");
htmlErrors.put(j + "," + k + ",16", "INVALID FIELD");
} else if (responseTypeId == 9) {
String g = allItems.get(v);
if (!g.equalsIgnoreCase("ungrouped") && g.equalsIgnoreCase(group)) {
errors.add("Item '" + v + "' and item '" + itemName + "' should not have a same GROUP_LABEL at row " + k + ", items worksheet. ");
htmlErrors.put(j + "," + k + ",16", "INVALID FIELD");
}
}
}
}
}
} else if ("instant-calculation".equalsIgnoreCase(responseType)) {
OnChangeSheetValidationCell onchangecell = new OnChangeSheetValidationCell(OnChangeSheetValidationType.ALL, new SheetCell.Builder().rowName(itemName).colTitle("RESPONSE_VALUES_column").colValue(resValues).forWhich("instant_calculation").sheetNum(j).rowNum(k).colNum(16).build());
instantValidator.addValidationCells(onchangecell);
} else if (numberOfOptions > 0) {
// YW >>
String value1 = resValues.replaceAll("\\\\,", "##");
String[] resValArray = value1.split(",");
if (resValArray.length != numberOfOptions) {
/*
* errors.add("There are an incomplete number of
* option-value pairs in " + "RESPONSE_OPTIONS
* and RESPONSE_VALUES at row " + k + ",
* questions worksheet; perhaps you are missing
* a comma? If there is a comma in any option
* text/value itself, please use \\, instead.");
* htmlErrors.put(j + "," + k + ",15", "NUMBER
* OF OPTIONS DOES NOT MATCH"); htmlErrors.put(j +
* "," + k + ",16", "NUMBER OF VALUES DOES NOT
* MATCH");
*/
errors.add(resPageMsg.getString("incomplete_option_value_pair") + " " + resPageMsg.getString("RESPONSE_OPTIONS_column") + " " + resPageMsg.getString("and") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("at_row") + k + " " + resPageMsg.getString("items_worksheet") + "; " + resPageMsg.getString("perhaps_missing_comma"));
htmlErrors.put(j + "," + k + ",15", resPageMsg.getString("number_option_not_match"));
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("number_value_not_match"));
}
}
/**
* The application will show error on page if two
* identical RESPONSE_LABEL has different REPONSE_VALUES
*/
String[] mapValArray = (String[]) labelWithValues.get(responseLabel);
String value1 = resValues.replaceAll("\\\\,", "##");
String[] resValArray = value1.split(",");
if (labelWithValues.containsKey(responseLabel)) {
if (!StringUtil.isBlank(resValues)) {
// elements in them
if (null != resValArray && null != mapValArray && resValArray.length != mapValArray.length) {
errors.add(resPageMsg.getString("resp_label_with_different_resp_values") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("resp_label_with_different_resp_values_html_error"));
} else {
for (int i = 0; i < resValArray.length; i++) {
if (!resValArray[i].equals(mapValArray[i])) {
errors.add(resPageMsg.getString("resp_label_with_different_resp_values") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("resp_label_with_different_resp_values_html_error"));
break;
}
}
}
}
controlValues.put(secName + "---" + itemName, mapValArray);
} else {
labelWithValues.put(responseLabel, resValArray);
controlValues.put(secName + "---" + itemName, resValArray);
}
/*
* Adding two columns here for the repeating rows,
* REsPONSE_LAYOUT and DEFAULT_VALUE TBH, 06/05/2007 YW
* 08-02-2007: move default_value down after data_type
*/
// RESPONSE_LAYOUT
cell = sheet.getRow(k).getCell((short) 17);
// should be horizontal or vertical, tbh
// BWP: the application will assume a vertical layout if
// this value is not horizontal
// BWP 08-02-2007 <<
String responseLayout = getValue(cell);
responseLayout = responseLayout.replaceAll("<[^>]*>", "");
// BWP >>
cell = sheet.getRow(k).getCell((short) 19);
String dataType = getValue(cell);
dataType = dataType.replaceAll("<[^>]*>", "");
item_from_row.setDataType(dataType);
String dataTypeIdString = "1";
if (StringUtil.isBlank(dataType)) {
// errors.add("The DATA_TYPE column was blank at row
// " + k + ", items worksheet.");
// htmlErrors.put(j + "," + k + ",19", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",19", resPageMsg.getString("required_field"));
} else {
if (!ItemDataType.findByName(dataType.toLowerCase())) {
// errors.add("The DATA_TYPE column was invalid
// at row " + k + ", Items worksheet.");
// htmlErrors.put(j + "," + k + ",19", "INVALID
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",19", resPageMsg.getString("INVALID_FIELD"));
} else {
if ("file".equalsIgnoreCase(responseType) && !"FILE".equalsIgnoreCase(dataType)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("should_be_file") + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",19", resPageMsg.getString("should_be_file"));
} else if ("instant-calculation".equalsIgnoreCase(responseType)) {
OnChangeSheetValidationCell onchangecell = new OnChangeSheetValidationCell(OnChangeSheetValidationType.NONE, SheetValidationType.SHOULD_BE_ST, new SheetCell.Builder().rowName(itemName).colTitle("DATA_TYPE_column").colValue(dataType).forWhich("instant_calculation").sheetNum(j).rowNum(k).colNum(19).build());
instantValidator.addValidationCells(onchangecell);
}
// dataTypeId =
// (ItemDataType.getByName(dataType)).getId();
dataTypeIdString = "(SELECT ITEM_DATA_TYPE_ID From ITEM_DATA_TYPE Where CODE='" + dataType.toUpperCase() + "')";
}
}
if (responseTypeId == 3 || responseTypeId == 5 || responseTypeId == 6 || responseTypeId == 7) {
if (labelWithType.containsKey(responseLabel)) {
// datatype
if (!dataType.equalsIgnoreCase(labelWithType.get(responseLabel).toString())) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("DATA_TYPE_column") + " " + resPageMsg.getString("does_not_match_the_item_data_type_with_the_same_response_label") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",19", resPageMsg.getString("INVALID_FIELD"));
}
} else {
labelWithType.put(responseLabel, dataType);
// make sure response values matching datatype
if (resValArray.length > 0) {
boolean wrongType = false;
if ("int".equalsIgnoreCase(dataType)) {
for (String s : resValArray) {
String st = s != null && s.length() > 0 ? s.trim() : "";
if (st.length() > 0) {
try {
Integer I = Integer.parseInt(st);
// but 2.3 is not integer
if (!I.toString().equals(st)) {
wrongType = true;
}
} catch (Exception e) {
wrongType = true;
}
}
}
if (wrongType) {
wrongType = false;
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("should_be_integer") + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("should_be_integer"));
}
} else if ("real".equalsIgnoreCase(dataType)) {
for (String s : resValArray) {
String st = s != null && s.length() > 0 ? s.trim() : "";
if (st.length() > 0) {
try {
Double I = Double.parseDouble(st);
} catch (Exception e) {
wrongType = true;
}
}
}
if (wrongType) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("RESPONSE_VALUES_column") + " " + resPageMsg.getString("should_be_real") + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ".");
htmlErrors.put(j + "," + k + ",16", resPageMsg.getString("should_be_real"));
}
}
}
}
}
// DEFAULT_VALUE
// can be anything, tbh
//
// YW 08-02-2007 << in database, default_value has been
// set type as varchar(255);
// outside database, it's going to be tied with item's
// DATA_TYPE
// here, default_value has been handled for dataType =
// date
//default value
cell = sheet.getRow(k).getCell((short) 18);
item_from_row.setDefaultValue(getValue(cell));
item_from_row.verifyDefaultValue(row_items, errors, htmlErrors, j, resPageMsg);
default_value = item_from_row.getDefaultValue();
cellIndex = 19;
String widthDecimal = "";
logger.debug("hasWidthDecimalColumn=" + hasWDColumn);
if (hasWDColumn) {
++cellIndex;
cell = sheet.getRow(k).getCell((short) cellIndex);
widthDecimal = getValue(cell);
if (StringUtil.isBlank(widthDecimal)) {
widthDecimal = "";
} else {
if ("single-select".equalsIgnoreCase(responseType) || "multi-select".equalsIgnoreCase(responseType) || "radio".equalsIgnoreCase(responseType) || "checkbox".equalsIgnoreCase(responseType)) {
errors.add(resPageMsg.getString("error_message_for_width_decimal_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ":" + " " + resPageMsg.getString("width_decimal_unavailable_for_single_multi_checkbox_radio"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
} else {
StringBuffer message = new StringBuffer();
boolean isCalc = responseTypeId == 8 || responseTypeId == 9 ? true : false;
message = Validator.validateWidthDecimalSetting(widthDecimal, dataType, isCalc, this.locale);
if (message.length() > 0) {
errors.add(resPageMsg.getString("error_message_for_width_decimal_at") + " " + k + ", " + resPageMsg.getString("items_worksheet") + ":" + " " + message);
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
}
}
}
}
++cellIndex;
cell = sheet.getRow(k).getCell((short) cellIndex);
String regexp = getValue(cell);
String regexp1 = "";
if (!StringUtil.isBlank(regexp)) {
// parse the string and get reg exp eg. regexp:
// /[0-9]*/
regexp1 = regexp.trim();
if (regexp1.startsWith("regexp:")) {
String finalRegexp = regexp1.substring(7).trim();
// logger.debug("reg:" + finalRegexp);
if (finalRegexp.contains("\\\\")) {
// \\ in the regular expression it should
// not be allowed
// errors.add("The VALIDATION column has an
// invalid regular expression at row " + k
// + ", Items worksheet. Regular expression
// contained '\\\\', it should only contain
// one '\\'. ");
// htmlErrors.put(j + "," + k + ",21",
// "INVALID FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + " " + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("regular_expression_contained") + " '\\\\', " + resPageMsg.getString("it_should_only_contain_one") + "'\\'. ");
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
} else {
if (finalRegexp.startsWith("/") && finalRegexp.endsWith("/")) {
finalRegexp = finalRegexp.substring(1, finalRegexp.length() - 1);
try {
Pattern p = Pattern.compile(finalRegexp);
// YW 11-21-2007 << add another \ if
// there is \ in regexp
char[] chars = regexp1.toCharArray();
regexp1 = "";
for (char c : chars) {
if (c == '\\' && !dbName.equals("oracle")) {
regexp1 += c + "\\";
} else {
regexp1 += c;
}
}
// YW >>
} catch (PatternSyntaxException pse) {
// errors.add("The VALIDATION column
// has an invalid regular expression
// at row " + k
// + ", Items worksheet. Example:
// regexp: /[0-9]*/ ");
// htmlErrors.put(j + "," + k +
// ",21", "INVALID FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("Example") + " regexp: /[0-9]*/ ");
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
}
} else {
// errors.add("The VALIDATION column has
// an invalid regular expression at row
// " + k
// + ", Items worksheet. Example:
// regexp: /[0-9]*/ ");
// htmlErrors.put(j + "," + k + ",21",
// "INVALID FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + resPageMsg.getString("has_an_invalid_regular_expression_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + " " + resPageMsg.getString("Example") + " regexp: /[0-9]*/ ");
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
}
}
} else if (regexp1.startsWith("func:")) {
boolean isProperFunction = false;
try {
Validator.processCRFValidationFunction(regexp1);
isProperFunction = true;
} catch (Exception e) {
// errors.add(e.getMessage() + ", at row " +
// k
// + ", Items worksheet." );
// htmlErrors.put(j + "," + k + ",21",
// "INVALID FIELD");
errors.add(e.getMessage() + ", " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
}
} else {
// errors.add("The VALIDATION column was invalid
// at row " + k
// + ", Items worksheet. ");
// htmlErrors.put(j + "," + k + ",21", "INVALID
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_FIELD"));
}
}
++cellIndex;
cell = sheet.getRow(k).getCell((short) cellIndex);
String regexpError = getValue(cell);
regexpError = regexpError.replaceAll("<[^>]*>", "");
if (!StringUtil.isBlank(regexp) && StringUtil.isBlank(regexpError)) {
// errors.add("The VALIDATION_ERROR_MESSAGE column
// was blank at row " + k
// + ", Items worksheet. It cannot be blank if
// VALIDATION is not blank.");
// htmlErrors.put(j + "," + k + ",22", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("VALIDATION_ERROR_MESSAGE_column") + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + " " + resPageMsg.getString("cannot_be_blank_if_VALIDATION_not_blank"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("required_field"));
}
if (regexpError != null && regexpError.length() > 255) {
errors.add(resPageMsg.getString("regexp_errror_length_error"));
}
++cellIndex;
boolean phiBoolean = false;
cell = sheet.getRow(k).getCell((short) cellIndex);
String phi = getValue(cell);
// logger.debug("++ phi: "+getValue(cell));
if (StringUtil.isBlank(phi)) {
phi = "0";
} else // 06/07
if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dphi = cell.getNumericCellValue();
if ((dphi - (int) dphi) * 1000 == 0) {
phi = (int) dphi + "";
}
}
if (!"0".equals(phi) && !"1".equals(phi)) {
// errors.add("The PHI column was invalid at row " +
// k
// + ", Items worksheet. PHI can only be either 0 or
// 1.");
// htmlErrors.put(j + "," + k + ",23", "INVALID
// VALUE");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("PHI_column") + resPageMsg.getString("was_invalid_at_row") + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("PHI_column") + " " + resPageMsg.getString("can_only_be_either_0_or_1"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
} else {
phiBoolean = "1".equals(phi) ? true : false;
}
++cellIndex;
boolean isRequired = false;
cell = sheet.getRow(k).getCell((short) cellIndex);
String required = getValue(cell);
// added to stop NPEs, tbh 06/04/2007
if (StringUtil.isBlank(required)) {
required = "0";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dr = cell.getNumericCellValue();
if ((dr - (int) dr) * 1000 == 0) {
required = (int) dr + "";
}
}
if (!"0".equals(required) && !"1".equals(required)) {
// errors.add("The REQUIRED column was invalid at
// row " + k
// + ", Items worksheet. REQUIRED can only be either
// 0 or 1. ");
// htmlErrors.put(j + "," + k + ",24", "INVALID
// VALUE");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("REQUIRED_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("REQUIRED_column") + resPageMsg.getString("can_only_be_either_0_or_1"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
} else {
isRequired = "1".equals(required) ? true : false;
}
// >> tbh 02/04/2010 adding this column for Dynamics
++cellIndex;
boolean isShowItem = true;
// default is true
cell = sheet.getRow(k).getCell((short) cellIndex);
String showItem = getValue(cell);
if (!StringUtil.isBlank(showItem)) {
isShowItem = "0".equals(showItem) ? false : true;
isShowItem = "Hide".equalsIgnoreCase(showItem) ? false : true;
// supporting both, tbh 03/2010
}
++cellIndex;
cell = sheet.getRow(k).getCell((short) cellIndex);
String display = getValue(cell);
String controlItemName = "", optionValue = "", message = "";
if (!StringUtil.isBlank(display)) {
if (isShowItem != false) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("ITEM_DISPLAY_STATUS_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("should_be_hide_for_scd"));
htmlErrors.put(j + "," + k + "," + (cellIndex - 1), resPageMsg.getString("INVALID_VALUE"));
}
String pvKey = secName + "---";
String d = display.replaceAll("\\\\,", "##");
String[] par = d.split(",");
//validate availability of item_label
if (par.length == 3) {
String p0 = par[0].trim();
String p1 = par[1].trim();
String p2 = par[2].trim();
if (p0.length() > 0 && p1.length() > 0 && p2.length() > 0) {
if (SpreadSheetItemUtil.isItemWithSameParameterExistsIncludingMyself(p0, row_items)) {
controlItemName = p0;
optionValue = p1;
message = p2;
pvKey += p0;
if (controlValues.containsKey(pvKey)) {
String[] pvs = controlValues.get(pvKey);
boolean existing = false;
for (String s : pvs) {
if (s.trim().equals(p1)) {
existing = true;
break;
}
}
if (!existing) {
optionValue = "";
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SIMPLE_CONDITIONAL_DISPLAY_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("control_response_value_invalid") + " " + p1.replace("##", "\\\\,"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
}
}
} else {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SIMPLE_CONDITIONAL_DISPLAY_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("control_item_name_invalid") + " " + p0);
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
}
} else {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SIMPLE_CONDITIONAL_DISPLAY_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("correct_pattern"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
}
} else {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SIMPLE_CONDITIONAL_DISPLAY_column") + " " + resPageMsg.getString("was_invalid_at_row") + " " + k + ", " + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("correct_pattern"));
htmlErrors.put(j + "," + k + "," + cellIndex, resPageMsg.getString("INVALID_VALUE"));
}
}
// Create oid for Item Bean
String itemOid = idao.getValidOid(new ItemBean(), crfName, itemName, itemOids);
itemOids.add(itemOid);
// better spot for checking item might be right here,
// tbh 7-25
String vlSql = "";
if (dbName.equals("oracle")) {
vlSql = "INSERT INTO ITEM (NAME,DESCRIPTION,UNITS,PHI_STATUS," + "ITEM_DATA_TYPE_ID, ITEM_REFERENCE_TYPE_ID,STATUS_ID,OWNER_ID,DATE_CREATED,OC_OID) " + "VALUES ('" + stripQuotes(itemName) + "','" + stripQuotes(descLabel) + "','" + stripQuotes(unit) + "'," + (phiBoolean == true ? 1 : 0) + "," + dataTypeIdString + ",1,1," + ub.getId() + ", sysdate" + ",'" + itemOid + "')";
} else {
vlSql = "INSERT INTO ITEM (NAME,DESCRIPTION,UNITS,PHI_STATUS," + "ITEM_DATA_TYPE_ID, ITEM_REFERENCE_TYPE_ID,STATUS_ID,OWNER_ID,DATE_CREATED,OC_OID) " + "VALUES ('" + stripQuotes(itemName) + "','" + stripQuotes(descLabel) + "','" + stripQuotes(unit) + "'," + phiBoolean + "," + dataTypeIdString + ",1,1," + ub.getId() + ", NOW()" + ",'" + itemOid + "')";
}
backupItemQueries.put(itemName, vlSql);
// to compare items from DB later, if two items have the
// same name,
// but different units or phiStatus, they are different
ItemBean ib = new ItemBean();
ib.setName(itemName);
ib.setUnits(unit);
ib.setPhiStatus(phiBoolean);
ib.setDescription(descLabel);
ib.setDataType(ItemDataType.getByName(dataType.toLowerCase()));
// put metadata into item
ResponseSetBean rsb = new ResponseSetBean();
// notice that still "\\," in options - jxu-08-31-06
String resOptions1 = resOptions.replaceAll("\\\\,", "\\,");
String resValues1 = resValues.replaceAll("\\\\,", "\\,");
rsb.setOptions(stripQuotes(resOptions1), stripQuotes(resValues1));
ItemFormMetadataBean ifmb = new ItemFormMetadataBean();
ifmb.setResponseSet(rsb);
ifmb.setShowItem(isShowItem);
ib.setItemMeta(ifmb);
items.put(itemName, ib);
int ownerId = ub.getId();
if (!itemCheck.containsKey(itemName)) {
// item not in
// the DB
openQueries.put(itemName, vlSql);
} else {
// item in the DB
ItemBean oldItem = (ItemBean) idao.findByNameAndCRFId(itemName, crfId);
if (oldItem.getOwnerId() == ub.getId()) {
// update
if (!cvdao.hasItemData(oldItem.getId())) {
// no
// item
// data
String upSql = "";
if (dbName.equals("oracle")) {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "UNITS='" + stripQuotes(unit) + "'," + "PHI_STATUS=" + (phiBoolean ? 1 : 0) + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + " WHERE exists (SELECT versioning_map.item_id from versioning_map, crf_version where" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id= " + crfId + " AND item.item_id = versioning_map.item_id)" + " AND item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId;
} else {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "UNITS='" + stripQuotes(unit) + "'," + "PHI_STATUS=" + phiBoolean + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + // the missing from clause bug
" FROM versioning_map, crf_version" + " WHERE item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId + " AND item.item_id = versioning_map.item_id AND" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id = " + crfId;
}
// end of if dbName
openQueries.put(itemName, upSql);
} else {
String upSql = "";
if (//New Feature allow date to pdate even if the data is entered
oldItem.getDataType() == oldItem.getDataType().DATE && ib.getDataType() == ib.getDataType().PDATE) {
if (dbName.equals("oracle")) {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "',PHI_STATUS=" + (phiBoolean ? 1 : 0) + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + " WHERE exists (SELECT versioning_map.item_id from versioning_map, crf_version where" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id= " + crfId + " AND item.item_id = versioning_map.item_id)" + " AND item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId;
} else {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "',PHI_STATUS=" + phiBoolean + "," + "ITEM_DATA_TYPE_ID=" + dataTypeIdString + " FROM versioning_map, crf_version" + " WHERE item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId + " AND item.item_id = versioning_map.item_id AND" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id = " + crfId;
}
// end of if dbName
} else {
if (dbName.equals("oracle")) {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "PHI_STATUS=" + (phiBoolean ? 1 : 0) + " WHERE exists (SELECT versioning_map.item_id from versioning_map, crf_version where" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id= " + crfId + " AND item.item_id = versioning_map.item_id)" + " AND item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId;
} else {
upSql = "UPDATE ITEM SET DESCRIPTION='" + stripQuotes(descLabel) + "'," + "PHI_STATUS=" + phiBoolean + " FROM versioning_map, crf_version" + " WHERE item.name='" + stripQuotes(itemName) + "' AND item.owner_id = " + ownerId + " AND item.item_id = versioning_map.item_id AND" + " versioning_map.crf_version_id = crf_version.crf_version_id" + " AND crf_version.crf_id = " + crfId;
}
// end of if dbName
}
openQueries.put(itemName, upSql);
}
} else {
ownerId = oldItem.getOwner().getId();
}
}
String sql = "";
if (dbName.equals("oracle")) {
sql = "INSERT INTO RESPONSE_SET (LABEL, OPTIONS_TEXT, OPTIONS_VALUES, " + "RESPONSE_TYPE_ID, VERSION_ID)" + " VALUES ('" + stripQuotes(responseLabel) + "', '" + stripQuotes(resOptions.replaceAll("\\\\,", "\\,")) + "','" + stripQuotes(resValues.replace("\\\\", "\\")) + "'," + "(SELECT RESPONSE_TYPE_ID From RESPONSE_TYPE Where NAME='" + stripQuotes(responseType.toLowerCase()) + "')," + versionIdString + ")";
} else {
sql = "INSERT INTO RESPONSE_SET (LABEL, OPTIONS_TEXT, OPTIONS_VALUES, " + "RESPONSE_TYPE_ID, VERSION_ID)" + " VALUES ('" + stripQuotes(responseLabel) + "', E'" + stripQuotes(resOptions) + "', E'" + stripQuotes(resValues) + "'," + "(SELECT RESPONSE_TYPE_ID From RESPONSE_TYPE Where NAME='" + stripQuotes(responseType.toLowerCase()) + "')," + versionIdString + ")";
}
// one response type
if (!resPairs.contains(responseLabel.toString().toLowerCase() + "_" + responseType.toString().toLowerCase())) {
// YW >>
if (!resNames.contains(responseLabel)) {
queries.add(sql);
resNames.add(responseLabel);
} else // this will have to change since we have some data
// in the actual
// spreadsheet
// change it to caching response set names in a
// collection?
// or just delete the offending cells from the
// spreadsheet?
// YW <<
{
errors.add("Error found at row \"" + (k + 1) + "\" in items worksheet. ResponseLabel \"" + responseLabel + "\" for ResponseType \"" + responseType + "\" has been used for another ResponseType. ");
htmlErrors.put(j + "," + k + ",14", "INVALID FIELD");
}
resPairs.add(responseLabel.toString().toLowerCase() + "_" + responseType.toString().toLowerCase());
// YW >>
}
String parentItemString = "0";
if (!StringUtil.isBlank(parentItem)) {
if (dbName.equals("oracle")) {
parentItemString = "(SELECT MAX(ITEM_ID) FROM ITEM WHERE NAME='" + stripQuotes(parentItem) + "' AND owner_id = " + ownerId + " )";
} else {
parentItemString = "(SELECT ITEM_ID FROM ITEM WHERE NAME='" + stripQuotes(parentItem) + "' AND owner_id = " + ownerId + " ORDER BY OC_OID DESC LIMIT 1)";
}
}
String selectCorrectItemQueryPostgres = " (SELECT I.ITEM_ID FROM ITEM I LEFT OUTER JOIN ITEM_FORM_METADATA IFM ON I.ITEM_Id = IFM.ITEM_ID LEFT OUTER JOIN CRF_VERSION CV ON IFM.CRF_VERSION_ID = CV.CRF_VERSION_ID WHERE " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is null )" + " OR " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is not null AND CV.CRF_ID =" + crfId + " ) " + " ORDER BY I.OC_OID DESC LIMIT 1) ";
String selectCorrectItemQueryOracle = " (SELECT MAX(I.ITEM_ID) FROM ITEM I LEFT OUTER JOIN ITEM_FORM_METADATA IFM ON I.ITEM_Id = IFM.ITEM_ID LEFT OUTER JOIN CRF_VERSION CV ON IFM.CRF_VERSION_ID = CV.CRF_VERSION_ID WHERE " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is null )" + " OR " + " ( I.NAME='" + itemName + "'" + " AND I.owner_id = " + ownerId + " AND CV.CRF_VERSION_ID is not null AND CV.CRF_ID =" + crfId + " )) ";
String sql2 = "";
if (dbName.equals("oracle")) {
sql2 = "INSERT INTO ITEM_FORM_METADATA (CRF_VERSION_ID, RESPONSE_SET_ID," + "ITEM_ID,SUBHEADER,HEADER,LEFT_ITEM_TEXT," + "RIGHT_ITEM_TEXT,PARENT_ID,SECTION_ID,ORDINAL,PARENT_LABEL,COLUMN_NUMBER,PAGE_NUMBER_LABEL,question_number_label," + "REGEXP,REGEXP_ERROR_MSG,REQUIRED,DEFAULT_VALUE,RESPONSE_LAYOUT,WIDTH_DECIMAL, show_item)" + " VALUES (" + versionIdString + ",(SELECT RESPONSE_SET_ID FROM RESPONSE_SET WHERE LABEL='" + stripQuotes(responseLabel) + "'" + " AND VERSION_ID=" + versionIdString + ")," + selectCorrectItemQueryOracle + ",'" + stripQuotes(subHeader) + "','" + stripQuotes(header) + "','" + stripQuotes(leftItemText) + "','" + stripQuotes(rightItemText) + "'," + parentItemString + ", (SELECT SECTION_ID FROM SECTION WHERE LABEL='" + secName + "' AND " + "CRF_VERSION_ID IN " + versionIdString + "), " + k + ",'" + parentItem + "'," + columnNum + ",'" + stripQuotes(page) + "','" + stripQuotes(questionNum) + "','" + stripQuotes(regexp1) + "','" + stripQuotes(regexpError) + "', " + (isRequired ? 1 : 0) + ", '" + stripQuotes(default_value) + "','" + stripQuotes(responseLayout) + "','" + widthDecimal + "', " + (isShowItem ? 1 : 0) + ")";
logger.debug(sql2);
} else {
sql2 = "INSERT INTO ITEM_FORM_METADATA (CRF_VERSION_ID, RESPONSE_SET_ID," + "ITEM_ID,SUBHEADER,HEADER,LEFT_ITEM_TEXT," + "RIGHT_ITEM_TEXT,PARENT_ID,SECTION_ID,ORDINAL,PARENT_LABEL,COLUMN_NUMBER,PAGE_NUMBER_LABEL,question_number_label," + "REGEXP,REGEXP_ERROR_MSG,REQUIRED,DEFAULT_VALUE,RESPONSE_LAYOUT,WIDTH_DECIMAL, show_item)" + " VALUES (" + versionIdString + ",(SELECT RESPONSE_SET_ID FROM RESPONSE_SET WHERE LABEL='" + stripQuotes(responseLabel) + "'" + " AND VERSION_ID=" + versionIdString + ")," + selectCorrectItemQueryPostgres + ",'" + stripQuotes(subHeader) + "','" + stripQuotes(header) + "','" + stripQuotes(leftItemText) + "','" + stripQuotes(rightItemText) + "'," + parentItemString + ", (SELECT SECTION_ID FROM SECTION WHERE LABEL='" + secName + "' AND " + "CRF_VERSION_ID IN " + versionIdString + "), " + k + ",'" + parentItem + "'," + columnNum + ",'" + stripQuotes(page) + "','" + stripQuotes(questionNum) + "','" + stripQuotes(regexp1) + "','" + stripQuotes(regexpError) + "', " + isRequired + ", '" + stripQuotes(default_value) + "','" + stripQuotes(responseLayout) + "','" + widthDecimal + "'," + isShowItem + ")";
}
queries.add(sql2);
// link version with items now
String sql3 = "";
if (dbName.equals("oracle")) {
sql3 = "INSERT INTO VERSIONING_MAP (CRF_VERSION_ID, ITEM_ID) VALUES ( " + versionIdString + "," + selectCorrectItemQueryOracle + ")";
} else {
sql3 = "INSERT INTO VERSIONING_MAP (CRF_VERSION_ID, ITEM_ID) VALUES ( " + versionIdString + "," + selectCorrectItemQueryPostgres + ")";
}
queries.add(sql3);
String sql2_1 = "";
if (display.length() > 0) {
if (controlItemName.length() > 0 && optionValue.length() > 0 && message.length() > 0) {
//At this point, all errors for scd should be caught; and insert into item_form_metadata should be done
if (dbName.equals("oracle")) {
sql2_1 = "insert into scd_item_metadata (scd_item_form_metadata_id,control_item_form_metadata_id,control_item_name," + "option_value,message) values(" + "(select max(ifm.item_form_metadata_id) from item_form_metadata ifm where ifm.item_id=" + selectCorrectItemQueryOracle + "and ifm.show_item=0 )," + "(select cifm.item_form_metadata_id from item, item_form_metadata cifm" + " where cifm.crf_version_id = " + versionIdString + " and item.item_id = (select it.item_id from item it, versioning_map vm where it.name = '" + controlItemName + "'" + " and vm.crf_version_id = " + versionIdString + " and vm.item_id = it.item_id)" + " and cifm.item_id = item.item_id), " + "'" + controlItemName + "', '" + stripQuotes(optionValue) + "', '" + stripQuotes(message) + "'" + ")";
} else {
sql2_1 = "insert into scd_item_metadata (scd_item_form_metadata_id,control_item_form_metadata_id,control_item_name," + "option_value,message) values(" + "(select max(ifm.item_form_metadata_id) from item_form_metadata ifm where ifm.item_id=" + selectCorrectItemQueryPostgres + "and ifm.show_item=false )," + "(select cifm.item_form_metadata_id from item, item_form_metadata cifm" + " where cifm.crf_version_id = " + versionIdString + " and item.item_id = (select it.item_id from item it, versioning_map vm where it.name = '" + controlItemName + "'" + " and vm.crf_version_id = " + versionIdString + " and vm.item_id = it.item_id)" + " and cifm.item_id = item.item_id), " + "'" + controlItemName + "', '" + stripQuotes(optionValue) + "', '" + stripQuotes(message) + "'" + ")";
}
queries.add(sql2_1);
} else {
logger.debug("No insert into scd_item_metadata for item name = " + itemName + "with Simple_Conditional_Display = \"" + display + "\".");
}
}
// }
if (!StringUtil.isBlank(groupLabel)) {
ItemGroupBean itemGroup;
ItemGroupMetadataBean igMeta;
igMeta = new ItemGroupMetadataBean();
itemGroup = new ItemGroupBean();
try {
logger.debug("found " + groupLabel);
itemGroup = (ItemGroupBean) itemGroups.get(groupLabel);
logger.debug("*** Found " + groupLabel + " and matched with " + itemGroup.getName());
// if(itemGroup != null){
igMeta = itemGroup.getMeta();
if (igMeta == null) {
igMeta = new ItemGroupMetadataBean();
}
// above throws Nullpointer, need to change so
// that it does not, tbh 07-08-07
String sqlGroupLabel = "";
if (dbName.equals("oracle")) {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (" + "item_group_id,HEADER," + "subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, show_group, repeating_group) VALUES (" + "(SELECT MAX(ITEM_GROUP_ID) FROM ITEM_GROUP WHERE NAME='" + stripQuotes(itemGroup.getName()) + "' AND crf_id = " + crfId + " ),'" + stripQuotes(igMeta.getHeader()) + "', '" + stripQuotes(igMeta.getSubheader()) + "', '" + // above removed?
igMeta.getLayout() + "', " + // above removed?
igMeta.getRepeatNum() + ", " + igMeta.getRepeatMax() + ", '" + igMeta.getRepeatArray() + "', " + // above removed?
igMeta.getRowStartNumber() + "," + versionIdString + "," + "(SELECT MAX(ITEM.ITEM_ID) FROM ITEM,ITEM_FORM_METADATA,CRF_VERSION WHERE ITEM.NAME='" + stripQuotes(itemName) + "' " + "AND ITEM.ITEM_ID = ITEM_FORM_METADATA.ITEM_ID and ITEM_FORM_METADATA.CRF_VERSION_ID=CRF_VERSION.CRF_VERSION_ID " + "AND CRF_VERSION.CRF_ID= " + crfId + " )," + k + ", " + (igMeta.isShowGroup() ? 1 : 0) + ", " + (igMeta.isRepeatingGroup() ? 1 : 0) + ")";
} else {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (" + "item_group_id,header," + "subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, show_group, repeating_group) VALUES (" + "(SELECT ITEM_GROUP_ID FROM ITEM_GROUP WHERE NAME='" + itemGroup.getName() + "' AND crf_id = " + crfId + " LIMIT 1),E'" + igMeta.getHeader() + "', E'" + igMeta.getSubheader() + "', '" + // above removed?
igMeta.getLayout() + "', " + // above removed?
igMeta.getRepeatNum() + ", " + igMeta.getRepeatMax() + ", '" + igMeta.getRepeatArray() + "', " + // above removed?
igMeta.getRowStartNumber() + "," + versionIdString + "," + // LIMIT 1),"
"(SELECT ITEM.ITEM_ID FROM ITEM,ITEM_FORM_METADATA,CRF_VERSION WHERE ITEM.NAME='" + itemName + "' " + "AND ITEM.ITEM_ID = ITEM_FORM_METADATA.ITEM_ID and ITEM_FORM_METADATA.CRF_VERSION_ID=CRF_VERSION.CRF_VERSION_ID " + "AND CRF_VERSION.CRF_ID= " + crfId + " ORDER BY ITEM.OC_OID DESC LIMIT 1)," + k + ", " + igMeta.isShowGroup() + ", " + igMeta.isRepeatingGroup() + ")";
}
queries.add(sqlGroupLabel);
} catch (NullPointerException e) {
// Auto-generated catch block, added tbh 102007
logger.error("Error message", e);
errors.add(resPageMsg.getString("Error_found_at_row") + " \"" + (k + 1) + "\"" + resPageMsg.getString("items_worksheet_with_dot") + resPageMsg.getString("GROUP_LABEL") + "\"" + groupLabel + "\" " + resPageMsg.getString("does_not_exist_in_group_spreadsheet"));
htmlErrors.put(j + "," + k + ",6", resPageMsg.getString("GROUP_DOES_NOT_EXIST"));
}
} else {
String sqlGroupLabel = "";
if (dbName.equals("oracle")) {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (item_group_id,HEADER,subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, repeating_group) VALUES (" + "(SELECT MAX(ITEM_GROUP_ID) FROM ITEM_GROUP WHERE NAME='Ungrouped' AND crf_id = " + crfId + " ),'" + "" + "', '" + "" + "', '" + "" + "', " + 1 + ", " + 1 + ", '', 1," + versionIdString + "," + selectCorrectItemQueryOracle + "," + k + ", 0)";
} else {
sqlGroupLabel = "INSERT INTO ITEM_GROUP_METADATA (item_group_id,header,subheader, layout, repeat_number, repeat_max," + " repeat_array,row_start_number, crf_version_id," + "item_id , ordinal, repeating_group) VALUES (" + "(SELECT ITEM_GROUP_ID FROM ITEM_GROUP WHERE NAME='Ungrouped' AND crf_id = " + crfId + " LIMIT 1),'" + "" + "', '" + "" + "', '" + "" + "', " + 1 + ", " + 1 + ", '', 1," + versionIdString + "," + selectCorrectItemQueryPostgres + "," + k + ", false)";
}
// >>>>>>> .r10888
queries.add(sqlGroupLabel);
}
}
// **************************************
// above this is where we will add the first sql query for
// group names
// will have to be put in a seperate list
// and added at the end so that we insure
// that all new item_names and group_names have been added,
// tbh 5/14
// **************************************
// below is place where we will add the sheet name for
// Groups
// tbh, 5/14/2007
// DONE -- add sql insert queries below
// TODO review html error creation in table at end of file
// TODO find out where to add the form group beans
// TODO find out where to add the map beans
// we need to make sure groups sql are executed first,
// because item_group_id is
// used when we insert item group meta data with item
//validate that items of one group are not spread over several sections
SpreadSheetItemUtil.verifySectionGroupPlacementForItems(row_items, errors, htmlErrors, j, resPageMsg, itemGroups);
SpreadSheetItemUtil.verifyUniqueItemPlacementInGroups(row_items, errors, htmlErrors, j, resPageMsg, crfName, ds);
instantValidator.validate();
errors = (ArrayList<String>) instantValidator.getSheetErrors().addErrorsToSheet(errors);
htmlErrors = (HashMap<String, String>) instantValidator.getSheetErrors().putHtmlErrorsToSheet(htmlErrors);
} else if (sheetName.equalsIgnoreCase("Groups")) {
logger.debug("read groups, ***comment added 5.14.07");
ArrayList groupNames = new ArrayList();
// create a group - item relationship with this table? hmm
// they are in order: group_label, group_layout,
// group_header,
// group_sub_header, group_repeat_number, group_repeat_max,
// group_repeat_array
// so: seven rows
// let's insert the default group first
ItemGroupBean defaultGroup = new ItemGroupBean();
defaultGroup.setName("Ungrouped");
defaultGroup.setCrfId(crfId);
defaultGroup.setStatus(Status.AVAILABLE);
// Create oid for Item Group
String defaultGroupOid = itemGroupDao.getValidOid(defaultGroup, crfName, defaultGroup.getName(), itemGroupOids);
itemGroupOids.add(defaultGroupOid);
String defaultSql = "";
if (dbName.equals("oracle")) {
defaultSql = "INSERT INTO ITEM_GROUP ( name, crf_id, status_id, date_created ,owner_id,oc_oid) VALUES ('" + defaultGroup.getName() + "', " + defaultGroup.getCrfId() + "," + defaultGroup.getStatus().getId() + ",sysdate," + ub.getId() + ",'" + defaultGroupOid + "')";
} else {
defaultSql = "INSERT INTO ITEM_GROUP ( name, crf_id, status_id, date_created ,owner_id,oc_oid) VALUES ('" + defaultGroup.getName() + "', " + defaultGroup.getCrfId() + "," + defaultGroup.getStatus().getId() + ",now()," + ub.getId() + ",'" + defaultGroupOid + "')";
}
if (!GroupCheck.containsKey("Ungrouped")) {
queries.add(defaultSql);
}
for (int gk = 1; gk < numRows; gk++) {
if (sheet.getRow(gk) == null) {
blankRowCount++;
if (blankRowCount == 5) {
break;
}
continue;
}
HSSFCell cell = sheet.getRow(gk).getCell((short) 0);
String groupLabel = getValue(cell);
groupLabel = groupLabel.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(groupLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_LABEL_column") + resPageMsg.getString("was_blank_at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ".");
htmlErrors.put(j + "," + gk + ",0", resPageMsg.getString("required_field"));
}
if (groupLabel != null && groupLabel.length() > 255) {
errors.add(resPageMsg.getString("group_label_length_error"));
}
// must these be unique? probably so, tbh
if (groupNames.contains(groupLabel)) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_LABEL_column") + resPageMsg.getString("was_a_duplicate_of") + " " + groupLabel + resPageMsg.getString("at_row") + gk + ", " + resPageMsg.getString("Groups_worksheet") + ".");
htmlErrors.put(j + "," + gk + ",0", resPageMsg.getString("DUPLICATE_FIELD"));
} else {
groupNames.add(groupLabel);
}
// removed reference to 'groupLayout' here, tbh 102007
boolean isRepeatingGroup = true;
boolean newVersionCrf = false;
int cellNo = 0;
if (!(versionNo.equalsIgnoreCase("Version: 2.2") || versionNo.equalsIgnoreCase("Version: 2.5") || versionNo.equalsIgnoreCase("Version: 3.0"))) {
cellNo = 1;
cell = sheet.getRow(gk).getCell((short) cellNo);
try {
isRepeatingGroup = getValue(cell).equalsIgnoreCase("grid");
newVersionCrf = true;
} catch (Exception eee) {
errors.add(resPageMsg.getString("repeating_group_error"));
}
}
cell = sheet.getRow(gk).getCell((short) ++cellNo);
String groupHeader = getValue(cell);
// replace any apostrophes in groupHeader: issue 3277
groupHeader = org.akaza.openclinica.core.form.StringUtil.escapeSingleQuote(groupHeader);
if (groupHeader != null && groupHeader.length() > 255) {
errors.add(resPageMsg.getString("group_header_length_error"));
}
if (isRepeatingGroup) {
sheetContainer.getRepeatingGroupLabels().add(groupLabel);
}
cell = sheet.getRow(gk).getCell((short) ++cellNo);
String groupRepeatNumber = getValue(cell);
// adding clause to convert to int, tbh, 06/07
if (newVersionCrf && !isRepeatingGroup && !StringUtil.isBlank(groupRepeatNumber)) {
errors.add(resPageMsg.getString("repeat_number_none_repeating"));
} else if (!isRepeatingGroup && StringUtil.isBlank(groupRepeatNumber)) {
groupRepeatNumber = "1";
} else {
if (StringUtil.isBlank(groupRepeatNumber)) {
groupRepeatNumber = "1";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dr = cell.getNumericCellValue();
if ((dr - (int) dr) * 1000 == 0) {
groupRepeatNumber = (int) dr + "";
}
} else {
logger.debug("found a non-numeric code in a numeric field: groupRepeatNumber");
}
}
cell = sheet.getRow(gk).getCell((short) ++cellNo);
String groupRepeatMax = getValue(cell);
// adding clause to convert to int, tbh 06/07
if (newVersionCrf && !isRepeatingGroup && !StringUtil.isBlank(groupRepeatMax)) {
errors.add(resPageMsg.getString("repeat_max_none_repeating"));
} else if (!isRepeatingGroup && StringUtil.isBlank(groupRepeatMax)) {
groupRepeatMax = "1";
} else {
if (StringUtil.isBlank(groupRepeatMax)) {
// problem, tbh
groupRepeatMax = "40";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
double dr = cell.getNumericCellValue();
if ((dr - (int) dr) * 1000 == 0) {
groupRepeatMax = (int) dr + "";
// check for zero value
try {
int repeatMaxInt = Integer.parseInt(groupRepeatMax);
if (repeatMaxInt < 1) {
groupRepeatMax = "40";
}
} catch (NumberFormatException nfe) {
groupRepeatMax = "40";
}
}
} else {
logger.debug("found a non-numeric code in a numeric field: groupRepeatMax");
}
}
// >> tbh 02/2010 adding show_hide for Dynamics
cell = sheet.getRow(gk).getCell((short) ++cellNo);
String showGroup = getValue(cell);
boolean isShowGroup = true;
if (!StringUtil.isBlank(showGroup)) {
try {
isShowGroup = "0".equals(showGroup) ? false : true;
isShowGroup = "Hide".equalsIgnoreCase(showGroup) ? false : true;
} catch (Exception eee) {
logger.debug("caught an exception with the boolean value for groups");
}
}
// if (!"1".equals(showGroup) && !"0".equals(showGroup)) {
// // throw an error here
// errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SHOW_GROUP_column") + " "
// + resPageMsg.getString("was_invalid_at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ". "
// + resPageMsg.getString("SHOW_GROUP_column") + resPageMsg.getString("can_only_be_either_0_or_1"));
// htmlErrors.put(j + "," + gk + "," + 4, resPageMsg.getString("INVALID_VALUE"));
// }
// cell = sheet.getRow(gk).getCell((short) 6);
// String groupRepeatArray = getValue(cell);
// below added 06/14/2007, tbh
/*
* BWP>>commented out after removal of borders column
* cell = sheet.getRow(gk).getCell((short) 7); String
* groupBorders = getValue(cell); Integer borders = 0;
* try { borders = Integer.valueOf(groupBorders); if
* (borders.intValue() <0) { errors.add("The BORDERS
* column must be a positive integer. " + groupBorders + "
* at row " + gk + ", Groups worksheet.");
* htmlErrors.put(j + "," + gk + ",7", "INVALID FIELD"); } }
* catch (NumberFormatException ne) { errors.add("The
* BORDERS column must be a positive integer. " +
* groupBorders + " at row " + gk + ", Groups
* worksheet."); htmlErrors.put(j + "," + gk + ",7",
* "INVALID FIELD"); } >>
*/
// above added 06/14/2007, tbh
ItemGroupBean fgb = new ItemGroupBean();
fgb.setName(groupLabel);
fgb.setCrfId(crfId);
fgb.setStatus(Status.AVAILABLE);
ItemGroupMetadataBean igMeta = new ItemGroupMetadataBean();
igMeta.setHeader(groupHeader);
igMeta.setRepeatingGroup(isRepeatingGroup);
//htaycher: no borders anymnore //13817
igMeta.setBorders(0);
// igMeta.setLayout(groupLayout);
// igMeta.setRepeatArray(groupRepeatArray);
igMeta.setShowGroup(isShowGroup);
try {
igMeta.setRepeatMax(new Integer(Integer.parseInt(groupRepeatMax)));
if (igMeta.getRepeatMax() < 1) {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_REPEAT_MAX_column") + " " + resPageMsg.getString("must_be_a_positive_integer") + ". " + groupRepeatMax + " " + resPageMsg.getString("at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ". ");
htmlErrors.put(j + "," + gk + ",3", resPageMsg.getString("INVALID_FIELD"));
}
} catch (NumberFormatException n2) {
logger.error("Error message", n2);
if ("".equals(groupRepeatMax)) {
igMeta.setRepeatMax(40);
} else {
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_REPEAT_MAX_column") + " " + resPageMsg.getString("must_be_a_positive_integer") + ". " + groupRepeatMax + " " + resPageMsg.getString("at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ". ");
htmlErrors.put(j + "," + gk + ",3", resPageMsg.getString("INVALID_FIELD"));
}
}
try {
igMeta.setRepeatNum(new Integer(Integer.parseInt(groupRepeatNumber)));
if (igMeta.getRepeatNum() < 1) {
//mantiss 13917
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_REPEAT_NUM_column") + " " + resPageMsg.getString("must_be_a_positive_integer_or_blank") + ". " + groupRepeatNumber + " " + resPageMsg.getString("at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ". ");
htmlErrors.put(j + "," + gk + ",2", resPageMsg.getString("INVALID_FIELD"));
}
} catch (NumberFormatException n3) {
logger.error(n3.getMessage());
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("GROUP_REPEAT_NUM_column") + " " + resPageMsg.getString("must_be_a_positive_integer_or_blank") + ". " + groupRepeatNumber + " " + resPageMsg.getString("at_row") + " " + gk + ", " + resPageMsg.getString("Groups_worksheet") + ". ");
htmlErrors.put(j + "," + gk + ",2", resPageMsg.getString("INVALID_FIELD"));
}
// igMeta.setSubheader(groupSubheader);
fgb.setMeta(igMeta);
// now, we place the form group bean where we can
// generate the sql
// and find it again, tbh 5/14/2007
// Create oid for Item Group
String groupOid = itemGroupDao.getValidOid(fgb, crfName, fgb.getName(), itemGroupOids);
itemGroupOids.add(groupOid);
// changed to add metadata into item_group_metadata
// table-jxu
String gsql = "";
if (dbName.equals("oracle")) {
gsql = "INSERT INTO ITEM_GROUP ( " + "name, crf_id, status_id, date_created ,owner_id,oc_oid)" + "VALUES ('" + fgb.getName() + "', " + fgb.getCrfId() + "," + fgb.getStatus().getId() + "," + "sysdate," + ub.getId() + ",'" + groupOid + "')";
} else {
gsql = "INSERT INTO ITEM_GROUP ( " + "name, crf_id, status_id, date_created ,owner_id,oc_oid)" + "VALUES ('" + fgb.getName() + "', " + fgb.getCrfId() + "," + fgb.getStatus().getId() + "," + "now()," + ub.getId() + ",'" + groupOid + "')";
}
itemGroups.put(fgb.getName(), fgb);
if (!GroupCheck.containsKey(fgb.getName())) {
// item group not in the DB, then insert
// otherwise, will use the existing group because
// group name is unique
// and shared within CRF
queries.add(gsql);
}
// if (!StringUtil.isBlank(groupLabel)) {
// String itemName =
// (String)itemsToGrouplabels.get(groupLabel);
// logger.debug("found "+itemName+" when we passed group
// label "+groupLabel);
// ItemGroupBean itemGroup = new ItemGroupBean();
// //logger.debug("found "+groupLabel);
// itemGroup= (ItemGroupBean)itemGroups.get(groupLabel);
// logger.debug("*** Found "+
// groupLabel+
// " and matched with "+
// itemGroup.getName());
// igMeta = itemGroup.getMeta();
// //above throws Nullpointer, need to change so that it
// does not, tbh 07-08-07
// //moved down here from line 590, tbh
//
// String sqlGroupLabel = "INSERT INTO
// ITEM_GROUP_METADATA ("+
// "item_group_id,header," +
// "subheader, layout, repeat_number, repeat_max," +
// " repeat_array,row_start_number, crf_version_id," +
// "item_id , ordinal, borders) VALUES (" +
// "(SELECT ITEM_GROUP_ID FROM ITEM_GROUP WHERE NAME='"
// + itemGroup.getName()
// + "' AND crf_id = " + crfId + " ORDER BY OID DESC
// LIMIT 1),'"+
// igMeta.getHeader()+"', '" +
// igMeta.getSubheader()+ "', '" +
// igMeta.getLayout()+ "', " +
// igMeta.getRepeatNum()+", " +
// igMeta.getRepeatMax()+", '" +
// igMeta.getRepeatArray()+"', " +
// igMeta.getRowStartNumber()+ "," +
// versionIdString + "," +
// "(SELECT ITEM_ID FROM ITEM WHERE NAME='" + itemName +
// "' AND owner_id = " + ub.getId() + " ORDER BY OID
// DESC LIMIT 1)," +
// igMeta.getOrdinal() + ",'" +
// igMeta.getBorders()+
// "')";
// queries.add(sqlGroupLabel);
//
// }
}
} else if (sheetName.equalsIgnoreCase("Sections")) {
logger.debug("read sections");
// BORDER, tbh
for (int k = 1; k < numRows; k++) {
if (blankRowCount == 5) {
// 06/2007
break;
}
if (sheet.getRow(k) == null) {
blankRowCount++;
continue;
}
HSSFCell cell = sheet.getRow(k).getCell((short) 0);
String secLabel = getValue(cell);
secLabel = secLabel.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(secLabel)) {
// errors.add("The SECTION_LABEL column was blank at
// row " + k + ", Sections worksheet.");
// htmlErrors.put(j + "," + k + ",0", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_LABEL_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + " " + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("required_field"));
}
if (secLabel != null && secLabel.length() > 2000) {
errors.add(resPageMsg.getString("section_label_length_error"));
}
if (secNames.contains(secLabel)) {
// errors.add("The SECTION_LABEL column was a
// duplicate of " + secLabel + " at row " + k
// + ", sections worksheet.");
// htmlErrors.put(j + "," + k + ",0", "DUPLICATE
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_LABEL_column") + resPageMsg.getString("was_a_duplicate_of") + secLabel + " " + resPageMsg.getString("at_row") + " " + k + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",0", resPageMsg.getString("DUPLICATE_FIELD"));
}
// logger.debug("section name:" + secLabel + "row num:"
// +k);
secNames.add(secLabel);
cell = sheet.getRow(k).getCell((short) 1);
String title = getValue(cell);
title = title.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(title)) {
// errors.add("The SECTION_TITLE column was blank at
// row " + k + ", Sections worksheet.");
// htmlErrors.put(j + "," + k + ",1", "REQUIRED
// FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("SECTION_TITLE_column") + " " + resPageMsg.getString("was_blank_at_row") + " " + k + ", " + resPageMsg.getString("sections_worksheet") + ".");
htmlErrors.put(j + "," + k + ",1", resPageMsg.getString("required_field"));
}
if (title != null && title.length() > 2000) {
errors.add(resPageMsg.getString("section_title_length_error"));
}
cell = sheet.getRow(k).getCell((short) 2);
String subtitle = getValue(cell);
if (subtitle != null && subtitle.length() > 2000) {
errors.add(resPageMsg.getString("section_subtitle_length_error"));
}
cell = sheet.getRow(k).getCell((short) 3);
String instructions = getValue(cell);
if (instructions != null && instructions.length() > 2000) {
errors.add(resPageMsg.getString("section_instruction_length_error"));
}
cell = sheet.getRow(k).getCell((short) 4);
String pageNumber = getValue(cell);
if (pageNumber != null && pageNumber.length() > 5) {
errors.add(resPageMsg.getString("section_page_number_length_error"));
}
cell = sheet.getRow(k).getCell((short) 5);
String parentSection = getValue(cell);
parentSection = parentSection.replaceAll("<[^>]*>", "");
if (!StringUtil.isBlank(parentSection)) {
try {
parentId = Integer.parseInt(parentSection);
} catch (NumberFormatException ne) {
parentId = 0;
}
}
// below added 06/2007, tbh
cell = sheet.getRow(k).getCell((short) 6);
String strBorder = getValue(cell);
strBorder = strBorder.replaceAll("<[^>]*>", "");
Integer intBorder = new Integer(0);
try {
intBorder = new Integer(strBorder);
} catch (NumberFormatException npe) {
// let it pass here, tbh 06/18/2007
}
// change to sql 06/2007; change to section table in
// svn? tbh
String sql = "";
// BWP added borders column 4/24/2008
if (dbName.equals("oracle")) {
sql = "INSERT INTO SECTION (CRF_VERSION_ID," + "STATUS_ID,LABEL, TITLE, INSTRUCTIONS, SUBTITLE, PAGE_NUMBER_LABEL," + "ORDINAL, PARENT_ID, OWNER_ID, DATE_CREATED, BORDERS) " + "VALUES (" + versionIdString + ",1,'" + secLabel + "','" + stripQuotes(title) + "', '" + stripQuotes(instructions) + "', '" + stripQuotes(subtitle) + "','" + pageNumber + "'," + k + "," + parentId + "," + ub.getId() + ",sysdate," + intBorder + ")";
} else {
sql = "INSERT INTO SECTION (CRF_VERSION_ID," + "STATUS_ID,LABEL, TITLE, INSTRUCTIONS, SUBTITLE, PAGE_NUMBER_LABEL," + "ORDINAL, PARENT_ID, OWNER_ID, DATE_CREATED,BORDERS) " + "VALUES (" + versionIdString + ",1,'" + secLabel + "','" + stripQuotes(title) + "', '" + stripQuotes(instructions) + "', '" + stripQuotes(subtitle) + "','" + pageNumber + "'," + k + "," + parentId + "," + ub.getId() + ",NOW()," + intBorder + ")";
}
queries.add(sql);
}
// end for loop
} else if (sheetName.equalsIgnoreCase("CRF")) {
logger.debug("read crf");
// one row, four cells, all strings
if (sheet == null || sheet.getRow(1) == null || sheet.getRow(1).getCell((short) 0) == null) {
throw new CRFReadingException("Blank row found in sheet CRF.");
}
HSSFCell cell = sheet.getRow(1).getCell((short) 0);
crfName = getValue(cell);
crfName = crfName.replaceAll("<[^>]*>", "");
if (StringUtil.isBlank(crfName)) {
// htmlErrors.put(j + ",1,0", "REQUIRED FIELD");
throw new CRFReadingException("The CRF_NAME column was blank in the CRF worksheet.");
}
if (crfId > 0) {
CRFBean checkName = (CRFBean) cdao.findByPK(crfId);
if (!checkName.getName().equals(crfName)) {
throw new CRFReadingException(resPageMsg.getString("the") + " " + resPageMsg.getString("CRF_NAME_column") + " '" + crfName + "' " + resPageMsg.getString("did_not_match_crf_name") + " '" + checkName.getName() + "'.");
}
}
if (crfName.length() > 255) {
errors.add(resPageMsg.getString("crf_name_length_error"));
}
CRFBean existingCRFWithSameName = (CRFBean) cdao.findByName(crfName);
if (this.getCrfId() == 0) {
if (existingCRFWithSameName.getName() != null && existingCRFWithSameName.getName().equals(crfName)) {
errors.add(resPageMsg.getString("crf_name_already_used"));
}
}
// try {
// CRFBean checkName = (CRFBean) cdao.findByPK(crfId);
// if (!checkName.getName().equals(crfName)) {
// logger.debug("crf name is mismatch");
// //errors.add("The CRF_NAME column did not match the
// intended CRF version "
// // + "you want to upload. Make sure this reads '" +
// checkName.getName()
// // + "' before you continue.");
// //htmlErrors.put(j + ",1,0", "DID NOT MATCH CRF");
// errors.add(resPageMsg.getString("the") + " " +
// resPageMsg.getString("CRF_NAME_column") +
// resPageMsg.getString("did_not_match_crf_version") + " '"
// + checkName.getName()
// + "' " + resPageMsg.getString("before_you_continue"));
// htmlErrors.put(j + ",1,0",
// resPageMsg.getString("DID_NOT_MATCH_CRF"));
// }
// } catch (Exception pe) {
// logger.warn("Exception happened when check CRF name" +
// pe.getMessage());
// }
cell = sheet.getRow(1).getCell((short) 1);
String version = getValue(cell);
version = version.replaceAll("<[^>]*>", "");
ncrf.setVersionName(version);
if (version != null && version.length() > 255) {
errors.add(resPageMsg.getString("version_length_error"));
}
// YW, 08-22-2007, since versionName is now obtained from
// spreadsheet,
// blank check has been moved to
// CreateCRFVersionServlet.java
// and mismatch check is not necessary
// if (StringUtil.isBlank(version)) {
// errors.add("The VERSION column was blank in the CRF
// worksheet.");
// htmlErrors.put(j + ",1,1", "REQUIRED FIELD");
// }else if (!version.equals(versionName)) {
// errors.add("The VERSION column did not match the intended
// version name "
// + "you want to upload. Make sure this reads '" +
// versionName
// + "' before you continue.");
// htmlErrors.put(j + ",1,1", "DID NOT MATCH VERSION");
// }
cell = sheet.getRow(1).getCell((short) 2);
String versionDesc = getValue(cell);
versionDesc = versionDesc.replaceAll("<[^>]*>", "");
if (versionDesc != null && versionDesc.length() > 4000) {
errors.add(resPageMsg.getString("version_description_length_error"));
}
cell = sheet.getRow(1).getCell((short) 3);
String revisionNotes = getValue(cell);
revisionNotes = revisionNotes.replaceAll("<[^>]*>", "");
if (revisionNotes != null && revisionNotes.length() > 255) {
errors.add(resPageMsg.getString("revision_notes_length_error"));
}
if (StringUtil.isBlank(revisionNotes)) {
// errors.add("The REVISION_NOTES column was blank in
// the CRF worksheet.");
// htmlErrors.put(j + ",1,3", "REQUIRED FIELD");
errors.add(resPageMsg.getString("the") + " " + resPageMsg.getString("REVISION_NOTES_column") + " " + resPageMsg.getString("was_blank_in_the_CRF_worksheet"));
htmlErrors.put(j + ",1,3", resPageMsg.getString("required_field"));
}
// Generating query string for the new CRF
Connection con = null;
String crfOid = null;
if (crfId == 0) {
crfOid = cdao.getValidOid(new CRFBean(), crfName);
int nextCRFId;
try {
con = ds.getConnection();
CoreResources.setSchema(con);
/*
* We are selecting the crf id which will be used to
* save the new CRF. Selecting the crf id in advance
* will not cause any problem in a multi threaded
* environment because the nextVal() method always
* returns unique values. So there is no chance of
* processing two CRF simultaneously with same crf
* id.
*/
ResultSet nextIdRs;
if (dbName.equals("oracle")) {
nextIdRs = con.createStatement().executeQuery("select crf_id_seq.nextval from dual");
} else {
nextIdRs = con.createStatement().executeQuery("select nextval('crf_crf_id_seq')");
}
nextIdRs.next();
nextCRFId = nextIdRs.getInt(1);
crfId = nextCRFId;
ncrf.setCrfId(crfId);
String createCRFSql;
if (dbName.equals("oracle")) {
createCRFSql = "INSERT INTO CRF (CRF_ID, STATUS_ID, NAME, DESCRIPTION, OWNER_ID, DATE_CREATED, OC_OID, SOURCE_STUDY_ID) VALUES (" + crfId + ", 1,'" + stripQuotes(crfName) + "','" + stripQuotes(versionDesc) + "'," + ub.getId() + ",sysdate" + ",'" + crfOid + "'," + studyId + ")";
} else {
createCRFSql = "INSERT INTO CRF (CRF_ID, STATUS_ID, NAME, DESCRIPTION, OWNER_ID, DATE_CREATED, OC_OID, SOURCE_STUDY_ID) VALUES (" + crfId + ", 1,'" + stripQuotes(crfName) + "','" + stripQuotes(versionDesc) + "'," + ub.getId() + ",NOW()" + ",'" + crfOid + "'," + studyId + ")";
}
queries.add(createCRFSql);
} catch (SQLException e) {
logger.warn("Exception encountered with query select nextval('crf_crf_id_seq'), Message-" + e.getMessage());
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
logger.warn("Connection can't be closed");
}
}
}
}
// check for instrument existence here??? tbh 7/28
// engaging in new validation, tbh, 6-4-04
// modify nib.getinstversions to look for version name and
// description
// need to stop uploads of same name-description pairs
HashMap checkCRFVersions = ncrf.getCrfVersions();
// this now returns a hash map of key:version_name
// ->value:version_description
boolean overwrite = false;
if (checkCRFVersions.containsKey(version)) {
logger.debug("found a matching version name..." + version);
/*
* errors.add("The VERSION column is not unique. This
* can cause confusion in " + "selecting the correct
* CRF. Please make sure you change the " + "version
* name so that it can be uniquely identified by users
* in the system. " + "Otherwise, the previous same
* version will be deleted from database.");
* htmlErrors.put(j + ",1,2", "NOT UNIQUE");
*/
errors.add(resPageMsg.getString("version_not_unique_cause_confusion"));
htmlErrors.put(j + ",1,2", resPageMsg.getString("NOT_UNIQUE"));
}
// Create oid for Crf Version
String oid;
if (crfOid != null) {
oid = cvdao.getValidOid(new CRFVersionBean(), crfOid, version);
} else {
CRFBean crfBean = (CRFBean) cdao.findByName(crfName);
oid = cvdao.getValidOid(new CRFVersionBean(), crfBean.getOid(), version);
}
String sql = "";
if (dbName.equals("oracle")) {
if (crfId == 0) {
sql = "INSERT INTO CRF_VERSION (NAME, DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + stripQuotes(version) + "','" + stripQuotes(versionDesc) + "'," + "(SELECT CRF_ID FROM CRF C WHERE C.NAME='" + crfName + "'),1,sysdate," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
} else {
sql = "INSERT INTO CRF_VERSION (NAME,DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + version + "','" + stripQuotes(versionDesc) + "'," + crfId + ",1,sysdate," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
}
} else {
if (crfId == 0) {
sql = "INSERT INTO CRF_VERSION (NAME, DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + stripQuotes(version) + "','" + stripQuotes(versionDesc) + "'," + "(SELECT CRF_ID FROM CRF WHERE NAME='" + crfName + "'),1,NOW()," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
} else {
sql = "INSERT INTO CRF_VERSION (NAME,DESCRIPTION, CRF_ID, STATUS_ID,DATE_CREATED," + "OWNER_ID,REVISION_NOTES,OC_OID) " + "VALUES ('" + version + "','" + stripQuotes(versionDesc) + "'," + crfId + ",1,NOW()," + ub.getId() + ",'" + stripQuotes(revisionNotes) + "','" + oid + "')";
}
}
queries.add(sql);
pVersion = version;
pVerDesc = versionDesc;
}
versionIdString = "(SELECT CRF_VERSION_ID FROM CRF_VERSION WHERE NAME ='" + pVersion + "' AND CRF_ID=" + crfId + ")";
// move html creation to here, include error creation as well,
// tbh 7/28
buf.append(sheetName + "<br>");
buf.append("<div class=\"box_T\"><div class=\"box_L\"><div class=\"box_R\"><div class=\"box_B\"><div class=\"box_TL\"><div class=\"box_TR\"><div class=\"box_BL\"><div class=\"box_BR\">");
buf.append("<div class=\"textbox_center\">");
buf.append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"");
buf.append("caption=\"" + wb.getSheetName(j) + "\"" + ">");
for (int i = 0; i < numRows; i++) {
buf.append("<tr>");
if (sheet.getRow(i) == null) {
continue;
}
int numCells = sheet.getRow(i).getLastCellNum();
for (int y = 0; y < numCells; y++) {
HSSFCell cell = sheet.getRow(i).getCell((short) y);
int cellType = 0;
String error = " ";
String errorKey = j + "," + i + "," + y;
if (htmlErrors.containsKey(errorKey)) {
error = "<span class=\"alert\">" + htmlErrors.get(errorKey) + "</span>";
}
if (cell == null) {
cellType = HSSFCell.CELL_TYPE_BLANK;
} else {
cellType = cell.getCellType();
}
switch(cellType) {
case HSSFCell.CELL_TYPE_BLANK:
buf.append("<td class=\"table_cell\">" + error + "</td>");
break;
case HSSFCell.CELL_TYPE_NUMERIC:
buf.append("<td class=\"table_cell\">" + cell.getNumericCellValue() + " " + error + "</td>");
break;
case HSSFCell.CELL_TYPE_STRING:
buf.append("<td class=\"table_cell\">" + cell.getStringCellValue() + " " + error + "</td>");
break;
default:
buf.append("<td class=\"table_cell\">" + error + "</td>");
}
}
buf.append("</tr>");
}
buf.append("</table>");
buf.append("<br></div>");
buf.append("</div></div></div></div></div></div></div></div>");
buf.append("</div><br>");
}
// end of the else sheet loop
}
// end of the for loop for sheets
// queries.addAll(groupItemMapQueries);
// added at the end so that items and groups already exist, tbh 5.15.07
ncrf.setQueries(queries);
ncrf.setItemQueries(openQueries);
ncrf.setBackupItemQueries(backupItemQueries);
ncrf.setItems(items);
if (!errors.isEmpty()) {
ncrf.setErrors(errors);
}
// logger.debug("html table:" + buf.toString());
ncrf.setHtmlTable(buf.toString());
return ncrf;
}
use of org.akaza.openclinica.bean.submit.CRFVersionBean in project OpenClinica by OpenClinica.
the class CreateFiltersTwoServlet method processRequest.
// < ResourceBundle restext,resword,respage,resexception;
@Override
public void processRequest() throws Exception {
// we can't get to here without an action:
// begin--takes us to specify parameters,
// where the user will select CRF, then section,
// then parameters of the section: a little tricky
// to do entirely with javascript, but can be done.
// possible to set up the CRF-section relationship,
// and then have a screen 3.5 with the parameters?
// criteria--takes us to specify criteria, that is,
// to specify and, or, not and, etc. here we'll take the
// list we just generated online and generate a chain
// of filterobjectbeans, which will in turn,
// generate the SQL add on for the dataset.
String action = request.getParameter("action");
StudyBean studyWithEventDefs = currentStudy;
if (currentStudy.getParentStudyId() > 0) {
studyWithEventDefs = new StudyBean();
studyWithEventDefs.setId(currentStudy.getParentStudyId());
}
if (StringUtil.isBlank(action)) {
// throw an error
} else if ("begin".equalsIgnoreCase(action)) {
StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
HashMap events = sedao.findCRFsByStudy(studyWithEventDefs);
// if events are empty -- resend to first filter page with message
if (events.isEmpty()) {
addPageMessage(respage.getString("no_CRF_assigned_pick_another"));
FormProcessor fp = new FormProcessor(request);
FilterDAO fdao = new FilterDAO(sm.getDataSource());
EntityBeanTable table = fp.getEntityBeanTable();
ArrayList filters = (ArrayList) fdao.findAll();
ArrayList filterRows = FilterRow.generateRowsFromBeans(filters);
String[] columns = { resword.getString("filter_name"), resword.getString("description"), resword.getString("created_by"), resword.getString("created_date"), resword.getString("status"), resword.getString("actions") };
table.setColumns(new ArrayList(Arrays.asList(columns)));
table.hideColumnLink(5);
table.addLink(resword.getString("create_new_filter"), "CreateFiltersOne?action=begin");
table.setQuery("CreateFiltersOne", new HashMap());
table.setRows(filterRows);
table.computeDisplay();
request.setAttribute("table", table);
forwardPage(Page.CREATE_FILTER_SCREEN_1);
} else {
// else, send to the following page:
request.setAttribute("events", events);
forwardPage(Page.CREATE_FILTER_SCREEN_3);
}
} else if ("crfselected".equalsIgnoreCase(action)) {
// get the crf id, return to a new page with sections
// and parameters attached, tbh
FormProcessor fp = new FormProcessor(request);
HashMap errors = new HashMap();
int crfId = fp.getInt("crfId");
if (crfId > 0) {
CRFVersionDAO cvDAO = new CRFVersionDAO(sm.getDataSource());
CRFDAO cDAO = new CRFDAO(sm.getDataSource());
SectionDAO secDAO = new SectionDAO(sm.getDataSource());
Collection sections = secDAO.findByVersionId(crfId);
CRFVersionBean cvBean = (CRFVersionBean) cvDAO.findByPK(crfId);
CRFBean cBean = (CRFBean) cDAO.findByPK(cvBean.getCrfId());
request.setAttribute("sections", sections);
session.setAttribute("cBean", cBean);
// for further pages,
session.setAttribute("cvBean", cvBean);
// tbh
forwardPage(Page.CREATE_FILTER_SCREEN_3_1);
} else {
addPageMessage(respage.getString("select_a_CRF_before_picking"));
StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
HashMap events = sedao.findCRFsByStudy(studyWithEventDefs);
request.setAttribute("events", events);
forwardPage(Page.CREATE_FILTER_SCREEN_3);
}
} else if ("sectionselected".equalsIgnoreCase(action)) {
// TODO set the crf and the section into session,
// allow for the user to go back and forth,
// set up the questions to be picked,
// allow the user to move on to create_filter_screen_4
FormProcessor fp = new FormProcessor(request);
int sectionId = fp.getInt("sectionId");
if (sectionId > 0) {
SectionDAO secDAO = new SectionDAO(sm.getDataSource());
SectionBean secBean = (SectionBean) secDAO.findByPK(sectionId);
session.setAttribute("secBean", secBean);
ItemFormMetadataDAO ifmDAO = new ItemFormMetadataDAO(sm.getDataSource());
Collection metadatas = ifmDAO.findAllBySectionId(sectionId);
if (metadatas.size() > 0) {
request.setAttribute("metadatas", metadatas);
forwardPage(Page.CREATE_FILTER_SCREEN_3_2);
} else {
CRFVersionBean cvBean = (CRFVersionBean) session.getAttribute("cvBean");
addPageMessage(respage.getString("section_not_have_questions_select_another"));
// SectionDAO secDAO = new SectionDAO(sm.getDataSource());
Collection sections = secDAO.findByVersionId(cvBean.getId());
request.setAttribute("sections", sections);
forwardPage(Page.CREATE_FILTER_SCREEN_3_1);
}
} else {
CRFVersionBean cvBean = (CRFVersionBean) session.getAttribute("cvBean");
addPageMessage(respage.getString("select_section_before_select_question"));
SectionDAO secDAO = new SectionDAO(sm.getDataSource());
Collection sections = secDAO.findByVersionId(cvBean.getId());
request.setAttribute("sections", sections);
forwardPage(Page.CREATE_FILTER_SCREEN_3_1);
}
} else if ("questionsselected".equalsIgnoreCase(action)) {
ArrayList alist = this.extractIdsFromForm();
// and send the user to create_filter_screen_4
if (alist.size() > 0) {
ItemFormMetadataDAO ifmDAO = new ItemFormMetadataDAO(sm.getDataSource());
Collection questions = ifmDAO.findByMultiplePKs(alist);
session.setAttribute("questions", questions);
forwardPage(Page.CREATE_FILTER_SCREEN_4);
} else {
SectionBean secBean = (SectionBean) session.getAttribute("secBean");
addPageMessage(respage.getString("select_questions_before_set_parameters"));
ItemFormMetadataDAO ifmDAO = new ItemFormMetadataDAO(sm.getDataSource());
Collection metadatas = ifmDAO.findAllBySectionId(secBean.getId());
request.setAttribute("metadatas", metadatas);
forwardPage(Page.CREATE_FILTER_SCREEN_3_2);
}
} else if ("validatecriteria".equalsIgnoreCase(action)) {
// TODO look at the criteria and create a list of filterobjectdata
// beans, so that we can create the SQL later on in
// the process.
// also, throw the user back to the process or throw
// them forward into the createServletThree process
FormProcessor fp = new FormProcessor(request);
String logical = fp.getString("logical");
ArrayList questions = (ArrayList) session.getAttribute("questions");
ArrayList filterobjects = new ArrayList();
// (ArrayList)session.getAttribute("filterobjects");
Iterator q_it = questions.iterator();
int arrCnt = 0;
while (q_it.hasNext()) {
ItemFormMetadataBean ifmBean = (ItemFormMetadataBean) q_it.next();
String opString = "operator:" + ifmBean.getId();
String valString = "value:" + ifmBean.getId();
String remString = "remove:" + ifmBean.getId();
if ("remove".equals(fp.getString(remString))) {
logger.info("found the string: " + remString);
// TODO remove the question from from the list,
// redirect to that page again????? <--maybe not?
// questions.remove(arrCnt);
// shouldn't have to remove the above, just do nothing
arrCnt++;
} else {
String operator = fp.getString(opString);
String value = fp.getString(valString);
FilterObjectBean fob = new FilterObjectBean();
fob.setItemId(ifmBean.getId());
fob.setItemName(ifmBean.getHeader() + " " + ifmBean.getLeftItemText() + " " + ifmBean.getRightItemText());
// case operator:
if ("equal to".equalsIgnoreCase(operator)) {
fob.setOperand("=");
} else if ("greater than".equalsIgnoreCase(operator)) {
fob.setOperand(">");
} else if ("less than".equalsIgnoreCase(operator)) {
fob.setOperand("<");
} else if ("greater than or equal".equalsIgnoreCase(operator)) {
fob.setOperand(">=");
} else if ("less than or equal".equalsIgnoreCase(operator)) {
fob.setOperand("<=");
} else if ("like".equalsIgnoreCase(operator)) {
fob.setOperand(" like ");
} else if ("not like".equalsIgnoreCase(operator)) {
fob.setOperand(" not like ");
} else {
fob.setOperand("!=");
}
fob.setValue(value);
filterobjects.add(fob);
}
// end else
//
}
// end while
session.setAttribute("questions", questions);
// TODO where does the connector come into play?
// session.setAttribute("filterobjects",filterobjects);
FilterDAO fDAO = new FilterDAO(sm.getDataSource());
String newSQL = (String) session.getAttribute("newSQL");
ArrayList newExp = (ArrayList) session.getAttribute("newExp");
// human readable explanation
String newNewSQL = fDAO.genSQLStatement(newSQL, logical, filterobjects);
ArrayList newNewExp = fDAO.genExplanation(newExp, logical, filterobjects);
if (arrCnt == questions.size()) {
newNewSQL = newSQL;
newNewExp = newExp;
// don't change anything, if we've removed everything from this
// list
}
logger.info("new SQL Generated: " + newNewSQL);
String sub = fp.getString("submit");
if ("Specify Filter Metadata".equals(sub)) {
// add new params, create the filter object,
// and go to create metadata
FilterBean fb = new FilterBean();
fb.setSQLStatement(newNewSQL + ")");
// adding parens here to finish off other
// statement--might add first part of statement here
// for legibility's sake
// tbh 06-02-2005
session.removeAttribute("newSQL");
// end of the road
session.setAttribute("newFilter", fb);
request.setAttribute("statuses", getStatuses());
forwardPage(Page.CREATE_FILTER_SCREEN_5);
} else {
// replace the 'old' sql with the new sql gathered from the
// session
session.setAttribute("newSQL", newNewSQL);
session.setAttribute("newExp", newNewExp);
// add new params, and go back
StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
HashMap events = sedao.findCRFsByStudy(currentStudy);
//
request.setAttribute("events", events);
forwardPage(Page.CREATE_FILTER_SCREEN_3);
}
}
}
use of org.akaza.openclinica.bean.submit.CRFVersionBean in project OpenClinica by OpenClinica.
the class UpdateStudyEventServlet method populateUncompletedCRFsWithCRFAndVersions.
private void populateUncompletedCRFsWithCRFAndVersions(ArrayList uncompletedEventDefinitionCRFs) {
CRFDAO cdao = new CRFDAO(sm.getDataSource());
CRFVersionDAO cvdao = new CRFVersionDAO(sm.getDataSource());
int size = uncompletedEventDefinitionCRFs.size();
for (int i = 0; i < size; i++) {
DisplayEventDefinitionCRFBean dedcrf = (DisplayEventDefinitionCRFBean) uncompletedEventDefinitionCRFs.get(i);
CRFBean cb = (CRFBean) cdao.findByPK(dedcrf.getEdc().getCrfId());
// check it here, tbh 102007
if (cb.getStatus().equals(Status.AVAILABLE)) {
// the above does not allow us to show the CRF as a thing with
// status of 'invalid' so we have to
// go to the JSP for this one, I think
dedcrf.getEdc().setCrf(cb);
ArrayList versions = (ArrayList) cvdao.findAllActiveByCRF(dedcrf.getEdc().getCrfId());
dedcrf.getEdc().setVersions(versions);
// added tbh 092007, fix for 1461
if (versions != null && versions.size() != 0) {
boolean isLocked = false;
for (int ii = 0; ii < versions.size(); ii++) {
CRFVersionBean crfvb = (CRFVersionBean) versions.get(ii);
logger.debug("...checking versions..." + crfvb.getName());
if (!crfvb.getStatus().equals(Status.AVAILABLE)) {
logger.debug("found a non active crf version");
isLocked = true;
}
}
logger.debug("re-set event def, line 240: " + isLocked);
if (isLocked) {
dedcrf.setStatus(Status.LOCKED);
dedcrf.getEventCRF().setStage(DataEntryStage.LOCKED);
}
uncompletedEventDefinitionCRFs.set(i, dedcrf);
} else {
// above added 092007, tbh
dedcrf.setStatus(Status.LOCKED);
dedcrf.getEventCRF().setStage(DataEntryStage.LOCKED);
uncompletedEventDefinitionCRFs.set(i, dedcrf);
}
// added 102007, tbh
} else {
dedcrf.getEdc().setCrf(cb);
logger.debug("_found a non active crf _");
dedcrf.setStatus(Status.LOCKED);
dedcrf.getEventCRF().setStage(DataEntryStage.LOCKED);
dedcrf.getEdc().getCrf().setStatus(Status.LOCKED);
uncompletedEventDefinitionCRFs.set(i, dedcrf);
}
// enclosing if statement added 102007, tbh
}
}
use of org.akaza.openclinica.bean.submit.CRFVersionBean in project OpenClinica by OpenClinica.
the class UpdateSubStudyServlet method submitSiteEventDefinitions.
private void submitSiteEventDefinitions(StudyBean site) throws MalformedURLException {
FormProcessor fp = new FormProcessor(request);
Validator v = new Validator(request);
HashMap<String, Boolean> changes = new HashMap<String, Boolean>();
HashMap<String, Boolean> changeStatus = (HashMap<String, Boolean>) session.getAttribute("changed");
ArrayList<StudyEventDefinitionBean> seds = new ArrayList<StudyEventDefinitionBean>();
ArrayList<EventDefinitionCRFBean> defCrfs = new ArrayList<EventDefinitionCRFBean>();
StudyEventDefinitionDAO sedDao = new StudyEventDefinitionDAO(sm.getDataSource());
CRFVersionDAO cvdao = new CRFVersionDAO(sm.getDataSource());
FormLayoutDAO fldao = new FormLayoutDAO(sm.getDataSource());
StudyBean parentStudyBean;
if (site.getParentStudyId() == 0) {
parentStudyBean = site;
} else {
StudyDAO studyDAO = new StudyDAO(sm.getDataSource());
parentStudyBean = (StudyBean) studyDAO.findByPK(site.getParentStudyId());
}
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(sm.getDataSource());
ArrayList<EventDefinitionCRFBean> eventDefCrfList = (ArrayList<EventDefinitionCRFBean>) edcdao.findAllActiveSitesAndStudiesPerParentStudy(parentStudyBean.getId());
ArrayList<EventDefinitionCRFBean> toBeCreatedEventDefBean = new ArrayList<>();
ArrayList<EventDefinitionCRFBean> toBeUpdatedEventDefBean = new ArrayList<>();
ArrayList<EventDefinitionCRFBean> edcsInSession = new ArrayList<EventDefinitionCRFBean>();
boolean changestate = false;
seds = (ArrayList<StudyEventDefinitionBean>) session.getAttribute("definitions");
StudyParameterValueDAO spvdao = new StudyParameterValueDAO(sm.getDataSource());
String participateFormStatus = spvdao.findByHandleAndStudy(parentStudyBean.getId(), "participantPortal").getValue();
if (participateFormStatus.equals("enabled"))
baseUrl();
request.setAttribute("participateFormStatus", participateFormStatus);
for (StudyEventDefinitionBean sed : seds) {
ArrayList<EventDefinitionCRFBean> edcs = sed.getCrfs();
int start = 0;
for (EventDefinitionCRFBean edcBean : edcs) {
int edcStatusId = edcBean.getStatus().getId();
if (edcStatusId == 5 || edcStatusId == 7) {
} else {
String order = start + "-" + edcBean.getId();
int defaultVersionId = fp.getInt("defaultVersionId" + order);
String requiredCRF = fp.getString("requiredCRF" + order);
String doubleEntry = fp.getString("doubleEntry" + order);
String electronicSignature = fp.getString("electronicSignature" + order);
String hideCRF = fp.getString("hideCRF" + order);
String participantForm = fp.getString("participantForm" + order);
String allowAnonymousSubmission = fp.getString("allowAnonymousSubmission" + order);
String submissionUrl = fp.getString("submissionUrl" + order);
String offline = fp.getString("offline" + order);
int sdvId = fp.getInt("sdvOption" + order);
ArrayList<String> selectedVersionIdList = fp.getStringArray("versionSelection" + order);
int selectedVersionIdListSize = selectedVersionIdList.size();
String selectedVersionIds = "";
if (selectedVersionIdListSize > 0) {
for (String id : selectedVersionIdList) {
selectedVersionIds += id + ",";
}
selectedVersionIds = selectedVersionIds.substring(0, selectedVersionIds.length() - 1);
}
String sdvOption = fp.getString("sdvOption" + order);
boolean changed = false;
if (changeStatus != null && changeStatus.get(sed.getId() + "-" + edcBean.getId()) != null) {
changed = changeStatus.get(sed.getId() + "-" + edcBean.getId());
edcBean.setSubmissionUrl(submissionUrl);
}
boolean isRequired = !StringUtil.isBlank(requiredCRF) && "yes".equalsIgnoreCase(requiredCRF.trim()) ? true : false;
boolean isDouble = !StringUtil.isBlank(doubleEntry) && "yes".equalsIgnoreCase(doubleEntry.trim()) ? true : false;
boolean hasPassword = !StringUtil.isBlank(electronicSignature) && "yes".equalsIgnoreCase(electronicSignature.trim()) ? true : false;
boolean isHide = !StringUtil.isBlank(hideCRF) && "yes".equalsIgnoreCase(hideCRF.trim()) ? true : false;
System.out.println("crf name :" + edcBean.getCrfName());
System.out.println("submissionUrl: " + submissionUrl);
if (edcBean.getParentId() > 0) {
int dbDefaultVersionId = edcBean.getDefaultVersionId();
if (defaultVersionId != dbDefaultVersionId) {
changed = true;
FormLayoutBean defaultVersion = (FormLayoutBean) fldao.findByPK(defaultVersionId);
edcBean.setDefaultVersionId(defaultVersionId);
edcBean.setDefaultVersionName(defaultVersion.getName());
}
if (isRequired != edcBean.isRequiredCRF()) {
changed = true;
edcBean.setRequiredCRF(isRequired);
}
if (isDouble != edcBean.isDoubleEntry()) {
changed = true;
edcBean.setDoubleEntry(isDouble);
}
if (hasPassword != edcBean.isElectronicSignature()) {
changed = true;
edcBean.setElectronicSignature(hasPassword);
}
if (isHide != edcBean.isHideCrf()) {
changed = true;
edcBean.setHideCrf(isHide);
}
if (!submissionUrl.equals(edcBean.getSubmissionUrl())) {
changed = true;
edcBean.setSubmissionUrl(submissionUrl);
}
if (!StringUtil.isBlank(selectedVersionIds) && !selectedVersionIds.equals(edcBean.getSelectedVersionIds())) {
changed = true;
String[] ids = selectedVersionIds.split(",");
ArrayList<Integer> idList = new ArrayList<Integer>();
for (String id : ids) {
idList.add(Integer.valueOf(id));
}
edcBean.setSelectedVersionIdList(idList);
edcBean.setSelectedVersionIds(selectedVersionIds);
}
if (sdvId > 0 && sdvId != edcBean.getSourceDataVerification().getCode()) {
changed = true;
edcBean.setSourceDataVerification(SourceDataVerification.getByCode(sdvId));
}
if (changed) {
edcBean.setUpdater(ub);
edcBean.setUpdatedDate(new Date());
logger.debug("update for site");
toBeUpdatedEventDefBean.add(edcBean);
// edcdao.update(edcBean);
}
} else {
// only if definition-crf has been modified, will it be
// saved for the site
int defaultId = defaultVersionId > 0 ? defaultVersionId : edcBean.getDefaultVersionId();
int dbDefaultVersionId = edcBean.getDefaultVersionId();
if (defaultId == dbDefaultVersionId) {
if (isRequired == edcBean.isRequiredCRF()) {
if (isDouble == edcBean.isDoubleEntry()) {
if (hasPassword == edcBean.isElectronicSignature()) {
if (isHide == edcBean.isHideCrf()) {
if (submissionUrl.equals("")) {
if (selectedVersionIdListSize > 0) {
if (selectedVersionIdListSize == edcBean.getVersions().size()) {
if (sdvId > 0) {
if (sdvId != edcBean.getSourceDataVerification().getCode()) {
changed = true;
}
}
} else {
changed = true;
}
}
} else {
changed = true;
}
} else {
changed = true;
}
} else {
changed = true;
}
} else {
changed = true;
}
} else {
changed = true;
}
} else {
changed = true;
}
if (changed) {
CRFVersionBean defaultVersion = (CRFVersionBean) cvdao.findByPK(defaultId);
edcBean.setDefaultVersionId(defaultId);
edcBean.setDefaultVersionName(defaultVersion.getName());
edcBean.setRequiredCRF(isRequired);
edcBean.setDoubleEntry(isDouble);
edcBean.setElectronicSignature(hasPassword);
edcBean.setHideCrf(isHide);
edcBean.setSubmissionUrl(submissionUrl);
if (selectedVersionIdListSize > 0 && selectedVersionIdListSize != edcBean.getVersions().size()) {
String[] ids = selectedVersionIds.split(",");
ArrayList<Integer> idList = new ArrayList<Integer>();
for (String id : ids) {
idList.add(Integer.valueOf(id));
}
edcBean.setSelectedVersionIdList(idList);
edcBean.setSelectedVersionIds(selectedVersionIds);
}
if (sdvId > 0 && sdvId != edcBean.getSourceDataVerification().getCode()) {
edcBean.setSourceDataVerification(SourceDataVerification.getByCode(sdvId));
}
// edcBean.setParentId(edcBean.getId());
edcBean.setStudyId(site.getId());
edcBean.setUpdater(ub);
edcBean.setUpdatedDate(new Date());
logger.debug("create for the site");
toBeCreatedEventDefBean.add(edcBean);
// edcdao.create(edcBean);
}
}
++start;
changes.put(sed.getId() + "-" + edcBean.getId(), changed);
}
edcsInSession.add(edcBean);
}
sed.setPopulated(false);
eventDefCrfList = validateSubmissionUrl(edcsInSession, eventDefCrfList, v, sed);
edcsInSession.clear();
}
errors = v.validate();
if (!errors.isEmpty()) {
logger.info("has errors");
StudyBean study = createStudyBean();
session.setAttribute("newStudy", study);
request.setAttribute("formMessages", errors);
session.setAttribute("changed", changes);
forwardPage(Page.UPDATE_SUB_STUDY);
} else {
for (EventDefinitionCRFBean toBeCreated : toBeCreatedEventDefBean) {
toBeCreated.setParentId(toBeCreated.getId());
edcdao.create(toBeCreated);
}
for (EventDefinitionCRFBean toBeUpdated : toBeUpdatedEventDefBean) {
edcdao.update(toBeUpdated);
}
}
}
Aggregations