/* * RHQ Management Platform * Copyright (C) 2005-2014 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.enterprise.server.cloud.util; import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.cloud.StorageNode; import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertySimple; /** * @author Michael Burman */ public class StorageNodeConfigurationUtil { private static final Log log = LogFactory.getLog(StorageNodeConfigurationUtil.class); public static final String RHQ_STORAGE_JMX_PORT_PROPERTY = "jmxPort"; public static final String RHQ_STORAGE_HEAP_MAX_PROPERTY = "maxHeapSize"; public static final String RHQ_STORAGE_HEAP_MIN_PROPERTY = "minHeapSize"; public static final String RHQ_STORAGE_HEAP_NEW_PROPERTY = "heapNewSize"; public static final String RHQ_STORAGE_THREAD_STACK_PROPERTY = "threadStackSize"; public static final String RHQ_STORAGE_SAVED_CACHES_PROPERTY = "SavedCachesLocation"; public static final String RHQ_STORAGE_COMMIT_LOG_PROPERTY = "CommitLogLocation"; public static final String RHQ_STORAGE_DATA_FILE_PROPERTY = "AllDataFileLocations"; public static final String RHQ_STORAGE_DATA_FILE_DIR_PROPERTY = "directory"; public static final String RHQ_STORAGE_CONNECTOR_PROPERTY = "connectorAddress"; public static final String RHQ_STORAGE_NOTIFY_DIR_CHANGE_PROPERTY = "dataDirectoriesChanged"; public static StorageNodeConfigurationComposite createCompositeConfiguration(Configuration storageNodeConfiguration, Configuration storageNodePluginConfiguration, StorageNode storageNode) { StorageNodeConfigurationComposite configuration = new StorageNodeConfigurationComposite(storageNode); configuration.setHeapSize(storageNodeConfiguration.getSimpleValue(RHQ_STORAGE_HEAP_MAX_PROPERTY)); configuration.setHeapNewSize(storageNodeConfiguration.getSimpleValue(RHQ_STORAGE_HEAP_NEW_PROPERTY)); configuration.setThreadStackSize(storageNodeConfiguration.getSimpleValue(RHQ_STORAGE_THREAD_STACK_PROPERTY)); configuration.setCommitLogLocation(storageNodeConfiguration.getSimpleValue(RHQ_STORAGE_COMMIT_LOG_PROPERTY)); configuration.setSavedCachesLocation(storageNodeConfiguration.getSimpleValue(RHQ_STORAGE_SAVED_CACHES_PROPERTY)); PropertyList allDataFileLocations = storageNodeConfiguration.getList(RHQ_STORAGE_DATA_FILE_PROPERTY); if(allDataFileLocations != null) { List<String> dataDirectories = new LinkedList<String>(); for (Property property : allDataFileLocations.getList()) { PropertySimple dataFileLocation = (PropertySimple) property; dataDirectories.add(dataFileLocation.getStringValue()); } configuration.setDataLocations(dataDirectories); } configuration.setJmxPort(Integer.parseInt(storageNodePluginConfiguration .getSimpleValue(RHQ_STORAGE_JMX_PORT_PROPERTY))); return configuration; } public static void updateValuesToConfiguration(StorageNodeConfigurationComposite storageNodeConfigurationComposite, Configuration storageNodeConfiguration) { storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_JMX_PORT_PROPERTY, Integer.toString(storageNodeConfigurationComposite.getJmxPort())); storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_HEAP_MAX_PROPERTY, storageNodeConfigurationComposite.getHeapSize()); storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_HEAP_NEW_PROPERTY, storageNodeConfigurationComposite.getHeapNewSize()); storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_THREAD_STACK_PROPERTY, storageNodeConfigurationComposite.getThreadStackSize()); storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_SAVED_CACHES_PROPERTY, storageNodeConfigurationComposite.getSavedCachesLocation()); storageNodeConfiguration.setSimpleValue(RHQ_STORAGE_COMMIT_LOG_PROPERTY, storageNodeConfigurationComposite.getCommitLogLocation()); storageNodeConfiguration.put(getAllDataFileLocationsProperties(storageNodeConfigurationComposite.getDataLocations())); } public static PropertyList getAllDataFileLocationsProperties(List<String> fileLocations) { return getPropertyList(RHQ_STORAGE_DATA_FILE_PROPERTY, RHQ_STORAGE_DATA_FILE_DIR_PROPERTY, fileLocations); } /* org.rhq.enterprise.server.rest.helper.ConfigurationHelper has similar method, getPropertyList(String propertyName, List<Object> objects); Merge these two? */ private static PropertyList getPropertyList(String listName, String propertyName, List<? extends Object> objects) { PropertyList propertyList = new PropertyList(listName); for(Object o : objects) { propertyList.add(new PropertySimple(propertyName, o)); } return propertyList; } /** * If new value is null, replace that with existing configuration value * @param newConfig * @param oldConfig */ public static void syncConfigs(StorageNodeConfigurationComposite newConfig, StorageNodeConfigurationComposite oldConfig) { try { for (Field field : StorageNodeConfigurationComposite.class.getDeclaredFields()) { field.setAccessible(true); if(field.isAccessible() && field.getType() != StorageNode.class) { Object o = field.get(newConfig); if(o == null) { Object oldValue = field.get(oldConfig); if(oldValue != null) { field.set(newConfig, oldValue); } } } } } catch (IllegalAccessException e) { throw new RuntimeException("Could not process StorageNodeConfigurationComposite, ", e); } } }