001: /**
002: * Sequoia: Database clustering technology.
003: * Copyright (C) 2002-2004 French National Institute For Research In Computer
004: * Science And Control (INRIA).
005: * Contact: sequoia@continuent.org
006: *
007: * Licensed under the Apache License, Version 2.0 (the "License");
008: * you may not use this file except in compliance with the License.
009: * You may obtain a copy of the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS,
015: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016: * See the License for the specific language governing permissions and
017: * limitations under the License.
018: *
019: * Initial developer(s): Nicolas Modrzyk.
020: * Contributor(s): Mathieu Peltier.
021: */package org.continuent.sequoia.console.text.commands;
022:
023: import org.continuent.sequoia.common.i18n.ConsoleTranslate;
024: import org.continuent.sequoia.console.jmx.RmiJmxClient;
025: import org.continuent.sequoia.console.text.Console;
026: import org.continuent.sequoia.console.text.ConsoleException;
027: import org.continuent.sequoia.console.text.module.AbstractConsoleModule;
028:
029: /**
030: * This class defines a ConsoleCommand
031: *
032: * @author <a href="mailto:Nicolas.Modrzyk@inria.fr">Nicolas Modrzyk </a>
033: * @author <a href="mailto:Mathieu.Peltier@inrialpes.fr">Mathieu Peltier </a>
034: * @version 1.0
035: */
036: public abstract class ConsoleCommand implements Comparable {
037: protected Console console;
038: protected RmiJmxClient jmxClient;
039: protected AbstractConsoleModule module;
040:
041: /**
042: * Creates a new <code>ConsoleCommand.java</code> object
043: *
044: * @param module module that owns this commands
045: */
046: public ConsoleCommand(AbstractConsoleModule module) {
047: this .console = module.getConsole();
048: this .module = module;
049: jmxClient = console.getJmxClient();
050: }
051:
052: /**
053: * @see java.lang.Comparable#compareTo(java.lang.Object)
054: */
055: public int compareTo(Object o) {
056: if (o instanceof ConsoleCommand) {
057: ConsoleCommand c = (ConsoleCommand) o;
058: return getCommandName().compareTo(c.getCommandName());
059: } else {
060: throw new IllegalArgumentException();
061: }
062: }
063:
064: /**
065: * Check that a JMX connection is established with a controller. If no
066: * connection is available, a ConsoleException is thrown indicating that the
067: * console must be connected to a controller in order to execute the command.
068: *
069: * @throws ConsoleException if no JMX connection is available
070: */
071: protected void checkJmxConnectionToController()
072: throws ConsoleException {
073: // Force a refresh of jmxClient in case we have reconnected to another
074: // controller
075: jmxClient = console.getJmxClient();
076:
077: if (jmxClient == null)
078: throw new ConsoleException(ConsoleTranslate
079: .get("console.command.requires.connection")); //$NON-NLS-1$
080: }
081:
082: /**
083: * Parse the text of the command
084: *
085: * @param commandText the command text
086: * @throws Exception if connection with the mbean server is lost or command
087: * does not have the proper format
088: */
089: public abstract void parse(String commandText) throws Exception;
090:
091: /**
092: * Check if the JMX connection is still valid. Otherwise reconnect.
093: *
094: * @param commandText the parameters to execute the command with
095: * @throws Exception if fails
096: */
097: public void execute(String commandText) throws Exception {
098: parse(commandText);
099: }
100:
101: /**
102: * Get the name of the command
103: *
104: * @return <code>String</code> of the command name
105: */
106: public abstract String getCommandName();
107:
108: /**
109: * Return a <code>String</code> description of the parameters of this
110: * command.
111: *
112: * @return <code>String</code> like <driverPathName>
113: */
114: public String getCommandParameters() {
115: return ""; //$NON-NLS-1$
116: }
117:
118: /**
119: * Get the description of the command
120: *
121: * @return <code>String</code> of the command description
122: */
123: public abstract String getCommandDescription();
124:
125: /**
126: * Get the usage of the command.
127: *
128: * @return <code>String</code> of the command usage ()
129: */
130: public String getUsage() {
131: String usage = ConsoleTranslate
132: .get(
133: "command.usage", new String[] { getCommandName(), getCommandParameters() }); //$NON-NLS-1$
134: usage += "\n " + getCommandDescription(); //$NON-NLS-1$
135: return usage;
136: }
137: }
|