1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest/*
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * The contents of this file are subject to the terms of the Common Development and
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * Distribution License (the License). You may not use this file except in compliance with the
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * License.
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest *
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * specific language governing permission and limitations under the License.
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest *
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * When distributing Covered Software, include this CDDL Header Notice in each file and include
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * Header, with the fields enclosed by brackets [] replaced by your own identifying
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * information: "Portions copyright [year] [name of copyright owner]".
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest *
643f61a35863b4b796e636f959c8a4a86cfc02ceAndrew Forrest * Copyright 2013-2014 ForgeRock Inc.
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest */
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrestpackage org.forgerock.openam.entitlement.utils.indextree.treenodes;
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrestimport org.forgerock.openam.entitlement.utils.indextree.nodecontext.ContextKey;
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrestimport org.forgerock.openam.entitlement.utils.indextree.nodecontext.SearchContext;
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest/**
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest * Wildcard tree node that will match any character except for '#' and '?',
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest * and any character where the previous character was a '/'.
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest *
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest * @author apforrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest */
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrestpublic class SingleWildcardNode extends BasicTreeNode {
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest public static final char WILDCARD = '^';
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest @Override
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest public char getNodeValue() {
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest return WILDCARD;
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest }
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest @Override
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest public boolean isWildcard() {
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest return true;
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest }
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest @Override
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest public boolean hasInterestIn(char value, SearchContext context) {
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest if (value == '?' || value == '#') {
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest // Ignore illegal character unless it is the last character.
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest return context.has(ContextKey.LAST_CHARACTER);
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest }
5375fb13cf3928b16586743744d88bd5fd7d8c37Andrew Forrest
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest if (context.has(ContextKey.LEVEL_REACHED)) {
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest // Next URL level reached, so no longer interested.
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest context.remove(ContextKey.LEVEL_REACHED);
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest return false;
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest }
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest if (value == '/') {
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest // Make a note that the end of a URL level has been reached.
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest context.add(ContextKey.LEVEL_REACHED, Boolean.TRUE);
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest return true;
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest }
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest return true;
c47136e8a98bb41be602220218123bff252b8d4aAndrew Forrest }
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest
1351c9607d0f3eb5f61b8c90cf53b997dc7744b7Andrew Forrest}