/*
* The contents of this file are subject to the terms of the Common Development and
* Distribution License (the License). You may not use this file except in compliance with the
* License.
*
* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
* specific language governing permission and limitations under the License.
*
* When distributing Covered Software, include this CDDL Header Notice in each file and include
* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
* Header, with the fields enclosed by brackets [] replaced by your own identifying
* information: "Portions copyright [year] [name of copyright owner]".
*
* Copyright 2013-2015 ForgeRock Inc.
*/
package org.forgerock.openidm.servletregistration.impl;
import static org.forgerock.openidm.servletregistration.ServletRegistration.SERVLET_FILTER_SYSTEM_PROPERTIES;
import java.util.HashMap;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.forgerock.json.JsonValue;
import org.forgerock.openidm.config.enhanced.EnhancedConfig;
import org.forgerock.openidm.servletregistration.RegisteredFilter;
import org.forgerock.openidm.servletregistration.ServletRegistration;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Takes configuration to register and de-register configured servlet filters,
* with support to load the filter or supporting classes off a defined class path.
*
*/
@Component(
name = "org.forgerock.openidm.servletfilter",
immediate = true,
policy = ConfigurationPolicy.REQUIRE,
configurationFactory=true
)
public class ServletFilterConfiguration {
private final static Logger logger = LoggerFactory.getLogger(ServletFilterConfiguration.class);
// Handle to registered servlet filter
private RegisteredFilter registeredFilter;
// Original setting of system properties
Map<String, String> origSystemProperties = new HashMap<String, String>();
@Reference(
name = "ref_ServletFilterRegistration",
referenceInterface = ServletRegistration.class,
policy = ReferencePolicy.DYNAMIC,
cardinality = ReferenceCardinality.MANDATORY_UNARY
)
private ServletRegistration servletFilterRegistration;
/** Enhanced configuration service. */
@Reference(policy = ReferencePolicy.DYNAMIC)
private EnhancedConfig enhancedConfig;
/**
* Parses the servlet filter configuration and registers a servlet filter in OSGi.
*
* @param context The ComponentContext.
* @throws Exception If a problem occurs whilst registering the filter.
*/
@Activate
protected synchronized void activate(ComponentContext context) throws Exception {
logger.info("Activating servlet registrator with configuration {}", context.getProperties());
JsonValue config = enhancedConfig.getConfigurationAsJson(context);
logger.debug("Parsed servlet filter config: {}", config);
registeredFilter = servletFilterRegistration.registerFilter(config);
logger.info("Successfully registered servlet filter {}", context.getProperties());
origSystemProperties = new HashMap<String, String>();
JsonValue rawSystemProperties = config.get(SERVLET_FILTER_SYSTEM_PROPERTIES);
for (String key : rawSystemProperties.keys()) {
String prev = System.setProperty(key, rawSystemProperties.get(key).asString());
// null value is used to keep track of properties that weren't set before
origSystemProperties.put(key, prev);
}
}
/**
* De-registers the corresponding servlet filter.
*
* @param context The ComponentContext.
*/
@Deactivate
protected synchronized void deactivate(ComponentContext context) {
if (registeredFilter != null) {
try {
servletFilterRegistration.unregisterFilter(registeredFilter);
logger.info("Unregistered servlet filter {}.", context.getProperties());
} catch (Exception ex) {
logger.warn("Failure reported during unregistering of servlet filter {}: {}",
new Object[]{context.getProperties(), ex.getMessage(), ex});
}
}
// Restore the system properties before this config was applied
for (String key : origSystemProperties.keySet()) {
String val = origSystemProperties.get(key);
if (val == null) {
System.clearProperty(key);
} else {
System.setProperty(key, val);
}
}
logger.debug("Deactivated {}", context);
}
}