PropertiesScriptBuilder.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.core.commons;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.openspcoop2.utils.resources.FileSystemUtilities;
/**
* PropertiesScriptBuilder
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class PropertiesScriptBuilder {
public static void main(String[] args) throws Exception {
// Metodo utilizzato dal setup antinstaller
String sourceDir = (String) args[0];
String destDir = (String) args[1];
String distDir = (String) args[2];
String versionePrecedente = null;
String versioneAttuale = null;
if(args.length>3){
versionePrecedente = (String) args[3];
versioneAttuale = (String) args[4];
}
// NOTA: Non far stampare niente, viene usato come meccanismo di check per vedere se l'esecuzione e' andata a buon fine
//System.out.println("versionePrecedente ["+versionePrecedente+"]");
//System.out.println("versioneAttuale ["+versioneAttuale+"]");
//System.out.println("tipoDatabase ["+tipoDatabase+"]");
build_Aggiornamento(new File(sourceDir),new File(destDir), new File(distDir),
versionePrecedente, versioneAttuale);
}
private static void build_Aggiornamento(File sourceDir, File destDir, File distDir,
String precedenteVersione, String versioneAttuale) throws Exception {
if(sourceDir.exists()==false){
throw new Exception("Source dir ["+sourceDir.getAbsolutePath()+"] not exists");
}
if(sourceDir.canRead()==false){
throw new Exception("Source dir ["+sourceDir.getAbsolutePath()+"] cannot read");
}
if(destDir.exists()==false){
throw new Exception("Dest dir ["+destDir.getAbsolutePath()+"] not exists");
}
if(destDir.canWrite()==false){
throw new Exception("Dest dir ["+destDir.getAbsolutePath()+"] cannot write");
}
if(distDir.exists()==false){
throw new Exception("Dest dir ["+destDir.getAbsolutePath()+"] not exists");
}
if(distDir.canWrite()==false){
throw new Exception("Dest dir ["+destDir.getAbsolutePath()+"] cannot write");
}
if(precedenteVersione==null){
throw new Exception("Precedente versione non fornita");
}
if(precedenteVersione.contains(".")==false){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] ('.' not found)");
}
int indexOfFirstPoint = precedenteVersione.indexOf(".");
if(indexOfFirstPoint<=0){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] ('.' not found with index)");
}
String productVersionString = precedenteVersione.substring(0, indexOfFirstPoint);
int productVersion = -1;
try{
productVersion = Integer.parseInt(productVersionString);
}catch(Exception e){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (productVersion:"+productVersionString+"): "+e.getMessage(),e);
}
int indexOfSecondPoint = precedenteVersione.indexOf(".",indexOfFirstPoint+1);
if(indexOfSecondPoint<=0 || indexOfSecondPoint<=indexOfFirstPoint){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (second '.' not found)");
}
String majorVersionString = precedenteVersione.substring(indexOfFirstPoint+1, indexOfSecondPoint);
int majorVersion = -1;
try{
majorVersion = Integer.parseInt(majorVersionString);
}catch(Exception e){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (majorVersion:"+majorVersionString+"): "+e.getMessage(),e);
}
if(precedenteVersione.length()<=indexOfSecondPoint){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (length)");
}
String minorVersionString = precedenteVersione.substring(indexOfSecondPoint+1,precedenteVersione.length());
int minorVersion = -1;
try{
minorVersion = Integer.parseInt(minorVersionString);
}catch(Exception e){
//throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (minorVersion:"+minorVersionString+"): "+e.getMessage(),e);
// Potrebbe essere una BUILD VERSION
if(minorVersionString.contains("_")){
String newMinor = minorVersionString.split("_")[0];
try{
minorVersion = Integer.parseInt(newMinor);
}catch(Exception eInternal){
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (minorVersion:"+minorVersionString+" minorVersionBuildNumber:"+newMinor+"): "+eInternal.getMessage(),eInternal);
}
}
else{
throw new Exception("Precedente versione in un formato non corretto ["+precedenteVersione+"] (minorVersion:"+minorVersionString+"): "+e.getMessage(),e);
}
}
//System.out.println(productVersion+"."+majorVersion+"."+minorVersion);
int tmpMajorVersion = majorVersion;
int tmpMinorVersion = minorVersion;
Map<String, Boolean> configCreateFileFromDist = new HashMap<String, Boolean>();
Map<String, ByteArrayOutputStream> configCreateFileDiff = new HashMap<>();
while(true){
String actualVersion = productVersion+"."+tmpMajorVersion+"."+tmpMinorVersion;
String nextVersion = productVersion+"."+tmpMajorVersion+"."+(tmpMinorVersion+1);
File version = new File(sourceDir,"upgrade_"+actualVersion+"_to_"+nextVersion);
//System.out.println("CHECK ["+version.getAbsolutePath()+"] ["+version.exists()+"]");
if(version.exists()){
if(version.canRead()==false){
throw new Exception("Source version dir ["+version.getAbsolutePath()+"] cannot read");
}
_create_Aggiornamento(version, destDir,
configCreateFileFromDist, configCreateFileDiff,
nextVersion);
tmpMinorVersion++;
}
else{
// check upgrade to major version +1
actualVersion = productVersion+"."+tmpMajorVersion+".x";
nextVersion = productVersion+"."+(tmpMajorVersion+1)+".0";
version = new File(sourceDir,"upgrade_"+actualVersion+"_to_"+nextVersion);
//System.out.println("CHECK UPGRADE ["+version.getAbsolutePath()+"] ["+version.exists()+"]");
if(version.exists()){
if(version.canRead()==false){
throw new Exception("Source version dir ["+version.getAbsolutePath()+"] cannot read");
}
_create_Aggiornamento(version, destDir,
configCreateFileFromDist, configCreateFileDiff,
nextVersion);
tmpMajorVersion++;
tmpMinorVersion=0;
}
else{
break;
}
}
}
if(configCreateFileFromDist.size()>0) {
Iterator<String> it = configCreateFileFromDist.keySet().iterator();
while (it.hasNext()) {
String id = (String) it.next();
String fileName = id + ".properties";
File[] files = distDir.listFiles();
if(files!=null && files.length>0) {
// Prima esamino i file properties interi poi i diff
for(File distFile : files) {
if(distFile.getName().equals(fileName)) {
File fOut = new File(destDir, fileName);
FileSystemUtilities.copy(distFile, fOut);
break;
}
}
}
}
}
if(configCreateFileDiff.size()>0) {
Iterator<String> it = configCreateFileDiff.keySet().iterator();
while (it.hasNext()) {
String id = (String) it.next();
String fileName = id + ".diff";
File fOut = new File(destDir, fileName);
ByteArrayOutputStream bout = configCreateFileDiff.get(id);
bout.flush();
bout.close();
FileSystemUtilities.writeFile(fOut, bout.toByteArray());
}
}
}
private static void _create_Aggiornamento(File sourceDir, File destDir,
Map<String, Boolean> configCreateFileFromDist , Map<String, ByteArrayOutputStream> configCreateFileDiff ,
String nextVersion) throws Exception {
//System.out.println("CHECK.... source ["+sourceDir.getAbsolutePath()+"]");
File[] files = sourceDir.listFiles();
if(files!=null && files.length>0) {
// Prima esamino i file properties interi poi i diff
for(File upgradeDir : files) {
if(upgradeDir.isDirectory() && (
upgradeDir.getName().equals("core") || upgradeDir.getName().equals("protocolli")
)) {
File[] fileChilds = upgradeDir.listFiles();
if(fileChilds!=null && fileChilds.length>0) {
Arrays.sort(fileChilds); // sono ordinati per data
for(File upgradeFile : fileChilds) {
if(upgradeFile.getName().endsWith(".properties")) {
String key = upgradeFile.getName().substring(0, upgradeFile.getName().indexOf(".properties"));
if(configCreateFileFromDist.containsKey(key)==false) {
//System.out.println("ADDD PROPERTIES ["+key+"]");
configCreateFileFromDist.put(key, true);
}
}
}
}
}
}
Arrays.sort(files); // sono ordinati per data
for(File upgradeDir : files) {
if(upgradeDir.isDirectory() && (
upgradeDir.getName().equals("core") || upgradeDir.getName().equals("protocolli")
)) {
File[] fileChilds = upgradeDir.listFiles();
if(fileChilds!=null && fileChilds.length>0) {
Arrays.sort(fileChilds); // sono ordinati per data
for(File diffFile : fileChilds) {
if(diffFile.getName().endsWith(".diff")) {
String data= ".YYYY-MM-DD.diff";
//System.out.println("DIFF NAME ["+diffFile.getName()+"]");
String key = diffFile.getName().substring(0, (diffFile.getName().length()-data.length()));
//System.out.println("DIFF KEY ["+key+"]");
if(configCreateFileFromDist.containsKey(key)==false) {
//System.out.println("ADDD DIFF");
ByteArrayOutputStream bout = null;
if(configCreateFileDiff.containsKey(key)) {
bout = configCreateFileDiff.get(key);
}
else {
bout = new ByteArrayOutputStream();
configCreateFileDiff.put(key, bout);
}
_createAggiornamento(diffFile, bout);
}
}
}
}
}
}
}
}
private static void _createAggiornamento(File diffFile, ByteArrayOutputStream bout) throws Exception{
byte[] b = FileSystemUtilities.readBytesFromFile(diffFile);
if(bout.size()>0){
bout.write("\n\n".getBytes());
}
bout.write(b);
}
}