001 /******************************************************************************
002 * Copyright (C) MActor Developers. All rights reserved. *
003 * ---------------------------------------------------------------------------*
004 * This file is part of MActor. *
005 * *
006 * MActor is free software; you can redistribute it and/or modify *
007 * it under the terms of the GNU General Public License as published by *
008 * the Free Software Foundation; either version 2 of the License, or *
009 * (at your option) any later version. *
010 * *
011 * MActor is distributed in the hope that it will be useful, *
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
014 * GNU General Public License for more details. *
015 * *
016 * You should have received a copy of the GNU General Public License *
017 * along with MActor; if not, write to the Free Software *
018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
019 ******************************************************************************/
020 package org.mactor.framework.spec;
021
022 import java.util.HashMap;
023 import java.util.Iterator;
024 import java.util.Map;
025
026 import org.dom4j.Document;
027 import org.dom4j.Element;
028 import org.mactor.framework.MactorException;
029 import org.mactor.framework.ParseUtil;
030
031 public class TestSpec extends ContainerSpec {
032 @Override
033 public String getType() {
034 return "test";
035 }
036 private int delayBeforeStartSeconds;
037 private Map<String, SpecNode> nodeMap = new HashMap<String, SpecNode>();
038 private Document doc;
039 public String asXML() {
040 return XmlUtil.getPrettyXML(doc.getRootElement());
041 }
042 private void buildIndex() throws MactorException {
043 addContainerSpecToMap(this);
044 }
045 private void addContainerSpecToMap(ContainerSpec node) throws MactorException {
046 addToNodeMap(node);
047 if (node instanceof MessageReceiveSpec && !nodeMap.containsKey(((MessageReceiveSpec) node).getMessageSubscribeNodeName())) {
048 throw new MactorException("The MessageReceiveSpec node '" + node.getName() + "' refers to an unknown MessageSubscribeSpec node '"
049 + ((MessageReceiveSpec) node).getMessageSubscribeNodeName() + "'");
050 }
051 Iterator it = node.getSpecNodes().iterator();
052 while (it.hasNext()) {
053 SpecNode n = (SpecNode) it.next();
054 if (n instanceof ContainerSpec) {
055 addContainerSpecToMap((ContainerSpec) n);
056 } else {
057 addToNodeMap(n);
058 }
059 }
060 }
061 private void addToNodeMap(SpecNode node) throws MactorException {
062 if (nodeMap.containsKey(node.getName())) {
063 throw new MactorException("Nameable nodes in the test-spec must have unique names. The name '" + node.getName() + "' has been used on multiple nodes");
064 }
065 nodeMap.put(node.getName(), node);
066 }
067 public int getDelayBeforeStartSeconds() {
068 return delayBeforeStartSeconds;
069 }
070 public SpecNode findSpecNode(String nodeName) {
071 return nodeMap.get(nodeName);
072 }
073 public static TestSpec loadFromFile(String name) throws MactorException {
074 return TestSpec.loadFromDocument(ProjectContext.getGlobalInstance().readFromFile(name, false), name);
075 }
076 public static TestSpec loadFromDocument(Document doc, String name) throws MactorException {
077 if (doc == null)
078 throw new MactorException("Invalid document: null");
079 Element element = doc.getRootElement();
080 if (element == null)
081 throw new MactorException("Invalid Test: null");
082 if (!"test".equals(element.getName()))
083 throw new MactorException("Invalid Test spec. Root node: '" + element.getName() + "'. Expected: 'test'");
084 TestSpec s = new TestSpec();
085 s.name = name;
086 s.doc = element.getDocument();
087 s.delayBeforeStartSeconds = ParseUtil.tryParseIntVal(element.attributeValue("delay_before_start_seconds"));
088 s.loadContainedNodes(element);
089 s.buildIndex();
090 return s;
091 }
092 public Element addToElement(Element e) {
093 throw new RuntimeException("Not implemented");
094 }
095 public String getShortDescription() {
096 return "Test node - '" + name + "'";
097 }
098 public String getDescription() {
099 return "Delay defore start (seconds):" + delayBeforeStartSeconds;
100 }
101 }