/**
* 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.module.configuration.internal;
import aQute.bnd.annotation.metatype.Meta;
import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.PortletInstance;
import com.liferay.portal.kernel.module.configuration.ConfigurationException;
import com.liferay.portal.kernel.module.configuration.ConfigurationProvider;
import com.liferay.portal.kernel.settings.CompanyServiceSettingsLocator;
import com.liferay.portal.kernel.settings.GroupServiceSettingsLocator;
import com.liferay.portal.kernel.settings.PortletInstanceSettingsLocator;
import com.liferay.portal.kernel.settings.Settings;
import com.liferay.portal.kernel.settings.SettingsException;
import com.liferay.portal.kernel.settings.SettingsFactory;
import com.liferay.portal.kernel.settings.SettingsLocator;
import com.liferay.portal.kernel.settings.SystemSettingsLocator;
import com.liferay.portal.kernel.settings.TypedSettings;
import com.liferay.portal.kernel.util.Validator;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Jürgen Kappler
* @author Jorge Ferrer
*/
@Component(immediate = true, service = ConfigurationProvider.class)
public class ConfigurationProviderImpl implements ConfigurationProvider {
@Override
public <T> T getCompanyConfiguration(Class<T> clazz, long companyId)
throws ConfigurationException {
String settingsId = _getSettingsId(clazz);
String configurationPid = _getConfigurationPid(clazz);
return getConfiguration(
clazz,
new CompanyServiceSettingsLocator(
companyId, settingsId, configurationPid));
}
@Override
public <T> T getConfiguration(
Class<T> clazz, SettingsLocator settingsLocator)
throws ConfigurationException {
try {
Class<?> configurationOverrideClass = getOverrideClass(clazz);
Object configurationOverrideInstance = null;
Settings settings = _settingsFactory.getSettings(settingsLocator);
TypedSettings typedSettings = new TypedSettings(settings);
if (configurationOverrideClass != null) {
Constructor<?> constructor =
configurationOverrideClass.getConstructor(
TypedSettings.class);
configurationOverrideInstance = constructor.newInstance(
typedSettings);
}
ConfigurationInvocationHandler<T> configurationInvocationHandler =
new ConfigurationInvocationHandler<>(
clazz, configurationOverrideInstance, typedSettings);
return configurationInvocationHandler.createProxy();
}
catch (IllegalAccessException | InstantiationException |
InvocationTargetException | NoSuchMethodException |
SettingsException e) {
throw new ConfigurationException(
"Unable to load configuration of type " + clazz.getName(), e);
}
}
@Override
public <T> T getGroupConfiguration(Class<T> clazz, long groupId)
throws ConfigurationException {
String settingsId = _getSettingsId(clazz);
String configurationPid = _getConfigurationPid(clazz);
return getConfiguration(
clazz,
new GroupServiceSettingsLocator(
groupId, settingsId, configurationPid));
}
/**
* @deprecated As of 2.0.0, replaced by {@link
* #getPortletInstanceConfiguration(Class, Layout, String)}
*/
@Deprecated
@Override
public <T> T getPortletInstanceConfiguration(
Class<T> clazz, Layout layout, PortletInstance portletInstance)
throws ConfigurationException {
return getPortletInstanceConfiguration(
clazz, layout, portletInstance.getPortletInstanceKey());
}
@Override
public <T> T getPortletInstanceConfiguration(
Class<T> clazz, Layout layout, String portletId)
throws ConfigurationException {
String configurationPid = _getConfigurationPid(clazz);
if (Validator.isNull(configurationPid)) {
return getConfiguration(
clazz, new PortletInstanceSettingsLocator(layout, portletId));
}
return getConfiguration(
clazz,
new PortletInstanceSettingsLocator(
layout, portletId, configurationPid));
}
@Override
public <T> T getSystemConfiguration(Class<T> clazz)
throws ConfigurationException {
String configurationPid = _getConfigurationPid(clazz);
return getConfiguration(
clazz, new SystemSettingsLocator(configurationPid));
}
protected <T> Class<?> getOverrideClass(Class<T> clazz) {
Settings.OverrideClass overrideClass = clazz.getAnnotation(
Settings.OverrideClass.class);
if (overrideClass == null) {
return null;
}
if (overrideClass.value() == Object.class) {
return null;
}
return overrideClass.value();
}
private String _getConfigurationPid(Class<?> clazz) {
Meta.OCD ocd = clazz.getAnnotation(Meta.OCD.class);
if (ocd == null) {
return null;
}
return ocd.id();
}
private <T> String _getSettingsId(Class<T> clazz) {
ExtendedObjectClassDefinition eocd = clazz.getAnnotation(
ExtendedObjectClassDefinition.class);
String settingsId = null;
if (eocd != null) {
settingsId = eocd.settingsId();
}
if (Validator.isNull(settingsId)) {
settingsId = _getConfigurationPid(clazz);
}
return settingsId;
}
@Reference
private SettingsFactory _settingsFactory;
}