/*
* Datei: JoSchKa.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Erstellt: 22.04.2009
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.statistik.startSetup;
import java.util.ArrayList;
import fmg.fmg8.statistik.Parametersatz;
/**
* @author Lukas K�nig
*/
public class JoSchKa {
/**
* @param setzPars Die zu setzenden Parameter.
* @param params Die Parameter.
* @param werte Die Werte der zu setzenden Parameter.
* @param setzParsFest Parameter, die nicht mit allen anderen kombiniert,
* sondern fortlaufen eingef�gt werden.
* @param werteFest Zugeh�rige Werte. Die Anzahl der Werte muss immer
* genau die Anzahl der insgesamt zu erzeugenden
* Parameters�tze sein.
*
* @return Ausgabe.
*/
public ArrayList<String> erzeuge(
final Parametersatz params,
final ArrayList<String> setzPars,
final ArrayList<String[]> werte,
final ArrayList<String> setzParsFest,
final ArrayList<String[]> werteFest) {
ArrayList<String> ausgabe;
int[] laengen = new int[setzPars.size()];
int[] zaehler = new int[setzPars.size()];
boolean b = false;
String[] aenderungen
= new String[setzPars.size() * 2 + setzParsFest.size() * 2];
int j;
int gesLen = 1;
int max = 0;
int gesZaehler = 0;
String aktSatz;
String aktAusg;
// Z�hlerarray initialisieren.
for (int i = 0; i < laengen.length; i++) {
laengen[i] = werte.get(i).length;
zaehler[i] = 0;
gesLen *= werte.get(i).length;
if (laengen[i] > max) {
max = laengen[i];
}
}
ausgabe = new ArrayList<String>(gesLen);
// Eintr�ge erzeugen.
while (!b && max > 1) {
aktSatz = "";
// Alle Kombinationen.
for (int i = 0; i < zaehler.length; i++) {
j = 2 * i;
aenderungen[j] = setzPars.get(i);
aenderungen[j + 1] = werte.get(i)[zaehler[i]];
if (werte.get(i).length > 1) {
aktSatz += "-" + aenderungen[j];
aktSatz += "_" + aenderungen[j + 1];
}
}
// Feste Werte.
for (int i = zaehler.length; i * 2 < aenderungen.length; i++) {
j = 2 * i;
aenderungen[j] = setzParsFest.get(i - zaehler.length);
aenderungen[j + 1]
= werteFest.get(i - zaehler.length)[gesZaehler];
}
aktAusg = this.erzeugeEinzPar(params, aenderungen);
aktAusg = aktAusg.replaceAll("#", aktSatz); // Ersetze "#".
ausgabe.add(aktAusg);
for (int i = 0; i < zaehler.length; i++) {
zaehler[i] = (zaehler[i] + 1) % laengen[i];
if (zaehler[i] != 0) {
break;
}
}
b = true;
for (int i = 0; i < laengen.length; i++) {
if (zaehler[i] < laengen[i] - 1) {
b = false;
}
}
gesZaehler++;
}
// Letzten Eintrag erzeugen.
// Alle Kombinationen.
aktSatz = "";
for (int i = 0; i < zaehler.length; i++) {
j = 2 * i;
aenderungen[j] = setzPars.get(i);
aenderungen[j + 1] = werte.get(i)[zaehler[i]];
if (werte.get(i).length > 1) {
aktSatz += "-" + aenderungen[j];
aktSatz += "_" + aenderungen[j + 1];
}
}
// Feste Werte.
for (int i = zaehler.length; i * 2 < aenderungen.length; i++) {
j = 2 * i;
aenderungen[j] = setzParsFest.get(i - zaehler.length);
aenderungen[j + 1]
= werteFest.get(i - zaehler.length)[gesZaehler];
}
aktAusg = this.erzeugeEinzPar(params, aenderungen);
aktAusg = aktAusg.replaceAll("#", aktSatz); // Ersetze "#".
ausgabe.add(aktAusg);
return ausgabe;
}
/**
* Erzeugt einen einzelnen Parametersatz mit den in <code>params</code>
* gespeicherten Parametern und den angegebenen �nderungen.
*
* @param params Die zugrundeliegenden Parameter. Kann
* <code>null</code> sein.
* @param aenderungen Die �nderungen.
*
* @return Der einzelne Parametersatz als String.
*/
public String erzeugeEinzPar(
final Parametersatz params,
final String[] aenderungen) {
Parametersatz neu = new Parametersatz(params);
neu.ergaenze();
neu.neuePars(aenderungen);
return neu.parStrPlain().replace('\n', ' ');
}
/**
* @param anf Der Anfangswert (inkl).
* @param end Der Endwert (inkl, falls nicht �bersprungen).
* @param schritt Die Schrittweite.
*
* @return Die Zahlen innerhalb der Range.
*/
public String[] erzeugeRange(
final int anf,
final int end,
final int schritt) {
String[] ausg = new String[(end - anf) / schritt + 1];
int zaehler = 0;
for (int i = anf; i <= end; i += schritt) {
ausg[zaehler] = "" + i;
zaehler++;
}
return ausg;
}
/**
* @param anf Der Anfangswert (inkl).
* @param end Der Endwert (inkl, falls nicht �bersprungen).
* @param schritt Die Schrittweite.
*
* @return Die Zahlen innerhalb der Range.
*/
public String[] erzeugeRangeDouble(
final double anf,
final double end,
final double schritt) {
String[] ausg = new String[(int) ((end - anf) / schritt + 1)];
int zaehler = 0;
for (double i = anf; i <= end; i += schritt) {
ausg[zaehler] = "" + i;
zaehler++;
}
return ausg;
}
/**
* Erzeugt fertige Jobdatens�tze f�r JoSchKa, die direkt in eine Job-Datei
* eingef�gt werden k�nnen. UserIdentifier und PreUserIdentifier werden
* automatisch eingef�gt.
*
* @param jobType Jobverzeichnisbeschreibung.
* @param platform Plattform.
* @param startKommando Das Startkommando (Parameter werden angef�gt).
* @param resultFiles Welche Dateien wieder zur�ckgeholt werden
* sollen.
* @param maintainOutput MainTainOutPut.
* @param files Hochzuladende Dateien.
* @param mailNotification Email-Benachrichtigung.
* @param periodicUpload Periodischer Upload.
* @param param Die Parameter f�r den Start.
*
* @return Die JoSchKa-Datens�tze.
*/
public ArrayList<String> erzeugeJoSchKa(
final String jobType,
final String platform,
final String startKommando,
final String resultFiles,
final String maintainOutput,
final String files,
final String mailNotification,
final String periodicUpload,
final ArrayList<String> param) {
ArrayList<String> joschka = new ArrayList<String>(param.size());
for (int i = 0; i < param.size(); i++) {
joschka.add("");
joschka.set(i, joschka.get(i) + jobType);
joschka.set(i, joschka.get(i) + "\t" + platform);
joschka.set(
i,
joschka.get(i)
+ "\t"
+ startKommando
+ " "
+ param.get(i));
joschka.set(i, joschka.get(i) + "\t" + resultFiles);
joschka.set(i, joschka.get(i) + "\t" + maintainOutput);
joschka.set(i, joschka.get(i) + "\t" + files);
joschka.set(i, joschka.get(i) + "\t" + mailNotification);
joschka.set(i, joschka.get(i) + "\t" + periodicUpload);
joschka.set(i, joschka.get(i) + "\t" + i); // UserIdentifier.
joschka.set(i, joschka.get(i) + "\t"); // PreUserIdentifier.
}
return joschka;
}
/**
* Erzeugt fertige Jobdatens�tze f�r JoSchKa, die direkt in eine Job-Datei
* eingef�gt werden k�nnen. UserIdentifier und PreUserIdentifier sowie
* alle Standardparameter werden automatisch eingef�gt.
*
* @param jobType Jobverzeichnisbeschreibung.
* @param startKommando Das Startkommando (Parameter werden angef�gt).
* @param param Die Parameter f�r den Start.
* @param params Der Parametersatz.
*
* @return Die JoSchKa-Datens�tze.
*/
public ArrayList<String> erzeugeJoSchKaStd(
final String jobType,
final String startKommando,
final ArrayList<String> param,
final Parametersatz params) {
return this.erzeugeJoSchKa(
jobType,
params.getJoschkaPlatt(),
startKommando,
"*",
"no",
"*",
"no",
"yes",
param);
}
}