PropertiesUtilities.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.utils.properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Scanner;
import org.openspcoop2.utils.Costanti;
import org.openspcoop2.utils.SortedMap;
import org.openspcoop2.utils.UtilsException;
import org.slf4j.Logger;
/**
* PropertiesUtilities
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class PropertiesUtilities {
/*
* // RICERCA
// 1. VARIABILE DI SISTEMA che identifica il singolo file di properties (es. OPENSPCOOP_PROPERTIES o OPENSPCOOP_LOGGER_PROPERTIES)
// 2. PROPRIETA' JAVA che identifica il singolo file di properties (es. OPENSPCOOP_PROPERTIES o OPENSPCOOP_LOGGER_PROPERTIES)
// 3. VARIABILE DI SISTEMA: OPENSPCOOP_HOME dove deve essere specificata una directory in cui verra' cercato il file path
// 4. PROPRIETA' JAVA (es. ApplicationServer o Java con -D): OPENSPCOOP_HOME dove deve essere specificata una directory in cui verra' cercato il file path
// 5. CLASSPATH con nome path
// 6. (DIRECTORY DI CONFIGURAZIONE)/path
*/
public static CollectionProperties searchLocalImplementation(String OPENSPCOOP2_LOCAL_HOME, Logger log,String variabile,String path,String confDirectory){
return searchLocalImplementation(OPENSPCOOP2_LOCAL_HOME, log, variabile, path, confDirectory, true);
}
public static CollectionProperties searchLocalImplementation(String OPENSPCOOP2_LOCAL_HOME, Logger log,String variabile,String path,String confDirectory,boolean readCallsNotSynchronized){
CollectionProperties cp = new CollectionProperties();
String envP = System.getenv(Costanti.OPENSPCOOP2_FORCE_CONFIG_FILE);
if(envP!=null && "true".equalsIgnoreCase(envP)) {
cp.setForceConfigDir(true);
}
else {
String javaP = System.getProperty(Costanti.OPENSPCOOP2_FORCE_CONFIG_FILE);
if(javaP!=null && "true".equalsIgnoreCase(javaP)) {
cp.setForceConfigDir(true);
}
}
Properties p1 = PropertiesUtilities.examineStep1(log,variabile);
if(p1!=null){
cp.setSystemVariable(new PropertiesReader(p1,readCallsNotSynchronized));
}
Properties p2 = PropertiesUtilities.examineStep2(log,variabile);
if(p2!=null){
cp.setJavaVariable(new PropertiesReader(p2,readCallsNotSynchronized));
}
Properties p3 = PropertiesUtilities.examineStep3(OPENSPCOOP2_LOCAL_HOME,log,path);
if(p3!=null){
cp.setSystemOpenSPCoopHome(new PropertiesReader(p3,readCallsNotSynchronized));
}
Properties p4 = PropertiesUtilities.examineStep4(OPENSPCOOP2_LOCAL_HOME,log,path);
if(p4!=null){
cp.setJavaOpenSPCoopHome(new PropertiesReader(p4,readCallsNotSynchronized));
}
Properties p5 = PropertiesUtilities.examineStep5(log,path);
if(p5!=null){
cp.setClasspath(new PropertiesReader(p5,readCallsNotSynchronized));
}
File fConfDirectory = null;
if(confDirectory!=null){
fConfDirectory = new File(confDirectory);
}
if(fConfDirectory!=null && fConfDirectory.exists() && fConfDirectory.isDirectory() ){
Properties p6 = PropertiesUtilities.examineStep6(log,path,fConfDirectory);
if(p6!=null){
cp.setConfigDir(new PropertiesReader(p6,readCallsNotSynchronized));
}
}
return cp;
}
private static Properties examineStep1(Logger log,String variabile){
/*
System.out.println("--------- ENV --------------");
java.util.Map<String, String> env = System.getenv();
for (java.util.Iterator<String> iterator = env.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
System.out.println("\t["+key+"]=["+env.get(key)+"]");
}
System.out.println("--------- ENV --------------");
*/
String file = System.getenv(variabile);
String subject = "Variabile di sistema "+variabile;
if(file!=null){
File ffile = new File(file);
if(ffile.exists()==false){
log.error("["+subject+"] File non esistente: "+ffile.getAbsolutePath());
return null;
}
if(ffile.canRead()==false){
log.error("["+subject+"] File non accessibile: "+ffile.getAbsolutePath());
return null;
}
InputStream is = null;
try{
is = new FileInputStream(ffile);
return PropertiesUtilities.getPropertiesReader(log,is,subject);
}catch(java.io.IOException e) {
log.error("["+subject+"] file di properties non utilizzabile: "+e.getMessage(),e);
}finally{
try{
if(is!=null) {
is.close();
}
}catch(Exception eClose){
// close
}
}
}
return null;
}
private static Properties examineStep2(Logger log,String variabile){
/*
System.out.println("--------- ENV --------------");
java.util.Map<String, String> env = System.getenv();
for (java.util.Iterator<String> iterator = env.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
System.out.println("\t["+key+"]=["+env.get(key)+"]");
}
System.out.println("--------- ENV --------------");
*/
String file = System.getProperty(variabile);
String subject = "Proprieta' di sistema "+variabile;
if(file!=null){
File ffile = new File(file);
if(ffile.exists()==false){
log.error("["+subject+"] File non esistente: "+ffile.getAbsolutePath());
return null;
}
if(ffile.canRead()==false){
log.error("["+subject+"] File non accessibile: "+ffile.getAbsolutePath());
return null;
}
InputStream is = null;
try{
is = new FileInputStream(ffile);
return PropertiesUtilities.getPropertiesReader(log,is,subject);
}catch(java.io.IOException e) {
log.error("["+subject+"] file di properties non utilizzabile: "+e.getMessage(),e);
}finally{
try{
if(is!=null) {
is.close();
}
}catch(Exception eClose){
// close
}
}
}
return null;
}
private static Properties examineStep3(String OPENSPCOOP2_LOCAL_HOME,Logger log,String path){
/*
System.out.println("--------- ENV --------------");
java.util.Map<String, String> env = System.getenv();
for (java.util.Iterator<String> iterator = env.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
System.out.println("\t["+key+"]=["+env.get(key)+"]");
}
System.out.println("--------- ENV --------------");
*/
String dir = System.getenv(OPENSPCOOP2_LOCAL_HOME);
String subject = "Variabile di sistema "+OPENSPCOOP2_LOCAL_HOME;
if(dir!=null){
File fDir = new File(dir);
if(fDir.exists()==false){
log.error("["+subject+"] Directory non esistente: "+fDir.getAbsolutePath());
return null;
}
if(fDir.canRead()==false){
log.error("["+subject+"] Directory non accessibile: "+fDir.getAbsolutePath());
return null;
}
return PropertiesUtilities.getPropertiesReader(log,fDir.getAbsolutePath()+File.separatorChar+path,subject);
}
return null;
}
private static Properties examineStep4(String OPENSPCOOP2_LOCAL_HOME,Logger log,String path){
/*
System.out.println("--------- PROPERTIES --------------");
java.util.Properties properties = System.getProperties();
java.util.Enumeration<?> enumProperties = properties.keys();
while (enumProperties.hasMoreElements()) {
Object object = (Object) enumProperties.nextElement();
System.out.println("\t["+object+"]=["+properties.get(object)+"]");
}
System.out.println("--------- PROPERTIES --------------");
*/
String dir = System.getProperty(OPENSPCOOP2_LOCAL_HOME);
String subject = "Proprieta' di sistema "+OPENSPCOOP2_LOCAL_HOME;
if(dir!=null){
File fDir = new File(dir);
if(fDir.exists()==false){
log.error("["+subject+"] Directory non esistente: "+fDir.getAbsolutePath());
return null;
}
if(fDir.canRead()==false){
log.error("["+subject+"] Directory non accessibile: "+fDir.getAbsolutePath());
return null;
}
return PropertiesUtilities.getPropertiesReader(log,fDir.getAbsolutePath()+File.separatorChar+path,subject);
}
return null;
}
private static Properties examineStep5(Logger log,String path){
return PropertiesUtilities.getPropertiesReader(log, PropertiesUtilities.class.getResourceAsStream("/"+path), "CLASSPATH: "+path);
}
private static Properties examineStep6(Logger log,String path,File fConfDirectory){
File f = new File(fConfDirectory,path);
if(f.exists()){
return PropertiesUtilities.getPropertiesReader(log,f.getAbsolutePath(), "CONFIG_DIR_OPENSPCOOP/"+path);
}
return null;
}
private static Properties getPropertiesReader(Logger log,String path,String subject){
if(path!=null){
File f = new File(path);
if(!f.exists()){
// NON DEVO SEGNALARE L'ERRORE log.error("["+subject+"] file di properties non esistente: "+f.getAbsolutePath());
return null;
}
if(!f.canRead()){
log.error("["+subject+"] file di properties non accessibile: "+f.getAbsolutePath());
return null;
}
InputStream is = null;
try{
is = new FileInputStream(f);
return PropertiesUtilities.getPropertiesReader(log,is,subject);
}catch(java.io.IOException e) {
log.error("["+subject+"] file di properties non utilizzabile: "+e.getMessage(),e);
}finally{
try{
if(is!=null) {
is.close();
}
}catch(Exception eClose){
// close
}
}
}
return null;
}
private static Properties getPropertiesReader(Logger log,InputStream is,String subject){
if(is!=null){
Properties propertiesReader = null;
try{
propertiesReader = new Properties();
propertiesReader.load(is);
}catch(java.io.IOException e) {
propertiesReader = null;
log.error("["+subject+"] file di properties non utilizzabile: "+e.getMessage(),e);
}finally{
try{
if(is!=null) {
is.close();
}
}catch(Exception eClose){
// close
}
}
if(propertiesReader!=null){
return propertiesReader;
}
return null;
}
return null;
}
public static Properties convertTextToProperties(String text) {
Scanner scanner = new Scanner(text);
Properties properties = new Properties();
try {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if(line==null || line.trim().equals("")) {
continue;
}
line = line.trim();
if(line!=null && line.startsWith("#")) {
continue;
}
if(line!=null && line.contains("=") && !line.startsWith("=")) {
String key = line.split("=")[0];
key = key.trim();
int valueIndex = line.indexOf("=");
String value = "";
if(valueIndex<line.length()) {
value = line.substring(valueIndex+1);
value = value.trim();
}
properties.put(key, value);
}
}
}finally {
scanner.close();
}
return properties;
}
private static String EMPTY_COMMENT_VALUE = " "; // non uso "" senno su oracle non viene serializzato essendo null
private static String KEY_COMMENT_UNIQUE = "#C_ID#_";
private static String getKeyComment(int index) {
return KEY_COMMENT_UNIQUE.replace("ID", index+"");
}
private static String removeKeyComment(String keyComment, int index) {
String prefix = KEY_COMMENT_UNIQUE.replace("ID", index+"");
return keyComment.replace(prefix,"");
}
public static SortedMap<String> convertTextToSortedMap(String text) throws UtilsException {
return convertTextToSortedMap(text, false);
}
@SuppressWarnings("unchecked")
public static SortedMap<String> convertTextToSortedMap(String text, boolean addCommentAsEntry) throws UtilsException {
return (SortedMap<String>) _convertTextToSortedMap(text, addCommentAsEntry, false);
}
public static SortedMap<List<String>> convertTextToSortedListMap(String text) throws UtilsException {
return convertTextToSortedListMap(text, false);
}
@SuppressWarnings("unchecked")
public static SortedMap<List<String>> convertTextToSortedListMap(String text, boolean addCommentAsEntry) throws UtilsException {
return (SortedMap<List<String>>) _convertTextToSortedMap(text, addCommentAsEntry, true);
}
private static SortedMap<?> _convertTextToSortedMap(String text, boolean addCommentAsEntry, boolean listEnabled) throws UtilsException {
Scanner scanner = new Scanner(text);
SortedMap<String> propertiesString = null;
SortedMap<List<String>> propertiesList = null;
if(listEnabled) {
propertiesList = new SortedMap<List<String>>();
}
else {
propertiesString = new SortedMap<String>();
}
try {
int index = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if(line==null || line.trim().equals("")) {
continue;
}
line = line.trim();
if(line.startsWith("#")) {
if(addCommentAsEntry) {
String key = getKeyComment(index)+line;
//System.out.println("ADD COMMENT '"+key+"'");
if(listEnabled) {
List<String> l = new ArrayList<>();
l.add(EMPTY_COMMENT_VALUE);
propertiesList.add(key, l);
}
else {
propertiesString.add(key, EMPTY_COMMENT_VALUE);
}
index++;
}
continue;
}
if(line.contains("=")) {
String key = line.split("=")[0];
key = key.trim();
int valueIndex = line.indexOf("=");
String value = "";
if(valueIndex<line.length()) {
value = line.substring(valueIndex+1);
value = value.trim();
}
if(listEnabled) {
List<String> l = propertiesList.get(key);
if(l==null) {
l = new ArrayList<>();
propertiesList.add(key, l);
}
l.add(value);
}
else {
propertiesString.add(key, value);
}
}
}
}finally {
scanner.close();
}
return listEnabled ? propertiesList : propertiesString;
}
public static String convertSortedMapToText(SortedMap<String> map) throws UtilsException {
return convertSortedMapToText(map, false);
}
public static String convertSortedMapToText(SortedMap<String> map, boolean commentAsEntry) throws UtilsException {
return _convertSortedMapToText(map, commentAsEntry, false);
}
public static String convertSorteListdMapToText(SortedMap<List<String>> map) throws UtilsException {
return convertSortedListMapToText(map, false);
}
public static String convertSortedListMapToText(SortedMap<List<String>> map, boolean commentAsEntry) throws UtilsException {
return _convertSortedMapToText(map, commentAsEntry, true);
}
private static String _convertSortedMapToText(SortedMap<?> map, boolean commentAsEntry, boolean listEnabled) throws UtilsException {
StringBuilder sb = new StringBuilder();
if(map!=null && !map.isEmpty()) {
int index = 0;
for (String key : map.keys()) {
if(key==null) {
continue;
}
if(key.startsWith("#") && commentAsEntry) {
if(sb.length() >0)
sb.append("\n");
//System.out.println("READ COMMENT '"+key+"'");
String keyComment = getKeyComment(index);
if(key.startsWith(keyComment)) {
String line = removeKeyComment(key, index);
//System.out.println("READ ADD COMMENT '"+line+"'");
sb.append(line);
index++;
}
else {
//System.out.println("READ ADD ORIGINAL '"+key+"'");
sb.append(key);
}
continue;
}
if(listEnabled) {
@SuppressWarnings("unchecked")
List<String> values = (List<String>) map.get(key);
if(values!=null && !values.isEmpty()) {
for (String value : values) {
if(sb.length() >0)
sb.append("\n");
sb.append(key).append("=").append(value);
}
}
}else {
if(sb.length() >0)
sb.append("\n");
String value = (String) map.get(key);
sb.append(key).append("=").append(value);
}
}
}
return sb.toString();
}
}