From 557c483fc93dd7d21c1540fccf420ca5b5fed6c6 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 24 Sep 2021 10:38:07 +0200 Subject: [PATCH] IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / Shell script (#891) * IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / Shell script * IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / Java Shell script -> beanshell/groovy * IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / Remove java class option, fixes for script * IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / rename to ScriptJSR223 * IDEMPIERE-4968 Enable 2Pack to run java class or script (FHCA-3112 FHCA-3113) / add audit information to SQL statements, shell and JSR223 scripts --- .../oracle/202109171808_IDEMPIERE-4968.sql | 75 +++++++++ .../202109171808_IDEMPIERE-4968.sql | 72 +++++++++ .../model/I_AD_Package_Exp_Detail.java | 9 ++ .../model/I_AD_Package_Imp_Detail.java | 22 +++ .../org/compiere/model/MPackageExpDetail.java | 4 - .../model/X_AD_Package_Exp_Detail.java | 22 ++- .../model/X_AD_Package_Imp_Detail.java | 33 +++- org.adempiere.pipo.handlers/plugin.xml | 8 + .../handler/SQLMandatoryElementHandler.java | 4 +- .../handler/SQLStatementElementHandler.java | 4 +- .../handler/ScriptJSR223ElementHandler.java | 128 ++++++++++++++++ .../handler/ShellScriptElementHandler.java | 144 ++++++++++++++++++ .../pipo2/AbstractElementHandler.java | 27 +++- .../org/adempiere/pipo2/PackOutProcess.java | 6 + 14 files changed, 544 insertions(+), 14 deletions(-) create mode 100644 migration/i8.2/oracle/202109171808_IDEMPIERE-4968.sql create mode 100644 migration/i8.2/postgresql/202109171808_IDEMPIERE-4968.sql create mode 100644 org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ScriptJSR223ElementHandler.java create mode 100644 org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ShellScriptElementHandler.java diff --git a/migration/i8.2/oracle/202109171808_IDEMPIERE-4968.sql b/migration/i8.2/oracle/202109171808_IDEMPIERE-4968.sql new file mode 100644 index 0000000000..dfe5bf3cae --- /dev/null +++ b/migration/i8.2/oracle/202109171808_IDEMPIERE-4968.sql @@ -0,0 +1,75 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-4968 Enable 2Pack to run java class or script +-- Sep 17, 2021, 6:07:17 PM CEST +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 (200519,'Script JSR223',50004,'SCJ',0,0,'Y',TO_DATE('2021-09-17 18:07:17','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-17 18:07:17','YYYY-MM-DD HH24:MI:SS'),100,'D','9a9c315b-9af4-4e83-be41-5f5057c13061') +; + +-- Sep 17, 2021, 6:07:23 PM CEST +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 (200521,'Shell Script',50004,'SH',0,0,'Y',TO_DATE('2021-09-17 18:07:22','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-17 18:07:22','YYYY-MM-DD HH24:MI:SS'),100,'D','48522ab7-f47c-4ee9-a6b3-21fb762b3e1a') +; + +-- Sep 17, 2021, 6:28:33 PM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203542,0,0,'Y',TO_DATE('2021-09-17 18:28:22','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-17 18:28:22','YYYY-MM-DD HH24:MI:SS'),100,'ExecCode','Execution Code',NULL,NULL,'Execution Code','D','54a4baac-9786-446a-bd22-acbe58fedfae') +; + +-- Sep 17, 2021, 6:28:47 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214590,0,'Execution Code',50006,'ExecCode',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_DATE('2021-09-17 18:28:47','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-17 18:28:47','YYYY-MM-DD HH24:MI:SS'),100,203542,'Y','N','D','N','N','N','Y','4c3a9c23-86bc-4ffe-b3ad-52703d53e5b2','Y',0,'N','N','N','N') +; + +-- Sep 17, 2021, 6:28:50 PM CEST +ALTER TABLE AD_Package_Exp_Detail ADD ExecCode CLOB DEFAULT NULL +; + +-- Sep 17, 2021, 6:29:54 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLogic,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206750,'Execution Code',50006,214590,'Y','@Type@=SCJ | @Type@=SH',0,340,0,'N','N','N','N',0,0,'Y',TO_DATE('2021-09-17 18:29:53','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-17 18:29:53','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','f0e80eea-0c09-46a6-b69a-a0a796448e84','Y',340,1,1,1,'N','N','N','N') +; + +-- Sep 17, 2021, 6:30:23 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=330, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, NumLines=8, IsToolbarButton=NULL,Updated=TO_DATE('2021-09-17 18:30:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206750 +; + +-- Sep 17, 2021, 6:30:23 PM CEST +UPDATE AD_Field SET SeqNo=340, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2021-09-17 18:30:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50117 +; + +-- Sep 23, 2021, 6:17:49 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214591,0,'Execution Code',50004,'ExecCode',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_DATE('2021-09-23 18:17:48','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-23 18:17:48','YYYY-MM-DD HH24:MI:SS'),100,203542,'Y','N','D','N','N','N','Y','19a844b4-e6e2-44eb-ba01-d27b8f10c758','Y',0,'N','N','N','N') +; + +-- Sep 23, 2021, 6:17:50 PM CEST +ALTER TABLE AD_Package_Imp_Detail ADD ExecCode CLOB DEFAULT NULL +; + +-- Sep 23, 2021, 6:19:25 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,Help,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,IsHtml) VALUES (214592,0,'Result','Result of the action taken','The Result indicates the result of any action taken on this request.',50004,'Result',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_DATE('2021-09-23 18:19:24','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-23 18:19:24','YYYY-MM-DD HH24:MI:SS'),100,546,'N','N','D','N','N','N','Y','0feb2960-ed0e-4a43-8c0b-8c567b0969b1','Y',0,'N','N','N') +; + +-- Sep 23, 2021, 6:19:28 PM CEST +ALTER TABLE AD_Package_Imp_Detail ADD Result CLOB DEFAULT NULL +; + +-- Sep 23, 2021, 6:21:01 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206751,'Execution Code',50004,214591,'Y',0,110,0,'N','N','N','N',0,0,'Y',TO_DATE('2021-09-23 18:21:00','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-23 18:21:00','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','5da85957-d2ab-42e0-b8fc-fd7d11a49a07','Y',80,1,1,1,'N','N','N','N') +; + +-- Sep 23, 2021, 6:21:07 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,Description,Help,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206752,'Result','Result of the action taken','The Result indicates the result of any action taken on this request.',50004,214592,'Y',0,120,0,'N','N','N','N',0,0,'Y',TO_DATE('2021-09-23 18:21:07','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2021-09-23 18:21:07','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','921e0126-c9a7-4029-beb8-930a95b64ef7','Y',90,1,1,1,'N','N','N','N') +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=110, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, ColumnSpan=5, NumLines=3, IsToolbarButton=NULL,Updated=TO_DATE('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206751 +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=120, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, ColumnSpan=5, NumLines=3, IsToolbarButton=NULL,Updated=TO_DATE('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206752 +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=0, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=204550 +; + +SELECT register_migration_script('202109171808_IDEMPIERE-4968.sql') FROM dual +; + diff --git a/migration/i8.2/postgresql/202109171808_IDEMPIERE-4968.sql b/migration/i8.2/postgresql/202109171808_IDEMPIERE-4968.sql new file mode 100644 index 0000000000..1df5914d74 --- /dev/null +++ b/migration/i8.2/postgresql/202109171808_IDEMPIERE-4968.sql @@ -0,0 +1,72 @@ +-- IDEMPIERE-4968 Enable 2Pack to run java class or script +-- Sep 17, 2021, 6:07:17 PM CEST +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 (200519,'Script JSR223',50004,'SCJ',0,0,'Y',TO_TIMESTAMP('2021-09-17 18:07:17','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-17 18:07:17','YYYY-MM-DD HH24:MI:SS'),100,'D','9a9c315b-9af4-4e83-be41-5f5057c13061') +; + +-- Sep 17, 2021, 6:07:23 PM CEST +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 (200521,'Shell Script',50004,'SH',0,0,'Y',TO_TIMESTAMP('2021-09-17 18:07:22','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-17 18:07:22','YYYY-MM-DD HH24:MI:SS'),100,'D','48522ab7-f47c-4ee9-a6b3-21fb762b3e1a') +; + +-- Sep 17, 2021, 6:28:33 PM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203542,0,0,'Y',TO_TIMESTAMP('2021-09-17 18:28:22','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-17 18:28:22','YYYY-MM-DD HH24:MI:SS'),100,'ExecCode','Execution Code',NULL,NULL,'Execution Code','D','54a4baac-9786-446a-bd22-acbe58fedfae') +; + +-- Sep 17, 2021, 6:28:47 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214590,0,'Execution Code',50006,'ExecCode',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_TIMESTAMP('2021-09-17 18:28:47','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-17 18:28:47','YYYY-MM-DD HH24:MI:SS'),100,203542,'Y','N','D','N','N','N','Y','4c3a9c23-86bc-4ffe-b3ad-52703d53e5b2','Y',0,'N','N','N','N') +; + +-- Sep 17, 2021, 6:28:50 PM CEST +ALTER TABLE AD_Package_Exp_Detail ADD COLUMN ExecCode TEXT DEFAULT NULL +; + +-- Sep 17, 2021, 6:29:54 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLogic,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206750,'Execution Code',50006,214590,'Y','@Type@=SCJ | @Type@=SH',0,340,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2021-09-17 18:29:53','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-17 18:29:53','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','f0e80eea-0c09-46a6-b69a-a0a796448e84','Y',340,1,1,1,'N','N','N','N') +; + +-- Sep 17, 2021, 6:30:23 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=330, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, XPosition=1, ColumnSpan=5, NumLines=8, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2021-09-17 18:30:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206750 +; + +-- Sep 17, 2021, 6:30:23 PM CEST +UPDATE AD_Field SET SeqNo=340, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2021-09-17 18:30:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50117 +; + +-- Sep 23, 2021, 6:17:49 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (214591,0,'Execution Code',50004,'ExecCode',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_TIMESTAMP('2021-09-23 18:17:48','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-23 18:17:48','YYYY-MM-DD HH24:MI:SS'),100,203542,'Y','N','D','N','N','N','Y','19a844b4-e6e2-44eb-ba01-d27b8f10c758','Y',0,'N','N','N','N') +; + +-- Sep 23, 2021, 6:17:50 PM CEST +ALTER TABLE AD_Package_Imp_Detail ADD COLUMN ExecCode TEXT DEFAULT NULL +; + +-- Sep 23, 2021, 6:19:25 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,Help,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,IsHtml) VALUES (214592,0,'Result','Result of the action taken','The Result indicates the result of any action taken on this request.',50004,'Result',0,'N','N','N','N','N',0,'N',36,0,0,'Y',TO_TIMESTAMP('2021-09-23 18:19:24','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-23 18:19:24','YYYY-MM-DD HH24:MI:SS'),100,546,'N','N','D','N','N','N','Y','0feb2960-ed0e-4a43-8c0b-8c567b0969b1','Y',0,'N','N','N') +; + +-- Sep 23, 2021, 6:19:28 PM CEST +ALTER TABLE AD_Package_Imp_Detail ADD COLUMN Result TEXT DEFAULT NULL +; + +-- Sep 23, 2021, 6:21:01 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206751,'Execution Code',50004,214591,'Y',0,110,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2021-09-23 18:21:00','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-23 18:21:00','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','5da85957-d2ab-42e0-b8fc-fd7d11a49a07','Y',80,1,1,1,'N','N','N','N') +; + +-- Sep 23, 2021, 6:21:07 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,Description,Help,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,SortNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206752,'Result','Result of the action taken','The Result indicates the result of any action taken on this request.',50004,214592,'Y',0,120,0,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2021-09-23 18:21:07','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2021-09-23 18:21:07','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','921e0126-c9a7-4029-beb8-930a95b64ef7','Y',90,1,1,1,'N','N','N','N') +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=110, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, ColumnSpan=5, NumLines=3, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206751 +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=120, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, ColumnSpan=5, NumLines=3, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=206752 +; + +-- Sep 23, 2021, 6:21:45 PM CEST +UPDATE AD_Field SET SeqNo=0, AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2021-09-23 18:21:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=204550 +; + +SELECT register_migration_script('202109171808_IDEMPIERE-4968.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_Package_Exp_Detail.java b/org.adempiere.base/src/org/compiere/model/I_AD_Package_Exp_Detail.java index 6fdc3f8493..afaeafcc4f 100644 --- a/org.adempiere.base/src/org/compiere/model/I_AD_Package_Exp_Detail.java +++ b/org.adempiere.base/src/org/compiere/model/I_AD_Package_Exp_Detail.java @@ -412,6 +412,15 @@ public interface I_AD_Package_Exp_Detail /** Get Destination_FileName */ public String getDestination_FileName(); + /** Column name ExecCode */ + public static final String COLUMNNAME_ExecCode = "ExecCode"; + + /** Set Execution Code */ + public void setExecCode (String ExecCode); + + /** Get Execution Code */ + public String getExecCode(); + /** Column name File_Directory */ public static final String COLUMNNAME_File_Directory = "File_Directory"; diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_Package_Imp_Detail.java b/org.adempiere.base/src/org/compiere/model/I_AD_Package_Imp_Detail.java index cd029a7da1..c7d22cd7d3 100644 --- a/org.adempiere.base/src/org/compiere/model/I_AD_Package_Imp_Detail.java +++ b/org.adempiere.base/src/org/compiere/model/I_AD_Package_Imp_Detail.java @@ -144,6 +144,15 @@ public interface I_AD_Package_Imp_Detail */ public int getCreatedBy(); + /** Column name ExecCode */ + public static final String COLUMNNAME_ExecCode = "ExecCode"; + + /** Set Execution Code */ + public void setExecCode (String ExecCode); + + /** Get Execution Code */ + public String getExecCode(); + /** Column name IsActive */ public static final String COLUMNNAME_IsActive = "IsActive"; @@ -183,6 +192,19 @@ public interface I_AD_Package_Imp_Detail */ public int getRecord_ID(); + /** Column name Result */ + public static final String COLUMNNAME_Result = "Result"; + + /** Set Result. + * Result of the action taken + */ + public void setResult (String Result); + + /** Get Result. + * Result of the action taken + */ + public String getResult(); + /** Column name Success */ public static final String COLUMNNAME_Success = "Success"; diff --git a/org.adempiere.base/src/org/compiere/model/MPackageExpDetail.java b/org.adempiere.base/src/org/compiere/model/MPackageExpDetail.java index d370bc4b39..d6fc681ce1 100644 --- a/org.adempiere.base/src/org/compiere/model/MPackageExpDetail.java +++ b/org.adempiere.base/src/org/compiere/model/MPackageExpDetail.java @@ -87,10 +87,6 @@ public class MPackageExpDetail extends X_AD_Package_Exp_Detail String type = getType(); if (TYPE_ApplicationOrModule.equals(type)) { return getAD_Menu_ID(); - } else if (TYPE_Data.equals(type)) { - return 0; - } else if (TYPE_DataSingle.equals(type)) { - return 0; } else if (TYPE_DynamicValidationRule.equals(type)) { return getAD_Val_Rule_ID(); } else if (TYPE_Form.equals(type)) { 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 e7c79b65ba..076603a5ec 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 @@ -31,7 +31,7 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta /** * */ - private static final long serialVersionUID = 20210917L; + private static final long serialVersionUID = 20210923L; /** Standard Constructor */ public X_AD_Package_Exp_Detail (Properties ctx, int AD_Package_Exp_Detail_ID, String trxName) @@ -735,6 +735,20 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta return (String)get_Value(COLUMNNAME_Destination_FileName); } + /** Set Execution Code. + @param ExecCode Execution Code */ + public void setExecCode (String ExecCode) + { + set_Value (COLUMNNAME_ExecCode, ExecCode); + } + + /** Get Execution Code. + @return Execution Code */ + public String getExecCode () + { + return (String)get_Value(COLUMNNAME_ExecCode); + } + /** Set File_Directory. @param File_Directory File_Directory */ public void setFile_Directory (String File_Directory) @@ -920,8 +934,6 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta /** Type AD_Reference_ID=50004 */ public static final int TYPE_AD_Reference_ID=50004; - /** Workbench = B */ - public static final String TYPE_Workbench = "B"; /** Data = D */ public static final String TYPE_Data = "D"; /** Data Single = DS */ @@ -950,6 +962,10 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta public static final String TYPE_Reference = "REF"; /** Role = S */ public static final String TYPE_Role = "S"; + /** Script JSR223 = SCJ */ + public static final String TYPE_ScriptJSR223 = "SCJ"; + /** Shell Script = SH */ + public static final String TYPE_ShellScript = "SH"; /** SQL Statement = SQL */ public static final String TYPE_SQLStatement = "SQL"; /** SQL Mandatory = SQM */ diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_Package_Imp_Detail.java b/org.adempiere.base/src/org/compiere/model/X_AD_Package_Imp_Detail.java index 5ba098e5fe..f0c27494b5 100644 --- a/org.adempiere.base/src/org/compiere/model/X_AD_Package_Imp_Detail.java +++ b/org.adempiere.base/src/org/compiere/model/X_AD_Package_Imp_Detail.java @@ -30,7 +30,7 @@ public class X_AD_Package_Imp_Detail extends PO implements I_AD_Package_Imp_Deta /** * */ - private static final long serialVersionUID = 20210917L; + private static final long serialVersionUID = 20210923L; /** Standard Constructor */ public X_AD_Package_Imp_Detail (Properties ctx, int AD_Package_Imp_Detail_ID, String trxName) @@ -198,6 +198,20 @@ public class X_AD_Package_Imp_Detail extends PO implements I_AD_Package_Imp_Deta return ii.intValue(); } + /** Set Execution Code. + @param ExecCode Execution Code */ + public void setExecCode (String ExecCode) + { + set_Value (COLUMNNAME_ExecCode, ExecCode); + } + + /** Get Execution Code. + @return Execution Code */ + public String getExecCode () + { + return (String)get_Value(COLUMNNAME_ExecCode); + } + /** Set Name. @param Name Alphanumeric identifier of the entity @@ -238,6 +252,23 @@ public class X_AD_Package_Imp_Detail extends PO implements I_AD_Package_Imp_Deta return ii.intValue(); } + /** Set Result. + @param Result + Result of the action taken + */ + public void setResult (String Result) + { + set_ValueNoCheck (COLUMNNAME_Result, Result); + } + + /** Get Result. + @return Result of the action taken + */ + public String getResult () + { + return (String)get_Value(COLUMNNAME_Result); + } + /** Set Success. @param Success Success */ public void setSuccess (String Success) diff --git a/org.adempiere.pipo.handlers/plugin.xml b/org.adempiere.pipo.handlers/plugin.xml index 8a7493b201..5ee058c4d0 100644 --- a/org.adempiere.pipo.handlers/plugin.xml +++ b/org.adempiere.pipo.handlers/plugin.xml @@ -228,6 +228,14 @@ class="org.adempiere.pipo2.handler.InfoWindowAccessElementHandler" id="AD_InfoWindow_Access"> + + + + 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 index 027dd10baf..61507aa552 100644 --- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLMandatoryElementHandler.java @@ -89,7 +89,7 @@ public class SQLMandatoryElementHandler extends AbstractElementHandler { stmt = null; } } - logImportDetail (ctx, impDetail, 1, "SQLMandatory",count,"Execute"); + logImportDetail (ctx, impDetail, 1, "SQLMandatory",count,"Execute", sql, String.valueOf(count)); ctx.packIn.getNotifier().addSuccessLine("-> " + sql); // Cache Reset when deleting records via SQL if (sql.toLowerCase().startsWith("delete from ")) { @@ -102,7 +102,7 @@ public class SQLMandatoryElementHandler extends AbstractElementHandler { } } catch (Exception e) { ctx.packIn.getNotifier().addFailureLine("SQL Mandatory failed, error (" + e.getLocalizedMessage() + "):"); - logImportDetail (ctx, impDetail, 0, "SQLMandatory",-1,"Execute"); + logImportDetail (ctx, impDetail, 0, "SQLMandatory",-1,"Execute", sql, e.getLocalizedMessage()); ctx.packIn.getNotifier().addFailureLine("-> " + sql); log.log(Level.SEVERE,"SQLMandatory", e); throw new AdempiereException(e); 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 02c7a4a91a..10efdf5c84 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 @@ -90,7 +90,7 @@ public class SQLStatementElementHandler extends AbstractElementHandler { stmt = null; } } - logImportDetail (ctx, impDetail, 1, "SQLStatement",count,"Execute"); + logImportDetail (ctx, impDetail, 1, "SQLStatement",count,"Execute", sql, String.valueOf(count)); ctx.packIn.getNotifier().addSuccessLine("-> " + sql); // Cache Reset when deleting records via SQL if (sql.toLowerCase().startsWith("delete from ")) { @@ -117,7 +117,7 @@ public class SQLStatementElementHandler extends AbstractElementHandler { savepoint = null; } ctx.packIn.getNotifier().addFailureLine("SQL statement failed but ignored, error (" + e.getLocalizedMessage() + "): "); - logImportDetail (ctx, impDetail, 0, "SQLStatement",-1,"Execute"); + logImportDetail (ctx, impDetail, 0, "SQLStatement",-1,"Execute", sql, e.getLocalizedMessage()); ctx.packIn.getNotifier().addFailureLine("-> " + sql); log.log(Level.SEVERE,"SQLStatement", e); } finally { diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ScriptJSR223ElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ScriptJSR223ElementHandler.java new file mode 100644 index 0000000000..4407a0f752 --- /dev/null +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ScriptJSR223ElementHandler.java @@ -0,0 +1,128 @@ +/*********************************************************************** + * 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: * + * - Carlos Ruiz - globalqss * + * Sponsored by FH * + **********************************************************************/ + +package org.adempiere.pipo2.handler; + +import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; +import javax.xml.transform.sax.TransformerHandler; + +import org.adempiere.base.Core; +import org.adempiere.exceptions.AdempiereException; +import org.adempiere.pipo2.AbstractElementHandler; +import org.adempiere.pipo2.Element; +import org.adempiere.pipo2.ElementHandler; +import org.adempiere.pipo2.PIPOContext; +import org.adempiere.pipo2.PackOut; +import org.adempiere.pipo2.PackoutItem; +import org.compiere.model.MPackageExpDetail; +import org.compiere.model.MRule; +import org.compiere.model.X_AD_Package_Imp_Detail; +import org.compiere.util.Env; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +public class ScriptJSR223ElementHandler extends AbstractElementHandler implements ElementHandler { + + private static final String SCRIPT_JSR223 = "ScriptJSR223"; + + @Override + public void startElement(PIPOContext ctx, Element element) throws SAXException { + X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", 0); + + String script = getStringValue(element, SCRIPT_JSR223); + + String engineName = "beanshell"; // the default + if (script.contains("@script:")) { + Pattern pattern = Pattern.compile(".*@script:\\b(.*)\\b.*"); + Matcher matcher = pattern.matcher(script); + matcher.find(); + if (matcher.groupCount() > 0) + engineName = matcher.group(1); + } + if (engineName == null || + (! (engineName.equals("groovy") + || engineName.equals("beanshell")))) { + throw new AdempiereException("Script engine not supported, just groovy and beanshell"); + } + ScriptEngine engine = Core.getScriptEngine(engineName); + engine.put(MRule.ARGUMENTS_PREFIX + "Ctx", ctx.ctx); + engine.put(MRule.ARGUMENTS_PREFIX + "Trx", ctx.trx); + engine.put(MRule.ARGUMENTS_PREFIX + "TrxName", ctx.trx.getTrxName()); + engine.put(MRule.ARGUMENTS_PREFIX + "AD_Client_ID", Env.getAD_Client_ID(ctx.ctx)); + engine.put(MRule.ARGUMENTS_PREFIX + "AD_User_ID", Env.getAD_User_ID(ctx.ctx)); + + String msg = null; + try { + msg = engine.eval(script).toString(); + } catch (ScriptException e) { + ctx.packIn.getNotifier().addFailureLine("Script JSR223 failed, error (" + e.getLocalizedMessage() + "):"); + logImportDetail(ctx, impDetail, 0, SCRIPT_JSR223, -1, "Execute", script, e.getLocalizedMessage() + "\n -> " + msg); + ctx.packIn.getNotifier().addFailureLine("-> " + msg); + log.log(Level.SEVERE, SCRIPT_JSR223, e); + throw new AdempiereException(e); + } + + logImportDetail(ctx, impDetail, 1, SCRIPT_JSR223, 0, "Execute", script, msg); + ctx.packIn.getNotifier().addSuccessLine("out -> " + msg); + } + + @Override + public void endElement(PIPOContext ctx, Element element) throws SAXException { + } + + public void create(PIPOContext ctx, TransformerHandler document) throws SAXException { + String execCode = Env.getContext(ctx.ctx, MPackageExpDetail.COLUMNNAME_ExecCode); + AttributesImpl atts = new AttributesImpl(); + addTypeName(atts, "custom"); + document.startElement("","",SCRIPT_JSR223,atts); + createShellScriptBinding(document, execCode); + document.endElement("","",SCRIPT_JSR223); + } + + private void createShellScriptBinding( TransformerHandler document, String execCode) throws SAXException { + document.startElement("","",SCRIPT_JSR223, new AttributesImpl()); + char [] contents = execCode.toCharArray(); + document.startCDATA(); + document.characters(contents,0,contents.length); + document.endCDATA(); + document.endElement("","",SCRIPT_JSR223); + } + + @Override + public void packOut(PackOut packout, TransformerHandler packoutHandler, TransformerHandler docHandler, int recordId) + throws Exception { + PackoutItem detail = packout.getCurrentPackoutItem(); + Env.setContext(packout.getCtx().ctx, MPackageExpDetail.COLUMNNAME_ExecCode, (String)detail.getProperty(MPackageExpDetail.COLUMNNAME_ExecCode)); + this.create(packout.getCtx(), packoutHandler); + packout.getCtx().ctx.remove(MPackageExpDetail.COLUMNNAME_ExecCode); + } + +} diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ShellScriptElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ShellScriptElementHandler.java new file mode 100644 index 0000000000..bc395a977e --- /dev/null +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/ShellScriptElementHandler.java @@ -0,0 +1,144 @@ +/*********************************************************************** + * 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: * + * - Carlos Ruiz - globalqss * + * Sponsored by FH * + **********************************************************************/ + +package org.adempiere.pipo2.handler; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.Set; +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.ElementHandler; +import org.adempiere.pipo2.PIPOContext; +import org.adempiere.pipo2.PackOut; +import org.adempiere.pipo2.PackoutItem; +import org.compiere.model.MPackageExpDetail; +import org.compiere.model.X_AD_Package_Imp_Detail; +import org.compiere.util.Env; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +public class ShellScriptElementHandler extends AbstractElementHandler implements ElementHandler { + + private static final String SHELL_SCRIPT = "ShellScript"; + private Path m_tmpfile = null; + + @Override + public void startElement(PIPOContext ctx, Element element) throws SAXException { + String script = getStringValue(element, SHELL_SCRIPT); + // create a temporary file with the contents of the script + Set fp = PosixFilePermissions.fromString("rwx------"); + try { + m_tmpfile = Files.createTempFile("2PackShellScript_", ".sh", PosixFilePermissions.asFileAttribute(fp)); + Files.write(m_tmpfile, script.getBytes()); + } catch (IOException e) { + throw new AdempiereException(e); + } + + X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", 0); + + // Execute temporary bash file + int exitCode = -1; + StringBuilder out = new StringBuilder(); + StringBuilder err = new StringBuilder(); + try { + String line; + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.command(m_tmpfile.toString()); + Process process = processBuilder.start(); + BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); + BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); + // read the output from the command + while ((line = stdInput.readLine()) != null) + out.append(line); + // read any errors from the attempted command + while ((line = stdError.readLine()) != null) + err.append(line); + exitCode = process.waitFor(); + } + catch (IOException | InterruptedException e) { + ctx.packIn.getNotifier().addFailureLine("Shell Script failed, error (" + e.getLocalizedMessage() + "):"); + logImportDetail(ctx, impDetail, 0, SHELL_SCRIPT, exitCode, "Execute", script, e.getLocalizedMessage() + "\nout -> " + out.toString() + "\nerr -> " + err.toString()); + if (out.length() > 0) ctx.packIn.getNotifier().addFailureLine("out -> " + out.toString()); + if (err.length() > 0) ctx.packIn.getNotifier().addFailureLine("err -> " + err.toString()); + log.log(Level.SEVERE, SHELL_SCRIPT, e); + throw new AdempiereException(e); + } + if (out.length() > 0 && log.isLoggable(Level.INFO)) log.info("Executed Shell Script with stdout: " + out.toString()); + if (err.length() > 0 && log.isLoggable(Level.WARNING)) log.warning("Executed Shell Script with stderr: " + err.toString()); + if (exitCode != 0) { + logImportDetail(ctx, impDetail, 0, SHELL_SCRIPT, exitCode, "Execute", script, "exitCode -> " + exitCode + "\nout -> " + out.toString() + "\nerr -> " + err.toString()); + if (out.length() > 0) ctx.packIn.getNotifier().addFailureLine("out -> " + out.toString()); + if (err.length() > 0) ctx.packIn.getNotifier().addFailureLine("err -> " + err.toString()); + throw new AdempiereException("Failed execution of shell script"); + } + logImportDetail(ctx, impDetail, 1, SHELL_SCRIPT, exitCode, "Execute", script, "exitCode -> " + exitCode + "\nout -> " + out.toString() + "\nerr -> " + err.toString()); + if (out.length() > 0) ctx.packIn.getNotifier().addSuccessLine("out -> " + out.toString()); + if (err.length() > 0) ctx.packIn.getNotifier().addSuccessLine("err -> " + err.toString()); + } + + @Override + public void endElement(PIPOContext ctx, Element element) throws SAXException { + } + + public void create(PIPOContext ctx, TransformerHandler document) throws SAXException { + String execCode = Env.getContext(ctx.ctx, MPackageExpDetail.COLUMNNAME_ExecCode); + AttributesImpl atts = new AttributesImpl(); + addTypeName(atts, "custom"); + document.startElement("","",SHELL_SCRIPT,atts); + createShellScriptBinding(document, execCode); + document.endElement("","",SHELL_SCRIPT); + } + + private void createShellScriptBinding( TransformerHandler document, String execCode) throws SAXException { + document.startElement("","",SHELL_SCRIPT, new AttributesImpl()); + char [] contents = execCode.toCharArray(); + document.startCDATA(); + document.characters(contents,0,contents.length); + document.endCDATA(); + document.endElement("","",SHELL_SCRIPT); + } + + @Override + public void packOut(PackOut packout, TransformerHandler packoutHandler, TransformerHandler docHandler, int recordId) + throws Exception { + PackoutItem detail = packout.getCurrentPackoutItem(); + Env.setContext(packout.getCtx().ctx, MPackageExpDetail.COLUMNNAME_ExecCode, (String)detail.getProperty(MPackageExpDetail.COLUMNNAME_ExecCode)); + this.create(packout.getCtx(), packoutHandler); + packout.getCtx().ctx.remove(MPackageExpDetail.COLUMNNAME_ExecCode); + } + +} diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/AbstractElementHandler.java b/org.adempiere.pipo/src/org/adempiere/pipo2/AbstractElementHandler.java index 5a1911f9b5..45f6cf5b45 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/AbstractElementHandler.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/AbstractElementHandler.java @@ -93,11 +93,34 @@ public abstract class AbstractElementHandler implements ElementHandler { */ public void logImportDetail (PIPOContext ctx, X_AD_Package_Imp_Detail detail, int success, String objectName, int objectID, String action) throws SAXException{ - String result = success == 1 ? "Success" : "Failure"; + logImportDetail (ctx, detail, success, objectName, objectID, action, null, null); + } + + /** + * Write results to log and records in history table + * + * @param ctx + * @param success + * @param detail + * @param objectName + * @param objectID + * @param action + * @param execCode + * @param result + * @throws SAXException + * + */ + public void logImportDetail (PIPOContext ctx, X_AD_Package_Imp_Detail detail, int success, String objectName, int objectID, + String action, String execCode, String result) throws SAXException{ + String msgSuccess = success == 1 ? "Success" : "Failure"; detail.setName(objectName); detail.setAction(action); - detail.setSuccess(result); + detail.setSuccess(msgSuccess); + if (execCode != null) + detail.setExecCode(execCode); + if (result != null) + detail.setResult(result); if (objectID >= 0) detail.setRecord_ID(objectID); ctx.packIn.addImportDetail(detail); diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java index 8133d86ad2..965c901c1f 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java @@ -196,6 +196,10 @@ public class PackOutProcess extends SvrProcess return I_AD_EntityType.Table_Name; else if (X_AD_Package_Exp_Detail.TYPE_InfoWindow.equals(type)) return I_AD_InfoWindow.Table_Name; + else if (X_AD_Package_Exp_Detail.TYPE_ShellScript.equals(type)) + return "ShellScript"; + else if (X_AD_Package_Exp_Detail.TYPE_ScriptJSR223.equals(type)) + return "ScriptJSR223"; return type; } @@ -208,6 +212,8 @@ public class PackOutProcess extends SvrProcess } 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_ShellScript.equals(type) || MPackageExpDetail.TYPE_ScriptJSR223.equals(type)) { + properties.put(MPackageExpDetail.COLUMNNAME_ExecCode, dtl.getExecCode()); } return properties; }