/** * Copyright 2012 Universitat Pompeu Fabra. * * 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 * * 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 org.onexus.website.api.utils.visible; import org.apache.commons.collections.Predicate; import org.apache.commons.lang3.StringUtils; import org.onexus.resource.api.ORI; import org.onexus.website.api.pages.browser.IEntitySelection; import org.onexus.website.api.utils.parser.BooleanExpressionEvaluator; import java.util.Collection; public class VisiblePredicate implements Predicate { private ORI parentURI; private Collection<IEntitySelection> filters; public VisiblePredicate(ORI parentURI, Collection<IEntitySelection> filters) { super(); this.parentURI = parentURI; this.filters = filters; } @Override public boolean evaluate(Object object) { if (object == null) { return true; } String visibleQuery; if (object instanceof IVisible) { visibleQuery = ((IVisible) object).getVisible(); } else { visibleQuery = object.toString(); } if (StringUtils.isEmpty(visibleQuery)) { return true; } // Remove the help message if it's present int msg = visibleQuery.indexOf("::"); if (msg != -1) { visibleQuery = visibleQuery.substring(0, msg).trim(); } else { visibleQuery = visibleQuery.trim(); } if (visibleQuery.equalsIgnoreCase("true")) { return true; } if (visibleQuery.equalsIgnoreCase("NOT true")) { return false; } if (visibleQuery.equalsIgnoreCase("false")) { return false; } if (visibleQuery.equalsIgnoreCase("NOT false")) { return true; } // Use only single character operators. String normalizedQuery = visibleQuery .replace("NOT", "!") .replace("AND", ",") .replace("OR", "|") .replaceAll("\\s", ""); BooleanExpressionEvaluator evaluator = new BooleanExpressionEvaluator(normalizedQuery) { @Override protected boolean evaluateToken(String token) { VisibleRule rule = new VisibleRule(parentURI, token); boolean matchAnyFilter = false; for (IEntitySelection filter : filters) { if (filter.match(rule)) { matchAnyFilter = true; break; } } return matchAnyFilter; } }; return evaluator.evaluate(); } public static String getMessage(IVisible visible) { String visibleQuery = visible.getVisible(); int msg = visibleQuery.indexOf("::"); if (msg != -1) { return visibleQuery.substring(msg + 2).trim(); } return ""; } }