1
2
3
4
5
6
7 package org.mule.transport.ftp;
8
9 import org.mule.DefaultMuleMessage;
10 import org.mule.api.MuleEvent;
11 import org.mule.api.MuleMessage;
12 import org.mule.api.endpoint.EndpointURI;
13 import org.mule.api.endpoint.OutboundEndpoint;
14 import org.mule.api.retry.RetryContext;
15 import org.mule.transport.AbstractMessageDispatcher;
16 import org.mule.transport.NullPayload;
17
18 import java.io.InputStream;
19 import java.io.OutputStream;
20
21 import org.apache.commons.io.IOUtils;
22 import org.apache.commons.net.ftp.FTPClient;
23
24 public class FtpMessageDispatcher extends AbstractMessageDispatcher
25 {
26 protected final FtpConnector connector;
27
28 public FtpMessageDispatcher(OutboundEndpoint endpoint)
29 {
30 super(endpoint);
31 this.connector = (FtpConnector) endpoint.getConnector();
32 }
33
34 protected void doDispose()
35 {
36
37 }
38
39 protected void doDispatch(MuleEvent event) throws Exception
40 {
41 Object data = event.getMessage().getPayload();
42 OutputStream out = connector.getOutputStream((OutboundEndpoint) endpoint, event);
43
44 try
45 {
46 if (data instanceof InputStream)
47 {
48 InputStream is = ((InputStream) data);
49 IOUtils.copy(is, out);
50 is.close();
51 }
52 else
53 {
54 byte[] dataBytes;
55 if (data instanceof byte[])
56 {
57 dataBytes = (byte[]) data;
58 }
59 else
60 {
61 dataBytes = data.toString().getBytes(event.getEncoding());
62 }
63 IOUtils.write(dataBytes, out);
64 }
65 }
66 finally
67 {
68 out.close();
69 }
70 }
71
72 protected MuleMessage doSend(MuleEvent event) throws Exception
73 {
74 doDispatch(event);
75 return new DefaultMuleMessage(NullPayload.getInstance(), connector.getMuleContext());
76 }
77
78 protected void doConnect() throws Exception
79 {
80
81 }
82
83 protected void doDisconnect() throws Exception
84 {
85 try
86 {
87 EndpointURI uri = endpoint.getEndpointURI();
88 FTPClient client = connector.getFtp(uri);
89 connector.destroyFtp(uri, client);
90 }
91 catch (Exception e)
92 {
93
94 }
95 }
96
97 @Override
98 public RetryContext validateConnection(RetryContext retryContext)
99 {
100 FTPClient client = null;
101 try
102 {
103 client = connector.createFtpClient(endpoint);
104 client.sendNoOp();
105 client.logout();
106 client.disconnect();
107
108 retryContext.setOk();
109 }
110 catch (Exception ex)
111 {
112 retryContext.setFailed(ex);
113 }
114 finally
115 {
116 try
117 {
118 if (client != null)
119 {
120 connector.releaseFtp(endpoint.getEndpointURI(), client);
121 }
122 }
123 catch (Exception e)
124 {
125 if (logger.isDebugEnabled())
126 {
127 logger.debug("Failed to release ftp client " + client, e);
128 }
129
130 }
131 }
132
133 return retryContext;
134 }
135 }