Hi Nicolas,

thank you, this is great feedback!
Please see some comments inline:

On Fri, Jun 30, 2017 at 11:33 PM, Nicolas Malin <[email protected]>
wrote:

> 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
>

We could probably make the existing EntityQuery.where(Map) method more
clever and automatically exclude fields that are not in the entity
definition; after that we could use:

GenericValue product = from("Product").where(groovyCtx).findOne()


>
> 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
>
>
We could probably improve the GroovyBaseScript.runService(...) method to
always prepare a valid context before calling the service; in this way we
would simply call runService passing the context map.


> 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'
>
>
String message = getLabel withName: 'AccountingUpdateRateAmountAlreadyExist',
from: 'AccountingErrorUiLabels'
that could be also called with:
String message = getLabel 'AccountingUpdateRateAmountAlreadyExist',
'AccountingErrorUiLabels'



> 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 love it


Kind regards,

Jacopo

*******
>
> I tried to implement "prepapre" for fun with success below :)
>
> Index: framework/service/src/main/java/org/apache/ofbiz/service/eng
> ine/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('dispatche
> r').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('parameter
> s')))
> +        }
> +    }
> +
>      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(bindi
> ng.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/FindInvoicesBy
> DueDate.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: 'getInvoicePaymentInfoListByDu
> eDateOffset'
>      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(looke
> dUpValue.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/OfbizDslD
> escriptorForIntelliJ.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...']
> --
> logoNrd <https://nereide.fr/>
>         Nicolas Malin
> The apache way <http://theapacheway.com/> : *Openness* Technical
> decisions are made publicly
> [email protected]
> 8 rue des Déportés 37000 TOURS, 02 47 50 30 54
>
> Apache OFBiz <http://ofbiz.apache.org/>|The Apache Way <
> http://theapacheway.com/>|ofbiz-fr <http://www.ofbiz-fr.org/>|réseau LE <
> http://www.libre-entreprise.org/>
>

Reply via email to