Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /*
  *  Licensed 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.wookie.server;
import  org.apache.wookie.beans.util.IPersistenceManager;
import  org.apache.wookie.beans.util.PersistenceCommitException;
import  org.apache.wookie.beans.util.PersistenceManagerFactory;

Filter to set DB transactions
public class MainFilter implements Filter {
	public void destroy() {
	}
	public void doFilter(final ServletRequest requestfinal ServletResponse responsefinal FilterChain chain
	    // Retry filter chain invocation once if persistence commit
	    // exception is caught and response is not committed. This
	    // is intended to help insulate both the server and the
	    // widgets from limited transactional race conditions from
	    // concurrent requests that attempt to side effect the same
	    // server state. Note that this will not protect the widget
	    // or server from more than two concurrent modification
	    // attempts or guarantee sequential operation order. 
	    boolean retryChainInvocation = false;
	    do {
	        // get persistence manager for this thread
	        IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
	        try {
	            // reset response and pause on retry to help ensure success
	            if (retryChainInvocation) {
	                response.reset();
	                try {
	                    Thread.sleep(50);
	                } catch (InterruptedException ie) {
	                }
	            }
	            // start and commit transaction around servlet invocation
	            persistenceManager.begin();
	            chain.doFilter(requestresponse);
	            persistenceManager.commit();
	            // terminate retry attempts on success
	            retryChainInvocation = false;
	        } catch (ServletException se) {
	            // rollback transaction on exception
	            persistenceManager.rollback();
	            throw se;
	        } catch (IOException ioe) {
	            // rollback transaction on exception
	            persistenceManager.rollback();
	            throw ioe;
	        } catch (PersistenceCommitException pce) {
                // rollback and retry on commit exception if response not committed	            
	            persistenceManager.rollback();
	            retryChainInvocation = (!retryChainInvocation && !response.isCommitted());
	            if (!retryChainInvocation) {
	                throw new RuntimeException("Persistence commit exception caught for transaction: "+pcepce);	                
	            }
	        } catch (Throwable t) {
	            // rollback transaction on exception
	            persistenceManager.rollback();
	            throw new RuntimeException("Exception caught for transaction: "+tt);
	        } finally {
	            // close thread persistence manager
	            PersistenceManagerFactory.closePersistenceManager();
	        }
	    } while (retryChainInvocation);
	}
	public void init(FilterConfig arg0throws ServletException {		
	}
New to GrepCode? Check out our FAQ X