From a5f12f59c9865820a1aefeaeae49bac569b33794 Mon Sep 17 00:00:00 2001 From: Daniel Quathamer Date: Mon, 3 Mar 2025 08:55:42 +0100 Subject: [PATCH] =?UTF-8?q?Sichten=20und=20Testf=C3=A4lle=20exportieren=20?= =?UTF-8?q?#5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 2 +- src-modules/module/etl/conf/etl.xml | 53 ++++ src-modules/module/etl/conf/includes.txt | 2 + .../module/etl/masken/42000_felderinfo.unl | 19 +- .../etl/masken/42000_masken_felder_bez.unl | 2 + .../create_load_etl_qa_project.sql | 22 ++ .../create_load_etl_sichten.sql | 49 ++++ .../schluesseltabellen/etl_manager_tab.unl | 3 + .../etl_manager_tab_prepare.sql | 12 + .../schluesseltabellen/etl_step_fuellen.sql | 67 ++++- .../schluesseltabellen/trans_etl_sichten.sql | 61 ++++ src/de/superx/elt/EtlUtils.java | 11 +- src/de/superx/sxrest/JobEtlXml.java | 213 ++++++++++++++ src/de/superx/sxrest/MaskXml.java | 5 +- superx/WEB-INF/lib/superx-etl.jar | Bin 80514 -> 83825 bytes superx/edit/etl/etl_manager.jsp | 277 +++++++++++------- superx/edit/etl/saveEtlXml.jsp | 143 +++++++++ superx/images/downloadblck.svg | 54 ++++ superx/images/eye.svg | 55 ++++ 19 files changed, 939 insertions(+), 111 deletions(-) create mode 100644 src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql create mode 100644 src-modules/module/etl/schluesseltabellen/create_load_etl_sichten.sql create mode 100644 src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl create mode 100644 src-modules/module/etl/schluesseltabellen/etl_manager_tab_prepare.sql create mode 100644 src-modules/module/etl/schluesseltabellen/trans_etl_sichten.sql create mode 100644 src/de/superx/sxrest/JobEtlXml.java create mode 100644 superx/edit/etl/saveEtlXml.jsp create mode 100644 superx/images/downloadblck.svg create mode 100644 superx/images/eye.svg diff --git a/.classpath b/.classpath index ee8d016..3b0f67c 100644 --- a/.classpath +++ b/.classpath @@ -4,7 +4,6 @@ - @@ -19,5 +18,6 @@ + diff --git a/src-modules/module/etl/conf/etl.xml b/src-modules/module/etl/conf/etl.xml index e753a1d..fc3ce99 100644 --- a/src-modules/module/etl/conf/etl.xml +++ b/src-modules/module/etl/conf/etl.xml @@ -38,6 +38,48 @@ rightname="CS_BIA_STANDARDREPORTS_ADMIN[ETL]" /> + + + Schlüsseltabelle für Ladejob im ETL-Manager + + + + + + + + + + + + + + + + superx + superx + etl_manager_tab + tid + 1 + etl_manager_tab_pk + + + + + +
+ @@ -334,7 +376,9 @@ parent="Laderoutinen">Abfragen zur Administration + + @@ -345,6 +389,10 @@ parent="Laderoutinen">Abfragen zur Administration + + + + @@ -368,6 +416,7 @@ version integer + @@ -376,6 +425,10 @@ version integer + + + + diff --git a/src-modules/module/etl/conf/includes.txt b/src-modules/module/etl/conf/includes.txt index e3887f0..290950c 100644 --- a/src-modules/module/etl/conf/includes.txt +++ b/src-modules/module/etl/conf/includes.txt @@ -1,4 +1,6 @@ doku/etl_modul/etl.html WEB-INF/conf/edustore/db/bin/SQL_ENV_etl.sam WEB-INF/lib/superx-etl.jar +images/eye.svg +images/downloadblck.svg diff --git a/src-modules/module/etl/masken/42000_felderinfo.unl b/src-modules/module/etl/masken/42000_felderinfo.unl index d267cf5..850a54f 100644 --- a/src-modules/module/etl/masken/42000_felderinfo.unl +++ b/src-modules/module/etl/masken/42000_felderinfo.unl @@ -3,4 +3,21 @@ 42002^Arten von Ladeschritten^100^0^0^150^300^1^char^30^0^18^^^<>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^<> select tid,name from systeminfo order by 2;^^^ -42005^ETL-Manager^1000^0^0^150^300^1^char^30^0^18^^^<>select '../edit/etl/etl_manager.jsp' from xdummy;^ +42005^Job-Management^1000^0^0^150^300^1^char^30^0^18^^^<>select '../edit/etl/etl_manager.jsp' from xdummy;^ +42006^Maske^1^0^0^100^380^1^integer^30^0^1^<> 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^<> --freemarker template\ +\ +\ +select 1 from xdummy where 0 < (select count(*) from db_version where his_system='qa')\ +union select 0 from xdummy where \ + 0 = (select count(*) from db_version where his_system='qa');\ +\ +\ +\ +<#if QA_installed==1>\ +select tid,name from qa_project where active=1 order by 2;\ +<#else>\ +select null::char(1),'Keine Auwahl möglich' from xdummy\ +\ +\ +/* <> */^ ^^ diff --git a/src-modules/module/etl/masken/42000_masken_felder_bez.unl b/src-modules/module/etl/masken/42000_masken_felder_bez.unl index 2aa3b27..cf98a24 100644 --- a/src-modules/module/etl/masken/42000_masken_felder_bez.unl +++ b/src-modules/module/etl/masken/42000_masken_felder_bez.unl @@ -4,3 +4,5 @@ 42000^42003^ 42000^42004^ 42000^42005^ +42000^42006^ +42000^42007^ diff --git a/src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql b/src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql new file mode 100644 index 0000000..e1ed224 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/create_load_etl_qa_project.sql @@ -0,0 +1,22 @@ +--Freemarker Template + +--used in etl-job sx_insert_mask +<#if SQLdialect='Postgres'> +drop table if exists tmp_etl_qa_project; +drop table if exists tmp_etl_sachgeb_sichtarten; + + + + +CREATE TABLE tmp_etl_qa_project( + +uniquename VARCHAR(255) , +name VARCHAR(255) , +systeminfo_id INTEGER , +sachgebiete_id INTEGER , +active SMALLINT , +created_from INTEGER , +issue_link VARCHAR(255) +) +; + diff --git a/src-modules/module/etl/schluesseltabellen/create_load_etl_sichten.sql b/src-modules/module/etl/schluesseltabellen/create_load_etl_sichten.sql new file mode 100644 index 0000000..d5d82c0 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/create_load_etl_sichten.sql @@ -0,0 +1,49 @@ +--Freemarker Template + +--used in etl-job sx_insert_mask +<#if SQLdialect='Postgres'> +drop table if exists tmp_etl_sichten; +drop table if exists tmp_etl_sachgeb_sichtarten; + + + + +CREATE TABLE tmp_etl_sichten ( + -- tid integer, + -- +-- parent CHAR(255) , +systeminfoid INTEGER default 0 not null, +art CHAR(40) , +type INTEGER default 10 not null, +name_intern CHAR(200) , +name CHAR(200) , +-- beschreibung CHAR(255) , +sortnr INTEGER default 0 not null, +quelle TEXT , +-- alt_hier_id CHAR(150) , +-- treecfgtable CHAR(255) , +-- treecfgid CHAR(150) , +-- label SMALLINT default 0 not null, +-- user_rechte SMALLINT default 1 not null, +-- rechtequelle CHAR(255) , +-- sesamkey CHAR(100) , +standbutton SMALLINT default 0 not null, +-- attribut1 CHAR(255) , +-- attribut2 CHAR(255) , +-- attribut3 INTEGER , +-- attribut4 INTEGER , +-- xmlmaxentries INTEGER , +-- gueltig_seit DATE default date('01.01.1900') not null, +-- gueltig_bis DATE default date('01.01.3000') not null, +-- cacheapplet CHAR(255) , +-- cachexml CHAR(255) , +aktiv SMALLINT default 1 +); + +create table tmp_etl_sachgeb_sichtarten( + sachgebiete_id INTEGER , +sichtart CHAR(255) +) +; + + diff --git a/src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl b/src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl new file mode 100644 index 0000000..95da8bf --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/etl_manager_tab.unl @@ -0,0 +1,3 @@ +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^ +3^QA_PROJECT^Testfälle^0^qa_project_unload^qa_project_upload^QA_PROJECT_ID^42000^42007^1^ diff --git a/src-modules/module/etl/schluesseltabellen/etl_manager_tab_prepare.sql b/src-modules/module/etl/schluesseltabellen/etl_manager_tab_prepare.sql new file mode 100644 index 0000000..0c5a9b9 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/etl_manager_tab_prepare.sql @@ -0,0 +1,12 @@ +--freemarker template + + +select 1 from xdummy where 0 < (select count(*) from db_version where his_system='qa') +union select 0 from xdummy where + 0 = (select count(*) from db_version where his_system='qa'); + + + +<#if QA_installed==0> +update etl_manager_tab set active=0 where uniquename='QA_PROJECT'; + diff --git a/src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql b/src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql index 7ec701c..5cf0f51 100644 --- a/src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql +++ b/src-modules/module/etl/schluesseltabellen/etl_step_fuellen.sql @@ -8,7 +8,9 @@ {"uniquename":"sx_insert_mask", "name":"Maske hochladen", "systeminfo_id":270 ,"logfile":""}, {"uniquename":"kern_konstanten_update", "name":"Konstanten aktualisieren", "systeminfo_id":270 ,"logfile":""}, {"uniquename":"sichten_unload", "name":"Sichten entladen", "systeminfo_id":270 ,"logfile":""}, - {"uniquename":"sos_gewichtung_unload", "name":"Gewichtungen 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":""} ] /> @@ -25,10 +27,20 @@ {"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":"SYSTEMINFO_ID", "name":"Komponente", "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":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"}, + {"etl_job":"sichten_upload","param_name":"SYSTEMINFO_ID", "name":"Komponente", "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"}, + + {"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":"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"}, {"etl_job":"sos_gewichtung_unload","param_name":"FORMAT", "name":"Ausgabeformat", "param_default":"XML"} @@ -78,12 +90,25 @@ {"etl_job":"sichten_unload", "uniquename":"unload_sichten_ges", "name":"Sichten entladen", "type":"MSG"}, {"etl_job":"sichten_unload", "uniquename":"unload_sichtentab", "name":"Sichten entladen", "type":"UNLOAD", "parent":"unload_sichten_ges"}, - {"etl_job":"sichten_unload", "uniquename":"unload_sichten_sachgeb", "name":"Sachgebiete von Sichtarten entladen", "type":"UNLOAD", "parent":"unload_sichten_ges"}, + {"etl_job":"sichten_unload", "uniquename":"unload_sichten_sachgeb", "name":"Sachgebiete von Sichten entladen", "type":"UNLOAD", "parent":"unload_sichten_ges"}, + {"etl_job":"sichten_upload", "uniquename":"create_tmp_etl_sichten", "name":"Tabelle tmp_etl_sichten erzeugen", "type":"DOSQL" }, + {"etl_job":"sichten_upload", "uniquename":"upload_tmp_etl_sichten", "name":"tmp_etl_sichten hochladen", "type":"LOAD" }, + {"etl_job":"sichten_upload", "uniquename":"upload_tmp_etl_sachgeb_sichtarten", "name":"upload_tmp_etl_sachgeb_sichtarten hochladen", "type":"LOAD" }, + {"etl_job":"sichten_upload", "uniquename":"trans_etl_sichten", "name":"etl_sichten füllen", "type":"DOSQL" }, {"etl_job":"sos_gewichtung_unload", "uniquename":"unload_sos_gewichtung_ges", "name":"Gewichtungen entladen", "type":"MSG"}, - {"etl_job":"sos_gewichtung_unload", "uniquename":"unload_sos_gewichtung", "name":"Gewichtungen entladen", "type":"UNLOAD", "parent":"unload_sos_gewichtung_ges"} - + {"etl_job":"sos_gewichtung_unload", "uniquename":"unload_sos_gewichtung", "name":"Gewichtungen entladen", "type":"UNLOAD", "parent":"unload_sos_gewichtung_ges"}, + + {"etl_job":"qa_project_unload", "uniquename":"qa_project_unload_ges", "name":"Testfall-Projekt entladen", "type":"MSG"}, + {"etl_job":"qa_project_unload", "uniquename":"unload_qa_project_tab", "name":"Projekte entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"}, + {"etl_job":"qa_project_unload", "uniquename":"unload_qa_resultset_tab", "name":"Resultsets entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"}, + {"etl_job":"qa_project_unload", "uniquename":"unload_qa_dbtest_tab", "name":"DB-Tests entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"}, + {"etl_job":"qa_project_unload", "uniquename":"unload_qa_dbtest_assertion_tab", "name":"DB-Test Erwartungen entladen", "type":"UNLOAD", "parent":"qa_project_unload_ges"}, + {"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"} ] /> @@ -151,17 +176,43 @@ {"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":"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" }, + {"etl_step":"upload_tmp_etl_sichten","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_sichtentab\"]/rs/row" }, + {"etl_step":"upload_tmp_etl_sichten","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" }, + + {"etl_step":"upload_tmp_etl_sachgeb_sichtarten","prop_name":"target_table", "prop_value":"tmp_etl_sachgeb_sichtarten" }, + {"etl_step":"upload_tmp_etl_sachgeb_sichtarten","prop_name":"format", "prop_value":"xml" }, + {"etl_step":"upload_tmp_etl_sachgeb_sichtarten","prop_name":"search_path", "prop_value":"/etlAction/unload [@name=\"unload_sichten_sachgeb\"]/rs/row" }, + {"etl_step":"upload_tmp_etl_sachgeb_sichtarten","prop_name":"path_to_inputfile", "prop_value":"$PATH_TO_INPUTFILE" }, + + + {"etl_step":"trans_etl_sichten","prop_name":"PATH_TO_INPUTFILE", "prop_value":"$SUPERX_DIR/db/module/etl/schluesseltabellen/trans_etl_sichten.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":"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 FROM sichten S where S.systeminfoid= $SYSTEMINFO_ID 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= $SYSTEMINFO_ID) order by 1,2;" }, + {"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_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_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":"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_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;" } diff --git a/src-modules/module/etl/schluesseltabellen/trans_etl_sichten.sql b/src-modules/module/etl/schluesseltabellen/trans_etl_sichten.sql new file mode 100644 index 0000000..2e24554 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/trans_etl_sichten.sql @@ -0,0 +1,61 @@ + +update sichten set systeminfoid=T.systeminfoid, +art=T.art, +type=T.type, +name=T.name, +quelle=T.quelle , +sortnr=T.sortnr, +standbutton=T.standbutton, +aktiv=T.aktiv + +from tmp_etl_sichten T + where T.name_intern=sichten.name_intern + and sichten.name_intern in (select T2.name_intern from tmp_etl_sichten T2) +; + +delete from tmp_etl_sichten where name_intern in (select name_intern from sichten); + +INSERT INTO sichten( + systeminfoid , + art , + type , + name_intern , + name , + sortnr , + quelle , + standbutton , + gueltig_seit , + gueltig_bis , + aktiv) + select systeminfoid , + art , + type , + name_intern , + name , + sortnr , + quelle , + standbutton , + date_val('01.01.1900') as gueltig_seit , + date_val('01.01.3000') as gueltig_bis , + aktiv + from tmp_etl_sichten S; + + +delete from sachgeb_sichtarten + where (sachgebiete_id , +sichtart) in +(select sachgebiete_id , +sichtart from tmp_etl_sachgeb_sichtarten); + +insert into sachgeb_sichtarten( +sachgebiete_id , +sichtart) +select +sachgebiete_id , +sichtart +from tmp_etl_sachgeb_sichtarten; + + +drop table if exists tmp_etl_sichten; +drop table if exists tmp_etl_sachgeb_sichtarten; + diff --git a/src/de/superx/elt/EtlUtils.java b/src/de/superx/elt/EtlUtils.java index fee9be3..d6853ea 100644 --- a/src/de/superx/elt/EtlUtils.java +++ b/src/de/superx/elt/EtlUtils.java @@ -315,7 +315,7 @@ public static String getFileContentsWithEncoding(String filePath, String encodin * @throws IOException * @throws XPathExpressionException */ - public static boolean isNodeValueInXml(String src, String searchPath, String expectedValue) + 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); @@ -341,4 +341,13 @@ public static String getFileContentsWithEncoding(String filePath, String encodin returnString="Erfolg"; return returnString; } + public static String translateReturnCode2Html(int returnCode) + { + String returnString=translateReturnCode(returnCode); + if(returnCode==0) + returnString=""+returnString+""; + else + returnString=""+returnString+""; + return returnString; + } } diff --git a/src/de/superx/sxrest/JobEtlXml.java b/src/de/superx/sxrest/JobEtlXml.java new file mode 100644 index 0000000..1b29b26 --- /dev/null +++ b/src/de/superx/sxrest/JobEtlXml.java @@ -0,0 +1,213 @@ +/* + * de.superx.etl - a package for controlling ETL routines + * Copyright (C) 2021 Daniel Quathamer + * + * 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; + } + +} diff --git a/src/de/superx/sxrest/MaskXml.java b/src/de/superx/sxrest/MaskXml.java index d8018e7..1fc5b46 100644 --- a/src/de/superx/sxrest/MaskXml.java +++ b/src/de/superx/sxrest/MaskXml.java @@ -147,11 +147,12 @@ public class MaskXml { @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=\"sx_select_mask\"]/unload[@name=\"unload_maskeninfo\"]/rs/row/fld[@name=\"tid\"]"; + String searchString="/etlAction[@name=\""+jobuniquename+"\"]/unload[@name=\"unload_maskeninfo\"]/rs/row/fld[@name=\"tid\"]"; if(mandantenid==null || mandantenid.equals("")) mandantenid="default"; @@ -162,7 +163,7 @@ public class MaskXml { else { try { - if(de.superx.elt.EtlUtils.isNodeValueInXml(src,searchString,tid)) + if(de.superx.elt.EtlUtils.isNodeValueInXml(src,searchString,tid,jobuniquename)) { String job="sx_insert_mask"; returntext="TID="+tid; diff --git a/superx/WEB-INF/lib/superx-etl.jar b/superx/WEB-INF/lib/superx-etl.jar index 5868d66aff10c4bd2b889b34908f6c273b6d8dfa..dffd3b2964fde783eb23c0d462d562b1e12bc12e 100644 GIT binary patch delta 12914 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 diff --git a/superx/edit/etl/etl_manager.jsp b/superx/edit/etl/etl_manager.jsp index f0188a4..757e910 100644 --- a/superx/edit/etl/etl_manager.jsp +++ b/superx/edit/etl/etl_manager.jsp @@ -1,7 +1,10 @@ <%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %> <%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %> <%@ page import ="de.superx.servlet.ServletUtils" %> -<%@ page import ="de.superx.servlet.SxPools" %> +<%@ page import ="de.superx.servlet.SxPools,java.util.ArrayList" %> +<%@ page import ="org.dbforms.config.DbFormsConfigRegistry,java.sql.Connection,java.sql.Statement,java.sql.ResultSet,de.superx.common.SxUser" %> + + @@ -10,9 +13,12 @@ ETL Manager - + + + + <% @@ -148,8 +186,71 @@ String tab = request.getParameter("tab"); if(tab == null) tab=""; +//Daten aus Datenbank werden in Variablen gespeichert +Connection conmm=null; + +class etlJob{ +String tabUniquename; +String tabCaption; +String jobExportUniquename; +String jobImportUniquename; +String jobParamFieldname; +String jobParamFieldTid; +String jobParamMaskTid; +String jobParamName; +} + +ArrayList etlJobs = new ArrayList(); + + + +//out.println("Getting Connection for mandantenid="+mandantenid); +try { + +conmm = DbFormsConfigRegistry.instance().lookup().getConnection(mandantenid); +//System.out.println("Got Connection"); +Statement st; + +st=conmm.createStatement(); + +ResultSet rs; +String sqlQueryEtlManagerTab="select T.caption,T.uniquename,T.tid,T.job_export,T.job_import,T.maskeninfo_id,T.felderinfo_id"; +sqlQueryEtlManagerTab+=", F.name as feldname,T.job_param_ui "; +sqlQueryEtlManagerTab+=" from etl_manager_tab T, felderinfo F where T.felderinfo_id=F.tid and T.active=1"; +sqlQueryEtlManagerTab+=" order by 1"; +rs = st.executeQuery(sqlQueryEtlManagerTab); +int i=0; +while (rs.next()) { +etlJob myJob=new etlJob(); +myJob.tabCaption=rs.getString(1); +myJob.tabUniquename=rs.getString(2); +myJob.jobExportUniquename=rs.getString(4); +myJob.jobImportUniquename=rs.getString(5); +myJob.jobParamMaskTid=rs.getString(6); +myJob.jobParamFieldTid=rs.getString(7); +myJob.jobParamFieldname=rs.getString(8); +myJob.jobParamName=rs.getString(9); + + +etlJobs.add(myJob); + i++; +} +rs.close(); +st.close(); +conmm.close(); + +} //Check DB connection +catch (Exception e) { +out.print("Fehler bei Datenverbindung: "+e+ " MandantID"+mandantenid +""); +} + + +etlJob[] etlJobsArr=new etlJob[etlJobs.size()]; +etlJobsArr=etlJobs.toArray(etlJobsArr); %> + +