001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 package org.apache.geronimo.testsupport.commands; 020 021 import java.io.InputStream; 022 import java.io.OutputStream; 023 import java.util.ArrayList; 024 import java.util.Arrays; 025 import java.util.Collections; 026 import java.util.List; 027 028 import org.apache.geronimo.mavenplugins.geronimo.ServerProxy; 029 import org.apache.tools.ant.taskdefs.Execute; 030 import org.apache.tools.ant.taskdefs.ExecuteStreamHandler; 031 import org.apache.tools.ant.taskdefs.ExecuteWatchdog; 032 import org.apache.tools.ant.taskdefs.PumpStreamHandler; 033 import org.apache.tools.ant.taskdefs.condition.Os; 034 035 public class CommandTestSupport { 036 037 public static final String GSH = "gsh"; 038 public static final String DEPLOY = "deploy"; 039 040 protected static final long timeout = 30000; 041 protected static String geronimoHome; 042 043 static { 044 geronimoHome = getGeronimoHome(); 045 } 046 047 private static String getGeronimoHome() { 048 ServerProxy server = null; 049 try { 050 server = new ServerProxy("localhost", 1099, "system", "manager"); 051 } catch (Exception e) { 052 throw new RuntimeException("Unable to setup ServerProxy", e); 053 } 054 055 String home = server.getGeronimoHome(); 056 Throwable exception = server.getLastError(); 057 058 server.closeConnection(); 059 060 if (exception != null) { 061 throw new RuntimeException("Failed to get Geronimo home", exception); 062 } else { 063 return home; 064 } 065 } 066 067 public CommandTestSupport() { 068 } 069 070 public void execute(String command, String[] args, InputStream in, OutputStream out) throws Exception { 071 execute(command, (args == null) ? null : Arrays.asList(args), in, out); 072 } 073 074 public void execute(String command, List<String> args, InputStream in, OutputStream out) throws Exception { 075 List<String> cmdLine = new ArrayList<String>(); 076 if (isWindows()) { 077 cmdLine.add("cmd.exe"); 078 cmdLine.add("/c"); 079 } 080 cmdLine.add(resolveCommandForOS(command)); 081 // add command-specific arguments 082 cmdLine.addAll(getCommandArguments(command)); 083 // add user arguments 084 if (args != null) { 085 cmdLine.addAll(args); 086 } 087 088 ExecuteWatchdog watchdog = new ExecuteWatchdog( timeout ); 089 ExecuteStreamHandler streamHandler = new PumpStreamHandler( out, out, in ); 090 Execute exec = new Execute( streamHandler, watchdog ); 091 exec.setCommandline( cmdLine.toArray(new String[] {}) ); 092 List<String> env = getCommandEnvironment(command); 093 if (!env.isEmpty()) { 094 exec.setEnvironment(env.toArray(new String[] {}) ); 095 } 096 exec.execute(); 097 } 098 099 protected List<String> getCommandArguments(String command) { 100 if (GSH.equals(command)) { 101 return Arrays.asList("-T", "false"); 102 } else { 103 return Collections.emptyList(); 104 } 105 } 106 107 protected List<String> getCommandEnvironment(String command) { 108 if (DEPLOY.equals(command)) { 109 //this makes the output can be captured in Linux 110 return Arrays.asList("JAVA_OPTS=-Djline.terminal=jline.UnsupportedTerminal"); 111 } else { 112 return Collections.emptyList(); 113 } 114 } 115 116 protected String resolveCommandForOS(String command) { 117 if (isWindows()) { 118 return geronimoHome + "/bin/" + command + ".bat"; 119 } else { 120 if (GSH.equals(command)) { 121 return geronimoHome + "/bin/" + command; 122 } else { 123 return geronimoHome + "/bin/" + command + ".sh"; 124 } 125 } 126 } 127 128 public boolean isWindows() { 129 return Os.isFamily("windows"); 130 } 131 132 }