/**
* Copyright (C) 2016 Bonitasoft S.A.
* Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble
* 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
* version 2.1 of the License.
* 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.
* You should have received a copy of 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.bonitasoft.console.common.server.preferences.properties;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.bonitasoft.console.common.server.preferences.constants.WebBonitaConstantsUtils;
import org.bonitasoft.console.common.server.utils.PlatformManagementUtils;
import org.bonitasoft.engine.exception.BonitaException;
/**
* @author Baptiste Mesta
*/
public class ConfigurationFilesManager {
private static ConfigurationFilesManager INSTANCE = new ConfigurationFilesManager();
public static ConfigurationFilesManager getInstance() {
return INSTANCE;
}
private Map<Long, Map<String, Properties>> tenantsConfigurations = new HashMap<>();
private Map<Long, Map<String, File>> tenantsConfigurationFiles = new HashMap<>();
private Map<String, Properties> platformConfigurations = new HashMap<>();
private Map<String, File> platformConfigurationFiles = new HashMap<>();
public Properties getPlatformProperties(String propertiesFile) {
Properties properties = platformConfigurations.get(propertiesFile);
if (properties == null) {
return new Properties();
}
return properties;
}
public Properties getTenantProperties(String propertiesFile, long tenantId) {
Map<String, Properties> map = tenantsConfigurations.get(tenantId);
if (map != null && map.containsKey(propertiesFile)) {
return map.get(propertiesFile);
}
return new Properties();
}
private Properties getProperties(byte[] content) throws IOException {
Properties properties = new Properties();
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(content)) {
properties.load(inputStream);
}
return properties;
}
public void setPlatformConfigurations(Map<String, byte[]> configurationFiles) throws IOException {
platformConfigurations = new HashMap<>(configurationFiles.size());
for (Map.Entry<String, byte[]> entry : configurationFiles.entrySet()) {
if (entry.getKey().endsWith(".properties")) {
platformConfigurations.put(entry.getKey(), getProperties(entry.getValue()));
} else {
File file = new File(WebBonitaConstantsUtils.getInstance().getTempFolder(), entry.getKey());
FileUtils.writeByteArrayToFile(file, entry.getValue());
platformConfigurationFiles.put(entry.getKey(), file);
}
}
}
public void setTenantConfigurations(Map<String, byte[]> configurationFiles, long tenantId) throws IOException {
Map<String, Properties> tenantProperties = new HashMap<>();
Map<String, File> tenantFiles = new HashMap<>();
for (Map.Entry<String, byte[]> entry : configurationFiles.entrySet()) {
if (entry.getKey().endsWith(".properties")) {
tenantProperties.put(entry.getKey(), getProperties(entry.getValue()));
} else {
File file = new File(WebBonitaConstantsUtils.getInstance(tenantId).getTempFolder(), entry.getKey());
FileUtils.writeByteArrayToFile(file, entry.getValue());
tenantFiles.put(entry.getKey(), file);
}
}
tenantsConfigurations.put(tenantId, tenantProperties);
tenantsConfigurationFiles.put(tenantId, tenantFiles);
}
public void setTenantConfiguration(String fileName, byte[] content, long tenantId) throws IOException {
if (fileName.endsWith(".properties")) {
Map<String, Properties> tenantConfiguration = tenantsConfigurations.get(tenantId);
if (tenantConfiguration != null) {
tenantConfiguration.put(fileName, getProperties(content));
}
} else {
Map<String, File> tenantConfigurationFiles = tenantsConfigurationFiles.get(tenantId);
if (tenantConfigurationFiles != null) {
File file = new File(WebBonitaConstantsUtils.getInstance(tenantId).getTempFolder(), fileName);
FileUtils.writeByteArrayToFile(file, content);
tenantConfigurationFiles.put(fileName, file);
}
}
}
public void removeProperty(String propertiesFilename, long tenantId, String propertyName) throws IOException {
Map<String, Properties> resources = getResources(tenantId);
Properties properties = resources.get(propertiesFilename);
properties.remove(propertyName);
update(tenantId, propertiesFilename, properties);
}
private void update(long tenantId, String propertiesFilename, Properties properties) throws IOException {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
properties.store(byteArrayOutputStream, "");
getPlatformManagementUtils().updateConfigurationFile(tenantId, propertiesFilename, byteArrayOutputStream.toByteArray());
} catch (BonitaException e) {
throw new IOException(e);
}
}
PlatformManagementUtils getPlatformManagementUtils() {
return new PlatformManagementUtils();
}
private Map<String, Properties> getResources(long tenantId) {
Map<String, Properties> resources;
if (tenantId > 0) {
resources = tenantsConfigurations.get(tenantId);
} else {
resources = platformConfigurations;
}
return resources;
}
public void setProperty(String propertiesFilename, long tenantId, String propertyName, String propertyValue) throws IOException {
Map<String, Properties> resources = getResources(tenantId);
Properties properties = resources.get(propertiesFilename);
properties.setProperty(propertyName, propertyValue);
update(tenantId, propertiesFilename, properties);
}
public File getPlatformConfigurationFile(String fileName) {
return platformConfigurationFiles.get(fileName);
}
public File getTenantConfigurationFile(String fileName, long tenantId) {
Map<String, File> tenantConfigurationFiles = tenantsConfigurationFiles.get(tenantId);
if(tenantConfigurationFiles != null){
return tenantConfigurationFiles.get(fileName);
}
return null;
}
public File getTenantAutoLoginConfiguration(long tenantId) {
return getTenantConfigurationFile(PlatformManagementUtils.AUTOLOGIN_V6_JSON, tenantId);
}
}