From c9e4cd58d46e922e15d12142e0ed7fc733c9e242 Mon Sep 17 00:00:00 2001 From: Pierre-Yves-Monnet Date: Wed, 29 Apr 2020 15:58:52 -0700 Subject: [PATCH] 2.4 Add towTruckToolbox --- GroovyMaintenance/ReadMe.md | 32 ++- GroovyMaintenance/SqlRequest.groovy | 34 +++ pom.xml | 20 +- .../custompage/test/JunitTimerTest.java | 0 .../bonitasoft/custompage/towtruck/Timer.java | 0 .../towtruck/cmdtimer/CmdCreateTimer.java | 0 .../groovymaintenance/AttributeHolder.java | 218 ++---------------- .../groovymaintenance/EngineSqlRequest.java | 163 +++++++++++++ .../groovymaintenance/GroovyMaintenance.java | 32 ++- .../groovymaintenance/PlaceHolder.java | 0 .../groovymaintenance/TowTruckToolbox.java | 175 ++++++++++++++ 11 files changed, 456 insertions(+), 218 deletions(-) create mode 100644 GroovyMaintenance/SqlRequest.groovy rename src/{ => main/java}/com/bonitasoft/custompage/test/JunitTimerTest.java (100%) rename src/{ => main/java}/com/bonitasoft/custompage/towtruck/Timer.java (100%) rename src/{ => main/java}/com/bonitasoft/custompage/towtruck/cmdtimer/CmdCreateTimer.java (100%) rename src/{ => main/java}/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java (53%) create mode 100644 src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/EngineSqlRequest.java rename src/{ => main/java}/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java (92%) rename src/{ => main/java}/com/bonitasoft/custompage/towtruck/groovymaintenance/PlaceHolder.java (100%) create mode 100644 src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/TowTruckToolbox.java diff --git a/GroovyMaintenance/ReadMe.md b/GroovyMaintenance/ReadMe.md index ba83e4c..bbaa5d5 100644 --- a/GroovyMaintenance/ReadMe.md +++ b/GroovyMaintenance/ReadMe.md @@ -2,7 +2,37 @@ How to create a Groovy maintenance file Write your groovy file, with a name "TimerFailedReArm.groovy". Give the code "TimerFailedReArm" to the user to load it. -Place holder +## Available object + +Different object are available in the groovy + +### restAPIContext +The RestAPIConext contains these methods: + + public APIClient getApiClient() + public APISession getApiSession() + public Locale getLocale() + public ResourceProvider getResourceProvider() + +### apiAccessor + +The Bonita ApiAccessor + + +## apiClient +The Bonita ApiClient + +### bonitaToolboxAPI +this object contains theses methods + public List> executeSqlRequest(String sqlRequest ) { + public List> executeSqlRequest(String sqlRequest, List parameter ) { + + public String decoratorHtml(List> listValues) + public String decoratorCsv(List> listValues) + + + +## Place holder In the file, you can set some Place Holder. Syntax is {{[;tips:]}} For example, you can set diff --git a/GroovyMaintenance/SqlRequest.groovy b/GroovyMaintenance/SqlRequest.groovy new file mode 100644 index 0000000..8092b88 --- /dev/null +++ b/GroovyMaintenance/SqlRequest.groovy @@ -0,0 +1,34 @@ +import java.util.logging.Level +import java.util.logging.Logger + + + +/* ******************************************************************* */ +/* */ +/* Name: Executing a SQL Request */ +/* */ +/* Description: The SQL Request is executed on the Engine Database */ +/* */ +/* ******************************************************************* */ + +Logger logger = Logger.getLogger("org.bonitasoft.groovymaintenance.executeflownode"); + +StringBuilder analysis = new StringBuilder(); + +// flow nodes +// Attention, at this moment, the list may be a list of whatever - soon more control +String sqlRequest= {{sqlRequestBonita;type:TEXT;default:select ID, STARTDATE ,NAME from process_instance}}; +int maxRecords = {{MawRecord;type:INTEGER;default:1000}}; + + + +analysis.append("SqlRequest ["+sqlRequest+"]...
"); +List> listResult = towTruckToolbox.executeSqlRequest( sqlRequest, maxRecords ); + +analysis.append("
"); +analysis.append( towTruckToolbox.decoratorHtmlFormated(listResult)); + + +return analysis.toString(); + + diff --git a/pom.xml b/pom.xml index d696807..38d798e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,8 +2,16 @@ 4.0.0 com.bonitasoft.custompage CustomPageTowTruck - 1.0.1 + 2.3 CustomPageTowTruck + + 7.8.4 + 1.8 + 1.8 + pom.xml,src + target/classes + + org.bonitasoft.engine @@ -20,7 +28,7 @@ org.bonitasoft.log.event bonita-event - 1.5.0 + 1.7.0 javax.servlet @@ -28,12 +36,12 @@ 2.5 provided - + org.bonitasoft.store bonita-store - 1.1.0 + 1.3.0 org.bonitasoft.engine @@ -165,7 +173,7 @@ strategy:UPDATE profile:BOTools - + @@ -174,5 +182,5 @@ - + \ No newline at end of file diff --git a/src/com/bonitasoft/custompage/test/JunitTimerTest.java b/src/main/java/com/bonitasoft/custompage/test/JunitTimerTest.java similarity index 100% rename from src/com/bonitasoft/custompage/test/JunitTimerTest.java rename to src/main/java/com/bonitasoft/custompage/test/JunitTimerTest.java diff --git a/src/com/bonitasoft/custompage/towtruck/Timer.java b/src/main/java/com/bonitasoft/custompage/towtruck/Timer.java similarity index 100% rename from src/com/bonitasoft/custompage/towtruck/Timer.java rename to src/main/java/com/bonitasoft/custompage/towtruck/Timer.java diff --git a/src/com/bonitasoft/custompage/towtruck/cmdtimer/CmdCreateTimer.java b/src/main/java/com/bonitasoft/custompage/towtruck/cmdtimer/CmdCreateTimer.java similarity index 100% rename from src/com/bonitasoft/custompage/towtruck/cmdtimer/CmdCreateTimer.java rename to src/main/java/com/bonitasoft/custompage/towtruck/cmdtimer/CmdCreateTimer.java diff --git a/src/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java similarity index 53% rename from src/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java rename to src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java index 30326a1..9ae3db6 100644 --- a/src/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java +++ b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/AttributeHolder.java @@ -3,34 +3,18 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.logging.Logger; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.sql.DataSource; - import org.bonitasoft.log.event.BEvent; -import org.omg.CORBA.portable.ValueFactory; public class AttributeHolder { - private static final BEvent EVENT_NO_DATASOURCE_FOUND = new BEvent(AttributeHolder.class.getName(), 1L, BEvent.Level.APPLICATIONERROR, "No Datasource detected", - "No datasource for Bonita Engine is found", - "Sql Request can't be executed.", - "Check the list of Datasource"); - private static final BEvent EVENT_SQLEXECUTION_ERROR = new BEvent(AttributeHolder.class.getName(), 2L, BEvent.Level.APPLICATIONERROR, "Error SQL", - "An SQL executin failed", - "SQL Request can't be executed.", - "Check the SQL request"); private static final BEvent EVENT_BAD_DECODAGE = new BEvent(AttributeHolder.class.getName(), 3L, BEvent.Level.APPLICATIONERROR, "Bad decodage", "One attribut definition is not correct", "Attribut definition is corrupted", @@ -46,6 +30,7 @@ public class AttributeHolder public TypeAttribute type; public String databaseProductName; + EngineSqlRequest engineSqlRequest = new EngineSqlRequest(); public static enum TypeAttribute { STRING, TEXT, INTEGER, HIDDEN, READONLY, SQL, JSON, LIST; @@ -58,8 +43,7 @@ public static enum TypeSqlResult UPPERCASE, LOWERCASE; } - public TypeSqlResult colSqlResult = TypeSqlResult.UPPERCASE; - public int selectTop = -1; + public AttributeHolder(String placeHolderString) { @@ -100,10 +84,10 @@ public List decodeAttribute() this.type = TypeAttribute.valueOf(attributeSplit[1].toUpperCase()); } if (attribute.startsWith("colnameresult:")) { - this.colSqlResult = TypeSqlResult.valueOf(attributeSplit[1].toUpperCase()); + engineSqlRequest.colSqlResult = TypeSqlResult.valueOf(attributeSplit[1].toUpperCase()); } if (attribute.startsWith("selecttop:")) { - this.selectTop = Integer.valueOf(attributeSplit[1]).intValue(); + engineSqlRequest.selectTop = Integer.parseInt(attributeSplit[1]); } if (attribute.startsWith("label:")) { this.label = attributeSplit[1]; @@ -122,15 +106,9 @@ public List decodeAttribute() } if (TypeAttribute.SQL.equals(this.type)) { - Connection con = null; - try - { - DataSource dataSource = getDataSourceConnection(); - if (dataSource != null) - { - con = dataSource.getConnection(); + + try ( Connection con = engineSqlRequest.getConnection() ) { this.databaseProductName = con.getMetaData().getDatabaseProductName(); - } } catch (Exception e) { @@ -139,33 +117,9 @@ public List decodeAttribute() String exceptionDetails = sw.toString(); logger.severe("CustomPageTowTruck.AttributHolder.executeSqlQuery Error during execute getDatabaseProperties: " + e.toString() + " : " + exceptionDetails); - if (con == null) { - return listEvents; - } - try - { - con.close(); - con = null; - } - catch (SQLException localSQLException) {} + return listEvents; } - finally - { - if (con != null) { - try - { - con.close(); - con = null; - } - catch (SQLException localSQLException1) {} - } - } - try - { - con.close(); - con = null; - } - catch (SQLException localSQLException2) {} + } return listEvents; } @@ -178,21 +132,21 @@ public List decodeAttribute() public List execute(Map allAnotherAttributes) { - List listEvents = new ArrayList(); + List listEvents = new ArrayList<>(); if (TypeAttribute.SQL.equals(this.type)) { - String sqlRequest = (String)this.mapSqlRequests.get(this.databaseProductName); + String sqlRequest = this.mapSqlRequests.get(this.databaseProductName); if (sqlRequest == null) { sqlRequest = (String)this.mapSqlRequests.get("all"); } - Map mapSql = new HashMap(); + Map mapSql = new HashMap<>(); mapSql.put("systemcurrenttimemillis", Long.valueOf(System.currentTimeMillis())); for (AttributeHolder attribut : allAnotherAttributes.values()) { mapSql.put(attribut.name, attribut.getShortValue()); } PlaceHolder placeHolder = new PlaceHolder(); String sqlRequestToExecute = placeHolder.replacePlaceHolder(sqlRequest, mapSql, "@@", "@@"); - executeSqlQuery(sqlRequestToExecute); + engineSqlRequest.executeSqlQuery(sqlRequestToExecute, null); listEvents.addAll(this.listEventSqlQuery); } return listEvents; @@ -205,7 +159,7 @@ public boolean isForm() public Map getForm() { - Map result = new HashMap(); + Map result = new HashMap<>(); result.put("label", this.label); result.put("name", this.name); result.put("type", this.type.toString()); @@ -275,23 +229,22 @@ public String getValue() String buildGroovyInitialisation = "{\n def list=[]\n Map record\n"; for (Map record : this.listRecordsSqlQuery) { - String valueRecord = ""; - for (String colId : record.keySet()) + StringBuilder valueRecord = new StringBuilder(); + for (Entry entry : record.entrySet()) { if (valueRecord.length() > 0) { - valueRecord = valueRecord + ", "; + valueRecord.append( ", "); } - valueRecord = valueRecord + "\"" + colId + "\": "; - Object valueKey = record.get(colId); - if (valueKey == null) { - valueRecord = valueRecord + "null"; - } else if (((valueKey instanceof Long)) || ((valueKey instanceof Integer))) { - valueRecord = valueRecord + valueKey; + valueRecord.append( "\"" + entry.getKey() + "\": "); + if (entry.getValue() == null) { + valueRecord.append( "null"); + } else if (((entry.getValue() instanceof Long)) || ((entry.getValue() instanceof Integer))) { + valueRecord.append( entry.getValue()); } else { - valueRecord = valueRecord + "\"" + valueKey.toString() + "\""; + valueRecord.append( "\"" + entry.getValue().toString() + "\""); } } - buildGroovyInitialisation = buildGroovyInitialisation + " record=[" + valueRecord + "]\n list.add(record)\n"; + buildGroovyInitialisation = buildGroovyInitialisation + " record=[" + valueRecord.toString() + "]\n list.add(record)\n"; } buildGroovyInitialisation = buildGroovyInitialisation + " return list}()\n"; return buildGroovyInitialisation; @@ -303,128 +256,5 @@ public String getValue() public List> listRecordsSqlQuery = new ArrayList>(); public int totalCountSqlQuery; - private void executeSqlQuery(String sqlRequest) - { - logger.info("Custompage_twoTruck.AttributHolder execute sqlRequest[" + sqlRequest + "]"); - this.listRecordsSqlQuery = new ArrayList>(); - Connection con = null; - PreparedStatement pstmt = null; - ResultSet rs = null; - try - { - DataSource dataSource = getDataSourceConnection(); - if (dataSource == null) - { - this.listEventSqlQuery.add(EVENT_NO_DATASOURCE_FOUND); - return; - } - con = dataSource.getConnection(); - - pstmt = con.prepareStatement(sqlRequest); - - rs = pstmt.executeQuery(); - this.totalCountSqlQuery = 0; - while (rs.next()) - { - this.totalCountSqlQuery += 1; - if (this.totalCountSqlQuery <= this.selectTop) - { - Map record = new HashMap(); - - ResultSetMetaData rsMetaData = rs.getMetaData(); - for (int i = 1; i <= rsMetaData.getColumnCount(); i++) - { - String colName = rsMetaData.getColumnName(i); - record.put(this.colSqlResult == TypeSqlResult.UPPERCASE ? colName.toUpperCase() : colName.toLowerCase(), rs.getObject(i)); - } - this.listRecordsSqlQuery.add(record); - } - } - } - catch (Exception e) - { - StringWriter sw = new StringWriter(); - e.printStackTrace(new PrintWriter(sw)); - String exceptionDetails = sw.toString(); - logger.severe("CustomPageTowTruck.AttributHolder.executeSqlQuery Error during execute Sql[" + sqlRequest + "] : " + e.toString() + - " : " + exceptionDetails); - this.listEventSqlQuery.add(new BEvent(EVENT_SQLEXECUTION_ERROR, e, "SqlRequest=[" + sqlRequest + "]")); - if (rs != null) { - try - { - rs.close(); - rs = null; - } - catch (SQLException localSQLException3) {} - } - if (pstmt != null) { - try - { - pstmt.close(); - pstmt = null; - } - catch (SQLException localSQLException4) {} - } - if (con != null) { - try - { - con.close(); - con = null; - } - catch (SQLException localSQLException5) {} - } - } - finally - { - if (rs != null) { - try - { - rs.close(); - rs = null; - } - catch (SQLException localSQLException6) {} - } - if (pstmt != null) { - try - { - pstmt.close(); - pstmt = null; - } - catch (SQLException localSQLException7) {} - } - if (con != null) { - try - { - con.close(); - con = null; - } - catch (SQLException localSQLException8) {} - } - } - } - - private String[] listDataSourcesEngine = { "java:/comp/env/bonitaSequenceManagerDS", - "java:jboss/datasources/bonitaSequenceManagerDS" }; - private DataSource getDataSourceConnection() - { - String msg = ""; - List listDatasourceToCheck = new ArrayList (); - for (String dataSourceString : this.listDataSourcesEngine) { - listDatasourceToCheck.add(dataSourceString); - } - for (String dataSourceString : listDatasourceToCheck) { - try - { - Object ctx = new InitialContext(); - return (DataSource)((Context)ctx).lookup(dataSourceString); - } - catch (NamingException e) - { - msg = msg + "DataSource[" + dataSourceString + "] : error " + e.toString() + ";"; - } - } - logger.severe("CustomPageTowTruck.AttributHolder.getDataSourceConnection: Can't found a datasource : " + msg); - return null; - } } diff --git a/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/EngineSqlRequest.java b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/EngineSqlRequest.java new file mode 100644 index 0000000..6fca850 --- /dev/null +++ b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/EngineSqlRequest.java @@ -0,0 +1,163 @@ +package com.bonitasoft.custompage.towtruck.groovymaintenance; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.sql.DataSource; + +import org.bonitasoft.log.event.BEvent; + +import com.bonitasoft.custompage.towtruck.groovymaintenance.AttributeHolder.TypeSqlResult; + +public class EngineSqlRequest { + + private static final BEvent EVENT_NO_DATASOURCE_FOUND = new BEvent(EngineSqlRequest.class.getName(), 1L, BEvent.Level.APPLICATIONERROR, "No Datasource detected", + "No datasource for Bonita Engine is found", + "Sql Request can't be executed.", + "Check the list of Datasource"); + private static final BEvent EVENT_SQLEXECUTION_ERROR = new BEvent(EngineSqlRequest.class.getName(), 2L, BEvent.Level.APPLICATIONERROR, "Error SQL", + "An SQL executin failed", + "SQL Request can't be executed.", + "Check the SQL request"); + public static Logger logger = Logger.getLogger(EngineSqlRequest.class.getName()); + + public List listEventSqlQuery = new ArrayList<>(); + public List> listRecordsSqlQuery = new ArrayList<>(); + public int totalCountSqlQuery; + public int selectTop = -1; + public TypeSqlResult colSqlResult = TypeSqlResult.UPPERCASE; + + /** + * @param sqlRequest + */ + public void executeSqlQuery(String sqlRequest, List parameters) { + logger.info("Custompage_twoTruck.AttributHolder execute sqlRequest[" + sqlRequest + "]"); + this.listRecordsSqlQuery = new ArrayList>(); + Connection con = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + DataSource dataSource = getDataSourceConnection(); + if (dataSource == null) { + this.listEventSqlQuery.add(EVENT_NO_DATASOURCE_FOUND); + return; + } + con = dataSource.getConnection(); + + pstmt = con.prepareStatement(sqlRequest); + + if (parameters!=null) + for (int i=0;i record = new HashMap(); + + ResultSetMetaData rsMetaData = rs.getMetaData(); + for (int i = 1; i <= rsMetaData.getColumnCount(); i++) { + String colName = rsMetaData.getColumnName(i); + record.put(this.colSqlResult == TypeSqlResult.UPPERCASE ? colName.toUpperCase() : colName.toLowerCase(), rs.getObject(i)); + } + this.listRecordsSqlQuery.add(record); + } + } + } catch (Exception e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + String exceptionDetails = sw.toString(); + logger.severe("CustomPageTowTruck.AttributHolder.executeSqlQuery Error during execute Sql[" + sqlRequest + "] : " + e.toString() + + " : " + exceptionDetails); + this.listEventSqlQuery.add(new BEvent(EVENT_SQLEXECUTION_ERROR, e, "SqlRequest=[" + sqlRequest + "]")); + if (rs != null) { + try { + rs.close(); + rs = null; + } catch (SQLException localSQLException3) { + } + } + if (pstmt != null) { + try { + pstmt.close(); + pstmt = null; + } catch (SQLException localSQLException4) { + } + } + if (con != null) { + try { + con.close(); + con = null; + } catch (SQLException localSQLException5) { + } + } + } finally { + if (rs != null) { + try { + rs.close(); + rs = null; + } catch (SQLException localSQLException6) { + } + } + if (pstmt != null) { + try { + pstmt.close(); + pstmt = null; + } catch (SQLException localSQLException7) { + } + } + if (con != null) { + try { + con.close(); + con = null; + } catch (SQLException localSQLException8) { + } + } + } + } + + public Connection getConnection() throws SQLException { + DataSource dataSource = getDataSourceConnection(); + if (dataSource != null) { + return dataSource.getConnection(); + } + return null; + } + + private String[] listDataSourcesEngine = { "java:/comp/env/bonitaSequenceManagerDS", + "java:jboss/datasources/bonitaSequenceManagerDS" }; + + private DataSource getDataSourceConnection() { + String msg = ""; + List listDatasourceToCheck = new ArrayList(); + for (String dataSourceString : this.listDataSourcesEngine) { + listDatasourceToCheck.add(dataSourceString); + } + for (String dataSourceString : listDatasourceToCheck) { + try { + Object ctx = new InitialContext(); + return (DataSource) ((Context) ctx).lookup(dataSourceString); + } catch (NamingException e) { + msg = msg + "DataSource[" + dataSourceString + "] : error " + e.toString() + ";"; + } + } + logger.severe("CustomPageTowTruck.AttributHolder.getDataSourceConnection: Can't found a datasource : " + msg); + return null; + } +} diff --git a/src/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java similarity index 92% rename from src/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java rename to src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java index a3ca15f..61d7df4 100644 --- a/src/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java +++ b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/GroovyMaintenance.java @@ -1,8 +1,6 @@ package com.bonitasoft.custompage.towtruck.groovymaintenance; import java.io.File; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -22,15 +20,14 @@ import org.bonitasoft.store.BonitaStore.UrlToDownload; import org.bonitasoft.store.BonitaStoreAPI; import org.bonitasoft.store.BonitaStoreGit; -import org.bonitasoft.store.StoreResult; -import org.bonitasoft.store.artefact.Artefact; -import org.bonitasoft.store.artefact.Artefact.TypeArtefact; +import org.bonitasoft.store.BonitaStoreResult; +import org.bonitasoft.store.artifact.Artifact; +import org.bonitasoft.store.artifact.Artifact.TypeArtifact; import org.bonitasoft.store.toolbox.LoggerStore; import org.codehaus.groovy.control.CompilerConfiguration; import com.bonitasoft.custompage.towtruck.groovymaintenance.AttributeHolder.TypeAttribute; - import groovy.lang.Binding; import groovy.lang.GroovyShell; @@ -88,11 +85,11 @@ public static Map getGroovyMaintenance(HttpServletRequest reques listStores.add(bonitaStoreGit); DetectionParameters detectionParameters = new BonitaStore.DetectionParameters(); - detectionParameters.listTypeArtefact = Arrays.asList(TypeArtefact.GROOVY); - Artefact groovyArtefact = null; + detectionParameters.listTypeArtifact = Arrays.asList(TypeArtifact.GROOVY); + Artifact groovyArtefact = null; for (BonitaStore bonitaStore : listStores) { - StoreResult storeResult = bonitaStore.getListArtefacts(detectionParameters, logBox); + BonitaStoreResult storeResult = bonitaStore.getListArtefacts(detectionParameters, logBox); listEvents.addAll(storeResult.getEvents()); groovyArtefact = storeResult.getArtefactByName(groovyCode); if (groovyArtefact != null) { @@ -103,11 +100,9 @@ public static Map getGroovyMaintenance(HttpServletRequest reques if (groovyArtefact == null) { listEvents.add(new BEvent(NO_CODE_FOUND, "Code[" + groovyCode + "]")); } else { - List> listPlaceHolder = new ArrayList>(); - Map mapPlaceHolder = new HashMap(); - + // load it - StoreResult storeResult = groovyArtefact.getProvider().downloadArtefact(groovyArtefact, UrlToDownload.URLDOWNLOAD, logBox); + BonitaStoreResult storeResult = groovyArtefact.getStore().downloadArtefact(groovyArtefact, UrlToDownload.URLDOWNLOAD, logBox); listEvents.addAll(storeResult.getEvents()); @@ -217,11 +212,14 @@ public static Map executeGroovyMaintenance(HttpServletRequest re // place holder is in the session every time if (httpSession!=null) { - Map mapPlaceHolderSt = (Map) httpSession.getAttribute("placeholder"); + @SuppressWarnings("rawtypes") + Map mapPlaceHolderSt = (Map) httpSession.getAttribute("placeholder"); // rebuild the attributes - for (String keyAttribute : mapPlaceHolderSt.values()) { - AttributeHolder attribute = AttributeHolder.getInstanceFromSerialisation(keyAttribute); - mapPlaceHolder.put(attribute.name, attribute); + if (mapPlaceHolderSt!=null) { + for (String keyAttribute : mapPlaceHolderSt.values()) { + AttributeHolder attribute = AttributeHolder.getInstanceFromSerialisation(keyAttribute); + mapPlaceHolder.put(attribute.name, attribute); + } } } diff --git a/src/com/bonitasoft/custompage/towtruck/groovymaintenance/PlaceHolder.java b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/PlaceHolder.java similarity index 100% rename from src/com/bonitasoft/custompage/towtruck/groovymaintenance/PlaceHolder.java rename to src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/PlaceHolder.java diff --git a/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/TowTruckToolbox.java b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/TowTruckToolbox.java new file mode 100644 index 0000000..5ae1c6f --- /dev/null +++ b/src/main/java/com/bonitasoft/custompage/towtruck/groovymaintenance/TowTruckToolbox.java @@ -0,0 +1,175 @@ +package com.bonitasoft.custompage.towtruck.groovymaintenance; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class TowTruckToolbox { + + public TowTruckToolbox() { + // nothing specialo to do + } + + /* -------------------------------------------------------------------- */ + /* */ + /* Bonita Engine SQL Request */ + /* */ + /* -------------------------------------------------------------------- */ + + public List> executeSqlRequest(String sqlRequest, int maxRecord) { + return executeSqlRequest(sqlRequest, null, maxRecord); + } + + public List> executeSqlRequest(String sqlRequest, List parameters, int maxRecord) { + EngineSqlRequest engineSqlRequest = new EngineSqlRequest(); + engineSqlRequest.selectTop = maxRecord; + engineSqlRequest.executeSqlQuery(sqlRequest, parameters); + return engineSqlRequest.listRecordsSqlQuery; + } + + + public String decoratorHtmlFormated(List> listValues) { + StringBuilder result = new StringBuilder(); + List listHeaders = getHeader(listValues); + if (listValues == null || listValues.isEmpty() || listHeaders == null) + return "No records"; + + // Explore the size for each header + Map sizePerHeader = new HashMap<>(); + for (String header : listHeaders) { + sizePerHeader.put(header, header.length()); + } + + for (Map record : listValues) { + for (String header : listHeaders) { + Integer size = sizePerHeader.get(header); + Object value = record.get(header); + if (value != null && value.toString().length() > size.intValue()) + sizePerHeader.put(header, value.toString().length()); + } + } + + // produce the header + result.append(""); + + result.append(""); + for (String header : listHeaders) { + result.append(""); + } + result.append(""); + + + // produce the result + + for (Map record : listValues) { + result.append(""); + for (String header : listHeaders) { + Object value = record.get(header); + result.append(""); + } + result.append(""); + } + + result.append("
"+header+ "
"+(value == null ? "" : value.toString()) + "
"); + result.append("Number of records : "+listValues.size()); + return result.toString(); + + + + } + + public String decoratorTextFormated(List> listValues) { + return decoratorFormated(listValues, " ", "\n"); + } + /** + * @param listValues + * @return + */ + + private String decoratorFormated(List> listValues, String blanck, String carriageReturn) { + StringBuilder result = new StringBuilder(); + List listHeaders = getHeader(listValues); + if (listValues == null || listValues.isEmpty() || listHeaders == null) + return "No records"; + + // Explore the size for each header + Map sizePerHeader = new HashMap<>(); + for (String header : listHeaders) { + sizePerHeader.put(header, header.length()); + } + + for (Map record : listValues) { + for (String header : listHeaders) { + Integer size = sizePerHeader.get(header); + Object value = record.get(header); + if (value != null && value.toString().length() > size.intValue()) + sizePerHeader.put(header, value.toString().length()); + } + } + + // produce the header + result.append("|"); + for (String header : listHeaders) { + result.append(completeString(header, sizePerHeader.get(header).intValue(), blanck) + "|"); + } + result.append(carriageReturn+"|"); + for (String header : listHeaders) { + result.append(completeString("-", sizePerHeader.get(header).intValue(), "-") + "|"); + } + result.append(carriageReturn); + + // produce the result + + for (Map record : listValues) { + result.append("|"); + for (String header : listHeaders) { + Object value = record.get(header); + result.append(completeString(value == null ? "" : value.toString(), sizePerHeader.get(header).intValue(), blanck) + "|"); + } + result.append(carriageReturn); + } + + return result.toString(); + + } + + public String decoratorCsv(List> listValues) { + StringBuilder result = new StringBuilder(); + List listHeaders = getHeader(listValues); + if (listValues == null || listValues.isEmpty() || listHeaders == null) + return result.toString(); + + // Explore the size for each header + + // produce the result + for (Map record : listValues) { + for (int i = 0; i < listHeaders.size(); i++) { + if (i > 0) + result.append(";"); + result.append(record.get(listHeaders.get(i))); + } + result.append("\n"); + } + + return result.toString(); + } + + private String completeString(String value, int size, String completion) { + StringBuilder result = new StringBuilder(); + result.append(value); + int missing = size-result.length(); + for (int i=0;i getHeader(List> listValues) { + if (listValues.isEmpty()) + return null; + + return listValues.get(0).keySet().stream().collect(Collectors.toList()); + } + +}