Compare commits

...

11 Commits

  1. 52
      .classpath
  2. 38
      build.xml
  3. 324
      src-modules/module/etl/conf/etl.xml
  4. 1
      src-modules/module/etl/conf/includes.txt
  5. 41
      src-modules/module/etl/masken/42000_felderinfo.unl
  6. 3
      src-modules/module/etl/masken/42000_masken_felder_bez.unl
  7. 68
      src-modules/module/etl/schluesseltabellen/create_load_etl_masken.sql
  8. 2
      src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql
  9. 67
      src-modules/module/etl/schluesseltabellen/create_load_etl_rpta_column_layout.sql
  10. 22
      src-modules/module/etl/schluesseltabellen/create_load_etl_sx_captions.sql
  11. 28
      src-modules/module/etl/schluesseltabellen/create_load_etl_sxc_stud_zugang_abgang_aggr.sql
  12. 4
      src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl
  13. 184
      src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql
  14. 10
      src-modules/module/etl/schluesseltabellen/etl_step_type.unl
  15. 6
      src-modules/module/etl/schluesseltabellen/fm_templates.unl
  16. 106
      src-modules/module/etl/schluesseltabellen/masken_fuellen.sql
  17. 25
      src-modules/module/etl/schluesseltabellen/sx_captions_fuellen.sql
  18. 17
      src-modules/module/etl/schluesseltabellen/themenbaum_fuellen.sql
  19. 322
      src-modules/module/etl/schluesseltabellen/trans_rpta_column_layout.sql
  20. 42
      src-modules/module/etl/schluesseltabellen/trans_sxc_stud_zugang_abgang_aggr.sql
  21. 131
      src/de/superx/elt/ActionHandler/EtlActionHandler.java
  22. 48
      src/de/superx/elt/ActionHandler/EtlActionHandlerDoquery.java
  23. 71
      src/de/superx/elt/ActionHandler/EtlActionHandlerDosql.java
  24. 34
      src/de/superx/elt/ActionHandler/EtlActionHandlerI.java
  25. 30
      src/de/superx/elt/ActionHandler/EtlActionHandlerMsg.java
  26. 43
      src/de/superx/elt/ActionHandler/EtlActionHandlerUnloadRecords.java
  27. 58
      src/de/superx/elt/ActionHandler/EtlActionHandlerUploadRecords.java
  28. 201
      src/de/superx/elt/EtlAction.java
  29. 243
      src/de/superx/elt/EtlActionJob.java
  30. 239
      src/de/superx/elt/EtlStep.java
  31. 353
      src/de/superx/elt/EtlUtils.java
  32. 437
      src/de/superx/elt/QueryResultSerializer.java
  33. 340
      src/de/superx/elt/SqlExecutor.java
  34. 779
      src/de/superx/elt/TableUploader.java
  35. 212
      src/de/superx/elt/bin/Doquery.java
  36. 192
      src/de/superx/elt/bin/Dosql.java
  37. 70
      src/de/superx/elt/bin/EtlJobExecutor.java
  38. 796
      src/de/superx/elt/bin/SxTransformer.java
  39. 214
      src/de/superx/elt/bin/UnloadRecords.java
  40. 94
      src/de/superx/elt/bin/UploadRecords.java
  41. 98
      src/de/superx/elt/util/FileUtils.java
  42. 155
      src/de/superx/elt/util/GetOpts.java
  43. 220
      src/de/superx/elt/util/GetOptsBackport.java
  44. 134
      src/de/superx/rest/JobEtlXml.java
  45. 213
      src/de/superx/sxrest/JobEtlXml.java
  46. 47
      src/de/superx/sxrest/JobExecutor.java
  47. 81
      src/de/superx/sxrest/LaunchUpgrade.java
  48. 200
      src/de/superx/sxrest/MaskXml.java
  49. BIN
      superx/WEB-INF/lib/spring-context-indexer-6.2.19.jar
  50. BIN
      superx/WEB-INF/lib/superx-etl.jar
  51. 259
      superx/edit/etl/etl_job_bearbeiten.jsp
  52. 158
      superx/edit/etl/etl_job_param_bearbeiten.jsp
  53. 138
      superx/edit/etl/etl_manager.jsp
  54. 218
      superx/edit/etl/etl_step_bearbeiten.jsp
  55. 150
      superx/edit/etl/etl_step_property_bearbeiten.jsp
  56. 109
      superx/edit/etl/etl_step_type_liste.jsp
  57. 8
      superx/edit/etl/saveEtlXml.jsp
  58. 63
      superx/images/resultset_up.svg

52
.classpath

@ -1,23 +1,39 @@ @@ -1,23 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/freemarker-2.3.25.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/postgresql-42.2.19.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/saxon-he-10.5.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib_ext/servlet-api.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/jersey-core-1.11.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/fop-2.2.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/spring-jdbc-3.0.3.RELEASE.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/kettle-core-6.0.0.0-353.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/log4j-core-2.16.0.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/log4j-1.2-api-2.16.0.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/log4j-api-2.16.0.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/slf4j-api-1.6.1.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/slf4j-log4j12-1.6.1.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/dom4j-1.6.1.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/kettle-engine-6.0.0.0-353.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/metastore-6.0.0.0-353.jar"/>
<classpathentry kind="lib" path="/kern/superx/WEB-INF/lib/superx5.2.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/dom4j-2.1.4.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/fop-2.2.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/fop-2.2-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/freemarker-2.3.33.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/freemarker-2.3.33-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/kettle-core-8.3.0.0-SNAPSHOT.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/kettle-core-8.3.0.0-SNAPSHOT-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/kettle-engine-8.3.0.0-SNAPSHOT.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/kettle-engine-8.3.0.0-SNAPSHOT-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/log4jdbc-1.2.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/log4jdbc-1.2-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/metastore-6.0.0.0-353.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/postgresql-42.7.2.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/postgresql-42.7.2-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/saxon-he-10.5.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/saxon-he-10.5-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/slf4j-api-1.6.4.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/slf4j-api-1.6.4-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/slf4j-log4j12-1.6.4.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/slf4j-log4j12-1.6.4-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/spring-jdbc-6.2.19.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/spring-jdbc-6.2.19-sources.jar">
<attributes>
<attribute name="javadoc_location" value="jar:platform:/resource/superx/WEB-INF/lib/spring-jdbc-6.2.19.jar/../javadoc/spring-jdbc-6.2.19-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/superx6.0.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib_ext/jakarta.servlet-api-6.0.0.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/spring-web-6.2.19.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/spring-web-6.2.19-sources.jar">
<attributes>
<attribute name="javadoc_location" value="jar:platform:/resource/superx/WEB-INF/lib/spring-web-6.2.19.jar/../javadoc/spring-web-6.2.19-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/jaxws-api-2.1.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/jaxws-api-2.1-sources.jar"/>
<classpathentry kind="lib" path="/eduStore_superX/superx/WEB-INF/lib/jersey-bundle-1.19.4.jar" sourcepath="/eduStore_superX/superx/WEB-INF/lib/src/jersey-bundle-1.19.4-sources.jar">
<attributes>
<attribute name="javadoc_location" value="jar:platform:/resource/superx/WEB-INF/lib/jersey-bundle-1.19.4.jar/../javadoc/jersey-bundle-1.19.4-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="superx/WEB-INF/classes"/>
</classpath>

38
build.xml

@ -13,6 +13,7 @@ ant -DWEBAPP=$WEBAPP distEtl @@ -13,6 +13,7 @@ ant -DWEBAPP=$WEBAPP distEtl
ant -DWEBAPP=$WEBAPP cleanBuildPath
-->
<dirname file="${ant.file.superx}" property="superxBuildBaseDir" />
<property name="spring.version" value="6.2.19"/>
<property name="distDir" location="${superxBuildBaseDir}/superx/WEB-INF/lib" />
<property environment="env" />
@ -20,8 +21,10 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath @@ -20,8 +21,10 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath
<property name="BASE_DIR" value="." />
<property name="SUPERX_DIR" value="${WEBAPP}"/>
<property name="BUILD_PATH" value="${WEBAPP}/WEB-INF/classes"/>
<property name="TARGET_SRC_DIR" value="${WEBAPP}/WEB-INF/src"/>
<property name="SRC_DIR" value="${BASE_DIR}/src" />
<property name="SRC_DIR_TEST" value="${BASE_DIR}/test-src"/>
<property name="LIB_ETL_DIR" value="${BASE_DIR}/superx/WEB-INF/lib"/>
<property name="LIB_SUPERX_DIR" value="${WEBAPP}/WEB-INF/lib"/>
<property name="LIB_WEBAPP_DIR" value="${WEBAPP}"/>
<property name="LIB_EXT_SUPERX_DIR" value="${WEBAPP}/WEB-INF/lib_ext"/>
@ -55,7 +58,12 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath @@ -55,7 +58,12 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath
<fileset dir="${LIB_EXT_SUPERX_DIR}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${LIB_ETL_DIR}">
<include name="*.jar" />
</fileset>
</path>
<path id="processor.path">
<pathelement location="lib/spring-context-indexer-${spring.version}.jar"/>
</path>
<condition property="isWindoze">
<os family="windows" />
@ -149,7 +157,7 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath @@ -149,7 +157,7 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath
<delete>
<fileset dir="${distDir}" includes="superx-etl*.jar" />
</delete>
<jar destfile="${distDir}/superx-etl.jar" basedir="${BUILD_PATH}" includes="de/superx/elt/** de/superx/sxrest/**" excludes="freemarker/**/* com/**/* javax/**/* **/*.java">
<jar destfile="${distDir}/superx-etl.jar" basedir="${BUILD_PATH}" includes="de/superx/rest/**" excludes="freemarker/**/* com/**/* javax/**/* **/*.java">
<manifest>
<!-- Who is building this jar? -->
<attribute name="Built-By" value="superx"/>
@ -163,26 +171,32 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath @@ -163,26 +171,32 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath
<target name="compileSuperx" depends="cleanBuildPath" description="Compile all classes for superx.">
<filter token="sxtimestamp" value="${SX_TIMESTAMP}" />
<filter token="version" value="${etl_version}" />
<!-- MB 13.8.2009 auch mitkompilieren <echo message="de/memtext/db/Servlet* weggelassen"/>-->
<copy todir="${BUILD_PATH}" filtering="true">
<fileset dir="${SRC_DIR}">
<include name="**/*.java" />
<include name="**/*.properties" />
<include name="**/*.gif" />
<include name="**/*.xml" />
<include name="edustore/*" />
<include name="saiku-datasources/*" />
<include name="saiku-repository/*" />
<exclude name="de/superx/docmanagement/*"/>
</fileset>
</copy>
<copy todir="${TARGET_SRC_DIR}" filtering="true">
<fileset dir="${SRC_DIR}">
<include name="**/*.java" />
</fileset>
</copy>
<!--Quellcode für Auslieferung-->
<!--<echo message="cp:${FULL_CLASSPATH}"/>-->
<javac source="1.8" target="1.8"
<javac source="17" target="17"
srcdir="${BUILD_PATH}" excludes="**/*Test*.java,test/**/*"
destdir="${BUILD_PATH}"
listfiles="false" encoding="UTF-8" debug="yes">
listfiles="false" encoding="UTF-8" nowarn="on" debug="true" debuglevel="lines,vars,source">
<classpath refid="classpath" />
<compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" />
<compilerarg value="-proc:full"/>
<!--<compilerarg value="-Xlint:unchecked"/>-->
</javac>
</target>
<target name="cleanBuildPath" depends="initTimestamp" description="Löscht alle *.class-Dateien in WEB-INF/classes">

324
src-modules/module/etl/conf/etl.xml

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE module SYSTEM "../../../conf/superx-module.dtd"> -->
<module name="etl" version="0.5b" sachgebiet_id="270"
<module name="etl" version="0.7b" sachgebiet_id="270"
sachgebiet="Laderoutinen" systeminfo_id="270"
system="Laderoutinen" thema="Laderoutinen" thema_parent="Abfragen">
<database name="superx" system="superx">
@ -9,6 +9,256 @@ system="Laderoutinen" thema="Laderoutinen" thema_parent="Abfragen"> @@ -9,6 +9,256 @@ system="Laderoutinen" thema="Laderoutinen" thema_parent="Abfragen">
rightname="CS_BIA_STANDARDREPORTS_ADMIN[ETL]" />
</sachgebiete>
<!--die folgenden Tabellen sind Teil des Kernmoduls und müssen auskommentiert bleiben-->
<table name="etl_step" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Ladeschritte</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="uniquename" type="VARCHAR" size="255" default=""
notnull="true" description="Unique Name" />
<column name="caption" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="systeminfo_id" type="INTEGER" size="" default=""
notnull="true" description="Komponente" />
<column name="step_type_id" type="INTEGER" size="2" default=""
notnull="true" description="Typ des Schrittes">
<comment>1=Gruppierung,
2=Loadtable,3=nativeaction,4=loadmask,5=select</comment>
</column>
<column name="logfile" type="VARCHAR" size="255" default=""
notnull="false" description="Logdatei" />
<column name="custom_step" type="SMALLINT" size="255"
default="1" notnull="false" description="Ladeschritt custom">
<comment>1=ja, d.h. von der Hochschule angepaßt, 0=nein, d.h.
Auslieferung der Software</comment>
</column>
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_step</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_step_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_step_type" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Arten von Ladeschritten, z.B.
loadtable, nativeaction,unload</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="uniquename" type="VARCHAR" size="255" default=""
notnull="true" description="Unique Name" />
<column name="caption" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="handler" type="VARCHAR" size="255" default=""
notnull="false" description="Handler-Anwendung" />
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_step_type</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_step_type_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_step_type_param" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Parameter für Arten von
Ladeschritten</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="etl_step_type_id" type="INTEGER" size=""
default="" notnull="true" description="Arten des Ladeschritts" />
<column name="uniquename" type="VARCHAR" size="255" default=""
notnull="true" description="Unique Name" />
<column name="name" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="param_default" type="VARCHAR" size="255"
default="" notnull="false" description="Defaultwert" />
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_step_type_param</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_step_type_param_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_step_property" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Eigenschaften von Ladeschritten
</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="etl_step_id" type="INTEGER" size="" default=""
notnull="true" description="Arten des Ladeschritts" />
<column name="prop_name" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="prop_value" type="TEXT" size="255" default=""
notnull="false" description="Wert" />
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_step_property</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_step_property_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_step_relation" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Beziehungen zwischen Ladeschritten,
und Ausführungssteuerung</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="step_id" type="INTEGER" size="2" default=""
notnull="true" description="Ladeschritt"></column>
<column name="parent_step_id" type="INTEGER" size="2"
default="" notnull="false" description="Übergeordneter Ladeschritt"></column>
<column name="job_id" type="INTEGER" size="2" default=""
notnull="true" description="Ladejob"></column>
<column name="force_continue" type="SMALLINT" size="2"
default="1" notnull="false"
description="Ladejob bei Fehler weiterführen"></column>
<column name="step_active" type="SMALLINT" size="2"
default="1" notnull="false" description="Ladeschritt aktiv"></column>
<column name="sortnr" type="INTEGER" size="2" default="1"
notnull="false" description="Ladeschritt Sortiernr."></column>
<column name="custom_step" type="SMALLINT" size="2"
default="1" notnull="false" description="Ladeschritt custom">
<comment>1=ja, d.h. von der Hochschule angepaßt, 0=nein, d.h.
Auslieferung der Software</comment>
</column>
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_step_relation</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_step_relation_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_job" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Ladejobs</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="uniquename" type="VARCHAR" size="255" default=""
notnull="true" description="Schlüssel" />
<column name="caption" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="systeminfo_id" type="INTEGER" size="" default=""
notnull="true" description="Komponente" />
<column name="logfile" type="VARCHAR" size="255" default=""
notnull="false" description="Logdatei" />
<column name="custom_job" type="SMALLINT" size="255"
default="1" notnull="false" description="Job custom">
<comment>1=ja, d.h. von der Hochschule angepaßt, 0=nein, d.h.
Auslieferung der Software von HIS, 2=Auslieferung durch SuperX</comment>
</column>
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_job</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_job_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
<index name="ix_etl_job1" type="unique">
<index-column name="uniquename" />
</index>
</indexes>
</table>
<table name="etl_job_param" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Parameter für Ladejobs</description>
<columns>
<column name="tid" type="SERIAL" size="" default=""
notnull="true" description="tid" isKey="true" />
<column name="etl_job_id" type="INTEGER" size="" default=""
notnull="true" description="Ladejob" />
<column name="uniquename" type="VARCHAR" size="255" default=""
notnull="true" description="Schlüssel" />
<column name="name" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="param_default" type="VARCHAR" size="255"
default="" notnull="false" description="Defaultwert" />
</columns>
<primaryKeys>
<rs>
<row>
<fld name='table_cat'>superx</fld>
<fld name='table_schem'>superx</fld>
<fld name='table_name'>etl_job_param</fld>
<fld name='column_name'>tid</fld>
<fld name='key_seq'>1</fld>
<fld name='pk_name'>etl_job_param_pk</fld>
</row>
</rs>
</primaryKeys>
<indexes>
</indexes>
</table>
<table name="etl_job_metadata" thema="Administration" releaseUnload="demo"
typ="Schlüsseltabelle">
<description>Schlüsseltabelle für Metadaten Ladejobs</description>
@ -49,14 +299,14 @@ rightname="CS_BIA_STANDARDREPORTS_ADMIN[ETL]" /> @@ -49,14 +299,14 @@ rightname="CS_BIA_STANDARDREPORTS_ADMIN[ETL]" />
notnull="true" description="Unique Name" />
<column name="caption" type="VARCHAR" size="255" default=""
notnull="" description="Bezeichnung" />
<column name="systeminfo_id" type="INTEGER" size="" default=""
notnull="true" description="Komponente" />
<column name="job_export" type="VARCHAR" size="255" default=""
notnull="" description="Job zum Exportieren" />
<column name="job_import" type="VARCHAR" size="255" default=""
notnull="" description="Job zum Importieren" />
<column name="job_param_ui" type="VARCHAR" size="255" default=""
notnull="" description="Identifikator im Job" />
<column name="systeminfo_id" type="INTEGER" size="" default=""
notnull="true" description="Komponente" />
<column name="maskeninfo_id" type="INTEGER" size="" default=""
notnull="false" description="Maske (für Suche/Auswahl)" />
<column name="felderinfo_id" type="INTEGER" size="" default=""
@ -134,7 +384,13 @@ parent="Laderoutinen">Abfragen zur Administration</thema> @@ -134,7 +384,13 @@ parent="Laderoutinen">Abfragen zur Administration</thema>
displayType="select" visibleFields="caption" format="%s">
<relation-column from="tid" to="parent_step_id" />
</relation>
</data-integrity>
<!-- etl_job_param -->
<relation from="etl_job" to="etl_job_param" delete="FALSE"
displayType="select" visibleFields="caption" format="%s">
<relation-column from="tid" to="etl_job_id" />
</relation>
</data-integrity>
</database>
<install_upgrade_job>
@ -190,7 +446,9 @@ parent="Laderoutinen">Abfragen zur Administration</thema> @@ -190,7 +446,9 @@ parent="Laderoutinen">Abfragen zur Administration</thema>
</action>
</install-upgrade-step>
<install-upgrade-step name="install_masks" type="container" id="etl_install_masks_containernode">
<action error="stop"/>
<action error="stop">
<loadtable refresh="true" delimiter="^" header="false" tabname="etl_step_type"><file path="$ETL_PFAD/schluesseltabellen/etl_step_type.unl"/></loadtable>
</action>
</install-upgrade-step>
</install_upgrade_job>
@ -381,7 +639,7 @@ parent="Laderoutinen">Abfragen zur Administration</thema> @@ -381,7 +639,7 @@ parent="Laderoutinen">Abfragen zur Administration</thema>
<loadtable refresh="true" delimiter="^" header="false" tabname="etl_manager_tab"><file path="$ETL_PFAD/schluesseltabellen/etl_manager_tab.unl"/></loadtable>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/sachgebiete_fuellen.sql" database=""/>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_fuellen.sql" database=""/>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_users_groups.sql" database=""/>
<!--<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_users_groups.sql" database=""/>-->
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_sichten.sql" database=""/>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_sx_captions.sql" database=""/>
@ -419,7 +677,7 @@ version integer @@ -419,7 +677,7 @@ version integer
<loadtable refresh="true" delimiter="^" header="false" tabname="etl_manager_tab"><file path="$ETL_PFAD/schluesseltabellen/etl_manager_tab.unl"/></loadtable>
<loadtable refresh="true" delimiter="^" header="false" tabname="etl_step_type"><file path="$ETL_PFAD/schluesseltabellen/etl_step_type.unl"/></loadtable>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_fuellen.sql" database=""/>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_users_groups.sql" database=""/>
<!--<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_users_groups.sql" database=""/>-->
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_sichten.sql" database=""/>
<nativeaction sql="" scriptfile="$ETL_PFAD/schluesseltabellen/etl_step_sx_captions.sql" database=""/>
@ -475,7 +733,7 @@ mode="update_insert_delete_copy"> @@ -475,7 +733,7 @@ mode="update_insert_delete_copy">
<customfield name="job_id" type="hidden" overrideValue="tid" />
<customfield name="name" nullFieldValue="" visibleSize="30" />
<customfield name="uniquename" visibleSize="50" nullFieldValue="" />
<customfield name="param_default" nullFieldValue="" visibleSize="30" />
<customfield type="link" name="Details" path="/superx/edit/etl/etl_job_param_edit.jsp" linkVar="tid" linkid="tid"/>
</customfield>
<customfield name="Ladeschritte" type="subform" multipart="false" autoUpdate="false"
maxRows="*" table="etl_step_relation" parentField="tid" childField="job_id"
@ -494,6 +752,50 @@ mode="update_insert_delete_copy"> @@ -494,6 +752,50 @@ mode="update_insert_delete_copy">
</customfield>
</form>
<form name="etl_step_property_edit"
table="etl_step_property"
path="/edit/etl/etl_step_property_edit.jsp"
followUp=""
caption="Eigenschaften von für Ladeschritten verwalten"
orderBy=""
gotoHt=""
helpfile=""
maxRows="1"
mode="full">
<description>In diesem Formular können Sie Parameter für Ladejobs verwalten.</description>
<filters>
<filter mandatory="true" type="equals">tid</filter>
</filters>
<field-selection complete="false" />
<customfield name="tid" nullFieldValue="" />
<customfield name="etl_step_id" nullFieldValue="" visibleSize="30" />
<customfield name="prop_name" nullFieldValue="" visibleSize="30" />
<customfield name="prop_value" nullFieldValue="" pattern="" visibleSize="50" />
</form>
<form name="etl_job_param_edit"
table="etl_job_param"
path="/edit/etl/etl_job_param_edit.jsp"
followUp=""
caption="Parameter für Ladejobs verwalten"
orderBy=""
gotoHt=""
helpfile=""
maxRows="1"
mode="full">
<description>In diesem Formular können Sie Parameter für Ladejobs verwalten.</description>
<filters>
<filter mandatory="true" type="equals">tid</filter>
</filters>
<field-selection complete="false" />
<customfield name="tid" nullFieldValue="" />
<customfield name="etl_job_id" nullFieldValue="" visibleSize="30" />
<customfield name="uniquename" nullFieldValue="" visibleSize="30" />
<customfield name="name" nullFieldValue="" pattern="" visibleSize="50" />
<customfield name="param_default" nullFieldValue="" pattern="" visibleSize="50" />
</form>
<form name="etl_step_edit"
table="etl_step"
path="/edit/etl/etl_step_edit.jsp"
@ -524,10 +826,12 @@ mode="update_insert_delete_copy"> @@ -524,10 +826,12 @@ mode="update_insert_delete_copy">
<customfield name="tid" nullFieldValue="" />
<customfield name="etl_step_id" type="hidden" overrideValue="tid" />
<customfield name="prop_name" nullFieldValue="" visibleSize="30" />
<customfield name="prop_value" visibleSize="50" nullFieldValue="" />
<customfield type="link" name="Details" path="/superx/edit/etl/etl_step_property_edit.jsp" linkVar="tid" linkid="tid"/>
</customfield>
</form>
<!--<customfield name="prop_value" visibleSize="50" nullFieldValue="" />
</customfield>-->
</form>
<form name="etl_step_type_list"
table="etl_step_type"
path="/edit/etl/etl_step_type_list.jsp"

1
src-modules/module/etl/conf/includes.txt

@ -3,4 +3,5 @@ WEB-INF/conf/edustore/db/bin/SQL_ENV_etl.sam @@ -3,4 +3,5 @@ WEB-INF/conf/edustore/db/bin/SQL_ENV_etl.sam
WEB-INF/lib/superx-etl.jar
images/eye.svg
images/downloadblck.svg
images/resultset_up.svg

41
src-modules/module/etl/masken/42000_felderinfo.unl

@ -2,10 +2,10 @@ @@ -2,10 +2,10 @@
42001^Laderoutine^0^0^0^150^80^1^integer^200^0^1^<<SQL>> select tid,caption from etl_job order by 2;^^^
42002^Arten von Ladeschritten^100^0^0^150^300^1^char^30^0^18^^^<<SQL>>select '../edit/etl/etl_step_type_list.jsp' from xdummy;^
42003^Name^20^0^0^150^150^1^sql^50^0^0^^^^
42004^Komponente^30^0^0^150^200^1^integer^200^0^1^<<SQL>> select tid,name from systeminfo order by 2;^^^
42004^Sicht^30^0^0^150^200^20^sql^200^0^1^<<SQL>> select tid,trim(art) || '- ' || trim(name) from sichten where aktiv=1 and position('<#' in quelle) =0 order by 2;^hidden^^
42005^Job-Management^1000^0^0^150^300^1^char^30^0^18^^^<<SQL>>select '../edit/etl/etl_manager.jsp' from xdummy;^
42006^Maske^1^0^0^100^380^1^integer^30^0^1^<<SQL>> select M.tid, M.tid || ' - ' || M.name from maskeninfo M, sachgeb_maske_bez S where M.tid=S.maskeninfo_id order by 1;^hidden^^
42007^Testfall-Projekt^15^0^0^150^80^1^integer^200^0^1^<<SQL>> --freemarker template\
42006^Maske^1^0^0^100^380^20^sql^30^0^1^<<SQL>> select M.tid, M.tid || ' - ' || M.name from maskeninfo M, sachgeb_maske_bez S where M.tid=S.maskeninfo_id order by 1;^hidden^^
42007^Testfall-Projekt^15^0^0^150^80^20^sql^200^0^1^<<SQL>> --freemarker template\
<sqlvars>\
<sqlvar name="QA_installed">\
select 1 from xdummy where 0 &lt; (select count(*) from db_version where his_system='qa')\
@ -20,4 +20,37 @@ select tid,name from qa_project where active=1 order by 2;\ @@ -20,4 +20,37 @@ select tid,name from qa_project where active=1 order by 2;\
select null::char(1),'Keine Auwahl möglich' from xdummy\
</#if>\
\
/* <<just a comment to make it a modal dialog>> */^ ^^
/* <<just a comment to make it a modal dialog>> */^hidden^^
42008^Spaltenlayout^15^0^0^150^80^20^sql^200^0^1^<<SQL>> --freemarker template\
<sqlvars>\
<sqlvar name="RPTA_installed">\
select 1 from xdummy where 0 &lt; (select count(*) from db_version where his_system='rpta')\
union select 0 from xdummy where \
0 = (select count(*) from db_version where his_system='rpta');\
</sqlvar>\
</sqlvars>\
\
<#if RPTA_installed==1>\
select tid,caption from rpta_column_layout order by 2;\
<#else>\
select null::char(1),'Keine Auwahl möglich' from xdummy\
</#if>\
\
/* <<just a comment to make it a modal dialog>> */^hidden^^
42009^Komponente^17^0^0^130^100^1^integer^30^0^1^<<SQL>> select tid,name from systeminfo order by 2^ ^ ^
42010^Hochschule^17^0^0^130^100^1^integer^30^0^1^<<SQL>> --freemarker template\
<sqlvars>\
<sqlvar name="SXC_installed">\
select 1 from xdummy where 0 &lt; (select count(*) from db_version where his_system='sxc')\
union select 0 from xdummy where \
0 = (select count(*) from db_version where his_system='sxc');\
</sqlvar>\
</sqlvars>\
\
<#if SXC_installed==1>\
select apnr,kurztext from sxc_hochschulen_liste order by 2;\
<#else>\
select null::char(1),'Keine Auwahl möglich' from xdummy\
</#if>\
\
/* <<just a comment to make it a modal dialog>> */^hidden^ ^

3
src-modules/module/etl/masken/42000_masken_felder_bez.unl

@ -6,3 +6,6 @@ @@ -6,3 +6,6 @@
42000^42005^
42000^42006^
42000^42007^
42000^42008^
42000^42009^
42000^42010^

68
src-modules/module/etl/schluesseltabellen/create_load_etl_masken.sql

@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
--Freemarker Template
--used in etl-job sx_insert_mask
<#if SQLdialect='Postgres'>
drop table if exists tmp_maskeninfo;
drop table if exists tmp_felderinfo;
drop table if exists tmp_masken_felder_bez;
drop table if exists tmp_sachgeb_maske_bez;
drop table if exists tmp_maske_system_bez;
</#if>
create table tmp_maskeninfo(
tid INTEGER not null,
name CHAR(255) not null,
select_stmt text ,
xil_proplist text ,
chart_xtitel CHAR(50) ,
chart_ytitel CHAR(50) ,
erlaeuterung CHAR(255) ,
cleanup_stmt CHAR(240) ,
default_file CHAR(200) ,
frontend SMALLINT ,
breite INTEGER ,
hoehe INTEGER ,
ampel SMALLINT ,
hilfe SMALLINT ,
hinweis text
)
;
create table tmp_felderinfo(
tid INTEGER not null,
name VARCHAR(255) not null,
nummer INTEGER not null,
x INTEGER ,
y INTEGER ,
buttonbreite INTEGER ,
feldbreite INTEGER ,
zeilenanzahl INTEGER ,
typ CHAR(15) ,
laenge INTEGER ,
obligatorisch INTEGER ,
art INTEGER ,
relation text ,
attribut CHAR(100) ,
defaultwert TEXT
)
;
create table tmp_masken_felder_bez(
maskeninfo_id INTEGER ,
felderinfo_id INTEGER
)
;
create table tmp_sachgeb_maske_bez(
sachgebiete_id INTEGER ,
maskeninfo_id INTEGER
)
;
create table tmp_maske_system_bez(
maskeninfo_id INTEGER not null,
systeminfo_id INTEGER not null
)
;

2
src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
--Freemarker Template
--used in etl-job sx_insert_mask
--used in etl-job qa_project_upload
<#if SQLdialect='Postgres'>
drop table if exists tmp_etl_qa_project;
drop table if exists tmp_etl_sachgeb_sichtarten;

67
src-modules/module/etl/schluesseltabellen/create_load_etl_rpta_column_layout.sql

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
--Freemarker Template
--used in etl-job qa_project_upload
<#if SQLdialect='Postgres'>
drop table if exists tmp_rpta_resultset;
drop table if exists tmp_etl_rpta_column_layout;
drop table if exists tmp_rpta_column;
drop table if exists tmp_rpta_column2layout;
</#if>
CREATE TABLE tmp_rpta_resultset (
tid integer,
caption character varying(255),
uniquename character varying(255),
fieldclause text,
joinclause text,
whereclause text,
systeminfo_id integer,
is_virtual smallint
);
CREATE TABLE tmp_etl_rpta_column_layout (
tid integer,
uniquename character varying(255),
caption character varying(255),
resultset_id integer,
whereclause text,
description text,
userinfo_id integer,
sortnr integer,
sortclause text,
is_virtual smallint,
resultset_uniquename character varying(255)
);
CREATE TABLE tmp_rpta_column (
tid integer,
uniquename character varying(255),
caption character varying(255),
srcfieldname character varying(255),
column_type integer,
col_function text,
is_aggregate smallint,
resultset_id integer,
custom integer,
description text,
targetfieldname character varying(255)
);
CREATE TABLE tmp_rpta_column2layout (
tid integer,
column_id integer,
layout_id integer,
sortnr smallint,
is_visible smallint,
visible_size smallint,
format_code varchar(255),
targetfieldname character varying(255),
caption character varying(255),
description text
);

22
src-modules/module/etl/schluesseltabellen/create_load_etl_sx_captions.sql

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
--Freemarker Template
--used in etl-job sx_insert_mask
<#if SQLdialect='Postgres'>
drop table if exists tmp_etl_sx_captions;
</#if>
create table tmp_etl_sx_captions(
id CHAR(200) ,
table_name CHAR(200) ,
field_name CHAR(200) ,
record_no INTEGER ,
locale CHAR(10) ,
contents_short CHAR(255) ,
contents_long text ,
equalitystatus SMALLINT ,
sachgebiete_id INTEGER ,
doku_link VARCHAR(255) ,
export_to_glossar INTEGER
);

28
src-modules/module/etl/schluesseltabellen/create_load_etl_sxc_stud_zugang_abgang_aggr.sql

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
--Freemarker Template
--used in etl-job qa_project_upload
<#if SQLdialect='Postgres'>
drop table if exists tmp_sxc_stud_zugang_abgang_aggr;
</#if>
CREATE TABLE tmp_sxc_stud_zugang_abgang_aggr (
hs_nr char(10) NOT NULL,
jahr integer NOT NULL,
anfangsbestand integer,
zugang integer,
zugang_ersteinschr integer,
abgang integer,
abgang_hauptpr integer,
abgang_ohne_hauptpr integer,
hauptpr_summe integer,
hauptpr_bleibt integer,
endbestand integer,
datenstand date
);

4
src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl

@ -1,3 +1,5 @@ @@ -1,3 +1,5 @@
1^MASK^Masken^0^sx_select_mask^sx_insert_mask^TID^42000^42006^1^
2^SICHT^Sichten^0^sichten_unload^sichten_upload^SYSTEMINFO_ID^42000^42004^1^
2^SICHT^Sichten^0^sichten_unload^sichten_upload^SICHTEN_TID^42000^42004^1^
3^QA_PROJECT^Testfälle^0^qa_project_unload^qa_project_upload^QA_PROJECT_ID^42000^42007^1^
4^RPTA_COLUMN_LAYOUT^Spaltenlayouts^0^rpta_column_layout_unload^rpta_column_layout_upload^RPTA_COLUMN_LAYOUT_TID^42000^42008^1^
5^SXC_STUD^SXC Studierendenströme^0^sxc_stud_zugang_abgang_aggr_unload^sxc_stud_zugang_abgang_aggr_upload^HS_NR^42000^42010^1^

184
src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql

@ -10,7 +10,11 @@ @@ -10,7 +10,11 @@
{"uniquename":"sichten_unload", "name":"Sichten entladen", "systeminfo_id":270 ,"logfile":""},
{"uniquename":"sichten_upload", "name":"Sichten hochladen", "systeminfo_id":270 ,"logfile":""},
{"uniquename":"sos_gewichtung_unload", "name":"Gewichtungen entladen", "systeminfo_id":270 ,"logfile":""},
{"uniquename":"qa_project_unload", "name":"Testfallprojekte entladen", "systeminfo_id":260 ,"logfile":""}
{"uniquename":"qa_project_unload", "name":"Testfallprojekte entladen", "systeminfo_id":260 ,"logfile":""},
{"uniquename":"rpta_column_layout_unload", "name":"Spaltenlayout entladen", "systeminfo_id":330 ,"logfile":""},
{"uniquename":"rpta_column_layout_upload", "name":"Spaltenlayout hochladen", "systeminfo_id":330 ,"logfile":""},
{"uniquename":"sxc_stud_zugang_abgang_aggr_unload", "name":"Studierendenströme für SXC entladen", "systeminfo_id":360 ,"logfile":""},
{"uniquename":"sxc_stud_zugang_abgang_aggr_upload", "name":"Studierendenströme für SXC hochladen", "systeminfo_id":360 ,"logfile":""}
] />
@ -27,12 +31,12 @@ @@ -27,12 +31,12 @@
{"etl_job":"kern_konstanten_update","param_name":"SUPERX_DIR", "name":"Superx-Pfad zu WEB-INF/conf/edustore", "param_default":"$WEBAPP/WEB-INF/conf/edustore"},
{"etl_job":"kern_konstanten_update","param_name":"PATH_TO_INPUTFILE", "name":"Eingabepfad", "param_default":"$SUPERX_DIR/db/install/schluesseltabellen/kern_feste_konstanten_fuellen.sql"},
{"etl_job":"sichten_unload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "param_default":""},
{"etl_job":"sichten_unload","param_name":"SICHTEN_TID", "name":"Sicht", "param_default":""},
{"etl_job":"sichten_unload","param_name":"NAME_INTERN", "name":"ID", "param_default":""},
{"etl_job":"sichten_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/masken/sichten_$SYSTEMINFO_ID.xml"},
{"etl_job":"sichten_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/masken/sichten.xml"},
{"etl_job":"sichten_unload","param_name":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"},
{"etl_job":"sichten_upload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "param_default":""},
{"etl_job":"sichten_upload","param_name":"SICHTEN_TID", "name":"Sicht", "param_default":""},
{"etl_job":"sichten_upload","param_name":"NAME_INTERN", "name":"ID", "param_default":""},
{"etl_job":"sichten_upload","param_name":"PATH_TO_INPUTFILE", "name":"Eingabedatei", "param_default":""},
{"etl_job":"sichten_upload","param_name":"FORMAT", "name":"Format", "param_default":"XML"},
@ -40,6 +44,25 @@ @@ -40,6 +44,25 @@
{"etl_job":"qa_project_unload","param_name":"QA_PROJECT_ID", "name":"Testfall-Projekt", "param_default":""},
{"etl_job":"qa_project_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/masken/qa_project_$QA_PROJECT_ID.xml"},
{"etl_job":"qa_project_unload","param_name":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"},
{"etl_job":"rpta_column_layout_unload","param_name":"RPTA_COLUMN_LAYOUT_TID", "name":"Spaltenlayout", "param_default":""},
{"etl_job":"rpta_column_layout_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/masken/rpta_column_layout_$RPTA_COLUMN_LAYOUT_UNIQUENAME.xml"},
{"etl_job":"rpta_column_layout_unload","param_name":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"},
{"etl_job":"rpta_column_layout_upload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "param_default":""},
{"etl_job":"rpta_column_layout_upload","param_name":"RPTA_COLUMN_LAYOUT_TID", "name":"ID", "param_default":""},
{"etl_job":"rpta_column_layout_upload","param_name":"PATH_TO_INPUTFILE", "name":"Eingabedatei", "param_default":""},
{"etl_job":"rpta_column_layout_upload","param_name":"FORMAT", "name":"Format", "param_default":"XML"},
{"etl_job":"sxc_stud_zugang_abgang_aggr_unload","param_name":"HS_NR", "name":"Hochschule", "param_default":""},
{"etl_job":"sxc_stud_zugang_abgang_aggr_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/masken/rpta_column_layout_$RPTA_COLUMN_LAYOUT_UNIQUENAME.xml"},
{"etl_job":"sxc_stud_zugang_abgang_aggr_unload","param_name":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"},
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "param_default":""},
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload","param_name":"HS_NR", "name":"ID", "param_default":""},
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload","param_name":"PATH_TO_INPUTFILE", "name":"Eingabedatei", "param_default":""},
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload","param_name":"FORMAT", "name":"Format", "param_default":"XML"},
{"etl_job":"sos_gewichtung_unload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "param_default":""},
{"etl_job":"sos_gewichtung_unload","param_name":"PATH_TO_OUTPUTFILE", "name":"Ausgabedatei", "param_default":"$SUPERX_DIR/db/db/module/sos/schluesseltabellen/sichten_$SYSTEMINFO_ID.xml"},
@ -58,33 +81,33 @@ @@ -58,33 +81,33 @@
{"etl_job":"sx_select_mask", "uniquename":"unload_sx_mask_style", "name":"sx_mask_style entladen", "type":"UNLOAD"},
{"etl_job":"sx_select_mask", "uniquename":"unload_sx_stylesheets", "name":"sx_stylesheets entladen", "type":"UNLOAD"},
{"etl_job":"sx_select_mask", "uniquename":"unload_stylesheet_field", "name":"stylesheet_field entladen", "type":"UNLOAD"},
{"etl_job":"sx_select_mask", "uniquename":"unload_captions", "name":"captions entladen", "type":"UNLOAD"},
{"etl_job":"sx_insert_mask", "uniquename":"create_tmp_etl_masken", "name":"Tabellen tmp_etl_masken erzeugen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"delete_maskeninfo", "name":"Maskeninfo löschen", "type":"DOQUERY" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_maskeninfo", "name":"Maskeninfo hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"delete_felderinfo", "name":"felderinfo löschen", "type":"DOQUERY" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_felderinfo", "name":"felderinfo hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"delete_masken_felder_bez", "name":"masken_felder_bez löschen", "type":"DOQUERY" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_masken_felder_bez", "name":"masken_felder_bez hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"delete_sachgeb_maske_bez", "name":"sachgeb_maske_bez löschen", "type":"DOQUERY" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_sachgeb_maske_bez", "name":"sachgeb_maske_bez hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"delete_maske_system_bez", "name":"maske_system_bez löschen", "type":"DOQUERY" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_maske_system_bez", "name":"maske_system_bez hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"create_tmp_etl_themenbaum", "name":"Tabelle tmp_etl_themenbaum erzeugen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"create_tmp_etl_stylesheets", "name":"Tabelle tmp_etl_stylesheets erzeugen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"create_tmp_etl_sx_captions", "name":"Tabelle tmp_etl_sx_captions erzeugen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_tmp_etl_themenbaum", "name":"tmp_etl_themenbaum hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_tmp_etl_stylesheets", "name":"tmp_etl_stylesheets hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_tmp_etl_mask_style", "name":"tmp_etl_mask_style hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_tmp_etl_stylesheet_field", "name":"tmp_etl_stylesheet_field hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"upload_tmp_sx_captions", "name":"tmp_sx_captions hochladen", "type":"LOAD" },
{"etl_job":"sx_insert_mask", "uniquename":"masken_fuellen", "name":"masken_fuellen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"themenbaum_fuellen", "name":"themenbaum_fuellen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"sx_stylesheets_fuellen", "name":"sx_stylesheets_fuellen", "type":"DOSQL" },
{"etl_job":"sx_insert_mask", "uniquename":"sx_captions_fuellen", "name":"sx_captions_fuellen", "type":"DOSQL" },
{"etl_job":"kern_konstanten_update", "uniquename":"kern_konstanten_update", "name":"Kern Konstanten aktualisieren", "type":"DOSQL" },
@ -108,54 +131,73 @@ @@ -108,54 +131,73 @@
{"etl_job":"qa_project_unload", "uniquename":"unload_qa_dbtest2project_tab", "name":"DB-Test zu Projekt entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"},
{"etl_job":"qa_project_unload", "uniquename":"unload_qa_mask_execution_tab", "name":"Masken-Tests entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"},
{"etl_job":"qa_project_unload", "uniquename":"unload_qa_mask_execution_assert_tab", "name":"Masken-Test Erwartungen entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"},
{"etl_job":"qa_project_unload", "uniquename":"unload_qa_mask_execution2project_tab", "name":"Masken-Test zu Projekt entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"}
{"etl_job":"qa_project_unload", "uniquename":"unload_qa_mask_execution2project_tab", "name":"Masken-Test zu Projekt entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"},
{"etl_job":"rpta_column_layout_unload", "uniquename":"rpta_column_layout_unload_ges", "name":"Spaltenlayout-Projekt entladen", "type":"MSG"},
{"etl_job":"rpta_column_layout_unload", "uniquename":"unload_rpta_resultset_tab", "name":"Resultset entladen", "type":"UNLOAD", "parent":"rpta_column_layout_unload_ges"},
{"etl_job":"rpta_column_layout_unload", "uniquename":"unload_rpta_column_layout_tab", "name":"Spaltenlayout entladen", "type":"UNLOAD", "parent":"rpta_column_layout_unload_ges"},
{"etl_job":"rpta_column_layout_unload", "uniquename":"unload_rpta_column_tab", "name":"Spalten entladen", "type":"UNLOAD", "parent":"rpta_column_layout_unload_ges"},
{"etl_job":"rpta_column_layout_unload", "uniquename":"unload_rpta_column2layout_tab", "name":"Spalten zu Layout entladen", "type":"UNLOAD", "parent":"rpta_column_layout_unload_ges"},
{"etl_job":"rpta_column_layout_upload", "uniquename":"create_tmp_rpta_column_layout", "name":"Tabelle tmp_rpta_column_layout erzeugen", "type":"DOSQL" },
{"etl_job":"rpta_column_layout_upload", "uniquename":"upload_rpta_resultset_tab", "name":"tmp_rpta_resultset hochladen", "type":"LOAD" },
{"etl_job":"rpta_column_layout_upload", "uniquename":"upload_rpta_column_layout_tab", "name":"tmp_rpta_column_layout hochladen", "type":"LOAD" },
{"etl_job":"rpta_column_layout_upload", "uniquename":"upload_rpta_column_tab", "name":"tmp_rpta_column hochladen", "type":"LOAD" },
{"etl_job":"rpta_column_layout_upload", "uniquename":"upload_rpta_column2layout_tab", "name":"tmp_rpta_column2layout hochladen", "type":"LOAD" },
{"etl_job":"rpta_column_layout_upload", "uniquename":"trans_rpta_column_layout", "name":"rpta_column_layout füllen", "type":"DOSQL" },
{"etl_job":"sxc_stud_zugang_abgang_aggr_unload", "uniquename":"sxc_stud_zugang_abgang_aggr_unload_ges", "name":"Studierendenströme für SXC entladen", "type":"MSG"},
{"etl_job":"sxc_stud_zugang_abgang_aggr_unload", "uniquename":"unload_sxc_stud_zugang_abgang_aggr_tab", "name":"sxc_stud_zugang_abgang_aggr entladen", "type":"UNLOAD", "parent":"sxc_stud_zugang_abgang_aggr_unload_ges"},
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload", "uniquename":"create_tmp_sxc_stud_zugang_abgang_aggr", "name":"Tabelle tmp_sxc_stud_zugang_abgang_aggr erzeugen", "type":"DOSQL" },
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload", "uniquename":"upload_sxc_stud_zugang_abgang_aggr_tab", "name":"tmp_sxc_stud_zugang_abgang_aggr hochladen", "type":"LOAD" },
{"etl_job":"sxc_stud_zugang_abgang_aggr_upload", "uniquename":"trans_sxc_stud_zugang_abgang_aggr", "name":"sxc_stud_zugang_abgang_aggr füllen", "type":"DOSQL" }
] />
<#assign etl_step_properties = [
{"etl_step":"unload_masken_stammdaten","prop_name":"msg", "prop_value":"Entlade Stammdaten Maske $TID" },
{"etl_step":"unload_maskeninfo","prop_name":"select_stmt", "prop_value":"select tid,name,select_stmt,xil_proplist,chart_xtitel,chart_ytitel,erlaeuterung,cleanup_stmt,default_file,frontend,breite,hoehe,ampel,hilfe,hinweis from maskeninfo where tid=$TID" },
{"etl_step":"unload_felderinfo","prop_name":"select_stmt", "prop_value":"select tid ,name,nummer,x,y,buttonbreite,feldbreite,zeilenanzahl,typ,laenge,obligatorisch,art,relation,attribut,defaultwert from felderinfo where tid in (select felderinfo_id from masken_felder_bez where maskeninfo_id = $TID) order by tid" },
{"etl_step":"unload_masken_felder_bez","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,felderinfo_id from masken_felder_bez where maskeninfo_id=$TID order by 1,2" },
{"etl_step":"unload_sachgeb_maske_bez","prop_name":"select_stmt", "prop_value":"select sachgebiete_id,maskeninfo_id from sachgeb_maske_bez where maskeninfo_id=$TID order by 1,2" },
{"etl_step":"unload_maske_system_bez","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,systeminfo_id from maske_system_bez where maskeninfo_id=$TID order by 1,2" },
{"etl_step":"unload_themenbaum","prop_name":"select_stmt", "prop_value":"select name,maskeninfo_id,parent,(select name from themenbaum where tid=T.parent) as parent_name,gueltig_seit,gueltig_bis,erlaeuterung,sort,css_class from themenbaum T where maskeninfo_id=$TID order by 2,1" },
{"etl_step":"unload_sx_mask_style","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,stylesheet_id,ord,(select filename from sx_stylesheets where tid=S.stylesheet_id) as stylesheet_filename from sx_mask_style S where maskeninfo_id=$TID order by 1,2,3" },
{"etl_step":"unload_sx_stylesheets","prop_name":"select_stmt", "prop_value":"select S.tid,S.filename,S.caption,S.description,S.relation,S.useragent,S.contenttype,S.is_generic,S.toolbar_icon_filepath,S.usage_resultset_data,S.stylesheet_type,S.jr_datasource from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=$TID order by 1,2,3" },
{"etl_step":"unload_stylesheet_field","prop_name":"select_stmt", "prop_value":"select F.tid,F.stylesheet_id,S.filename as stylesheet_filename,F.tablename,F.fieldname FROM stylesheet_field F, sx_stylesheets S, sx_mask_style M where F.stylesheet_id=S.tid and S.tid=M.stylesheet_id and M.maskeninfo_id=$TID order by 1,2,3,4,5" },
{"etl_step":"delete_maskeninfo","prop_name":"select_stmt", "prop_value":"delete from maskeninfo where tid=$TID" },
{"etl_step":"upload_maskeninfo","prop_name":"target_table", "prop_value":"maskeninfo" },
{"etl_step":"unload_masken_stammdaten","prop_name":"msg", "prop_value":"Entlade Stammdaten Maske/n $TID" },
{"etl_step":"unload_maskeninfo","prop_name":"select_stmt", "prop_value":"select tid,name,select_stmt,xil_proplist,chart_xtitel,chart_ytitel,erlaeuterung,cleanup_stmt,default_file,frontend,breite,hoehe,ampel,hilfe,hinweis from maskeninfo where tid in ($TID)" },
{"etl_step":"unload_felderinfo","prop_name":"select_stmt", "prop_value":"select tid ,name,nummer,x,y,buttonbreite,feldbreite,zeilenanzahl,typ,laenge,obligatorisch,art,relation,attribut,defaultwert from felderinfo where tid in (select felderinfo_id from masken_felder_bez where maskeninfo_id in ( $TID )) order by tid" },
{"etl_step":"unload_masken_felder_bez","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,felderinfo_id from masken_felder_bez where maskeninfo_id in ( $TID ) order by 1,2" },
{"etl_step":"unload_sachgeb_maske_bez","prop_name":"select_stmt", "prop_value":"select sachgebiete_id,maskeninfo_id from sachgeb_maske_bez where maskeninfo_id in ( $TID ) order by 1,2" },
{"etl_step":"unload_maske_system_bez","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,systeminfo_id from maske_system_bez where maskeninfo_id in ( $TID ) order by 1,2" },
{"etl_step":"unload_themenbaum","prop_name":"select_stmt", "prop_value":"select name,maskeninfo_id,parent,(select name from themenbaum where tid=T.parent) as parent_name,gueltig_seit,gueltig_bis,erlaeuterung,sort,css_class from themenbaum T where maskeninfo_id in ( $TID ) union select name,maskeninfo_id,parent,(select name from themenbaum where tid=T.parent) as parent_name, gueltig_seit,gueltig_bis,erlaeuterung,sort,css_class from themenbaum T where T.tid=(select T2.parent from themenbaum T2 where T2.maskeninfo_id in ( $TID )) order by 2,1" },
{"etl_step":"unload_sx_mask_style","prop_name":"select_stmt", "prop_value":"select maskeninfo_id,stylesheet_id,ord,(select filename from sx_stylesheets where tid=S.stylesheet_id) as stylesheet_filename from sx_mask_style S where maskeninfo_id in ( $TID ) order by 1,2,3" },
{"etl_step":"unload_sx_stylesheets","prop_name":"select_stmt", "prop_value":"select S.tid,S.filename,S.caption,S.description,S.relation,S.useragent,S.contenttype,S.is_generic,S.toolbar_icon_filepath,S.usage_resultset_data,S.stylesheet_type,S.jr_datasource from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id in ( $TID ) order by 1,2,3" },
{"etl_step":"unload_stylesheet_field","prop_name":"select_stmt", "prop_value":"select F.tid,F.stylesheet_id,S.filename as stylesheet_filename,F.tablename,F.fieldname FROM stylesheet_field F, sx_stylesheets S, sx_mask_style M where F.stylesheet_id=S.tid and S.tid=M.stylesheet_id and M.maskeninfo_id in ( $TID ) order by 1,2,3,4,5" },
{"etl_step":"unload_captions","prop_name":"select_stmt", "prop_value":"select id, table_name, field_name, record_no, locale, contents_short, contents_long, equalitystatus, sachgebiete_id, doku_link, export_to_glossar from sx_captions where table_name=''felderinfo'' and record_no in (select B.felderinfo_id from masken_felder_bez B where B.maskeninfo_id in ( $TID )) order by 1,2,3,4,5" },
{"etl_step":"create_tmp_etl_masken","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_masken.sql" },
{"etl_step":"upload_maskeninfo","prop_name":"target_table", "prop_value":"tmp_maskeninfo" },
{"etl_step":"upload_maskeninfo","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_maskeninfo","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_maskeninfo\"]/rs/row" },
{"etl_step":"upload_maskeninfo","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"delete_felderinfo","prop_name":"select_stmt", "prop_value":"delete from felderinfo where tid in (select felderinfo_id from masken_felder_bez where maskeninfo_id =$TID)" },
{"etl_step":"upload_felderinfo","prop_name":"target_table", "prop_value":"felderinfo" },
{"etl_step":"upload_felderinfo","prop_name":"target_table", "prop_value":"tmp_felderinfo" },
{"etl_step":"upload_felderinfo","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_felderinfo","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_felderinfo\"]/rs/row" },
{"etl_step":"upload_felderinfo","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"delete_masken_felder_bez","prop_name":"select_stmt", "prop_value":"delete from masken_felder_bez where maskeninfo_id =$TID" },
{"etl_step":"upload_masken_felder_bez","prop_name":"target_table", "prop_value":"masken_felder_bez" },
{"etl_step":"upload_masken_felder_bez","prop_name":"target_table", "prop_value":"tmp_masken_felder_bez" },
{"etl_step":"upload_masken_felder_bez","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_masken_felder_bez","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_masken_felder_bez\"]/rs/row" },
{"etl_step":"upload_masken_felder_bez","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"delete_sachgeb_maske_bez","prop_name":"select_stmt", "prop_value":"delete from sachgeb_maske_bez where maskeninfo_id =$TID" },
{"etl_step":"upload_sachgeb_maske_bez","prop_name":"target_table", "prop_value":"sachgeb_maske_bez" },
{"etl_step":"upload_sachgeb_maske_bez","prop_name":"target_table", "prop_value":"tmp_sachgeb_maske_bez" },
{"etl_step":"upload_sachgeb_maske_bez","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_sachgeb_maske_bez","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_sachgeb_maske_bez\"]/rs/row" },
{"etl_step":"upload_sachgeb_maske_bez","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"delete_maske_system_bez","prop_name":"select_stmt", "prop_value":"delete from maske_system_bez where maskeninfo_id =$TID" },
{"etl_step":"upload_maske_system_bez","prop_name":"target_table", "prop_value":"maske_system_bez" },
{"etl_step":"upload_maske_system_bez","prop_name":"target_table", "prop_value":"tmp_maske_system_bez" },
{"etl_step":"upload_maske_system_bez","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_maske_system_bez","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_maske_system_bez\"]/rs/row" },
{"etl_step":"upload_maske_system_bez","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"create_tmp_etl_themenbaum","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_themenbaum.sql" },
{"etl_step":"create_tmp_etl_stylesheets","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_stylesheets.sql" },
{"etl_step":"create_tmp_etl_sx_captions","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_sx_captions.sql" },
{"etl_step":"upload_tmp_etl_themenbaum","prop_name":"target_table", "prop_value":"tmp_etl_themenbaum" },
{"etl_step":"upload_tmp_etl_themenbaum","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_tmp_etl_themenbaum","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_themenbaum\"]/rs/row" },
@ -176,6 +218,12 @@ @@ -176,6 +218,12 @@
{"etl_step":"upload_tmp_etl_stylesheet_field","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_stylesheet_field\"]/rs/row" },
{"etl_step":"upload_tmp_etl_stylesheet_field","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"upload_tmp_sx_captions","prop_name":"target_table", "prop_value":"tmp_etl_sx_captions" },
{"etl_step":"upload_tmp_sx_captions","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_tmp_sx_captions","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_captions\"]/rs/row" },
{"etl_step":"upload_tmp_sx_captions","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"create_tmp_etl_sichten","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_sichten.sql" },
{"etl_step":"upload_tmp_etl_sichten","prop_name":"target_table", "prop_value":"tmp_etl_sichten" },
{"etl_step":"upload_tmp_etl_sichten","prop_name":"format", "prop_value":"xml" },
@ -190,29 +238,81 @@ @@ -190,29 +238,81 @@
{"etl_step":"trans_etl_sichten","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/trans_etl_sichten.sql" },
{"etl_step":"masken_fuellen","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/masken_fuellen.sql" },
{"etl_step":"themenbaum_fuellen","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/themenbaum_fuellen.sql" },
{"etl_step":"sx_stylesheets_fuellen","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/sx_stylesheets_fuellen.sql" },
{"etl_step":"sx_captions_fuellen","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/sx_captions_fuellen.sql" },
{"etl_step":"kern_konstanten_update","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"unload_sichten_ges","prop_name":"msg", "prop_value":"Entlade Sichten Komponente $SYSTEMINFO_ID" },
{"etl_step":"unload_sichtentab","prop_name":"select_stmt", "prop_value":"SELECT S.systeminfoid,S.art,S.type,S.name_intern,S.name,S.sortnr,S.quelle,S.standbutton,S.aktiv FROM sichten S where (S.systeminfoid::varchar(255)= ''$SYSTEMINFO_ID'' or S.name_intern=''$NAME_INTERN'') and position(''<#'' in quelle) =0 order by art,sortnr ,name;" },
{"etl_step":"unload_sichten_sachgeb","prop_name":"select_stmt", "prop_value":"SELECT A.sichtart,A.sachgebiete_id FROM sachgeb_sichtarten A where A.sichtart in (select distinct S.art from sichten S where (S.systeminfoid::varchar(255)= ''$SYSTEMINFO_ID'' or S.name_intern=''$NAME_INTERN'')) order by 1,2;" },
{"etl_step":"unload_sichten_ges","prop_name":"msg", "prop_value":"Entlade Sichten" },
{"etl_step":"unload_sichtentab","prop_name":"select_stmt", "prop_value":"SELECT S.systeminfoid,S.art,S.type,S.name_intern,S.name,S.sortnr,S.quelle,S.standbutton,S.aktiv FROM sichten S where S.tid in ( $SICHTEN_TID ) order by art,sortnr ,name;" },
{"etl_step":"unload_sichten_sachgeb","prop_name":"select_stmt", "prop_value":"SELECT A.sichtart,A.sachgebiete_id FROM sachgeb_sichtarten A where A.sichtart in (select distinct S.art from sichten S where S.tid in ( $SICHTEN_TID )) order by 1,2;" },
{"etl_step":"unload_sos_gewichtung_ges","prop_name":"msg", "prop_value":"Entlade Gewichtungen Komponente $SYSTEMINFO_ID" },
{"etl_step":"unload_sos_gewichtung","prop_name":"select_stmt", "prop_value":" SELECT art, ch35_ang_abschluss, fach_nr, kz_fach, text, faktor FROM sos_gewichtung where ch35_ang_abschluss in (''B5'',''B6'',''B7'',''B8'',''M3'',''M4'',''M7'',''M8'') and art=''vzae'' order by 1,2,3,4,5 ;" },
{"etl_step":"unload_qa_project","prop_name":"msg", "prop_value":"Entlade Testfall-Projekt $QA_PROJECT_ID Stammdaten" },
{"etl_step":"qa_project_unload_ges","prop_name":"msg", "prop_value":"Entlade Testfall-Projekt $QA_PROJECT_ID Stammdaten" },
{"etl_step":"unload_qa_project_tab","prop_name":"select_stmt", "prop_value":"SELECT uniquename, name, systeminfo_id, sachgebiete_id, active, created_from, issue_link FROM qa_project where tid= $QA_PROJECT_ID order by 1;" },
{"etl_step":"unload_qa_resultset_tab","prop_name":"select_stmt", "prop_value":"SELECT R.uniquename, R.name, R.systeminfo_id, R.fromclause, R.fieldclause, R.groupbyclause, R.orderbyclause FROM qa_resultset R where R.tid in (select distinct T.resultset_id from qa_dbtest T, qa_dbtest2project P where P.dbtest_id=T.tid and P.project_id= $QA_PROJECT_ID ) order by 1;" },
{"etl_step":"unload_qa_dbtest_tab","prop_name":"select_stmt", "prop_value":"SELECT T.uniquename,T.name,T.systeminfo_id,R.uniquename as resultset_uniquename,T.whereclause,T.description,T.active from qa_dbtest T,qa_resultset R where R.tid=T.resultset_id and T.tid in (select P.dbtest_id from qa_dbtest2project P where P.project_id= $QA_PROJECT_ID ) order by 1;" },
{"etl_step":"unload_qa_dbtest_assertion_tab","prop_name":"select_stmt", "prop_value":"SELECT T.uniquename as dbtest_uniquename,A.rownr,A.def_col_caption,A.def_col_name,A.def_col_value,A.def_col_function from qa_dbtest T, qa_dbtest_assertion A where A.dbtest_id=T.tid and T.tid in (select P.dbtest_id from qa_dbtest2project P where P.project_id= $QA_PROJECT_ID ) order by 1;" },
{"etl_step":"unload_qa_dbtest2project_tab","prop_name":"select_stmt", "prop_value":"SELECT T.uniquename as dbtest_uniquename,P.uniquename as project_uniquename,DP.issue_id FROM qa_dbtest2project DP, qa_dbtest T, qa_project P where DP.dbtest_id=T.tid and DP.project_id=P.tid and DP.project_id= $QA_PROJECT_ID order by 1;" },
{"etl_step":"unload_rpta_column_layout_ges","prop_name":"msg", "prop_value":"Entlade Spaltenlayout $RPTA_COLUMN_LAYOUT_TID Stammdaten" },
{"etl_step":"unload_rpta_resultset_tab","prop_name":"select_stmt", "prop_value":"SELECT R.* from rpta_resultset R where R.tid in (select L.resultset_id from rpta_column_layout L where L.tid in ( $RPTA_COLUMN_LAYOUT_TID )) order by 1;" },
{"etl_step":"unload_rpta_column_layout_tab","prop_name":"select_stmt", "prop_value":"SELECT L.*,R.uniquename as resultset_uniquename from rpta_column_layout L, rpta_resultset R where R.tid=L.resultset_id and L.tid in ( $RPTA_COLUMN_LAYOUT_TID ) order by 1;" },
{"etl_step":"unload_rpta_column_tab","prop_name":"select_stmt", "prop_value":"select * from rpta_column where tid in (select column_id from rpta_column2layout L where L.layout_id in ( $RPTA_COLUMN_LAYOUT_TID ) ) order by 1;" },
{"etl_step":"unload_rpta_column2layout_tab","prop_name":"select_stmt", "prop_value":"select L.tid,
L.column_id,
L.layout_id,
L.sortnr,
L.is_visible,
L.visible_size,
F.uniquename as format_code,
L.targetfieldname,
L.caption,
L.description from rpta_column2layout L left outer join rpta_format_code F on (F.tid=L.format_code_id) where L.layout_id in ( $RPTA_COLUMN_LAYOUT_TID ) order by 1;" },
{"etl_step":"create_tmp_rpta_column_layout","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_rpta_column_layout.sql" },
{"etl_step":"upload_rpta_resultset_tab","prop_name":"target_table", "prop_value":"tmp_rpta_resultset" },
{"etl_step":"upload_rpta_resultset_tab","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_rpta_resultset_tab","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_rpta_resultset_tab\"]/rs/row" },
{"etl_step":"upload_rpta_resultset_tab","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"upload_rpta_column_layout_tab","prop_name":"target_table", "prop_value":"tmp_etl_rpta_column_layout" },
{"etl_step":"upload_rpta_column_layout_tab","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_rpta_column_layout_tab","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_rpta_column_layout_tab\"]/rs/row" },
{"etl_step":"upload_rpta_column_layout_tab","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"upload_rpta_column_tab","prop_name":"target_table", "prop_value":"tmp_rpta_column" },
{"etl_step":"upload_rpta_column_tab","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_rpta_column_tab","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_rpta_column_tab\"]/rs/row" },
{"etl_step":"upload_rpta_column_tab","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"upload_rpta_column2layout_tab","prop_name":"target_table", "prop_value":"tmp_rpta_column2layout" },
{"etl_step":"upload_rpta_column2layout_tab","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_rpta_column2layout_tab","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_rpta_column2layout_tab\"]/rs/row" },
{"etl_step":"upload_rpta_column2layout_tab","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"trans_rpta_column_layout","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/trans_rpta_column_layout.sql" },
{"etl_step":"unload_qa_mask_execution_tab","prop_name":"select_stmt", "prop_value":"SELECT E.name,E.userinfo_id,E.maskeninfo_id,E.is_active,E.stylesheet_id,E.contenttype,E.output_filename,E.systeminfo_id,E.uniquename FROM qa_mask_execution E where E.tid in (select P.mask_execution_id from qa_mask_execution2project P where P.project_id= $QA_PROJECT_ID ) order by 1;" },
{"etl_step":"unload_qa_mask_execution_assert_tab","prop_name":"select_stmt", "prop_value":"SELECT E.uniquename,A.rownr,A.colnr,A.result_value_min,A.result_value_max,A.is_active,A.caption FROM qa_mask_execution E, qa_mask_execution_assert A where E.tid=A.mask_execution_id and E.tid in (select P.mask_execution_id from qa_mask_execution2project P where P.project_id= $QA_PROJECT_ID ) order by 1;" },
{"etl_step":"unload_qa_mask_execution2project_tab","prop_name":"select_stmt", "prop_value":"SELECT E.uniquename as mask_execution_uniquename,P.uniquename as project_uniquename,DP.issue_id FROM qa_mask_execution2project DP, qa_mask_execution E, qa_project P where DP.mask_execution_id=E.tid and DP.project_id=P.tid and DP.project_id= $QA_PROJECT_ID order by 1;" }
{"etl_step":"unload_qa_mask_execution2project_tab","prop_name":"select_stmt", "prop_value":"SELECT E.uniquename as mask_execution_uniquename,P.uniquename as project_uniquename,DP.issue_id FROM qa_mask_execution2project DP, qa_mask_execution E, qa_project P where DP.mask_execution_id=E.tid and DP.project_id=P.tid and DP.project_id= $QA_PROJECT_ID order by 1;" },
{"etl_step":"unload_sxc_stud_zugang_abgang_aggr_ges","prop_name":"msg", "prop_value":"Entlade Studierendenströme für SXC $HS_NR" },
{"etl_step":"unload_sxc_stud_zugang_abgang_aggr_tab","prop_name":"select_stmt", "prop_value":"SELECT A.* from sxc_stud_zugang_abgang_aggr A where val(A.hs_nr) in ( $HS_NR ) order by 1;" },
{"etl_step":"create_tmp_sxc_stud_zugang_abgang_aggr","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/create_load_etl_sxc_stud_zugang_abgang_aggr.sql" },
{"etl_step":"upload_sxc_stud_zugang_abgang_aggr_tab","prop_name":"target_table", "prop_value":"tmp_sxc_stud_zugang_abgang_aggr" },
{"etl_step":"upload_sxc_stud_zugang_abgang_aggr_tab","prop_name":"format", "prop_value":"xml" },
{"etl_step":"upload_sxc_stud_zugang_abgang_aggr_tab","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_sxc_stud_zugang_abgang_aggr_tab\"]/rs/row" },
{"etl_step":"upload_sxc_stud_zugang_abgang_aggr_tab","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" },
{"etl_step":"trans_sxc_stud_zugang_abgang_aggr","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/trans_sxc_stud_zugang_abgang_aggr.sql" }
@ -220,9 +320,7 @@ @@ -220,9 +320,7 @@
<#assign testfaelle = [
{"testcase":"test_sx_select_mask","assertion":1, "sql":"select count(*) from etl_job where uniquename='sx_select_mask'" },
{"testcase":"test_sx_insert_mask","assertion":1, "sql":"select count(*) from etl_job where uniquename='sx_insert_mask'" },
{"testcase":"test_sx_insert_mask_params","assertion":3, "sql":"select count(*) from etl_job_param P, etl_job J where J.tid=P.etl_job_id and J.uniquename='sx_insert_mask'" },
{"testcase":"test_sx_insert_mask_steps","assertion":18, "sql":"select count(*) from etl_step S, etl_step_relation R, etl_job J where J.tid=R.job_id and S.tid=R.step_id and J.uniquename='sx_insert_mask'" },
{"testcase":"test_sx_select_mask_steps","assertion":10, "sql":"select count(*) from etl_step S, etl_step_relation R, etl_job J where J.tid=R.job_id and S.tid=R.step_id and J.uniquename='sx_select_mask'" }
{"testcase":"test_sx_insert_mask_params","assertion":3, "sql":"select count(*) from etl_job_param P, etl_job J where J.tid=P.etl_job_id and J.uniquename='sx_insert_mask'" }
] />

10
src-modules/module/etl/schluesseltabellen/etl_step_type.unl

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
1^LOAD^Tabelle hochladen^de.superx.elt.ActionHandler.EtlActionHandlerUploadRecords^
2^DOSQL^SQL-Script ausführen^de.superx.elt.ActionHandler.EtlActionHandlerDosql^
3^DOQUERY^SQL-Query ausführen^de.superx.elt.ActionHandler.EtlActionHandlerDoquery^
4^UNLOAD^SQL-Ergebnis entladen^de.superx.elt.ActionHandler.EtlActionHandlerUnloadRecords^
5^MSG^Logausgabe^de.superx.elt.ActionHandler.EtlActionHandlerMsg^
1^LOAD^Tabelle hochladen^de.superx.etl.ActionHandler.EtlActionHandlerUploadRecords^
2^DOSQL^SQL-Script ausführen^de.superx.etl.ActionHandler.EtlActionHandlerDosql^
3^DOQUERY^SQL-Query ausführen^de.superx.etl.ActionHandler.EtlActionHandlerDoquery^
4^UNLOAD^SQL-Ergebnis entladen^de.superx.etl.ActionHandler.EtlActionHandlerUnloadRecords^
5^MSG^Logausgabe^de.superx.etl.ActionHandler.EtlActionHandlerMsg^

6
src-modules/module/etl/schluesseltabellen/fm_templates.unl

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
17^ETL_MAKROS^<#macro ETL_STEPS_FUELLEN>\
157^ETL_MAKROS^<#macro ETL_STEPS_FUELLEN>\
<@etl_steps_def_check/>\
\
<#-- Hinterlegen von Defaultwerten für step_properties -->\
@ -423,7 +423,7 @@ drop table tmp_etl_job_param;\ @@ -423,7 +423,7 @@ drop table tmp_etl_job_param;\
drop table tmp_etl_step_property;\
drop table tmp_etl_step_relation;\
\
\
<#if testfaelle?exists && testfaelle?has_content>\
<#foreach testfall in testfaelle>\
select 'testfall ${testfall.testcase}: ERFOLG'\
from xdummy\
@ -436,7 +436,7 @@ where ${testfall.assertion}!=(${testfall.sql})\ @@ -436,7 +436,7 @@ where ${testfall.assertion}!=(${testfall.sql})\
\
\
</#foreach> --Ende Testfälle\
\
</#if>\
<#foreach etl_step_property in etl_step_properties>\
update etl_step_property set prop_value='${etl_step_property.prop_value}' where prop_name='${etl_step_property.prop_name}' and etl_step_id=(select S.tid from etl_step S where S.uniquename='${etl_step_property.etl_step}');\
</#foreach>\

106
src-modules/module/etl/schluesseltabellen/masken_fuellen.sql

@ -0,0 +1,106 @@ @@ -0,0 +1,106 @@
--Freemarker Template
--used in etl-job sx_insert_mask
--zuerst löschen:
delete from sachgeb_maske_bez where maskeninfo_id in (select tid from tmp_maskeninfo);
delete from maske_system_bez where maskeninfo_id in (select tid from tmp_maskeninfo);
delete from felderinfo where tid in (select B.felderinfo_id from tmp_maskeninfo M, masken_felder_bez B where M.tid=B.maskeninfo_id);
delete from masken_felder_bez where maskeninfo_id in (select tid from tmp_maskeninfo);
delete from maskeninfo where tid in (select tid from tmp_maskeninfo);
--dann einfügen:
insert into maskeninfo(tid,
name,
select_stmt,
xil_proplist,
chart_xtitel,
chart_ytitel,
erlaeuterung,
cleanup_stmt,
default_file,
frontend,
breite,
hoehe,
ampel,
hilfe,
hinweis)
select
tid,
name,
select_stmt,
xil_proplist,
chart_xtitel,
chart_ytitel,
erlaeuterung,
cleanup_stmt,
default_file,
frontend,
breite,
hoehe,
ampel,
hilfe,
hinweis
FROM tmp_maskeninfo
;
insert into maske_system_bez(maskeninfo_id,
systeminfo_id )
SELECT maskeninfo_id,
systeminfo_id
FROM tmp_maske_system_bez
;
insert into sachgeb_maske_bez(sachgebiete_id,
maskeninfo_id)
SELECT sachgebiete_id,
maskeninfo_id
FROM tmp_sachgeb_maske_bez
;
insert into masken_felder_bez(maskeninfo_id,
felderinfo_id)
SELECT maskeninfo_id,
felderinfo_id
FROM tmp_masken_felder_bez
;
insert into felderinfo(
tid,
name,
nummer,
x,
y,
buttonbreite,
feldbreite,
zeilenanzahl,
typ,
laenge,
obligatorisch,
art,
relation,
attribut,
defaultwert)
select
tid,
name,
nummer,
x,
y,
buttonbreite,
feldbreite,
zeilenanzahl,
typ,
laenge,
obligatorisch,
art,
relation,
attribut,
defaultwert
FROM tmp_felderinfo;
<#if SQLdialect='Postgres'>
drop table if exists tmp_maskeninfo;
drop table if exists tmp_felderinfo;
drop table if exists tmp_masken_felder_bez;
drop table if exists tmp_sachgeb_maske_bez;
drop table if exists tmp_maske_system_bez;
</#if>

25
src-modules/module/etl/schluesseltabellen/sx_captions_fuellen.sql

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
delete from sx_captions where table_name='felderinfo'
and (table_name, record_no) in
(select T.table_name,T.record_no
from tmp_etl_sx_captions T)
;
insert into sx_captions (id,
table_name,
field_name,
record_no,
locale,
contents_short,
contents_long)
select id,
table_name,
field_name,
record_no,
locale,
contents_short,
contents_long
from tmp_etl_sx_captions;
drop table tmp_etl_sx_captions;

17
src-modules/module/etl/schluesseltabellen/themenbaum_fuellen.sql

@ -6,12 +6,27 @@ select sp_update_sequence('themenbaum'); @@ -6,12 +6,27 @@ select sp_update_sequence('themenbaum');
update tmp_etl_themenbaum set parent=(select min(tid) from themenbaum where name=tmp_etl_themenbaum.parent_name);
--existiert bereits?
--Gültigkeit etc. updaten:
update themenbaum set (gueltig_seit,gueltig_bis,erlaeuterung,sort,css_class)
=(select T.gueltig_seit,T.gueltig_bis,T.erlaeuterung,T.sort,T.css_class
from tmp_etl_themenbaum T
where T.maskeninfo_id=themenbaum.maskeninfo_id)
where maskeninfo_id in (select T2.maskeninfo_id from tmp_etl_themenbaum T2);
--Masken-Knoten existiert bereits?
delete from tmp_etl_themenbaum
where exists(select T.tid
from themenbaum T where T.maskeninfo_id=tmp_etl_themenbaum.maskeninfo_id
and T.parent=tmp_etl_themenbaum.parent);
--Themenbaum-Knoten existiert bereits?
delete from tmp_etl_themenbaum
where exists(select T.tid
from themenbaum T where T.maskeninfo_id is null
and tmp_etl_themenbaum.maskeninfo_id is null
and T.name=tmp_etl_themenbaum.name);
--dann einfügen:
insert into themenbaum (name,maskeninfo_id,parent,gueltig_seit,gueltig_bis)

322
src-modules/module/etl/schluesseltabellen/trans_rpta_column_layout.sql

@ -0,0 +1,322 @@ @@ -0,0 +1,322 @@
--freemarker template
<#include "SQL_lingua_franca"/>
<#include "SuperX_general"/>
<#include "RPTA-Makros"/>
<sqlvars>
<sqlvar name="rpta_column_layouts" type="hashsequence">
select uniquename,
caption,
resultset_uniquename as rpta_resultset,
replace(whereclause,'''','''''') as whereclause,
description,
sortclause,
is_virtual
from tmp_etl_rpta_column_layout;
</sqlvar>
<sqlvar name="rpta_columns" type="hashsequence">
select C.uniquename,
null::varchar(255) as caption,
C.caption as caption_der_spalte,
L.sortnr,
L.caption as caption_in_ergebnistabelle,
C.srcfieldname,
C.targetfieldname,
T.uniquename as column_type,
replace(C.col_function,'''','''''') as col_function,
L.is_visible,
L.visible_size,
C.is_aggregate,
null::varchar(255) as description,
L.format_code,
C.description as description_der_spalte,
L.description as description_in_ergebnistabelle
from tmp_rpta_column C, tmp_rpta_column2layout L, rpta_column_type T
where L.column_id=C.tid
and T.tid=C.column_type
</sqlvar>
</sqlvars>
<@rpta_column_layout_fuellen_multi />
drop TABLE if exists tmp_rpta_column;
drop TABLE if exists tmp_rpta_column_layout;
drop TABLE if exists tmp_etl_rpta_column_layout;
<#macro rpta_column_layout_fuellen_multi>
CREATE temp TABLE tmp_rpta_column
(
uniquename varchar(255) NOT NULL,
caption varchar(255),
caption_in_ergebnistabelle varchar(255),
srcfieldname varchar(255),
targetfieldname varchar(255),
column_type integer,
col_function text,
is_visible smallint,
visible_size smallint,
is_aggregate smallint,
resultset_id integer,
sortnr integer,
description TEXT,
description_in_ergebnistabelle TEXT,
format_code_uniquename varchar(255),
format_code_id integer
);
CREATE temp TABLE tmp_rpta_column_layout
(
uniquename varchar(255) NOT NULL,
caption varchar(255),
resultset_id integer,
whereclause text,
sortclause text,
description text,
is_virtual smallint default 1
);
<#foreach rpta_column_layout in rpta_column_layouts>
delete from tmp_rpta_column_layout;
delete from tmp_rpta_column;
insert into tmp_rpta_column_layout(
resultset_id,
uniquename,
caption,
whereclause,
<#if rpta_column_layout.sortclause?has_content>
sortclause,
</#if>
<#if rpta_column_layout.is_virtual?has_content>
is_virtual,
</#if>
description
)
select tid,
'${rpta_column_layout.uniquename}',
'${rpta_column_layout.caption}',
'${rpta_column_layout.whereclause}',
<#if rpta_column_layout.sortclause?has_content>
'${rpta_column_layout.sortclause}',
</#if>
<#if rpta_column_layout.is_virtual?has_content>
'${rpta_column_layout.is_virtual}',
</#if>
'${rpta_column_layout.description}'
FROM rpta_resultset
where uniquename='${rpta_column_layout.rpta_resultset}';
<#foreach column in rpta_columns>
INSERT INTO tmp_rpta_column
(resultset_id,
uniquename,
caption,
caption_in_ergebnistabelle,
srcfieldname,
targetfieldname,
column_type,
col_function,
is_visible,
visible_size,
is_aggregate,
sortnr,
description,
description_in_ergebnistabelle,
format_code_uniquename
)
select R.tid,
'${column.uniquename}',
<#if column.caption?exists && column.caption !="">
'${column.caption}',
<#else>
'${column.caption_der_spalte}',
</#if>
<#if column.caption_in_ergebnistabelle?exists>
'${column.caption_in_ergebnistabelle}',
<#else>
'${column.caption}',
</#if>
'${column.srcfieldname}',
<#if !column.targetfieldname?exists || column.targetfieldname=="">'${column.srcfieldname}' <#else>'${column.targetfieldname}' </#if>,
T.tid as column_type,
<#if column.col_function?exists>'${column.col_function}'<#else>null::varchar </#if> as col_function,
${column.is_visible} as is_visible,
<#if column.visible_size?exists && column.visible_size?string !="" > ${column.visible_size} <#else>null::integer </#if> as visible_size,
${column.is_aggregate} as is_aggregate,
${column.sortnr} as sortnr,
<#if column.description?exists>'${column.description}'<#elseif column.description_der_spalte?exists>'${column.description_der_spalte}'<#else>null::varchar </#if>,
<#if column.description_in_ergebnistabelle?exists>'${column.description_in_ergebnistabelle}'<#elseif column.description?exists>'${column.description}'<#else>null::varchar </#if>,
<#if column.format_code?exists>'${column.format_code}'<#else>null::varchar </#if>
FROM rpta_resultset R, rpta_column_type T
where R.uniquename='${rpta_column_layout.rpta_resultset}'
and T.uniquename='${column.column_type}';
</#foreach>
update tmp_rpta_column set format_code_id=C.tid
from rpta_format_code C
where C.uniquename=tmp_rpta_column.format_code_uniquename
and format_code_uniquename is not null;
select * into temp tmp_rpta_column2layout2
from rpta_column2layout
where layout_id in (select L.tid
from rpta_column_layout L,rpta_resultset R
where R.tid=L.resultset_id
and R.uniquename='${rpta_column_layout.rpta_resultset}'
and L.uniquename='${rpta_column_layout.uniquename}'
)
;
select uniquename into temp tmp_rpta_column_layout_target
from rpta_column_layout
where resultset_id in (select tid
FROM rpta_resultset
where uniquename='${rpta_column_layout.rpta_resultset}')
and resultset_id in (select tid
FROM rpta_resultset
where uniquename='${rpta_column_layout.rpta_resultset}')
;
--falls neu
insert into rpta_column_layout
(uniquename,
caption,
resultset_id,
whereclause,
sortclause,
description,
is_virtual)
select uniquename,
caption,
resultset_id,
whereclause,
<#if rpta_column_layout.sortclause?has_content>
sortclause,
<#else>
null::text as sortclause,
</#if>
description,
is_virtual
FROM tmp_rpta_column_layout T
where not exists (select T2.uniquename from tmp_rpta_column_layout_target T2
where T2.uniquename=T.uniquename);
--falls geändert, uniquename muss bleiben
update rpta_column_layout
set (caption, resultset_id, whereclause,sortclause, description, is_virtual)
= ( select distinct caption, resultset_id,
whereclause,
<#if rpta_column_layout.sortclause?has_content>
sortclause,
<#else>
null::text as sortclause,
</#if>
description,
is_virtual
FROM tmp_rpta_column_layout T
where T.uniquename=rpta_column_layout.uniquename)
where rpta_column_layout.uniquename in (select uniquename from tmp_rpta_column_layout);
drop table tmp_rpta_column_layout_target;
delete from rpta_column2layout
where layout_id in (select L.tid
from rpta_column_layout L,rpta_resultset R
where R.tid=L.resultset_id
and R.uniquename='${rpta_column_layout.rpta_resultset}'
and L.uniquename='${rpta_column_layout.uniquename}'
)
;
select * into temp tmp_rpta_column2
from tmp_rpta_column T
where (resultset_id,uniquename) not in
(select resultset_id,uniquename from rpta_column);
INSERT INTO rpta_column
(resultset_id,
uniquename,
caption,
srcfieldname,
targetfieldname,
column_type,
col_function,
is_aggregate,
description,
custom
)
select
resultset_id,
uniquename,
caption,
srcfieldname,
targetfieldname,
column_type,
col_function,
is_aggregate,
description,
0 as custom
from tmp_rpta_column2;
--evtl. neuen Satz einfügen, dann alle updaten
update rpta_column set ( caption,
srcfieldname,
targetfieldname,
column_type,
col_function,
is_aggregate,
description)
= (select distinct caption,
srcfieldname,
targetfieldname,
column_type,
col_function,
is_aggregate,
description
from tmp_rpta_column T
where T.resultset_id=rpta_column.resultset_id
and T.uniquename=rpta_column.uniquename)
where custom=0
and (resultset_id,uniquename) in
(select T.resultset_id,T.uniquename
from tmp_rpta_column T)
;
drop table tmp_rpta_column2;
insert into rpta_column2layout(column_id,
layout_id,
sortnr,
is_visible,
visible_size,
caption,
description,
format_code_id)
select C.tid as column_id,
L.tid as layout_id,
T.sortnr,
T.is_visible,
T.visible_size,
T.caption_in_ergebnistabelle,
T.description_in_ergebnistabelle,
T.format_code_id
FROM rpta_column C, rpta_column_layout L, tmp_rpta_column T
where C.uniquename=T.uniquename
and C.resultset_id=T.resultset_id
and L.uniquename='${rpta_column_layout.uniquename}'
and L.resultset_id=T.resultset_id
;
drop TABLE tmp_rpta_column2layout2;
</#foreach>
drop table tmp_rpta_column;
</#macro>

42
src-modules/module/etl/schluesseltabellen/trans_sxc_stud_zugang_abgang_aggr.sql

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
--freemarker template
<#include "SQL_lingua_franca"/>
<#include "SuperX_general"/>
<#include "RPTA-Makros"/>
delete from sxc_stud_zugang_abgang_aggr
where hs_nr in (select distinct M.hs_nr
from tmp_sxc_stud_zugang_abgang_aggr M)
;
insert into sxc_stud_zugang_abgang_aggr(
hs_nr,
jahr,
anfangsbestand,
zugang,
zugang_ersteinschr,
abgang,
abgang_hauptpr,
abgang_ohne_hauptpr,
hauptpr_summe,
hauptpr_bleibt,
endbestand,
datenstand)
select
hs_nr,
jahr,
anfangsbestand,
zugang,
zugang_ersteinschr,
abgang,
abgang_hauptpr,
abgang_ohne_hauptpr,
hauptpr_summe,
hauptpr_bleibt,
endbestand,
datenstand
from tmp_sxc_stud_zugang_abgang_aggr
;
drop table tmp_sxc_stud_zugang_abgang_aggr;

131
src/de/superx/elt/ActionHandler/EtlActionHandler.java

@ -1,131 +0,0 @@ @@ -1,131 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
import de.superx.elt.EtlStep;
public class EtlActionHandler {
public Properties handlerSpecificProperties;
public Properties runTimeParams;
public Logger logger;
private String handlerType;
protected String logOutput="";
protected long numberOfRows=0;
protected int returnCode;
protected SxConnection stepSxConnection;
protected Connection stepConnection;
public String propFile;
public StringWriter outputStringWriter;
public EtlActionHandler(String handlerType, Properties hsp,Logger logger) {
this.handlerType=handlerType;
this.handlerSpecificProperties=hsp;
this.logger=logger;
}
public EtlActionHandler() {
//reflection API needs an empty constructor
}
public void setReturnCode(int returnCode) {
this.returnCode=returnCode;
}
public int getReturnCode() {
return returnCode;
}
public void setNumberOfRows(long numberOfRows) {
this.numberOfRows=numberOfRows;
}
public long getNumberOfRows() {
return numberOfRows;
}
public void setConnection(Connection con) {
// TODO Auto-generated method stub
}
public void setLogOutput(String log)
{
logOutput=log;
}
public String getLogOutput()
{
return logOutput;
}
public String getPropFile() {
return propFile;
}
public void setPropFile(String propFile) {
this.propFile = propFile;
}
public StringWriter getOutputStringWriter() {
return outputStringWriter;
}
public void setOutputStringWriter(StringWriter sw) {
this.outputStringWriter = sw;
}
public Properties getHandlerSpecificProperties() {
return handlerSpecificProperties;
}
public void setHandlerSpecificProperties(Properties hsp) {
this.handlerSpecificProperties = hsp;
}
public Properties getRunTimeParams() {
return runTimeParams;
}
public void setRunTimeParams(Properties runTimeParams) {
this.runTimeParams = runTimeParams;
}
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
protected void getConnection() throws SQLException {
Statement st;
DatabaseMetaData dbmd;
stepSxConnection = new SxConnection();
stepSxConnection.setPropfile(propFile);
logger.config("Starting Connection...");
try {
stepConnection = stepSxConnection.getConnection();
st = stepConnection.createStatement();
dbmd = stepConnection.getMetaData();
} catch (Exception e) {
e.printStackTrace();
logger.severe("Keine DB-Verbindung: " + e.toString());
throw new SQLException("Keine DB-Verbindung: " + e.toString());
}
}
}

48
src/de/superx/elt/ActionHandler/EtlActionHandlerDoquery.java

@ -1,48 +0,0 @@ @@ -1,48 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
import de.superx.elt.QueryResultSerializer;
import de.superx.elt.SqlExecutor;
public class EtlActionHandlerDoquery extends EtlActionHandler implements EtlActionHandlerI {
public EtlActionHandlerDoquery() {
}
@Override
public int execute(StringWriter sw, String mandantid, String stepUniquename,String outFormat)
throws SQLException, Exception
{
int returnCode=0;
long numberOfRows=0;
this.getConnection();
String query=handlerSpecificProperties.getProperty("select_stmt");
this.getConnection();
SqlExecutor mySqlExecutor=new SqlExecutor("default", stepSxConnection,query,runTimeParams);
returnCode=mySqlExecutor.executeQueries();
numberOfRows=mySqlExecutor.getNumberOfRows();
super.setNumberOfRows(numberOfRows);
stepSxConnection.close();
super.setReturnCode(returnCode);
//System.out.println(sw.toString());
stepSxConnection.close();
//super.setLogOutput(msg);
return returnCode;
}
}

71
src/de/superx/elt/ActionHandler/EtlActionHandlerDosql.java

@ -1,71 +0,0 @@ @@ -1,71 +0,0 @@
/*
* 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.ActionHandler;
import java.io.File;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
import de.superx.elt.EtlUtils;
import de.superx.elt.QueryResultSerializer;
import de.superx.elt.SqlExecutor;
public class EtlActionHandlerDosql extends EtlActionHandler implements EtlActionHandlerI {
public EtlActionHandlerDosql() {
}
@Override
public int execute(StringWriter sw, String mandantid, String stepUniquename,String outFormat)
throws SQLException, Exception
{
int returnCode=0;
String log="";
long numberOfRows=0;
this.getConnection();
Properties myProps=EtlUtils.replaceSUPERX_DIRandETL_PFAD(handlerSpecificProperties);
String filename=myProps.getProperty("PATH_TO_INPUTFILE");
File sqlScriptFile = null;
try {
sqlScriptFile = new File(filename);
} catch (Exception e1) {
returnCode=1;
log+=" beim Öffnen der Datei "+ filename+": "+e1.toString();
super.setLogOutput(log);
}
if(returnCode==0)
{
try {
SqlExecutor mySqlExecutor = new SqlExecutor("default", stepSxConnection,sqlScriptFile,runTimeParams);
returnCode=mySqlExecutor.executeQueries();
String output=mySqlExecutor.getOutString().toString();
numberOfRows=mySqlExecutor.getNumberOfRows();
} catch (Exception e) {
returnCode=1;
log+=" beim Ausführen der Datei "+ filename+": "+e.toString();
super.setLogOutput(log);
}
super.setNumberOfRows(numberOfRows);
}
stepSxConnection.close();
super.setReturnCode(returnCode);
stepSxConnection.close();
if(returnCode==1)
throw new Exception("Fehler " + log);
//System.out.println(sw.toString());
//super.setLogOutput(msg);
return returnCode;
}
}

34
src/de/superx/elt/ActionHandler/EtlActionHandlerI.java

@ -1,34 +0,0 @@ @@ -1,34 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
public interface EtlActionHandlerI {
int getReturnCode();
long getNumberOfRows();
StringWriter getOutputStringWriter();
String getLogOutput();
void setConnection(Connection con);
void setLogger(Logger logger);
void setHandlerSpecificProperties(Properties hsp);
void setRunTimeParams(Properties runTimeParams);
void setOutputStringWriter(StringWriter sw);
int execute(StringWriter sw, String mandantid, String stepUniquename,String outFormat) throws SQLException,Exception;
void setPropFile(String propfile);
}

30
src/de/superx/elt/ActionHandler/EtlActionHandlerMsg.java

@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
public class EtlActionHandlerMsg extends EtlActionHandler implements EtlActionHandlerI {
public EtlActionHandlerMsg() {
//reflection API needs an empty constructor
}
@Override
public int execute(StringWriter sw, String mandantid, String stepUniquename, String outFormat)
throws SQLException, Exception {
int ret=0;
String msg=handlerSpecificProperties.getProperty("msg");
super.setLogOutput(stepUniquename+":"+ msg);
return ret;
}
}

43
src/de/superx/elt/ActionHandler/EtlActionHandlerUnloadRecords.java

@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
import de.superx.elt.QueryResultSerializer;
public class EtlActionHandlerUnloadRecords extends EtlActionHandler implements EtlActionHandlerI {
public EtlActionHandlerUnloadRecords() {
}
@Override
public int execute(StringWriter sw, String mandantid, String stepUniquename,String outFormat)
throws SQLException, Exception
{
int returnCode=0;
this.getConnection();
String query=handlerSpecificProperties.getProperty("select_stmt");
QueryResultSerializer myQueryResultSerializer=new QueryResultSerializer("default", stepSxConnection,query,sw);
myQueryResultSerializer.setLogger(logger);
super.setNumberOfRows(myQueryResultSerializer.unloadQueryResults(stepUniquename,outFormat,"",true));
super.setReturnCode(myQueryResultSerializer.getReturnCode());
super.setOutputStringWriter(myQueryResultSerializer.getOutputString());
//System.out.println(sw.toString());
stepSxConnection.close();
//super.setLogOutput(msg);
return returnCode;
}
}

58
src/de/superx/elt/ActionHandler/EtlActionHandlerUploadRecords.java

@ -1,58 +0,0 @@ @@ -1,58 +0,0 @@
/*
* 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.ActionHandler;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import de.superx.bin.SxConnection;
import de.superx.elt.QueryResultSerializer;
import de.superx.elt.TableUploader;
public class EtlActionHandlerUploadRecords extends EtlActionHandler implements EtlActionHandlerI {
public EtlActionHandlerUploadRecords() {
}
@Override
public int execute(StringWriter sw, String mandantid, String stepUniquename,String outFormat)
throws SQLException, Exception
{
int returnCode=0;
this.getConnection();
String target_table=handlerSpecificProperties.getProperty("target_table");
String inputfile=handlerSpecificProperties.getProperty("path_to_inputfile");
String xml_search_path=handlerSpecificProperties.getProperty("search_path");
String format=handlerSpecificProperties.getProperty("format");
String truncateTargetTable=handlerSpecificProperties.getProperty("truncateTargetTable");
long numberOfRows=0;
//getConnection(logger, this.getPropfile());
TableUploader myUploader=new TableUploader();
//myUploader.setDbpropfile(this.getPropfile());
myUploader.setInFormat(format);
myUploader.setTargetTable(target_table);
myUploader.setSrcFile(inputfile);
myUploader.setXml_search_path(xml_search_path);
myUploader.getConnection(stepSxConnection.getConnection(),null);
myUploader.setUploadConnection(stepSxConnection.getConnection());
myUploader.setTruncateTargetTable(truncateTargetTable);
numberOfRows=myUploader.uploadFile();
super.setLogOutput("Number of rows loaded: "+numberOfRows);
//System.out.println(sw.toString());
stepSxConnection.close();
//super.setLogOutput(msg);
return returnCode;
}
}

201
src/de/superx/elt/EtlAction.java

@ -1,201 +0,0 @@ @@ -1,201 +0,0 @@
/*
* 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.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import de.memtext.util.PropUtils;
import javax.sql.DataSource;
import de.superx.bin.SxConnection;
import de.superx.common.Sichten;
import de.superx.etl.EtlUtils;
public class EtlAction {
protected Properties params;
private boolean contOnError;
private String targetTable;
private String logoutput;
protected StringWriter actionOutput=new StringWriter();
protected StringWriter actionLog=new StringWriter();
private String loglevel="INFO";
private long starttime = new java.util.Date().getTime() ;
protected long endtime ;
private int returnCode;
private Connection dbconnection;
private Properties env;
private String uniquename;
protected String logfile;
protected String propfile;
private String encoding="UTF-8";
protected DataSource dataSource;
public EtlAction(String uniquename, String logfile, String propfile) {
this.uniquename = uniquename;
this.logfile = logfile;
this.propfile=propfile;
this.addActionLog("Action initialized"+EtlUtils.NEWLINE);
}
public EtlAction(String uniquename) {
this.uniquename = uniquename;
this.addActionLog("Action initialized"+EtlUtils.NEWLINE);
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public Connection getDbconnection() {
return dbconnection;
}
public void setDbconnection(Connection dbconnection) {
this.dbconnection = dbconnection;
}
public String getUniquename() {
return uniquename;
}
public void setUniquename(String uniquename) {
this.uniquename = uniquename;
}
public String getLogfile() {
return logfile;
}
public void setLogfile(String logfile) {
this.logfile = logfile;
}
public Properties getEnv() {
return env;
}
public void setEnv(Properties env) {
this.env = env;
}
public Properties getParams() {
return params;
}
public void setParams(Properties params) {
this.params = params;
}
public boolean isContOnError() {
return contOnError;
}
public void setContOnError(boolean contOnError) {
this.contOnError = contOnError;
}
public String getTargetTable() {
return targetTable;
}
public void setTargetTable(String targetTable) {
this.targetTable = targetTable;
}
public String getLogoutput() {
return logoutput;
}
protected void setLogoutput(String log) {
this.logoutput = log;
}
protected void appendLog(String log) {
this.logoutput+= log;
}
public String getLoglevel() {
return loglevel;
}
public void setLoglevel(String loglevel) {
this.loglevel = loglevel;
}
public long getStarttime() {
return starttime;
}
public void setStarttime(long starttime) {
this.starttime = starttime;
}
public long getEndtime() {
return endtime;
}
public void setEndtime(long endtime) {
this.endtime = endtime;
}
public long getDuration() {
return (this.endtime - this.starttime)/1000;
}
public String getPropfile() {
return propfile;
}
public void setPropfile(String propfile) {
this.propfile = propfile;
}
public int getReturnCode() {
return returnCode;
}
public StringWriter getActionOutput() {
return actionOutput;
}
public void setActionOutput(StringWriter actionOutput) {
this.actionOutput = actionOutput;
}
public StringWriter getActionLog() {
return actionLog;
}
public void setActionLog(StringWriter actionLog) {
this.actionLog = actionLog;
}
public void addActionLog(String actionLog) {
String log=de.memtext.util.DateUtils.getTodayString()+ " " + de.memtext.util.DateUtils.getNowString();
this.actionLog.append(log+"- "+ actionLog+EtlUtils.NEWLINE);
}
protected void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
public int execute() throws SQLException, Exception
{
int returncode=0;
endtime=new java.util.Date().getTime() ;
return returncode;
}
public Connection getConnection(Connection myConnection) throws Exception {
String myDefaultPropFile=de.superx.elt.EtlUtils.WEBINFDIR+de.superx.elt.EtlUtils.PATHSEP+"db.properties";
if(myConnection==null)
{
if(propfile==null)
propfile=myDefaultPropFile;
SxConnection mySxConnection = null;
mySxConnection = new SxConnection();
mySxConnection.setPropfile(propfile);
myConnection = mySxConnection.getConnection();
}
return myConnection;
}
}

243
src/de/superx/elt/EtlActionJob.java

@ -1,243 +0,0 @@ @@ -1,243 +0,0 @@
/*
* 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;
}
}

239
src/de/superx/elt/EtlStep.java

@ -1,239 +0,0 @@ @@ -1,239 +0,0 @@
/*
* 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.InputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import java.util.logging.Logger;
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.memtext.util.GetOpts;
import de.superx.bin.Doquery;
import de.superx.bin.SxConnection;
import de.superx.common.SuperX_el;
import de.superx.common.SxResultRow;
import de.superx.common.SxResultSet;
import de.superx.common.SxSqlHelper;
import de.superx.elt.ActionHandler.*;
import de.superx.servlet.SxPools;
import de.superx.util.SqlStringUtils;
import freemarker.template.TemplateBooleanModel;
public class EtlStep extends EtlAction {
private String mandantenID;
private Integer stepTid;
private String stepUniquename;
private String stepLogfile;
private String stepCaption;
private Integer stepSortnr;
private Integer stepForceContinue;
private Integer stepParentStepId;
private String stepTypeUniquename;
private String stepTypeCaption;
private String stepTypeHandler;
private Properties jobRunTimeParams;
private Properties stepProperties;
private SxConnection stepSxConnection;
private Connection stepConnection;
public EtlStep(String uniquename, String logfile, String propfile) {
super(uniquename, logfile, propfile);
//this.setLogoutput("Step "+uniquename);
super.addActionLog("Step "+uniquename +" loaded");
}
public StringWriter getOutputStringWriter() {
return sw;
}
public void setOutputStringWriter(StringWriter sw) {
this.sw = sw;
}
private StringWriter sw;
public void initStep(String job,Properties runTimeParams, Integer tid,
String uniquename,
String logfile,
String caption,
Integer sortnr,
Integer forceContinue,
Integer parentStepId,
String typeUniquename,
String typeCaption,
String typeHandler
) throws Exception
{
jobRunTimeParams=runTimeParams;
stepTypeHandler=typeHandler;
stepTid=tid;
stepUniquename=uniquename;
stepLogfile=logfile;
stepCaption=caption;
stepSortnr=sortnr;
stepForceContinue=forceContinue;
stepParentStepId=parentStepId;
stepTypeUniquename=typeUniquename;
stepTypeCaption=typeCaption;
this.setLogfile(logfile);
super.addActionLog("Initializing Step: "+caption);
super.addActionLog("Handler: "+typeHandler);
//this.appendLog("Params: "+runTimeParams.toString());
//get Params:
Connection myConnection=this.getDbconnection();
if(myConnection==null)
myConnection=this.getConnection(myConnection);
this.setDbconnection(myConnection);
if(!SqlStringUtils.checkValidKeyEntry(job))
throw new SQLException("Invalid job");
String sql = "select tid,prop_name,prop_value from etl_step_property where etl_step_id="+tid.toString()+";";
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 Step DETAILS:" + "\n\n Meldung:"
+ el.getError_String() + "\n sql:" + sql);
SxResultSet result= el.getResultSet();
stepProperties=null;
stepProperties=new Properties();
int rownr=0;
for (Iterator it = result.iterator(); it.hasNext();) {
rownr++;
SxResultRow row = (SxResultRow) it.next();
String paramName=row.get(1).toString().trim();
String paramValue=row.get(2).toString().trim();
String paramValueParsed=parseParams(paramValue);
stepProperties.setProperty(paramName, paramValueParsed);
super.addActionLog("Parameter "+paramName+":"+paramValueParsed);
}
}
private String parseParams(String paramValue)
{
String parsedParam=paramValue;
Enumeration runTimeParamNames = jobRunTimeParams.propertyNames();
while (runTimeParamNames.hasMoreElements()) {
String runTimeParamName = (String)runTimeParamNames.nextElement();
String runTimeParamValue = jobRunTimeParams.getProperty(runTimeParamName);
parsedParam=de.memtext.util.StringUtils.replace(parsedParam,"$"+runTimeParamName, runTimeParamValue);
}
return parsedParam;
}
public int execute()
throws Exception
{
int returnCode=0;
long numberOfRows=0;
Logger logger =(Logger) Logger.getLogger(EtlStep.class.toString());
super.addActionLog("Executing Step "+this.stepUniquename);
Class handlerClass = Class.forName(stepTypeHandler);
Object handlerObject = handlerClass.newInstance();
((EtlActionHandlerI) handlerObject).setLogger(logger);
((EtlActionHandlerI) handlerObject).setHandlerSpecificProperties(stepProperties);
((EtlActionHandlerI) handlerObject).setRunTimeParams(jobRunTimeParams);
((EtlActionHandlerI) handlerObject).setOutputStringWriter(this.getOutputStringWriter());
((EtlActionHandlerI) handlerObject).setPropFile(this.getPropfile());
try {
returnCode=((EtlActionHandlerI) handlerObject).execute(this.getOutputStringWriter(),"default",this.stepUniquename,"xml");
} catch (Exception e) {
returnCode=1;
super.addActionLog("Fehler beim Step "+ this.stepUniquename+ ": "+e.toString());
//TODO forceContinue auswerten
}
this.setOutputStringWriter(((EtlActionHandlerI) handlerObject).getOutputStringWriter());
super.addActionLog(((EtlActionHandlerI) handlerObject).getLogOutput());
/*
if(stepTypeHandler.equals("de.superx.bin.UnloadRecords"))
{
getConnection(logger, this.getPropfile());
String query=stepParams.getProperty("select_stmt");
sw=this.getSw();
QueryResultSerializer myQueryResultSerializer=new QueryResultSerializer("default", stepSxConnection,query,sw);
myQueryResultSerializer.setLogger(logger);
NumberOfRows=myQueryResultSerializer.unloadQueryResults(this.stepUniquename,"xml","",true);
this.setReturnCode(myQueryResultSerializer.getReturnCode());
sw=myQueryResultSerializer.getOutputString();
this.setSw(sw);
//System.out.println(sw.toString());
stepSxConnection.close();
}
if(stepTypeHandler.equals("de.superx.bin.Doquery"))
{
String query=stepParams.getProperty("select_stmt");
getConnection(logger, this.getPropfile());
SqlExecutor mySqlExecutor=new SqlExecutor("default", stepSxConnection,query,jobRunTimeParams);
returnCode=mySqlExecutor.executeQueries();
stepSxConnection.close();
}
if(stepTypeHandler.equals("de.superx.bin.UploadRecords"))
{
String target_table=stepParams.getProperty("target_table");
String inputfile=stepParams.getProperty("path_to_inputfile");
String xml_search_path=stepParams.getProperty("search_path");
long numberOfRows=0;
//getConnection(logger, this.getPropfile());
TableUploader myUploader=new TableUploader();
myUploader.setDbpropfile(this.getPropfile());
myUploader.setInFormat("xml");
myUploader.setTargetTable(target_table);
myUploader.setSrcFile(inputfile);
myUploader.setXml_search_path(xml_search_path);
//myUploader.setUploadConnection(stepSxConnection.getConnection());
myUploader.setUploadConnection(myUploader.getConnection(null,this.getPropfile()));
//SqlExecutor mySqlExecutor=new SqlExecutor("default", stepSxConnection,query);
numberOfRows=myUploader.uploadFile();
this.appendLog("Number of rows loaded: "+numberOfRows);
}
if(stepTypeHandler.trim().equals("msg"))
{
String msg=stepParams.getProperty("msg");
this.appendLog(msg);
}*/
//logger.info(this.getLogoutput());
return returnCode;
}
}

353
src/de/superx/elt/EtlUtils.java

@ -1,353 +0,0 @@ @@ -1,353 +0,0 @@
/*
* 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.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import de.superx.servlet.SuperXManager;
/**
*/
public class EtlUtils {
public static final String NEWLINE=System.getProperty("line.separator");
public static final String PATHSEP=File.separator;
public static String WEBINFDIR=SuperXManager.getWEB_INFPfad();
public static String SUPERX_DIR=(System.getProperties().containsKey("SUPERX_DIR")? System.getProperty("SUPERX_DIR"):"");
public static void main(String args[]) {
try {
String tidInXmlFile="";
Document mydomres =de.superx.elt.EtlUtils.buildDocumentFromXmlFile("/home/superx/devel_module/community/tomcat/temp/myTempFile6460222908896375059.xml");
XPathFactory factory = new net.sf.saxon.xpath.XPathFactoryImpl();
XPath xPath = factory.newXPath();
//String searchPath="/etlAction[@name=\"sx_select_mask\"]/unload/row/fld[@name=\"tid\"]";
String searchPath="/etlAction[@name=\"sx_select_mask\"]/unload[@name=\"unload_maskeninfo\"]/rs/row/fld[@name=\"tid\"]";
Node tidNode=(Node) xPath.compile(searchPath).evaluate(
mydomres, XPathConstants.NODE);
if(tidNode!=null)
tidInXmlFile=de.memtext.util.XMLUtils.getTheValue(tidNode);
else
System.out.println("node not found");
System.out.println(tidInXmlFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Properties convertStringToProperty(String inp) throws IOException
{
Properties myProps = new Properties();
myProps.load(new StringReader(inp));
return myProps;
}
public static Properties replaceSUPERX_DIRandETL_PFAD(Properties params) throws IOException
{
Properties returnProperties=new Properties();
Properties pathParams =convertStringToProperty("SUPERX_DIR="+SUPERX_DIR);
returnProperties=mergeParamProperties(params,pathParams);
return returnProperties;
}
public static Properties mergeParamProperties(Properties params, Properties runTimeParams)
{
String parsedParam;
Enumeration runTimeParamNames = runTimeParams.propertyNames();
while (runTimeParamNames.hasMoreElements()) {
String runTimeParamName = (String)runTimeParamNames.nextElement();
String runTimeParamValue = runTimeParams.getProperty(runTimeParamName);
Enumeration paramNames = params.propertyNames();
while (paramNames.hasMoreElements()) {
String paramName=(String)paramNames.nextElement();
String paramValue=params.getProperty(paramName);
if(paramName.equals(runTimeParamName) )
{
paramValue=runTimeParamValue;
params.setProperty(paramName, paramValue);
}
if(paramValue.indexOf("$"+runTimeParamName)>-1)
{
paramValue=de.memtext.util.StringUtils.replace(paramValue,"$"+runTimeParamName, runTimeParamValue);
params.setProperty(paramName, paramValue);
}
}
}
return params;
}
public static void initJobEnvironment()
{
String initVar="";
if(System.getProperty("WEBINFDIR") ==null)
{
try {
initVar=de.superx.servlet.SuperXManager.getWEB_INFPfad();
if(initVar==null || initVar.equals("."))
{
//ermittle webinfdir
initVar=getWebinfDirectory();
}
} catch (Exception e) {
// do nothing, try another
}
WEBINFDIR=initVar;
}
if(System.getProperty("SUPERX_DIR") ==null)
{
SUPERX_DIR=WEBINFDIR+PATHSEP+"conf"+PATHSEP+"edustore";
}
}
private static String getJarName()
{
return new File(EtlUtils.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName();
}
private static boolean runningFromJar()
{
String jarName = getJarName();
return jarName.contains(".jar");
}
public static String getWebinfDirectory() throws URISyntaxException
{
if (runningFromJar())
{
return getWebinfDirectoryFromJar();
} else
{
return getWebinfDirectoryFromClass();
}
}
private static String getWebinfDirectoryFromClass()
{
File f= new File(EtlUtils.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath()+PATHSEP+"..");
String class_path=f.getAbsolutePath();
return class_path;
}
private static String getWebinfDirectoryFromJar() throws URISyntaxException
{
String pathOfJarFile=new File(EtlUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParent();
String webinfDir=new File(pathOfJarFile+PATHSEP+"..").getAbsolutePath();
return webinfDir;
}
/* die folgenden 2 Methoden
* getFileContentsWithEncoding
* saveFileContentsWithEncoding
* sind in kern5.0 in de.superx.util.FileUtils
* wg. abwärtskompatiblität hierhin kopiert, sollten langfristig wieder weg
*/
public static String getFileContentsWithEncoding(String filePath, String encoding) {
File f = new File(filePath);
if (!f.exists()) {
System.out.println("Fehler: Datei " + filePath + " existiert nicht.");
return null;
}
String fileContents = "";
if (encoding == null || encoding.trim().equals("")) {
encoding = System.getProperty("file.encoding");
}
try {
// --- IputStream und OutputStream generieren ---//
FileInputStream fis = new FileInputStream(f);
// Wenn Quelldatei Unicode, dann speziellen Reader nutzen
BufferedReader in;
//BufferedReader ist schneller bei großen Dateien
in = new BufferedReader(new InputStreamReader(fis, encoding));
// --- Output-Stream der temporären Datei erzeugen ---//
StringWriter out = new StringWriter();
// --- Verarbeiten der Datei ---//
String text;
text = in.readLine();
while (text != null) { // Datei nicht leer
out.write(text);
out.write(System.getProperty("line.separator"));
text = in.readLine();
}
if (!(out == null)) {
fileContents = out.toString();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileContents;
}
public static void saveFileContentsWithEncoding(String filename, String contents, String encoding) throws
FileNotFoundException,
IOException
{
File f = new File(filename);
BufferedReader in;
BufferedWriter out;
//Default encoding ist utf-8
if (encoding == null) encoding = System.getProperty("file.encoding");
// --- Output-Stream der temporären Datei erzeugen ---//
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), encoding));
out.write(contents);
out.close();
}//Ende der Methode
/*SAX Document aus XML-Datei erzeugen */
public static Document buildDocumentFromXmlFile(String srcFile)
throws ParserConfigurationException, FileNotFoundException, SAXException, IOException {
Document mydomres;
org.xml.sax.InputSource is;
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dfactory.newDocumentBuilder();
FileInputStream in = new FileInputStream(srcFile);
is=new org.xml.sax.InputSource(in);
mydomres = builder.newDocument();
mydomres = builder.parse(is);
return mydomres;
}
/***
* TODO: nach merge in master diese Methode löschen, und auf de.memtext.util.XMLUtils.parseXml(String) verweisen
* @author Witt This function parses XML-containing string into documents while
* preserving the namespaces and is primarily meant to be used withing
* (jUnit) test cases
* @param xmlString
* @return
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
public static Document parseXml(String xmlString) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory myFactory = DocumentBuilderFactory.newInstance();
myFactory.setNamespaceAware(true);
DocumentBuilder myBuilder;
myBuilder = myFactory.newDocumentBuilder();
Document myDocument = myBuilder.parse(new InputSource(new StringReader(xmlString)));
return myDocument;
}
/**
* @param src
* @param tidInXmlFile
* @return
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
* @throws XPathExpressionException
*/
public static boolean isNodeValueInXml(String src, String searchPath, String expectedValue,String jobuniquename)
throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
boolean b=false;
Document mydomres =de.superx.elt.EtlUtils.parseXml(src);
XPathFactory factory = new net.sf.saxon.xpath.XPathFactoryImpl();
XPath xPath = factory.newXPath();
Node myNode=(Node) xPath.compile(searchPath).evaluate(
mydomres, XPathConstants.NODE);
if(myNode!=null)
{
String foundValue=de.memtext.util.XMLUtils.getTheValue(myNode);
if(!(foundValue==null) && foundValue.trim().equals(expectedValue))
b=true;
}
return b;
}
public static String translateReturnCode(int returnCode)
{
String returnString="Fehlerhaft";
if(returnCode==0)
returnString="Erfolg";
return returnString;
}
public static String translateReturnCode2Html(int returnCode)
{
String returnString=translateReturnCode(returnCode);
if(returnCode==0)
returnString="<span style='color:green'>"+returnString+"</span>";
else
returnString="<span style='color:red'>"+returnString+"</span>";
return returnString;
}
}

437
src/de/superx/elt/QueryResultSerializer.java

@ -1,437 +0,0 @@ @@ -1,437 +0,0 @@
/*
* 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.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.JDBCType;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.Level;
import de.memtext.util.StringUtils;
import de.superx.bin.SxConnection;
import de.superx.bin.SxDBUtils;
import de.superx.bin.SxJdbcClient;
import java.util.Iterator;
import java.util.StringTokenizer;
import de.superx.common.SxResultSet;
import de.superx.elt.bin.SxTransformer;
import de.superx.servlet.ServletUtils;
import de.superx.servlet.SxSQL_Server;
import de.superx.util.SqlStringUtils;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* doquery.java
* @
* Dieses Javaprogramm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
/*
* SQL-Abfragen Ergebnis serialisieren nach CSV / XML
*/
public class QueryResultSerializer {
public QueryResultSerializer(String mandantenId,SxConnection mySxConnection, String query,StringWriter sw) {
super();
this.mySxConnection = mySxConnection;
this.query = prepareQuery(query);
this.mandantenId = mandantenId;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.outputString=sw;
}
public QueryResultSerializer(String mandantenId,SxConnection mySxConnection, String query,FileWriter fw) {
super();
this.mySxConnection = mySxConnection;
this.query = prepareQuery(query);
this.mandantenId = mandantenId;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.outputFile=fw;
}
public QueryResultSerializer(String mandantenId,SxConnection mySxConnection, ResultSet rs,FileWriter fw) {
super();
this.mySxConnection = mySxConnection;
this.myrs=rs;
this.mandantenId = mandantenId;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.outputFile=fw;
}
public QueryResultSerializer(String mandantenId,SxConnection mySxConnection, ResultSet rs,StringWriter sw) {
super();
this.mySxConnection = mySxConnection;
this.myrs=rs;
this.mandantenId = mandantenId;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.outputString=sw;
}
public final String NEWLINE=System.getProperty("line.separator");
private String outfile;
private SxConnection mySxConnection;
private String query;
private String CSVdelim;
private Boolean printColNames;
private String outFormat;
private Logger logger;
private String mandantenId="default";
private Statement st;
private Connection myConnection;
private String[] colnames;
private int[] coltypes;
private int columnCount;
private StringBuffer outString=new StringBuffer("");
//private PrintStream stringOutWriter=new PrintStream(outString);
//private PrintWriter output=new PrintWriter(stringOutWriter);
private String outputHeader="";
private String outputFooter="";
private BufferedOutputStream outputStream;
public StringWriter outputString;
public FileWriter outputFile;
private int returnCode;
private ResultSet myrs;
public String getOutfile() {
return outfile;
}
public void setOutfile(String outfile) {
this.outfile = outfile;
}
public SxConnection getMySxConnection() {
return mySxConnection;
}
public void setMyConnection(SxConnection mySxConnection) {
this.mySxConnection = mySxConnection;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public String getOutFormat() {
return outFormat;
}
public void setOutFormat(String outFormat) {
this.outFormat = outFormat;
}
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
public String getMandantenId() {
return mandantenId;
}
public void setMandantenId(String mandantenId) {
this.mandantenId = mandantenId;
}
public String[] getColnames() {
return colnames;
}
public void setColnames(String[] colnames) {
this.colnames = colnames;
}
public int[] getColtypes() {
return coltypes;
}
public void setColtypes(int[] coltypes) {
this.coltypes = coltypes;
}
public StringWriter getOutputString() {
return outputString;
}
public void setOutputString(StringWriter output) {
this.outputString = output;
}
public FileWriter getOutputFile() {
return outputFile;
}
public void setOutputFile(FileWriter outputFile) {
this.outputFile = outputFile;
}
public int getColumnCount() {
return columnCount;
}
public void setColumnCount(int columnCount) {
this.columnCount = columnCount;
}
public int getReturnCode() {
return returnCode;
}
public void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
protected ResultSet getMyrs() {
return myrs;
}
protected void setMyrs(ResultSet myrs) {
this.myrs = myrs;
}
public long unloadQueryResults(String uniquename, String outformat,String delim,boolean printColname) throws Exception
{
returnCode=0;
long numberOfRows=0;
String zs="";
if(myrs==null)
{
SxResultSet rs = null;
SxJdbcClient myClient = new SxJdbcClient(logger, mySxConnection.getPropfile(), query);
//logger.info("Executing sql: " + query);
myClient.Rs_executeALL();
logger.info("Getting resultset") ;
myrs = myClient.getRs();
//logger.info("Starting output for: " + query);
}
if(myrs != null )
{
ResultSetMetaData rsmd = myrs.getMetaData();
setColnamesAndTypes(rsmd);
if(outformat.equalsIgnoreCase("xml"))
{
zs+="<unload name=\""+uniquename+"\"><query><![CDATA["+query+"]]></query><rs>";
if(printColname)
zs+=this.getColnamesXML();
}
else
{
//CSV:
if(printColname)
zs+=this.getColnamesCSV(delim)+"\n";
}
//this.outputStream.w
//StringWriter sw = new StringWriter();
//sw.write(zs);
//this.setOutputString(sw);
try {
numberOfRows=printResult(outformat,zs,myrs,delim);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnCode=1;
}
}
return numberOfRows;
}
private long printResult(String outformat,String header,ResultSet outrs,String delim) throws SQLException, IOException
{
StringBuffer line = new StringBuffer();
int types[]=this.getColtypes();
String lbl[]=this.getColnames();
String f_wert=null;
Object o = null;
int rowCounterBeforeFlush = 0;
long rowCounter = 0;
FileWriter fw = null;
StringWriter sw=null;
String rowDelim1=(outformat.equalsIgnoreCase("xml"))?"<row>":"";
String rowDelim2=(outformat.equalsIgnoreCase("xml"))?"</row>"+NEWLINE:"\n"; //bei CSV ist Zeilentrenner immer \n, nicht DOS-Anpassung
String footer=(outformat.equalsIgnoreCase("xml"))?"</rs></unload>":"";
boolean writeFileOutput=(this.outputFile==null)?false:true;
int colNumber=this.getColumnCount();
if(writeFileOutput)
{
fw=this.getOutputFile();
fw.write(header);
}
else
{
sw=this.getOutputString();
sw.write(header);
}
while (outrs.next())
{
line.setLength(0);
line.append(rowDelim1);
for (int i = 1; i <= colNumber; i++) {
if (types[i-1] == Types.LONGVARCHAR) {
//Der Informix-Treiber verlangt hier getString
// statt getObject!
o = outrs.getString(i);
} else {
o = outrs.getObject(i);
}
//vergl. de.superx.common.Maske.getCSV
f_wert = SxDBUtils.field_value(o);
f_wert = prepareFieldValue(outformat,lbl[i-1],f_wert,delim);
if (i < colNumber)
line.append( f_wert );
else {
line.append(f_wert );
line.append(rowDelim2);
}
}
if(writeFileOutput)
{
//fw=this.getOutputFile();
fw.write(line.toString());
rowCounterBeforeFlush++;
if (rowCounterBeforeFlush > 10000) {
de.memtext.util.MemoryUtils.printfree();
fw.flush();
rowCounterBeforeFlush = 0;
}
}
else
{
//sw=this.getOutputString();
sw.write(line.toString());
}
rowCounter++;
} ; //von while
outrs.close();
if(writeFileOutput)
{
if(outformat.equalsIgnoreCase("xml"))
fw.write(footer);
fw.flush();
fw.close();
}
else
{
if(outformat.equalsIgnoreCase("xml"))
sw.write(footer);
sw.close();
this.setOutputString(sw);
}
return rowCounter;
}
private void setColnamesAndTypes(ResultSetMetaData rsmd) throws SQLException
{
int cols = rsmd.getColumnCount();
int[] types = new int[cols];
String[] lbl = new String[cols];
// Print the result column names?
for (int i = 0; i < cols; i++) {
lbl[i] = rsmd.getColumnLabel(i+1);
types[i] = rsmd.getColumnType(i+1);
}
this.setColnames(lbl);
this.setColtypes(types);
this.setColumnCount(cols);
}
private String getColnamesCSV(String delim) {
String headZs = "";
int colNumber = this.getColnames().length;
for (int i = 0; i < colNumber; i++) {
headZs += ( this.getColnames()[i] +delim);
}
return headZs;
}
private String getColnamesXML() {
String headZs = "<rsmd>";
int colNumber = this.getColnames().length;
for (int i = 0; i < colNumber; i++) {
headZs += "<fld name=\"" + this.getColnames()[i] + "\" type=\""+SxDBUtils.getSqlTypeName(this.getColtypes()[i])+"\"> </fld>"+NEWLINE;
}
headZs+="</rsmd>";
return headZs;
}
private String prepareQuery(String query)
{
query = query.trim();
//DOS produces unnecessary ".." around the stmt
if (query.length() > 0) {
if (query.startsWith("\""))
query = query.substring(1, query.length());
if (query.endsWith("\""))
query = query.substring(0, query.length() - 1);
}
return query;
}
private String prepareFieldValue(String outformat,String fieldName, String f_wert,String delim)
{
String fieldValue="";
if (outformat.equals("xml"))
{
fieldValue+="<fld name=\"" + fieldName + "\">";
f_wert=encodeCDATA(f_wert);
if(f_wert.indexOf("&") > -1 || f_wert.indexOf("<") > -1 || f_wert.indexOf(">") > -1)
fieldValue += "<![CDATA[" + f_wert + "]]>";
else
fieldValue += f_wert;
fieldValue+="</fld>"+NEWLINE;
}
//wenn der Feldwert zufällig das Trennzeichen enthält, wird es mit "\" maskiert
if (outformat.equals("txt")) {
fieldValue = SxDBUtils.prepareInformixCsv(f_wert);
if (fieldValue != null && (fieldValue.indexOf(delim) > -1)) fieldValue = de.memtext.util.StringUtils.replace(fieldValue, delim, "\\" + delim);
fieldValue+=delim;
}
return fieldValue;
}
/**
* Beim XML Export darf der Feldinhalt nicht CDATA-Tags enthalten, dies wrürde beim Import
* Probleme machen. Daher durch Platzhalter ersetzen
*
* @param Feldinhalt
* PG/IDS
* @return Feldinhalt (ersetzt)
*/
private String encodeCDATA(String x)
{
if (x==null) x="";
x = StringUtils.replace(x,"<![CDATA[",
"CDATASTART" );
x = StringUtils.replace(x, "]]>",
"CDATAEND");
return x;
}
}

340
src/de/superx/elt/SqlExecutor.java

@ -1,340 +0,0 @@ @@ -1,340 +0,0 @@
/*
* 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.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.JDBCType;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.Level;
import de.memtext.util.DateUtils;
import de.memtext.util.StringUtils;
import de.superx.bin.FMParser;
import de.superx.bin.SxConnection;
import de.superx.bin.SxDBUtils;
import de.superx.bin.SxJdbcClient;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import java.util.StringTokenizer;
import de.superx.bin.XUpdater;
import de.superx.common.FieldContainer;
import de.superx.elt.bin.SxTransformer;
import de.superx.servlet.ServletUtils;
import de.superx.servlet.SuperXManager;
import de.superx.servlet.SxPools;
import de.superx.servlet.SxSQL_Server;
import de.superx.util.SqlStringUtils;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* doquery.java
* @
* Dieses Javaprogramm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
/*
* SQL-Abfragen Ergebnis serialisieren nach CSV / XML
*/
public class SqlExecutor {
public SqlExecutor(String mandantenId,SxConnection mySxConnection, String sqlScript, Properties params) {
super();
this.mySxConnection = mySxConnection;
this.sqlScript = sqlScript;
this.mandantenId = mandantenId;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.params=params;
}
public SqlExecutor(String mandantenId,SxConnection mySxConnection, File sqlScriptFile, Properties params) throws IOException {
super();
this.mySxConnection = mySxConnection;
this.mandantenId = mandantenId;
this.sqlScriptFile=sqlScriptFile;
this.logger = Logger.getLogger("superx_" + mandantenId);
this.params=params;
if (!sqlScriptFile.exists()) {
throw new IOException("Datei nicht gefunden: " + sqlScriptFile.getAbsolutePath());
}
BufferedReader in;
//--- InputStream generieren ---//
in = new BufferedReader(new InputStreamReader(new FileInputStream(sqlScriptFile)));
//--- Verarbeiten der Datei ---//
String sql = "";
String text = "";
while ((text = in.readLine()) != null) {
//MB auskommentiert 27.4.05
//löschte ( in
//insert into
//(
//tid,...
//if (text.length() > 1)
sql += NEWLINE + text.trim();
}
in.close();
this.sqlScript =sql;
}
public final String NEWLINE=System.getProperty("line.separator");
private SxConnection mySxConnection;
private String sqlScript;
private File sqlScriptFile;
private Logger logger;
private String mandantenId="default";
private Statement st;
private Connection myConnection;
private StringBuffer outString=new StringBuffer("");
//private PrintStream stringOutWriter=new PrintStream(outString);
//private PrintWriter output=new PrintWriter(stringOutWriter);
private int returnCode;
private String outfile="";
private String CSVdelim="^";
private boolean printColNames=false;
private String outFormat="txt";
private long numberOfRows;
private Properties params;
public SxConnection getMySxConnection() {
return mySxConnection;
}
public void setMyConnection(SxConnection mySxConnection) {
this.mySxConnection = mySxConnection;
}
public String getSqlScript() {
return sqlScript;
}
public void setSqlScript(String sqlScript) {
this.sqlScript = sqlScript;
}
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
public String getMandantenId() {
return mandantenId;
}
public void setMandantenId(String mandantenId) {
this.mandantenId = mandantenId;
}
public String getOutfile() {
return outfile;
}
public void setOutfile(String outfile) {
this.outfile = outfile;
}
public String getCSVdelim() {
return CSVdelim;
}
public void setCSVdelim(String cSVdelim) {
CSVdelim = cSVdelim;
}
public boolean getPrintColNames() {
return printColNames;
}
public void setPrintColNames(boolean printColNames) {
this.printColNames = printColNames;
}
public String getOutFormat() {
return outFormat;
}
public void setOutFormat(String outFormat) {
this.outFormat = outFormat;
}
public int getReturnCode() {
return returnCode;
}
public void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
public long getNumberOfRows() {
return numberOfRows;
}
public void setNumberOfRows(long numberOfRows) {
this.numberOfRows = numberOfRows;
}
public Properties getParams() {
return params;
}
public void setParams(Properties params) {
this.params = params;
}
public StringBuffer getOutString() {
return outString;
}
public void setOutString(StringBuffer outString) {
this.outString = outString;
}
public int executeQueries() throws Exception
{
returnCode=0;
FileWriter fw;
StringWriter sw;
SxTransformer myTransformer;
QueryResultSerializer myQueryResultSerializer=null;
if (sqlScript.toLowerCase().indexOf("<xupdate>")>-1)
{
SxConnection myConnection = new SxConnection();
myConnection.setPropfile(mySxConnection.getPropfile());
Connection con = myConnection.getConnection();
new XUpdater().execute(con, myConnection.getDatabaseAbbr(), sqlScript,logger);
}
else
{
if(sqlScript.toLowerCase().indexOf("--freemarker template")>-1)
{
/* boolean isTemplate = getSelect_stmt().toUpperCase().indexOf("FREEMARKER TEMPLATE") > -1;
String select_string = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(),
individualFields.getFormular(), getSelect_stmt() + "\n" + getCleanup_stmt());
// select_string=select_string.replaceAll("Fächer.elements",
// "Fächer.xx");
// map.clear();
if (isTemplate) {
SuperXManager.setLastFMMaskenSql(
"-- " + getMaskInfo() + " " + DateUtils.getNowString() + "\n" + select_string);
select_string = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(),
getMaskInfo(), select_string, individualFields, SxPools.get(mandantenID).getRepository(),
SxPools.get(mandantenID).getSqlDialect());
// danach enthält map alle vars inkl. sqlvars
}
// MB 07/2010 macht Probleme bei Freemarker hashes
// generell deaktiviert, hier falls doch noch in alten Masken
// vorhanden
select_string = SqlStringUtils.removeComment(select_string, "{", "}");
*/
/* alt: sqlScript=de.superx.bin.FMParser.simpleParser(mySxConnection.getPropfile(), sqlScript);*/
//Die map und der FieldContainer sind null, werden nur in Masken genutzt
HashMap map = new HashMap();
FieldContainer individualFields = new FieldContainer();
if(SxPools.hasMandanten()){
//Servlet Betrieb:
sqlScript= SxPools.get(mandantenId).getTemplateProcessor().process(map, -1,
"SQL-Script", sqlScript, individualFields, SxPools.get(mandantenId).getRepository(),
SxPools.get(mandantenId).getSqlDialect());
}
else
{
//Kommandozeile: TODO hier sind noch keine FM Scripte mit SQLVAR möglich:
sqlScript=FMParser.simpleParser(mySxConnection.getPropfile(), sqlScript);
}
String keepGenerated=System.getProperty("FreemarkerKeepGenerated");
if(keepGenerated!=null && keepGenerated.equalsIgnoreCase("true"))
{
FileWriter sqlScriptTmp ;
if(sqlScriptFile==null)
{
File tempFile = File.createTempFile("fm_output", ".sql");
sqlScriptTmp = new FileWriter(tempFile);
logger.info("FM generated SQL: "+tempFile.getAbsolutePath());
}
else
sqlScriptTmp = new FileWriter(sqlScriptFile.getAbsolutePath()+".tmp.sql");
sqlScriptTmp.write(sqlScript);
sqlScriptTmp.close();
}
}
sqlScript = sqlScript.trim();
sqlScript = SqlStringUtils.removeComment(sqlScript, "{", "}");
if (sqlScript.startsWith("\""))
sqlScript = sqlScript.substring(1, sqlScript.length());
if (sqlScript.endsWith("\""))
sqlScript = sqlScript.substring(0, sqlScript.length() - 1);
//replace CLI-params:
if (params==null)
{
//do nothing
}
else
{
Enumeration paramEnum = params.propertyNames();
while (paramEnum.hasMoreElements()) {
String paramName = (String)paramEnum.nextElement();
String paramValue = params.getProperty(paramName);
sqlScript=de.memtext.util.StringUtils.replace(sqlScript,"$"+paramName, paramValue);
}
}
logger.config("Inhalt der sql-Datei: "+NEWLINE+"--" + sqlScript + "--");
SxJdbcClient myClient = new SxJdbcClient(logger, mySxConnection.getPropfile(), sqlScript);
myClient.Rs_executeALL();
ResultSet myrs = myClient.getRs();
if (myrs != null) {
//Letzter SQL liefert Ergebnisse:
if(!outfile.equals(""))
{
try {
fw = new FileWriter(outfile);
if(outFormat.equalsIgnoreCase("xml"))
fw.write("<?xml version=\"1.0\" encoding=\""+SqlStringUtils.getEncoding()+"\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", mySxConnection, myrs,fw);
numberOfRows=myQueryResultSerializer.unloadQueryResults("DOQUERY",outFormat,this.CSVdelim,printColNames);
returnCode=myQueryResultSerializer.getReturnCode();
} catch (IOException e) {
logger.severe ("Fehler beim Erstellen der Datei "+outfile);
returnCode=1;
}
}
else
{
sw=new StringWriter();
if(outFormat.equalsIgnoreCase("xml"))
sw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", mySxConnection, myrs,sw);
numberOfRows=myQueryResultSerializer.unloadQueryResults("DOQUERY",outFormat,this.CSVdelim,printColNames);
returnCode=myQueryResultSerializer.getReturnCode();
outString= myQueryResultSerializer.getOutputString().getBuffer();
}
} else
logger.info("Keine Rückgabewerte aus SQL-Script");
}
return returnCode;
}
}

779
src/de/superx/elt/TableUploader.java

@ -1,779 +0,0 @@ @@ -1,779 +0,0 @@
/*
* 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.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.text.ParseException;
import java.util.Iterator;
import java.util.Properties;
import de.superx.util.SqlStringUtils;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.*;
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyManager;
import de.superx.bin.SxConnection;
import de.superx.bin.SxJdbcClient;
import de.superx.bin.UploadRecords;
import de.superx.elt.util.FileUtils;
import de.memtext.util.DateUtils;
import de.memtext.util.GetOpts;
import de.memtext.util.StringUtils;
import de.memtext.util.XMLUtils;
public class TableUploader {
private String logfile;
private String dbpropfile;
private String mode="stop";
private String inFormat;
private String targetTable;
private String srcFile;
private boolean header=false;
private String delim="^";
private String encoding=SqlStringUtils.getEncoding();
private String inserts="";
private boolean truncateTargetTable=true;
private boolean continueAfterError;
private boolean removeTrailingDelim=true;
private boolean isPostgres;
private boolean useBatch=false;
private static int maxCols=1000;
private String[] insert_cols = new String[maxCols];
private int[] insert_types = new int[maxCols];
private int numberOfColumns;
public long numberOfRows;
private int returnCode;
private String xml_search_path;
private Connection uploadConnection;
private DatabaseMetaData dbmd;
private PreparedStatement pst;
public TableUploader() {
// TODO Auto-generated constructor stub
}
public Connection getUploadConnection() {
return uploadConnection;
}
public void setUploadConnection(Connection uploadConnection) {
this.uploadConnection = uploadConnection;
}
public boolean isRemoveTrailingDelim() {
return removeTrailingDelim;
}
public void setRemoveTrailingDelim(boolean removeTrailingDelim) {
this.removeTrailingDelim = removeTrailingDelim;
}
public void setHeader(boolean header) {
this.header = header;
}
public String getDbpropfile() {
return dbpropfile;
}
public void setDbpropfile(String dbpropfile) {
this.dbpropfile = dbpropfile;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
if (!mode.equals("stop") && !mode.equals("exclude-field")&& !mode.equals("transaction"))
mode = "exclude-row";
this.mode = mode;
}
public String getInFormat() {
return inFormat;
}
public void setInFormat(String inFormat) {
this.inFormat = inFormat;
}
public String getTargetTable() {
return targetTable;
}
public void setTargetTable(String targetTable) {
this.targetTable = targetTable;
}
public String getSrcFile() {
return srcFile;
}
public void setSrcFile(String srcFile) {
this.srcFile = srcFile;
}
public String getDelim() {
return delim;
}
public void setDelim(String delim) {
if (delim.equals("tab"))
delim = "\t"; //Tab
if (delim.equals(""))
delim = "^"; //default Delimiter
this.delim = delim;
}
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
if(encoding==null || encoding.equals(""))
encoding="UTF-8";
this.encoding = encoding;
}
public String getInserts() {
return inserts;
}
public void setInserts(String inserts) {
if(inserts.equalsIgnoreCase("batch"))
useBatch=true;
if(inserts.equalsIgnoreCase("simple"))
useBatch=false;
this.inserts = inserts;
}
public boolean isTruncateTargetTable() {
return truncateTargetTable;
}
public void setTruncateTargetTable(boolean truncateTargetTable) {
this.truncateTargetTable = truncateTargetTable;
}
public void setTruncateTargetTable(String truncateTargetTable) {
if(truncateTargetTable!=null)
{if(truncateTargetTable.equalsIgnoreCase("true"))
this.truncateTargetTable =true;
else
this.truncateTargetTable =false;
}
else
this.truncateTargetTable =false;
}
public int getReturnCode() {
return returnCode;
}
public void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
public boolean isContinueAfterError() {
return continueAfterError;
}
public void setContinueAfterError(boolean continueAfterError) {
this.continueAfterError = continueAfterError;
}
public String getXml_search_path() {
return xml_search_path;
}
public void setXml_search_path(String xml_search_path) {
this.xml_search_path = xml_search_path;
}
public long uploadFile() throws Exception
{
String protokoll="";
long numberOfRows=0;
returnCode=0;
try {
//dbmd=uploadConnection.getMetaData();
String dbname=uploadConnection.getCatalog();
if(truncateTargetTable)
{
Statement stm=uploadConnection.createStatement();
stm.execute("delete from "+this.targetTable+";");
stm.close();
}
if(inFormat.equalsIgnoreCase("xml"))
{
numberOfRows=uploadXML();
}
else
numberOfRows=uploadCSV();
} catch (Exception e) {
returnCode=1;
throw new Exception(e);
}
return numberOfRows;
}
private long uploadXML() throws Exception
{
String feld_wert;
String errmsg="";
Document mydomres=null;
numberOfRows=0;
org.xml.sax.InputSource is;
NodeList rowlist;
mydomres = de.superx.elt.EtlUtils.buildDocumentFromXmlFile(srcFile);
if(xml_search_path==null)
{
rowlist = mydomres.getElementsByTagName("row");
}
else
{
//XPath xPath = XPathFactory.newInstance().newXPath();
File inputFile = new File(srcFile);
//XPathFactory factory = XPathFactory.newInstance();
XPathFactory factory = new net.sf.saxon.xpath.XPathFactoryImpl();
XPath xPath = factory.newXPath();
//Document doc = builder.parse(inputFile);
//doc.getDocumentElement().normalize();
rowlist=(NodeList) xPath.compile(xml_search_path).evaluate(
mydomres, XPathConstants.NODESET);
}
Node rownode;
initializeColumnSchema();
String insertHead=createPreparedStatementHead();
pst = uploadConnection.prepareStatement(insertHead);
if(useBatch)
pst.clearBatch();
int anz_rows = rowlist.getLength();
for (int zeilennr = 0; zeilennr < anz_rows; zeilennr++) {
//Schleife über jede Zeile des XML-Stroms
rownode = rowlist.item(zeilennr);
//pst.clearParameters();
for(int col=0; col < numberOfColumns;col++)
{
for (Iterator it = XMLUtils.getChildNodeIterator(rownode); it.hasNext();) {
Node fldNode = (Node) it.next();
//System.out.println(XMLUtils.getTheValue(fldNode));
if (XMLUtils.getAttribValue(fldNode,"name").equalsIgnoreCase(insert_cols[col])) {
//int p;
feld_wert="";
try{
feld_wert = XMLUtils.getTheValue(fldNode).trim();
feld_wert=StringUtils.replace(feld_wert,
"CDATASTART", "<![CDATA[");
feld_wert = StringUtils.replace(feld_wert,
"CDATAEND", "]]>");
}
catch (IllegalArgumentException e)
{
//Node ist NULL, keine Warnung notwendig
}
errmsg = feld_wert_to_pst(zeilennr, col, errmsg, feld_wert);
} //Wenn Feldname übereinstimmt
}
} //Ende der Schleife über die Spalten
if(!errmsg.equals("") && mode.equals("stop"))
{
break;
}
if(useBatch)
pst.addBatch();
else
pst.executeUpdate();
numberOfRows++;
} //Ende der Schleife über die Zeilen
if(useBatch)
pst.executeBatch();
return numberOfRows;
}
private long uploadCSV() throws Exception
{
String line;
String line2;
File outFile=null;
String protokoll="";
long numberOfRows=0;
if(isPostgres && !inserts.equalsIgnoreCase("simple") && !inserts.equalsIgnoreCase("batch"))
{
if(removeTrailingDelim)
srcFile=removeTrailingDelim(srcFile);
numberOfRows=uploadCSVinPostgres(srcFile,removeTrailingDelim);
}
else
numberOfRows=uploadCSVwithAnsiSQL(srcFile);
return numberOfRows;
}
private String removeTrailingDelim(String srcFile) throws UnsupportedEncodingException, FileNotFoundException, IOException {
String line;
File outFile;
String returnSrcFile=srcFile+".tmp";
BufferedReader in2 = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), encoding));
outFile=new File(srcFile+".tmp");
FileOutputStream out = new FileOutputStream(outFile, false);
PrintStream out2 = new PrintStream(out, true, encoding);
while ((line = in2.readLine()) != null) {
if (line.endsWith(delim))
line=line.substring(0,line.length()-delim.length());
out2.println(line);
out2.flush();
}
return returnSrcFile;
}
private long uploadCSVinPostgres(String srcFile, boolean deleteSrcFile) {
long numOfRows=0;
String copySql = "COPY " + targetTable + " FROM STDIN WITH DELIMITER '" + delim + "' NULL '' ENCODING '"+ encoding+"'";
copySql += header ? " HEADER" : "";
String srcFileContent=de.superx.elt.EtlUtils.getFileContentsWithEncoding(srcFile, encoding);
String msg="";
try {
//dbmd=uploadConnection.getMetaData();
String dbname=uploadConnection.getCatalog();
Statement stm=uploadConnection.createStatement();
int isIso=0;
ResultSet rs=stm.executeQuery("SELECT distinct 1 FROM pg_catalog.pg_database where datname='"+dbname+"' and datctype ilike '%euro%' or datctype ilike '%1252%' or datctype ilike '%8859%';");
while (rs.next()) {
if(rs.getObject(1)!=null)
isIso= Integer.parseInt(rs.getObject(1).toString());
}
rs.close();
stm.close();
Reader in4=null;
final CopyManager cpm = ((PGConnection) uploadConnection).getCopyAPI();
long anz = 0;
msg = "";
if(isIso==1)
{
String srcFileIso=srcFile+"_iso.tmp";
String srcFileContentValidIso = FileUtils.convertToIso(srcFileContent,"postgres") ;//new String(srcFileContent.getBytes("ISO-8859-1"));
de.superx.elt.EtlUtils.saveFileContentsWithEncoding(srcFileIso, srcFileContentValidIso, "iso-8859-9");
FileInputStream fis = new FileInputStream(srcFileIso);
in4 = new BufferedReader(new InputStreamReader(fis, "iso-8859-9"));
}
else
{
FileReader in3 = new FileReader(srcFile);
in4 = new BufferedReader(in3);
}
numOfRows= cpm.copyIn(copySql, in4);
numberOfRows =numOfRows;
if(deleteSrcFile)
{
File outFile=new File(srcFile);
if(outFile!=null)
outFile.delete();
}
} catch (Exception e) {
// TODO Auto-generated catch block
msg=e.toString();
}
return numOfRows;
}
private long uploadCSVwithAnsiSQL(String srcFile) throws SQLException, FileNotFoundException, IOException {
numberOfRows=0;
String text;
String text2;
String msg="";
int zeilennr=1;
int fehlerSaetze=0;
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), encoding));
initializeColumnSchema();
String insertHead=createPreparedStatementHead();
pst = uploadConnection.prepareStatement(insertHead);
if(useBatch)
pst.clearBatch();
while ((text = in.readLine()) != null) {
if (text.endsWith("\\")) {
text=text.substring(0, text.length()-1);
text2 = in.readLine();
if (text2 != null) {
text += "\n"+ text2;
while (text2.endsWith("\\")) {
text=text.substring(0, text.length()-1);
text2 = in.readLine();
if (text2 != null)
text += "\n"+text2;
}
}
}
String prepare =
createPreparedInsertStatement(zeilennr,
insertHead,
text);
if(!prepare.equals("") && mode.equals("stop"))
{
msg=prepare;
break;
}
if(useBatch)
pst.addBatch();
else
pst.executeUpdate();
numberOfRows++;
}
if(useBatch)
pst.executeBatch();
//TODO: msg
return numberOfRows;
}
private String createPreparedInsertStatement(
int line,
String insertHead,
String text)
throws SQLException {
int p;
int i=0;
int k=0;
String errmsg = "";
String feld_wert;
//pst.clearParameters();
do {
//ggf. Trennzeichen am Ende hinzufügen:
if(!text.endsWith(delim))
text+= delim;
p = text.indexOf(delim, i);
//logger.config("Type "+types[k]);
//maskierte Trennzeichen abfangen:
if(p>0 && text.substring(p-1, p).equals("\\"))
p = text.indexOf(delim, p+1);
if (p > -1 ) {
if(p==-1)
feld_wert = text.substring(i);
else
feld_wert = text.substring(i, p);
//wenn der Feldwert zufällig das Zeichen "\\n" enthält, wird es zu "\n"
if(feld_wert != null && (feld_wert.indexOf("\\\\n") >0 ))
{
feld_wert=de.memtext.util.StringUtils.replace(feld_wert, "\\\\n", "\\n");
}
//wenn der Feldwert das Zeichen "\Trennzeichen" enthält, wird der \ entfernt
if(feld_wert != null && (feld_wert.indexOf("\\"+delim) >0 ))
{
feld_wert=de.memtext.util.StringUtils.replace(feld_wert, "\\", "");
}
//wenn der Feldwert das Zeichen "\\" enthält, wird ein \ entfernt
if(feld_wert != null && (feld_wert.indexOf("\\\\") >0 ))
{
feld_wert=de.memtext.util.StringUtils.replace(feld_wert, "\\\\", "\\");
}
errmsg = feld_wert_to_pst(line,k, errmsg, feld_wert);
k++;
i = p + 1;
}
} while (p > -1);
return errmsg;
}
private String feld_wert_to_pst(int line, int col, String errmsg, String feld_wert) throws SQLException {
if( col >= numberOfColumns)
errmsg+= "Anzahl Spalten in Datei ist "+col+", aber es sollten nur "+(numberOfColumns-1)+" Spalten sein. Bitte prüfen Sie das Trennzeichen";
else
{
if (feld_wert.equals(""))
try {
pst.setNull(col + 1, insert_types[col]);
} catch (SQLException e1) {
errmsg += e1.toString();
} else {
switch (insert_types[col]) {
case Types.BIGINT :
case Types.TINYINT :
case Types.SMALLINT :
case Types.INTEGER :
try {
int myInt = (int) Integer.parseInt(feld_wert.trim());
pst.setInt(col + 1, myInt);
} catch (NumberFormatException e1) {
errmsg += e1.toString();
setFieldToNull(col, insert_types, pst);
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert,e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.FLOAT :
try {
float myFloat =
(float) Float.parseFloat(feld_wert.trim());
pst.setFloat(col + 1, myFloat);
} catch (NumberFormatException e1) {
errmsg += conversionException(line, col, feld_wert,e1.toString());
setFieldToNull(col, insert_types, pst);
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert,e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.REAL :
case Types.DOUBLE :
case Types.NUMERIC :
case Types.DECIMAL :
try {
double myDouble =
(double) Double.parseDouble(feld_wert.trim());
pst.setDouble(col + 1, myDouble);
} catch (NumberFormatException e1) {
errmsg += conversionException(line, col, feld_wert,e1.toString());
setFieldToNull(col, insert_types, pst);
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.CHAR :
case Types.VARCHAR :
default :
if(feld_wert.equals(" "))
feld_wert=""; //Leerzeichen im UNL-File wird zu Leerstring
try {
pst.setString(col + 1, feld_wert);
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert,e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.LONGVARCHAR :
ByteArrayInputStream by =
new ByteArrayInputStream(feld_wert.getBytes());
pst.setAsciiStream(
col + 1,
by,
feld_wert.length());
break;
case Types.DATE :
try {
java.util.Date datum =
DateUtils.parse(feld_wert.trim());
feld_wert = DateUtils.formatUS(datum);
//Leider ist dieser Schritt wg java.sql.Date nötig
pst.setDate(
col + 1,
java.sql.Date.valueOf(feld_wert));
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
} catch (ParseException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
catch (IllegalArgumentException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.TIME :
try {
//Time zeit = (java.sql.Time)
//DateUtils.timeParse(feld_wert);
pst.setTime(col + 1, java.sql.Time.valueOf(
feld_wert.trim()));
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
catch (IllegalArgumentException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.TIMESTAMP :
try {
java.util.Date datum =
DateUtils.dateTimeParse(feld_wert.trim());
feld_wert = DateUtils.dateTimeFormatUS(datum);
//Leider ist dieser Schritt wg java.sql.Date nötig
pst.setTimestamp(
col + 1,
java.sql.Timestamp.valueOf(
feld_wert + ".0"));
} catch (SQLException e1) {
errmsg += conversionException(line, col,feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
} catch (ParseException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
catch (IllegalArgumentException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
break;
case Types.BIT :
// Types.BOOLEAN gibt es im jdk 1.3 nicht
try {
boolean wf =
(boolean) Boolean.getBoolean(feld_wert.trim());
pst.setBoolean(col + 1, wf);
} catch (SQLException e1) {
errmsg += conversionException(line, col, feld_wert, e1.toString());
setFieldToNull(col, insert_types, pst);
}
//Boolean wird vom Informix-Treiber als OTHER (1111) erkannt
//Da aber default '' ist, klappt es trotzdem
break;
}
}
}
return errmsg;
}
private void setFieldToNull(
int k,
int[] insert_types,
PreparedStatement pst) {
if (mode.equals("exclude-field"))
try {
pst.setNull(k + 1, insert_types[k]);
} catch (SQLException e3) {
System.err.println("Invalid Field " + (k + 1) + " could not be set to null");
}
}
private String conversionException(int line,int col, String field_value, String error) {
String err_msg = "";
err_msg = "Error in line "+line+" in Column " + (col + 1) + " "+insert_cols[col]+" value "+ field_value+ ": " + error.toString() + "; ";
return err_msg;
}
private void initializeColumnSchema() throws SQLException
{
int i=0;
ResultSet rs = null;
ResultSetMetaData rsmd = null;
String tabelle=targetTable;
if (!dbmd.storesLowerCaseIdentifiers())
tabelle = tabelle.toUpperCase();
rs =dbmd.getColumns(uploadConnection.getCatalog(), null, tabelle, null);
rsmd = rs.getMetaData();
while (rs.next()) {
insert_cols[i] = rs.getObject("COLUMN_NAME").toString();
insert_types[i] = rs.getInt("DATA_TYPE");
i++;
}
numberOfColumns=i;
if(!dbmd.supportsBatchUpdates())
useBatch=false;
}
private String createPreparedStatementHead() throws SQLException
{
String sql=null;
String insert_head = "insert into " + targetTable+"(";
String insert_val="";
for (int i = 0; i < numberOfColumns; i++)
{
insert_head += insert_cols[i] + ", ";
insert_val+="?, ";
}
insert_head = insert_head.substring(0, insert_head.length() - 2);
insert_val = insert_val.substring(0, insert_val.length() - 2);
insert_head +=") values( ";
sql=insert_head + insert_val+");";
return sql;
}
public Connection getConnection(Connection myConnection,String propfile) throws Exception {
if(myConnection==null)
{
SxConnection mySxConnection = null;
mySxConnection = new SxConnection();
mySxConnection.setPropfile(propfile);
myConnection = mySxConnection.getConnection();
String db_driver = mySxConnection.m_DriverClass;
if(db_driver.equals("org.postgresql.Driver"))
isPostgres=true;
}
dbmd = myConnection.getMetaData();
return myConnection;
}
}

212
src/de/superx/elt/bin/Doquery.java

@ -1,212 +0,0 @@ @@ -1,212 +0,0 @@
/*
* 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.bin;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.StringTokenizer;
import de.superx.util.SqlStringUtils;
import de.superx.bin.SxConnection;
import de.superx.common.SuperX_el;
import de.superx.elt.QueryResultSerializer;
import de.superx.servlet.SxPools;
import de.superx.servlet.SxSQL_Server;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* doquery.java
* @
* Dieses Javaprogramm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
public class Doquery {
private static Connection myDb;
private static Statement st; // Our statement to run queries with
private static DatabaseMetaData dbmd;
// This defines the structure of the database
private static boolean done = false; // Added by CWJ to permit \q command
private static String delim = "^";
private static String header = "false";
private static String outFormat = "txt";
private static String logfile = "../conf/logging.properties";
private static String tabelle = "";
private static String dbpropfile = "../conf/db.properties";
private static SxConnection myConnection = null;
private static String db_driver;
private static String mandantenID="default";
private static String outfile = "";
private static Logger logger =
(Logger) Logger.getLogger(Doquery.class.toString());
private static String usage =
"-------------------------------------\nGebrauch: java de.superx.bin.Doquery $LOGGER_PROPERTIES $DB_PROPERTIES $sql (optional: )$outformat $DBDELIMITER $header $filename \n---------------------------------------------------";
public static int go(String args[])
throws
Exception {
if (args.length > 0) {
logfile = args[0].trim();
} else {
throw new IllegalArgumentException("Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
}
File f = new File(logfile);
if (!f.exists()) {
throw new IOException("Datei nicht gefunden: " + logfile);
}
FileInputStream ins = new FileInputStream(logfile);
LogManager MyLogManager = java.util.logging.LogManager.getLogManager();
MyLogManager.readConfiguration(ins);
logfile = MyLogManager.getProperty(".level");
logger.info("Using Loggging-Level " + logfile);
String query = "";
long numberOfRows=0;
int returnCode=0;
if (args.length > 1) {
dbpropfile = args[1].trim();
} else {
logger.severe(
"Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
if (args.length <= 2) {
logger.severe(
"Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
query=args[2].trim();
if (args.length > 3) {
outFormat = args[3].trim();
}
if (args.length > 4) {
delim = args[4].trim();
}
if (args.length > 5) {
header = args[5].trim();
}
if (args.length > 6) {
outfile = args[6].trim();
}
if (delim.equals(""))
delim = "^"; //default Delimiter
long jetzt = new java.util.Date().getTime() ;
getConnection(logger, dbpropfile);
QueryResultSerializer myQueryResultSerializer = null;
FileWriter fw;
StringWriter sw;
boolean printColname=(header.equalsIgnoreCase("true")?true:false);
if(!outfile.equals(""))
{
try {
fw = new FileWriter(outfile);
if(outFormat.equalsIgnoreCase("xml"))
fw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", myConnection, query,fw);
} catch (IOException e) {
logger.severe ("Fehler beim Erstellen der Datei "+outfile);
returnCode=1;
}
}
else
{
sw=new StringWriter();
if(outFormat.equalsIgnoreCase("xml"))
sw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", myConnection, query,sw);
}
numberOfRows=myQueryResultSerializer.unloadQueryResults("DOQUERY",outFormat,delim,printColname);
returnCode=myQueryResultSerializer.getReturnCode();
if(outfile.equals(""))
{
sw=myQueryResultSerializer.getOutputString();
System.out.println(sw.toString());
}
long erstrecht = new java.util.Date().getTime() ;
System.out.println( numberOfRows+" rows unloaded in "+(erstrecht-jetzt)/1000 +" Sec.");
System.out.println( "returnCode= "+returnCode);
myQueryResultSerializer = null;
return returnCode;
}
/*
* Display some instructions on how to run the example
*/
public static void instructions() {
System.out.println("SuperX @version@\n");
System.out.println(
"\nDieses Java-Programm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.\n");
System.out.println(
"Gebrauch:\n java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)\n");
System.exit(1);
}
public static void main(String args[]) {
int returnCode=0;
try {
returnCode=go(args);
} catch (Exception ex) {
System.err.println("Doquery Aufruf fehlgeschlagen.\n" + ex);
ex.printStackTrace();
System.exit(1);
}
System.out.println("Doquery Aufruf ausgeführt.\n" );
System.exit(returnCode);
}
public static void getConnection(Logger logger,String propFile) throws SQLException {
myConnection = new SxConnection();
myConnection.setPropfile(propFile);
logger.config("Starting Connection...");
try {
myDb = myConnection.getConnection();
st = myDb.createStatement();
//st = myDb.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
// java.sql.ResultSet.CONCUR_READ_ONLY);
//st.setFetchSize(100);
dbmd = myDb.getMetaData();
//st = myDb.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
//ResultSet.CONCUR_UPDATABLE);
} catch (Exception e) {
e.printStackTrace();
logger.severe("Keine DB-Verbindung: " + e.toString());
throw new SQLException("Keine DB-Verbindung: " + e.toString());
}
db_driver = myConnection.m_DriverClass;
}
}

192
src/de/superx/elt/bin/Dosql.java

@ -1,192 +0,0 @@ @@ -1,192 +0,0 @@
/*
* 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.bin;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import de.memtext.util.ExceptionHandler;
import de.memtext.util.PropUtils;
import de.superx.bin.SxConnection;
import de.superx.elt.EtlUtils;
import de.superx.elt.SqlExecutor;
import de.superx.elt.util.GetOpts;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* Dosql.java
* @
* Dieses Javaprogramm führt einen oder mehrere SQL-Ausdrück in einer Datei aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java dosql <Pfad zu logger-properties> <pfad zu db.properties> <Datei mit sql-Ausdrücken> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
/* Änderungen
15.4.2004 MB wenn keine Ausgabedatei und Ausgabeformat txt, alle selects von SxJdbcClient
loggen lassen
6.4.2004 MB Code static main verlegt - nach erfolgreicher Durchführung ein system.out
**/
public class Dosql {
private static Connection myDb;
private static DatabaseMetaData dbmd;
private static Statement st; // Our statement to run queries with
private static boolean done = false; // Added by CWJ to permit \q command
private static String delim = "^";
private static String header = "false";
private static String logfile = "../conf/logging.properties";
private static String tabelle = "";
private static String dbpropfile = "../conf/db.properties";
private static String outfile = "";
private static String outFormat = "txt";
private static String _dateiPfad = "";
//LogUtils logger=null;
private static Logger logger =
(Logger) Logger.getLogger(Dosql.class.toString());
//static Logger logger = Logger.getLogger(dosql.class);
private static ExceptionHandler exceptionHandler =
new ExceptionHandler(false);
private static SxConnection myConnection = null;
private static String usage =
"-------------------------------------\n"
+ "Gebrauch: java de.superx.bin.Dosql -logger=<<Pfad zu logging.properties>> -dbproperties=<<Pfad zu db.properties>> "
+ "-sqlfile:<Datei mit sql-Ausdrücken> -params:<Parameter, die in sql- oder Script-Dateien ersetzt werden; Syntax:param1=wert1|param2=wert2 etc> -outFormat:<Ausgabeformat (txt | html | xml)>(optional) -delim:<delimiter> -header:<mit Spaltenüberschriften (true | false)>(optional) -outfile:<Ausgabedatei>(optional) \n---------------------------------------------------";
/*
* Display some instructions on how to run the example
*/
public static void instructions() {
System.out.println("SuperX @version@\n");
System.out.println(
"\nDieses Javaprogramm führt ein beliebiges sql-Script mit einer oder mehr sql-Anweisungen aus");
System.out.println(
"Im Classpath muss superx@version@.jar sowie der zugehörige jdbc-Treiber sein.");
System.out.println(
"Befehl:\n java dosql <Dateipfad sql-Script> <delimiter>(optional) <Ausgabe der Feldüberschriften (optional, true oder false).");
System.out.println(
"Default:\n java dosql <Dateipfad sql-Script> <TAB> true");
System.exit(1);
}
public static void main(String args[]) {
try {
execute(args);
} catch (Exception e) {
logger.severe(
"Fehler beim sql-Script: " + _dateiPfad + " " + e.toString());
e.printStackTrace();
System.exit(1);
}
}
public static void execute(String[] args)
throws Exception {
String params = "";
GetOpts.setOpts(args);
String isdrin =
GetOpts.isAllRequiredOptionsPresent(
"-logger,-dbproperties,-sqlfile");
if (isdrin != null) {
System.err.println("Folgende Optionen fehlen: " + isdrin);
System.err.println(usage);
System.exit(1);
}
//GetOpts myOpts=new GetOpts();
if (GetOpts.isPresent("-logger"))
logfile = GetOpts.getValue("-logger");
if (GetOpts.isPresent("-dbproperties"))
dbpropfile = GetOpts.getValue("-dbproperties");
if (GetOpts.isPresent("-sqlfile"))
_dateiPfad = GetOpts.getValue("-sqlfile");
if (GetOpts.isPresent("-outFormat"))
outFormat = GetOpts.getValue("-outFormat");
if (GetOpts.isPresent("-delim"))
delim = GetOpts.getValue("-delim");
if (GetOpts.isPresent("-header"))
header = GetOpts.getValue("-header");
if (GetOpts.isPresent("-outfile"))
outfile = GetOpts.getValue("-outfile");
if (GetOpts.isPresent("-params"))
params = GetOpts.getValue("-params");
if (delim.equals(""))
delim = "^"; //default Delimiter
int returnCode=0;
File f = new File(logfile);
if (!f.exists()) {
throw new IOException("Datei nicht gefunden: " + logfile);
}
FileInputStream ins = new FileInputStream(logfile);
LogManager MyLogManager = java.util.logging.LogManager.getLogManager();
MyLogManager.readConfiguration(ins);
logfile = MyLogManager.getProperty(".level");
logger.info("Using Loggging-Level " + logfile);
File sqlScriptFile = new File(_dateiPfad);
getConnection(logger, dbpropfile);
Properties paramProperties=null;
if(!params.equals(""))
{
params=de.memtext.util.StringUtils.replace(params, "|", System.getProperty("line.separator"));
paramProperties=EtlUtils.convertStringToProperty(params);
}
SqlExecutor mySqlExecutor=new SqlExecutor("default", myConnection,sqlScriptFile,paramProperties);
if(!outfile.equals(""))
mySqlExecutor.setOutfile(outfile);
returnCode=mySqlExecutor.executeQueries();
String output=mySqlExecutor.getOutString().toString();
myConnection.close();
System.out.println(
"Dosql hat das Script " + _dateiPfad + " erfolgreich durchgeführt");
System.out.println(output);
logger.info("dosql erfolgreich beendet");
}
public static void getConnection(Logger logger,String propFile) throws SQLException {
myConnection = new SxConnection();
myConnection.setPropfile(propFile);
logger.config("Starting Connection...");
try {
myDb = myConnection.getConnection();
st = myDb.createStatement();
//st = myDb.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
// java.sql.ResultSet.CONCUR_READ_ONLY);
//st.setFetchSize(100);
dbmd = myDb.getMetaData();
//st = myDb.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
//ResultSet.CONCUR_UPDATABLE);
} catch (Exception e) {
e.printStackTrace();
logger.severe("Keine DB-Verbindung: " + e.toString());
throw new SQLException("Keine DB-Verbindung: " + e.toString());
}
}
}

70
src/de/superx/elt/bin/EtlJobExecutor.java

@ -1,70 +0,0 @@ @@ -1,70 +0,0 @@
/*
* 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.bin;
import java.sql.Connection;
import de.superx.elt.EtlActionJob;
import de.superx.elt.EtlUtils;
import de.superx.elt.util.GetOpts;
public class EtlJobExecutor {
public EtlJobExecutor() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
String usage="usage: java de.superx.elt.bin.EtlJobExecutor -dbproperties:$DB_PROPERTIES -job:abc -params:TID=16000 (optional) -outfile:Ausgabedatei (optional)" ;
GetOpts.setOpts(args);
String isdrin = GetOpts.isAllRequiredOptionsPresent("-dbproperties,-job");
if (isdrin != null) {
System.err.println(usage);
System.exit(1);
}
int returnCode=0;
String dbpropfile = GetOpts.getValue("-dbproperties");
String job = GetOpts.getValue("-job");
String params =null;
if (GetOpts.isPresent("-params"))
params=GetOpts.getValue("-params");
if(!(params==null))
params=de.memtext.util.StringUtils.replace(params, ",", EtlUtils.NEWLINE);
String outfile=null;
if (GetOpts.isPresent("-outfile"))
outfile=GetOpts.getValue("-outfile");
//System.out.println("param:"+params);
EtlActionJob myJob=new EtlActionJob(job,"",dbpropfile); //TODO:Mandantid
try {
myJob.initJob(job,params);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.err.println(myJob.getLogoutput());
System.exit(1);
}
System.out.println("Job "+ job+" initialized");
try {
returnCode= myJob.execute(outfile);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.err.println(myJob.getLogoutput());
System.exit(1);
}
System.out.println("Job "+ job+" executed in " +myJob.getDuration()+" Sec.");
System.exit(returnCode);
}
}

796
src/de/superx/elt/bin/SxTransformer.java

@ -1,796 +0,0 @@ @@ -1,796 +0,0 @@
/*
* 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.bin;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.Writer;
import java.net.URI;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.InputSource;
import de.superx.bin.SxDBUtils;
import de.superx.util.SqlStringUtils;
// ACHTUNG - PDF ERZEUGUNG WIEDER AKTIV DQ 27.12.2005!!!
/**
* @author Daniel Quathamer Projektgruppe SuperX SxTransformer.java @ Dieses
* Javaprogramm transformiert ResultSets in text, html oder xml und gibt
* das Ergebnis als Ausgabestrom für stdout oder eine Datei aus.
*
*
*
*/
public class SxTransformer {
/**
*
*/
private String head_delim1 = "";
private String head_delim2 = "\t";
private String header_delim1 = "";
private String header_delim2 = "\n";
private String fld_delim1 = "";
private String fld_delim2 = "\t";
private String row_delim1 = "";
private String row_delim2 = "\n";//we only user unix newline, even under
// DOS
private String rs_delim1 = "";
private String rs_delim2 = "";
private String delim = "\t";
private String header = "false";
private String outHeader = "";
private String outFooter = "";
public String format = "txt";
public String params = "";
public String[] XslPipeline;
public String stylesheet = "";
public PrintWriter myOutwriter;
public OutputStream myOutputStream;
public ResultSet outrs = null;
public ResultSetMetaData outrsmd = null;
public String quellstring = null;
public String outfile = "";
private File fopxconfFile=null;
public void setFopxconfFile(File fopxconfFile) {
this.fopxconfFile = fopxconfFile;
}
Logger myLogger;
String loglevel;
//PrintStream outputstream=null;
//TODO ggfs. auf Saxon umstellen
//TransletUtils.initFactory("net.sf.saxon.TransformerFactoryImpl",
// "org.apache.xalan.xsltc.trax.TransformerFactoryImpl");
//System.out.println("Using xsl processor: "
// + TransletUtils.getUsedProcessor());
public SxTransformer(Logger logger, PrintStream myStream) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with Stdout-Output.");
myOutwriter = new PrintWriter(myStream);
}
public SxTransformer(Logger logger, String myFile) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with File-Output.");
outfile = myFile;
myLogger.setLevel(Level.SEVERE);
}
public SxTransformer(Logger logger, FileWriter myFilewriter) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with File-Output.");
myOutwriter = new PrintWriter(new BufferedWriter(myFilewriter));
}
public SxTransformer(Logger logger, PrintWriter myWriter) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with StringWriter-Output.");
myOutwriter = myWriter;
}
public SxTransformer(Logger logger) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer without Stream");
}
public void printResult(String outFormat) {
//loglevel=myLogger.getRootLogger().getLevel().toString().trim();
assignDelims(outFormat);
myLogger.config("Resultset wird formatiert");
String f_wert = "";
//ResultSetMetaData rsmd = rs.getMetaData();
String zs = "";
String headZs = "";
int cols = 0;
Object o = null;
String[] lbl = null;
int[] types = new int[1255];
// de.memtext.util.MemoryUtils.printfree();
if (outrs != null) {
try {
cols = outrsmd.getColumnCount();
lbl = new String[1255];
zs = outHeader + rs_delim1;
headZs = header_delim1;
;
// Print the result column names?
for (int i = 1; i <= cols; i++) {
lbl[i] = outrsmd.getColumnLabel(i);
types[i] = outrsmd.getColumnType(i);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i] + "'>";
fld_delim2 = "</fld>";
} else {
if (i < cols)
headZs += (head_delim1 + lbl[i] + head_delim2);
else {
headZs += (head_delim1 + lbl[i] + head_delim2);
headZs += (header_delim2);
//out.newLine();
}
}
}
} catch (SQLException e1) {
myLogger.severe("Fehler beim Einlesen der Feldnamen: " + e1.toString());
e1.printStackTrace();
}
if (header.equals("true")) zs += headZs;
// try {
myOutwriter.write(zs);
myOutwriter.flush();
/*
* } catch (IOException e) { myLogger.severe("Fehler beim Ausgeben
* der Feldnamen: " + e.toString());
* }
*/
//now the results
StringBuffer line = new StringBuffer();
try {
int rowCounter = 0;
do {
line.setLength(0);
line.append(row_delim1);
for (int i = 1; i <= cols; i++) {
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i] + "'>";
fld_delim2 = "</fld>";
}
if (types[i] == Types.LONGVARCHAR) {
//Der Informix-Treiber verlangt hier getString
// statt getObject!
o = outrs.getString(i);
} else {
o = outrs.getObject(i);
}
if (outrs.wasNull())
if (i < cols)
line.append(fld_delim1 + "" + fld_delim2);
else {
line.append(fld_delim1 + "" + fld_delim2);
line.append(row_delim2);
//out.newLine();
}
else {
//vergl. de.superx.common.Maske.getCSV
f_wert = SxDBUtils.field_value(o);
if (outFormat.equals("xml") && (f_wert.indexOf("&") > -1 || f_wert.indexOf("<") > -1 || f_wert.indexOf(">") > -1))
f_wert = "<![CDATA[" + f_wert + "]]>";
//wenn der Feldwert zufällig das Trennzeichen enthält, wird es mit "\" maskiert
if (outFormat.equals("txt")) {
f_wert = SxDBUtils.prepareInformixCsv(f_wert);
if (f_wert != null && (f_wert.indexOf(fld_delim2) > -1)) f_wert = de.memtext.util.StringUtils.replace(f_wert, fld_delim2, "\\" + fld_delim2);
}
if (i < cols)
line.append(fld_delim1 + f_wert + fld_delim2);
else {
line.append(fld_delim1 + f_wert + fld_delim2);
line.append(row_delim2);
}
}
}
myOutwriter.write(line.toString());
rowCounter++;
if (rowCounter > 10000) {
de.memtext.util.MemoryUtils.printfree();
myOutwriter.flush();
rowCounter = 0;
}
} while (outrs.next()); //von while
myOutwriter.write(rs_delim2 + outFooter);
myOutwriter.flush();
outrs.close();
myOutwriter.close();
} /*
* catch (IOException e) { myLogger.severe("Fehler beim Ausgeben
* der Feldwerte: " + e.toString()); }
*/
catch (SQLException e) {
myLogger.warning("SQL-Fehler beim Ausgeben der Feldwerte: " + e.toString());
try {
myOutwriter.write(rs_delim2 + outFooter);
myOutwriter.flush();
myOutwriter.close();
outrs.close();
}
/*
* catch (IOException e1) { myLogger.severe("Fehler beim
* Ausgeben der Feldwerte: " + e1.toString()); }
*/
catch (SQLException e1) {
myLogger.warning("SQL-Fehler beim Ausgeben der Feldwerte: " + e1.toString());
}
}
}
else //wenn outrs=null
{
myOutwriter.flush();
myOutwriter.close();
}
myLogger.info("resultset printed");
}
public void transformString(String methode) throws TransformerException {
try {
javax.xml.transform.TransformerFactory tFactory = javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(stylesheet));
StringReader s1 = new StringReader(quellstring);
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, SqlStringUtils.getEncoding());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, methode);
transformer.setParameter("sx_client", format);
String result = null;
if (!params.endsWith(",")) params += ",";
StringTokenizer st = new StringTokenizer(params, ",");
for (; st.hasMoreTokens();) {
String param = st.nextToken();
if (!param.equals("")) {
String paramname = param.substring(0, param.indexOf("="));
String paramvalue = param.substring(param.indexOf("=") + 1, param.length());
transformer.setParameter(paramname, paramvalue);
}
}
transformer.transform(new javax.xml.transform.stream.StreamSource(s1), new javax.xml.transform.stream.StreamResult(myOutwriter));
} catch (Exception e) {
myLogger.severe("XSL-Transformation fehlgeschlagen: " + e.toString());
}
}
public void transformFile(String methode) throws TransformerException, Exception
{
javax.xml.transform.TransformerFactory tFactory = javax.xml.transform.TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
javax.xml.transform.Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(this.stylesheet));
//StringReader s1 = new StringReader(quellstring);
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, SqlStringUtils.getEncoding());
if (methode.equals("pdf") || methode.equals("rtf"))
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");
else
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, methode);
transformer.setParameter("sx_client", format);
transformer.setParameter("versionParam", "2.0");
// String result = null;
if (!params.endsWith(",")) params += ",";
StringTokenizer st = new StringTokenizer(params, ",");
for (; st.hasMoreTokens();) {
String param = st.nextToken();
if (!param.equals("")) {
String paramname = param.substring(0, param.indexOf("="));
String paramvalue = param.substring(param.indexOf("=") + 1, param.length());
transformer.setParameter(paramname, paramvalue);
}
}
}
public void outputString() {
BufferedWriter out = new BufferedWriter(myOutwriter);
try {
out.write(quellstring);
out.flush();
} catch (IOException e) {
myLogger.severe("Fehler beim Ausgeben des Ergebnisses: " + e.toString());
}
}
public String getResult(String outFormat) throws SQLException {
//loglevel=myLogger.getRootLogger().getLevel().toString().trim();
assignDelims(outFormat);
myLogger.config("Resultset wird formatiert");
String f_wert = "";
//ResultSetMetaData rsmd = rs.getMetaData();
int cols = outrsmd.getColumnCount();
String[] lbl = new String[255];
String zs = rs_delim1;
String headZs = header_delim1;
;
// Print the result column names?
for (int i = 1; i <= cols; i++) {
lbl[i] = outrsmd.getColumnLabel(i);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i].toLowerCase() + "'>";
fld_delim2 = "</fld>";
} else {
if (i < cols)
headZs += (head_delim1 + lbl[i] + head_delim2);
else {
headZs += (head_delim1 + lbl[i] + head_delim2);
headZs += (header_delim2);
//out.newLine();
}
}
}
if (header.equals("true")) zs += headZs;
//now the results
try {
while (outrs.next())
{
zs += (row_delim1);
for (int i = 1; i <= cols; i++) {
Object o = outrs.getObject(i);
f_wert = SxDBUtils.field_value(o);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i].toLowerCase() + "'>";
fld_delim2 = "</fld>\n";
}
if (outrs.wasNull())
if (i < cols)
zs += (fld_delim1 + "" + fld_delim2);
else {
zs += (fld_delim1 + "" + fld_delim2);
zs += (row_delim2);
//out.newLine();
}
else if (i < cols)
zs += (fld_delim1 + f_wert.trim() + fld_delim2);
else {
zs += (fld_delim1 + f_wert.trim() + fld_delim2);
zs += (row_delim2);
// out.newLine();
}
// }
// catch (IOException e)
// {
// myLogger.severe("Fehler beim Ausgeben der Feldwerte:
// "+e.toString());
//
// }
}
} //von while
zs += (rs_delim2);
} catch (Exception e) {
myLogger.severe("Fehler beim Ausgeben der Feldwerte: " + e.toString());
}
outrs.close();
return zs;
}
private void assignDelims(String outFormat) {
if (outFormat.equals("html")) {
outHeader = "<html><body>";
outFooter = "</body></html>";
rs_delim1 = "<table border='1'>\n";
rs_delim2 = "</table>";
head_delim1 = "<th>";
head_delim2 = "</th>";
header_delim1 = "<tr>";
header_delim2 = "</tr>\n";
row_delim1 = "<tr>";
row_delim2 = "</tr>";
fld_delim1 = "<td>";
fld_delim2 = "</td>";
}
if (outFormat.equals("xml")) {
outHeader = "<?xml version='1.0' encoding='" + SqlStringUtils.getEncoding() + "'?>";
outFooter = "";
rs_delim1 = "<rs>\n";
rs_delim2 = "</rs>";
head_delim1 = "";
head_delim2 = "";
header_delim1 = "";
header_delim2 = "";
row_delim1 = "<row>\n";
row_delim2 = "</row>\n";
fld_delim1 = "";
fld_delim2 = "";
}
}
/**
* @return
*/
public String getDelim() {
return delim;
}
/**
* @return
*/
public String getFld_delim1() {
return fld_delim1;
}
/**
* @return
*/
public String getFld_delim2() {
return fld_delim2;
}
/**
* @return
*/
public String getFormat() {
return format;
}
/**
* @return
*/
public String getHead_delim1() {
return head_delim1;
}
/**
* @return
*/
public String getHead_delim2() {
return head_delim2;
}
/**
* @return
*/
public String getHeader() {
return header;
}
/**
* @return
*/
public String getHeader_delim1() {
return header_delim1;
}
/**
* @return
*/
public String getHeader_delim2() {
return header_delim2;
}
/**
* @return
*/
public ResultSet getOutrs() {
return outrs;
}
/**
* @return
*/
public ResultSetMetaData getOutrsmd() {
return outrsmd;
}
/**
* @return
*/
public String getRow_delim1() {
return row_delim1;
}
/**
* @return
*/
public String getRow_delim2() {
return row_delim2;
}
/**
* @return
*/
public String getRs_delim1() {
return rs_delim1;
}
/**
* @return
*/
public String getRs_delim2() {
return rs_delim2;
}
/**
* @return
*/
public String[] getXslPipeline() {
return XslPipeline;
}
/**
* @param string
*/
public void setDelim(String string) {
delim = string;
fld_delim1 = "";
fld_delim2 = string;
head_delim2 = string;
}
/**
* @param string
*/
public void setFld_delim1(String string) {
fld_delim1 = string;
}
/**
* @param string
*/
public void setFld_delim2(String string) {
fld_delim2 = string;
}
/**
* @param string
*/
public void setFormat(String string) {
format = string;
}
/**
* @param string
*/
public void setHead_delim1(String string) {
head_delim1 = string;
}
/**
* @param string
*/
public void setHead_delim2(String string) {
head_delim2 = string;
}
/**
* @param string
*/
public void setHeader(String string) {
header = string;
}
/**
* @param string
*/
public void setHeader_delim1(String string) {
header_delim1 = string;
}
/**
* @param string
*/
public void setHeader_delim2(String string) {
header_delim2 = string;
}
/**
* @param set
*/
public void setOutrs(ResultSet set) {
outrs = set;
}
/**
* @param data
*/
public void setOutrsmd(ResultSetMetaData data) {
outrsmd = data;
}
/**
* @param string
*/
public void setRow_delim1(String string) {
row_delim1 = string;
}
/**
* @param string
*/
public void setRow_delim2(String string) {
row_delim2 = string;
}
/**
* @param string
*/
public void setRs_delim1(String string) {
rs_delim1 = string;
}
/**
* @param string
*/
public void setRs_delim2(String string) {
rs_delim2 = string;
}
/**
* @param strings
*/
public void setXslPipeline(String[] strings) {
XslPipeline = strings;
}
/**
* @return
*/
public String getOutFooter() {
return outFooter;
}
/**
* @return
*/
public String getOutHeader() {
return outHeader;
}
/**
* @param string
*/
public void setOutFooter(String string) {
outFooter = string;
}
/**
* @param string
*/
public void setOutHeader(String string) {
outHeader = string;
}
/**
* @return
*/
public String getParams() {
return params;
}
/**
* @param string
*/
public void setParams(String string) {
params = string;
}
//-- nur zum Testen --//
public static void main(String[] args) throws Exception {
Logger log = Logger.getLogger(SxTransformer.class.getName());
String rootDir = "/home/superx/tmp/";
String quelle = rootDir + "Buchungsbericht_ids_Test.xml";
String zielFile = rootDir + "testneu.pdf";
String sxlSheet = "/home/superx/dev/edustore/webserver/tomcat/webapps/superx/xml/tabelle_fo_pdf.xsl";
SxTransformer sxTrans = new SxTransformer(log, zielFile);
sxTrans.quellstring = quelle;
sxTrans.outfile = zielFile;
sxTrans.stylesheet = sxlSheet;
sxTrans.transformFile("pdf");
}//Ende der Methode
public class ClasspathUriResolver implements URIResolver {
public Source resolve(String href, String base) throws TransformerException {
Source source = null;
InputStream inputStream = ClassLoader.getSystemResourceAsStream(href);
if (inputStream != null) {
source = new StreamSource(inputStream);
}
return source;
}
}
}//Ende der Klasse

214
src/de/superx/elt/bin/UnloadRecords.java

@ -1,214 +0,0 @@ @@ -1,214 +0,0 @@
/*
* 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.bin;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.StringTokenizer;
import de.superx.util.SqlStringUtils;
import de.superx.bin.SxConnection;
import de.superx.common.SuperX_el;
import de.superx.elt.QueryResultSerializer;
import de.superx.servlet.SxPools;
import de.superx.servlet.SxSQL_Server;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* doquery.java
* @
* Dieses Javaprogramm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
//Änderungen
/*
* 16.4.04 Wenn kein outfile angegeben, werden alle select results auf die Console geloggt
* 19.1.2006 dq: Unload großer Tabellen unter Postgres ermöglicht.
*/
public class UnloadRecords {
private static Connection myDb;
private static Statement st; // Our statement to run queries with
private static DatabaseMetaData dbmd;
// This defines the structure of the database
private static boolean done = false; // Added by CWJ to permit \q command
private static String delim = "^";
private static String header = "false";
private static String outFormat = "txt";
private static String logfile = "../conf/logging.properties";
private static String tabelle = "";
private static String dbpropfile = "../conf/db.properties";
private static SxConnection myConnection = null;
private static String db_driver;
private static String mandantenID="default";
private static String outfile = "";
private static Logger logger =
(Logger) Logger.getLogger(Doquery.class.toString());
private static String usage =
"-------------------------------------\nGebrauch: java de.superx.bin.UnloadRecords $LOGGER_PROPERTIES $DB_PROPERTIES $sql (optional: )$outformat $DBDELIMITER $header $filename \n---------------------------------------------------";
public static int go(String args[])
throws
Exception {
if (args.length > 0) {
logfile = args[0].trim();
} else {
throw new IllegalArgumentException("Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
}
File f = new File(logfile);
if (!f.exists()) {
throw new IOException("Datei nicht gefunden: " + logfile);
}
FileInputStream ins = new FileInputStream(logfile);
LogManager MyLogManager = java.util.logging.LogManager.getLogManager();
MyLogManager.readConfiguration(ins);
logfile = MyLogManager.getProperty(".level");
logger.info("Using Loggging-Level " + logfile);
String query = "";
long numberOfRows=0;
int returnCode=0;
if (args.length > 1) {
dbpropfile = args[1].trim();
} else {
logger.severe(
"Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
if (args.length <= 2) {
logger.severe(
"Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
query=args[2].trim();
if (args.length > 3) {
outFormat = args[3].trim();
}
if (args.length > 4) {
delim = args[4].trim();
}
if (args.length > 5) {
header = args[5].trim();
}
if (args.length > 6) {
outfile = args[6].trim();
}
if (delim.equals(""))
delim = "^"; //default Delimiter
boolean printColname=(header.equalsIgnoreCase("true")?true:false);
FileWriter fw;
StringWriter sw;
long jetzt = new java.util.Date().getTime() ;
getConnection(logger, dbpropfile);
QueryResultSerializer myQueryResultSerializer = null;
if(!outfile.equals(""))
{
try {
fw = new FileWriter(outfile);
if(outFormat.equalsIgnoreCase("xml"))
fw.write("<?xml version=\"1.0\" encoding=\""+SqlStringUtils.getEncoding()+"\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", myConnection, query,fw);
} catch (IOException e) {
logger.severe ("Fehler beim Erstellen der Datei "+outfile);
returnCode=1;
}
}
else
{
sw=new StringWriter();
if(outFormat.equalsIgnoreCase("xml"))
sw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
myQueryResultSerializer=new QueryResultSerializer("default", myConnection, query,sw);
}
numberOfRows=myQueryResultSerializer.unloadQueryResults("DOQUERY",outFormat,delim,printColname);
returnCode=myQueryResultSerializer.getReturnCode();
if(outfile.equals(""))
{
sw=myQueryResultSerializer.getOutputString();
System.out.println(sw.toString());
}
long erstrecht = new java.util.Date().getTime() ;
System.out.println( numberOfRows+" rows unloaded in "+(erstrecht-jetzt)/1000 +" Sec.");
System.out.println( "returnCode= "+returnCode);
myQueryResultSerializer = null;
return returnCode;
}
/*
* Display some instructions on how to run the example
*/
public static void instructions() {
System.out.println("SuperX @version@\n");
System.out.println(
"\nDieses Java-Programm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.\n");
System.out.println(
"Gebrauch:\n java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)\n");
System.exit(1);
}
public static void main(String args[]) {
int returnCode=0;
try {
returnCode=go(args);
} catch (Exception ex) {
System.err.println("Doquery Aufruf fehlgeschlagen.\n" + ex);
ex.printStackTrace();
System.exit(1);
}
System.out.println("Doquery Aufruf ausgeführt.\n" );
System.exit(returnCode);
}
public static void getConnection(Logger logger,String propFile) throws SQLException {
myConnection = new SxConnection();
myConnection.setPropfile(propFile);
logger.config("Starting Connection...");
try {
myDb = myConnection.getConnection();
st = myDb.createStatement();
//st = myDb.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
// java.sql.ResultSet.CONCUR_READ_ONLY);
//st.setFetchSize(100);
dbmd = myDb.getMetaData();
//st = myDb.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
//ResultSet.CONCUR_UPDATABLE);
} catch (Exception e) {
e.printStackTrace();
logger.severe("Keine DB-Verbindung: " + e.toString());
throw new SQLException("Keine DB-Verbindung: " + e.toString());
}
db_driver = myConnection.m_DriverClass;
}
}

94
src/de/superx/elt/bin/UploadRecords.java

@ -1,94 +0,0 @@ @@ -1,94 +0,0 @@
/*
* 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.bin;
import de.superx.elt.TableUploader;
import de.superx.elt.util.GetOpts;
/*
* @author Daniel Quathamer Projektgruppe SuperX
* upload_records.java
* Dieses Javaprogramm lädt Inhalte einer Datei in eine Tabelle hoch")
* DQ 5.1.2006 Upload vom XML-Dateien möglich
*
*/
public class UploadRecords {
private static String usage =
"-------------------------------------\n"
+ "Gebrauch: java de.superx.bin.UploadRecords \n-dbproperties:<Pfad zu db.properties> \n"
+ "-table:<Tabellenname> \n-unl:<Dateipfad Quelldatei>(optional, default ist Tabellenname.unl) \n-delim:<delimiter>(optional, default ist ^) \n-header:<true|false>(optional, mit Feldüberschriften, default ist false)\n"
+ "-mode:<stop|exclude-row>(optional, default is stop) #Bei Fehlerhaften Daten kann das Hochladen gestoppt werden, oder der Datensatz wird übersprungen"
+ "\n-inserts:<false|simple|batch>(optional, default is false) #Bei -inserts:simple und batch werden Die Rohdaten in Insert-sql-Statements übersetzt (nur für Debugging-Zwecke, sehr langsam. Der Modus exclude-field ist darüberhinaus nicht anwendbar)"
+ "\n-encoding:<utf8,ISO-8859-1, default ist System.file.encoding>"
+ "\n---------------------------------------------------";
public static void main(String args[]) {
try {
GetOpts.setOpts(args);
String isdrin =
GetOpts.isAllRequiredOptionsPresent("-dbproperties,-table,-unl");
if (isdrin != null) {
System.err.println("Folgende Optionen fehlen: " + isdrin);
System.err.println(usage);
System.exit(1);
}
TableUploader myUploader=new TableUploader();
//GetOpts myOpts=new GetOpts();
if (GetOpts.isPresent("-dbproperties"))
myUploader.setDbpropfile(GetOpts.getValue("-dbproperties"));
if (GetOpts.isPresent("-informat"))
myUploader.setInFormat(GetOpts.getValue("-informat"));
if (GetOpts.isPresent("-table"))
myUploader.setTargetTable( GetOpts.getValue("-table"));
if (GetOpts.isPresent("-unl"))
myUploader.setSrcFile(GetOpts.getValue("-unl"));
else
myUploader.setSrcFile(myUploader.getTargetTable() + ".unl");
if (GetOpts.isPresent("-header"))
myUploader.setHeader(GetOpts.getValue("-header").equalsIgnoreCase("true")?true:false);
if (GetOpts.isPresent("-delim"))
myUploader.setDelim(GetOpts.getValue("-delim"));
if (GetOpts.isPresent("-encoding"))
{
String encodingParam=GetOpts.getValue("-encoding");
if(encodingParam != null && !encodingParam.equals("") )
myUploader.setEncoding(encodingParam);
}
else
myUploader.setEncoding(System.getProperty("file.encoding"));
if (GetOpts.isPresent("-mode")) {
myUploader.setMode(GetOpts.getValue("-mode").toLowerCase());
}
if (GetOpts.isPresent("-inserts"))
myUploader.setInserts(GetOpts.getValue("-inserts"));
long jetzt = new java.util.Date().getTime() ;
long numberOfRows=0;
myUploader.setUploadConnection(myUploader.getConnection(null,myUploader.getDbpropfile()));
numberOfRows=myUploader.uploadFile();
long erstrecht = new java.util.Date().getTime() ;
System.out.println(numberOfRows+" lines loaded");
System.out.println("File "+myUploader.getSrcFile() +" uploaded, returnCode="+myUploader.getReturnCode());
myUploader=null;
//if(protokoll.equals(""))
// protokoll= " in "+(erstrecht-jetzt)/1000 +" Sec.";
//System.out.println(protokoll);
} catch (Exception ex) {
System.err.println("Upload fehlgeschlagen: " + ex);
System.exit(1);
}
}
}

98
src/de/superx/elt/util/FileUtils.java

@ -1,98 +0,0 @@ @@ -1,98 +0,0 @@
package de.superx.elt.util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
public class FileUtils {
/*
* Liest eine Datei mit vorgegebenem Encoding ein in einen String.
* Wenn Datei nicht existiert, wird NULL zurückgegeben,
* Wenn sie leer ist, kommt Leerstring zurück
* @author Quathamer
* @param filePath
* @param encoding (Default ist utf-8)
*/
public static String getFileContentsWithEncoding(String filePath, String encoding) {
File f = new File(filePath);
if (!f.exists()) {
System.out.println("Fehler: Datei " + filePath + " existiert nicht.");
return null;
}
String fileContents = "";
if (encoding == null || encoding.trim().equals("")) {
encoding = System.getProperty("file.encoding");
}
try {
// --- IputStream und OutputStream generieren ---//
FileInputStream fis = new FileInputStream(f);
// Wenn Quelldatei Unicode, dann speziellen Reader nutzen
BufferedReader in;
//BufferedReader ist schneller bei großen Dateien
in = new BufferedReader(new InputStreamReader(fis, encoding));
// --- Output-Stream der temporären Datei erzeugen ---//
StringWriter out = new StringWriter();
// --- Verarbeiten der Datei ---//
String text;
text = in.readLine();
while (text != null) { // Datei nicht leer
out.write(text);
out.write(System.getProperty("line.separator"));
text = in.readLine();
}
if (!(out == null)) {
fileContents = out.toString();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileContents;
}
public static void saveFileContentsWithEncoding(String filename, String contents, String encoding) throws
FileNotFoundException,
IOException
{
File f = new File(filename);
BufferedReader in;
BufferedWriter out;
//Default encoding ist utf-8
if (encoding == null) encoding = System.getProperty("file.encoding");
// --- Output-Stream der temporären Datei erzeugen ---//
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), encoding));
out.write(contents);
out.close();
}//Ende der Methode
public static String convertToIso(String inp, String dbsystem) throws java.io.UnsupportedEncodingException
{
String outp = new String(inp.getBytes("ISO-8859-1"));
if (dbsystem.equalsIgnoreCase("postgres")) {
outp = outp.replaceAll("´", " ");
}
return outp;
}
}

155
src/de/superx/elt/util/GetOpts.java

@ -1,155 +0,0 @@ @@ -1,155 +0,0 @@
package de.superx.elt.util;
import java.util.StringTokenizer;
/**
* Original von de.memtext.util.GetOpts,
* für Abwärtskompatibilität mit Kern 4.9/BI 2021.06
*
*/
public class GetOpts {
private static String[] arguments = null;
//don't instantiate
private GetOpts() {
}
/**
* If you pass the arguments you want to analyse to this static helper class
* using setOpts, you can later use the short form of the methods e.g.
* isPresent(String option) without having to pass the arguments again.
*
* @param args
*/
public static void setOpts(String args[]) {
arguments = args;
}
/**
* checks if the arguments passed before by setOpts contain the given option
*
* @param String
* option
* @return true if arguments contain the option, i.e. one String which
* starts with the option-String
*/
public static boolean isPresent(String option) {
if (arguments == null)
throw new IllegalStateException(
"must either use setOpts before or call the long version of this method");
return isPresent(arguments, option);
}
/**
* checks if the arguments contain the given option
*
* @param args
* @param String
* option
* @return true if arguments contain the option, i.e. one String which
* starts with the option-String
*/
public static boolean isPresent(String args[], String option) {
boolean result = false;
for (int i = 0; i < args.length; i++)
if (args[i] != null && args[i].startsWith(option))
result = true;
return result;
}
/**
* Gets a named option from the arguments passed before with setOps. E.g.
* getOpt("--log") would return the "--log:true" in the arguments
*
* @param option -
* name/start of the option
* @return String whole option
*/
public static String getOpt(String option) {
if (arguments == null)
throw new IllegalStateException(
"must either use setOpts before or call the long version of this method");
return getOpt(option, arguments);
}
/**
* Gets a named option from the arguments. E.g. getOpt("--log") would return
* the "--log:true" in the arguments
*
* @param option -
* name/start of the option
* @return String whole option
*/
public static String getOpt(String option, String args[]) {
if (args == null)
throw new IllegalStateException("args must not be null");
String result = null;
for (int i = 0; i < args.length; i++)
if (args[i].startsWith(option))
result = args[i];
if (result == null)
throw new RuntimeException("Option " + option + " not found!");
return result;
}
/**
* Gets the value of an option from the arguments passed before with setOpts
* if for example, you ask getValue("--log:") and the arguments passed
* before with setOpts contain a String "--log:true") "true" is returned
*
* @param String
* option
* @return String value of the option
*/
public static String getValue(String option) {
if (arguments == null)
throw new IllegalStateException(
"must either use setOpts before or call the long version of this method");
return getValue(option, arguments);
}
/**
* Gets the value of an option, if for example, you ask getValue("--log:")
* and the arguments passed before with setOpts contain a String
* "--log:true") "true" is returned
*
* @param String
* option
* @return String value of the option
*/
public static String getValue(String option, String args[]) {
String result = "";
String raw = getOpt(option, args);
int pos = option.length();
if (raw.charAt(pos) == ':')
pos++;
result = raw.substring(pos, raw.length());
return result;
}
/**
* Prüft, ob alle notwendigen Optionen angegeben sind, z.B. String
* "-loggingProperties:,-dbProperties" übergeben, die beiden müssen dabei
* sein
*
* @param options
* z.B. "-loggingProperties:,-dbProperties,..."
* @return null - alles OK, ansonsten String mit den fehlenden Optionen
*/
public static String isAllRequiredOptionsPresent(String options) {
String result = null;
StringTokenizer st = new StringTokenizer(options, ",");
for (; st.hasMoreTokens();) {
String optionName = st.nextToken();
if (!isPresent(optionName)) {
if (result == null)
result = optionName;
else
result += "," + optionName;
}
}
return result;
}
}

220
src/de/superx/elt/util/GetOptsBackport.java

@ -1,220 +0,0 @@ @@ -1,220 +0,0 @@
package de.superx.elt.util;
/**
* Class to analyze arguments passed to Java class
* Makes ETL compatible to BI 2021.06 and higher
*/
public class GetOptsBackport{
public enum Options{
opt_logger("-logger"),
opt_dbprops("-dbproperties"),
opt_table("-table"),
opt_outFormat("-outFormat"),
opt_outFile("-outfile"),
opt_outfileAttribute("-outfileattribute"),
opt_cancel("-cancel"),
opt_sql("-sqlfile"),
opt_sqlAttribute("-sqlattribute"),
opt_delim("-delim"),
opt_header("-header"),
opt_params("-params"),
opt_param("-param"),
opt_in("-in"),
opt_inFormat("-informat"),
opt_out("-out"),
opt_xsl("-xsl"),
opt_xslPfad("-xslpfad"),
opt_fopxconf("-fopxconf"),
opt_user("-user"),
opt_tid("-tid"),
opt_mandID("-mandantenid"),
opt_locale("-locale"),
opt_simpPars("-simpleParser"),
opt_webinf("-web_inf_pfad"),
opt_module("-module_pfad"),
opt_jobUniqueName("-job_uniquename"),
opt_uploadpath("-path_to_uploadfile"),
opt_method("-method"),
opt_xml("-xml"),
opt_xmlconfig("-xmlconfig"),
opt_db("-database"),
opt_version("-version"),
opt_unl("-unl"),
opt_unlParams("-unload_params"),
opt_jrxml("-jrxml"),
opt_jasper("-jasper"),
opt_jrPrint("-jrprint"),
opt_ignorePagination("-ignore_pagination"),
opt_idescr("-i_descr"),
opt_odescr("-o_descr"),
opt_element("-element"),
opt_function("-function"),
opt_mode("-mode"),
opt_inserts("-inserts"),
opt_encoding("-encoding"),
opt_hsnr("-hsnr"),
opt_noDelete("-nodelete"),
opt_pause("-pause"),
opt_jahr("-jahr"),
opt_datentyp("-datentyp"),
opt_runs("-runs"),
opt_checkval("-checkval"),
opt_url("-url"),
opt_setname("-setname"),
opt_kernTabellenFreischalten("-kern_tabellen_freischalten"),
opt_noguiVar0("-nogui"), opt_noguiVar1("-no-gui"), opt_noguiVar2("--no-gui"),
opt_job("-job");
private String value;
private Options(String value) {
this.value = value;
}
public String stringValue() {
return value;
}
}
private static String[] arguments = null;
private GetOptsBackport(){} //Do not instatiate
/**
* If you pass the arguments you want to analyse to this static helper class
* using setOpts, you can later use the short form of the methods e.g.
* isPresent(String option) without having to pass the arguments again.
*
* @param args
*/
public static void setOpts(String args[]) {
arguments = args;
}
/**
* checks if the arguments passed before by setOpts contain the given option
*
* @param Options
* option
* @return true if arguments contain the option, i.e. one String which
* starts with the option-String
*/
public static boolean isPresent(Options option){
if(arguments == null){
throw new IllegalStateException("must either call setOpts() before or call the long version of this method");
}
return isPresent(arguments, option);
}
/**
* checks if the arguments contain the given option
*
* @param args
* @param Options
* option
* @return true if arguments contain the option, i.e. one String which
* starts with the option-String
*/
public static boolean isPresent(String args[], Options option){
boolean result = false;
for(int i = 0; i < args.length; i++){
if (args[i] != null && args[i].toLowerCase().startsWith(option.stringValue())){
result = true;
}
}
return result;
}
/**
* Gets a named option from the arguments passed before with setOps. E.g.
* getOpt("--log") would return the "--log:true" in the arguments
*
* @param Options
* option
* @return String option and value
*/
public static String getOpt(Options option){
if (arguments == null){
throw new IllegalStateException("must either call setOpts() before or call the long version of this method");
}
return getOpt(arguments, option);
}
/**
* Gets a named option from the arguments. E.g. getOpt("--log") would return
* the "--log:true" in the arguments
*
* @param Options
* option
* @return String option and value
*/
public static String getOpt(String args[], Options option){
String result = null;
for(int i=0; i < args.length; i++){
if(args[i].toLowerCase().startsWith(option.stringValue())){
result = args[i];
}
}
return result;
}
/**
* Gets the value of an option from the arguments passed before with setOpts
* if for example, you ask getValue("--log:") and the arguments passed
* before with setOpts contain a String "--log:true") "true" is returned
*
* @param Options
* option
* @return String value of the option
*/
public static String getValue(Options option){
if (arguments == null){
throw new IllegalStateException("must either call setOpts() before or call the long version of this method");
}
return getValue(arguments, option);
}
/**
* Gets the value of an option, if for example, you ask getValue("--log:")
* and the arguments passed before with setOpts contain a String
* "--log:true") "true" is returned
*
* @param Options
* option
* @return String value of the option
*/
public static String getValue(String args[], Options option) {
String value = null, temp = getOpt(args, option);
int pos = option.stringValue().length();
if(temp.charAt(pos) == ':') {
pos++;
}
value = temp.substring(pos);
return value;
}
/**
* Prüft, ob alle notwendigen Optionen angegeben sind.
*
* @param Options[]
* opts, ein Array mit Optionen die überprüft werden sollen
* @return null - alles OK, ansonsten String mit den fehlenden Optionen
*/
public static String isAllRequiredOptionsPresent(Options[] opts){
String missingOpts = null;
for (Options o : opts){
if(!isPresent(o)){
if(missingOpts == null){
missingOpts = o.stringValue()+", ";
}else{
missingOpts += o.stringValue()+", ";
}
}
}
return missingOpts;
}
}

134
src/de/superx/rest/JobEtlXml.java

@ -0,0 +1,134 @@ @@ -0,0 +1,134 @@
/*
* 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.rest;
import jakarta.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.xml.transform.TransformerConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import de.memtext.util.DateUtils;
import de.superx.common.SxUser;
import de.superx.etl.EtlActionJob;
import de.superx.etl.EtlUtils;
import de.superx.servlet.SuperXManager;
import de.superx.util.SqlStringUtils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.nio.charset.StandardCharsets;
import java.sql.SQLException;
@RestController
@RequestMapping("/api/jobetlxml")
public class JobEtlXml {
private static Logger logger = LoggerFactory.getLogger(Cache.class);
HttpServletRequest request;
//TODO: mehrere params
@RequestMapping(path = "/view/{jobUniquename}", method = RequestMethod.GET,
produces=MediaType.APPLICATION_XML_VALUE
//produces={"text/xml"}
)
public ResponseEntity<String> printXml(@Context HttpServletRequest httpRequest,
@PathVariable("jobUniquename") String jobUniquename,
@RequestParam("jobParamName") String jobParamName,
@RequestParam(value = "param") String param
) throws Exception{
this.request=httpRequest;
if(!SqlStringUtils.checkValidKeyEntry(jobUniquename))
throw new Exception("Invalid job "+jobUniquename);
if(!SqlStringUtils.checkValidKeyEntry(jobParamName))
throw new Exception("Invalid jobParamName "+jobParamName);
if(!SqlStringUtils.checkValidKeyEntry(param))
throw new Exception("Invalid param "+param);
String returntext = getJobEtlXml(jobUniquename,jobParamName, param );
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(new MediaType("text", "xml", StandardCharsets.UTF_8));
ResponseEntity<String> myResponse=new ResponseEntity<String>(returntext,httpHeaders,200);
return myResponse;
}
private String getJobEtlXml(String jobUniquename,
String jobParamName,
String param
) {
String returntext;
SxUser user = (SxUser) request.getSession().getAttribute("user");
System.out.println("JOB"+jobUniquename + " mit param "+jobParamName);
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
int returnCode=0;
EtlActionJob myJob=new EtlActionJob(jobUniquename); //TODO:Mandantid
try {
myJob.initJob("etl",jobUniquename,jobParamName+"="+param);
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
System.out.println("Job "+ jobUniquename+" initialized");
try {
returnCode= myJob.execute("");
returntext=myJob.getSw().toString();
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
}
return returntext;
}
}

213
src/de/superx/sxrest/JobEtlXml.java

@ -1,213 +0,0 @@ @@ -1,213 +0,0 @@
/*
* 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.sxrest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import de.memtext.util.DateUtils;
import de.superx.common.SxUser;
import de.superx.elt.EtlActionJob;
import de.superx.elt.EtlUtils;
import de.superx.servlet.SuperXManager;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
@Path("/jobetlxml/get/{jobUniquename}/{jobParamName}")
public class JobEtlXml {
@Context
Request request;
@GET
@Path("/view/{param}")
@Produces(MediaType.APPLICATION_XML)
public Document printXml(@PathParam("jobUniquename") String jobUniquename,
@PathParam("jobParamName") String jobParamName,
@PathParam("param") String param,
@Context HttpServletRequest request) {
String returntext="";
returntext = getJobEtlXml(jobUniquename,jobParamName, param, request);
return de.memtext.util.XMLUtils.buildDocumentFromString(returntext, false);
}
private String getJobEtlXml(String jobUniquename,
String jobParamName,
String param,
HttpServletRequest request) {
String returntext;
SxUser user = (SxUser) request.getSession().getAttribute("user");
//TODO: valide Einträge prüfen:
//ebenso param
System.out.println("JOB"+jobUniquename + " mit param "+jobParamName);
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
int returnCode=0;
EtlActionJob myJob=new EtlActionJob(jobUniquename); //TODO:Mandantid
try {
myJob.initJob(jobUniquename,jobParamName+"="+param);
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
System.out.println("Job "+ jobUniquename+" initialized");
try {
returnCode= myJob.execute("");
returntext=myJob.getSw().toString();
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
}
return returntext;
}
@GET
@Path("/download/{param}")
@Produces(MediaType.APPLICATION_XML)
public String createDownloadXml(
@PathParam("jobUniquename") String jobUniquename,
@PathParam("jobParamName") String jobParamName,
@PathParam("param") String param,
@Context HttpServletRequest request) {
String returntext="";
returntext = getJobEtlXml(jobUniquename,jobParamName,param, request);
return returntext;
//return de.memtext.util.XMLUtils.buildDocumentFromString(returntext, false);
}
/* Aktuell noch nicht genutzt: */
@GET
@Path("/saveget/{params}")
@Produces(MediaType.TEXT_PLAIN)
public String saveGetXml(@QueryParam("param") String tid,
@QueryParam("Inhalt") String src,
@Context HttpServletRequest request) {
String returntext="";
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
returntext="tid="+tid+"-src="+src;
}
return returntext;
}
/* Aktuell noch nicht genutzt: */
@POST
@Path("/save")
@Consumes("application/x-www-form-urlencoded")
//@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public String saveXml(@FormParam("tid") String tid,
@FormParam("Inhalt") String src,
@Context HttpServletRequest request) {
String returntext="";
String jobuniquename="sx_select_mask";
int returnCode=0;
tid="16000";
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
String searchString="/etlAction[@name=\""+jobuniquename+"\"]/unload[@name=\"unload_maskeninfo\"]/rs/row/fld[@name=\"tid\"]";
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
try {
if(de.superx.elt.EtlUtils.isNodeValueInXml(src,searchString,tid,jobuniquename))
{
String job="sx_insert_mask";
returntext="TID="+tid;
String params="TID="+tid;
File temp;
temp = File.createTempFile("myTempFile", ".xml");
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
bw.write(src);
bw.close();
params+=EtlUtils.NEWLINE+"PATH_TO_INPUTFILE="+temp.getAbsolutePath();
params+=EtlUtils.NEWLINE+"FORMAT=XML";
EtlActionJob myJob=new EtlActionJob(job); //TODO:Mandantid
myJob.initJob(job,params);
returnCode= myJob.execute("");
returntext=myJob.getSw().toString();
}
else
returntext="Übergebene TID "+tid+" entspricht nicht der XML-Datei ";
} catch (Exception e) {
returntext=e.toString();
e.printStackTrace();
}
}
return returntext;
}
}

47
src/de/superx/sxrest/JobExecutor.java

@ -1,47 +0,0 @@ @@ -1,47 +0,0 @@
package de.superx.sxrest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import de.memtext.util.DateUtils;
import de.superx.common.SxUser;
import de.superx.elt.EtlActionJob;
import de.superx.servlet.SuperXManager;
@Path("/execute")
public class JobExecutor {
@Context
Request request;
@GET
@Path("/{param}")
@Produces(MediaType.TEXT_PLAIN)
public String printLogs(@PathParam("param") String job, @Context HttpServletRequest request) {
String returntext = "";
SxUser user = (SxUser) request.getSession().getAttribute("user");
if (user == null || !user.isAdmin()) {
returntext = "Fehlende Rechte";
} else {
EtlActionJob myJob = new EtlActionJob(job, "", "");
try {
myJob.execute();
} catch (Exception e) {
e.printStackTrace();
returntext = "Fehler " + e;
}
}
return returntext;
}
}

81
src/de/superx/sxrest/LaunchUpgrade.java

@ -1,81 +0,0 @@ @@ -1,81 +0,0 @@
/*
* 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.sxrest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import de.memtext.util.DateUtils;
import de.superx.common.SxUser;
import de.superx.elt.EtlActionJob;
import de.superx.elt.EtlUtils;
import de.superx.servlet.SuperXManager;
import javax.servlet.http.HttpServletRequest;
@Path("/launchupgrade")
public class LaunchUpgrade {
@Context
Request request;
@GET
@Path("/{param}")
@Produces(MediaType.TEXT_PLAIN)
public String printXml(@PathParam("param") String componentName,@Context HttpServletRequest request) {
String jobOutput="";
String jobLog="";
int returnCode=0;
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
jobLog+="Fehlende Rechte";
returnCode=1;
}
else
{
String job=componentName+"_upgrade";
String params=componentName.toUpperCase()+"_PFAD="+SuperXManager.getWEB_INFPfad()+EtlUtils.PATHSEP+"conf"+EtlUtils.PATHSEP+"edustore"+EtlUtils.PATHSEP+"db"+EtlUtils.PATHSEP+"module"+EtlUtils.PATHSEP+componentName;
EtlActionJob myJob=new EtlActionJob(job); //TODO:Mandantid
try {
myJob.initJob(job,params);
} catch (Exception e) {
// TODO Auto-generated catch block
returnCode=1;
jobLog+=myJob.getActionLog().toString();
jobLog+=e.toString();
jobLog+=myJob.getLogoutput();
}
try {
returnCode= myJob.execute("");
jobOutput+=myJob.getSw().toString();
jobLog+=myJob.getActionLog().toString();
} catch (Exception e) {
returnCode=1;
jobLog+=myJob.getActionLog().toString();
jobLog+=e.toString();
jobLog+=myJob.getLogoutput();
}
}
if(returnCode==0)
return "Upgrade erfolgreich: "+EtlUtils.NEWLINE+jobLog;
else
return "Upgrade mit Fehler beendet: "+EtlUtils.NEWLINE+jobLog;
}
}

200
src/de/superx/sxrest/MaskXml.java

@ -1,200 +0,0 @@ @@ -1,200 +0,0 @@
/*
* 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.sxrest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import de.memtext.util.DateUtils;
import de.superx.common.SxUser;
import de.superx.elt.EtlActionJob;
import de.superx.elt.EtlUtils;
import de.superx.servlet.SuperXManager;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
@Path("/maskxml")
public class MaskXml {
@Context
Request request;
@GET
@Path("/get/{param}")
@Produces(MediaType.APPLICATION_XML)
public Document printXml(@PathParam("param") String tid,@Context HttpServletRequest request) {
String returntext="";
returntext = getMaskXml(tid, request);
return de.memtext.util.XMLUtils.buildDocumentFromString(returntext, false);
}
private String getMaskXml(String tid, HttpServletRequest request) {
String returntext;
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
String job="sx_select_mask";
String params="TID="+tid;
int returnCode=0;
EtlActionJob myJob=new EtlActionJob(job); //TODO:Mandantid
try {
myJob.initJob(job,params);
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
System.out.println("Job "+ job+" initialized");
try {
returnCode= myJob.execute("");
returntext=myJob.getSw().toString();
} catch (Exception e) {
// TODO Auto-generated catch block
returntext=e.toString();
returntext+=myJob.getLogoutput();
}
}
return returntext;
}
@GET
@Path("/download/{param}")
@Produces(MediaType.APPLICATION_XML)
public String createDownloadXml(@PathParam("param") String tid,@Context HttpServletRequest request) {
String returntext="";
returntext = getMaskXml(tid, request);
return returntext;
//return de.memtext.util.XMLUtils.buildDocumentFromString(returntext, false);
}
/* Aktuell noch nicht genutzt: */
@GET
@Path("/saveget/{params}")
@Produces(MediaType.TEXT_PLAIN)
public String saveGetXml(@QueryParam("param") String tid,
@QueryParam("Inhalt") String src,
@Context HttpServletRequest request) {
String returntext="";
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
returntext="tid="+tid+"-src="+src;
}
return returntext;
}
/* Aktuell noch nicht genutzt: */
@POST
@Path("/save")
@Consumes("application/x-www-form-urlencoded")
//@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public String saveXml(@FormParam("tid") String tid,
@FormParam("Inhalt") String src,
@Context HttpServletRequest request) {
String returntext="";
String jobuniquename="sx_select_mask";
int returnCode=0;
tid="16000";
SxUser user = (SxUser) request.getSession().getAttribute("user");
String mandantenid= (String) request.getSession().getAttribute("MandantenID");
String searchString="/etlAction[@name=\""+jobuniquename+"\"]/unload[@name=\"unload_maskeninfo\"]/rs/row/fld[@name=\"tid\"]";
if(mandantenid==null || mandantenid.equals(""))
mandantenid="default";
if (user == null || !user.isAdmin()) {
returntext="Fehlende Rechte";
}
else
{
try {
if(de.superx.elt.EtlUtils.isNodeValueInXml(src,searchString,tid,jobuniquename))
{
String job="sx_insert_mask";
returntext="TID="+tid;
String params="TID="+tid;
File temp;
temp = File.createTempFile("myTempFile", ".xml");
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
bw.write(src);
bw.close();
params+=EtlUtils.NEWLINE+"PATH_TO_INPUTFILE="+temp.getAbsolutePath();
params+=EtlUtils.NEWLINE+"FORMAT=XML";
EtlActionJob myJob=new EtlActionJob(job); //TODO:Mandantid
myJob.initJob(job,params);
returnCode= myJob.execute("");
returntext=myJob.getSw().toString();
}
else
returntext="Übergebene TID "+tid+" entspricht nicht der XML-Datei ";
} catch (Exception e) {
returntext=e.toString();
e.printStackTrace();
}
}
return returntext;
}
}

BIN
superx/WEB-INF/lib/spring-context-indexer-6.2.19.jar

Binary file not shown.

BIN
superx/WEB-INF/lib/superx-etl.jar

Binary file not shown.

259
superx/edit/etl/etl_job_bearbeiten.jsp

@ -0,0 +1,259 @@ @@ -0,0 +1,259 @@
<%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %>
<%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %>
<html xmlns:jsp="http://www.java.com/jsp" xmlns:db="http://www.wap-force.com/dbforms"><!--Automatically generated by module_scripts_create.x (SuperX)-->
<head xmlns:sx="http://memtext.de">
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="0" http-equiv="expires">
<LINK href="/superx/style/superx.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/superxml_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/maske_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/style/dbforms_40.css" type="text/css" REL="stylesheet">
<title>Maske Laderoutinen verwalten</title>
<script type="text/javascript">
var djConfig = {isDebug: false };
//djConfig.debugAtAllCosts = true;
</script><script src="/superx/xml/js/dojo/dojo.js" type="text/javascript">&nbsp;</script><script type="text/javascript">
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Tooltip");
dojo.require("dojo.string.common");
dojo.hostenv.writeIncludes();
</script><script src="/superx/xml/js/memtext/dbforms.js" type="text/javascript">&nbsp;</script>
<db:base/>
</head>
<script language="javascript"
src=<%= "\"" +request.getContextPath() + "/dbformslib/jscal/calendar.js\""%>>
</script>
<body class="clsPageBody"><%@ page import ="java.util.Hashtable" %>
<%
//HttpSession session=request.getSession(true);
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
Object userobject=request.getSession().getAttribute("UserID");
String userid;
String filter="";
String sql="";
if(userobject == null)
{
%>
<jsp:forward page="/edit/not_authenticated.htm"/>
<%
}
else
userid=userobject.toString();
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
//der superx-Default-Mandant ist bei dbforms ein Leerstring
if(mandantenid.equals("default"))
mandantenid="";
String db_form_name="etl_job";
String erlaubt="0";
%>
<%@ include file="/edit/check_authentication.inc" %>
<%
if(erlaubt.equals("0"))
{
%>
<jsp:forward page="/edit/not_authorized.htm"/>
<%
}
String keyfieldsused="false";
Object kf=request.getParameter("keyfieldsused");
if(kf != null)
keyfieldsused=kf.toString();
%>
<div style="margin: 0px; padding: 0px; overflow: hidden; width: 100%;" id="menuCaption">
<span class="menuCaptionTitle" id="menuCaptionTitle">Laderoutinen verwalten. </span><img border="0" height="18px" alt="Erl&auml;uterung" src="/superx/images/information.svg"><span style="display:none" connectId="menuCaption" dojoType="tooltip">In diesem Formular k&ouml;nnen Sie Laderoutinen verwalten.</span>
</div>
<%
String tid = request.getParameter("tid");
if(tid != null && !tid.equals("null")){
filter +="tid="+tid;
}
%>
<db:dbform tableName="etl_job" maxRows="1" autoUpdate="false" captionResource="true" multipart="false" followUp="/edit/etl/etl_job_bearbeiten.jsp" filter="<%= filter %>" orderBy="caption"
dbConnectionName="<%= mandantenid %>" ><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><db:header/>
<db:errors/>
<db:body allowNew="true">
<table border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy1" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy1" flavor="image"/></td><td class="naviBtn"><span connectId="new1" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new1" flavor="image"/></td><td class="naviBtn"><span connectId="ins1" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins1" flavor="image"/></td>
</tr>
</table>
<p>&nbsp;</p>
<hr>
<p>
<input type="hidden" name="tid" value="<%= tid %>" />
</p>
<table class="db_form_table" cellspacing="0" cellpadding="0" width="100%" border="0">
<td>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td class="db_label">tid</td><td>
<db:label nullFieldValue="" fieldName="tid"/></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Bezeichnung"/></td><td align="left">
<div id="fld_caption">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="50" id="inp_etl_jobcaption" fieldName="caption"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Schl&uuml;ssel"/></td><td align="left">
<div id="fld_uniquename">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="50" id="inp_etl_jobuniquename" fieldName="uniquename"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Job custom"/></td><td align="left">
<div id="fld_custom_job">
<db:textField nullFieldValue="" onBlur="" styleClass="clsInputStyle" id="inp_etl_jobcustom_job" size="6" fieldName="custom_job"/>
</div>
<span style="display:none" connectId="fld_custom_job" dojoType="tooltip">1=ja, d.h. von der Hochschule angepa&szlig;t, 0=nein, d.h.
Auslieferung der Software von HIS, 2=Auslieferung durch SuperX</span></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Komponente"/></td><td align="left">
<div id="fld_systeminfo_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_jobsysteminfo_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_jobsysteminfo_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="systeminfo_id" customEntry=",,true"><% sql = "select tid, name from systeminfo order by name;"; %><db:queryData name="etl_job_systeminfo1" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td>
</tr>
<tr>
<td class="db_label">Parameter</td><td>
<table class="subform">
<db:dbform orderBy="sortnr" childField="etl_job_id" parentField="tid" tableName="etl_job_param" maxRows="*" captionResource="true" followUp="/edit/etl/etl_job_bearbeiten.jsp" autoUpdate="false" multipart="false" dbConnectionName="<%= mandantenid %>">
<db:header>
<tr class="subform_tr">
<th class="subform_th">tid</th><th class="subform_th">Bezeichnung</th><th class="subform_th">Schl&uuml;ssel</th>
</tr>
</db:header>
<db:body allowNew="true">
<tr class="subform_tr">
<td>
<db:label nullFieldValue="" fieldName="tid"/></td><db:textField hidden="true" fieldName="job_id" overrideValue="<%= tid%>"/>
<td align="left">
<div id="fld_name">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="30" fieldName="name"/>
</div>
</td><td align="left">
<div id="fld_uniquename">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="50" fieldName="uniquename"/>
</div>
</td><td><%
if(currentRow_etl_job_param != null)
{
%><a target="details" title="Details" href="<%= response.encodeURL("/superx/edit/etl/etl_job_param_bearbeiten.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="tid"/>" onClick="javascript:neu=window.open('<%= response.encodeURL("/superx/edit/etl/etl_job_param_bearbeiten.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="tid"/>','_blank','directories=no,location=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;"><img border="0" alt="Details" src="../../images/pencil.svg"></a><%
}
%></td><td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy6" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy6" flavor="image"/></td>
</tr>
</db:body>
<db:footer>
<tr class="subform_tr">
<td><td class="naviBtn"><span connectId="new6" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new6" flavor="image"/></td><td class="naviBtn"><span connectId="ins6" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins6" flavor="image"/></td></td>
</tr>
</db:footer>
</db:dbform>
</table>
</td>
</tr>
<tr>
<td class="db_label">Ladeschritte</td><td>
<table class="subform">
<db:dbform orderBy="sortnr" childField="job_id" parentField="tid" tableName="etl_step_relation" maxRows="*" captionResource="true" followUp="/edit/etl/etl_job_bearbeiten.jsp" autoUpdate="false" multipart="false" dbConnectionName="<%= mandantenid %>">
<db:header>
<tr class="subform_tr">
<th class="subform_th">tid</th><th class="subform_th">Ladeschritt</th><th class="subform_th">&Uuml;bergeordneter Ladeschritt</th><th class="subform_th">Ladejob bei Fehler weiterf&uuml;hren</th><th class="subform_th">Ladeschritt aktiv</th><th class="subform_th">Ladeschritt Sortiernr.</th><th class="subform_th">Ladeschritt custom</th>
</tr>
</db:header>
<db:body allowNew="true">
<tr class="subform_tr">
<td>
<db:label nullFieldValue="" fieldName="tid"/></td><db:textField hidden="true" fieldName="job_id" overrideValue="<%= tid%>"/>
<td align="left">
<div id="fld_step_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_step_relationstep_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_step_relationstep_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="step_id" customEntry=",,true"><% sql = "select tid, caption from etl_step order by caption;"; %><db:queryData name="etl_step_relation_etl_step6" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td><td align="left">
<div id="fld_parent_step_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_step_relationparent_step_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_step_relationparent_step_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="parent_step_id" customEntry=",,true"><% sql = "select tid, caption from etl_step order by caption;"; %><db:queryData name="etl_step_relation_etl_step7" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td><td align="left">
<div id="fld_force_continue">
<db:textField styleClass="clsInputStyle" onBlur="" size="6" fieldName="force_continue"/>
</div>
</td><td align="left">
<div id="fld_step_active">
<db:textField styleClass="clsInputStyle" onBlur="" size="6" fieldName="step_active"/>
</div>
</td><td align="left">
<div id="fld_sortnr">
<db:textField styleClass="clsInputStyle" onBlur="" size="6" fieldName="sortnr"/>
</div>
</td><td align="left">
<div id="fld_custom_step">
<db:textField styleClass="clsInputStyle" onBlur="" size="6" fieldName="custom_step"/>
</div>
<span style="display:none" connectId="fld_custom_step" dojoType="tooltip">1=ja, d.h. von der Hochschule angepa&szlig;t, 0=nein, d.h.
Auslieferung der Software</span></td><td><%
if(currentRow_etl_step_relation != null)
{
%><a target="details" title="Details" href="<%= response.encodeURL("/superx/edit/etl/etl_step_bearbeiten.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="step_id"/>" onClick="javascript:neu=window.open('<%= response.encodeURL("/superx/edit/etl/etl_step_bearbeiten.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="step_id"/>','_blank','directories=no,location=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;"><img border="0" alt="Details" src="../../images/pencil.svg"></a><%
}
%></td><td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy7" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy7" flavor="image"/></td>
</tr>
</db:body>
<db:footer>
<tr class="subform_tr">
<td><td class="naviBtn"><span connectId="new7" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new7" flavor="image"/></td><td class="naviBtn"><span connectId="ins7" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins7" flavor="image"/></td></td>
</tr>
</db:footer>
</db:dbform>
</table>
</td>
</tr>
</table>
</td><td align="center" style="padding-left:10px"></td>
</table>
</db:body>
<db:footer/></db:dbform></body>
</html>

158
superx/edit/etl/etl_job_param_bearbeiten.jsp

@ -0,0 +1,158 @@ @@ -0,0 +1,158 @@
<%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %>
<%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %>
<html>
<!--Automatically generated by module_scripts_create.x (SuperX)-->
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="0" http-equiv="expires">
<LINK href="/superx/style/superx.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/superxml_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/maske_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/style/dbforms_40.css" type="text/css" REL="stylesheet">
<title>Maske Parameter f&uuml;r Ladejobs verwalten</title>
<script type="text/javascript">
var djConfig = {isDebug: false };
//djConfig.debugAtAllCosts = true;
</script><script src="/superx/xml/js/dojo/dojo.js" type="text/javascript">&nbsp;</script><script type="text/javascript">
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Tooltip");
dojo.require("dojo.string.common");
dojo.hostenv.writeIncludes();
</script><script src="/superx/xml/js/memtext/dbforms.js" type="text/javascript">&nbsp;</script>
<db:base/>
</head>
<script language="javascript"
src=<%= "\"" +request.getContextPath() + "/dbformslib/jscal/calendar.js\""%>>
</script>
<body class="clsPageBody"><%@ page import ="java.util.Hashtable" %>
<%
//HttpSession session=request.getSession(true);
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
Object userobject=request.getSession().getAttribute("UserID");
String userid;
String filter="";
String sql="";
if(userobject == null)
{
%>
<jsp:forward page="/edit/not_authenticated.htm"/>
<%
}
else
userid=userobject.toString();
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
//der superx-Default-Mandant ist bei dbforms ein Leerstring
if(mandantenid.equals("default"))
mandantenid="";
String db_form_name="etl_job_param";
String erlaubt="0";
%>
<%@ include file="/edit/check_authentication.inc" %>
<%
if(erlaubt.equals("0"))
{
%>
<jsp:forward page="/edit/not_authorized.htm"/>
<%
}
String keyfieldsused="false";
Object kf=request.getParameter("keyfieldsused");
if(kf != null)
keyfieldsused=kf.toString();
%>
<div style="margin: 0px; padding: 0px; overflow: hidden; width: 100%;" id="menuCaption">
<span class="menuCaptionTitle" id="menuCaptionTitle">Parameter f&uuml;r Ladejobs verwalten. </span><img border="0" height="18px" alt="Erl&auml;uterung" src="/superx/images/information.svg"><span style="display:none" connectId="menuCaption" dojoType="tooltip">In diesem Formular k&ouml;nnen Sie Parameter f&uuml;r Ladejobs verwalten.</span>
</div>
<%
String tid = request.getParameter("tid");
if(tid != null && !tid.equals("null")){
filter +="tid="+tid;
}
%>
<db:dbform tableName="etl_job_param" maxRows="1" autoUpdate="false" captionResource="true" multipart="false" followUp="/edit/etl/etl_job_param_bearbeiten.jsp" filter="<%= filter %>" orderBy=""
dbConnectionName="<%= mandantenid %>" ><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><db:header/>
<db:errors/>
<db:body allowNew="true">
<table border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:navFirstButton styleClass="clsButtonStyle" style="height:18px" caption="button.nav.first" alt="button.nav.first" src="../../images/resultset_first.svg" flavor="image" id="db_navFirstButton"/></td><td class="naviBtn">
<db:navPrevButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.previous" src="../../images/resultset_previous.svg" flavor="image" id="db_navPrevButton"/></td><td class="naviBtn">
<db:navNextButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.next" src="../../images/resultset_next.svg" flavor="image" id="db_navNextButton"/></td><td class="naviBtn">
<db:navLastButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.last" src="../../images/resultset_last.svg" flavor="image" id="db_navLastButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy2" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy2" flavor="image"/></td><td class="naviBtn"><span connectId="new2" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new2" flavor="image"/></td><td class="naviBtn"><span connectId="ins2" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins2" flavor="image"/></td><td class="naviBtn"><input type="hidden" name="keyfieldsused" value="<%= keyfieldsused %>" /><a onclick="maskeTogglekeyfields()" title="Schl&uuml;sselfelder an/aus"><img alt="Schl&uuml;sselfelder an/aus" src="../../images/key.svg" border="0"></a></td>
</tr>
</table>
<p>&nbsp;</p>
<hr>
<p>
<input type="hidden" name="tid" value="<%= tid %>" />
</p>
<table class="db_form_table" cellspacing="0" cellpadding="0" width="100%" border="0">
<td>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td class="db_label">tid</td><td>
<db:label nullFieldValue="" fieldName="tid"/></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Ladejob"/></td><td align="left">
<div id="fld_etl_job_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_job_parametl_job_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_job_parametl_job_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="etl_job_id" customEntry=",,true"><% sql = "select tid, caption from etl_job order by caption;"; %><db:queryData name="etl_job_param_etl_job8" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Schl&uuml;ssel"/></td><td align="left">
<div id="fld_uniquename">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="30" id="inp_etl_job_paramuniquename" fieldName="uniquename"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Bezeichnung"/></td><td align="left">
<div id="fld_name">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="50" id="inp_etl_job_paramname" fieldName="name"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Defaultwert"/></td><td align="left">
<div id="fld_param_default">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="50" id="inp_etl_job_paramparam_default" fieldName="param_default"/>
</div>
</td>
</tr>
</table>
</td><td align="center" style="padding-left:10px"></td>
</table>
</db:body>
<db:footer/></db:dbform></body>
</html>

138
superx/edit/etl/etl_manager.jsp

@ -5,6 +5,9 @@ @@ -5,6 +5,9 @@
<%@ page import ="org.dbforms.config.DbFormsConfigRegistry,java.sql.Connection,java.sql.Statement,java.sql.ResultSet,de.superx.common.SxUser" %>
<%
String restApiPath="ds/api";
%>
<html>
@ -12,64 +15,81 @@ @@ -12,64 +15,81 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ETL Manager</title>
<title>Job Management</title>
<link rel="stylesheet" href="../../style/dbforms.css" />
<link rel="stylesheet" href="../../style/bulma.css" />
<link rel="stylesheet" href="../../style/bulma-tooltip.min.css" />
<!-- <link rel="stylesheet" href="../../style/sx_common.css" />-->
<script type="text/javascript" src="/superx/xml/js/memtext/sx_functions.js"></script>
<script type="text/javascript" src="/superx/xml/js/memtext/nd_functions.js"></script>
</head>
<script language="Javascript">
var restApiPath="<%=restApiPath %>";
function getVersion()
{
//alert("klappt");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("version").innerHTML = this.responseText;
//alert(this.responseText);
}
};
xhttp.open("GET", "../../sxrest/version", true);
xhttp.send();
}
function getTabMenu(srctype,caption,i,jobExportUniquename,jobImportUniquename,maskeninfo_tid,felderinfo_tid,paramname,jobParamName)
{
var zs=caption+": ";
//
var zs="";
zs+="<input type=\"hidden\" name=\"jobParamName\" value=\""+jobParamName+"\"/> ";
zs+="<input type=\"hidden\" name=\"jobParamValue\" value=\"\"/> ";
zs+="<input class=\"schluesselfeld\" size=\"5\" style=\"display:none;\" name=\""+paramname+"\" id=\""+paramname+"\"/> ";
zs+="<input type=\"text\" size=\"20\" name=\"label_"+paramname+"\" onClick=\"EtlMaskeComboLaden('"+paramname+"',1,'',"+maskeninfo_tid+");\" />";
if(srctype=="load")
{
zs+=paramname+": ";
zs+="<input class=\"schluesselfeld\" size=\"5\" style=\"display:none;\" name=\""+paramname+"\" id=\""+paramname+"\"/> ";
zs+="<input type=\"text\" size=\"20\" name=\"label_"+paramname+"\" onClick=\"EtlMaskeComboLaden('"+paramname+"',20,'',"+maskeninfo_tid+");\" />";
document.getElementById("MaskHeader").innerHTML=caption+"-Quellcode exportieren";
zs+="<input type='hidden' name='jobuniquename' value='"+jobExportUniquename+"'/>";
zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode exportieren\" onclick=\"getSrcAsXml('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\">anzeigen...</button>";
zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode herunterladen\" onclick=\"downloadMaskSrc('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\">herunterladen...</button>";
//zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode exportieren\" onclick=\"getSrcAsXml('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\">anzeigen...</button>";
zs+="<a onclick=\"getSrcAsXml('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\" class=\"linkLookImage\"><img title=\"Quellcode anzeigen\" alt=\"Quellcode anzeigen\" src=\"../../images/eye.svg\" border=\"0\"/></a>";
zs+="<a onclick=\"downloadMaskSrc('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\" class=\"linkLookImage\"><img title=\"Quellcode herunterladen\" alt=\"Quellcode herunterladen\" src=\"../../images/downloadblck.svg\" border=\"0\"/></a>";
zs+="<a onclick=\"togglekeyfields(); return false;\" class=\"linkLookImage\"><img title=\"Schlüsselfelder an- oder ausschalten\" alt=\"Schlüsselfelder an- oder ausschalten\" src=\"../../images/key.svg\" border=\"0\"/></a>";
//zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode exportieren\" onclick=\"getSrcAsXml('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\">anzeigen...</button>";
//zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode herunterladen\" onclick=\"downloadMaskSrc('"+jobExportUniquename+"','"+jobParamName+"',document.getElementById('"+paramname+"').value);return false;\">herunterladen...</button>";
}
if(srctype=="save")
{
zs+=paramname+" importieren&nbsp;";
document.getElementById("MaskHeader").innerHTML=caption+"-Quellcode importieren";
zs+="<input type='hidden' name='src' /><input type='hidden' name='jobuniquename' value='"+jobImportUniquename+"'/>";
zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode importieren\" onclick=\"saveEtlXmlSrc('"+jobParamName+"',document.getElementById('"+paramname+"').value)\">importieren...</button>";
//zs+="<button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode importieren\" onclick=\"saveEtlXmlSrc('"+jobParamName+"',document.getElementById('"+paramname+"').value)\">importieren...</button>";
zs+="<a onclick=\"saveEtlXmlSrc('"+jobParamName+"');return false;\" class=\"linkLookImage\"><img title=\"Quellcode importieren\" alt=\"Quellcode importieren\" src=\"../../images/resultset_up.svg\" border=\"0\"/></a>";
//,document.getElementById('"+paramname+"').value
//document.getElementById("maskentid_for_upload").style.visibility="visible";
//document.getElementById("button_for_upload").style.visibility="visible";
//document.getElementById("MaskSubHeader").innerHTML="Maske TID="+tid;
//document.getElementById("MaskSubHeader").innerHTML="TID=<input type='text' size='10' id='Maskentid' />"+" <button class=\"button has-tooltip-multiline has-tooltip-right\" data-tooltip=\"Quellcode der Maske mit der Nummer im Feld TID exportieren\" onclick=\"saveEtlXmlSrc(document.getElementById('Maskentid').value)\">importieren...</button>";
}
zs+="<a onclick=\"togglekeyfields(); return false;\" class=\"linkLookImage\"><img title=\"Schlüsselfelder an- oder ausschalten\" alt=\"Schlüsselfelder an- oder ausschalten\" src=\"../../images/key.svg\" border=\"0\"/></a>";
document.getElementById("MaskSubHeader").innerHTML=zs;
}
async function getSrcAsXmlNeu(jobUniquename,jobParamName,jobParamValue)
{
const url="../../ds/api/jobetlxml/view/"+jobUniquename+"?jobParamName="+jobParamName+"&param="+jobParamValue;
try {
const response = await fetch(url,{method: "GET"});
if (!response.ok) {
throw new Error(`Serverantwort: ${response.status}`);
}
const xmlDoc = await response.text();
//.then(response => response.text())
// .then(str => new window.DOMParser().parseFromString(str, "text/xml"))
//var xmlTxt=new XMLSerializer().serializeToString(xmlDoc);
document.getElementById("Inhalt").innerHTML = xmlDoc;
} catch (error) {
document.getElementById("Inhalt").innerHTML = error.message;
}
}
function getSrcAsXml(jobUniquename,jobParamName,jobParamValue)
{
//document.getElementById("MaskHeader").innerHTML="Masken-Quellcode laden";
@ -89,31 +109,27 @@ var xhttp = new XMLHttpRequest(); @@ -89,31 +109,27 @@ var xhttp = new XMLHttpRequest();
document.getElementById("Inhalt").innerHTML="Serveranfrage Antwort... "+this.status;
}
};
xhttp.open("GET", "../../sxrest/jobetlxml/get/"+jobUniquename+"/"+jobParamName+"/view/"+jobParamValue, true);
// xhttp.open("GET", "../../ds/api/jobetlxml/get/"+jobUniquename+"/"+jobParamName+"/view/"+jobParamValue, true);
xhttp.open("GET", "../../ds/api/jobetlxml/view/"+jobUniquename+"?jobParamName="+jobParamName+"&param="+jobParamValue, true);
xhttp.send();
}
function downloadMaskSrc(jobUniquename,jobParamName,jobParamValue)
{
window.open("../../sxrest/jobetlxml/get/"+jobUniquename+"/"+jobParamName+"/download/"+jobParamValue,"_blank");
const url="../../ds/api/jobetlxml/view/"+jobUniquename+"?jobParamName="+jobParamName+"&param="+jobParamValue;
window.open(url,"_blank");
}
function saveEtlXmlSrc(jobParamName,jobParamValue)
function saveEtlXmlSrc(jobParamName)
{
document.forms["saveEtlXml"].elements["src"].value=document.getElementById("Inhalt").value;
if(document.forms["saveEtlXml"].elements["src"].value=="" || jobParamValue=="")
{
alert("Bitte setzen Sie eine Nummer in das Feld TID und einen passenden XML ins Feld Inhalt");
return false;
}
else
{
document.forms["saveEtlXml"].elements["jobParamName"].value=jobParamName;
document.forms["saveEtlXml"].elements["jobParamValue"].value=jobParamValue;
//document.forms["saveEtlXml"].elements["jobParamValue"].value=jobParamValue;
document.forms["saveEtlXml"].submit();
}
}
function getComponentMenu(systeminfo_id, componentName,componentUniquename,componentVersion)
{
document.getElementById("MaskHeader").innerHTML="Komponente "+ componentName+"<br />Version: "+componentVersion;
@ -149,6 +165,7 @@ var fldElem=document.getElementById(mydiv); @@ -149,6 +165,7 @@ var fldElem=document.getElementById(mydiv);
function EtlMaskeComboLaden(fname,zeilenanzahl, caption,maskentid) {
var editurl="/superx/edit/kern/maske_combo_laden.jsp?tid="+maskentid+ "&Feldname="+getEncoded(fname);
editurl +="&referrerForm=saveEtlXml";
editurl +="&zeilenanzahl="+zeilenanzahl+"&params=";
neu2=window.open(editurl,"_blank","directories=no,location=no,menubar=no,scrollbars=yes,resizable=yes,toolbar=no,width=800,height=660");
return false;
@ -168,6 +185,20 @@ function togglekeyfields() { @@ -168,6 +185,20 @@ function togglekeyfields() {
}
</script>
<style type="text/css">
.buttonbar img {
height: 1.5rem;
width: 1.7rem;
margin: 8px 0px 0px 0px;
padding: 0rem 0.1rem 0rem 0.1rem;
}
.buttonbar input {
height: 1.5rem;
width: 14rem;
margin: 8px 10px 0px 0px;
padding: 0rem 0.1rem 0rem 0.1rem;
}
</style>
<body>
<%
//init Variables:
@ -175,6 +206,7 @@ String EntwicklungsmodusAn=""; @@ -175,6 +206,7 @@ String EntwicklungsmodusAn="";
String EntwicklungsmodusAus="checked";
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
@ -256,7 +288,7 @@ etlJobsArr=etlJobs.toArray(etlJobsArr); @@ -256,7 +288,7 @@ etlJobsArr=etlJobs.toArray(etlJobsArr);
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="etl_manager.jsp">ETL Manager</a>
<a class="navbar-item" href="etl_manager.jsp">Job Management</a>
</div>
@ -297,15 +329,14 @@ String tabUrl="etl_manager.jsp?tab="+tabUniquename.toLowerCase(); @@ -297,15 +329,14 @@ String tabUrl="etl_manager.jsp?tab="+tabUniquename.toLowerCase();
<div class="columns">
<div class="column is-3 ">
<aside class="menu is-hidden-mobile">
<p class="menu-label">
<!--<p class="menu-label">
Untermenü
</p>
<ul class="menu-list">
<li><a class="is-active">Startseite</a></li>
<!--<li><a>Customers</a></li>
<li><a>Other</a></li>-->
</ul>
-->
<%
for (int i = 0; i < etlJobsArr.length; i++) {
@ -313,7 +344,9 @@ if(tab.equals(etlJobsArr[i].tabUniquename.toLowerCase())) @@ -313,7 +344,9 @@ if(tab.equals(etlJobsArr[i].tabUniquename.toLowerCase()))
{
%>
<p class="menu-label">
<ul class="menu-list">
<li>
<a class="is-active">
<% out.print(etlJobsArr[i].tabCaption);
String menuArgs=",";
menuArgs+="'"+etlJobsArr[i].tabCaption+"'";
@ -326,7 +359,9 @@ if(tab.equals(etlJobsArr[i].tabUniquename.toLowerCase())) @@ -326,7 +359,9 @@ if(tab.equals(etlJobsArr[i].tabUniquename.toLowerCase()))
menuArgs+=",'"+etlJobsArr[i].jobParamName+"'";
%>
</p>
</a>
</li>
</ul>
<ul class="menu-list">
<li><a onClick="<%= "getTabMenu('load'"+menuArgs+");" %>"><% out.print(etlJobsArr[i].tabCaption); %>-Quellcode exportieren</a></li>
<li><a onClick="<%= "getTabMenu('save'"+menuArgs+");" %>"><% out.print(etlJobsArr[i].tabCaption); %>-Quellcode importieren</a></li>
@ -351,15 +386,18 @@ if(tab.equals("")) @@ -351,15 +386,18 @@ if(tab.equals(""))
<div class="hero-body">
<div class="container">
<h1 class="title">
ETL Manager
Job Management
</h1>
<h2 class="subtitle">
Diese Komponente dient der Job-Verwaltung.
</h2>
<p class="title">Klicken Sie oben links auf "Masken", um zum Menü zu gelangen.</p>
</div>
</div>
</section>
<section class="section">
<p>Klicken Sie oben auf den jew. Reiter, um zum jew. Menü zu gelangen.</p>
</section>
<div class="columns">
<div class="column is-6">
@ -379,14 +417,20 @@ for (int i = 0; i < etlJobsArr.length; i++) { @@ -379,14 +417,20 @@ for (int i = 0; i < etlJobsArr.length; i++) {
if(tab.equals(etlJobsArr[i].tabUniquename.toLowerCase()))
{
%>
<section class="section">
<section class="hero is-info welcome is-small">
<div class="hero-body">
<div class="container" id="loadMask" >
<h1 class="title" id="MaskHeader"><% out.print(etlJobsArr[i].tabCaption); %></h1>
<h2 class="subtitle">Quellcodes verwalten</h2>
</div>
</div>
</section>
<section class="section">
<h2 class="subtitle">
<form method="post" name="saveEtlXml" action="../../edit/etl/saveEtlXml.jsp" target="_blank">
<div id="MaskSubHeader">Wählen Sie links das Export/Import-Menü</div>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<div id="MaskSubHeader" class="buttonbar">Wählen Sie links das Export/Import-Menü</div>
<div style="float:right">
<input type="hidden" name="keyfieldsused" value="false"/>
</div>

218
superx/edit/etl/etl_step_bearbeiten.jsp

@ -0,0 +1,218 @@ @@ -0,0 +1,218 @@
<%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %>
<%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %>
<html>
<!--Automatically generated by module_scripts_create.x (SuperX)-->
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="0" http-equiv="expires">
<LINK href="/superx/style/superx.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/superxml_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/maske_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/style/dbforms_40.css" type="text/css" REL="stylesheet">
<title>Maske Ladeschritt verwalten</title>
<script type="text/javascript">
var djConfig = {isDebug: false };
//djConfig.debugAtAllCosts = true;
</script><script src="/superx/xml/js/dojo/dojo.js" type="text/javascript">&nbsp;</script><script type="text/javascript">
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Tooltip");
dojo.require("dojo.string.common");
dojo.hostenv.writeIncludes();
</script><script src="/superx/xml/js/memtext/dbforms.js" type="text/javascript">&nbsp;</script>
<db:base/>
</head>
<script language="javascript"
src=<%= "\"" +request.getContextPath() + "/dbformslib/jscal/calendar.js\""%>>
</script>
<body class="clsPageBody"><%@ page import ="java.util.Hashtable" %>
<%
//HttpSession session=request.getSession(true);
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
Object userobject=request.getSession().getAttribute("UserID");
String userid;
String filter="";
String sql="";
if(userobject == null)
{
%>
<jsp:forward page="/edit/not_authenticated.htm"/>
<%
}
else
userid=userobject.toString();
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
//der superx-Default-Mandant ist bei dbforms ein Leerstring
if(mandantenid.equals("default"))
mandantenid="";
String db_form_name="etl_step";
String erlaubt="0";
%>
<%@ include file="/edit/check_authentication.inc" %>
<%
if(erlaubt.equals("0"))
{
%>
<jsp:forward page="/edit/not_authorized.htm"/>
<%
}
String keyfieldsused="false";
Object kf=request.getParameter("keyfieldsused");
if(kf != null)
keyfieldsused=kf.toString();
%>
<div style="margin: 0px; padding: 0px; overflow: hidden; width: 100%;" id="menuCaption">
<span class="menuCaptionTitle" id="menuCaptionTitle">Ladeschritt verwalten. </span><img border="0" height="18px" alt="Erl&auml;uterung" src="/superx/images/information.svg"><span style="display:none" connectId="menuCaption" dojoType="tooltip">In diesem Formular k&ouml;nnen Sie Ladeschritte verwalten.</span>
</div>
<%
String tid = request.getParameter("tid");
if(tid != null && !tid.equals("null")){
filter +="tid="+tid;
}
%>
<db:dbform tableName="etl_step" maxRows="1" autoUpdate="false" captionResource="true" multipart="false" followUp="/edit/etl/etl_step_bearbeiten.jsp" filter="<%= filter %>" orderBy=""
dbConnectionName="<%= mandantenid %>" ><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><db:header/>
<db:errors/>
<db:body allowNew="true">
<table border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:navFirstButton styleClass="clsButtonStyle" style="height:18px" caption="button.nav.first" alt="button.nav.first" src="../../images/resultset_first.svg" flavor="image" id="db_navFirstButton"/></td><td class="naviBtn">
<db:navPrevButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.previous" src="../../images/resultset_previous.svg" flavor="image" id="db_navPrevButton"/></td><td class="naviBtn">
<db:navNextButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.next" src="../../images/resultset_next.svg" flavor="image" id="db_navNextButton"/></td><td class="naviBtn">
<db:navLastButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.last" src="../../images/resultset_last.svg" flavor="image" id="db_navLastButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy3" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy3" flavor="image"/></td><td class="naviBtn"><span connectId="new3" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new3" flavor="image"/></td><td class="naviBtn"><span connectId="ins3" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins3" flavor="image"/></td><td class="naviBtn"><input type="hidden" name="keyfieldsused" value="<%= keyfieldsused %>" /><a onclick="maskeTogglekeyfields()" title="Schl&uuml;sselfelder an/aus"><img alt="Schl&uuml;sselfelder an/aus" src="../../images/key.svg" border="0"></a></td>
</tr>
</table>
<p>&nbsp;</p>
<hr>
<p>
<input type="hidden" name="tid" value="<%= tid %>" />
</p>
<table class="db_form_table" cellspacing="0" cellpadding="0" width="100%" border="0">
<td>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td class="db_label">tid</td><td>
<db:label nullFieldValue="" fieldName="tid"/></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Bezeichnung"/></td><td align="left">
<div id="fld_caption">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="30" id="inp_etl_stepcaption" fieldName="caption"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Unique Name"/></td><td align="left">
<div id="fld_uniquename">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="30" id="inp_etl_stepuniquename" fieldName="uniquename"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Komponente"/></td><td align="left">
<div id="fld_systeminfo_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_stepsysteminfo_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_stepsysteminfo_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="systeminfo_id" customEntry=",,true"><% sql = "select tid, name from systeminfo order by name;"; %><db:queryData name="etl_step_systeminfo2" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Typ des Schrittes"/></td><td align="left">
<div id="fld_step_type_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_stepstep_type_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_stepstep_type_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="step_type_id" customEntry=",,true"><% sql = "select tid, caption from etl_step_type order by caption;"; %><db:queryData name="etl_step_etl_step_type3" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
<span style="display:none" connectId="fld_step_type_id" dojoType="tooltip">1=Gruppierung,
2=Loadtable,3=nativeaction,4=loadmask,5=select</span></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Ladeschritt custom"/></td><td align="left">
<div id="fld_custom_step">
<db:textField nullFieldValue="" onBlur="" styleClass="clsInputStyle" id="inp_etl_stepcustom_step" size="6" fieldName="custom_step"/>
</div>
<span style="display:none" connectId="fld_custom_step" dojoType="tooltip">1=ja, d.h. von der Hochschule angepa&szlig;t, 0=nein, d.h.
Auslieferung der Software</span></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Logdatei"/></td><td align="left">
<div id="fld_logfile">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="20" id="inp_etl_steplogfile" fieldName="logfile"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">Eigenschaften</td><td>
<table class="subform">
<db:dbform orderBy="prop_name" childField="etl_step_id" parentField="tid" tableName="etl_step_property" maxRows="*" captionResource="true" followUp="/edit/etl/etl_step_bearbeiten.jsp" autoUpdate="false" multipart="false" dbConnectionName="<%= mandantenid %>">
<db:header>
<tr class="subform_tr">
<th class="subform_th">tid</th><th class="subform_th">Bezeichnung</th><th class="subform_th">Bearbeiten</th>
</tr>
</db:header>
<db:body allowNew="true">
<tr class="subform_tr">
<td>
<db:label nullFieldValue="" fieldName="tid"/></td><db:textField hidden="true" fieldName="etl_step_id" overrideValue="<%= tid%>"/>
<td align="left">
<div id="fld_prop_name">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="20" fieldName="prop_name"/>
</div>
</td><td align="left">
<div id="fld_prop_value">
<!--
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" size="30" fieldName="prop_value"/>-->
<%
if(currentRow_etl_step_property != null)
{
%><a target="details" title="Details" href="<%= response.encodeURL("/superx/edit/etl/etl_step_property_bearbeiten.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="tid"/>" onClick="javascript:neu=window.open('<%= response.encodeURL("/superx/edit/etl/etl_step_property_edit.jsp") %>?tid=<db:label nullFieldValue="" pattern="######" fieldName="tid"/>','_blank','directories=no,location=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;"><img border="0" alt="Details" src="../../images/pencil.svg"></a><%
}
%>
</div>
</td><td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy8" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy8" flavor="image"/></td>
</tr>
</db:body>
<db:footer>
<tr class="subform_tr">
<td><td class="naviBtn"><span connectId="new8" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new8" flavor="image"/></td><td class="naviBtn"><span connectId="ins8" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins8" flavor="image"/></td></td>
</tr>
</db:footer>
</db:dbform>
</table>
</td>
</tr>
</table>
</td><td align="center" style="padding-left:10px"></td>
</table>
</db:body>
<db:footer/></db:dbform></body>
</html>

150
superx/edit/etl/etl_step_property_bearbeiten.jsp

@ -0,0 +1,150 @@ @@ -0,0 +1,150 @@
<%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %>
<%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %>
<html>
<!--Automatically generated by module_scripts_create.x (SuperX)-->
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="0" http-equiv="expires">
<LINK href="/superx/style/superx.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/superxml_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/maske_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/style/dbforms_40.css" type="text/css" REL="stylesheet">
<title>Maske Eigenschaften von f&uuml;r Ladeschritten verwalten</title>
<script type="text/javascript">
var djConfig = {isDebug: false };
//djConfig.debugAtAllCosts = true;
</script><script src="/superx/xml/js/dojo/dojo.js" type="text/javascript">&nbsp;</script><script type="text/javascript">
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Tooltip");
dojo.require("dojo.string.common");
dojo.hostenv.writeIncludes();
</script><script src="/superx/xml/js/memtext/dbforms.js" type="text/javascript">&nbsp;</script>
<db:base/>
</head>
<script language="javascript"
src=<%= "\"" +request.getContextPath() + "/dbformslib/jscal/calendar.js\""%>>
</script>
<body class="clsPageBody"><%@ page import ="java.util.Hashtable" %>
<%
//HttpSession session=request.getSession(true);
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
Object userobject=request.getSession().getAttribute("UserID");
String userid;
String filter="";
String sql="";
if(userobject == null)
{
%>
<jsp:forward page="/edit/not_authenticated.htm"/>
<%
}
else
userid=userobject.toString();
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
//der superx-Default-Mandant ist bei dbforms ein Leerstring
if(mandantenid.equals("default"))
mandantenid="";
String db_form_name="etl_step_property";
String erlaubt="0";
%>
<%@ include file="/edit/check_authentication.inc" %>
<%
if(erlaubt.equals("0"))
{
%>
<jsp:forward page="/edit/not_authorized.htm"/>
<%
}
String keyfieldsused="false";
Object kf=request.getParameter("keyfieldsused");
if(kf != null)
keyfieldsused=kf.toString();
%>
<div style="margin: 0px; padding: 0px; overflow: hidden; width: 100%;" id="menuCaption">
<span class="menuCaptionTitle" id="menuCaptionTitle">Eigenschaften von f&uuml;r Ladeschritten verwalten. </span><img border="0" height="18px" alt="Erl&auml;uterung" src="/superx/images/information.svg"><span style="display:none" connectId="menuCaption" dojoType="tooltip">In diesem Formular k&ouml;nnen Sie Parameter f&uuml;r Ladejobs verwalten.</span>
</div>
<%
String tid = request.getParameter("tid");
if(tid != null && !tid.equals("null")){
filter +="tid="+tid;
}
%>
<db:dbform tableName="etl_step_property" maxRows="1" autoUpdate="false" captionResource="true" multipart="false" followUp="/edit/etl/etl_step_property_bearbeiten.jsp" filter="<%= filter %>" orderBy=""
dbConnectionName="<%= mandantenid %>" ><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><db:header/>
<db:errors/>
<db:body allowNew="true">
<table border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:navFirstButton styleClass="clsButtonStyle" style="height:18px" caption="button.nav.first" alt="button.nav.first" src="../../images/resultset_first.svg" flavor="image" id="db_navFirstButton"/></td><td class="naviBtn">
<db:navPrevButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.previous" src="../../images/resultset_previous.svg" flavor="image" id="db_navPrevButton"/></td><td class="naviBtn">
<db:navNextButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.next" src="../../images/resultset_next.svg" flavor="image" id="db_navNextButton"/></td><td class="naviBtn">
<db:navLastButton styleClass="clsButtonStyle" style="height:18px" alt="button.nav.last" src="../../images/resultset_last.svg" flavor="image" id="db_navLastButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td><td class="naviBtn"><span connectId="copy2" dojoType="tooltip">Datensatz kopieren. Mit Mausklick auf diesen Button kopieren Sie den aktuellen Datensatz. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navCopyButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.copy" src="../../images/copy.svg" id="copy2" flavor="image"/></td><td class="naviBtn"><span connectId="new2" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new2" flavor="image"/></td><td class="naviBtn"><span connectId="ins2" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins2" flavor="image"/></td><td class="naviBtn"><input type="hidden" name="keyfieldsused" value="<%= keyfieldsused %>" /><a onclick="maskeTogglekeyfields()" title="Schl&uuml;sselfelder an/aus"><img alt="Schl&uuml;sselfelder an/aus" src="../../images/key.svg" border="0"></a></td>
</tr>
</table>
<p>&nbsp;</p>
<hr>
<p>
<input type="hidden" name="tid" value="<%= tid %>" />
</p>
<table class="db_form_table" cellspacing="0" cellpadding="0" width="100%" border="0">
<td>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td class="db_label">tid</td><td>
<db:label nullFieldValue="" fieldName="tid"/></td>
</tr>
<tr>
<td class="db_label">
<db:message key="Arten des Ladeschritts"/></td><td align="left">
<div id="fld_etl_step_id">
<input onblur="updateSelect(this)" style="display:none" size="10" name="key_etl_step_propertyetl_step_id" class="schluesselfeld" type="text">
<db:select id="inp_etl_step_propertyetl_step_id" styleClass="clsInputStyle" readOnly="false" onChange="updateKeyfield(this)" fieldName="etl_step_id" customEntry=",,true"><% sql = "select tid, caption from etl_step order by caption;"; %><db:queryData name="etl_step_property_etl_step4" query="<%= sql %>" dbConnectionName="<%= mandantenid %>" /> </db:select>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Bezeichnung"/></td><td align="left">
<div id="fld_prop_name">
<db:textField nullFieldValue="" styleClass="clsInputStyle" onBlur="" maxlength="255" size="30" id="inp_etl_step_propertyprop_name" fieldName="prop_name"/>
</div>
</td>
</tr>
<tr>
<td class="db_label">
<db:message key="Wert"/></td><td align="left">
<div id="fld_prop_value">
<db:textArea nullFieldValue="" onBlur="" styleClass="editform" wrap="virtual" rows="6" cols="80" fieldName="prop_value"/>
</div>
</td>
</tr>
</table>
</td><td align="center" style="padding-left:10px"></td>
</table>
</db:body>
<db:footer/></db:dbform></body>
</html>

109
superx/edit/etl/etl_step_type_liste.jsp

@ -0,0 +1,109 @@ @@ -0,0 +1,109 @@
<%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %>
<%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %>
<html xmlns:jsp="http://www.java.com/jsp" xmlns:db="http://www.wap-force.com/dbforms"><!--Automatically generated by module_scripts_create.x (SuperX)-->
<head xmlns:sx="http://memtext.de">
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="0" http-equiv="expires">
<LINK href="/superx/style/superx.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/superxml_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/xml/maske_html.css" type="text/css" REL="stylesheet">
<LINK href="/superx/style/dbforms_40.css" type="text/css" REL="stylesheet">
<title>Formular Arten von Ladeschritten verwalten</title>
<script type="text/javascript">
var djConfig = {isDebug: false };
//djConfig.debugAtAllCosts = true;
</script><script src="/superx/xml/js/dojo/dojo.js" type="text/javascript">&nbsp;</script><script type="text/javascript">
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Tooltip");
dojo.require("dojo.string.common");
dojo.hostenv.writeIncludes();
</script><script src="/superx/xml/js/memtext/dbforms.js" type="text/javascript">&nbsp;</script>
<db:base/>
</head>
<body class="clsPageBody"><%@ page import ="java.util.Hashtable" %>
<%
//HttpSession session=request.getSession(true);
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
Object userobject=request.getSession().getAttribute("UserID");
String userid;
String filter="";
String sql="";
if(userobject == null)
{
%>
<jsp:forward page="/edit/not_authenticated.htm"/>
<%
}
else
userid=userobject.toString();
Object mandantobject=request.getSession().getAttribute("MandantenID");
String mandantenid="";
if(mandantobject != null)
mandantenid=mandantobject.toString();
//der superx-Default-Mandant ist bei dbforms ein Leerstring
if(mandantenid.equals("default"))
mandantenid="";
String db_form_name="etl_step_type";
String erlaubt="0";
%>
<%@ include file="/edit/check_authentication.inc" %>
<%
if(erlaubt.equals("0"))
{
%>
<jsp:forward page="/edit/not_authorized.htm"/>
<%
}
String keyfieldsused="false";
Object kf=request.getParameter("keyfieldsused");
if(kf != null)
keyfieldsused=kf.toString();
%>
<p align="right">
<a target="_parent" href="http://www.superx-projekt.de"><img border="0" alt="Logo" src="../../images/logo.gif"></a>
<br><% if(!mandantenid.equals("default") && !mandantenid.equals(""))
out.println("<strong>Mandant: " + mandantenid +"</strong>");
%></p>
<div style="margin: 0px; padding: 0px; overflow: hidden; width: 100%;" id="menuCaption">
<span class="menuCaptionTitle" id="menuCaptionTitle">Arten von Ladeschritten verwalten. </span><img border="0" height="18px" alt="Erl&auml;uterung" src="/superx/images/information.svg"><span style="display:none" connectId="menuCaption" dojoType="tooltip">In diesem Formular k&ouml;nnen Sie Arten von Ladeschritten verwalten.</span>
</div><db:dbform tableName="etl_step_type" maxRows="*" autoUpdate="false" captionResource="true" multipart="false" followUp="/edit/etl/etl_step_type_liste.jsp" orderBy="caption"
dbConnectionName="<%= mandantenid %>" ><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><db:header>
<table class="dbform_tab" border="1" >
<tr>
<th></th><th align="left">
<db:message key="tid"/></th><th align="left">
<db:message key="Unique Name"/></th><th align="left">
<db:message key="Bezeichnung"/></th><th align="left">
<db:message key="Handler-Anwendung"/></th>
</tr>
</db:header>
<db:errors/>
<db:body allowNew="true">
<tr>
<td></td><td>
<db:label nullFieldValue="" styleClass="clsInputStyle" fieldName="tid"/></td><td align="left">
<db:textArea nullFieldValue="" styleClass="clsInputStyle" wrap="virtual" rows="3" cols="20" fieldName="uniquename"/></td><td align="left">
<db:textArea nullFieldValue="" styleClass="clsInputStyle" wrap="virtual" rows="3" cols="20" fieldName="caption"/></td><td align="left">
<db:textArea nullFieldValue="" styleClass="clsInputStyle" wrap="virtual" rows="3" cols="20" fieldName="handler"/></td><td class="naviBtn">
<db:updateButton styleClass="clsButtonStyle" style="height:18px" alt="button.update" src="../../images/save.svg" flavor="image" id="db_updateButton"/></td><td class="naviBtn">
<db:deleteButton confirmMessage="button.delete.confirm" styleClass="clsButtonStyle" style="height:18px" alt="button.delete" src="../../images/delete.svg" id="db_deleteButton" flavor="image"/></td>
</tr>
</db:body>
<db:footer><tr><td class="naviBtn"><span connectId="new1" dojoType="tooltip">Neuen Datensatz erzeugen. Mit Mausklick auf diesen Button geht das Formular bzw. Unterformular in den Einf&uuml;gemodus, alle vorhandenen Datens&auml;tze werden ausgeblendet. Zum Einf&uuml;gen des neuen Datensatzes klicken Sie dann auf das H&auml;kchen-Symbol rechts neben bzw. unter mir.</span>
<db:navNewButton styleClass="clsButtonStyle" style="height:18px" showAlwaysInFooter="false" alt="button.nav.new" src="../../images/context_add.svg" id="new1" flavor="image"/></td><td class="naviBtn"><span connectId="ins1" dojoType="tooltip">Datensatz einf&uuml;gen. Wenn Sie einen neuen Datensatz erzeugt haben, k&ouml;nnen Sie diesen mit diesem Button speichern.</span>
<db:insertButton showAlways="false" style="height:18px" styleClass="clsButtonStyle" alt="Datensatz einf&uuml;gen" src="../../images/circle_tick.svg" id="ins1" flavor="image"/></td></tr>
</table>
</db:footer></db:dbform></body>
</html>

8
superx/edit/etl/saveEtlXml.jsp

@ -6,8 +6,8 @@ @@ -6,8 +6,8 @@
<%@ page import ="java.io.File" %>
<%@ page import ="java.io.FileWriter" %>
<%@ page import ="java.io.IOException" %>
<%@ page import ="de.superx.elt.EtlActionJob" %>
<%@ page import ="de.superx.elt.EtlUtils" %>
<%@ page import ="de.superx.etl.EtlActionJob" %>
<%@ page import ="de.superx.etl.EtlUtils" %>
<%@ page import ="de.superx.common.SxUser" %>
<html>
@ -63,7 +63,7 @@ String jobuniquename = request.getParameter("jobuniquename"); @@ -63,7 +63,7 @@ String jobuniquename = request.getParameter("jobuniquename");
params+=EtlUtils.NEWLINE+"PATH_TO_INPUTFILE="+temp.getAbsolutePath();
params+=EtlUtils.NEWLINE+"FORMAT=XML";
EtlActionJob myJob=new EtlActionJob(jobuniquename); //TODO:Mandantid
myJob.initJob(jobuniquename,params);
myJob.initJob("etl",jobuniquename,params);
returnCode= myJob.execute("");
returntext+=myJob.getActionLog().toString();
@ -123,7 +123,7 @@ String jobuniquename = request.getParameter("jobuniquename"); @@ -123,7 +123,7 @@ String jobuniquename = request.getParameter("jobuniquename");
<h2 class="subtitle">
<div id="MaskSubHeader">Ergebnis der Ausführung</div>
</h2>
<p>Status: <%="Code "+ returnCode+ "("+de.superx.elt.EtlUtils.translateReturnCode2Html(returnCode)+")"%>, Logausgabe:
<p>Status: <%="Code "+ returnCode+ "("+de.superx.elt.EtlUtils.translateReturnCode(returnCode)+")"%>, Logausgabe:
</p>
<div class="bd-snippet-code highlight-full ">
<figure class="highlight"><div class="buttons has-addons is-right">

63
superx/images/resultset_up.svg

@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="25"
height="25"
viewBox="0 0 6.6145832 6.6145835"
version="1.1"
id="svg3834"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="resultset_up.svg">
<defs
id="defs3828" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="400"
inkscape:cy="341"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1020"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
units="px" />
<metadata
id="metadata3831">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-290.3854)">
<path
d="m 4.9380207,294.92502 0.390805,-0.43943 q 0.07541,-0.0848 0.07541,-0.19273 0,-0.10793 -0.07541,-0.20044 l -1.734614,-1.95046 q -0.07542,-0.0771 -0.171407,-0.0771 -0.09599,0 -0.17826,0.0771 l -1.7346143,1.95046 q -0.06857,0.0848 -0.06857,0.20044 0,0.11564 0.06857,0.19273 l 0.3908013,0.43943 q 0.07542,0.0771 0.171406,0.0771 0.09599,0 0.171403,-0.0771 l 1.179264,-1.326 1.172408,1.326 q 0.07541,0.0771 0.171406,0.0771 0.09599,0 0.171402,-0.0771 z m 1.419232,-1.04846 q 0,0.90198 -0.390802,1.6575 -0.390804,0.75551 -1.069565,1.20265 -0.678764,0.44714 -1.474081,0.44714 -0.795316,0 -1.480937,-0.44714 -0.6856183,-0.44714 -1.06270933,-1.20265 -0.37709,-0.75552 -0.397659,-1.6575 -0.02059,-0.90199 0.397659,-1.6575 0.41823003,-0.75552 1.06270933,-1.20266 0.644482,-0.44714 1.480937,-0.44714 0.836456,0 1.474081,0.44714 0.637625,0.44714 1.069565,1.20266 0.431941,0.75551 0.390802,1.6575 z"
id="path3809"
inkscape:connector-curvature="0"
style="stroke-width:0.00727023" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

Loading…
Cancel
Save