/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.sync.importers;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLStreamException;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUtility;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.domain.sync.entity.SystemSettings;
import org.rhq.enterprise.server.sync.ExportReader;
import org.rhq.enterprise.server.sync.NoSingleEntity;
import org.rhq.enterprise.server.sync.validators.EntityValidator;
import org.rhq.enterprise.server.sync.validators.MaxCountValidator;
import org.rhq.enterprise.server.sync.validators.SystemSettingsValidator;
import org.rhq.enterprise.server.system.SystemManagerLocal;
/**
*
*
* @author Lukas Krejci
*/
public class SystemSettingsImporter implements Importer<NoSingleEntity, SystemSettings> {
public static final String PROPERTIES_TO_IMPORT_PROPERTY = "propertiesToImport";
public static final String DEFAULT_IMPORTED_PROPERTIES_LIST =
"AGENT_MAX_QUIET_TIME_ALLOWED, ENABLE_AGENT_AUTO_UPDATE, ENABLE_DEBUG_MODE, ENABLE_EXPERIMENTAL_FEATURES, ENABLE_LOGIN_WITHOUT_ROLES, CAM_DATA_PURGE_1H, CAM_DATA_PURGE_6H, "
+ "CAM_DATA_PURGE_1D, CAM_DATA_MAINTENANCE, DATA_REINDEX_NIGHTLY, RT_DATA_PURGE, ALERT_PURGE, EVENT_PURGE, TRAIT_PURGE, AVAILABILITY_PURGE, CAM_BASELINE_FREQUENCY, CAM_BASELINE_DATASET";
private Subject subject;
private SystemManagerLocal systemManager;
private Configuration importConfiguration;
private Unmarshaller unmarshaller;
public SystemSettingsImporter(Subject subject, SystemManagerLocal systemManager) {
try {
this.subject = subject;
this.systemManager = systemManager;
JAXBContext context = JAXBContext.newInstance(SystemSettings.class);
unmarshaller = context.createUnmarshaller();
} catch (JAXBException e) {
throw new IllegalStateException("Failed to initialize JAXB marshaller for MetricTemplate.", e);
}
}
@Override
public ConfigurationDefinition getImportConfigurationDefinition() {
ConfigurationDefinition def = new ConfigurationDefinition("SystemSettingsConfiguration", null);
PropertyDefinitionSimple props =
new PropertyDefinitionSimple(
PROPERTIES_TO_IMPORT_PROPERTY,
"The names of the properties that should be imported. Note that these are the INTERNAL names as used in the RHQ database." +
" If you include any property that stores a password (such as CAM_LDAP_BIND_PW)," +
" you need to make sure the values are OBFUSCATED. You can obtain an obfuscated value of your" +
" password by running the \"rhq-encode-password.(sh|bat)\" script located in the \"bin\" directory" +
" of your RHQ server installation.",
true, PropertySimpleType.STRING);
props.setDefaultValue(DEFAULT_IMPORTED_PROPERTIES_LIST);
def.put(props);
ConfigurationUtility.initializeDefaultTemplate(def);
return def;
}
@Override
public void configure(Configuration importConfiguration) {
this.importConfiguration = importConfiguration;
if (importConfiguration == null) {
this.importConfiguration = getImportConfigurationDefinition().getDefaultTemplate().getConfiguration();
}
}
@Override
public ExportedEntityMatcher<NoSingleEntity, SystemSettings> getExportedEntityMatcher() {
return new NoSingleEntityMatcher<SystemSettings>();
}
@Override
public Set<EntityValidator<SystemSettings>> getEntityValidators() {
HashSet<EntityValidator<SystemSettings>> ret = new HashSet<EntityValidator<SystemSettings>>();
ret.add(new SystemSettingsValidator());
ret.add(new MaxCountValidator<SystemSettings>(1));
return ret;
}
@Override
public void update(NoSingleEntity entity, SystemSettings exportedEntity) throws Exception {
Map<String, String> props = exportedEntity.toMap();
Set<String> propsToImport = getSettingNamesConfiguredForImport(importConfiguration);
Set<String> propsToRemove = new HashSet<String>();
for (Object k : props.keySet()) {
String key = (String) k;
if (!propsToImport.contains(key)) {
propsToRemove.add(key);
}
}
for (String p : propsToRemove) {
props.remove(p);
}
org.rhq.core.domain.common.composite.SystemSettings settings =
org.rhq.core.domain.common.composite.SystemSettings.fromMap(props);
systemManager.deobfuscate(settings);
systemManager.setSystemSettings(subject, settings);
}
@Override
public SystemSettings unmarshallExportedEntity(ExportReader reader) throws XMLStreamException {
try {
return (SystemSettings) unmarshaller.unmarshal(reader);
} catch (JAXBException e) {
throw new XMLStreamException("Failed to unmarshal system settings.", e);
}
}
@Override
public String finishImport() {
return null;
}
private Set<String> getSettingNamesConfiguredForImport(Configuration importConfiguration) {
String settingsToImport = importConfiguration.getSimpleValue(PROPERTIES_TO_IMPORT_PROPERTY, null);
if (settingsToImport == null) {
return Collections.emptySet();
} else {
String[] vals = settingsToImport.split("\\s*,\\s*");
return new HashSet<String>(Arrays.asList(vals));
}
}
}