001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.examples.panorama.startup.impl;
016
017 import java.util.Iterator;
018 import java.util.List;
019
020 import org.apache.commons.logging.Log;
021 import org.apache.hivemind.ErrorLog;
022 import org.apache.hivemind.Messages;
023 import org.apache.hivemind.order.Orderer;
024
025 /**
026 * A service that executes a series of {@link org.apache.examples.panorama.startup.impl.Task}s. Tasks have an
027 * ordering based on pre- and post-requisites.
028 *
029 * @author Howard Lewis Ship
030 */
031 public class TaskExecutor implements Runnable
032 {
033 private Log _log;
034
035 private ErrorLog _errorLog;
036
037 private List _tasks;
038
039 private Messages _messages;
040
041 /**
042 * Orders the {@link #setTasks(List) tasks} into an execution order, and executes each in turn.
043 * Logs the elapsed time, number of tasks, and the number of failures (if any).
044 */
045 public void run()
046 {
047 long startTime = System.currentTimeMillis();
048
049 Orderer orderer = new Orderer(_errorLog, task());
050
051 Iterator i = _tasks.iterator();
052 while (i.hasNext())
053 {
054 Task t = (Task) i.next();
055
056 orderer.add(t, t.getId(), t.getAfter(), t.getBefore());
057 }
058
059 List orderedTasks = orderer.getOrderedObjects();
060
061 int failures = 0;
062
063 i = orderedTasks.iterator();
064 while (i.hasNext())
065 {
066 Task t = (Task) i.next();
067
068 if (!execute(t))
069 failures++;
070 }
071
072 long elapsedTime = System.currentTimeMillis() - startTime;
073
074 if (failures == 0)
075 _log.info(success(orderedTasks.size(), elapsedTime));
076 else
077 _log.info(failure(failures, orderedTasks.size(), elapsedTime));
078 }
079
080 /**
081 * Execute a single task.
082 *
083 * @return true on success, false on failure
084 */
085 private boolean execute(Task t)
086 {
087 _log.info(executingTask(t));
088
089 try
090 {
091 t.execute();
092
093 return true;
094 }
095 catch (Exception ex)
096 {
097 _errorLog.error(exceptionInTask(t, ex), t.getLocation(), ex);
098
099 return false;
100 }
101 }
102
103 private String task()
104 {
105 return _messages.getMessage("task");
106 }
107
108 private String executingTask(Task t)
109 {
110 return _messages.format("executing-task", t.getTitle());
111 }
112
113 private String exceptionInTask(Task t, Throwable cause)
114 {
115 return _messages.format("exception-in-task", t.getTitle(), cause);
116 }
117
118 private String success(int count, long elapsedTimeMillis)
119 {
120 return _messages.format("success", new Integer(count), new Long(elapsedTimeMillis));
121 }
122
123 private String failure(int failureCount, int totalCount, long elapsedTimeMillis)
124 {
125 return _messages.format(
126 "failure",
127 new Integer(failureCount),
128 new Integer(totalCount),
129 new Long(elapsedTimeMillis));
130 }
131
132 public void setLog(Log log)
133 {
134 _log = log;
135 }
136
137 public void setErrorLog(ErrorLog errorLog)
138 {
139 _errorLog = errorLog;
140 }
141
142 public void setMessages(Messages messages)
143 {
144 _messages = messages;
145 }
146
147 public void setTasks(List list)
148 {
149 _tasks = list;
150 }
151
152 }