Hi Nico,

Did not read it all, but sounds promising. Going to bed anyway :D

Jacques


Le 30/06/2017 à 23:33, Nicolas Malin a écrit :
Hello

I found some idea to improve the groovy DSL during my first try to convert 
mini-lang.
I don't know if it's possible or logical at this time but I just sharing my 
mind :)

****
entity-one : with the minilang is really usefull to call directly a entity like 
that
    <entity-one entity-name="Product" value-name="product"/>
currently with groovy
    GenericValue product = from("Product").where([productId: 
productId).findOne()
we lose the automapping so I imagine a syntax like that :
    GenericValue product = from("Product").autoMap(groovyCtx).findOne()
or
    GenericValue product = from("Product").findOne(groovyCtx)
or
    GenericValue product = from("Product").resolveOne(groovyCtx)
or something like that

Make valid service context :
in minilang
    <set-service-fields service-name="createProduct" map="context" 
to-map="createProductMap"/>
Currently with groovy we need to call the dispatchcontext
    Map createProductMap = 
dispatcher.getDispatchContext().makeValidContext('createProduct', 'IN', 
parameters)
My idea would be like that
    Map createProductMap = prepare service: 'createProduct' //to pool from 
groovyCtx
or
    Map createProductMap = prepare service: 'createProduct' with: parameters 
//to pool from parameters
or
    Map createProductMap = prepare service: 'createProduct' with: parameters 
mode: 'IN' //to pool from parameters and indicate the mode

It's would be the same to prepare a genericValue:
    GenericValue product = prepare entity: 'Product' with: parameters

Resolve a label
in minilang
    <fail-property resource="AccountingUiLabels" 
property="AccountingCreatePaymentPermissionError"/>
in groovy
    String message = UtilProperties.getMessage('AccountingErrorUiLabels', 
'AccountingUpdateRateAmountAlreadyExist', locale)
My idea
    String message = message: 'AccountingUpdateRateAmountAlreadyExist', from: 
'AccountingErrorUiLabels', with: 'messageCtx'

Security control
in minilang
    <if-has-permission permission="ACCOUNTING" action="_CREATE"/>
in groovy
    if (security.hasPermission("ACCOUNTING_CREATE", userLogin))
My idea
    if (has permission: 'ACCOUNTING_CREATE')
*******

I tried to implement "prepapre" for fun with success below :)

Index: 
framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyBaseScript.groovy
===================================================================
--- 
framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyBaseScript.groovy
 (révision 1800195)
+++ 
framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyBaseScript.groovy
 (copie de travail)
@@ -19,6 +19,8 @@
 package org.apache.ofbiz.service.engine

 import org.apache.ofbiz.base.util.Debug
+import org.apache.ofbiz.entity.finder.PrimaryKeyFinder
+import org.apache.ofbiz.entity.model.ModelEntity
 import org.apache.ofbiz.entity.util.EntityQuery
 import org.apache.ofbiz.service.ServiceUtil
 import org.apache.ofbiz.service.ExecutionServiceException
@@ -47,6 +49,15 @@
         return runService((String)args.get('service'), (Map)args.get('with', 
new HashMap()))
     }

+    Map prepare(Map args) throws ExecutionServiceException {
+        if ((String)args.get('service')) {
+ return result = binding.getVariable('dispatcher').getDispatchContext().makeValidContext((String) args.get('service'), "IN", (Map) args.get('with', binding.getVariable('parameters')))
+        }
+        if ((String)args.get('entity')) {
+ return result = binding.getVariable('delegator').makeValidValue((String) args.get('entity'), (Map) args.get('with', binding.getVariable('parameters')))
+        }
+    }
+
     Map makeValue(String entityName) throws ExecutionServiceException {
         return result = binding.getVariable('delegator').makeValue(entityName)
     }
@@ -63,6 +74,13 @@
         return EntityQuery.use(binding.getVariable('delegator')).select(fields)
     }

+    Map fromOneAuto(def entity) {
+        Debug.logError( ' ' + binding.getVariables(), '######')
+        return result = 
PrimaryKeyFinder.runFind(binding.getVariable('delegator').getModelEntity(entity),
+                binding.getVariables(), binding.getVariable('delegator'), 
true, true, null, null)
+
+    }
+
     def success(String message) {
         // TODO: implement some clever i18n mechanism based on the userLogin 
and locale in the binding
         if (this.binding.hasVariable('request')) {
Index: 
applications/accounting/groovyScripts/payment/FindInvoicesByDueDate.groovy
===================================================================
--- applications/accounting/groovyScripts/payment/FindInvoicesByDueDate.groovy 
(révision 1800195)
+++ applications/accounting/groovyScripts/payment/FindInvoicesByDueDate.groovy 
(copie de travail)
@@ -20,7 +20,7 @@
 context.invoicePaymentInfoList = []

 if (parameters.invoiceTypeId) { // it's not the initialisation but a real 
search request
-    serviceCtx = 
dispatcher.getDispatchContext().makeValidContext("getInvoicePaymentInfoListByDueDateOffset",
 "IN", parameters)
+    serviceCtx = prepare service: 'getInvoicePaymentInfoListByDueDateOffset'
     result = runService("getInvoicePaymentInfoListByDueDateOffset", serviceCtx)
     context.invoicePaymentInfoList = result.invoicePaymentInfoList
 }
Index: applications/accounting/groovyScripts/rate/RateServices.groovy
===================================================================
--- applications/accounting/groovyScripts/rate/RateServices.groovy (révision 
1800245)
+++ applications/accounting/groovyScripts/rate/RateServices.groovy (copie de 
travail)
@@ -31,7 +31,7 @@
  * Service to create a rate amount value, if a existing value is present 
expire it before
  */
 def updateRateAmount() {
-    GenericValue newEntity = delegator.makeValidValue('RateAmount', parameters)
+    GenericValue newEntity = prepare entity: 'RateAmount'
     if (!newEntity.rateCurrencyUomId) {
         newEntity.rateCurrencyUomId = 
UtilProperties.getPropertyValue('general.properties', 'currency.uom.id.default')
     }
@@ -65,11 +65,11 @@
  * Service to expire a rate amount value
  */
 def expireRateAmount() {
-    GenericValue lookedUpValue = delegator.makeValidValue('RateAmount', 
parameters)
+    GenericValue lookedUpValue = prepare entity: 'RateAmount'
     if (!lookedUpValue.rateCurrencyUomId) {
         lookedUpValue.rateCurrencyUomId = 
UtilProperties.getPropertyValue('general.properties', 'currency.uom.id.default')
     }
-    lookedUpValue = 
from('RateAmount').where(lookedUpValue.getFields(lookedUpValue.getModelEntity().getPkFieldNames())).queryOne()
+    lookedUpValue = fromOneAuto('RateAmount')
     if (lookedUpValue) {
         Timestamp previousDay = 
UtilDateTime.adjustTimestamp(UtilDateTime.nowTimestamp(), 5, -1)
         lookedUpValue.thruDate = UtilDateTime.getDayEnd(previousDay)
@@ -93,7 +93,7 @@
         GenericValue partyRate = EntityUtil.getFirst(partyRates)
         partyRate.thruDate = UtilDateTime.nowTimestamp()
     }
-    GenericValue newEntity = delegator.makeValidValue('PartyRate', parameters)
+    GenericValue newEntity = prepare entity: 'PartyRate'
     if (!newEntity.fromDate) newEntity.fromDate = UtilDateTime.nowTimestamp()
     newEntity.create()

Index: 
framework/base/src/main/java/org/apache/ofbiz/base/OfbizDslDescriptorForIntelliJ.gdsl
===================================================================
--- 
framework/base/src/main/java/org/apache/ofbiz/base/OfbizDslDescriptorForIntelliJ.gdsl
 (révision 1800195)
+++ 
framework/base/src/main/java/org/apache/ofbiz/base/OfbizDslDescriptorForIntelliJ.gdsl
 (copie de travail)
@@ -29,6 +29,7 @@

     method name: 'runService', type: 'java.util.Map', params: [serviceName: 
'String', inputMap: 'java.util.Map']
     method name: 'run', type: 'java.util.Map', params: [args: 'java.util.Map']
+    method name: 'prepare', type: 'java.util.Map', params: [args: 
'java.util.Map']
     method name: 'makeValue', type: 'java.util.Map', params: [entityName: 
'String']
     method name: 'select', type: 'org.apache.ofbiz.entity.util.EntityQuery', 
params: [entity: 'java.util.Set']
     method name: 'select', type: 'org.apache.ofbiz.entity.util.EntityQuery', 
params: [entity: 'String...']

Reply via email to