001package com.killcoding.jsplus;
002
003import java.io.File;
004import com.killcoding.tool.CommonTools;
005import com.killcoding.datasource.DriverDataSource;
006import java.util.Map;
007import java.util.HashMap;
008import com.killcoding.tool.FileTools;
009import java.io.StringReader;
010import java.nio.file.Path;
011import java.nio.file.Files;
012import com.killcoding.cache.CacheArray;
013import java.util.Scanner;
014import java.nio.file.Paths;
015import com.killcoding.tool.ConfigProperties;
016import com.killcoding.jsplus.GhostConsole;
017
018public final class Main { 
019    
020    private static ScriptConsole mainConsole = null;
021    
022    private static char[] password = null;
023        private static String command = null;
024        private static StringBuffer commands = null;
025        private static boolean isEnd = false;
026        private static boolean isCancel = false;
027    
028    public Main(){
029        super();
030    }
031    
032    public static void main(String[] args){
033        appMain(args);
034    }
035    
036        public static void appMain(String[] args) {
037                Map<String, Object> params = ScriptConsole.parseArgs(args);
038                if (params == null) {
039                        params = new HashMap<String, Object>();
040                }
041                
042                String env = (String) params.get("Env");
043                
044        if(env.toUpperCase().equals("GHOST")) {
045            ScriptConsole ghostScriptConsole = new ScriptConsole();
046            ghostScriptConsole.setUseScriptEnv();
047            String ghostName = (String)params.get("GhostName");
048            if(CommonTools.isBlank(ghostName)){
049                ghostName = "DefaultGhost";
050            }
051            mainConsole = new GhostConsole(ghostScriptConsole,ghostName);
052            mainConsole.setUseGhostEnv();
053        }
054        
055        if(env.toUpperCase().equals("JDBC")) {
056            mainConsole = new JdbcConsole();
057            mainConsole.setUseJdbcEnv();
058        }
059                
060                if(env.toUpperCase().equals("CMD")) {
061                    mainConsole = new CmdConsole();
062                    mainConsole.setUseCmdEnv();
063                }
064                
065                if(env.toUpperCase().equals("SCRIPT")) {
066                    mainConsole = new ScriptConsole();
067                    mainConsole.setUseScriptEnv();
068                }
069                
070                if(mainConsole == null) {
071                    System.out.println(String.format("Invalid Env '%s'.",env));
072                    System.exit(1);
073                }       
074                
075                int connectHashCode = mainConsole.hashCode();
076
077        System.out.println("New Console: " + connectHashCode);
078        
079        ScriptConsole.CONNECT_CONSOLES.put(connectHashCode,mainConsole);
080        mainConsole.connect(connectHashCode);
081        
082                if (params.containsKey("help")) {
083                        System.out.println(mainConsole.help());
084                        System.exit(0);
085                }
086                if (params.containsKey("version")) {
087                        System.out.println(mainConsole.version());
088                        System.exit(0);
089                }
090                if (params.containsKey("exit")) {
091                        System.out.println(ScriptConsole.exit());
092                        System.exit(0);
093                }
094                
095                File datasourceConfigFile = new File(ScriptConsole.getJsPlusPath() + "/config/DataSource.properties");
096                if(!datasourceConfigFile.exists()){
097                    datasourceConfigFile = new File(ScriptConsole.getJsPlusPath() + "/config/Datasource.properties");
098                }
099        
100                if (datasourceConfigFile.exists()) {
101                        try {
102                                mainConsole.datasourceVariables.load(datasourceConfigFile);
103                        } catch (Exception e) {
104                            e.printStackTrace();
105                                System.err.println(ScriptConsole.error(e));
106                        }
107                }
108
109                if (params != null) {
110                        mainConsole.consoleVariables.putAllAndReturnSlef(params);
111                        mainConsole.consoleVariables.putAndReturnSlef("Task", params.get("Task"));
112                        if (params.get("TaskTimer") != null) {
113                                mainConsole.consoleVariables.putAndReturnSlef("TaskTimer", params.get("TaskTimer"));
114                        }
115                        if (mainConsole.consoleVariables.containsKey("CacheArrayInitPool")) {
116                            CacheArray.initPool(mainConsole.consoleVariables.getInteger("CacheArrayInitPool",100));
117                    }
118                }
119
120                mainConsole.checkHistory();
121
122                commands = new StringBuffer();
123                String line = null;
124                Scanner scanner = new Scanner(System.in);
125                String scriptEngine = (String) params.get("ScriptEngine");
126                
127                if (CommonTools.isBlank(scriptEngine)) {
128                        scriptEngine = "nashorn";
129                }
130                
131                mainConsole.consoleVariables.putAndReturnSlef("ScriptEngine", scriptEngine);
132
133                boolean havaTask = !CommonTools.isBlank(mainConsole.consoleVariables.getString("Task"));
134                
135                if (mainConsole.isUseJdbcEnv() && havaTask) {
136                        if (!mainConsole.open()) {
137                                System.exit(1);
138                        }
139                        mainConsole.consoleVariables.putAndReturnSlef("CommandEnd", ";");
140                        System.out.println("Changed CommandEnd to ';'");                                
141                        mainConsole.taskExecute();
142                }
143                
144                if (mainConsole.isUseCmdEnv()) {
145                        mainConsole.consoleVariables.putAndReturnSlef("CommandEnd", "/");
146                        System.out.println("Changed CommandEnd to '/'");        
147                        
148                        if(havaTask)
149                            mainConsole.taskExecute();
150                }               
151
152                if (mainConsole.isUseScriptEnv()) {
153                        mainConsole.consoleVariables.putAndReturnSlef("CommandEnd", "/");
154                        System.out.println("Changed CommandEnd to '/'");
155                        try {
156                            boolean allowAllAccess = true;
157                            boolean havaAllowAllAccess = params.containsKey("AllowAllAccess");
158                            if(havaAllowAllAccess){
159                                allowAllAccess = Boolean.parseBoolean(params.get("AllowAllAccess") +"");
160                            }
161                                mainConsole.initScriptEngineManager(allowAllAccess);
162                                if (havaTask) {
163                                        mainConsole.taskExecute();
164                                }
165                        } catch (Exception e) {
166                            e.printStackTrace();
167                                System.err.println(ScriptConsole.error(e));
168                        }
169                }
170                
171                if (mainConsole.isUseGhostEnv()) {
172                        mainConsole.consoleVariables.putAndReturnSlef("CommandEnd", "/");
173                        System.out.println("Changed CommandEnd to '/'");
174                        try {
175                                if (havaTask) {
176                                        mainConsole.taskExecute();
177                                }
178                        } catch (Exception e) {
179                            e.printStackTrace();
180                                System.err.println(ScriptConsole.error(e));
181                        }
182                }               
183
184                if (mainConsole.isUseJdbcEnv() && !mainConsole.datasourceVariables.containsKey("DriverJar")){
185                        System.out.print("DriverJar? ");
186                }
187    
188        try{
189                while ((line = scanner.nextLine()) != null) {
190                    
191                    ScriptConsole newConsole = mainConsole.getConsole();
192                    if(newConsole.hashCode() != mainConsole.hashCode()){
193                        mainConsole = newConsole;
194                        System.out.print(String.format("%s>",mainConsole.getDisplayEngineName()));
195                    }
196                        if (mainConsole.isUseJdbcEnv()) {
197    
198                                if (env.toUpperCase().equals("SCRIPT")
199                                                && !mainConsole.datasourceVariables.containsKey("DriverJar")) {
200                                        env = "jdbc";
201                                        System.out.print("DriverJar? ");
202                                        continue;
203                                }
204                                if (!mainConsole.datasourceVariables.containsKey("DriverJar")) {
205                                        String driverJar = line;
206                                        if (driverJar == null) {
207                                                System.out.print("DriverJar? ");
208                                                continue;
209                                        }
210                                        mainConsole.datasourceVariables.putAndReturnSlef("DriverJar", driverJar);
211                                        if (!mainConsole.datasourceVariables.containsKey("Driver")) {
212                                                System.out.print("Driver? ");
213                                                continue;
214                                        }
215                                }
216    
217                                if (!mainConsole.datasourceVariables.containsKey("Driver")) {
218                                        String driver = line;
219                                        if (CommonTools.isBlank(driver)) {
220                                                System.out.print("Driver? ");
221                                                continue;
222                                        }
223                                        mainConsole.datasourceVariables.putAndReturnSlef("Driver", driver);
224                                        if (!mainConsole.datasourceVariables.containsKey("Url")) {
225                                                System.out.print("Url? ");
226                                                continue;
227                                        }
228                                }
229    
230                                if (!mainConsole.datasourceVariables.containsKey("Url")) {
231                                        String url = line;
232                                        if (CommonTools.isBlank(url)) {
233                                                System.out.print("Url? ");
234                                                continue;
235                                        }
236                                        mainConsole.datasourceVariables.putAndReturnSlef("Url", url);
237                                        if (!mainConsole.datasourceVariables.containsKey("Username")) {
238                                                System.out.print("Username? ");
239                                                continue;
240                                        }
241                                }
242    
243                                if (!mainConsole.datasourceVariables.containsKey("Username")) {
244                                        String username = line;
245                                        if (CommonTools.isBlank(username)) {
246                                                System.out.print("Username? ");
247                                                continue;
248                                        }
249                                        mainConsole.datasourceVariables.putAndReturnSlef("Username", username);
250                                        if (!mainConsole.datasourceVariables.containsKey("Password")) {
251                                                password = System.console().readPassword("Password?");
252                                                String passwordText = scanner.nextLine();
253                                                if (passwordText != null) {
254                                                        passwordText = passwordText.trim();
255                                                }
256                                                if (password != null && password.length > 0) {
257                                                        mainConsole.datasourceVariables.putAndReturnSlef("Password",
258                                                                        new String(password).trim());
259                                                } else if (passwordText.length() > 0) {
260                                                        mainConsole.datasourceVariables.putAndReturnSlef("Password", passwordText);
261                                                }
262                                                continue;
263                                        }
264                                }
265    
266                                if (!mainConsole.datasourceVariables.containsKey("Password")) {
267                                        if (password == null || password.length == 0) {
268                                                password = System.console().readPassword("Password?");
269                                                String passwordText = scanner.nextLine();
270                                                if (passwordText != null) {
271                                                        passwordText = passwordText.trim();
272                                                }
273                                                if (password != null && password.length > 0) {
274                                                        mainConsole.datasourceVariables.putAndReturnSlef("Password",
275                                                                        new String(password).trim());
276                                                } else if (passwordText.length() > 0) {
277                                                        mainConsole.datasourceVariables.putAndReturnSlef("Password", passwordText);
278                                                }
279                                                continue;
280                                        }
281                                }
282    
283                                if (!mainConsole.datasourceVariables.containsKey("Password") && password != null) {
284                                        mainConsole.datasourceVariables.putAndReturnSlef("Password", new String(password));
285                                }
286    
287                                if (mainConsole.firstOpen) {
288                                        if (env.toUpperCase().equals("JDBC") && !mainConsole.open()) {
289                                                System.exit(1);
290                                        }
291                                }
292    
293                        }
294    
295                        if (command == null && !isEnd && !isCancel) {
296                                System.out.print(String.format("%s> ",mainConsole.getDisplayEngineName()));
297                        }
298    
299                        command = line;
300                        isCancel = mainConsole.isCommandCancel(command);
301                        if (isCancel) {
302                                commands = new StringBuffer();
303                                command = null;
304                                System.out.println("Canceled");
305                                System.out.print(String.format("%s> ",mainConsole.getDisplayEngineName()));
306                        } else {
307                                String commandCancel = mainConsole.consoleVariables.getString("CommandCancel",
308                                                mainConsole.DEFAULT_CommandCancel);
309                                isEnd = mainConsole.isCommandEnd(command);
310                                commands.append(command);
311                                commands.append(" ");
312                                if (isEnd) {
313                                        if (mainConsole.isUseScriptEnv()) {
314                                                mainConsole.executeViaScript(commands.toString());
315                                        } else if (mainConsole.isUseJdbcEnv()){
316                                                mainConsole.executeViaJdbc(true, commands.toString());
317                                        } else if (mainConsole.isUseCmdEnv()) {
318                                                mainConsole.executeViaCmd(true,commands.toString());
319                                        } else if (mainConsole.isUseGhostEnv()) {
320                                                mainConsole.executeViaGhost(true,commands.toString());
321                                        } 
322                                        System.out.print(String.format("%s> ",mainConsole.getDisplayEngineName()));
323                                        commands = new StringBuffer();
324                                        command = null;
325                                }
326                        }
327                        continue;
328                }
329        }catch(Exception e){
330            System.err.println("Current scanner exit.");
331        }
332        }
333}