Author: davsclaus
Date: Fri Jan 22 07:26:22 2010
New Revision: 902014
URL: http://svn.apache.org/viewvc?rev=902014&view=rev
Log:
CAMEL-2391: Added disconnect option to camel-ftp to disconecct from remote ftp
server right after use.
Added:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
(with props)
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java
(contents, props changed)
- copied, changed from r902008,
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConsumer.java
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java?rev=902014&r1=902013&r2=902014&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
Fri Jan 22 07:26:22 2010
@@ -101,6 +101,8 @@
Queue<Exchange> q = exchanges;
processBatch(CastUtils.cast(q));
+
+ postPollCheck();
}
public void setMaxMessagesPerPoll(int maxMessagesPerPoll) {
@@ -187,6 +189,14 @@
}
/**
+ * Override if required. Perform some checks (and perhaps actions) after we
+ * have polled.
+ */
+ protected void postPollCheck() {
+ // noop
+ }
+
+ /**
* Polls the given directory for files to process
*
* @param fileName current directory or file
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java?rev=902014&r1=902013&r2=902014&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
Fri Jan 22 07:26:22 2010
@@ -143,6 +143,8 @@
} catch (Exception e) {
handleFailedWrite(exchange, e);
}
+
+ postWriteCheck();
}
/**
@@ -160,6 +162,13 @@
// nothing needed to check
}
+ /**
+ * Perform any actions that need to occur after we are done such as
disconnecting.
+ */
+ protected void postWriteCheck() {
+ // nothing needed to check
+ }
+
protected void writeFile(Exchange exchange, String fileName) throws
GenericFileOperationFailedException {
InputStream payload = exchange.getIn().getBody(InputStream.class);
try {
Modified:
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConsumer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConsumer.java?rev=902014&r1=902013&r2=902014&view=diff
==============================================================================
---
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConsumer.java
(original)
+++
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConsumer.java
Fri Jan 22 07:26:22 2010
@@ -33,6 +33,12 @@
this.setPollStrategy(new RemoteFilePollingConsumerPollStrategy());
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public RemoteFileEndpoint<T> getEndpoint() {
+ return (RemoteFileEndpoint<T>) super.getEndpoint();
+ }
+
protected RemoteFileOperations getOperations() {
return (RemoteFileOperations) operations;
}
@@ -48,6 +54,16 @@
}
@Override
+ protected void postPollCheck() {
+ if (getEndpoint().isDisconnect()) {
+ if (log.isTraceEnabled()) {
+ log.trace("postPollCheck disconnect from: " + getEndpoint());
+ }
+ disconnect();
+ }
+ }
+
+ @Override
protected void doStop() throws Exception {
super.doStop();
disconnect();
Modified:
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java?rev=902014&r1=902013&r2=902014&view=diff
==============================================================================
---
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
(original)
+++
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
Fri Jan 22 07:26:22 2010
@@ -32,6 +32,7 @@
private int maximumReconnectAttempts = 3;
private long reconnectDelay = 1000;
+ private boolean disconnect;
public RemoteFileEndpoint() {
// no args constructor for spring bean endpoint configuration
@@ -143,4 +144,12 @@
public void setReconnectDelay(long reconnectDelay) {
this.reconnectDelay = reconnectDelay;
}
+
+ public boolean isDisconnect() {
+ return disconnect;
+ }
+
+ public void setDisconnect(boolean disconnect) {
+ this.disconnect = disconnect;
+ }
}
Modified:
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java?rev=902014&r1=902013&r2=902014&view=diff
==============================================================================
---
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
(original)
+++
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
Fri Jan 22 07:26:22 2010
@@ -16,8 +16,6 @@
*/
package org.apache.camel.component.file.remote;
-import java.io.IOException;
-
import org.apache.camel.Exchange;
import org.apache.camel.ServicePoolAware;
import org.apache.camel.component.file.GenericFileOperationFailedException;
@@ -57,6 +55,12 @@
return (RemoteFileOperations) operations;
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public RemoteFileEndpoint<T> getEndpoint() {
+ return (RemoteFileEndpoint<T>) super.getEndpoint();
+ }
+
/**
* The file could not be written. We need to disconnect from the remote
server.
*/
@@ -78,7 +82,7 @@
}
}
- public void disconnect() throws IOException {
+ public void disconnect() throws GenericFileOperationFailedException {
loggedIn = false;
if (getOperations().isConnected()) {
if (log.isDebugEnabled()) {
@@ -120,12 +124,27 @@
connectIfNecessary();
if (!loggedIn) {
// must be logged in to be able to upload the file
- String message = "Cannot connect/login to: " +
((RemoteFileEndpoint) getEndpoint()).remoteServerInformation();
+ String message = "Cannot connect/login to: " +
getEndpoint().remoteServerInformation();
throw new GenericFileOperationFailedException(message);
}
}
@Override
+ protected void postWriteCheck() {
+ try {
+ if (getEndpoint().isDisconnect()) {
+ if (log.isTraceEnabled()) {
+ log.trace("postWriteCheck disconnect from: " +
getEndpoint());
+ }
+ disconnect();
+ }
+ } catch (GenericFileOperationFailedException e) {
+ // ignore just log a warning
+ log.warn("Exception occurred during disconnecting from: " +
getEndpoint() + " " + e.getMessage());
+ }
+ }
+
+ @Override
protected void doStart() throws Exception {
log.debug("Starting");
// do not connect when component starts, just wait until we process as
we will
@@ -143,14 +162,13 @@
super.doStop();
}
- protected void connectIfNecessary() throws IOException {
+ protected void connectIfNecessary() throws
GenericFileOperationFailedException {
if (!loggedIn) {
if (log.isDebugEnabled()) {
log.debug("Not already connected/logged in. Connecting to: " +
getEndpoint());
}
- RemoteFileEndpoint rfe = (RemoteFileEndpoint) getEndpoint();
- RemoteFileConfiguration conf = (RemoteFileConfiguration)
rfe.getConfiguration();
- loggedIn = getOperations().connect(conf);
+ RemoteFileConfiguration config = (RemoteFileConfiguration)
getEndpoint().getConfiguration();
+ loggedIn = getOperations().connect(config);
if (!loggedIn) {
return;
}
@@ -162,4 +180,5 @@
// this producer is stateful because the remote file operations is not
thread safe
return false;
}
+
}
Added:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java?rev=902014&view=auto
==============================================================================
---
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
(added)
+++
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
Fri Jan 22 07:26:22 2010
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.camel.component.file.remote;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class FtpConsumerDisconnectTest extends FtpServerTestSupport {
+
+ private String getFtpUrl() {
+ return "ftp://ad...@localhost:" + getPort() +
"/done?password=admin&disconnect=true&delay=5000";
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ sendFile(getFtpUrl(), "Hello World", "claus.txt");
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from(getFtpUrl()).to("mock:result");
+ }
+ };
+ }
+
+ @Test
+ public void testDisconnectOnDone() throws Exception {
+ getMockEndpoint("mock:result").expectedMessageCount(1);
+ assertMockEndpointsSatisfied();
+
+ // give time for ftp consumer to disconnect
+ Thread.sleep(2000);
+ }
+
+}
\ No newline at end of file
Propchange:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDisconnectTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Copied:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java
(from r902008,
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java)
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java&r1=902008&r2=902014&rev=902014&view=diff
==============================================================================
---
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java
(original)
+++
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java
Fri Jan 22 07:26:22 2010
@@ -16,27 +16,17 @@
*/
package org.apache.camel.component.file.remote;
-import java.io.File;
-
-import org.apache.camel.converter.IOConverter;
import org.junit.Test;
-/**
- * Unit test to verify that Camel can build remote directory on FTP server if
missing (full or part of).
- */
-public class FtpProducerBuildDirectoryTest extends FtpServerTestSupport {
+public class FtpProducerDisconnectTest extends FtpServerTestSupport {
private String getFtpUrl() {
- return "ftp://ad...@localhost:" + getPort() +
"/upload/user/claus?binary=false&password=admin";
+ return "ftp://ad...@localhost:" + getPort() +
"/done?password=admin&disconnect=true";
}
@Test
- public void testProduceAndBuildFullRemotFolderTest() throws Exception {
+ public void testDisconnectOnDone() throws Exception {
sendFile(getFtpUrl(), "Hello World", "claus.txt");
-
- File file = new File(FTP_ROOT_DIR + "upload/user/claus/claus.txt");
- file = file.getAbsoluteFile();
- assertTrue("The uploaded file should exists", file.exists());
- assertEquals("Hello World", IOConverter.toString(file, null));
}
+
}
\ No newline at end of file
Propchange:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerDisconnectTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date