331c327f500d45223e8ad933fd4472740a75aeeachad.kienle/**
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle *
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * Copyright 2011-2015 ForgeRock AS. All Rights Reserved
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle *
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * The contents of this file are subject to the terms
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * of the Common Development and Distribution License
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * (the License). You may not use this file except in
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * compliance with the License.
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle *
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * You can obtain a copy of the License at
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * http://forgerock.org/license/CDDLv1.0.html
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * See the License for the specific language governing
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * permission and limitations under the License.
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle *
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * When distributing Covered Code, include this CDDL
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * Header Notice in each file and include the License file
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * at http://forgerock.org/license/CDDLv1.0.html
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * If applicable, add the following below the CDDL Header,
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * with the fields enclosed by brackets [] replaced by
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * your own identifying information:
331c327f500d45223e8ad933fd4472740a75aeeachad.kienle * "Portions Copyrighted [year] [name of copyright owner]"
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle *
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle */
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienlepackage org.forgerock.openidm.config.installer;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport java.util.ArrayList;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport java.util.List;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
331c327f500d45223e8ad933fd4472740a75aeeachad.kienleimport org.forgerock.json.JsonPointer;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.forgerock.openidm.config.crypto.ConfigCrypto;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.forgerock.openidm.metadata.impl.ProviderListener;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.forgerock.openidm.metadata.MetaDataProvider;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.forgerock.openidm.metadata.WaitForMetaData;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.slf4j.Logger;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienleimport org.slf4j.LoggerFactory;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle/**
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * Handles configuration that needs to wait for related meta-data to become available
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * (e.g. for encryption) before it can be provided to OSGi
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle */
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienlepublic class DelayedConfigHandler implements ProviderListener {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle final static Logger logger = LoggerFactory.getLogger(DelayedConfigHandler.class);
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle ConfigCrypto configCrypto;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle List<DelayedConfig> delayedConfigs = new ArrayList<DelayedConfig>();
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle /**
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * {@inheritDoc}
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle */
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle public void init(ConfigCrypto configCrypto) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle this.configCrypto = configCrypto;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle /**
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * Add a configuration to the delayed pool
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle *
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * @param config the configuration to handle when new meta-data becomes available
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle */
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle public void addConfig(DelayedConfig config) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle delayedConfigs.add(config);
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle /**
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle * Detects changed meta data providers
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle */
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle public void addedProvider(Object originId, MetaDataProvider provider) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle for (DelayedConfig config : delayedConfigs) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle if (configCrypto != null) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle List<JsonPointer> props = null;
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle try {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle props = config.configCrypto.getPropertiesToEncrypt(config.pidOrFactory, config.factoryAlias, config.parsedConfig);
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle try {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle // Meta data now found, handle it
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle config.configInstaller.setConfig(config.newConfig, new String[] {config.pidOrFactory, config.factoryAlias}, config.file);
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle } catch (Exception ex) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle logger.warn("Setting delayed configuration failed for {} {}", new Object[] {config.pidOrFactory, config.factoryAlias, ex});
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle } catch (WaitForMetaData ex) {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle // Still not available for this config, leave it in delayed config
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle logger.trace("Still no meta data provider for {}-{}", config.pidOrFactory, config.factoryAlias );
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle } else {
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle logger.warn("Provider change received before DelayedConfigHandler properly initialized");
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle }
bdcef189d83ab13d06dde11499a03b16cdb5b432Chad Kienle}