Skip to content
Other versions

Loading…

Creating your own Command shell plugin

To create your own Version number adapter we must create a new class that implements the Command interface:

package com.openkm.terminal;
import java.util.concurrent.BlockingQueue;
import net.xeoh.plugins.base.Plugin;
import org.apache.commons.cli.Options;
import com.openkm.bean.CommandMessageQueue;
/**
* Command
*
*/
public interface Command extends Plugin, Runnable {
    public abstract void init(String path, String[] args, BlockingQueue<CommandMessageQueue> queue);
    public abstract Options getOptions();
    public abstract String getHelp();
    public abstract boolean isAllowInputReader();
    public abstract void setInputQueue(BlockingQueue<CommandMessageQueue> inputQueue);
    public abstract String getCommandName();
    public abstract String getDescription();
}

The new class must be loaded into the package com.openkm.terminal because the application plugin system loads from there.

Method Type Description
init(String path, String[] args, BlockingQueue queue) void Initialize the object.
getOptions() Options Return the available command parameters.
getHelp() String Return the command line help.
boolean isAllowInputReader() boolean Indicate if command can process input values.
“grep” parameter processes the output results of another command line. For example “ls grep test”
setInputQueue(BlockingQueue inputQueue) void Set the input queue to be processed.
it only makes sense when isAllowInputReader() returns the value true.
getCommandName() String Return the command name.
getDescription() String Return the description that is shown at the plugin table.

The command line uses a blocking queue between each command line object execution.

  • The variable finish, when true, indicate that the queue process has been finished.
  • The variable error indicates that there has been some error when its value is true.
  • The variable message contains some message, normally an error message.
package com.openkm.bean;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* CommandMessageQueue
*
*/
public class CommandMessageQueue implements Serializable {
    private static final long serialVersionUID = 1L;
    // path
    public static final String ENVIRONMENT_PARAMETER_PATH = "path";
    // message can be displayed in one row or several rows ( table )
    public static final int TYPE_ROW = 1;
    public static final int TYPE_TABLE = 2;
    // indicate when table date start or ends
    public static final int TABLE_DATA_START = 1;
    public static final int TABLE_DATA_END = 2;
    private String message = "";
    private boolean error = false;
    private boolean finish = false;
    private Map<String, String> envMap = new HashMap<String, String>();
    private int type = TYPE_ROW;
    private int tablePosition = 0;
    /**
     * CommandMessageQueue
     */
    public CommandMessageQueue() {
    }
    /**
     * CommandMessageQueue
     */
    public CommandMessageQueue(String message) {
        this.message = message;
    }
    /**
     * CommandMessageQueue
     */
    public CommandMessageQueue(String message, int tablePosition) {
        this.message = message;
        this.tablePosition = tablePosition;
        switch (tablePosition) {
            case TABLE_DATA_START:
            case TABLE_DATA_END :
                this.type = TYPE_TABLE;
                break;
            default:
                this.type = TYPE_ROW;
                break;
        }
    }
    /**
     * CommandMessageQueue
     */
    public CommandMessageQueue(boolean finish) {
        this.finish = finish;
    }
    /**
     * CommandMessageQueue
     */
    public CommandMessageQueue(boolean error, boolean finish, String message) {
        this.error = error;
        this.finish = finish;
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public boolean isError() {
        return error;
    }
    public void setError(boolean error) {
        this.error = error;
    }
    public boolean isFinish() {
        return finish;
    }
    public void setFinish(boolean finish) {
        this.finish = finish;
    }
    public Map<String, String> getEnvMap() {
        return envMap;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public int getTablePosition() {
        return tablePosition;
    }
    public void setTablePosition(int tablePosition) {
        this.tablePosition = tablePosition;
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        sb.append("message=").append(message);
        sb.append(", finish=").append(finish);
        sb.append(", error=").append(error);
        sb.append(", envMap=").append(envMap);
        sb.append(", type=").append(type);
        sb.append(", tablePosition=").append(tablePosition);
        sb.append("}");
        return sb.toString();
    }
}

Example of the Command shell implementation

Section titled “Example of the Command shell implementation”
package com.openkm.terminal;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.BlockingQueue;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import com.openkm.api.OKMFolder;
import com.openkm.api.OKMRepository;
import com.openkm.bean.CommandMessageQueue;
import com.openkm.core.DatabaseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.RepositoryException;
import com.openkm.util.CmdUtils;
import com.openkm.util.PathUtils;
/** *
*/
@PluginImplementation
public class CmdCd implements Command {
    private static final String COMMAND_NAME = "cd";
    private static final String USAGE = COMMAND_NAME+" [UUID|PATH]->folder";
    private BlockingQueue<CommandMessageQueue> queue;
    private String path;
    private String[] args;
    private boolean allowInputReader = false;
    @Override
    public void init(String path, String[] args, BlockingQueue<CommandMessageQueue> queue) {
        this.path = path;
        this.queue = queue;
        this.args = args;
    }
    @Override
    public String getHelp() {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        CmdUtils.printHelp(pw, USAGE, getOptions());
        pw.flush();
        pw.close();
        return sw.toString();
    }
    @Override
    public Options getOptions() {
        Options options = new Options();
        options.addOption("?", "help", false, "display this help and exit");
        return options;
    }
    @Override
    public boolean isAllowInputReader() {
        return allowInputReader;
    }
    @Override
    public void setInputQueue(BlockingQueue<CommandMessageQueue> inputQueue) {
    }
    @Override
    public String getCommandName() {
        return COMMAND_NAME;
    }
    @Override
    public String getDescription() {
        return "Change current working directory";
    }
    @Override
    public void run() {
        CommandLineParser parser = new BasicParser();
        try {
            try {
                CommandLine cmdLine = parser.parse(getOptions(), args);
                String arg[] = cmdLine.getArgs();
                if (cmdLine.hasOption("?") || cmdLine.hasOption("help")) {
                    queue.put(new CommandMessageQueue(false, false, getHelp()));
                } else if (arg.length > 1) {
                    queue.put(new CommandMessageQueue(true, false, COMMAND_NAME+": incorrect arguments"));
                    queue.put(new CommandMessageQueue(true, false, "Try \""+COMMAND_NAME+" -?\" for more information"));
                } else {
                    if (arg.length == 1) {
                        String param = arg[0];
                        if (param.equals("..")) {
                            path = PathUtils.getParent(path);
                        } else if (param.equals(".")) {
                            // Nothing to do here
                        } else {
                            // normalize path
                            path = TerminalUtils.normalizePath(param, path);
                        }
                    } else {
                        path = "/okm:root";
                    }
                    if (OKMRepository.getInstance().hasNode(null, path)) {
                        if (OKMFolder.getInstance().isValid(null, path)) {
                            CommandMessageQueue cmq = new CommandMessageQueue();
                            cmq.getEnvMap().put(CommandMessageQueue.ENVIRONMENT_PARAMETER_PATH, path);
                            queue.put(cmq);
                        } else {
                            queue.put(new CommandMessageQueue(true, false, "Node "+path+" is not a foldermessage"));
                        }
                    } else {
                        queue.put(new CommandMessageQueue(true, false, "Node "+path+" not exists"));
                    }
                }
                queue.put(new CommandMessageQueue(true)); // finish
            } catch (ParseException e) {
                queue.put(new CommandMessageQueue(true, false, COMMAND_NAME + " command arguments parse exception"));
                queue.put(new CommandMessageQueue(true, true, "Try \"" + COMMAND_NAME + " -?\" for more information"));
                e.printStackTrace();
            } catch (RepositoryException e) {
                queue.put(new CommandMessageQueue(true, true, "RepositoryException:"));
                e.printStackTrace();
            } catch (DatabaseException e) {
                queue.put(new CommandMessageQueue(true, true, "DatabaseException:"));
                e.printStackTrace();
            } catch (PathNotFoundException e) {
                queue.put(new CommandMessageQueue(true, true, "PathNotFoundException: " + path));
                e.printStackTrace();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}