notify-dpml AT lists.ibiblio.org
Subject: DPML Notify
List archive
svn commit: r2819 - in development/planet/components/console: . blocks/default commands/src/main/net/dpml/console/commands commands/src/test commands/src/test/net commands/src/test/net/dpml commands/src/test/net/dpml/console commands/src/test/net/dpml/console/test impl/src/main/net/dpml/console/impl xmpp/src/main/net/dpml/console/xmpp
- From: niclas AT hedhman.org
- To: notify-dpml AT lists.ibiblio.org
- Subject: svn commit: r2819 - in development/planet/components/console: . blocks/default commands/src/main/net/dpml/console/commands commands/src/test commands/src/test/net commands/src/test/net/dpml commands/src/test/net/dpml/console commands/src/test/net/dpml/console/test impl/src/main/net/dpml/console/impl xmpp/src/main/net/dpml/console/xmpp
- Date: Fri, 10 Jun 2005 11:04:35 -0400
Author: niclas AT hedhman.org
Date: Fri Jun 10 11:04:32 2005
New Revision: 2819
Added:
development/planet/components/console/commands/src/test/
development/planet/components/console/commands/src/test/net/
development/planet/components/console/commands/src/test/net/dpml/
development/planet/components/console/commands/src/test/net/dpml/console/
development/planet/components/console/commands/src/test/net/dpml/console/test/
development/planet/components/console/commands/src/test/net/dpml/console/test/EchoCommandTestCase.java
(contents, props changed)
development/planet/components/console/commands/src/test/net/dpml/console/test/TestCommandInterpreter.java
(contents, props changed)
development/planet/components/console/commands/src/test/net/dpml/console/test/TestConsole.java
(contents, props changed)
Modified:
development/planet/components/console/blocks/default/build.xml
development/planet/components/console/commands/src/main/net/dpml/console/commands/DeployCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/DummyCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/EchoCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/ExitCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/HelpCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/ListCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/RedeployCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/SelectCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/ShowModelCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/ThreadCmd.java
development/planet/components/console/commands/src/main/net/dpml/console/commands/UndeployCmd.java
development/planet/components/console/impl/src/main/net/dpml/console/impl/LoginCmd.java
development/planet/components/console/index.xml
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppProvider.java
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppWriter.java
Log:
Some steps towards testing, and a functional default block.
Modified: development/planet/components/console/blocks/default/build.xml
==============================================================================
--- development/planet/components/console/blocks/default/build.xml
(original)
+++ development/planet/components/console/blocks/default/build.xml Fri
Jun 10 11:04:32 2005
@@ -14,10 +14,26 @@
<x:component name="console"
class="net.dpml.console.impl.ConsoleImpl" >
<x:parameters>
- <x:parameter name="port" value="3333"/>
<x:parameter name="welcome-text"
value="Welcome to Metro Console.
-type help for more info."/>
+After logging in, you can type help for more info."/>
+ </x:parameters>
+ </x:component>
+
+ <x:component name="socket-connection"
class="net.dpml.console.socket.SocketProvider" >
+ <x:parameters>
+ <x:parameter name="port" value="3333"/>
+ </x:parameters>
+ <x:configuration>
+ </x:configuration>
+ </x:component>
+
+ <x:component name="xmpp-connection"
class="net.dpml.console.xmpp.XmppProvider" >
+ <x:parameters>
+ <x:parameter name="jabber-server" value="jabber.dpml.net"/>
+ <x:parameter name="jabber-port" value="5222"/>
+ <x:parameter name="_user"
value="RemoveUnderscoreFromUserToEnable"/>
+ <x:parameter name="password" value="UnsafePassword"/>
</x:parameters>
</x:component>
@@ -42,13 +58,13 @@
<x:component name="help"
class="net.dpml.console.commands.HelpCmd"/>
- <x:component name="list"
+ <x:component name="ls"
class="net.dpml.console.commands.ListCmd"/>
<x:component name="show model"
class="net.dpml.console.commands.ShowModelCmd"/>
- <x:component name="select"
+ <x:component name="cd"
class="net.dpml.console.commands.SelectCmd"/>
<x:component name="deploy block"
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/DeployCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/DeployCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/DeployCmd.java
Fri Jun 10 11:04:32 2005
@@ -63,16 +63,16 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
- * @metro.entry key="urn:avalon:home"
+ * @metro.entry key="urn:metro:home"
* type="java.io.File"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
- m_WorkingDir = (File) ctx.get( "urn:avalon:home" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
+ m_WorkingDir = (File) ctx.get( "urn:metro:home" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/DummyCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/DummyCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/DummyCmd.java
Fri Jun 10 11:04:32 2005
@@ -60,13 +60,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/EchoCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/EchoCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/EchoCmd.java
Fri Jun 10 11:04:32 2005
@@ -59,13 +59,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/ExitCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/ExitCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/ExitCmd.java
Fri Jun 10 11:04:32 2005
@@ -59,13 +59,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/HelpCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/HelpCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/HelpCmd.java
Fri Jun 10 11:04:32 2005
@@ -63,13 +63,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/ListCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/ListCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/ListCmd.java
Fri Jun 10 11:04:32 2005
@@ -62,13 +62,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/RedeployCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/RedeployCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/RedeployCmd.java
Fri Jun 10 11:04:32 2005
@@ -59,16 +59,16 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
- * @metro.entry key="urn:avalon:home"
+ * @metro.entry key="urn:metro:home"
* type="java.io.File"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
- m_WorkingDir = (File) ctx.get( "urn:avalon:home" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
+ m_WorkingDir = (File) ctx.get( "urn:metro:home" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/SelectCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/SelectCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/SelectCmd.java
Fri Jun 10 11:04:32 2005
@@ -62,13 +62,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/ShowModelCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/ShowModelCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/ShowModelCmd.java
Fri Jun 10 11:04:32 2005
@@ -63,13 +63,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/ThreadCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/ThreadCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/ThreadCmd.java
Fri Jun 10 11:04:32 2005
@@ -59,13 +59,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Modified:
development/planet/components/console/commands/src/main/net/dpml/console/commands/UndeployCmd.java
==============================================================================
---
development/planet/components/console/commands/src/main/net/dpml/console/commands/UndeployCmd.java
(original)
+++
development/planet/components/console/commands/src/main/net/dpml/console/commands/UndeployCmd.java
Fri Jun 10 11:04:32 2005
@@ -60,13 +60,13 @@
*
* @exception ContextException if a contextualization error occurs
*
- * @metro.entry key="urn:avalon:name"
+ * @metro.entry key="urn:metro:name"
* type="java.lang.String"
*/
public void contextualize( Context ctx )
throws ContextException
{
- m_Name = (String) ctx.get( "urn:avalon:name" );
+ m_Name = (String) ctx.get( "urn:metro:name" );
}
/**
Added:
development/planet/components/console/commands/src/test/net/dpml/console/test/EchoCommandTestCase.java
==============================================================================
--- (empty file)
+++
development/planet/components/console/commands/src/test/net/dpml/console/test/EchoCommandTestCase.java
Fri Jun 10 11:04:32 2005
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2004 Niclas Hedman.
+ *
+ * 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 net.dpml.console.test;
+
+import java.io.*;
+import java.util.*;
+import junit.framework.TestCase;
+
+import net.dpml.context.*;
+import net.dpml.service.*;
+import net.dpml.metro.unit.*;
+
+import net.dpml.console.*;
+import net.dpml.console.commands.*;
+
+public class EchoCommandTestCase extends TestCase
+{
+ private final String IN_DATA = "This is a TEST with Svenska åäöÅÄÖ.";
+
+ private EchoCmd m_Command;
+ private CommandInterpreter m_Intp;
+
+ private ByteArrayOutputStream m_OutBuffer;
+ private BufferedReader m_Reader;
+ private BufferedWriter m_Writer;
+
+ public void setUp()
+ throws Exception
+ {
+ Context ctx = new TestContext();
+ Console console = new TestConsole();
+ HashMap deps = new HashMap();
+ deps.put( "console", console );
+ ServiceManager man = new TestServiceManager( deps );
+ m_Command = new EchoCmd();
+ m_Command.contextualize( ctx );
+ m_Command.service( man );
+ m_Intp = new TestCommandInterpreter();
+
+ ByteArrayInputStream in = new ByteArrayInputStream(
IN_DATA.getBytes() );
+ InputStreamReader isr = new InputStreamReader( in, "UTF-8" );
+ m_Reader = new BufferedReader( isr );
+
+ m_OutBuffer = new ByteArrayOutputStream();
+ OutputStreamWriter osw = new OutputStreamWriter( m_OutBuffer,
"UTF-8" );
+ m_Writer = new BufferedWriter( osw );
+ }
+
+ public void testCommand()
+ throws Exception
+ {
+ assertEquals( "name", "unit-test", m_Command.getName() );
+ assertEquals( "description", "usage: unit-test (string)*\n\nSends
each of the string arguments back separate by a space.",
m_Command.getDescription() );
+ String[] args = new String[] { IN_DATA, "abc", "def" };
+ m_Command.execute( m_Intp, m_Reader, m_Writer, args );
+ byte[] data = m_OutBuffer.toByteArray();
+ String result = new String( data, "UTF-8" ).trim();
+ assertEquals( "data", "echo: " + IN_DATA + " abc def", result );
+ }
+}
\ No newline at end of file
Added:
development/planet/components/console/commands/src/test/net/dpml/console/test/TestCommandInterpreter.java
==============================================================================
--- (empty file)
+++
development/planet/components/console/commands/src/test/net/dpml/console/test/TestCommandInterpreter.java
Fri Jun 10 11:04:32 2005
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2005 Niclas Hedman.
+ *
+ * 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 net.dpml.console.test;
+
+import java.util.*;
+
+import net.dpml.composition.model.ContainmentModel;
+
+import net.dpml.console.ConsoleCommand;
+import net.dpml.console.CommandInterpreter;
+
+public class TestCommandInterpreter
+ implements CommandInterpreter
+{
+ private HashMap m_Commands;
+ private ContainmentModel m_Node;
+
+ TestCommandInterpreter()
+ {
+ m_Commands = new HashMap();
+ }
+
+ public void addCommand( ConsoleCommand cmd )
+ {
+ String name = cmd.getName();
+ m_Commands.put( name, cmd );
+ }
+
+ public void removeCommand( ConsoleCommand cmd )
+ {
+ String name = cmd.getName();
+ removeCommand( name );
+ }
+
+ public void removeCommand( String name )
+ {
+ m_Commands.remove( name );
+ }
+
+ public ConsoleCommand getCommand( String name )
+ {
+ return (ConsoleCommand) m_Commands.get( name );
+ }
+
+ public void close()
+ {
+ }
+
+ public ContainmentModel getCurrentContainer()
+ {
+ return m_Node;
+ }
+
+ public void setCurrentContainer( ContainmentModel node )
+ {
+ m_Node = node;
+ }
+
+}
Added:
development/planet/components/console/commands/src/test/net/dpml/console/test/TestConsole.java
==============================================================================
--- (empty file)
+++
development/planet/components/console/commands/src/test/net/dpml/console/test/TestConsole.java
Fri Jun 10 11:04:32 2005
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2005 Niclas Hedman.
+ *
+ * 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 net.dpml.console.test;
+
+import java.util.*;
+
+import net.dpml.console.Console;
+import net.dpml.console.ConsoleCommand;
+
+class TestConsole
+ implements Console
+{
+ private HashMap m_Commands;
+
+ TestConsole()
+ {
+ m_Commands = new HashMap();
+ }
+
+ public void addCommand( ConsoleCommand cmd )
+ {
+ String name = cmd.getName();
+ m_Commands.put( name, cmd );
+ }
+
+ public void removeCommand( ConsoleCommand cmd )
+ {
+ String name = cmd.getName();
+ removeCommand( name );
+ }
+
+ public void removeCommand( String name )
+ {
+ m_Commands.remove( name );
+ }
+
+ public ConsoleCommand getCommand( String name )
+ {
+ return (ConsoleCommand) m_Commands.get( name );
+ }
+
+ public Collection getCommandNames()
+ {
+ return m_Commands.keySet();
+ }
+}
Modified:
development/planet/components/console/impl/src/main/net/dpml/console/impl/LoginCmd.java
==============================================================================
---
development/planet/components/console/impl/src/main/net/dpml/console/impl/LoginCmd.java
(original)
+++
development/planet/components/console/impl/src/main/net/dpml/console/impl/LoginCmd.java
Fri Jun 10 11:04:32 2005
@@ -22,15 +22,15 @@
import net.dpml.console.Console;
import net.dpml.console.ConsoleCommand;
import net.dpml.console.LoginException;
+
import net.dpml.context.Context;
import net.dpml.context.ContextException;
-import net.dpml.context.Contextualizable;
+
import net.dpml.parameters.ParameterException;
-import net.dpml.parameters.Parameterizable;
import net.dpml.parameters.Parameters;
+
import net.dpml.service.ServiceException;
import net.dpml.service.ServiceManager;
-import net.dpml.service.Serviceable;
/**
* @metro.component name="console-login" lifestyle="singleton"
@@ -56,6 +56,9 @@
public LoginCmd( Context ctx, Parameters params, ServiceManager man )
throws ContextException, ParameterException, ServiceException
{
+ // TODO; LoginCmd should use JAAS to establish a proper
+ // login and security context.
+
m_Name = (String) ctx.get( "urn:metro:name" );
m_Password = params.getParameter( "root-password" );
Console console = (Console) man.lookup( "console" );
Modified: development/planet/components/console/index.xml
==============================================================================
--- development/planet/components/console/index.xml (original)
+++ development/planet/components/console/index.xml Fri Jun 10 11:04:32
2005
@@ -84,6 +84,8 @@
</info>
<dependencies>
<include key="dpml-console-impl"/>
+ <include key="dpml-classic-api"/>
+ <include key="dpml-classic-unit"/>
</dependencies>
<plugins>
<include key="dpml-meta-tools"/>
@@ -96,7 +98,7 @@
<type>block</type>
</info>
<dependencies>
- <include key="dpml-console-commands"/>
+ <include key="dpml-console-commands"/>
</dependencies>
<plugins>
<include key="dpml-meta-tools"/>
Modified:
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppProvider.java
==============================================================================
---
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppProvider.java
(original)
+++
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppProvider.java
Fri Jun 10 11:04:32 2005
@@ -96,7 +96,7 @@
m_Listeners = new ArrayList();
m_Server = params.getParameter( "jabber-server" );
m_Port = params.getParameterAsInteger( "jabber-port" );
- m_User = params.getParameter( "user" );
+ m_User = params.getParameter( "user",
InetAddress.getLocalHost().toString() );
m_Password = params.getParameter( "password" );
connectToJabberServer();
}
Modified:
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppWriter.java
==============================================================================
---
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppWriter.java
(original)
+++
development/planet/components/console/xmpp/src/main/net/dpml/console/xmpp/XmppWriter.java
Fri Jun 10 11:04:32 2005
@@ -34,7 +34,7 @@
public void newLine()
throws IOException
{
- flush();
+ m_Buffer.append( "\n" );
}
public void write( char[] ch, int offset, int length )
- svn commit: r2819 - in development/planet/components/console: . blocks/default commands/src/main/net/dpml/console/commands commands/src/test commands/src/test/net commands/src/test/net/dpml commands/src/test/net/dpml/console commands/src/test/net/dpml/console/test impl/src/main/net/dpml/console/impl xmpp/src/main/net/dpml/console/xmpp, niclas, 06/10/2005
Archive powered by MHonArc 2.6.24.