This is an automated email from the ASF dual-hosted git repository. pgil pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push: new 3cc30333d0 Manage groovy DSL error message retrieval (OFBIZ-10692) 3cc30333d0 is described below commit 3cc30333d09422ffb9299e8ef88c9906cedb05bf Author: Leila <leila.mek...@nereide.fr> AuthorDate: Thu Oct 25 17:13:03 2018 +0200 Manage groovy DSL error message retrieval (OFBIZ-10692) Add integration test to validate the good retrieval of the success / error message. Ajout de 4 services groovy pour tester le fonctionnement du moteur de service en groovy couplé a des appels de type DSL --- .../test/TestServices.groovy} | 33 +++++------ framework/service/servicedef/services_test_se.xml | 19 +++++- .../ofbiz/service/ExecutionServiceException.java | 2 +- .../apache/ofbiz/service/engine/GroovyEngine.java | 20 +++++-- .../service/test/GroovyDslServiceEngineTests.java | 69 ++++++++++++++++++++++ framework/service/testdef/servicetests.xml | 2 + .../ofbiz/webapp/event/ServiceEventHandler.java | 5 ++ 7 files changed, 125 insertions(+), 25 deletions(-) diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java b/framework/service/groovyScripts/test/TestServices.groovy similarity index 66% copy from framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java copy to framework/service/groovyScripts/test/TestServices.groovy index 8a8dca5c1c..633f5fcb1c 100644 --- a/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java +++ b/framework/service/groovyScripts/test/TestServices.groovy @@ -16,24 +16,23 @@ * specific language governing permissions and limitations * under the License. *******************************************************************************/ -package org.apache.ofbiz.service; -@SuppressWarnings("serial") -public class ExecutionServiceException extends org.apache.ofbiz.base.util.GeneralException { - - public ExecutionServiceException() { - super(); - } - - public ExecutionServiceException(String str) { - super(str); - } +def testPingSuccess() { + Map returnMap = success('Service result success') + if (parameters.ping) returnMap.pong = parameters.ping + return returnMap +} - public ExecutionServiceException(String str, Throwable nested) { - super(str, nested); - } +def testPingError() { + Map returnMap = error('Service result error') + if (parameters.ping) returnMap.pong = parameters.ping + return returnMap +} - public ExecutionServiceException(Throwable nested) { - super(nested); - } +def testPingSuccessWithDSLCall() { + run service: 'testGroovyPingSuccess', with: parameters } + +def testPingErrorWithDSLCall() { + run service: 'testGroovyPingError', with: parameters +} \ No newline at end of file diff --git a/framework/service/servicedef/services_test_se.xml b/framework/service/servicedef/services_test_se.xml index d267a871b6..fc2a8c2505 100644 --- a/framework/service/servicedef/services_test_se.xml +++ b/framework/service/servicedef/services_test_se.xml @@ -211,5 +211,22 @@ under the License. <attribute name="testingId" type="String" mode="IN"/> </service> - + <!--call groovy engine service --> + <service name="testGroovyPingSuccess" engine="groovy" + location="component://service/groovyScripts/test/TestServices.groovy" invoke="testPingSuccess"> + <attribute name="ping" mode="IN" type="String"/> + <attribute name="pong" mode="OUT" type="String"/> + </service> + <service name="testGroovyPingError" engine="groovy" require-new-transaction="true" + location="component://service/groovyScripts/test/TestServices.groovy" invoke="testPingError"> + <implements service="testGroovyPingSuccess"/> + </service> + <service name="testGroovyPingSuccessWithDSLCall" engine="groovy" + location="component://service/groovyScripts/test/TestServices.groovy" invoke="testPingSuccessWithDSLCall"> + <implements service="testGroovyPingSuccess"/> + </service> + <service name="testGroovyPingErrorWithDSLCall" engine="groovy" + location="component://service/groovyScripts/test/TestServices.groovy" invoke="testPingErrorWithDSLCall"> + <implements service="testGroovyPingSuccess"/> + </service> </services> diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java b/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java index 8a8dca5c1c..9356ad0f69 100644 --- a/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java +++ b/framework/service/src/main/java/org/apache/ofbiz/service/ExecutionServiceException.java @@ -19,7 +19,7 @@ package org.apache.ofbiz.service; @SuppressWarnings("serial") -public class ExecutionServiceException extends org.apache.ofbiz.base.util.GeneralException { +public class ExecutionServiceException extends org.apache.ofbiz.service.GenericServiceException { public ExecutionServiceException() { super(); diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyEngine.java b/framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyEngine.java index a3d6be3237..35936a0dcd 100644 --- a/framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyEngine.java +++ b/framework/service/src/main/java/org/apache/ofbiz/service/engine/GroovyEngine.java @@ -28,12 +28,12 @@ import java.util.Set; import javax.script.ScriptContext; -import org.apache.ofbiz.base.util.GeneralException; import org.apache.ofbiz.base.util.GroovyUtil; import org.apache.ofbiz.base.util.ScriptHelper; import org.apache.ofbiz.base.util.ScriptUtil; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.service.DispatchContext; +import org.apache.ofbiz.service.ExecutionServiceException; import org.apache.ofbiz.service.GenericServiceException; import org.apache.ofbiz.service.ModelService; import org.apache.ofbiz.service.ServiceDispatcher; @@ -120,12 +120,20 @@ public final class GroovyEngine extends GenericAsyncEngine { scriptContext.getBindings(ScriptContext.ENGINE_SCOPE), ModelService.OUT_PARAM)); return result; - } catch (GeneralException ge) { - throw new GenericServiceException(ge); } catch (Exception e) { - // detailMessage can be null. If it is null, the exception won't be properly returned and logged, - // and that will make spotting problems very difficult. - // Disabling this for now in favor of returning a proper exception. + // When throwing ExecutionServiceException in Groovy DSL run Service method + // since we are dependent on Groovy MetaClassImpl that throws InvokerInvocationException + // we need to check nested exception to return the embedded service error message. + Throwable nested = e.getCause(); + if (nested instanceof ExecutionServiceException) { + return ServiceUtil.returnError(nested.getMessage()); + } + if (UtilValidate.isEmpty(modelService.getInvoke())) { + throw new GenericServiceException("Error running Groovy script file [" + + modelService.getLocation() + "]: ", e); + } + // detailMessage can be null. If it is null, the exception won't be properly returned and logged, and that will + // make spotting problems very difficult. Disabling this for now in favor of returning a proper exception. throw new GenericServiceException("Error running Groovy method [" + modelService.getInvoke() + "]" + " in Groovy file [" + modelService.getLocation() + "]: ", e); } diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/test/GroovyDslServiceEngineTests.java b/framework/service/src/main/java/org/apache/ofbiz/service/test/GroovyDslServiceEngineTests.java new file mode 100644 index 0000000000..ab3ba0c34a --- /dev/null +++ b/framework/service/src/main/java/org/apache/ofbiz/service/test/GroovyDslServiceEngineTests.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.apache.ofbiz.service.test; + +import org.apache.ofbiz.base.util.UtilMisc; +import org.apache.ofbiz.service.ModelService; +import org.apache.ofbiz.service.ServiceUtil; +import org.apache.ofbiz.service.testtools.OFBizTestCase; + +import java.util.Map; + +public class GroovyDslServiceEngineTests extends OFBizTestCase { + + public GroovyDslServiceEngineTests(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + } + + @Override + protected void tearDown() throws Exception { + } + + public final void testGroovyServices() throws Exception { + String pingMsg = "Unit Test"; + Map<String, Object> pingMap = UtilMisc.toMap("ping", pingMsg); + + //test success + Map<String, Object> result = getDispatcher().runSync("testGroovyPingSuccess", pingMap); + assertTrue(ServiceUtil.isSuccess(result)); + assertEquals("Service result success", result.get(ModelService.SUCCESS_MESSAGE)); + assertEquals(pingMsg, result.get("pong")); + + //test error + result = getDispatcher().runSync("testGroovyPingError", pingMap); + assertTrue(ServiceUtil.isError(result)); + assertEquals("Service result error", ServiceUtil.getErrorMessage(result)); + assertEquals(pingMsg, result.get("pong")); + + //test success with DSL + result = getDispatcher().runSync("testGroovyPingSuccessWithDSLCall", pingMap); + assertTrue(ServiceUtil.isSuccess(result)); + assertEquals("Service result success", result.get(ModelService.SUCCESS_MESSAGE)); + assertEquals(pingMsg, result.get("pong")); + + //test error with DSL (no out param test since DSL do not support out param yet when error) + result = getDispatcher().runSync("testGroovyPingErrorWithDSLCall", pingMap, 60, true); + assertTrue(ServiceUtil.isError(result)); + assertEquals("Service result error", result.get(ModelService.ERROR_MESSAGE)); + } +} diff --git a/framework/service/testdef/servicetests.xml b/framework/service/testdef/servicetests.xml index e393706f3d..630085844e 100644 --- a/framework/service/testdef/servicetests.xml +++ b/framework/service/testdef/servicetests.xml @@ -22,6 +22,8 @@ under the License. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://ofbiz.apache.org/dtds/test-suite.xsd"> <test-case case-name="service-tests"><junit-test-suite class-name="org.apache.ofbiz.service.test.ServiceEngineTests"/></test-case> + <test-case case-name="service-groovy-DSL-tests"><junit-test-suite + class-name="org.apache.ofbiz.service.test.GroovyDslServiceEngineTests"/></test-case> <!-- <test-case case-name="service-soap-tests"><junit-test-suite class-name="org.apache.ofbiz.service.test.ServiceSOAPTests"/></test-case> --> <test-case case-name="service-entity-auto-tests"><junit-test-suite class-name="org.apache.ofbiz.service.test.ServiceEntityAutoTests"/></test-case> diff --git a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java index be48684143..240e84f11f 100644 --- a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java +++ b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java @@ -36,6 +36,7 @@ import org.apache.ofbiz.base.util.UtilHttp; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.service.DispatchContext; +import org.apache.ofbiz.service.ExecutionServiceException; import org.apache.ofbiz.service.GenericServiceException; import org.apache.ofbiz.service.LocalDispatcher; import org.apache.ofbiz.service.ModelParam; @@ -265,6 +266,10 @@ public class ServiceEventHandler implements EventHandler { request.setAttribute("_ERROR_MESSAGE_", e.getNonNestedMessage()); } return "error"; + } catch (ExecutionServiceException e) { + Debug.logError(e, MODULE); + request.setAttribute("_ERROR_MESSAGE_", e.getNonNestedMessage()); + return "error"; } catch (GenericServiceException e) { Debug.logError(e, "Service invocation error", MODULE); throw new EventHandlerException("Service invocation error", e.getNested());