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.ui.gui.project; 021 022 import java.io.File; 023 import java.io.StringReader; 024 import java.util.HashMap; 025 import java.util.Map; 026 import java.util.Map.Entry; 027 028 import org.dom4j.Document; 029 import org.dom4j.Element; 030 import org.dom4j.io.SAXReader; 031 import org.mactor.framework.MactorException; 032 import org.mactor.framework.spec.ProjectContext; 033 034 public class ProjectTreeNodeBuilder { 035 public static ProjectTreeNode buildProjectTree() throws MactorException { 036 File projectDir = ProjectContext.getGlobalInstance().getProjectDir(); 037 OrganizationProjectTreeNode root = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_ROOT, projectDir.getName()); 038 OrganizationProjectTreeNode gcOrg = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_GLOBAL_CONFIG, "Global Config"); 039 OrganizationProjectTreeNode mbOrg = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_MESSAGE_BROKER_CONFIG, "Message Broker Config"); 040 OrganizationProjectTreeNode testOrg = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_TEST, "Tests"); 041 OrganizationProjectTreeNode mockBatteryOrg = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_MOCK_BATTERY, "Mock Batteries"); 042 OrganizationProjectTreeNode testRunOrg = new OrganizationProjectTreeNode(ProjectNodeType.PROJECT_TEST_RUN, "Test Runs"); 043 root.addChild(mockBatteryOrg); 044 root.addChild(testRunOrg); 045 root.addChild(testOrg); 046 root.addChild(mbOrg); 047 root.addChild(gcOrg); 048 File[] files = projectDir.listFiles(); 049 boolean seperateConfigDir = !projectDir.equals(ProjectContext.getGlobalInstance().getProjectConfigDir()); 050 if (files != null) { 051 for (int i = 0; i < files.length; i++) { 052 if (files[i].isDirectory()) 053 continue; 054 try { 055 if (files[i].getName().toLowerCase().endsWith(".xml")) { 056 Document doc = ProjectContext.getGlobalInstance().readFromFile(files[i]); 057 String rootEl = doc.getRootElement().getName(); 058 if ("test".equalsIgnoreCase(rootEl)) 059 testOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, testNodeDictionary, false)); 060 else if ("mock_battery".equalsIgnoreCase(rootEl)) 061 mockBatteryOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, mockbatteryNodeDictionary, false)); 062 else if (!seperateConfigDir && "message_broker_config".equalsIgnoreCase(rootEl)) 063 mbOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, messageBrokerNodeDictionary, true)); 064 else if (!seperateConfigDir && "global_config".equalsIgnoreCase(rootEl)) 065 gcOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, globalConfigNodeDictionary, true)); 066 else if ("test_run".equalsIgnoreCase(rootEl)) 067 testRunOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, testRunNodeDictionary, true)); 068 } 069 } catch (MactorException me) { 070 me.printStackTrace(); 071 } 072 } 073 } 074 if (seperateConfigDir) { 075 files = ProjectContext.getGlobalInstance().getProjectConfigDir().listFiles(); 076 if (files != null) { 077 for (int i = 0; i < files.length; i++) { 078 if (files[i].isDirectory()) 079 continue; 080 try { 081 if (files[i].getName().toLowerCase().endsWith(".xml")) { 082 Document doc = ProjectContext.getGlobalInstance().readFromFile(files[i]); 083 String rootEl = doc.getRootElement().getName(); 084 if ("message_broker_config".equalsIgnoreCase(rootEl)) 085 mbOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, messageBrokerNodeDictionary, true)); 086 else if ("global_config".equalsIgnoreCase(rootEl)) 087 gcOrg.addChild(XmlFileProjectTreeNode.buildFromDocument(files[i], doc, globalConfigNodeDictionary, true)); 088 } 089 } catch (MactorException me) { 090 me.printStackTrace(); 091 } 092 } 093 } 094 } 095 return root; 096 } 097 public static ProjectTreeNode createNewNode(ProjectNodeType nodeType, String templateContent) throws MactorException { 098 if (nodeType.equals(ProjectNodeType.G_GLOBAL_CONFIG)) { 099 File f = createFile("new-global_config.xml", templateContent, true); 100 return XmlFileProjectTreeNode.buildFromFile(f, globalConfigNodeDictionary, true); 101 } else if (nodeType.equals(ProjectNodeType.MBC_MESSAGE_BROKERS)) { 102 File f = createFile("new-message_broker_config.xml", templateContent, true); 103 return XmlFileProjectTreeNode.buildFromFile(f, messageBrokerNodeDictionary, true); 104 } else if (nodeType.equals(ProjectNodeType.T_TEST)) { 105 File f = createFile("new-test.xml", templateContent, false); 106 return XmlFileProjectTreeNode.buildFromFile(f, testNodeDictionary, false); 107 } else if (nodeType.equals(ProjectNodeType.TM_MOCK_BATTERY)) { 108 File f = createFile("new-mock_battery.xml", templateContent, false); 109 return XmlFileProjectTreeNode.buildFromFile(f, mockbatteryNodeDictionary, false); 110 } else if (nodeType.equals(ProjectNodeType.TR_TEST_RUN)) { 111 File f = createFile("new-test_run.xml", templateContent, false); 112 return XmlFileProjectTreeNode.buildFromFile(f, testRunNodeDictionary, false); 113 } else { 114 Element data = createElementFromString(templateContent); 115 if (reversedMessageBrokerNodeDictionary.containsKey(nodeType)) 116 return new XmlProjectTreeNode(nodeType, data, messageBrokerNodeDictionary); 117 else if (reversedGlobalConfigNodeDictionary.containsKey(nodeType)) 118 return new XmlProjectTreeNode(nodeType, data, globalConfigNodeDictionary); 119 else if (reversedMockBatteryNodeDictionary.containsKey(nodeType)) 120 return new XmlProjectTreeNode(nodeType, data, mockbatteryNodeDictionary); 121 else if (reversedTestNodeDictionary.containsKey(nodeType)) 122 return new XmlProjectTreeNode(nodeType, data, testNodeDictionary); 123 else if (reversedTestRunNodeDictionary.containsKey(nodeType)) 124 return new XmlProjectTreeNode(nodeType, data, testRunNodeDictionary); 125 } 126 throw new MactorException("Unsupported node type '" + nodeType.name() + "'"); 127 } 128 private static File createFile(String nameSeed, String content, boolean isConfigFile) throws MactorException { 129 String name = ProjectContext.getGlobalInstance().getNextFilename(nameSeed, isConfigFile); 130 return ProjectContext.getGlobalInstance().writeStringToFile(name, content, isConfigFile); 131 } 132 private static Element createElementFromString(String elementStr) { 133 if (elementStr == null) 134 return null; 135 try { 136 Element e = (Element) new SAXReader().read(new StringReader(elementStr)).getRootElement().detach(); 137 return e; 138 } catch (Exception e) { 139 e.printStackTrace(); 140 } 141 return null; 142 } 143 private static Map<String, ProjectNodeType> messageBrokerNodeDictionary = buildMessageBrokerNodeDictionary(); 144 private static Map<String, ProjectNodeType> globalConfigNodeDictionary = buildGlobalConfigNodeDictionary(); 145 private static Map<String, ProjectNodeType> mockbatteryNodeDictionary = buildMockBatteryNodeDictionary(); 146 private static Map<String, ProjectNodeType> testRunNodeDictionary = buildTestRunNodeDictionary(); 147 private static Map<String, ProjectNodeType> testNodeDictionary = buildTestNodeDictionary(); 148 private static Map<ProjectNodeType, String> reversedMessageBrokerNodeDictionary = reverse(messageBrokerNodeDictionary); 149 private static Map<ProjectNodeType, String> reversedGlobalConfigNodeDictionary = reverse(globalConfigNodeDictionary); 150 private static Map<ProjectNodeType, String> reversedMockBatteryNodeDictionary = reverse(mockbatteryNodeDictionary); 151 private static Map<ProjectNodeType, String> reversedTestRunNodeDictionary = reverse(testRunNodeDictionary); 152 private static Map<ProjectNodeType, String> reversedTestNodeDictionary = reverse(testNodeDictionary); 153 private static Map<ProjectNodeType, String> reverse(Map<String, ProjectNodeType> map) { 154 Map<ProjectNodeType, String> rm = new HashMap<ProjectNodeType, String>(); 155 for (Entry<String, ProjectNodeType> e : map.entrySet()) 156 rm.put(e.getValue(), e.getKey()); 157 return rm; 158 } 159 private static Map<String, ProjectNodeType> buildMessageBrokerNodeDictionary() { 160 Map<String, ProjectNodeType> dic = new HashMap<String, ProjectNodeType>(); 161 dic.put("message_broker_config", ProjectNodeType.MBC_MESSAGE_BROKERS); 162 dic.put("message_broker", ProjectNodeType.MBC_MESSAGE_BROKER); 163 dic.put("channel", ProjectNodeType.MBC_CHANNEL); 164 dic.put("value", ProjectNodeType.VALUE); 165 return dic; 166 } 167 private static Map<String, ProjectNodeType> buildGlobalConfigNodeDictionary() { 168 Map<String, ProjectNodeType> dic = new HashMap<String, ProjectNodeType>(); 169 dic.put("global_config", ProjectNodeType.G_GLOBAL_CONFIG); 170 dic.put("group", ProjectNodeType.G_GROUP); 171 dic.put("value", ProjectNodeType.VALUE); 172 return dic; 173 } 174 private static Map<String, ProjectNodeType> buildMockBatteryNodeDictionary() { 175 Map<String, ProjectNodeType> dic = new HashMap<String, ProjectNodeType>(); 176 dic.put("mock_battery", ProjectNodeType.TM_MOCK_BATTERY); 177 dic.put("test", ProjectNodeType.TM_TEST); 178 return dic; 179 } 180 private static Map<String, ProjectNodeType> buildTestRunNodeDictionary() { 181 Map<String, ProjectNodeType> dic = new HashMap<String, ProjectNodeType>(); 182 dic.put("test_run", ProjectNodeType.TR_TEST_RUN); 183 return dic; 184 } 185 private static Map<String, ProjectNodeType> buildTestNodeDictionary() { 186 Map<String, ProjectNodeType> dic = new HashMap<String, ProjectNodeType>(); 187 dic.put("test", ProjectNodeType.T_TEST); 188 dic.put("action", ProjectNodeType.T_ACTION); 189 dic.put("condition", ProjectNodeType.T_CONDITION); 190 dic.put("event_choice", ProjectNodeType.T_EVENT_CHOICE); 191 dic.put("event_choice_branch", ProjectNodeType.T_EVENT_CHOICE_BRANCH); 192 dic.put("loop", ProjectNodeType.T_LOOP); 193 dic.put("message_publish", ProjectNodeType.T_MESSAGE_PUBLISH); 194 dic.put("message_receive", ProjectNodeType.T_MESSAGE_RECEIVE); 195 dic.put("message_respond", ProjectNodeType.T_MESSAGE_RESPOND); 196 dic.put("message_subscribe", ProjectNodeType.T_MESSAGE_SUBSCRIBE); 197 dic.put("value", ProjectNodeType.T_VALUE); 198 return dic; 199 } 200 }