|  | // Licensed to the Apache Software Foundation (ASF) under one | 
|  | // or more contributor license agreements.  See the NOTICE file | 
|  | // distributed with this work for additional information | 
|  | // regarding copyright ownership.  The ASF licenses this file | 
|  | // to you under the Apache License, Version 2.0 (the | 
|  | // "License"); you may not use this file except in compliance | 
|  | // with the License.  You may obtain a copy of the License at | 
|  | // | 
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, | 
|  | // software distributed under the License is distributed on an | 
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | // KIND, either express or implied.  See the License for the | 
|  | // specific language governing permissions and limitations | 
|  | // under the License. | 
|  | package com.cloud.agent.manager; | 
|  |  | 
|  | import java.util.ArrayList; | 
|  | import java.util.Iterator; | 
|  | import java.util.List; | 
|  |  | 
|  | import com.cloud.agent.AgentManager.OnError; | 
|  | import com.cloud.agent.api.Answer; | 
|  | import com.cloud.agent.api.Command; | 
|  | import com.cloud.utils.exception.CloudRuntimeException; | 
|  |  | 
|  | public class Commands implements Iterable<Command> { | 
|  | OnError _handler; | 
|  | private ArrayList<String> _ids = new ArrayList<String>(); | 
|  | private ArrayList<Command> _cmds = new ArrayList<Command>(); | 
|  | private Answer[] _answers; | 
|  |  | 
|  | public Commands(OnError handler) { | 
|  | _handler = handler; | 
|  | } | 
|  |  | 
|  | public Commands(Command cmd) { | 
|  | this(OnError.Stop); | 
|  | addCommand(cmd); | 
|  | } | 
|  |  | 
|  | public void addCommands(List<Command> cmds) { | 
|  | int i = 0; | 
|  | for (Command cmd : cmds) { | 
|  | addCommand(Integer.toString(i++), cmd); | 
|  | } | 
|  | } | 
|  |  | 
|  | public int size() { | 
|  | return _cmds.size(); | 
|  | } | 
|  |  | 
|  | public void addCommand(String id, Command cmd) { | 
|  | _ids.add(id); | 
|  | _cmds.add(cmd); | 
|  | } | 
|  |  | 
|  | public void addCommand(Command cmd) { | 
|  | addCommand(null, cmd); | 
|  | } | 
|  |  | 
|  | public void addCommand(int index, Command cmd) { | 
|  | _cmds.add(index, cmd); | 
|  | } | 
|  |  | 
|  | public Answer getAnswer(String id) { | 
|  | int i = _ids.indexOf(id); | 
|  | return i == -1 ? null : _answers[i]; | 
|  | } | 
|  |  | 
|  | @SuppressWarnings("unchecked") | 
|  | public <T extends Answer> T getAnswer(Class<T> clazz) { | 
|  | assert(clazz != Answer.class) : "How do you expect to get a unique answer in this case?  huh?  How? How? How?....one more time....How?"; | 
|  | for (Answer answer : _answers) { | 
|  | if (answer.getClass() == clazz) { | 
|  | return (T)answer; | 
|  | } | 
|  | } | 
|  | throw new CloudRuntimeException("Unable to get answer that is of " + clazz); | 
|  | } | 
|  |  | 
|  | public <T extends Command> Answer getAnswerFor(Class<T> clazz) { | 
|  | assert (clazz != Command.class) : "You passed in a generic Command.  Seriously, you think you did that?"; | 
|  | int i = 0; | 
|  | for (Command cmd : _cmds) { | 
|  | if (cmd.getClass() == clazz) { | 
|  | break; | 
|  | } | 
|  | i++; | 
|  | } | 
|  |  | 
|  | assert i < _cmds.size() : "You sure you actually sent this command " + clazz; | 
|  |  | 
|  | return _answers[i]; | 
|  | } | 
|  |  | 
|  | public Command[] toCommands() { | 
|  | return _cmds.toArray(new Command[_cmds.size()]); | 
|  | } | 
|  |  | 
|  | public void setAnswers(Answer[] answers) { | 
|  | _answers = answers; | 
|  | } | 
|  |  | 
|  | public OnError getErrorHandling() { | 
|  | return _handler; | 
|  | } | 
|  |  | 
|  | public boolean stopOnError() { | 
|  | return _handler == OnError.Stop; | 
|  | } | 
|  |  | 
|  | public Answer[] getAnswers() { | 
|  | return _answers; | 
|  | } | 
|  |  | 
|  | @SuppressWarnings("unchecked") | 
|  | public <T extends Command> T getCommand(Class<T> clazz) { | 
|  | for (Command cmd : _cmds) { | 
|  | if (cmd.getClass() == clazz) { | 
|  | return (T)cmd; | 
|  | } | 
|  | } | 
|  | return null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @return For Commands with handler OnError.Continue, one command succeeding is successful.  If not, all commands must succeed to be successful. | 
|  | */ | 
|  | public boolean isSuccessful() { | 
|  | if (_answers == null) { | 
|  | return false; | 
|  | } | 
|  | if (_handler == OnError.Continue) { | 
|  | return true; | 
|  | } | 
|  | for (Answer answer : _answers) { | 
|  | if (_handler == OnError.Continue && answer.getResult()) { | 
|  | return true; | 
|  | } else if (_handler != OnError.Continue && !answer.getResult()) { | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | return _handler != OnError.Continue; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Iterator<Command> iterator() { | 
|  | return _cmds.iterator(); | 
|  | } | 
|  | } |