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}