/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.configuration.extender.internal;
import com.liferay.portal.configuration.extender.ConfigurationDescription;
import com.liferay.portal.configuration.extender.ConfigurationDescriptionFactory;
import com.liferay.portal.configuration.extender.FactoryConfigurationDescription;
import com.liferay.portal.configuration.extender.NamedConfigurationContent;
import com.liferay.portal.configuration.extender.SingleConfigurationDescription;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Supplier;
import java.io.IOException;
import java.util.Collection;
import java.util.Dictionary;
import org.apache.felix.utils.extender.Extension;
import org.apache.felix.utils.log.Logger;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
/**
* @author Carlos Sierra Andrés
*/
public class ConfiguratorExtension implements Extension {
public ConfiguratorExtension(
ConfigurationAdmin configurationAdmin, Logger logger, String namespace,
Collection<NamedConfigurationContent> namedConfigurationContents,
Collection<ConfigurationDescriptionFactory>
configurationDescriptionFactories) {
_configurationAdmin = configurationAdmin;
_logger = logger;
_namespace = namespace;
_configurationContents = namedConfigurationContents;
_configurationDescriptionFactories = configurationDescriptionFactories;
}
@Override
public void destroy() throws Exception {
}
@Override
public void start() throws Exception {
for (NamedConfigurationContent namedConfigurationContent :
_configurationContents) {
try {
_createConfiguration(namedConfigurationContent);
}
catch (IOException ioe) {
continue;
}
}
}
private boolean _configurationExists(String filter)
throws InvalidSyntaxException, IOException {
Configuration[] configurations = _configurationAdmin.listConfigurations(
filter);
if (ArrayUtil.isNotEmpty(configurations)) {
return true;
}
return false;
}
private void _createConfiguration(
NamedConfigurationContent namedConfigurationContent)
throws Exception {
for (ConfigurationDescriptionFactory configurationDescriptionFactory :
_configurationDescriptionFactories) {
ConfigurationDescription configurationDescription =
configurationDescriptionFactory.create(
namedConfigurationContent);
if (configurationDescription == null) {
continue;
}
if (configurationDescription instanceof
FactoryConfigurationDescription) {
_process(
(FactoryConfigurationDescription)configurationDescription);
}
else if (configurationDescription instanceof
SingleConfigurationDescription) {
_process(
(SingleConfigurationDescription)configurationDescription);
}
else {
_logger.log(
Logger.LOG_ERROR,
configurationDescriptionFactory + " returned an " +
"unsupported configuration description " +
configurationDescription);
}
}
}
private void _process(
FactoryConfigurationDescription factoryConfigurationDescription)
throws InvalidSyntaxException, IOException {
String factoryPid = factoryConfigurationDescription.getFactoryPid();
String pid = factoryConfigurationDescription.getPid();
String configuratorURL = _namespace + "#" + pid;
if (_configurationExists(
"(configurator.url=" + configuratorURL + ")")) {
return;
}
Configuration configuration =
_configurationAdmin.createFactoryConfiguration(
factoryPid, StringPool.QUESTION);
Dictionary<String, Object> properties = null;
Supplier<Dictionary<String, Object>> propertiesSupplier =
factoryConfigurationDescription.getPropertiesSupplier();
try {
properties = propertiesSupplier.get();
}
catch (Throwable t) {
_logger.log(
Logger.LOG_WARNING,
"Supplier from factory configuration description " +
factoryConfigurationDescription + " threw an exception: ",
t);
return;
}
properties.put("configurator.url", configuratorURL);
configuration.update(properties);
}
private void _process(SingleConfigurationDescription description)
throws InvalidSyntaxException, IOException {
String pid = description.getPid();
if (_configurationExists("(service.pid=" + pid + ")")) {
return;
}
Configuration configuration = _configurationAdmin.getConfiguration(
pid, StringPool.QUESTION);
Dictionary<String, Object> properties = null;
Supplier<Dictionary<String, Object>> propertiesSupplier =
description.getPropertiesSupplier();
try {
properties = propertiesSupplier.get();
}
catch (Throwable t) {
_logger.log(
Logger.LOG_WARNING,
"Supplier from description " + description + " threw an " +
"exception: ",
t);
return;
}
configuration.update(properties);
}
private final ConfigurationAdmin _configurationAdmin;
private final Collection<NamedConfigurationContent> _configurationContents;
private final Collection<ConfigurationDescriptionFactory>
_configurationDescriptionFactories;
private final Logger _logger;
private final String _namespace;
}