View Javadoc

1   /*
2    * $Id: FtpMessageDispatcher.java 22160 2011-06-09 02:15:24Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // no op
41      }
42  
43      protected void doDispatch(MuleEvent event) throws Exception
44      {
45          Object data = event.getMessage().getPayload();
46          OutputStream out = connector.getOutputStream(getEndpoint(), 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          // template method
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              // pool may be closed
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 }