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