svn commit: rev 36064 - in avalon/trunk/planet/facilities/console: api/src/main/org/apache/avalon/facilities/console blocks/default commands/src/main/org/apache/avalon/facilities/console/commands impl/src/main/org/apache/avalon/facilities/console/impl
[email protected] 7 Aug 2004 13:38:55 -0000
| Newsgroups | gmane.comp.jakarta.avalon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: niclas
Date: Sat Aug 7 06:38:54 2004
New Revision: 36064
Added:
avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/CommandInterpreter.java (contents, props changed)
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ShowModelCmd.java
- copied, changed from rev 36060, avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ViewModelCmd.java
avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/CommandInterpreterImpl.java (contents, props changed)
Removed:
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ViewModelCmd.java
Modified:
avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/ConsoleCommand.java
avalon/trunk/planet/facilities/console/blocks/default/build.xml
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/DummyCmd.java
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/EchoCmd.java
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ExitCmd.java
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/HelpCmd.java
avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ThreadCmd.java
avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/ConsoleImpl.java
avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/LoginCmd.java
Log:
Added support for context navigation in the model and multi-word commands. Also commands are now defined by their name in the block.
Added: avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/CommandInterpreter.java
==============================================================================
--- (empty file)
+++ avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/CommandInterpreter.java Sat Aug 7 06:38:54 2004
@@ -0,0 +1,30 @@
+/*
+ * Copyright 1997-2004 Apache Software Foundation
+ *
+ * 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.apache.avalon.facilities.console;
+
+import org.apache.avalon.composition.model.ContainmentModel;
+
+public interface CommandInterpreter
+{
+ void addCommand( ConsoleCommand cmd );
+ void removeCommand( ConsoleCommand cmd );
+ void removeCommand( String commandname );
+
+ ContainmentModel getCurrentContainer();
+
+ void setCurrentNode( ContainmentModel node );
+}
+
Modified: avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/ConsoleCommand.java
==============================================================================
--- avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/ConsoleCommand.java (original)
+++ avalon/trunk/planet/facilities/console/api/src/main/org/apache/avalon/facilities/console/ConsoleCommand.java Sat Aug 7 06:38:54 2004
@@ -34,6 +34,8 @@
*/
String getDescription();
- void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ void execute( CommandInterpreter intp,
+ BufferedReader input, BufferedWriter output,
+ String[] arguments )
throws Exception;
}
Modified: avalon/trunk/planet/facilities/console/blocks/default/build.xml
==============================================================================
--- avalon/trunk/planet/facilities/console/blocks/default/build.xml (original)
+++ avalon/trunk/planet/facilities/console/blocks/default/build.xml Sat Aug 7 06:38:54 2004
@@ -41,8 +41,8 @@
<x:component name="help"
class="org.apache.avalon.facilities.console.commands.HelpCmd"/>
- <x:component name="viewmodel"
- class="org.apache.avalon.facilities.console.commands.ViewModelCmd"/>
+ <x:component name="show model"
+ class="org.apache.avalon.facilities.console.commands.ShowModelCmd"/>
</x:block>
</target>
Modified: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/DummyCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/DummyCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/DummyCmd.java Sat Aug 7 06:38:54 2004
@@ -18,9 +18,14 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -30,20 +35,42 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class DummyCmd
- implements ConsoleCommand, Serviceable
+ implements ConsoleCommand, Serviceable, Contextualizable
{
+ private String m_Name;
+
+
public String getName()
{
- return "dummy";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: dummy\n\nDoes absolutely nothing.";
+ String str = "usage: " + m_Name + "\n\nDoes absolutely nothing.";
return str;
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -54,7 +81,7 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.newLine();
Modified: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/EchoCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/EchoCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/EchoCmd.java Sat Aug 7 06:38:54 2004
@@ -18,9 +18,14 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -30,20 +35,40 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class EchoCmd
- implements ConsoleCommand, Serviceable
+ implements ConsoleCommand, Serviceable, Contextualizable
{
+ private String m_Name;
+
public String getName()
{
- return "echo";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: echo (string)*\n\nSends each of the string arguments back separate by a space.";
+ String str = "usage: " + m_Name + " (string)*\n\nSends each of the string arguments back separate by a space.";
return str;
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -54,7 +79,7 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.newLine();
Modified: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ExitCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ExitCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ExitCmd.java Sat Aug 7 06:38:54 2004
@@ -18,9 +18,14 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -30,20 +35,40 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class ExitCmd
- implements ConsoleCommand, Serviceable
+ implements ConsoleCommand, Serviceable, Contextualizable
{
+ private String m_Name;
+
public String getName()
{
- return "exit";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: exit\n\nTerminates the session.";
+ String str = "usage: " + m_Name + "\n\nTerminates the session.";
return str;
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -54,7 +79,7 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.write( "Logging out..." );
Modified: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/HelpCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/HelpCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/HelpCmd.java Sat Aug 7 06:38:54 2004
@@ -21,9 +21,14 @@
import java.util.Iterator;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -33,22 +38,41 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class HelpCmd
- implements ConsoleCommand, Serviceable
+ implements ConsoleCommand, Serviceable, Contextualizable
{
private Console m_Console;
+ private String m_Name;
public String getName()
{
- return "help";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: help (command)*\n\nGives a short description of each command.\nIf no command is given, then a list of available commands are printed.";
+ String str = "usage: " + m_Name + " (command)*\n\nGives a short description of each command.\nIf no command is given, then a list of available commands are printed.";
return str;
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -59,7 +83,7 @@
m_Console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.newLine();
Copied: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ShowModelCmd.java (from rev 36060, avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ViewModelCmd.java)
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ViewModelCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ShowModelCmd.java Sat Aug 7 06:38:54 2004
@@ -23,6 +23,7 @@
import org.apache.avalon.composition.model.ContainmentModel;
import org.apache.avalon.composition.model.DeploymentModel;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
@@ -35,25 +36,25 @@
import org.apache.avalon.framework.service.ServiceManager;
/**
- * @avalon.component name="console-viewmodel" lifestyle="singleton"
+ * @avalon.component name="console-showmodel" lifestyle="singleton"
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
-public class ViewModelCmd
+public class ShowModelCmd
implements ConsoleCommand, Serviceable, Contextualizable
{
String LINE =
"\n-----------------------------------------------------------";
- private ContainmentModel m_RootModel;
+ private String m_Name;
public String getName()
{
- return "viewmodel";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: viewmodel (path)\n\nDisplays the composition model.";
+ String str = "usage: " + m_Name + " (path)\n\nDisplays the composition model.";
return str;
}
@@ -66,16 +67,15 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @avalon.entry key="urn:composition:containment.model"
- * type="org.apache.avalon.composition.model.ContainmentModel"
- *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_RootModel = (ContainmentModel) ctx.get( "urn:composition:containment.model" );
+ m_Name = (String) ctx.get( "urn:avalon:name" );
}
-
+
/**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
@@ -87,16 +87,18 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.newLine();
+ ContainmentModel current = intp.getCurrentContainer();
String path;
if( arguments.length == 0 )
- path = "/";
+ path = current.getPath();
else
path = arguments[0];
- DeploymentModel model = m_RootModel.getModel( path );
+
+ DeploymentModel model = current.getModel( path );
String result = printModel( model );
output.write( result );
Modified: avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ThreadCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ThreadCmd.java (original)
+++ avalon/trunk/planet/facilities/console/commands/src/main/org/apache/avalon/facilities/console/commands/ThreadCmd.java Sat Aug 7 06:38:54 2004
@@ -18,9 +18,14 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -30,20 +35,40 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class ThreadCmd
- implements ConsoleCommand, Serviceable
+ implements ConsoleCommand, Serviceable, Contextualizable
{
+ private String m_Name;
+
public String getName()
{
- return "thread";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: thread\n\nLists all current threads in the JVM.";
+ String str = "usage: " + m_Name + "\n\nLists all current threads in the JVM.";
return str;
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -54,7 +79,7 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
ThreadGroup tg = Thread.currentThread().getThreadGroup();
Added: avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/CommandInterpreterImpl.java
==============================================================================
--- (empty file)
+++ avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/CommandInterpreterImpl.java Sat Aug 7 06:38:54 2004
@@ -0,0 +1,201 @@
+/*
+ * Copyright 1997-2004 Apache Software Foundation
+ *
+ * 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.apache.avalon.facilities.console.impl;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import java.net.Socket;
+
+import java.util.TreeMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.apache.avalon.composition.model.ContainmentModel;
+
+import org.apache.avalon.facilities.console.CommandInterpreter;
+import org.apache.avalon.facilities.console.Console;
+import org.apache.avalon.facilities.console.ConsoleCommand;
+
+class CommandInterpreterImpl extends Thread
+ implements CommandInterpreter
+{
+ private Socket m_Socket;
+ private boolean m_Login;
+ private BufferedWriter m_Output;
+ private BufferedReader m_Input;
+ private Map m_Commands;
+ private ContainmentModel m_CurrentNode;
+
+ CommandInterpreterImpl( Socket socket, String welcome, Map commands, ContainmentModel root )
+ throws IOException
+ {
+ m_Socket = socket;
+ m_Commands = commands;
+ welcomeMessage( welcome );
+ m_CurrentNode = root;
+ }
+
+ public void addCommand( ConsoleCommand cmd )
+ {
+ m_Commands.put( cmd.getName(), cmd );
+ }
+
+ public void removeCommand( ConsoleCommand cmd )
+ {
+ m_Commands.remove( cmd.getName() );
+ }
+
+ public void removeCommand( String commandname )
+ {
+ m_Commands.remove( commandname );
+ }
+
+ public ContainmentModel getCurrentContainer()
+ {
+ return m_CurrentNode;
+ }
+
+ public void setCurrentNode( ContainmentModel node )
+ {
+ m_CurrentNode = node;
+ }
+
+ public void run()
+ {
+ boolean running = true;
+ while( running )
+ {
+ try
+ {
+ if( ! m_Login )
+ execute( "login" );
+ m_Login = true; //LoginCmd throws an exception if login fails.
+ execute( waitForCommandLine() );
+ } catch( InterruptedException e )
+ {
+ running = false;
+ } catch( Exception e )
+ {
+ String mess = e.getMessage();
+ if( mess == null )
+ mess = "<null>";
+ errorMessage( mess );
+ e.printStackTrace();
+ }
+ }
+ try
+ {
+ m_Socket.close();
+ } catch( IOException e )
+ {
+ }
+ }
+
+ private void execute( String cmdline )
+ throws Exception
+ {
+ // TODO: Optimize parser.
+ StringTokenizer st = new StringTokenizer( cmdline, " ", false );
+ String cmd = "";
+ while( st.hasMoreTokens() )
+ {
+ cmd = (cmd + " " + st.nextToken()).trim();
+ ConsoleCommand cc = (ConsoleCommand) m_Commands.get( cmd );
+ if( cc != null )
+ {
+ String[] args = parseArguments( st );
+ cc.execute( this, getInput(), getOutput(), args );
+ return;
+ }
+ }
+ errorMessage( "Unknown command. 'help' for available commands." );
+ }
+
+ private String waitForCommandLine()
+ throws IOException
+ {
+ String cmdline = m_Input.readLine().trim();
+ return cmdline;
+ }
+
+ private String[] parseArguments( StringTokenizer st )
+ {
+ String[] args = new String[ st.countTokens() ];
+ for( int i=0 ; st.hasMoreTokens() ; i++ )
+ args[i] = st.nextToken();
+ return args;
+ }
+
+ private void welcomeMessage( String message )
+ {
+ try
+ {
+ getOutput().write( message );
+ getOutput().newLine();
+ getOutput().flush();
+ } catch( IOException e )
+ {
+ e.printStackTrace( System.out );
+ }
+ }
+
+ private void errorMessage( String message )
+ {
+ try
+ {
+ getOutput().write( message );
+ getOutput().newLine();
+ getOutput().flush();
+ } catch( IOException e )
+ {
+ e.printStackTrace( System.out );
+ }
+ }
+
+ private BufferedWriter getOutput()
+ throws IOException
+ {
+ if( m_Output == null )
+ openOut();
+ return m_Output;
+ }
+
+ private BufferedReader getInput()
+ throws IOException
+ {
+ if( m_Input == null )
+ openIn();
+ return m_Input;
+ }
+
+ private void openOut()
+ throws IOException
+ {
+ m_Output = new BufferedWriter( new OutputStreamWriter( m_Socket.getOutputStream() ) );
+ }
+
+ private void openIn()
+ throws IOException
+ {
+ m_Input = new BufferedReader( new InputStreamReader( m_Socket.getInputStream() ) );
+ }
+
+}
+
Modified: avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/ConsoleImpl.java
==============================================================================
--- avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/ConsoleImpl.java (original)
+++ avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/ConsoleImpl.java Sat Aug 7 06:38:54 2004
@@ -26,12 +26,19 @@
import java.util.Hashtable;
import java.util.Iterator;
+import org.apache.avalon.composition.model.ContainmentModel;
+
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.ParameterException;
@@ -44,7 +51,8 @@
* @avalon.service type="org.apache.avalon.facilities.console.Console"
*/
public class ConsoleImpl extends AbstractLogEnabled
- implements Console, Runnable, Startable, Parameterizable, Initializable
+ implements Console, Runnable, Startable, Parameterizable,
+ Initializable, Contextualizable
{
private int m_Port;
private ServerSocket m_ServerSocket;
@@ -52,6 +60,26 @@
private Hashtable m_Commands;
private ArrayList m_Interpreters;
private String m_Welcome;
+ private ContainmentModel m_RootModel;
+
+ /**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:composition:containment.model"
+ * type="org.apache.avalon.composition.model.ContainmentModel"
+ *
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_RootModel = (ContainmentModel) ctx.get( "urn:composition:containment.model" );
+ }
public void parameterize( Parameters params )
throws ParameterException
@@ -94,17 +122,45 @@
public void addCommand( ConsoleCommand cmd )
{
getLogger().info( "Added " + cmd.getName() + " command." );
- m_Commands.put( cmd.getName(), cmd );
+ String name = cmd.getName();
+ m_Commands.put( name, cmd );
+ synchronized( m_Interpreters )
+ {
+ Iterator list = m_Interpreters.iterator();
+ while( list.hasNext() )
+ {
+ CommandInterpreter intp = (CommandInterpreter) list.next();
+ intp.addCommand( cmd );
+ }
+ }
}
public void removeCommand( ConsoleCommand cmd )
{
m_Commands.remove( cmd.getName() );
+ synchronized( m_Interpreters )
+ {
+ Iterator list = m_Interpreters.iterator();
+ while( list.hasNext() )
+ {
+ CommandInterpreter intp = (CommandInterpreter) list.next();
+ intp.removeCommand( cmd );
+ }
+ }
}
public void removeCommand( String commandname )
{
m_Commands.remove( commandname );
+ synchronized( m_Interpreters )
+ {
+ Iterator list = m_Interpreters.iterator();
+ while( list.hasNext() )
+ {
+ CommandInterpreter intp = (CommandInterpreter) list.next();
+ intp.removeCommand( commandname );
+ }
+ }
}
public ConsoleCommand getCommand( String name )
@@ -125,8 +181,11 @@
try
{
Socket socket = m_ServerSocket.accept();
- CommandInterpreter intp = new CommandInterpreter( socket, m_Welcome, this );
- m_Interpreters.add( intp );
+ CommandInterpreterImpl intp = new CommandInterpreterImpl( socket, m_Welcome, m_Commands, m_RootModel );
+ synchronized( m_Interpreters )
+ {
+ m_Interpreters.add( intp );
+ }
intp.start();
} catch( IOException e )
{
@@ -146,7 +205,7 @@
Iterator list = m_Interpreters.iterator();
while( list.hasNext() )
{
- CommandInterpreter intp = (CommandInterpreter) list.next();
+ CommandInterpreterImpl intp = (CommandInterpreterImpl) list.next();
intp.interrupt();
}
}
Modified: avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/LoginCmd.java
==============================================================================
--- avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/LoginCmd.java (original)
+++ avalon/trunk/planet/facilities/console/impl/src/main/org/apache/avalon/facilities/console/impl/LoginCmd.java Sat Aug 7 06:38:54 2004
@@ -19,9 +19,14 @@
import java.io.BufferedWriter;
import java.io.IOException;
+import org.apache.avalon.facilities.console.CommandInterpreter;
import org.apache.avalon.facilities.console.Console;
import org.apache.avalon.facilities.console.ConsoleCommand;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters;
@@ -35,18 +40,19 @@
* @avalon.service type="org.apache.avalon.facilities.console.ConsoleCommand"
*/
public class LoginCmd
- implements ConsoleCommand, Parameterizable, Serviceable
+ implements ConsoleCommand, Parameterizable, Serviceable, Contextualizable
{
private String m_Password;
-
+ private String m_Name;
+
public String getName()
{
- return "login";
+ return m_Name;
}
public String getDescription()
{
- String str = "usage: login\n\nLogins to the system. This command is executed automatically.";
+ String str = "usage: " + m_Name + "\n\nLogins to the system. This command is executed automatically.";
return str;
}
@@ -57,6 +63,24 @@
}
/**
+ * Contextulaization of the listener by the container during
+ * which we are supplied with the root composition model for
+ * the application.
+ *
+ * @param ctx the supplied listener context
+ *
+ * @exception ContextException if a contextualization error occurs
+ *
+ * @avalon.entry key="urn:avalon:name"
+ * type="java.lang.String"
+ */
+ public void contextualize( Context ctx )
+ throws ContextException
+ {
+ m_Name = (String) ctx.get( "urn:avalon:name" );
+ }
+
+ /**
* @avalon.dependency type="org.apache.avalon.facilities.console.Console"
* key="console"
*/
@@ -67,7 +91,7 @@
console.addCommand( this );
}
- public void execute( BufferedReader input, BufferedWriter output, String[] arguments )
+ public void execute( CommandInterpreter intp, BufferedReader input, BufferedWriter output, String[] arguments )
throws Exception
{
output.write( "Password:" );