001/**
002 * Copyright 2005-2014 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.krms.framework.engine;
017
018import javax.swing.event.EventListenerList;
019
020import org.kuali.rice.krms.api.engine.ExecutionEnvironment;
021import org.kuali.rice.krms.api.engine.ExecutionFlag;
022import org.kuali.rice.krms.api.engine.ResultEvent;
023import org.kuali.rice.krms.framework.engine.result.EngineResultListener;
024import org.kuali.rice.krms.framework.engine.result.Log4jResultListener;
025import org.kuali.rice.krms.framework.engine.result.ResultListener;
026
027/**
028 * A ResultLogger which invokes its listener's handleEvent method (passing in the {@link ResultEvent}) if the event's
029 * Environment is enabled.
030 * @author Kuali Rice Team (rice.collab@kuali.org)
031 */
032public class ResultLogger {
033        private EventListenerList listenerList = new EventListenerList();
034        
035        private ResultLogger(){}
036        
037        /*using inner class provides thread safety.      */
038        private static class KRMSLoggerLoader{
039                private static final ResultLogger INSTANCE = new ResultLogger();
040        }
041
042    /**
043     * @return KRMSLoggerLoader.INSTANCE
044     */
045        public static ResultLogger getInstance(){
046                return KRMSLoggerLoader.INSTANCE;
047        }
048
049    /**
050     * Add a {@link ResultListener} see logResult
051     * @param resultListener {@link ResultListener} to add
052     */
053        public void addListener(ResultListener resultListener) {
054                listenerList.add(ResultListener.class, resultListener);
055        }
056
057    /**
058     * Be kind, please rewind.  $1 charge for removing un-removed {@link ResultListener}
059     * @param resultListener {@link ResultListener} to remove
060     */
061        public void removeListener(ResultListener resultListener){
062                listenerList.remove(ResultListener.class, resultListener);
063        }
064
065    /**
066     * Invoke the handleEvent method of the listeners if the event's Environment is enabled.
067     * @param event {@link ResultEvent} to invoke with listeners handleEvent if the event's Environment is enabled.
068     */
069        public void logResult(ResultEvent event){
070                if (isEnabled(event.getEnvironment())){
071                        // fire event to listeners
072                        Object[] listeners = listenerList.getListenerList();
073                        for (int i=1; i<listeners.length; i+=2){
074                                ((ResultListener) listeners[i]).handleEvent(event);
075                        }
076                }
077        }
078
079    /**
080     * Returns true if the {@link ExecutionEnvironment}'s execution options {@link ExecutionFlag.LOG_EXECUTION} flag has been set.
081     * @param environment {@link ExecutionEnvironment} to test for being enabled.
082     * @return
083     */
084        public boolean isEnabled(ExecutionEnvironment environment){
085            return (
086                    environment != null 
087                    && environment.getExecutionOptions() != null 
088                    && environment.getExecutionOptions().getFlag(ExecutionFlag.LOG_EXECUTION)
089            );
090        }
091}