View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
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          // no op
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          // template method
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              // pool may be closed
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 }