From f68e5347bbb02b71c8b544952ca2f80e252be77d Mon Sep 17 00:00:00 2001 From: Meikel Bisping Date: Mon, 20 Jan 2025 11:35:09 +0100 Subject: [PATCH 1/5] Auch von Masken KettleJobs ausfuehren lassen (cherry picked from commit 460037bf0e86b5ff044d3fd29ad4a4f276abe8be) --- src/de/superx/bin/fm/EtlStarter.java | 134 ++++++++++++++++++--------- 1 file changed, 90 insertions(+), 44 deletions(-) diff --git a/src/de/superx/bin/fm/EtlStarter.java b/src/de/superx/bin/fm/EtlStarter.java index 2d32f61..f57222a 100644 --- a/src/de/superx/bin/fm/EtlStarter.java +++ b/src/de/superx/bin/fm/EtlStarter.java @@ -4,6 +4,10 @@ import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -40,9 +44,11 @@ public class EtlStarter implements TemplateTransformModel { private static Logger logger = Logger.getLogger(EtlStarter.class); private String mandantenId = "default"; private LogLevel logLevel = LogLevel.BASIC; - public EtlStarter(String mandantenId) { - this.mandantenId = mandantenId; - } + + public EtlStarter(String mandantenId) { + this.mandantenId = mandantenId; + } + @Override public Writer getWriter(Writer paramWriter, Map paramMap) throws TemplateModelException, IOException { logger.info("**EtlStarter**"); @@ -61,11 +67,11 @@ public class EtlStarter implements TemplateTransformModel { paramMap.remove(PARAM_KEY_COMP); paramMap.remove(PARAM_KEY_STEP); paramMap.remove(PARAM_LOGLEVEL); - + if (log_levelSc != null) { this.logLevel = LogLevel.valueOf(log_levelSc.getAsString()); } - + Map params = new HashMap(); for (Object key : paramMap.keySet()) { SimpleScalar value = (SimpleScalar) paramMap.get(key); @@ -73,7 +79,49 @@ public class EtlStarter implements TemplateTransformModel { logger.info("PARAM: " + key + " -> " + value.getAsString()); } - String moduleDir=SuperXManager.getModuleDir()+ File.separator + component + File.separator; + String moduleDir = SuperXManager.getModuleDir(); + if (moduleDir == null || moduleDir.equals("")) { + if (System.getProperty("MODULE_PFAD") != null && !System.getProperty("MODULE_PFAD").toString().equals("")) + moduleDir = System.getProperty("MODULE_PFAD").toString(); + else + throw new IOException( + "Module-Pfad kann nicht ermittelt werden, bitte setzen Sie den JVM Parameter -DMODULE_PFAD=..."); + } + String jobFilePath = null; + if (component.contentEquals("manual")) { + jobFilePath = getFilePathFromDatabase(etl_step, moduleDir); + } else { + jobFilePath = getFilePathFromModule(component, etl_step, moduleDir); + } + logger.info("Kettle job: " + jobFilePath); + kettleCallEmbedded(jobFilePath, params); + return null; + } + + private String getFilePathFromDatabase(String etl_step, String moduleDir) throws IOException { + String jobFilePath = null; + try (Connection con = SxPools.get(mandantenId).getConnection(); + PreparedStatement pst = con.prepareStatement("select filepath from sx_jobs where uniquename=?")) { + pst.setString(1, etl_step); + ResultSet rs = pst.executeQuery(); + while (rs.next()) { + jobFilePath = rs.getString(1); + } + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + throw new IOException("Fehler beim Auslesen von sx_jobs mit uniquename " + etl_step + " " + e); + } + if (jobFilePath == null) { + throw new IOException( + "Fehler beim Auslesen von sx_jobs mit uniquename " + etl_step + " Kein Eintrag gefunden"); + } + return moduleDir + File.separator + jobFilePath; + } + + private String getFilePathFromModule(String component, String etl_step, String moduleDir) + throws TemplateModelException { + moduleDir += File.separator + component + File.separator; if (!(new File(moduleDir)).exists()) { throw new TemplateModelException("Component not found: " + component); } @@ -96,44 +144,39 @@ public class EtlStarter implements TemplateTransformModel { } String fileAttr = etl.attributeValue("file"); String jobFilePath = moduleDir + fileAttr.substring(fileAttr.indexOf('/') + 1); - logger.info("Kettle job: " + jobFilePath); - kettleCallEmbedded(jobFilePath, params); - return null; + return jobFilePath; } /** * Abarbeiten des Kettle Jobs mit kettle (Embedded). * - * @param jobfile - * Dateiname des Jobs - * @param jobtype - * ktr=Transformation, kjb=Job - * @param params - * Parameter + * @param jobfile Dateiname des Jobs + * @param jobtype ktr=Transformation, kjb=Job + * @param params Parameter * @throws Exception */ final StringBuffer kettleCallEmbedded(final String jobfile, final Map jobParams) { - return kettleCallEmbedded("default",jobfile, jobParams, true); + return kettleCallEmbedded("default", jobfile, jobParams, true); } /** * Abarbeiten des Kettle Jobs mit kettle (Embedded). * - * @param jobfile - * Dateiname des Jobs - * @param params - * Parameter - * @param isPostgres - für Metainformationen, wenn false dann wird Informix genommen - * @return StringBuffer mit Logging für Ausgabe im Browser + * @param jobfile Dateiname des Jobs + * @param params Parameter + * @param isPostgres - für Metainformationen, wenn false dann wird Informix + * genommen + * @return StringBuffer mit Logging für Ausgabe im Browser * @throws Exception */ - public final StringBuffer kettleCallEmbedded(final String mandantenID,final String jobfile, final Map jobParams, boolean isPostgres) { + public final StringBuffer kettleCallEmbedded(final String mandantenID, final String jobfile, + final Map jobParams, boolean isPostgres) { StringWriter writer = new StringWriter(); - WriterAppender appender = new WriterAppender( new SimpleLayout(), writer ); - org.apache.log4j.Level oldLevel=logger.getLevel(); + WriterAppender appender = new WriterAppender(new SimpleLayout(), writer); + org.apache.log4j.Level oldLevel = logger.getLevel(); logger.setLevel(org.apache.log4j.Level.ALL); - logger.addAppender( appender ); - + logger.addAppender(appender); + try { // usually we initialize kettle env in EdustoreManager // but this may not have happened if HIS1 not running @@ -146,26 +189,29 @@ public class EtlStarter implements TemplateTransformModel { } JndiUtil.initJNDI(); MemoryMetaStore metastore = new MemoryMetaStore(); - //Dies hatte für Mandantenbetrieb nicht funktioniert, daher Umstellung auf SxPool , s.u. - //DataSourceProviderFactory.setDataSourceProviderInterface(new KettleDataSourceProvider(mandantenID,logger)); + // Dies hatte für Mandantenbetrieb nicht funktioniert, daher Umstellung auf + // SxPool , s.u. + // DataSourceProviderFactory.setDataSourceProviderInterface(new + // KettleDataSourceProvider(mandantenID,logger)); /* - * get all db connections configured in databases.xml as - * DataSource's by name + * get all db connections configured in databases.xml as DataSource's by name */ - - // Enumeration dbNames = + + // Enumeration dbNames = // this.dbhandlerPool.getLogicalDatabaseNames(); List dbNames = Arrays.asList(new String[] { "eduetl" }); for (String dbName : dbNames) { - // Dies hatte für Mandantenbetrieb nicht funktioniert, daher Umstellung auf SxPool , s.u. - - //DatabaseMeta dbmeta = new DatabaseMeta(dbName, isPostgres ? "POSTGRESQL" : "INFORMIX", "JNDI", null, dbName, "1521", null, null); - DatabaseMeta dbmeta=SxPools.get(mandantenID).getKettleDatabaseMeta(); - DatabaseMetaStoreUtil.createDatabaseElement(metastore, dbmeta); - - logger.info("Init pdi database connection " + dbName+" (DBName:"+dbmeta.getDatabaseName()+")"); + // Dies hatte für Mandantenbetrieb nicht funktioniert, daher Umstellung auf + // SxPool , s.u. + + // DatabaseMeta dbmeta = new DatabaseMeta(dbName, isPostgres ? "POSTGRESQL" : + // "INFORMIX", "JNDI", null, dbName, "1521", null, null); + DatabaseMeta dbmeta = SxPools.get(mandantenID).getKettleDatabaseMeta(); + DatabaseMetaStoreUtil.createDatabaseElement(metastore, dbmeta); + + logger.info("Init pdi database connection " + dbName + " (DBName:" + dbmeta.getDatabaseName() + ")"); } - + JobMeta jobMeta = new JobMeta(null, jobfile, null, metastore, null); org.pentaho.di.job.Job job = new org.pentaho.di.job.Job(null, jobMeta); job.setLogLevel(this.logLevel); @@ -204,16 +250,16 @@ public class EtlStarter implements TemplateTransformModel { logger.removeAppender(appender); logger.setLevel(oldLevel); } - + return writer.getBuffer(); } - + public static void main(String args[]) { String jobfile = "file:///home/superx/data-integration/exceltest.kjb"; Map jobParams = new HashMap(); jobParams.put("PATH_TO_EXCELFILE", "/home/superx/tmp/testexcel2.xlsx"); EtlStarter es = new EtlStarter("default"); - es.kettleCallEmbedded("default",jobfile, jobParams,false); + es.kettleCallEmbedded("default", jobfile, jobParams, false); } } From 0ca2db28e10a33a5a84362360e812191653807c3 Mon Sep 17 00:00:00 2001 From: Meikel Bisping Date: Thu, 6 Feb 2025 11:42:57 +0100 Subject: [PATCH 2/5] sqlvar exportfilename fuer Exportdateinamen auswerten #33694 --- src/de/superx/common/Maske.java | 27 ++++++++++++++-------- src/de/superx/servlet/SuperXmlTabelle.java | 16 ++++++------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/de/superx/common/Maske.java b/src/de/superx/common/Maske.java index afbf0da..3287d38 100644 --- a/src/de/superx/common/Maske.java +++ b/src/de/superx/common/Maske.java @@ -2576,16 +2576,23 @@ public class Maske extends NamedIdObject implements Serializable { } /** - * Normalerweise Maskenname nur bei JasperReports der Stylesheetname - * - * @return - */ - public String getExportName() { - String result = getName(); - if (selectedTableStylesheet != null && selectedTableStylesheet.getFilename().indexOf(".jrxml") > -1) - result = selectedTableStylesheet.getCaption(); - return result; - } + * Normalerweise Maskenname nur bei JasperReports der Stylesheetname + * + * @return + */ + public String getExportName() { + String result = getName(); + if (selectedTableStylesheet != null && selectedTableStylesheet.getFilename().indexOf(".jrxml") > -1) result = selectedTableStylesheet.getCaption(); + if (map.containsKey("exportfilename")) + { + if (map.get("exportfilename")==null||map.get("exportfilename").toString().trim().equals("")) + { + throw new IllegalStateException("Die Maske definiert exportfilename, dieser ist aber leer. Masken-SQL prüfen"); + } + result=map.get("exportfilename").toString(); + } + return result; + } public String getFullTableXml(String mandantenId, SxUser sxuser, HttpServletRequest request, Locale locale) throws TransformerConfigurationException, TemplateException, IOException, SQLException, diff --git a/src/de/superx/servlet/SuperXmlTabelle.java b/src/de/superx/servlet/SuperXmlTabelle.java index 83eddd6..e436732 100644 --- a/src/de/superx/servlet/SuperXmlTabelle.java +++ b/src/de/superx/servlet/SuperXmlTabelle.java @@ -511,7 +511,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { response.reset(); //response.setContentType("application/vnd.ms-excel"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + ".xlsx"); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + ".xlsx"); response.setHeader("Cache-Control", "expires=0"); response.setContentLength(outStream.size()); ServletOutputStream sos; @@ -716,7 +716,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { SuperXManager.setLastXmlMandantid(request.getSession().getAttribute("MandantenID").toString()); XmlTransformer xmlTransformer = new XmlTransformer(getServletConfig(), request, response, getMandantenID(), getBrowser()); xmlTransformer.setMaske(maske); - xmlTransformer.transform(maske.getName(), maske.getTmpFiles(), currentXml, desiredLocale, maske.getSelectedTableStylesheetFilename(), "text/html", + xmlTransformer.transform(maske.getExportName(), maske.getTmpFiles(), currentXml, desiredLocale, maske.getSelectedTableStylesheetFilename(), "text/html", ServletHelper.getParameter(request, "encrypt")); @@ -931,7 +931,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { // neu MB if (maske.getSelectedTableStylesheetFilename() != null && maske.getSelectedTableStylesheetFilename().equals("tabelle_xml.xsl")) { response.setContentType("application/x-xml; charset=" + SqlStringUtils.getEncoding()); - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + ".xml"); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + ".xml"); response.setHeader("Cache-Control", "expires=0"); // hier wird für xml-output localiziert für andere // formate in xmlTransformer könnte @@ -1021,7 +1021,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { // open browser download dialogue response.setContentType("application/x-xml; charset=" + SqlStringUtils.getEncoding()); - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + filename_extension); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + filename_extension); response.setHeader("Cache-Control", "expires=0"); } } @@ -1029,7 +1029,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { getServletConfig(), request, response, getMandantenID(), getBrowser()); xmlTransformer.setMaske(maske); - xmlTransformer.transform(maske.getName(), + xmlTransformer.transform(maske.getExportName(), maske.getTmpFiles(), currentXml, desiredLocale, maske.getSelectedTableStylesheetFilename(), maske.getSelectedTableStylesheetContenttype(contenttype), @@ -1075,7 +1075,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { if (SxPools.get(getMandantenID()).getRepository().containsKey("K_CSV_Excel_ISO")&&SxPools.get(getMandantenID()).getRepository().get("K_CSV_Excel_ISO").toString().equals("1")) { outp = new String(csv.toString().getBytes("iso-8859-1")); - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + ".csv"); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + ".csv"); response.setHeader("Cache-Control", "expires=0"); response.setHeader("ContentType", "text/plain"); //; charset=ISO-8859-1 sendBackIso(csv.toString(), "text/csv; charset=ISO-8859-1"); @@ -1084,7 +1084,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { { //Format bis 2024.06: - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + ".csv"); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + ".csv"); response.setHeader("Cache-Control", "expires=0"); sendBack(csv.toString(), "text/csv"); @@ -1936,7 +1936,7 @@ public class SuperXmlTabelle extends AbstractSuperXServlet { String filename_extension=".jrxml"; OutputStream out = response.getOutputStream(); // open browser download dialogue - response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getName()) + filename_extension); + response.setHeader("Content-disposition", "attachment; filename=" + FileUtils.removeProblemChars(maske.getExportName()) + filename_extension); response.setHeader("Cache-Control", "expires=0"); String jrxmlFileContent = de.memtext.util.FileUtils.getFileContentsWithEncoding(jrxmlFilePath, SqlStringUtils.getEncoding()); From 89163470a704d014b83ec5a3a47e2d31e0af02b6 Mon Sep 17 00:00:00 2001 From: Meikel Bisping Date: Thu, 6 Feb 2025 11:45:56 +0100 Subject: [PATCH 3/5] Portlets auch anzeigen, wenn keine spezielles loginPortlet in Datenbank hinterlegt --- superx/index.jsp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/superx/index.jsp b/superx/index.jsp index a3822b8..936b94c 100644 --- a/superx/index.jsp +++ b/superx/index.jsp @@ -249,8 +249,8 @@ username=request.getRemoteUser(); <% } -else -{ +//else +//{ %>
@@ -280,7 +280,7 @@ rs.close(); st.close(); conmm.close(); -} +//} %> From 111e6a19b5b2d932c61c6a022b96178fd72079ee Mon Sep 17 00:00:00 2001 From: Andre Knieschewski Date: Thu, 6 Feb 2025 14:56:36 +0100 Subject: [PATCH 4/5] Login mit LDAP oder SuperX --- superx/index.jsp | 6 +++- superx/sx_login.jsp | 76 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 superx/sx_login.jsp diff --git a/superx/index.jsp b/superx/index.jsp index 936b94c..639c0b5 100644 --- a/superx/index.jsp +++ b/superx/index.jsp @@ -16,6 +16,10 @@ if(mandantparam !=null && !mandantenid.equals("")) String username=""; String loginPortlet=""; +String login_param=request.getParameter("login"); +if(login_param ==null) + login_param=""; + StringBuffer defaultReport=new StringBuffer(); String defaultReportParam=request.getParameter("report_id"); String defaultMandantenIDParam=request.getParameter("MandantID"); @@ -245,7 +249,7 @@ username=request.getRemoteUser(); { %> -<%@ include file="sx_login.inc" %> +<%@ include file="sx_login.jsp" %> <% } diff --git a/superx/sx_login.jsp b/superx/sx_login.jsp new file mode 100644 index 0000000..075bb51 --- /dev/null +++ b/superx/sx_login.jsp @@ -0,0 +1,76 @@ +
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+   +

Willkommen bei SuperX.

+

Bitte melden Sie sich an.

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + + + + + + +
+
+
+ + + + + +
+
+
+
+
+
From 09b7f38a23421a41d6e719344988277d59c5b352 Mon Sep 17 00:00:00 2001 From: Daniel Quathamer Date: Mon, 10 Feb 2025 09:37:47 +0100 Subject: [PATCH 5/5] Layout Listendialog korrigiert #7 --- superx/edit/kern/maske_combo_laden.jsp | 104 ++++++++++++------------- superx/style/sx_common.css | 12 ++- superx/xml/nd_templates.xsl | 5 +- 3 files changed, 62 insertions(+), 59 deletions(-) diff --git a/superx/edit/kern/maske_combo_laden.jsp b/superx/edit/kern/maske_combo_laden.jsp index 7de46d2..15fd51f 100644 --- a/superx/edit/kern/maske_combo_laden.jsp +++ b/superx/edit/kern/maske_combo_laden.jsp @@ -42,35 +42,32 @@ callurl+=params; Auswahl <%=fname %>