svn commit: r952059 - in /camel/trunk/tests: camel-itest-karaf/pom.xml camel-itest-osgi/pom.xml
Author: ningjiang Date: Mon Jun 7 01:36:50 2010 New Revision: 952059 URL: http://svn.apache.org/viewvc?rev=952059view=rev Log: Removed the dependency of camel-osgi Modified: camel/trunk/tests/camel-itest-karaf/pom.xml camel/trunk/tests/camel-itest-osgi/pom.xml Modified: camel/trunk/tests/camel-itest-karaf/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-karaf/pom.xml?rev=952059r1=952058r2=952059view=diff == --- camel/trunk/tests/camel-itest-karaf/pom.xml (original) +++ camel/trunk/tests/camel-itest-karaf/pom.xml Mon Jun 7 01:36:50 2010 @@ -90,12 +90,6 @@ version4.5/version scopetest/scope /dependency - dependency - groupIdorg.apache.camel/groupId - artifactIdcamel-osgi/artifactId - scopetest/scope - /dependency - /dependencies build Modified: camel/trunk/tests/camel-itest-osgi/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/pom.xml?rev=952059r1=952058r2=952059view=diff == --- camel/trunk/tests/camel-itest-osgi/pom.xml (original) +++ camel/trunk/tests/camel-itest-osgi/pom.xml Mon Jun 7 01:36:50 2010 @@ -86,11 +86,6 @@ /dependency dependency groupIdorg.apache.camel/groupId - artifactIdcamel-osgi/artifactId - scopetest/scope -/dependency -dependency - groupIdorg.apache.camel/groupId artifactIdcamel-servlet/artifactId scopetest/scope /dependency
svn commit: r952060 - in /camel/trunk/apache-camel: pom.xml src/main/descriptors/common-bin.xml
Author: ningjiang Date: Mon Jun 7 01:37:47 2010 New Revision: 952060 URL: http://svn.apache.org/viewvc?rev=952060view=rev Log: Added camel-blueprint module into assembly Modified: camel/trunk/apache-camel/pom.xml camel/trunk/apache-camel/src/main/descriptors/common-bin.xml Modified: camel/trunk/apache-camel/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/pom.xml?rev=952060r1=952059r2=952060view=diff == --- camel/trunk/apache-camel/pom.xml (original) +++ camel/trunk/apache-camel/pom.xml Mon Jun 7 01:37:47 2010 @@ -62,12 +62,10 @@ groupIdorg.apache.camel/groupId artifactIdcamel-bindy/artifactId /dependency -!-- blueprint is under active development dependency groupIdorg.apache.camel/groupId artifactIdcamel-blueprint/artifactId /dependency --- dependency groupIdorg.apache.camel/groupId artifactIdcamel-cache/artifactId Modified: camel/trunk/apache-camel/src/main/descriptors/common-bin.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/src/main/descriptors/common-bin.xml?rev=952060r1=952059r2=952060view=diff == --- camel/trunk/apache-camel/src/main/descriptors/common-bin.xml (original) +++ camel/trunk/apache-camel/src/main/descriptors/common-bin.xml Mon Jun 7 01:37:47 2010 @@ -38,9 +38,7 @@ includeorg.apache.camel:camel-bam/include includeorg.apache.camel:camel-bean-validator/include includeorg.apache.camel:camel-bindy/include -!-- blueprint is under active development includeorg.apache.camel:camel-blueprint/include --- includeorg.apache.camel:camel-cache/include includeorg.apache.camel:camel-castor/include includeorg.apache.camel:camel-core/include
[CONF] Apache Camel Spring Security
Spring Security Page edited by willem jiang Comment: CAMEL-2793 update the wiki doc of camel-spring-security Changes (5) ... h3. Using SpringSecurityAuthorizationPolicy camel-spring-security component can take the authentication token which is set by Spring Security or other security framework, and check authentication token with the access information which is configured by SpringSecurityAuthorizationPolicy. If the authentication token is authorized, the camel exchange will be passed to the next processor, otherwise CamelAuthorizationException will be thrown with the exchange. SpringSecurityAuthorizationPolicy will check the message header with CamelAuthentication and turned the security subject into the spring authentication token, you can specify your customer authenticationAdapter by configure this policy. If there is no security subject in the message header, and the policys attribute useThreadSecurityContext is true, the policy will use SecurityContextHolder.getContext().getAuthentication() to get the authentication token. If the authentication token is authorized, the camel exchange will be passed to the next processor, otherwise CamelAuthorizationException will be thrown with the exchange. You can configure the SpringSecurityAuthorizationPolicy with normal Spring beans configuration, and you can also configure it with the customer authorizationPolicy element. ... | {{authenticationManager}} | String | The id of the authentication manager which is used for reauthentication within the SpringSecurityAuthorizationPolicy. If you dont specify it, SpringSecurityAuthorizationPolicy will set it value with authenticationManager | | {{accessDecisionManager}} | String | The id of the access decision manager which is used for checking the access attribute with authentication token. If you dont specify it, SpringSecurityAuthorizationPolicy will set it value with accessDecisionManager | | {{authenticationAdapter}} | String | New to Camel 2.4, The id of AuthenticationAdapter that SpringSecurityAuthorizationPolicy uses to turn a security subject into Spring authentication token | | {{useThreadSecurityContext}} | String boolean | SpringSecurityAuthorizationPolicy will try to get the authentication token from exchange, message header with the key CamelAuthentication, if it cant get it and the this attribute is true, it will try to get authentication from SecurityContextHolder (the thread local context). The default value of this attribute is true. | | {{alwaysReauthenticate}} | String boolean | If this attribute is true, SpringSecurityAuthorizationPolicy will aways reauthenticate the authentication token. The default value of this attribute is false. | h4. Using SpringSecurityAuthorizationPolicy in Spring XML ... Full Content Spring Security Available as of Camel 2.3 Spring Security is a poplar security framework to provides the authentication and authorization for the Spring application. It allows together with Camel to provide authorization support for the camel process by configuring the authorizationPolicy. Using SpringSecurityAuthorizationPolicy camel-spring-security component can take the authentication token which is set by Spring Security or other security framework, and check authentication token with the access information which is configured by SpringSecurityAuthorizationPolicy. SpringSecurityAuthorizationPolicy will check the message header with "CamelAuthentication" and turned the security subject into the spring authentication token, you can specify your customer authenticationAdapter by configure this policy. If there is no security subject in the message header, and the policy's attribute "useThreadSecurityContext" is true, the policy will use SecurityContextHolder.getContext().getAuthentication() to get the authentication token. If the authentication token is authorized, the camel exchange will be passed to the next processor, otherwise CamelAuthorizationException will be thrown with the exchange. You can configure the SpringSecurityAuthorizationPolicy with normal Spring bean's configuration, and you can also configure it with the customer authorizationPolicy element. authorizationPolicy element has below attributes: Attribut Type Description id String The bean id which is common used for the bean which is managed by Spring access String The access policy that you want to use authorization authenticationManager String The id of the authentication manager which is used for reauthentication within the SpringSecurityAuthorizationPolicy. If you don't specify it, SpringSecurityAuthorizationPolicy
svn commit: r952085 - /camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.java
Author: davsclaus Date: Mon Jun 7 04:25:50 2010 New Revision: 952085 URL: http://svn.apache.org/viewvc?rev=952085view=rev Log: CAMEL-2537: Added JMS example of using resequencer to reorder messages based on JMSPriority Added: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.java - copied, changed from r952077, camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsFilterTest.java Copied: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.java (from r952077, camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsFilterTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.java?p2=camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.javap1=camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsFilterTest.javar1=952077r2=952085rev=952085view=diff == --- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsFilterTest.java (original) +++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBatchResequencerJMSPriorityTest.java Mon Jun 7 04:25:50 2010 @@ -14,70 +14,66 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.jms; +package org.apache.camel.component.jms; import javax.jms.ConnectionFactory; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.camel.CamelContext; -import org.apache.camel.EndpointInject; -import org.apache.camel.Produce; -import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.CamelTestSupport; +import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge; + /** - * Tests filtering using Camel Test + * JMSPriority being ordered using the resequencer in batch mode. + * * @version $Revision: 724291 $ */ -// START SNIPPET: example -public class JmsFilterTest extends CamelTestSupport { - -@EndpointInject(uri = mock:result) -protected MockEndpoint resultEndpoint; - -@Produce(uri = direct:start) -protected ProducerTemplate template; - -public void testSendMatchingMessage() throws Exception { -String expectedBody = matched/; - -resultEndpoint.expectedBodiesReceived(expectedBody); - -template.sendBodyAndHeader(expectedBody, foo, bar); - -resultEndpoint.assertIsSatisfied(); -} - -public void testSendNotMatchingMessage() throws Exception { -resultEndpoint.expectedMessageCount(0); - -template.sendBodyAndHeader(notMatched/, foo, notMatchedHeaderValue); +public class JmsBatchResequencerJMSPriorityTest extends CamelTestSupport { + +public void testBatchResequencerJMSPriority() throws Exception { +MockEndpoint mock = getMockEndpoint(mock:result); +mock.expectedBodiesReceived(G, A, B, E, H, C, D, F); + +// must use preserveMessageQos=true to be able to specify the JMSPriority to be used +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, A, JMSPriority, 6); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, B, JMSPriority, 6); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, C, JMSPriority, 4); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, D, JMSPriority, 4); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, E, JMSPriority, 6); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, F, JMSPriority, 4); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, G, JMSPriority, 8); +template.sendBodyAndHeader(jms:queue:foo?preserveMessageQos=true, H, JMSPriority, 6); -resultEndpoint.assertIsSatisfied(); +assertMockEndpointsSatisfied(); } protected CamelContext createCamelContext() throws Exception { CamelContext camelContext = super.createCamelContext(); - -// connect to embedded ActiveMQ JMS broker -ConnectionFactory connectionFactory = -new ActiveMQConnectionFactory(vm://localhost); -camelContext.addComponent(jms, -JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); + +ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(vm://localhost?broker.persistent=false); +camelContext.addComponent(jms, jmsComponentClientAcknowledge(connectionFactory)); return camelContext; } - +
[CONF] Apache Camel Resequencer
Resequencer Page edited by Claus Ibsen Changes (2) ... * *Stream resequencing* re-orders (continuous) message streams based on the detection of gaps between messages. By default the [Resequencer] does not support duplicate messages and will only keep the last message, in case a message arrives with the same message _expression_. However in the batch mode you can enable it to allow duplicates. h3. Batch Resequencing ... {code} h4. Allow Duplicates *Available as of Camel 2.4* In the {{batch}} mode, you can now allow duplicates. In Java DSL there is a {{allowDuplicates()}} method and in Spring XML there is an {{allowDuplicates=true}} attribute on the {{batch-config/}} you can use to enable it. h4. Reverse *Available as of Camel 2.4* In the {{batch}} mode, you can now reverse the _expression_ ordering. By default the order is based on 0..9,A..Z, which would let messages with low numbers be ordered first, and thus also also outgoing first. In some cases you want to reverse order, which is now possible. In Java DSL there is a {{reverse()}} method and in Spring XML there is an {{reverse=true}} attribute on the {{batch-config/}} you can use to enable it. h4. Resequence JMS messages based on JMSPriority *Available as of Camel 2.4* Its now much easier to use the [Resequencer] to resequence messages from [JMS] queues based on {{JMSPriority}}. For that to work you need to use the two new options {{allowDuplicates}} and {{reverse}}. {snippet:id=e1|lang=java|url="" Notice this is *only* possible in the {{batch}} mode of the [Resequencer]. h3. Stream Resequencing ... Full Content Resequencer The Resequencer from the EIP patterns allows you to reorganise messages based on some comparator. By default in Camel we use an _expression_ to create the comparator; so that you can compare by a message header or the body or a piece of a message etc. Camel supports two resequencing algorithms: Batch resequencing collects messages into a batch, sorts the messages and sends them to their output. Stream resequencing re-orders (continuous) message streams based on the detection of gaps between messages. By default the Resequencer does not support duplicate messages and will only keep the last message, in case a message arrives with the same message _expression_. However in the batch mode you can enable it to allow duplicates. Batch Resequencing The following example shows how to use the batch-processing resequencer so that messages are sorted in order of the body() _expression_. That is messages are collected into a batch (either by a maximum number of messages per batch or using a timeout) then they are sorted in order and then sent out to their output. Using the Fluent Builders from("direct:start").resequence(body()).to("mock:result"); This is equvalent to from("direct:start").resequence(body()).batch().to("mock:result"); The batch-processing resequencer can be further configured via the size() and timeout() methods. from("direct:start").resequence(body()).batch().size(300).timeout(4000L).to("mock:result") This sets the batch size to 300 and the batch timeout to 4000 ms (by default, the batch size is 100 and the timeout is 1000 ms). Alternatively, you can provide a configuration object. from("direct:start").resequence(body()).batch(new BatchResequencerConfig(300, 4000L)).to("mock:result") So the above example will reorder messages from endpoint direct:a in order of their bodies, to the endpoint mock:result. Typically you'd use a header rather than the body to order things; or maybe a part of the body. So you could replace this _expression_ with resequencer(header("mySeqNo")) for example to reorder messages using a custom sequence number in the header mySeqNo. You can of course use many different _expression_ languages such as XPath, XQuery, SQL or various Scripting Languages. You can also use multiple expressions; so you could for example sort by priority first then some other custom header resequence(header("mySeqNo"), header("MyCustomerRating")) Using the Spring XML Extensions camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" route from uri="direct:start" / resequence simplebody/simple to uri="mock:result" / !-- batch-config can be ommitted for default (batch) resequencer settings -- batch-config batchSize="300" batchTimeout="4000" / /resequence /route /camelContext Allow Duplicates Available as of Camel 2.4 In the batch mode, you can now allow duplicates. In Java DSL there is a allowDuplicates() method and in Spring XML there is an allowDuplicates=true attribute on the batch-config/ you
[CONF] Apache Camel Camel 2.4.0 Release
Camel 2.4.0 Release Page edited by Claus Ibsen Changes (1) ... * Fixed problem with using [Quartz] in OSGi and having Camel applications being hot-deployed which potentially could cause [Quartz] to stop scheduling in applications which havent been stopped. * The {{package}} scan when using Spring XML can now discover and use {{RouteBuilder}} classes which has been annotated with Springs {...@component}} * [Resequencer] in batch mode has two new options {{allowDuplicates}} and {{reverse}} which allows you to use it for re-ordering messages from [JMS] queues based on {{JMSPriority}} h3. New [Enterprise Integration Patterns] ... Full Content Camel 2.4.0 release (currently in progress) New and Noteworthy Welcome to the 2.4.0 release which approx XXX issues resolved (new features, improvements and bug fixes such as...) Added option useOriginalBody to OnCompletion Fixed issue when using mockito for testing when it uses CGLib proxies Fixed issue with @Consume not running in an unit of work to ensure callbacks is invoked when its done Routing Slip takes the _expression_ parameter as Recipient List does, and you can also The security context can be passed the camel-cxf to other camel components. ManagementAgent settings can now be set using setters from Java, instead of having to use JVM system properties. See tip in Camel JMX wiki page. Fixed problem with using Quartz in OSGi and having Camel applications being hot-deployed which potentially could cause Quartz to stop scheduling in applications which haven't been stopped. The package scan when using Spring XML can now discover and use RouteBuilder classes which has been annotated with Spring's @Component Resequencer in batch mode has two new options allowDuplicates and reverse which allows you to use it for re-ordering messages from JMS queues based on JMSPriority New Enterprise Integration Patterns New Components EJB to access EJB beans in a similar way as with the Bean component New DSL New Annotations @RoutingSlip New Data Formats New Languages New Examples New Tutorials API breaking Routing Slip now requires using _expression_ to specify the routing slip header, the XML DSL of Routing Slip is broken. route from uri="direct:a"/ !--NOTE from Camel 2.4.0, you need to specify the _expression_ element inside of the routingSlip element -- routingSlip ignoreInvalidEndpoints="true" headermyHeader/header /routingSlip /route Known Issues The Tracer may not output all details for some situations such as when using onCompletion or intercept etc. Not all Examples have ANT build.xml files to run the example using ANT. Important changes to consider when upgrading Getting the Distributions Binary Distributions Description Download Link PGP Signature file of download Windows Distribution apache-camel-2.4.0.zip apache-camel-2.4.0.zip.asc Unix/Linux/Cygwin Distribution apache-camel-2.4.0.tar.gz apache-camel-2.4.0.tar.gz.asc The above URLs use redirectionThe above URLs use the Apache Mirror system to redirect you to a suitable mirror for your download. Some users have experienced issues with some versions of browsers (e.g. some Safari browsers). If the download doesn't seem to work for you from the above URL then try using FireFox Source Distributions Description Download Link PGP Signature file of download Source for Windows apache-camel-2.4.0-src.zip apache-camel-2.4.0-src.zip.asc Source for Unix/Linux/Cygwin apache-camel-2.4.0-src.tar.gz apache-camel-2.4.0-src.tar.gz.asc Getting the Binaries using Maven 2 To use this release in your maven project, the proper dependency configuration that you should use in your Maven POM is: dependency groupIdorg.apache.camel/groupId artifactIdcamel-core/artifactId version2.4.0/version /dependency SVN Tag Checkout svn co http://svn.apache.org/repos/asf/camel/tags/camel-2.4.0 Changelog For a more detailed view of new features and bug fixes, see the: TODO: Fix for 2.4.0 release notes for 2.4.0 Change Notification Preferences View Online | View Changes | Add Comment
svn commit: r952103 - in /camel/trunk/components/camel-ftp/src: main/java/org/apache/camel/component/file/remote/ test/java/org/apache/camel/component/file/remote/
Author: davsclaus Date: Mon Jun 7 05:14:20 2010 New Revision: 952103 URL: http://svn.apache.org/viewvc?rev=952103view=rev Log: CAMEL-2774: Setting ftpClient.soTimeout now supported. Added: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java - copied, changed from r952085, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java?rev=952103r1=952102r2=952103view=diff == --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java Mon Jun 7 05:14:20 2010 @@ -36,6 +36,7 @@ public class FtpEndpointT extends FTPFi protected FTPClientConfig ftpClientConfig; protected MapString, Object ftpClientParameters; protected MapString, Object ftpClientConfigParameters; +protected int soTimeout; public FtpEndpoint() { } @@ -76,6 +77,11 @@ public class FtpEndpointT extends FTPFi } if (ftpClientParameters != null) { +// setting soTimeout has to be done later on FTPClient (after it has connected) +Object timeout = ftpClientParameters.remove(soTimeout); +if (timeout != null) { +soTimeout = getCamelContext().getTypeConverter().convertTo(int.class, timeout); +} IntrospectionSupport.setProperties(client, ftpClientParameters); } @@ -125,4 +131,15 @@ public class FtpEndpointT extends FTPFi void setFtpClientConfigParameters(MapString, Object ftpClientConfigParameters) { this.ftpClientConfigParameters = ftpClientConfigParameters; } + +public int getSoTimeout() { +return soTimeout; +} + +/** + * Sets the soTimeout option to be used by FTPClient. + */ +public void setSoTimeout(int soTimeout) { +this.soTimeout = soTimeout; +} } Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java?rev=952103r1=952102r2=952103view=diff == --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java Mon Jun 7 05:14:20 2010 @@ -130,6 +130,19 @@ public class FtpOperations implements Re client.enterLocalPassiveMode(); } +// must set soTimeout after connect +if (endpoint instanceof FtpEndpoint) { +FtpEndpoint ftpEndpoint = (FtpEndpoint) endpoint; +if (ftpEndpoint.getSoTimeout() 0) { +log.trace(Using SoTimeout= + ftpEndpoint.getSoTimeout()); +try { +client.setSoTimeout(ftpEndpoint.getSoTimeout()); +} catch (IOException e) { +throw new GenericFileOperationFailedException(client.getReplyCode(), client.getReplyString(), e.getMessage(), e); +} +} +} + try { boolean login; if (username != null) { Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java?rev=952103r1=952102r2=952103view=diff == --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java Mon Jun 7 05:14:20 2010 @@ -121,6 +121,11 @@ public class FtpsEndpoint extends FtpEnd } if (ftpClientParameters != null) { +// setting soTimeout has to be done later on FTPClient (after it has connected) +