/************************************************************************************** * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package com.espertech.esper.epl.view; import com.espertech.esper.core.context.util.AgentInstanceContext; import com.espertech.esper.epl.expression.ExprValidationException; import com.espertech.esper.epl.spec.OutputLimitRateType; import com.espertech.esper.epl.spec.OutputLimitSpec; import com.espertech.esper.epl.variable.VariableReader; import com.espertech.esper.util.JavaClassHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Factory for output condition instances that are polled/queried only. */ public class OutputConditionPolledFactory { private static final Log log = LogFactory.getLog(OutputConditionPolledFactory.class); /** * Creates an output condition instance. * @param outputLimitSpec specifies what kind of condition to create * @return instance for handling output condition */ public static OutputConditionPolled createCondition(OutputLimitSpec outputLimitSpec, AgentInstanceContext agentInstanceContext) throws ExprValidationException { if(outputLimitSpec == null) { throw new NullPointerException("Output condition by count requires a non-null callback"); } // Check if a variable is present VariableReader reader = null; if (outputLimitSpec.getVariableName() != null) { reader = agentInstanceContext.getStatementContext().getVariableService().getReader(outputLimitSpec.getVariableName()); if (reader == null) { throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' has not been declared"); } } if(outputLimitSpec.getRateType() == OutputLimitRateType.CRONTAB) { return new OutputConditionPolledCrontab(outputLimitSpec.getCrontabAtSchedule(), agentInstanceContext); } else if(outputLimitSpec.getRateType() == OutputLimitRateType.WHEN_EXPRESSION) { return new OutputConditionPolledExpression(outputLimitSpec.getWhenExpressionNode(), outputLimitSpec.getThenExpressions(), agentInstanceContext); } else if(outputLimitSpec.getRateType() == OutputLimitRateType.EVENTS) { if (log.isDebugEnabled()) { log.debug(".createCondition creating OutputConditionCount with event rate " + outputLimitSpec); } if ((reader != null) && (!JavaClassHelper.isNumericNonFP(reader.getType()))) { throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' must be type integer, long or short"); } int rate = -1; if (outputLimitSpec.getRate() != null) { rate = outputLimitSpec.getRate().intValue(); } return new OutputConditionPolledCount(rate, reader); } else { if ((reader != null) && (!JavaClassHelper.isNumeric(reader.getType()))) { throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' must be of numeric type"); } return new OutputConditionPolledTime(outputLimitSpec.getTimePeriodExpr(), agentInstanceContext); } } }