}
String host = svr.getAdminHost();
int port = svr.getAdminPort();
try {
ServerRemoteAdminCommand remote =
new ServerRemoteAdminCommand(
locator,
"osgi",
host,
port,
false,
"admin",
"",
log);
ParameterMap params = new ParameterMap();
if(commandLine == null) {
params.set("DEFAULT".toLowerCase(Locale.US), "asadmin-osgi-shell");
} else if(commandLine instanceof String) {
params.set("DEFAULT".toLowerCase(Locale.US), (String) commandLine);
} else if(commandLine instanceof List) {
params.set("DEFAULT".toLowerCase(Locale.US), (List<String>) commandLine);
}
if(sessionOp != null) {
params.set("session", sessionOp);
}
if(sessionId != null) {
params.set("session-id", sessionId);
}
report.setMessage(remote.executeCommand(params));
report.setActionExitCode(ActionReport.ExitCode.SUCCESS);
return;
} catch(CommandException x) {
report.setMessage("Remote execution failed: "
+ x.getMessage());
report.setFailureCause(x);
report.setActionExitCode(ActionReport.ExitCode.FAILURE);
return;
}
}
String cmdName = "";
String cmd = "";
if(commandLine == null) {
cmd = "asadmin-osgi-shell";
cmdName = cmd;
} else if(commandLine instanceof String) {
cmd = (String) commandLine;
cmdName = cmd;
} else if(commandLine instanceof List) {
for(Object arg : (List) commandLine) {
if(cmd.length() == 0) {
// first arg
cmd = (String) arg;
cmdName = cmd;
} else {
cmd += " " + (String) arg;
}
}
} else if(commandLine instanceof String[]) {
for(Object arg : (String[]) commandLine) {
if(cmd.length() == 0) {
// first arg
cmd = (String) arg;
cmdName = cmd;
} else {
cmd += " " + (String) arg;
}
}
} else {
// shouldn't happen...
report.setMessage("Unable to deal with argument list of type "
+ commandLine.getClass().getName());
report.setActionExitCode(ActionReport.ExitCode.WARNING);
return;
}
// standard output...
ByteArrayOutputStream bOut = new ByteArrayOutputStream(512);
PrintStream out = new PrintStream(bOut);
// error output...
ByteArrayOutputStream bErr = new ByteArrayOutputStream(512);
PrintStream err = new PrintStream(bErr);
try {
Object shell = null;
ServiceReference sref = ctx.getServiceReference(
"org.apache.felix.service.command.CommandProcessor");
if(sref != null) {
shell = ctx.getService(sref);
}
if(shell == null) {
// try with felix...
sref = ctx.getServiceReference("org.apache.felix.shell.ShellService");
if(sref != null) {
shell = ctx.getService(sref);
}
if(shell == null) {
report.setMessage("No Shell Service available");
report.setActionExitCode(ActionReport.ExitCode.WARNING);
return;
} else if("asadmin-osgi-shell".equals(cmdName)) {
out.println("felix");
} else {
ShellService s = (ShellService) shell;
s.executeCommand(cmd, out, err);
}
} else {
// try with gogo...
// GLASSFISH-19126 - prepare fake input stream...
InputStream in = new InputStream() {
@Override
public int read() throws IOException {
return -1;
}
@Override
public int available() throws IOException {
return 0;
}
@Override
public int read(byte[] b) throws IOException {
return -1;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return -1;
}
};
CommandProcessor cp = (CommandProcessor) shell;
if(sessionOp == null) {
if("asadmin-osgi-shell".equals(cmdName)) {
out.println("gogo");
} else {
CommandSession session = cp.createSession(in, out, err);
session.execute(cmd);
session.close();
}
} else if("new".equals(sessionOp)) {
CommandSession session = cp.createSession(null, null, null);
RemoteCommandSession remote = new RemoteCommandSession(session);
log.log(Level.FINE, "Remote session established: {0}",
remote.getId());
sessions.put(remote.getId(), remote);
out.println(remote.getId());
} else if("list".equals(sessionOp)) {
for(String id : sessions.keySet()) {
out.println(id);
}
} else if("execute".equals(sessionOp)) {
RemoteCommandSession remote = sessions.get(sessionId);
CommandSession session = remote.attach(in, out, err);
session.execute(cmd);
remote.detach();
} else if("stop".equals(sessionOp)) {
RemoteCommandSession remote = sessions.remove(sessionId);
CommandSession session = remote.attach(in, out, err);
session.close();
log.log(Level.FINE, "Remote session closed: {0}",
remote.getId());
}
}
out.flush();
err.flush();