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.
243 lines
7.8 KiB
243 lines
7.8 KiB
/* |
|
* de.superx.etl - a package for controlling ETL routines |
|
* Copyright (C) 2021 Daniel Quathamer <danielq@memtext.de> |
|
* |
|
* This package is licensed under the CampusSource License; |
|
* http://www.campussource.de/org/license/ |
|
*/ |
|
package de.superx.elt; |
|
|
|
import java.io.IOException; |
|
import java.io.PrintStream; |
|
import java.io.StringWriter; |
|
import java.sql.Connection; |
|
import java.sql.ResultSet; |
|
import java.sql.SQLException; |
|
import java.util.Iterator; |
|
import java.util.Properties; |
|
|
|
import javax.sql.DataSource; |
|
|
|
import org.springframework.jdbc.core.JdbcTemplate; |
|
import org.springframework.jdbc.core.RowCallbackHandler; |
|
import org.springframework.jdbc.datasource.DriverManagerDataSource; |
|
|
|
import de.memtext.rights.RightsKeyEntry; |
|
import de.superx.common.SuperX_el; |
|
import de.superx.common.SxResultRow; |
|
import de.superx.common.SxResultSet; |
|
import de.superx.common.SxSqlHelper; |
|
import de.superx.etl.EtlUtils; |
|
import de.superx.servlet.SxPools; |
|
import de.superx.util.SqlStringUtils; |
|
import freemarker.template.TemplateBooleanModel; |
|
|
|
public class EtlActionJob extends EtlAction { |
|
private String mandantenID; |
|
private String jobTid; |
|
private String jobUniquename; |
|
private String jobLogfile; |
|
private String jobCaption; |
|
private Properties runTimeParams; |
|
|
|
private StringWriter sw; |
|
public EtlActionJob(String uniquename, String logfile, String propfile) { |
|
super(uniquename, logfile, propfile); |
|
sw=new StringWriter(); |
|
} |
|
public EtlActionJob(String uniquename) { |
|
super(uniquename); |
|
sw=new StringWriter(); |
|
} |
|
|
|
public StringWriter getSw() { |
|
return sw; |
|
} |
|
public void setSw(StringWriter sw) { |
|
this.sw = sw; |
|
} |
|
public void setRunTimeParams(String runTimeParamsArg) throws IOException { |
|
if(runTimeParamsArg!=null) |
|
this.runTimeParams = EtlUtils.convertStringToProperty(runTimeParamsArg); |
|
} |
|
|
|
|
|
public void initJob(String job,String runtimeParamsArg) throws Exception |
|
{ |
|
long jetzt = new java.util.Date().getTime() ; |
|
EtlUtils.initJobEnvironment(); |
|
String paramName=null; |
|
String paramCaption; |
|
String paramDefault=""; |
|
String paramProperties=""; |
|
if(runtimeParamsArg==null) |
|
runtimeParamsArg=""; |
|
runtimeParamsArg="SUPERX_DIR="+EtlUtils.SUPERX_DIR+EtlUtils.NEWLINE+runtimeParamsArg; |
|
//super.addActionLog("runtimeParamsArg:"+runtimeParamsArg); |
|
this.setStarttime(jetzt); |
|
Connection myConnection=this.getDbconnection(); |
|
if(myConnection==null) |
|
myConnection=this.getConnection(myConnection); |
|
this.setDbconnection(myConnection); |
|
if(!SqlStringUtils.checkValidKeyEntry(job)) |
|
throw new SQLException("Invalid job "+job); |
|
String sql = "select J.tid,J.uniquename,J.caption,J.logfile, P.uniquename as param_name,P.name as param_caption, P.param_default from etl_job J left outer join etl_job_param P on (J.tid=P.etl_job_id) where J.uniquename='"+job+"';"; |
|
|
|
SuperX_el el = new SuperX_el(); |
|
SxSqlHelper sh=new SxSqlHelper(); |
|
|
|
sh.execute(sql, myConnection, el); |
|
if (el.getError_String() != null |
|
&& !el.getError_String().trim().equals("")) |
|
throw new SQLException("\nProblem bei Job DETAILS:" + "\n\n Meldung:" |
|
+ el.getError_String() + "\n sql:" + sql); |
|
SxResultSet result= el.getResultSet(); |
|
int rownr=0; |
|
for (Iterator it = result.iterator(); it.hasNext();) { |
|
rownr++; |
|
SxResultRow row = (SxResultRow) it.next(); |
|
jobTid=row.get(0).toString().trim(); |
|
jobUniquename=row.get(1).toString().trim(); |
|
jobCaption=row.get(2).toString().trim(); |
|
jobLogfile=row.get(3).toString().trim(); |
|
if(row.get(4)!=null) |
|
paramName=row.get(4).toString().trim(); |
|
if(row.get(5)!=null) |
|
paramCaption=row.get(5).toString().trim(); |
|
if(row.get(4)!=null) |
|
paramDefault=row.get(6).toString().trim(); |
|
if(paramName!=null) |
|
paramProperties+=(paramName+"="+paramDefault+EtlUtils.NEWLINE); |
|
|
|
} |
|
if(rownr==0) |
|
throw new Exception("Job "+job+" unbekannt"); |
|
//this.setLogfile(jobLogfile); |
|
//this.appendLog("Job gefunden: "+jobCaption+EtlUtils.NEWLINE); |
|
super.addActionLog("Job gefunden: "+jobCaption+EtlUtils.NEWLINE); |
|
if(!paramProperties.equals("")) |
|
this.setParams(EtlUtils.convertStringToProperty(paramProperties)); |
|
if(runtimeParamsArg!=null) |
|
{ |
|
this.setRunTimeParams(runtimeParamsArg); |
|
super.addActionLog("Runtime Params: "+runtimeParamsArg); |
|
} |
|
if(runTimeParams!=null) |
|
this.setParams(de.superx.elt.EtlUtils.mergeParamProperties(this.getParams(), runTimeParams)); |
|
super.addActionLog("Job "+jobCaption+ " initialized"); |
|
} |
|
public int execute(String outfile) throws SQLException, Exception |
|
{ |
|
Integer stepTid; |
|
String stepUniquename; |
|
String stepCaption; |
|
String stepLogfile; |
|
Integer stepSortnr; |
|
Integer stepForceContinue; |
|
Integer stepParentStepId; |
|
String stepTypeUniquename; |
|
String stepTypeCaption; |
|
String stepTypeHandler; |
|
|
|
|
|
int jobReturnCode=0; |
|
String sql = "select S.tid,"+ |
|
"S.uniquename,"+ |
|
"S.caption,"+ |
|
"S.systeminfo_id,"+ |
|
"R.sortnr,"+ |
|
"R.force_continue::integer as force_continue,"+ |
|
"R.parent_step_id,"+ |
|
"S.logfile,"+ |
|
"T.uniquename,"+ |
|
"T.caption,"+ |
|
"T.handler"; |
|
sql +=" FROM etl_step S, etl_step_type T, etl_step_relation R where T.tid=S.step_type_id and R.step_id=S.tid and R.job_id="+jobTid+" order by R.sortnr,R.tid;"; |
|
|
|
SuperX_el el = new SuperX_el(); |
|
SxSqlHelper sh=new SxSqlHelper(); |
|
|
|
try { |
|
sh.execute(sql, this.getConnection(null), el); |
|
} catch (Exception e1) { |
|
|
|
super.addActionLog("Fehler beim SQL: "+sql+EtlUtils.NEWLINE+el.getError_String().trim()); |
|
return 1; |
|
} |
|
if (el.getError_String() != null |
|
&& !el.getError_String().trim().equals("")) |
|
throw new SQLException("\nProblem bei Steps DETAILS:" + "\n\n Meldung:" |
|
+ el.getError_String() + "\n sql:" + sql); |
|
SxResultSet result= el.getResultSet(); |
|
int rownr=0; |
|
super.addActionLog("Steps found: "+ result.size()); |
|
//erstmal nicht mit Zeit: executionTime=\""+de.memtext.util.DateUtils.getTodayString()+" " + de.memtext.util.DateUtils.getNowString()+"\" |
|
sw.write("<?xml version=\"1.0\" encoding=\""+SqlStringUtils.getEncoding()+"\" ?><etlAction name=\""+this.jobUniquename+"\">\n"); |
|
for (Iterator it = result.iterator(); it.hasNext();) { |
|
int stepReturnCode=0; |
|
rownr++; |
|
SxResultRow row = (SxResultRow) it.next(); |
|
stepTid=(Integer) row.get(0); |
|
stepUniquename=row.get(1).toString().trim(); |
|
stepCaption=row.get(2).toString().trim(); |
|
stepSortnr=(Integer) row.get(4); |
|
stepForceContinue=(Integer) row.get(5); |
|
stepParentStepId=(Integer) row.get(6); |
|
stepLogfile=row.get(7).toString().trim(); |
|
stepTypeUniquename=row.get(8).toString().trim();; |
|
stepTypeCaption=row.get(9).toString().trim();; |
|
stepTypeHandler=row.get(10).toString().trim();; |
|
EtlStep myStep=new EtlStep(stepUniquename,jobLogfile,propfile); |
|
myStep.setOutputStringWriter(sw); |
|
myStep.initStep(jobUniquename, this.getParams(), stepTid, |
|
stepUniquename, |
|
stepLogfile, |
|
stepCaption, |
|
stepSortnr, |
|
stepForceContinue, |
|
stepParentStepId, |
|
stepTypeUniquename, |
|
stepTypeCaption, |
|
stepTypeHandler); |
|
stepReturnCode=myStep.execute(); |
|
super.addActionLog(myStep.getActionLog().toString()); |
|
sw=myStep.getOutputStringWriter(); |
|
if(stepReturnCode!=0) |
|
{ |
|
if(stepForceContinue.intValue()==0) |
|
jobReturnCode=1; |
|
break; |
|
} |
|
} |
|
if(rownr==0) |
|
throw new Exception("Steps unbekannt"); |
|
sw.write("\n</etlAction>\n"); |
|
if(outfile==null || outfile.equals("")) |
|
{ |
|
System.out.println(sw.toString()); |
|
System.out.println(super.getActionLog()); |
|
} |
|
else |
|
{ |
|
if(jobReturnCode==1) |
|
{ |
|
System.err.println(super.getActionLog()); |
|
throw new Exception("Fehler bei Jobausführung"); |
|
} |
|
else |
|
System.out.println("Jobausführung Erfolg"); |
|
try { |
|
de.superx.elt.EtlUtils.saveFileContentsWithEncoding(outfile, sw.toString(), null); |
|
} catch (Exception e) { |
|
// TODO Auto-generated catch block |
|
e.printStackTrace(); |
|
jobReturnCode=1; |
|
} |
|
} |
|
long jetzt = new java.util.Date().getTime() ; |
|
this.setEndtime(jetzt); |
|
|
|
|
|
return jobReturnCode; |
|
} |
|
}
|
|
|