001 /**
002 * Copyright 2005-2012 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.result;
017
018 import java.util.Collections;
019 import java.util.EventObject;
020 import java.util.Map;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.joda.time.DateTime;
024 import org.joda.time.format.DateTimeFormat;
025 import org.joda.time.format.DateTimeFormatter;
026 import org.kuali.rice.krms.api.engine.ExecutionEnvironment;
027 import org.kuali.rice.krms.api.engine.ResultEvent;
028
029 /**
030 * An implementation of {@link ResultEvent}
031 * @author Kuali Rice Team (rice.collab@kuali.org)
032 */
033 public class BasicResult extends EventObject implements ResultEvent {
034 private static final long serialVersionUID = -4124200802034785921L;
035
036 private static final DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH.mm.ss.SSS");
037
038 protected String type;
039 protected DateTime timestamp;
040 protected ExecutionEnvironment environment;
041 protected Boolean result = null;
042 protected String description;
043 protected Map<String, ?> resultDetails;
044
045 // TODO Consider static factory methods in stead of constructors - Item 1 Effective Java 2nd Edition
046 // TODO Consider a builder when faced with many constructor parameters - Item 2 Effective Java 2nd Edition
047 /**
048 * Constructor
049 * @param resultDetails of the ResultEvent
050 * @param eventType String of the ResultEvent
051 * @param source Object of the ResultEvent
052 * @param environment {@link ExecutionEnvironment}
053 * @param result boolean of the ResultEvent
054 */
055 public BasicResult(Map<String, ?> resultDetails, String eventType, Object source, ExecutionEnvironment environment, boolean result) {
056 this(resultDetails, null, eventType, source, environment, result);
057 }
058
059 /**
060 * Constructor
061 * @param resultDetails of the ResultEvent
062 * @param description String of the ResultEvent
063 * @param eventType String of the ResultEvent
064 * @param source Object of the ResultEvent
065 * @param environment {@link ExecutionEnvironment}
066 * @param result boolean of the ResultEvent
067 */
068 public BasicResult(Map<String, ?> resultDetails, String description, String eventType, Object source, ExecutionEnvironment environment, boolean result) {
069 this(eventType, source, environment);
070 this.resultDetails = resultDetails;
071 this.result = new Boolean(result);
072 this.description = (description == null) ? StringUtils.EMPTY : description;
073 }
074
075 /**
076 * Constructor
077 * @param description String of the ResultEvent
078 * @param eventType String of the ResultEvent
079 * @param source Object of the ResultEvent
080 * @param environment {@link ExecutionEnvironment}
081 * @param result boolean of the ResultEvent
082 */
083 public BasicResult(String description, String eventType, Object source, ExecutionEnvironment environment, boolean result) {
084 this(eventType, source, environment);
085 this.result = new Boolean(result);
086 this.description = description;
087 }
088
089 /**
090 * Constructor
091 * @param eventType String of the ResultEvent
092 * @param source Object of the ResultEvent
093 * @param environment {@link ExecutionEnvironment}
094 * @param result boolean of the ResultEvent
095 */
096 public BasicResult(String eventType, Object source, ExecutionEnvironment environment, boolean result) {
097 this(eventType, source, environment);
098 this.result = new Boolean(result);
099 }
100
101 /**
102 * Constructor
103 * @param eventType String of the ResultEvent
104 * @param source Object of the ResultEvent
105 * @param environment {@link ExecutionEnvironment}
106 */
107 public BasicResult(String eventType, Object source, ExecutionEnvironment environment) {
108 super(source);
109 this.type = eventType;
110 this.timestamp = new DateTime();
111 this.environment = environment;
112 }
113
114 @Override
115 public String getType() {
116 return type;
117 }
118
119 @Override
120 public DateTime getTimestamp() {
121 return timestamp;
122 }
123
124 @Override
125 public ExecutionEnvironment getEnvironment(){
126 return environment;
127 }
128
129 @Override
130 public Boolean getResult(){
131 return result;
132 }
133
134 @Override
135 public String getDescription() {
136 return description;
137 }
138
139 /**
140 * Returns the result details of the ResultEvent as an unmodifiable Map<?,?>
141 * @return result details of the ResultEvent as an unmodifiable Map<?,?>
142 */
143 @Override
144 public Map<String, ?> getResultDetails() {
145 if (resultDetails == null) {
146 return Collections.emptyMap();
147 } else {
148 return Collections.unmodifiableMap(resultDetails);
149 }
150 }
151
152 @Override
153 public String toString(){
154 StringBuffer sb = new StringBuffer();
155 sb.append(fmt.print(this.getTimestamp()));
156 sb.append(" EventType: "+ getType());
157 sb.append(" ( "+ this.getSource().toString());
158 if (this.getResult() != null){
159 sb.append(" evaluated to: "+ this.getResult().toString());
160 }
161 sb.append(" )");
162 return sb.toString();
163 }
164 }