/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2013 ForgeRock AS. */ package com.forgerock.opendj.grizzly; import org.glassfish.grizzly.Processor; import org.glassfish.grizzly.filterchain.Filter; import org.glassfish.grizzly.filterchain.FilterChain; import org.glassfish.grizzly.filterchain.FilterChainBuilder; import org.glassfish.grizzly.filterchain.TransportFilter; import org.glassfish.grizzly.ssl.SSLFilter; /** * Common utility methods. */ final class GrizzlyUtils { /** * Build a filter chain from the provided processor if possible and the * provided filter. *

* If the provided processor can't be used for building the new filter * chain, then a chain with only a {@code TransportFilter} is used as a base * chain. * * @param processor * processor to build the filter chain from. If the processor is * not a filter chain (for example, it can be a * {@code StandaloneProcessor} then it is ignored to build the * returned filter chain * @param filter * filter to add at the end of the filter chain * @return a new filter chain, based on the provided processor if processor * is a {@code FilterChain}, and having the provided filter as the * last filter */ public static FilterChain buildFilterChain(Processor processor, Filter filter) { if (processor instanceof FilterChain) { return FilterChainBuilder.stateless().addAll((FilterChain) processor).add(filter).build(); } else { return FilterChainBuilder.stateless().add(new TransportFilter()).add(filter).build(); } } /** * Adds a filter to filter chain registered with the given connection. *

* For a non-SSL filter, filter is added at the last position before the * LDAP filter. *

* For a SSL filter, filter is added before any * {@code ConnectionSecurityLayerFilter} which is already present in the * filter chain. * * @param filter * filter to add * @param connection * connection to update with the new filter chain containing the * provided filter */ public static void addFilterToConnection(final Filter filter, org.glassfish.grizzly.Connection connection) { final FilterChain currentChain = (FilterChain) connection.getProcessor(); final FilterChain newChain = addFilterToChain(filter, currentChain); connection.setProcessor(newChain); } /** * Adds a filter to a filter chain. *

* For a non-SSL filter, filter is added at the last position before the * LDAP filter. *

* For a SSL filter, filter is added before any * {@code ConnectionSecurityLayerFilter} which is already present in the * filter chain. * * @param filter * filter to add * @param chain * initial filter chain * @return a new filter chain which includes the provided filter */ public static FilterChain addFilterToChain(final Filter filter, final FilterChain chain) { // By default, before LDAP filter which is the last one int indexToAddFilter = chain.size() - 1; if (filter instanceof SSLFilter) { // Before any ConnectionSecurityLayerFilters if present for (int i = chain.size() - 2; i >= 0; i--) { if (!(chain.get(i) instanceof ConnectionSecurityLayerFilter)) { indexToAddFilter = i + 1; break; } } } return FilterChainBuilder.stateless().addAll(chain).add(indexToAddFilter, filter).build(); } // Prevent instantiation. private GrizzlyUtils() { // No implementation required. } }