You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by si...@apache.org on 2006/11/08 22:14:46 UTC
svn commit: r472647 - in /incubator/ofbiz/trunk/framework/webapp:
dtd/site-conf.xsd src/org/ofbiz/webapp/control/ConfigXMLReader.java
src/org/ofbiz/webapp/control/RequestManager.java
src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java
Author: sichen
Date: Wed Nov 8 13:14:46 2006
New Revision: 472647
URL: http://svn.apache.org/viewvc?view=rev&rev=472647
Log:
OFBIZ-333: Enhance ServiceMultiEventHandler to support configurable global transaction
Modified:
incubator/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd
incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java
incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestManager.java
incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java
Modified: incubator/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?view=diff&rev=472647&r1=472646&r2=472647
==============================================================================
--- incubator/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original)
+++ incubator/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Nov 8 13:14:46 2006
@@ -157,6 +157,14 @@
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:string" name="path"/>
<xs:attribute type="xs:string" name="invoke"/>
+ <xs:attribute name="global-transaction" default="true">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="true"/>
+ <xs:enumeration value="false"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
</xs:attributeGroup>
<xs:element name="response">
<xs:complexType>
Modified: incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?view=diff&rev=472647&r1=472646&r2=472647
==============================================================================
--- incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java (original)
+++ incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java Wed Nov 8 13:14:46 2006
@@ -109,6 +109,7 @@
public static final String EVENT_PATH = "path";
public static final String EVENT_TYPE = "type";
public static final String EVENT_METHOD = "invoke";
+ public static final String EVENT_GLOBAL_TRANSACTION = "global-transaction";
public static final String RESPONSE = "response";
public static final String RESPONSE_NAME = "name";
@@ -234,6 +235,9 @@
uriMap.put(EVENT_TYPE, type);
uriMap.put(EVENT_PATH, path);
uriMap.put(EVENT_METHOD, invoke);
+
+ // Check for a global-transaction attribute - default to true
+ uriMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
}
// Check for a description.
@@ -438,6 +442,9 @@
eventMap.put(EVENT_TYPE, eventElement.getAttribute(EVENT_TYPE));
eventMap.put(EVENT_PATH, eventElement.getAttribute(EVENT_PATH));
eventMap.put(EVENT_METHOD, eventElement.getAttribute(EVENT_METHOD));
+
+ // Check for a global-transaction attribute - default to true
+ eventMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
eventList.add(eventMap);
}
map.put(FIRSTVISIT, eventList);
@@ -455,6 +462,9 @@
eventMap.put(EVENT_TYPE, eventElement.getAttribute(EVENT_TYPE));
eventMap.put(EVENT_PATH, eventElement.getAttribute(EVENT_PATH));
eventMap.put(EVENT_METHOD, eventElement.getAttribute(EVENT_METHOD));
+
+ // Check for a global-transaction attribute - default to true
+ eventMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
eventList.add(eventMap);
}
map.put(PREPROCESSOR, eventList);
@@ -472,6 +482,9 @@
eventMap.put(EVENT_TYPE, eventElement.getAttribute(EVENT_TYPE));
eventMap.put(EVENT_PATH, eventElement.getAttribute(EVENT_PATH));
eventMap.put(EVENT_METHOD, eventElement.getAttribute(EVENT_METHOD));
+
+ // Check for a global-transaction attribute - default to true
+ eventMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
eventList.add(eventMap);
}
map.put(POSTPROCESSOR, eventList);
@@ -489,6 +502,9 @@
eventMap.put(EVENT_TYPE, eventElement.getAttribute(EVENT_TYPE));
eventMap.put(EVENT_PATH, eventElement.getAttribute(EVENT_PATH));
eventMap.put(EVENT_METHOD, eventElement.getAttribute(EVENT_METHOD));
+
+ // Check for a global-transaction attribute - default to true
+ eventMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
eventList.add(eventMap);
}
map.put("after-login", eventList);
@@ -506,6 +522,9 @@
eventMap.put(EVENT_TYPE, eventElement.getAttribute(EVENT_TYPE));
eventMap.put(EVENT_PATH, eventElement.getAttribute(EVENT_PATH));
eventMap.put(EVENT_METHOD, eventElement.getAttribute(EVENT_METHOD));
+
+ // Check for a global-transaction attribute - default to true
+ eventMap.put(EVENT_GLOBAL_TRANSACTION, eventElement.hasAttribute(EVENT_GLOBAL_TRANSACTION) ? eventElement.getAttribute(EVENT_GLOBAL_TRANSACTION) : "true");
eventList.add(eventMap);
}
map.put("before-logout", eventList);
Modified: incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestManager.java
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestManager.java?view=diff&rev=472647&r1=472646&r2=472647
==============================================================================
--- incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestManager.java (original)
+++ incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestManager.java Wed Nov 8 13:14:46 2006
@@ -152,6 +152,21 @@
}
}
+ /** Gets the event global-transaction from the requestMap */
+ public boolean getEventGlobalTransaction(String uriStr) {
+ Map uri = getRequestMapMap(uriStr);
+
+ if (uri != null) {
+ return new Boolean((String) uri.get(ConfigXMLReader.EVENT_GLOBAL_TRANSACTION)).booleanValue();
+ } else {
+ if (Debug.verboseOn()) {
+ Debug.logWarning("[RequestManager.getEventGlobalTransaction] Global-transaction of event for request \"" +
+ uriStr + "\" not found, defaulting to true", module);
+ }
+ return false;
+ }
+ }
+
/** Gets the view name from the requestMap */
public String getViewName(String uriStr) {
Map uri = getRequestMapMap(uriStr);
Modified: incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java?view=diff&rev=472647&r1=472646&r2=472647
==============================================================================
--- incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java (original)
+++ incubator/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java Wed Nov 8 13:14:46 2006
@@ -44,6 +44,8 @@
import org.ofbiz.service.ServiceAuthException;
import org.ofbiz.service.ServiceUtil;
import org.ofbiz.service.ServiceValidationException;
+import org.ofbiz.webapp.control.RequestHandler;
+import org.ofbiz.webapp.control.RequestManager;
/**
* ServiceMultiEventHandler - Event handler for running a service multiple times; for bulk forms
@@ -54,11 +56,15 @@
public static final String SYNC = "sync";
public static final String ASYNC = "async";
+ private RequestManager requestManager;
/**
* @see org.ofbiz.webapp.event.EventHandler#init(javax.servlet.ServletContext)
*/
public void init(ServletContext context) throws EventHandlerException {
+
+ // Provide a means to check the controller for event tag attributes at execution time
+ this.requestManager = new RequestManager(context);
}
/**
@@ -154,15 +160,23 @@
List errorMessages = FastList.newInstance();
List successMessages = FastList.newInstance();
+ // Check the global-transaction attribute of the event from the controller to see if the
+ // event should be wrapped in a transaction
+ String requestUri = RequestHandler.getRequestUri(request.getPathInfo());
+ boolean eventGlobalTransaction = requestManager.getEventGlobalTransaction(requestUri);
+
// big try/finally to make sure commit or rollback are run
boolean beganTrans = false;
String returnString = null;
try {
- // start the transaction
- try {
- beganTrans = TransactionUtil.begin(modelService.transactionTimeout * rowCount);
- } catch (GenericTransactionException e) {
- throw new EventHandlerException("Problem starting transaction", e);
+
+ if (eventGlobalTransaction) {
+ // start the global transaction
+ try {
+ beganTrans = TransactionUtil.begin(modelService.transactionTimeout * rowCount);
+ } catch (GenericTransactionException e) {
+ throw new EventHandlerException("Problem starting multi-service global transaction", e);
+ }
}
// now loop throw the rows and prepare/invoke the service for each
@@ -334,11 +348,13 @@
}
} finally {
if (errorMessages.size() > 0) {
- // rollback the transaction
- try {
- TransactionUtil.rollback(beganTrans, "Error in multi-service event handling: " + errorMessages.toString(), null);
- } catch (GenericTransactionException e) {
- Debug.logError(e, "Could not rollback transaction", module);
+ if (eventGlobalTransaction) {
+ // rollback the global transaction
+ try {
+ TransactionUtil.rollback(beganTrans, "Error in multi-service event handling: " + errorMessages.toString(), null);
+ } catch (GenericTransactionException e) {
+ Debug.logError(e, "Could not rollback multi-service global transaction", module);
+ }
}
errorMessages.add(0, errorPrefixStr);
errorMessages.add(errorSuffixStr);
@@ -351,12 +367,14 @@
request.setAttribute("_ERROR_MESSAGE_", errorBuf.toString());
returnString = "error";
} else {
- // commit the transaction
- try {
- TransactionUtil.commit(beganTrans);
- } catch (GenericTransactionException e) {
- Debug.logError(e, "Could not commit transaction", module);
- throw new EventHandlerException("Commit transaction failed");
+ if (eventGlobalTransaction) {
+ // commit the global transaction
+ try {
+ TransactionUtil.commit(beganTrans);
+ } catch (GenericTransactionException e) {
+ Debug.logError(e, "Could not commit multi-service global transaction", module);
+ throw new EventHandlerException("Commit multi-service global transaction failed");
+ }
}
if (successMessages.size() > 0) {
request.setAttribute("_EVENT_MESSAGE_LIST_", successMessages);