001package com.ganteater.ae.web; 002 003import java.io.File; 004import java.util.Collection; 005import java.util.Map; 006import java.util.Properties; 007import java.util.TreeMap; 008 009import org.apache.commons.lang.StringUtils; 010import org.springframework.beans.factory.InitializingBean; 011import org.springframework.beans.factory.annotation.Value; 012import org.springframework.stereotype.Component; 013 014import com.ganteater.ae.AELogRecord; 015import com.ganteater.ae.AEWorkspace; 016import com.ganteater.ae.ChoiceTaskRunner; 017import com.ganteater.ae.ILogger; 018import com.ganteater.ae.MultiTaskRunDialog; 019import com.ganteater.ae.RecipeRunner; 020import com.ganteater.ae.processor.BaseProcessor; 021import com.ganteater.ae.processor.MessageHandler; 022import com.ganteater.ae.processor.Processor; 023import com.ganteater.ae.processor.SpecialCommands; 024import com.ganteater.ae.util.xml.easyparser.Node; 025 026@Component("workspace") 027public class WebWorkspace extends AEWorkspace implements InitializingBean { 028 029 public static final String CONFIG_LOG_NAME = SpecialCommands.STARTUP; 030 private Map<String, WebLogger> logs = new TreeMap<>(); 031 032 public WebWorkspace(@Value("#{systemEnvironment['AE_BASEDIR'] ?: '${start.dir}'}") String startDir) { 033 super(new File(new File(System.getProperty("user.dir")), startDir)); 034 } 035 036 protected RecipeRunner createTestRunner(String name) { 037 name = StringUtils.defaultString(name, SpecialCommands.STARTUP); 038 RecipeRunner testRunner = new RecipeRunner(this); 039 WebLogger log = logs.get(name); 040 if (log == null) { 041 log = new WebLogger(name); 042 logs.put(name, log); 043 } 044 045 testRunner.setLog(log); 046 log.setTestRunner(testRunner); 047 Processor processor = new BaseProcessor(this, log, getStartDir()); 048 processor.setTestListener(testRunner); 049 testRunner.setProcessor(processor); 050 return testRunner; 051 } 052 053 public void afterPropertiesSet() { 054 055 Thread thread = new Thread() { 056 public void run() { 057 try { 058 WebLogger webLogger = getLog(CONFIG_LOG_NAME); 059 webLogger.info("Configuration loading starting ..."); 060 loadConfiguration(true); 061 webLogger.debug(new AELogRecord(getAllConfigNode().getXMLText(), "xml", null)); 062 webLogger.debug(new AELogRecord(getTasksMap(), "properties", null)); 063 webLogger.debug(new AELogRecord(getSystemVariables(), "properties", null)); 064 Node configNode = getConfigNode(); 065 if (configNode != null) { 066 webLogger.info(new AELogRecord(configNode.getXMLText(), "xml", null)); 067 } 068 069 runSetupNodes(); 070 071 } catch (Exception e) { 072 WebLogger webLogger = getLog(CONFIG_LOG_NAME); 073 webLogger.error("Configuration loading failed.", e); 074 } 075 } 076 }; 077 thread.start(); 078 } 079 080 public Map<String, WebLogger> getLogs() { 081 return logs; 082 } 083 084 @Override 085 public MessageHandler message(Processor taskProcessor, String description, String message, boolean notifyMe) { 086 taskProcessor.getLogger().info(message); 087 return new MessageHandler() { 088 @Override 089 public void setProcessDone(boolean processDone) { 090 super.setProcessDone(processDone); 091 if (processDone) { 092 taskProcessor.getLogger().info("The process done"); 093 } 094 } 095 }; 096 } 097 098 protected String selectConfiguration(String[] aPossibleValues) { 099 WebLogger webLogger = getLog(CONFIG_LOG_NAME); 100 String theDefaultConfiguration = getDefaultUserConfiguration(".defaultConfiguration", null); 101 String inputChoiceValue = webLogger.inputChoiceValue(AEWorkspace.CONFIGURATION_TITLE, "Select", aPossibleValues, 102 theDefaultConfiguration); 103 setDefaultUserConfiguration(".defaultConfiguration", inputChoiceValue); 104 return inputChoiceValue; 105 } 106 107 public WebLogger getLog(String name) { 108 WebLogger webLogger = logs.get(name); 109 if (webLogger == null) { 110 webLogger = new WebLogger(name); 111 logs.put(name, webLogger); 112 } 113 return webLogger; 114 } 115 116 @Override 117 public MultiTaskRunDialog tasksChoice(MultiTaskRunDialog mt, String[] list, boolean exceptionIgnoreFlag, 118 Object setup, Processor taskProcessor, boolean visible) { 119 ChoiceTaskRunner tasksChoice = (ChoiceTaskRunner) super.tasksChoice(mt, list, exceptionIgnoreFlag, setup, 120 taskProcessor, visible); 121 122 WebLogger weblog = (WebLogger) taskProcessor.getLogger(); 123 weblog.inputChoice(tasksChoice); 124 if (setup == null) { 125 setDefaultUserConfiguration("MultiTaskRunDialog:" + tasksChoice.getName(), 126 StringUtils.join(tasksChoice.getSelectedTasks(), ';')); 127 } 128 return tasksChoice; 129 } 130 131 @Override 132 public String[] inputMultiChoice(String name, String[] values, String defaultValue, Processor taskProcessor) { 133 String[] result = null; 134 135 if (defaultValue == null && values.length > 0) { 136 String value = getDefaultUserConfiguration("MultiTaskRunDialog:" + name, null); 137 if (value != null) { 138 defaultValue = value; 139 } 140 } 141 result = getValue(values, defaultValue); 142 return result; 143 } 144 145 @Override 146 public String inputValue(String aName, String aDesc, String value, ILogger log, String type, boolean notifyMe, Processor processor) { 147 WebLogger weblog = (WebLogger) log; 148 if (value == null) { 149 value = AEWorkspace.getInstance().getDefaultUserConfiguration(".inputValue." + aName, null); 150 } 151 value = weblog.inputValue(aName, aDesc, value, type); 152 AEWorkspace.getInstance().setDefaultUserConfiguration(".inputValue." + aName, value); 153 return value; 154 } 155 156 @Override 157 public String inputChoice(String aNameDialog, String description, String[] aValues, String aDefaultValue, 158 Processor taskProcessor, boolean notifyMe) { 159 WebLogger weblog; 160 if(taskProcessor != null) { 161 weblog = (WebLogger) taskProcessor.getLogger(); 162 } else { 163 weblog = getLog("Startup"); 164 } 165 166 aDefaultValue = weblog.inputSelectChoice(aNameDialog, description, aValues, aDefaultValue); 167 return aDefaultValue; 168 } 169 170 @Override 171 public String choiceValue(String name, String desc, Object[] aPossibleValues, ILogger log, boolean notifyMe, 172 Processor processor) { 173 String value = super.choiceValue(name, desc, aPossibleValues, log, notifyMe, processor); 174 WebLogger weblog = (WebLogger) log; 175 value = weblog.inputChoiceValue(name, desc, aPossibleValues, value); 176 return value; 177 } 178 179 @Override 180 public void resetConfiguration() { 181 Collection<WebLogger> logs = this.logs.values(); 182 for (WebLogger webLogger : logs) { 183 RecipeRunner testRunner = webLogger.getTestRunner(); 184 if (testRunner != null) { 185 testRunner.stopTest(); 186 webLogger.reset(); 187 } 188 } 189 super.resetConfiguration(); 190 } 191 192 @Override 193 public String inputFile(String name, String description, File aDefaultFile, ILogger log, Processor tp) { 194 String value = super.inputFile(name, description, aDefaultFile, log, tp); 195 WebLogger weblog = (WebLogger) log; 196 value = weblog.inputFile(name, aDefaultFile, log); 197 return value; 198 } 199 200 @Override 201 public boolean confirmation(String name, String message, Processor unit, boolean notifyMe) throws Exception { 202 WebLogger webLogger = (WebLogger) unit.getLogger(); 203 Object[] aPossibleValues = new String[] { "Yes", "No" }; 204 String inputChoiceValue = webLogger.inputChoiceValue(message, "Select", aPossibleValues, null); 205 return "yes".equalsIgnoreCase(inputChoiceValue); 206 } 207 208 @Override 209 public String inputValue(String name, String description, String defaultValue, String type, 210 Processor processor) { 211 WebLogger webLogger = (WebLogger) processor.getLogger(); 212 return inputValue(name, name, defaultValue, webLogger, type, false, null); 213 } 214 215 @Override 216 public boolean isConsoleDefaultInput(String varName, String description) { 217 return defaultMode; 218 } 219 220 @Override 221 protected Properties fillLogProperties(Node configNode) { 222 Properties logProperties = super.fillLogProperties(configNode); 223 logProperties.setProperty("log4j.logger.freemarker", "ERROR"); 224 return logProperties; 225 } 226 227}