SystemPropertiesManager.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.config;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
import org.slf4j.Logger;
import org.openspcoop2.core.config.SystemProperties;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
/**
* SystemPropertiesManager
*
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SystemPropertiesManager {
public static final String SYSTEM_PROPERTIES = "OpenSPCoop2SystemProperties";
private ConfigurazionePdDManager configPdDManager;
private Logger log;
private void logInfo(String msg) {
if(this.log!=null) {
this.log.info(msg);
}
}
public SystemPropertiesManager(ConfigurazionePdDManager configPdDManager,Logger log){
this.configPdDManager = configPdDManager;
this.log = log;
}
private String getPrefixKey(String key) {
return "Property["+key+"] ";
}
public void updateSystemProperties() throws DriverConfigurazioneException{
// remove old properties
String oldProperties = System.getProperty(SYSTEM_PROPERTIES);
if(oldProperties!=null && oldProperties.length()>0){
this.logInfo("Remove old properties: ["+oldProperties+"]");
String [] names = oldProperties.split(",");
for (int i = 0; i < names.length; i++) {
this.logInfo("RemoveProperty ["+names[i]+"]");
System.clearProperty(names[i]);
}
}
System.clearProperty(SYSTEM_PROPERTIES);
SystemProperties sps = this.configPdDManager.getSystemPropertiesPdD();
if(sps!=null && sps.sizeSystemPropertyList()>0){
// set new propertis
StringBuilder bf = new StringBuilder();
for (int i = 0; i < sps.sizeSystemPropertyList(); i++) {
Property sp = sps.getSystemProperty(i);
String nome = sp.getNome();
String valore = sp.getValore();
if(bf.length()>0){
bf.append(",");
}
bf.append(nome);
this.logInfo("SetProperty ["+nome+"]=["+valore+"]");
System.setProperty(nome, valore);
}
// Storico
this.logInfo("SetStoricoProperty ["+SYSTEM_PROPERTIES+"]=["+bf.toString()+"]");
System.setProperty(SYSTEM_PROPERTIES, bf.toString());
}
else{
this.logInfo("Non sono state rilevate proprietà di sistema da impostare");
}
}
public String getPropertyValue(String key){
return System.getProperty(key);
}
public String readAllSystemProperties(String separator){
return this.readAllSystemProperties(separator, false);
}
private String readAllSystemProperties(String separator,boolean onlyOpenSPCoop2){
Properties p = System.getProperties();
if(p!=null){
StringBuilder bf = new StringBuilder();
Enumeration<Object> keys = p.keys();
java.util.ArrayList<String> listKeys = new ArrayList<>();
while (keys.hasMoreElements()) {
Object object = keys.nextElement();
if(object instanceof String){
listKeys.add((String)object);
}
}
java.util.Collections.sort(listKeys);
addSystemProperties(p, listKeys, separator, onlyOpenSPCoop2, bf);
return bf.toString();
}else{
return null;
}
}
private void addSystemProperties(Properties p,java.util.ArrayList<String> listKeys,String separator,boolean onlyOpenSPCoop2,StringBuilder bf) {
for (int i = 0; i < listKeys.size(); i++) {
String key = listKeys.get(i);
boolean isOpenSPCoop2SystemProperty = isOpenSPCoop2SystemProperty(key);
if(!isOpenSPCoop2SystemProperty &&
onlyOpenSPCoop2){
continue;
}
if(bf.length()>0){
bf.append(separator);
}
bf.append("["+key+"]=["+p.getProperty(key)+"]");
}
}
private boolean isOpenSPCoop2SystemProperty(String key) {
boolean isOpenSPCoop2SystemProperty = false;
String oldProperties = System.getProperty(SYSTEM_PROPERTIES);
if(oldProperties!=null && oldProperties.length()>0){
String [] names = oldProperties.split(",");
for (int j = 0; j < names.length; j++) {
if(key.equals(names[j])){
isOpenSPCoop2SystemProperty = true;
break;
}
}
}
return isOpenSPCoop2SystemProperty;
}
public String readOpenSPCoop2SystemProperties(String separator){
return this.readAllSystemProperties(separator, true);
}
public void removeProperty(String key) throws OpenSPCoop2ConfigurationException{
if(!System.getProperties().containsKey(key)){
throw new OpenSPCoop2ConfigurationException(getPrefixKey(key)+"not found");
}
System.clearProperty(key);
String oldProperties = System.getProperty(SYSTEM_PROPERTIES);
StringBuilder bf = new StringBuilder();
if(oldProperties!=null && oldProperties.length()>0){
String [] names = oldProperties.split(",");
for (int j = 0; j < names.length; j++) {
if(key.equals(names[j])){
continue;
}
if(bf.length()>0){
bf.append(",");
}
bf.append(names[j]);
}
System.clearProperty(SYSTEM_PROPERTIES);
System.setProperty(SYSTEM_PROPERTIES, bf.toString());
}
}
public void updateProperty(String key,String value) throws OpenSPCoop2ConfigurationException{
if(!System.getProperties().containsKey(key)){
throw new OpenSPCoop2ConfigurationException(getPrefixKey(key)+"not found");
}
System.clearProperty(key);
System.setProperty(key,value);
}
public void insertProperty(String key,String value) throws OpenSPCoop2ConfigurationException{
if(System.getProperties().containsKey(key)){
throw new OpenSPCoop2ConfigurationException(getPrefixKey(key)+"already exists (actual value: "+System.getProperties().getProperty(key)+")");
}
System.setProperty(key,value);
String props = System.getProperty(SYSTEM_PROPERTIES);
if(props!=null && props.length()>0){
props = props + "," + key;
}
else{
props = key;
}
System.clearProperty(SYSTEM_PROPERTIES);
System.setProperty(SYSTEM_PROPERTIES, props);
}
}