001/**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.ksb.messaging.exceptionhandling;
017
018import org.kuali.rice.ksb.messaging.PersistedMessageBO;
019import org.kuali.rice.test.TestUtilities;
020
021
022public class TestExceptionHandlerServiceImpl extends DefaultExceptionServiceImpl {
023
024    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger
025            .getLogger(TestExceptionHandlerServiceImpl.class);
026        
027    public void placeInExceptionRouting(Throwable throwable, PersistedMessageBO message, Object service) {
028                LOG.info("Executing placeInExceptionRouting - creating and starting the ExceptionThreader");
029                ExceptionThreader exceptionThreader = new ExceptionThreader(throwable, message, service, this);
030                exceptionThreader.start();
031        }
032        
033        private static class ExceptionThreader extends Thread {
034
035                private Throwable throwable;
036                private PersistedMessageBO message;
037                private Object service;
038                private TestExceptionHandlerServiceImpl testExceptionService;
039                
040                public ExceptionThreader(Throwable throwable, PersistedMessageBO message, Object service, TestExceptionHandlerServiceImpl testExceptionService) {
041                        this.throwable = throwable;
042                        this.message = message;
043                        this.service = service;
044                        this.testExceptionService = testExceptionService;
045                        TestUtilities.setExceptionThreader(this);
046                }
047
048                public void run() {
049                        LOG.info("Running the ExceptionThreader - sleeping for 3 seconds - " + this.toString());
050                    try {
051                        Thread.sleep(3000);
052                    } catch (InterruptedException e) {
053                        e.printStackTrace();
054                    }
055                    try {
056                        LOG.info("Executing 'real' placeInExceptionRouting from ExceptionThreader.");
057                        this.testExceptionService.callRealPlaceInExceptionRouting(this.throwable, this.message, this.service);
058                    } catch (Throwable t) {
059                        LOG.fatal("Error executing callRealPlaceInExceptionRouting.", t);
060                    }
061                }
062        }
063        
064        public void callRealPlaceInExceptionRouting(Throwable throwable, PersistedMessageBO message, Object service) throws Exception {
065                LOG.info("Executing callRealPlaceInExceptionRouting from TestExceptionHandlerServiceImpl.");
066                super.placeInExceptionRouting(throwable, message, service);
067                LOG.info("Message was successfully placed in exception routing.");
068        }
069        
070}