/*
* Copyright (c) 2014 Globo.com - ATeam
* All rights reserved.
*
* This source is subject to the Apache License, Version 2.0.
* Please see the LICENSE file for more information.
*
* Authors: See AUTHORS file
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.globo.galeb.criteria.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import com.globo.galeb.criteria.ICriterion;
import com.globo.galeb.entity.impl.frontend.NullRule;
import com.globo.galeb.entity.impl.frontend.Rule;
import com.globo.galeb.logger.SafeLogger;
import org.vertx.java.core.http.HttpServerRequest;
/**
* Class RulesCriterion.
*
* @author See AUTHORS file.
* @version 1.0.0, Nov 10, 2014.
* @param <T> the generic type
*/
public class RulesCriterion implements ICriterion<Rule> {
/** The log. */
private SafeLogger log = null;
/** The map. */
private Map<String, Rule> map = null;
/** The rule list */
private List<Rule> ruleList = new ArrayList<>();
/** The request match. */
private RequestMatch requestMatch;
/* (non-Javadoc)
* @see com.globo.galeb.criteria.ICriterion#setLog(org.vertx.java.core.logging.Logger)
*/
@Override
public ICriterion<Rule> setLog(final SafeLogger logger) {
log = logger;
return this;
}
/* (non-Javadoc)
* @see com.globo.galeb.criteria.ICriterion#given(java.util.Map)
*/
@Override
public ICriterion<Rule> given(final Map<String, Rule> map) {
this.map = map;
ruleList.addAll(map.values());
Collections.sort(ruleList);
return this;
}
/* (non-Javadoc)
* @see com.globo.galeb.criteria.ICriterion#when(java.lang.Object)
*/
@Override
public ICriterion<Rule> when(final Object param) {
if (param instanceof HttpServerRequest) {
requestMatch = new RequestMatch((HttpServerRequest)param);
} else {
if (log==null) {
log = new SafeLogger();
}
log.warn(String.format("Param is instance of %s.class. Expected %s.class",
param.getClass().getSimpleName(), HttpServerRequest.class.getSimpleName()));
}
return this;
}
/* (non-Javadoc)
* @see com.globo.galeb.criteria.ICriterion#thenGetResult()
*/
@Override
public Rule thenGetResult() {
Rule ruleDefault = null;
if (ruleList.isEmpty()) {
ruleList.addAll(map.values());
Comparator<? super Rule> comparator = new Comparator<Rule>() {
@Override
public int compare(Rule r1, Rule r2) {
return r1.getPriorityOrder()-r2.getPriorityOrder();
}
};
Collections.sort(ruleList, comparator);
}
for (Rule rule: ruleList) {
if (rule==null) {
continue;
}
if (ruleDefault==null && rule.isRuleDefault()) {
ruleDefault = rule;
}
if (rule.isMatchWith(requestMatch)) {
return rule;
}
}
if (ruleDefault!=null) {
if (log==null) {
log = new SafeLogger();
}
log.debug(String.format("Calling default rule %s [%s]", ruleDefault.getId(), ruleDefault.getClass().getSimpleName()));
return ruleDefault;
}
return new NullRule();
}
/* (non-Javadoc)
* @see com.globo.galeb.criteria.ICriterion#action(com.globo.galeb.criteria.ICriterion.CriterionAction)
*/
@Override
public ICriterion<Rule> action(ICriterion.CriterionAction criterionAction) {
switch (criterionAction) {
case RESET_REQUIRED:
ruleList.clear();
break;
default:
break;
}
return this;
}
}