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.Collections;
023    import java.util.HashMap;
024    import java.util.Iterator;
025    import java.util.Map;
026    
027    import org.dom4j.Document;
028    import org.dom4j.Element;
029    import org.mactor.framework.ConfigException;
030    import org.mactor.framework.MactorException;
031    import org.mactor.framework.ParseUtil;
032    
033    public class GlobalConfig {
034            private Map<String, String> values = new HashMap<String, String>();
035            private Map<String, Group> groups = new HashMap<String, Group>();
036            private int maxNumberOfTestThreads;
037            private Document doc;
038            public String asXML() {
039                    return XmlUtil.getPrettyXML(doc.getRootElement());
040            }
041            public String getValue(String valueName) {
042                    return values.get(valueName);
043            }
044            public Group getGroup(String groupName) {
045                    return groups.get(groupName);
046            }
047            public Group getRequieredGroup(String groupName) throws ConfigException {
048                    Group value = groups.get(groupName);
049                    if (value == null)
050                            throw new ConfigException("The requiered global config group  named '" + groupName + "' was not found in the global config");
051                    return value;
052            }
053            public Map<String, String> getValues() {
054                    return Collections.unmodifiableMap(values);
055            }
056            public Map<String, Group> getGroups() {
057                    return Collections.unmodifiableMap(groups);
058            }
059            public GlobalConfig(Document globalConfigDoc) throws MactorException {
060                    if (globalConfigDoc == null || globalConfigDoc.getRootElement() == null)
061                            throw new MactorException("Invalid GlobalConfig: null");
062                    Element element = globalConfigDoc.getRootElement();
063                    if (!"global_config".equals(element.getName()))
064                            throw new MactorException("Invalid GlobalConfig. Root node: '" + element.getName() + "'. Expected: 'global_config'");
065                    doc = element.getDocument();
066                    maxNumberOfTestThreads = ParseUtil.tryParseIntVal(element.attributeValue("max_test_threads"));
067                    if (maxNumberOfTestThreads == 0)
068                            maxNumberOfTestThreads = 10;
069                    Iterator it = element.elementIterator("value");
070                    while (it.hasNext()) {
071                            Element e = (Element) it.next();
072                            values.put(e.attributeValue("name"), e.getTextTrim());
073                    }
074                    it = element.elementIterator("group");
075                    while (it.hasNext()) {
076                            Group g = Group.loadGroup((Element) it.next());
077                            groups.put(g.name, g);
078                    }
079            }
080            public static class Group {
081                    private Map<String, String> values = new HashMap<String, String>();
082                    public String getValue(String valueName) {
083                            return values.get(valueName);
084                    }
085                    public String getRequieredValue(String valueName) throws MactorException {
086                            String value = getValue(valueName);
087                            if (value == null)
088                                    throw new MactorException("The global config group  named '" + name + "' does not specify the requiered value '" + valueName + "'");
089                            return value;
090                    }
091                    public Map<String, String> getValues() {
092                            return Collections.unmodifiableMap(values);
093                    }
094                    private String name;
095                    public static Group loadGroup(Element element) {
096                            Group g = new Group();
097                            g.name = element.attributeValue("name");
098                            Iterator it = element.elementIterator("value");
099                            while (it.hasNext()) {
100                                    Element e = (Element) it.next();
101                                    g.values.put(e.attributeValue("name"), e.getTextTrim());
102                            }
103                            return g;
104                    }
105                    public String getName() {
106                            return name;
107                    }
108            }
109            public int getMaxNumberOfTestThreads() {
110                    return maxNumberOfTestThreads;
111            }
112    }