/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
*
* Copyright 2003-2008 Akaza Research
*/
package org.akaza.openclinica.logic.expressionTree;
import java.util.TimeZone;
import org.akaza.openclinica.bean.core.ItemDataType;
import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean;
import org.akaza.openclinica.bean.submit.ItemBean;
import org.akaza.openclinica.domain.rule.expression.ExpressionObjectWrapper;
import org.akaza.openclinica.exception.OpenClinicaSystemException;
import org.akaza.openclinica.service.rule.expression.ExpressionService;
import org.joda.time.DateMidnight;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
/**
* @author Krikor Krumlian
*
*/
public class OpenClinicaVariableNode extends ExpressionNode {
String number;
ExpressionService expressionService;
ExpressionObjectWrapper expressionWrapper;
private final String STARTDATE =".STARTDATE";
private final String STATUS =".STATUS";
private final String REPEATING = ".*\\[(END|ALL|[1-9]\\d*)\\]$";
private final String REPEATING_NOALL = ".*\\[(END|[1-9]\\d*)\\]$";
OpenClinicaVariableNode(String val) {
number = val;
// validate();
}
OpenClinicaVariableNode(String val, ExpressionObjectWrapper expressionWrapper) {
this.expressionWrapper = expressionWrapper;
number = val;
// validate();
}
OpenClinicaVariableNode(String val, ExpressionObjectWrapper expressionWrapper, OpenClinicaExpressionParser parser) {
setExpressionParser(parser);
this.expressionWrapper = expressionWrapper;
number = val;
// validate();
}
@Override
String getNumber() {
return number;
}
/**
*
* getTestValues() returns a hashMap of user defined values
* getResponseTestValues() is empty and will be filled with variables being processed
* @param var the default test value
* @return the Value
*/
private String theTest(String var) {
if (getTestValues() == null) {
return var;
} else if (getTestValues().get(number) == null) {
getTestValues().put(number, var);
getResponseTestValues().put(number, var);
return var;
} else {
getResponseTestValues().put(number, getTestValues().get(number));
return getTestValues().get(number);
}
}
@Override
String testCalculate() throws OpenClinicaSystemException {
validate();
String variableValue = testCalculateVariable();
boolean isEventStatusParamExist = number.endsWith(STATUS);
boolean isEventStartDateParamExist = number.endsWith(STARTDATE) ;
boolean isEventStartDateAndStatusParamExist = (number.endsWith(STARTDATE) ||number.endsWith(STATUS));
if (variableValue != null) {
return variableValue;
}
ItemBean item = getExpressionService().getItemBeanFromExpression(number);
String testString = "test";
String testInt = "1";
String testBoolean = "true";
String testDate = "2008-01-01";
String testPDate = "";
if (item != null) {
ItemDataType itemDataType = ItemDataType.get(item.getItemDataTypeId());
switch (itemDataType.getId()) {
case 1: {
return theTest(testBoolean);
}
case 2: {
return theTest(testBoolean);
}
case 3: {
return theTest(testString);
}
case 4: {
return theTest(testString);
}
case 5: {
return theTest(testString);
}
case 6: {
return theTest(testInt);
}
case 7: {
return theTest(testInt);
}
case 8: {
return theTest(testString);
}
case 9: {
return theTest(testDate);
}
case 10: {
return theTest(testPDate);
}
case 11: {
return theTest(testString + ".txt");
}
default:
throw new OpenClinicaSystemException("OCRERR_0011");
}
} else if(isEventStartDateAndStatusParamExist) {
if(isEventStatusParamExist) return theTest(testString);
else if(isEventStartDateParamExist) return theTest(testDate);
else return null;
} else {
throw new OpenClinicaSystemException("OCRERR_0012", new String[] { number });
}
}
@Override
Object calculate() throws OpenClinicaSystemException {
// The value of the node is the number that it contains.
// return number;
validate();
String variableValue = calculateVariable();
if (variableValue != null) {
return variableValue;
}
return getExpressionService().evaluateExpression(number);
}
void validate() throws OpenClinicaSystemException {
// logger.info(number + " : " +
// getExpressionService().checkSyntax(number));
if (calculateVariable() != null) {
// logger.info("e" + expressionWrapper.getRuleSet());
}else if((expressionWrapper.getRuleSet() != null) && (getExpressionService().checkIfExpressionIsForScheduling(expressionWrapper.getRuleSet().getTarget().getValue())) && !number.endsWith(STARTDATE) && !number.endsWith(STATUS)) {
System.out.println("the Target value is " + expressionWrapper.getRuleSet().getTarget().getValue());
System.out.println("the number is " + number );
throw new OpenClinicaSystemException("OCRERR_0046", new Object[] { number });
}else if (!getExpressionService().ruleExpressionChecker(number)) {
logger.info("Go down");
throw new OpenClinicaSystemException("OCRERR_0013", new Object[] { number });
}
if (number.endsWith(STARTDATE) ||number.endsWith(STATUS))
validateEvent();
}
void validateEvent() throws OpenClinicaSystemException {
StudyEventDefinitionBean studyEventDefinition = getExpressionService().getStudyEventDefinitionFromExpressionForEventScheduling(number);
String studyEventOID = number.split("\\.")[0];
String expressionContext = expressionWrapper.getExpressionContext();
//Verify expression refers to a valid event.
if (studyEventDefinition == null) throw new OpenClinicaSystemException("OCRERR_0034", new String[] { number });
//Verify expression doesn't use repeating event notation if event is not repeating
if (!studyEventDefinition.isRepeating() && studyEventOID.matches(REPEATING))
throw new OpenClinicaSystemException("OCRERR_0039", new String[] { number });
//Verify only Target expressions use the 'ALL' repeating notation.
if (expressionContext != null && !expressionContext.equals(ExpressionObjectWrapper.CONTEXT_TARGET) ) {
if (studyEventOID.matches(REPEATING) && !studyEventOID.matches(REPEATING_NOALL))
throw new OpenClinicaSystemException("OCRERR_0040", new String[] { number });
}
}
private String calculateVariable() {
if (number.equals("_CURRENT_DATE")) {
String ssZoneId= getExpressionService().getSSZoneId();
String serverZoneId =TimeZone.getDefault().getID();
return getExpressionService().getSSDate(ssZoneId,serverZoneId).get("ssDate");
}
return null;
}
private String testCalculateVariable() {
if (number.equals("_CURRENT_DATE")) {
String ssZoneId= getExpressionService().getSSZoneId();
String serverZoneId =TimeZone.getDefault().getID();
return getExpressionService().getSSDate(ssZoneId,serverZoneId).get("ssDate");
}
return null;
}
@Override
void printStackCommands() {
// On a stack machine, just push the number onto the stack.
logger.info(" Push " + number);
}
private ExpressionService getExpressionService() {
expressionService = this.expressionService != null ? expressionService : new ExpressionService(expressionWrapper);
return expressionService;
}
}