/*
* Copyright (c) 2006-2007 Hyperic, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.hyperic.sigar.cmd;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.pager.PageControl;
import org.hyperic.sigar.pager.PageFetchException;
import org.hyperic.sigar.pager.StaticPageFetcher;
import org.hyperic.sigar.util.GetlineCompleter;
import org.hyperic.sigar.util.PrintfFormat;
import org.hyperic.sigar.shell.CollectionCompleter;
import org.hyperic.sigar.shell.ProcessQueryCompleter;
import org.hyperic.sigar.shell.ShellCommandBase;
import org.hyperic.sigar.shell.ShellCommandExecException;
import org.hyperic.sigar.shell.ShellCommandUsageException;
public abstract class SigarCommandBase
extends ShellCommandBase
implements GetlineCompleter {
protected Shell shell;
protected PrintStream out = System.out;
protected PrintStream err = System.err;
protected Sigar sigar;
protected SigarProxy proxy;
protected List output = new ArrayList();
private CollectionCompleter completer;
private GetlineCompleter ptqlCompleter;
private Collection completions = new ArrayList();
private PrintfFormat formatter;
private ArrayList printfItems = new ArrayList();
public SigarCommandBase(Shell shell) {
this.shell = shell;
this.out = shell.getOutStream();
this.err = shell.getErrStream();
this.sigar = shell.getSigar();
this.proxy = shell.getSigarProxy();
//provide simple way for handlers to implement tab completion
this.completer = new CollectionCompleter(shell);
if (isPidCompleter()) {
this.ptqlCompleter = new ProcessQueryCompleter(shell);
}
}
public SigarCommandBase() {
this(new Shell());
this.shell.setPageSize(PageControl.SIZE_UNLIMITED);
}
public void setOutputFormat(String format) {
this.formatter = new PrintfFormat(format);
}
public PrintfFormat getFormatter() {
return this.formatter;
}
public String sprintf(String format, Object[] items) {
return new PrintfFormat(format).sprintf(items);
}
public void printf(String format, Object[] items) {
println(sprintf(format, items));
}
public void printf(Object[] items) {
PrintfFormat formatter = getFormatter();
if (formatter == null) {
//see flushPrintfItems
this.printfItems.add(items);
}
else {
println(formatter.sprintf(items));
}
}
public void printf(List items) {
printf((Object[])items.toArray(new Object[0]));
}
public void println(String line) {
if (this.shell.isInteractive()) {
this.output.add(line);
}
else {
this.out.println(line);
}
}
private void flushPrintfItems() {
if (this.printfItems.size() == 0) {
return;
}
//no format was specified, just line up the columns
int[] max = null;
for (Iterator it=this.printfItems.iterator();
it.hasNext();)
{
Object[] items = (Object[])it.next();
if (max == null) {
max = new int[items.length];
Arrays.fill(max, 0);
}
for (int i=0; i<items.length; i++) {
int len = items[i].toString().length();
if (len > max[i]) {
max[i] = len;
}
}
}
StringBuffer format = new StringBuffer();
for (int i=0; i<max.length; i++) {
format.append("%-" + max[i] + "s");
if (i < max.length-1) {
format.append(" ");
}
}
for (Iterator it=this.printfItems.iterator();
it.hasNext();)
{
printf(format.toString(), (Object[])it.next());
}
this.printfItems.clear();
}
public void flush() {
flushPrintfItems();
try {
this.shell.performPaging(new StaticPageFetcher(this.output));
} catch(PageFetchException e) {
this.err.println("Error paging: " + e.getMessage());
} finally {
this.output.clear();
}
}
public abstract void output(String[] args)
throws SigarException;
protected boolean validateArgs(String[] args) {
return args.length == 0;
}
public void processCommand(String[] args)
throws ShellCommandUsageException, ShellCommandExecException
{
if (!validateArgs(args)) {
throw new ShellCommandUsageException(getSyntax());
}
try {
output(args);
} catch (SigarException e) {
throw new ShellCommandExecException(e.getMessage());
}
}
public Collection getCompletions() {
return this.completions;
}
public GetlineCompleter getCompleter() {
return null;
}
public boolean isPidCompleter() {
return false;
}
public String completePid(String line) {
if ((line.length() >= 1) &&
Character.isDigit(line.charAt(0)))
{
return line;
}
return this.ptqlCompleter.complete(line);
}
public String complete(String line) {
if (isPidCompleter()) {
return completePid(line);
}
GetlineCompleter c = getCompleter();
if (c != null) {
return c.complete(line);
}
this.completer.setCollection(getCompletions());
return this.completer.complete(line);
}
}