From 18e494fd12b7d591f3b1eb7589dcee6416621176 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 22 Mar 2016 19:12:26 +0100 Subject: [PATCH] IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail --- .../oracle/201603221737_IDEMPIERE-3057.sql | 19 +++ .../201603221737_IDEMPIERE-3057.sql | 16 ++ .../model/X_AD_Package_Exp_Detail.java | 4 +- org.adempiere.pipo.handlers/plugin.xml | 4 + .../handler/SQLMandatoryElementHandler.java | 142 ++++++++++++++++++ .../handler/SQLStatementElementHandler.java | 4 +- .../org/adempiere/pipo2/PackOutProcess.java | 4 +- 7 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 migration/i3.1/oracle/201603221737_IDEMPIERE-3057.sql create mode 100644 migration/i3.1/postgresql/201603221737_IDEMPIERE-3057.sql create mode 100644 org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java diff --git a/migration/i3.1/oracle/201603221737_IDEMPIERE-3057.sql b/migration/i3.1/oracle/201603221737_IDEMPIERE-3057.sql new file mode 100644 index 0000000000..7de443ebf7 --- /dev/null +++ b/migration/i3.1/oracle/201603221737_IDEMPIERE-3057.sql @@ -0,0 +1,19 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail +-- Mar 22, 2016 5:34:50 PM CET +INSERT INTO AD_Ref_List (AD_Ref_List_ID,Name,AD_Reference_ID,Value,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,AD_Ref_List_UU) VALUES (200356,'SQL Mandatory',50004,'SQM',0,0,'Y',TO_DATE('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,'D','63605262-3ba3-4140-b839-4e5b0f8ad23d') +; + +-- Mar 22, 2016 5:35:42 PM CET +UPDATE AD_Field SET DisplayLogic='@Type@=''D''|Type@=''SQL''|Type@=''SQM''',Updated=TO_DATE('2016-03-22 17:35:42','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50105 +; + +-- Mar 22, 2016 5:39:53 PM CET +UPDATE AD_Field SET DisplayLogic='@Type@=''SQL''|@Type@=''SQM''',Updated=TO_DATE('2016-03-22 17:39:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50104 +; + +SELECT register_migration_script('201603221737_IDEMPIERE-3057.sql') FROM dual +; + diff --git a/migration/i3.1/postgresql/201603221737_IDEMPIERE-3057.sql b/migration/i3.1/postgresql/201603221737_IDEMPIERE-3057.sql new file mode 100644 index 0000000000..4a00c24928 --- /dev/null +++ b/migration/i3.1/postgresql/201603221737_IDEMPIERE-3057.sql @@ -0,0 +1,16 @@ +-- IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail +-- Mar 22, 2016 5:34:50 PM CET +INSERT INTO AD_Ref_List (AD_Ref_List_ID,Name,AD_Reference_ID,Value,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,AD_Ref_List_UU) VALUES (200356,'SQL Mandatory',50004,'SQM',0,0,'Y',TO_TIMESTAMP('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,'D','63605262-3ba3-4140-b839-4e5b0f8ad23d') +; + +-- Mar 22, 2016 5:35:42 PM CET +UPDATE AD_Field SET DisplayLogic='@Type@=''D''|Type@=''SQL''|Type@=''SQM''',Updated=TO_TIMESTAMP('2016-03-22 17:35:42','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50105 +; + +-- Mar 22, 2016 5:39:53 PM CET +UPDATE AD_Field SET DisplayLogic='@Type@=''SQL''|@Type@=''SQM''',Updated=TO_TIMESTAMP('2016-03-22 17:39:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50104 +; + +SELECT register_migration_script('201603221737_IDEMPIERE-3057.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_Package_Exp_Detail.java b/org.adempiere.base/src/org/compiere/model/X_AD_Package_Exp_Detail.java index 36d400f806..79d2e829c8 100644 --- a/org.adempiere.base/src/org/compiere/model/X_AD_Package_Exp_Detail.java +++ b/org.adempiere.base/src/org/compiere/model/X_AD_Package_Exp_Detail.java @@ -30,7 +30,7 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta /** * */ - private static final long serialVersionUID = 20151030L; + private static final long serialVersionUID = 20160322L; /** Standard Constructor */ public X_AD_Package_Exp_Detail (Properties ctx, int AD_Package_Exp_Detail_ID, String trxName) @@ -913,6 +913,8 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta public static final String TYPE_ModelValidator = "MV"; /** Entity Type = ET */ public static final String TYPE_EntityType = "ET"; + /** SQL Mandatory = SQM */ + public static final String TYPE_SQLMandatory = "SQM"; /** Set Type. @param Type Type of Validation (SQL, Java Script, Java Language) diff --git a/org.adempiere.pipo.handlers/plugin.xml b/org.adempiere.pipo.handlers/plugin.xml index 911e41bc7d..20e921045b 100644 --- a/org.adempiere.pipo.handlers/plugin.xml +++ b/org.adempiere.pipo.handlers/plugin.xml @@ -152,6 +152,10 @@ class="org.adempiere.pipo2.handler.SQLStatementElementHandler" id="SQLStatement"> + + diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java new file mode 100644 index 0000000000..8de3d8e3f5 --- /dev/null +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java @@ -0,0 +1,142 @@ +/********************************************************************** +* This file is part of iDempiere ERP Open Source * +* http://www.idempiere.org * +* * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Trek Global * +* - Carlos Ruiz - globalqss * +**********************************************************************/ + +package org.adempiere.pipo2.handler; + +import java.sql.PreparedStatement; +import java.sql.Statement; +import java.util.logging.Level; + +import javax.xml.transform.sax.TransformerHandler; + +import org.adempiere.exceptions.AdempiereException; +import org.adempiere.pipo2.AbstractElementHandler; +import org.adempiere.pipo2.Element; +import org.adempiere.pipo2.PIPOContext; +import org.adempiere.pipo2.PackOut; +import org.adempiere.pipo2.PackoutItem; +import org.adempiere.pipo2.SQLElementParameters; +import org.compiere.model.X_AD_Package_Imp_Detail; +import org.compiere.util.DB; +import org.compiere.util.Env; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +public class SQLMandatoryElementHandler extends AbstractElementHandler { + + public void startElement(PIPOContext ctx, Element element) throws SAXException { + String elementValue = element.getElementValue(); + + log.info(elementValue); + String DBType = getStringValue(element, "DBType"); + String sql = getStringValue(element, "statement"); + if (sql.endsWith(";") && !(sql.toLowerCase().endsWith("end;"))) + sql = sql.substring(0, sql.length() - 1); + sql = Env.parseContext(Env.getCtx(), 0, sql, false); + PreparedStatement pstmt = null; + X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", 0); + try { + pstmt = DB.prepareStatement(sql, getTrxName(ctx)); + if (DBType.equals("ALL")) { + int n = pstmt.executeUpdate(); + if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory: "+ getStringValue(element, "statement") + " ReturnValue="+n); + } else if (DB.isOracle() && DBType.equals("Oracle")) { + int n = pstmt.executeUpdate(); + if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory for Oracle: "+ getStringValue(element, "statement") + " ReturnValue="+n); + } else if (DB.isPostgreSQL() + && ( DBType.equals("Postgres") + || DBType.equals("PostgreSQL") // backward compatibility with old packages developed by hand + ) + ) { + // Avoid convert layer - command specific for postgresql + // + // pstmt = DB.prepareStatement(sql, getTrxName(ctx)); + // pstmt.executeUpdate(); + // + Statement stmt = null; + try { + stmt = pstmt.getConnection().createStatement(); + int n = stmt.executeUpdate (sql); + if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory for PostgreSQL: "+ getStringValue(element,"statement") + " ReturnValue="+n); + } finally { + DB.close(stmt); + stmt = null; + } + } + logImportDetail (ctx, impDetail, 1, "SQLMandatory",1,"Execute"); + ctx.packIn.getNotifier().addSuccessLine("-> " + sql); + } catch (Exception e) { + ctx.packIn.getNotifier().addFailureLine("SQL Mandatory failed, error (" + e.getLocalizedMessage() + "):"); + logImportDetail (ctx, impDetail, 0, "SQLMandatory",1,"Execute"); + ctx.packIn.getNotifier().addFailureLine("-> " + sql); + log.log(Level.SEVERE,"SQLMandatory", e); + throw new AdempiereException(e); + } finally { + DB.close(pstmt); + pstmt = null; + } + } + + public void endElement(PIPOContext ctx, Element element) throws SAXException { + } + + public void create(PIPOContext ctx, TransformerHandler document) + throws SAXException { + String SQLMandatory = Env.getContext(ctx.ctx, SQLElementParameters.SQL_STATEMENT); + String DBType = Env.getContext(ctx.ctx, SQLElementParameters.DB_TYPE); + AttributesImpl atts = new AttributesImpl(); + addTypeName(atts, "custom"); + document.startElement("","","SQLMandatory",atts); + createSQLStatmentBinding(document, SQLMandatory, DBType); + document.endElement("","","SQLMandatory"); + } + + private void createSQLStatmentBinding( TransformerHandler document, String sqlMandatory, String DBType) throws SAXException + { + document.startElement("","","DBType", new AttributesImpl()); + char[] contents = DBType.toCharArray(); + document.characters(contents,0,contents.length); + document.endElement("","","DBType"); + + document.startElement("","","statement", new AttributesImpl()); + contents = sqlMandatory.toCharArray(); + document.startCDATA(); + document.characters(contents,0,contents.length); + document.endCDATA(); + document.endElement("","","statement"); + + } + + public void packOut(PackOut packout, TransformerHandler packoutHandler, TransformerHandler docHandler,int field) throws Exception + { + PackoutItem detail = packout.getCurrentPackoutItem(); + Env.setContext(packout.getCtx().ctx, SQLElementParameters.SQL_STATEMENT, (String)detail.getProperty(SQLElementParameters.SQL_STATEMENT)); + Env.setContext(packout.getCtx().ctx, SQLElementParameters.DB_TYPE, (String)detail.getProperty(SQLElementParameters.DB_TYPE)); + this.create(packout.getCtx(), packoutHandler); + packout.getCtx().ctx.remove(SQLElementParameters.SQL_STATEMENT); + packout.getCtx().ctx.remove(SQLElementParameters.DB_TYPE); + } +} diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java index cf88b9cec9..fab99602f2 100644 --- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java @@ -104,10 +104,10 @@ public class SQLStatementElementHandler extends AbstractElementHandler { } savepoint = null; } - ctx.packIn.getNotifier().addFailureLine("SQL statement failed but ignored, error (" + e.getLocalizedMessage() + "): " + sql); + ctx.packIn.getNotifier().addFailureLine("SQL statement failed but ignored, error (" + e.getLocalizedMessage() + "): "); logImportDetail (ctx, impDetail, 0, "SQLStatement",1,"Execute"); ctx.packIn.getNotifier().addFailureLine("-> " + sql); - log.log(Level.SEVERE,"SQLSatement", e); + log.log(Level.SEVERE,"SQLStatement", e); } finally { DB.close(pstmt); pstmt = null; diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java index dc3fe229b6..d6ffe9d340 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java @@ -183,6 +183,8 @@ public class PackOutProcess extends SvrProcess return I_AD_Role.Table_Name; else if (X_AD_Package_Exp_Detail.TYPE_SQLStatement.equals(type)) return "SQLStatement"; + else if (X_AD_Package_Exp_Detail.TYPE_SQLMandatory.equals(type)) + return "SQLMandatory"; else if (X_AD_Package_Exp_Detail.TYPE_Table.equals(type)) return I_AD_Table.Table_Name; else if (X_AD_Package_Exp_Detail.TYPE_Window.equals(type)) @@ -202,7 +204,7 @@ public class PackOutProcess extends SvrProcess if (MPackageExpDetail.TYPE_Data.equals(type)) { properties.put(DataElementParameters.AD_TABLE_ID, dtl.getAD_Table_ID()); properties.put(DataElementParameters.SQL_STATEMENT, dtl.getSQLStatement()); - } else if (MPackageExpDetail.TYPE_SQLStatement.equals(type)) { + } else if (MPackageExpDetail.TYPE_SQLStatement.equals(type) || MPackageExpDetail.TYPE_SQLMandatory.equals(type)) { properties.put(SQLElementParameters.SQL_STATEMENT, dtl.getSQLStatement()); properties.put(SQLElementParameters.DB_TYPE, dtl.getDBType()); } else if (MPackageExpDetail.TYPE_File_CodeOrOther.equals(type)) {