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 */
016 package org.kuali.rice.krms.framework.engine;
017
018 import javax.swing.event.EventListenerList;
019
020 import org.kuali.rice.krms.api.engine.ExecutionEnvironment;
021 import org.kuali.rice.krms.api.engine.ExecutionFlag;
022 import org.kuali.rice.krms.api.engine.ResultEvent;
023 import org.kuali.rice.krms.framework.engine.result.EngineResultListener;
024 import org.kuali.rice.krms.framework.engine.result.Log4jResultListener;
025 import 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 */
032 public 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 }