Author: jonesde
Date: Thu Jul 24 01:24:43 2008 New Revision: 679301 URL: http://svn.apache.org/viewvc?rev=679301&view=rev Log: One more enhancement to entity-auto to automatically handle the oldStatusId OUT population and checking StatusValidChange for status changes; note that this does nothing to keep a status history, that should be done in a custom service called by SECA rule Modified: ofbiz/trunk/framework/common/config/CommonUiLabels.xml ofbiz/trunk/framework/example/config/ExampleUiLabels.xml ofbiz/trunk/framework/example/script/org/ofbiz/example/example/ExampleServices.xml ofbiz/trunk/framework/example/servicedef/services.xml ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java Modified: ofbiz/trunk/framework/common/config/CommonUiLabels.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/config/CommonUiLabels.xml?rev=679301&r1=679300&r2=679301&view=diff ============================================================================== --- ofbiz/trunk/framework/common/config/CommonUiLabels.xml (original) +++ ofbiz/trunk/framework/common/config/CommonUiLabels.xml Thu Jul 24 01:24:43 2008 @@ -1955,8 +1955,11 @@ <value xml:lang="de">Fehler: Statuswechsel von [${lookedUpValue.statusId}] nach [${parameters.statusId}] ist nicht erlaubt.</value> <value xml:lang="en">Error: status change from [${lookedUpValue.statusId}] to [${parameters.statusId}] is not allowed.</value> <value xml:lang="fr">Erreur le changement de status depuis [${lookedUpValue.statusId}] vers [${parameters.statusId}] n'est pas autorisé.</value> - <value xml:lang="th">Error: à¸à¹à¸à¸à¸´à¸à¸à¸¥à¸²à¸ ! à¹à¸¡à¹à¸à¸à¸¸à¸à¸²à¸à¸´à¹à¸à¸¥à¸µà¹à¸¢à¸à¸ªà¸à¸²à¸à¸°à¸à¸²à¸ [${lookedUpValue.statusId}] à¹à¸à¹à¸ [${parameters.statusId}] -</value> + <value xml:lang="it">Errore: stato cambiato da [${lookedUpValue.statusId}] a [${parameters.statusId}] non è permesso</value> + <value xml:lang="ro">Eroare: stato schimbat de la [${lookedUpValue.statusId}] la [${parameters.statusId}] nu este permis</value> + <value xml:lang="ru">ÐÑибка: изменение ÑÑаÑÑÑа Ñ [${lookedUpValue.statusId}] на [${parameters.statusId}] запÑеÑено.</value> + <value xml:lang="th">Error: à¸à¹à¸à¸à¸´à¸à¸à¸¥à¸²à¸ ! à¹à¸¡à¹à¸à¸à¸¸à¸à¸²à¸à¸´à¹à¸à¸¥à¸µà¹à¸¢à¸à¸ªà¸à¸²à¸à¸°à¸à¸²à¸ [${lookedUpValue.statusId}] à¹à¸à¹à¸ [${parameters.statusId}]</value> + <value xml:lang="zh">é误: ä¸å 许æç¶æä»[${lookedUpValue.statusId}]å为[${parameters.statusId}]ã</value> </property> <property key="CommonEventDate"> <value xml:lang="ar">تارÙØ® اÙØدث</value> Modified: ofbiz/trunk/framework/example/config/ExampleUiLabels.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/config/ExampleUiLabels.xml?rev=679301&r1=679300&r2=679301&view=diff ============================================================================== --- ofbiz/trunk/framework/example/config/ExampleUiLabels.xml (original) +++ ofbiz/trunk/framework/example/config/ExampleUiLabels.xml Thu Jul 24 01:24:43 2008 @@ -151,14 +151,6 @@ <value xml:lang="ru">ÐÑигиналÑнÑй пÑимеÑ</value> <value xml:lang="th">à¸à¸±à¸§à¸à¸¢à¹à¸²à¸à¹à¸à¸´à¸¡</value> </property> - <property key="ExampleErrorNoExampleStatusValidChange"> - <value xml:lang="en">Error: status change from [${lookedUpValue.statusId}] to [${parameters.statusId}] is not allowed.</value> - <value xml:lang="it">Errore: stato cambiato da [${lookedUpValue.statusId}] a [${parameters.statusId}] non è permesso</value> - <value xml:lang="ro">Eroare: stato schimbat de la [${lookedUpValue.statusId}] la [${parameters.statusId}] nu este permis</value> - <value xml:lang="ru">ÐÑибка: изменение ÑÑаÑÑÑа Ñ [${lookedUpValue.statusId}] на [${parameters.statusId}] запÑеÑено.</value> - <value xml:lang="th">Error: à¹à¸¡à¹à¸ªà¸²à¸¡à¸²à¸£à¸à¹à¸à¸¥à¸µà¹à¸à¹à¸à¸¥à¸à¸ªà¸à¸²à¸à¸°à¸à¸²à¸ [${lookedUpValue.statusId}] à¹à¸à¹à¸ [${parameters.statusId}] à¹à¸à¹</value> - <value xml:lang="zh">é误: ä¸å 许æç¶æä»[${lookedUpValue.statusId}]å为[${parameters.statusId}]ã</value> - </property> <property key="ExamplePermissionError"> <value xml:lang="en">Security Error: to run ${resourceDescription} you must have the EXAMPLE_${mainAction} or EXAMPLE_ADMIN permission</value> <value xml:lang="it">Errore Sicurezza: per eseguire ${resourceDescription} tu devi avere il permesso EXAMPLE${mainAction} o EXAMPLE_ADMIN</value> Modified: ofbiz/trunk/framework/example/script/org/ofbiz/example/example/ExampleServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/script/org/ofbiz/example/example/ExampleServices.xml?rev=679301&r1=679300&r2=679301&view=diff ============================================================================== --- ofbiz/trunk/framework/example/script/org/ofbiz/example/example/ExampleServices.xml (original) +++ ofbiz/trunk/framework/example/script/org/ofbiz/example/example/ExampleServices.xml Thu Jul 24 01:24:43 2008 @@ -20,31 +20,7 @@ <simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd"> - <!-- Example methods --> - <simple-method method-name="updateExample" short-description="update a Example"> - <entity-one entity-name="Example" value-name="lookedUpValue"/> - - <!-- handle statusId change stuff; first put the current statusId in the oldStatusId result --> - <field-to-result field-name="lookedUpValue.statusId" result-name="oldStatusId"/> - <if-compare-field field="lookedUpValue.statusId" operator="not-equals" to-field="parameters.statusId"> - <!-- if the record exists there should be a statusId, but just in case make it so it won't blow up --> - <if-not-empty field="lookedUpValue.statusId"> - <!-- if statusId change is not in the StatusValidChange list, complain... --> - <entity-one entity-name="StatusValidChange" value-name="statusValidChange" auto-field-map="false"> - <field-map field-name="statusId" env-name="lookedUpValue.statusId"/> - <field-map field-name="statusIdTo" env-name="parameters.statusId"/> - </entity-one> - <if-empty field="statusValidChange"> - <!-- no valid change record found? return an error... --> - <add-error><fail-property resource="ExampleUiLabels" property="ExampleErrorNoExampleStatusValidChange"/></add-error> - <check-errors/> - </if-empty> - </if-not-empty> - </if-compare-field> - - <set-nonpk-fields map-name="parameters" value-name="lookedUpValue"/> - <store-value value-name="lookedUpValue"/> - </simple-method> + <!-- ExampleStatus methods --> <simple-method method-name="createExampleStatus" short-description="create a ExampleItem"> <now-timestamp-to-env env-name="nowTimestamp"/> Modified: ofbiz/trunk/framework/example/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/servicedef/services.xml?rev=679301&r1=679300&r2=679301&view=diff ============================================================================== --- ofbiz/trunk/framework/example/servicedef/services.xml (original) +++ ofbiz/trunk/framework/example/servicedef/services.xml Thu Jul 24 01:24:43 2008 @@ -34,8 +34,7 @@ <override name="statusId" optional="false"/> <override name="exampleName" optional="false"/> </service> - <service name="updateExample" default-entity-name="Example" engine="simple" - location="component://example/script/org/ofbiz/example/example/ExampleServices.xml" invoke="updateExample" auth="true"> + <service name="updateExample" default-entity-name="Example" engine="entity-auto" invoke="update" auth="true"> <description>Update a Example</description> <permission-service service-name="exampleGenericPermission" main-action="UPDATE"/> <auto-attributes include="pk" mode="IN" optional="false"/> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java?rev=679301&r1=679300&r2=679301&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java Thu Jul 24 01:24:43 2008 @@ -19,11 +19,15 @@ package org.ofbiz.service.engine; import java.util.Iterator; +import java.util.Locale; import java.util.Map; +import javolution.util.FastMap; + import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.GeneralException; import org.ofbiz.base.util.UtilDateTime; +import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.finder.PrimaryKeyFinder; @@ -57,10 +61,12 @@ /** * @see org.ofbiz.service.engine.GenericEngine#runSync(java.lang.String, org.ofbiz.service.ModelService, java.util.Map) */ - public Map<String, Object> runSync(String localName, ModelService modelService, Map<String, Object> context) throws GenericServiceException { + public Map<String, Object> runSync(String localName, ModelService modelService, Map<String, Object> parameters) throws GenericServiceException { // static java service methods should be: public Map<String, Object> methodName(DispatchContext dctx, Map<String, Object> context) DispatchContext dctx = dispatcher.getLocalContext(localName); + Map<String, Object> localContext = FastMap.newInstance(); + localContext.put("parameters", parameters); Map<String, Object> result = ServiceUtil.returnSuccess(); // check the package and method names @@ -158,7 +164,7 @@ * */ - Object pkValue = context.get(singlePkModelParam.name); + Object pkValue = parameters.get(singlePkModelParam.name); if (UtilValidate.isEmpty(pkValue)) { pkValue = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName()); } else { @@ -188,7 +194,7 @@ <create-value value-name="newEntity"/> */ - newEntity.setPKFields(context, true); + newEntity.setPKFields(parameters, true); dctx.getDelegator().setNextSubSeqId(newEntity, doublePkSecondaryOutField.getName(), 5, 1); result.put(doublePkSecondaryOutParam.name, newEntity.get(doublePkSecondaryOutField.getName())); } else if (allPksInOnly) { @@ -203,7 +209,7 @@ <create-value value-name="newEntity"/> * */ - newEntity.setPKFields(context, true); + newEntity.setPKFields(parameters, true); } else { throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the create invoke option: " + "could not find a valid combination of primary key settings to do a known create operation; options include: " + @@ -217,12 +223,12 @@ ModelField fromDateField = modelEntity.getField("fromDate"); if (fromDateField != null && fromDateField.getIsPk()) { ModelParam fromDateParam = modelService.getParam("fromDate"); - if (fromDateParam == null || (fromDateParam.isOptional() && context.get("fromDate") == null)) { + if (fromDateParam == null || (fromDateParam.isOptional() && parameters.get("fromDate") == null)) { newEntity.set("fromDate", UtilDateTime.nowTimestamp()); } } - newEntity.setNonPKFields(context, true); + newEntity.setNonPKFields(parameters, true); newEntity.create(); } else if ("update".equals(modelService.invoke)) { /* @@ -238,8 +244,61 @@ throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the update invoke option not all pk fields have the mode IN"); } - GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, context, dctx.getDelegator(), false, true, null, null); - lookedUpValue.setNonPKFields(context, true); + GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, parameters, dctx.getDelegator(), false, true, null, null); + if (lookedUpValue == null) { + return ServiceUtil.returnError("Value not found, cannot update"); + } + + localContext.put("lookedUpValue", lookedUpValue); + + // populate the oldStatusId out if there is a service parameter for it, and before we do the set non-pk fields + /* + <auto-attributes include="pk" mode="IN" optional="false"/> + <attribute name="oldStatusId" type="String" mode="OUT" optional="false"/> + * + <field-to-result field-name="lookedUpValue.statusId" result-name="oldStatusId"/> + */ + ModelParam statusIdParam = modelService.getParam("statusId"); + ModelField statusIdField = modelEntity.getField("statusId"); + ModelParam oldStatusIdParam = modelService.getParam("oldStatusId"); + if (statusIdParam != null && statusIdParam.isIn() && oldStatusIdParam != null && oldStatusIdParam.isOut() && statusIdField != null) { + result.put("oldStatusId", lookedUpValue.get("statusId")); + } + + // do the StatusValidChange check + /* + <if-compare-field field="lookedUpValue.statusId" operator="not-equals" to-field="parameters.statusId"> + <!-- if the record exists there should be a statusId, but just in case make it so it won't blow up --> + <if-not-empty field="lookedUpValue.statusId"> + <!-- if statusId change is not in the StatusValidChange list, complain... --> + <entity-one entity-name="StatusValidChange" value-name="statusValidChange" auto-field-map="false"> + <field-map field-name="statusId" env-name="lookedUpValue.statusId"/> + <field-map field-name="statusIdTo" env-name="parameters.statusId"/> + </entity-one> + <if-empty field="statusValidChange"> + <!-- no valid change record found? return an error... --> + <add-error><fail-property resource="CommonUiLabels" property="CommonErrorNoStatusValidChange"/></add-error> + <check-errors/> + </if-empty> + </if-not-empty> + </if-compare-field> + */ + String parameterStatusId = (String) parameters.get("statusId"); + if (statusIdParam != null && statusIdParam.isIn() && UtilValidate.isNotEmpty(parameterStatusId) && statusIdField != null) { + String lookedUpStatusId = (String) lookedUpValue.get("statusId"); + if (UtilValidate.isNotEmpty(lookedUpStatusId) && !parameterStatusId.equals(lookedUpStatusId)) { + // there was an old status, and in this call we are trying to change it, so do the StatusValidChange check + GenericValue statusValidChange = dctx.getDelegator().findOne("StatusValidChange", true, "statusId", lookedUpStatusId, "statusIdTo", parameterStatusId); + if (statusValidChange == null) { + // uh-oh, no valid change... + return ServiceUtil.returnError(UtilProperties.getMessage("CommonUiLabels", "CommonErrorNoStatusValidChange", localContext, (Locale) parameters.get("locale"))); + } + } + } + + // NOTE: nothing here to maintain the status history, that should be done with a custom service called by SECA rule + + lookedUpValue.setNonPKFields(parameters, true); lookedUpValue.store(); } else if ("delete".equals(modelService.invoke)) { /* @@ -254,7 +313,7 @@ throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the delete invoke option not all pk fields have the mode IN"); } - GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, context, dctx.getDelegator(), false, true, null, null); + GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, parameters, dctx.getDelegator(), false, true, null, null); if (lookedUpValue != null) { lookedUpValue.remove(); } |
Free forum by Nabble | Edit this page |