SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

245 lines
8.8 KiB

package de.superx.bin;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import de.memtext.util.GetOpts;
import de.memtext.util.StringUtils;
import de.superx.bin.fm.EtlStarter;
import de.superx.common.DBServletException;
import de.superx.common.SuperX_el;
import de.superx.common.SxResultRow;
import de.superx.common.SxResultSet;
import de.superx.servlet.ServletUtils;
import de.superx.servlet.SuperXManager;
import de.superx.servlet.SxPools;
public class KettleExecutor {
private String mandantenID;
private SxJob sxJob;
private boolean isPostgres = true;
private StringBuffer resultMessages = new StringBuffer("");
private Map<String, String> jobParams = new HashMap<String, String>();
public KettleExecutor(String mandantenID) {
this.mandantenID = mandantenID;
isPostgres = SxPools.get(mandantenID).getDatabaseAbbr().equals(("PG"));
}
public void setParams(Map<String, String> jobParams) {
this.jobParams = jobParams;
}
public StringBuffer perform() throws IOException, SQLException, DBServletException {
try {
initSxJob();
EtlStarter es = new EtlStarter(this.mandantenID);
if (!isModusVorschau()) {
check_sql("vor");
}
resultMessages.append(es.kettleCallEmbedded(mandantenID, sxJob.getFilepath(), jobParams, isPostgres));
if (isModusVorschau()) {
//Vor Ergebnis Vorschau einfügen
resultMessages.insert(0, getPreviewInfo());
} else {
check_sql("nach");
}
} catch (Exception e) {
throw new IOException(e);
}
return resultMessages;
}
private boolean isModusVorschau() {
return jobParams.containsKey("Modus") && jobParams.get("Modus") != null && jobParams.get("Modus").equals("3");
}
private StringBuilder getPreviewInfo() throws IOException {
StringBuilder result = new StringBuilder();
File loadjoblog = new File(new File(sxJob.getFilepath().replaceAll("file:", "")).getParentFile().getPath() + File.separator + "ladejob.log");
if (loadjoblog.exists()) {
String rawpreview = StringUtils.readFile(loadjoblog);
StringTokenizer st = new StringTokenizer(rawpreview, "\n");
result.append("Vorschau\n");
String currentHeader = "";
while (st.hasMoreTokens()) {
String line = st.nextToken();
if (line.indexOf("|") > -1) {
String firstpart = line.substring(0, line.indexOf("|"));
if (!firstpart.equals(currentHeader)) {
result.append(firstpart + "\n");
currentHeader = firstpart;
result.append("-->" + line.substring(line.indexOf("|") + 1) + "\n");
} else {
result.append("-->" + StringUtils.replace(line, firstpart + "|", "") + "\n");
}
}
}
}
return result;
}
private void check_sql(String pos) throws SQLException, DBServletException {
if (sxJob.check_sql != null) {
SuperX_el el = ServletUtils.execute_el("check_sql " + pos + " Durchführung von Ladejob " + sxJob.getCaption(), sxJob.check_sql, false, mandantenID);
SxResultSet rs = el.getResultSet();
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
Object erg = row.get(0);
if (erg != null) {
resultMessages.append("Prüfselektion " + pos + " Durchführung von Ladejob " + sxJob.getCaption());
resultMessages.append("\n" + erg.toString() + "\n");
}
}
}
}
private void initSxJob() throws SQLException, DBServletException {
SxResultSet rs = ServletUtils.execute("Einlesen von SxJob)", "select caption,filepath,params,check_sql from sx_jobs where tid=" + jobParams.get("Job"), mandantenID);
sxJob = new SxJob();
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
sxJob.setCaption(row.get(0).toString());
sxJob.setFilepath("file://" + SuperXManager.getModuleDir() + File.separator + row.get(1).toString());
sxJob.setParams((String) row.get(2));
sxJob.setCheck_sql((String) row.get(3));
}
}
public static void main(String args[]) {
String usage = "usage: -mandantenID:default -MODULE_PFAD:/home/superx/db/module -WEB_INF_PFAD:/home/superx/webserver/tomcat/webapps/superx/WEB-INF -job_uniquename:abc -path_to_uploadfile:/home/superx (optional)";
GetOpts.setOpts(args);
String isdrin = GetOpts.isAllRequiredOptionsPresent("-mandantenID,-WEB_INF_PFAD,-MODULE_PFAD,-job_uniquename");
if (isdrin != null) {
System.err.println(usage);
System.exit(1);
}
String mandantenID = GetOpts.getValue("-mandantenID");
String job_uniquename = GetOpts.getValue("-job_uniquename");
String webinfpfad=GetOpts.getValue("-WEB_INF_PFAD");
if(webinfpfad != null && !webinfpfad.equals(""))
SuperXManager.setWEB_INFPfad(GetOpts.getValue("-WEB_INF_PFAD"));
SuperXManager.setModuleDir(GetOpts.getValue("-MODULE_PFAD"));
String path_to_uploadfile = "";
if (GetOpts.isPresent("-path_to_uploadfile")) {
path_to_uploadfile = GetOpts.getValue("-path_to_uploadfile");
if (!new File(path_to_uploadfile).exists()) {
System.out.println("Fehler: Datei " + path_to_uploadfile + " nicht gefunden");
System.exit(-1);
}
}
try {
//muss vor SxPools init ausgeführt werden, sonst kann kein kettleDatabaseMeta-Objekt erzeugt werden java.lang.RuntimeException: Database type not found!
KettleEnvironment.init();
SxPools.init();
SxPools.get(mandantenID).init();
//SxPools.get(mandantenID).initLogging(true);
SxPools.resetAllPools();
} catch (Exception e) {
System.out.println("Fehler beim Datenbankverbindungsaufbau " + e);
e.printStackTrace();
;
System.exit(-1);
}
try {
String jobtid = getJobTid(job_uniquename, mandantenID);
KettleExecutor ke = new KettleExecutor(mandantenID);
Map<String, String> jobParams = new HashMap<String, String>();
jobParams.put("Job", jobtid);
jobParams.put("PATH_TO_UPLOADFILE", path_to_uploadfile);
ke.setParams(jobParams);
ke.perform();
System.out.println("Keine Fehler aufgefallen");
} catch (Exception e) {
System.out.println("Fehler bei Verarbeitung " + e);
e.printStackTrace();
System.exit(-1);
}
}
private static String getJobTid(String job_uniquename, String mandantenID) throws SQLException, DBServletException {
String tid = "";
String sql = "select tid from sx_jobs where uniquename='" + job_uniquename + "'";
SxResultSet rs = ServletUtils.execute("Suche tid für sx_job mit uniquename " + job_uniquename, sql, mandantenID);
if (rs.size() == 0) throw new RuntimeException("Kein sx_job mit uniquename " + job_uniquename + " gefunden");
if (rs.size() > 1) throw new RuntimeException("Mehrere sx_jobs mit uniquename " + job_uniquename + " gefunden");
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
Object erg = row.get(0);
if (erg != null) tid = erg.toString();
}
return tid;
}
private class SxJob {
private String filepath;
private String params;
private String check_sql;
private String caption;
public String getCaption() {
return caption;
}
public void setCaption(String caption) {
this.caption = caption;
}
public String getFilepath() {
return filepath;
}
public void setFilepath(String filepath) {
this.filepath = filepath;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getCheck_sql() {
return check_sql;
}
public void setCheck_sql(String check_sql) {
this.check_sql = check_sql;
}
}
}