/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package org.ebayopensource.turmeric.policyservice.model;
import org.ebayopensource.turmeric.utils.jpa.AbstractDAO;
/**
* The Class RuleDAOImpl.
*
* @author muguerza
*/
public class RuleDAOImpl extends AbstractDAO implements RuleDAO {
public static final String IP_REG_EXPRESSION = "^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})";
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#persistRule(org.ebayopensource.turmeric.policyservice.model.Rule)
*/
@Override
public void persistRule(Rule rule) {
persistEntity(rule);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#persistCondition(org.ebayopensource.turmeric.policyservice.model.Condition)
*/
@Override
public void persistCondition(Condition condition) {
persistEntity(condition);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#persistExpression(org.ebayopensource.turmeric.policyservice.model.Expression)
*/
@Override
public void persistExpression(Expression expression) {
persistEntity(expression);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#persistPrimitiveValue(org.ebayopensource.turmeric.policyservice.model.PrimitiveValue)
*/
@Override
public void persistPrimitiveValue(PrimitiveValue primitiveValue) {
persistEntity(primitiveValue);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findRuleById(long)
*/
@Override
public Rule findRuleById(long id) {
return findEntity(Rule.class, id);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findConditionById(long)
*/
@Override
public Condition findConditionById(long conditionId) {
return findEntity(Condition.class, conditionId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findExpressionById(long)
*/
@Override
public Expression findExpressionById(long expressionId) {
return findEntity(Expression.class, expressionId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findPrimitiveValueById(long)
*/
@Override
public PrimitiveValue findPrimitiveValueById(long primitiveValueId) {
return findEntity(PrimitiveValue.class, primitiveValueId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findConditionByRuleId(long)
*/
@Override
public Condition findConditionByRuleId(long ruleId) {
Rule rule = findRuleById(ruleId);
if (rule != null && rule.getCondition() != null) {
return rule.getCondition();
}
return null;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findExpressionByConditionId(long)
*/
@Override
public Expression findExpressionByConditionId(long conditionId) {
Condition condition = findConditionById(conditionId);
if (condition != null && condition.getExpression() != null) {
return condition.getExpression();
}
return null;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findPrimitiveValueByExpressionId(long)
*/
@Override
public PrimitiveValue findPrimitiveValueByExpressionId(long expressionId) {
Expression expression = findExpressionById(expressionId);
if (expression != null && expression.getPrimitiveValue() != null) {
return expression.getPrimitiveValue();
}
return null;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findExpressionByName(java.lang.String)
*/
@Override
public Expression findExpressionByName(String expressionName) {
return getSingleResultOrNull(Expression.class, "name", expressionName);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#removeRule(long)
*/
@Override
public void removeRule(long ruleId) {
removeEntity(Rule.class, ruleId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#removePrimitiveValue(long)
*/
@Override
public void removePrimitiveValue(long primitiveValueId) {
removeEntity(PrimitiveValue.class, primitiveValueId);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#findRuleByName(java.lang.String)
*/
@Override
public Rule findRuleByName(String name) {
return getSingleResultOrNull(Rule.class, "ruleName", name);
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#isRuleNameUsed(java.lang.String)
*/
@Override
public boolean isRuleNameUsed(String ruleName) {
return findRuleByName(ruleName) != null;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policyservice.model.RuleDAO#isRuleValid(org.ebayopensource.turmeric.policyservice.model.Rule, boolean)
*/
@Override
public boolean isRuleValid(Rule rule,boolean allowNull) {
// value should not be null as well as the type
// rulename required
boolean valid = false;
if(rule != null
&& rule.getCondition() != null
&& rule.getCondition().getExpression() != null
&& rule.getCondition().getExpression().getPrimitiveValue() != null
&& rule.getCondition().getExpression().getPrimitiveValue() != null
&& rule.getCondition().getExpression().getPrimitiveValue()
.getValue() != null
&& rule.getCondition().getExpression().getPrimitiveValue()
.getValue().length() > 0
&& rule.getCondition().getExpression().getPrimitiveValue()
.getType() != null
&& (rule.getRuleName() != null || rule.getRuleName().length() != 0)
){
String conditionRule = rule.getCondition().getExpression().getPrimitiveValue().getValue();
valid = isValidStructure(conditionRule);
}
return valid;
}
private boolean isValidStructure(final String conditionRule) {
boolean flag = true;
if (conditionRule != null) {
String[] operands;
if (conditionRule.contains("||")) {
operands = conditionRule.split("\\|\\|");
for (String operand : operands) {
operand = operand.trim();
if ( validateWithRegExpr(operand)) {
return false;
}
}
}else{
if (conditionRule.contains("&&")) {
operands = conditionRule.split("\\&\\&");
for (String operand : operands) {
operand = operand.trim();
if ( validateWithRegExpr(operand)) {
return false;
}
}
}else if ( validateWithRegExpr(conditionRule)) {
return false;
}
}
}
return flag;
}
private boolean validateWithRegExpr(final String conditionRule) {
return ! (conditionRule.trim().matches("\\w+(:\\w+)?.count(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+") ||
conditionRule.trim().matches("\\w+:\\w+.SubjectGroup.count(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+") ||
conditionRule.trim().matches("\\w+:\\w+.SubjectGroup.Subject.count(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+") ||
conditionRule.trim().matches("\\w+:hits(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+") ||
conditionRule.trim().matches(IP_REG_EXPRESSION + ":hits(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+") ||
conditionRule.trim().matches("HITS(\\s)?(>=|==|<|=>|>|<=|=<)(\\s)?[0-9]+")) ||
! isValidCondition(conditionRule);
}
private boolean isValidCondition(final String value) {
boolean flag =false;
if( value!=null ){
String[] expression = {">","<" ,"==" ,"=>",">=","<=","=<"};
String[] words;
for(String val:expression){
if(value ==null){
break;
}
if (value.contains(val)) {
words = value.split(val);
if(words[1]!=null){
words[1] = words[1].trim();
}
if(words[0]!=null){
words[0] = words[0].trim();
}
try{
Integer.valueOf(words[0]);
flag = true;
}catch (NumberFormatException e) {
try{
Integer.valueOf(words[1].trim());
flag = true;
}catch (NumberFormatException e1) {
}
}
}
}
}
return flag;
}
}