View Javadoc

1   /*
2    * $Id: StdioMessageDispatcher.java 20321 2010-11-24 15:21: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.stdio;
12  
13  import org.mule.api.MuleEvent;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.endpoint.OutboundEndpoint;
16  import org.mule.api.transport.DispatchException;
17  import org.mule.transport.AbstractMessageDispatcher;
18  import org.mule.transport.stdio.i18n.StdioMessages;
19  import org.mule.util.StringUtils;
20  
21  import java.io.OutputStream;
22  
23  /**
24   * <code>StdioMessageDispatcher</code> is a simple stream dispatcher that obtains
25   * a stream from the Stream Connector to write to. This is only really useful for
26   * testing purposes right now when writing to System.in and System.out. However, it
27   * is feasible to set any OutputStream on the Stream connector and have that written
28   * to.
29   */
30  
31  public class StdioMessageDispatcher extends AbstractMessageDispatcher
32  {
33      private final StdioConnector connector;
34  
35      public StdioMessageDispatcher(OutboundEndpoint endpoint)
36      {
37          super(endpoint);
38          this.connector = (StdioConnector) endpoint.getConnector();
39  
40          // apply connector-specific properties
41          if (connector instanceof PromptStdioConnector)
42          {
43              PromptStdioConnector ssc = (PromptStdioConnector)connector;
44  
45              String outputMessage = (String) endpoint.getProperties().get("outputMessage");
46              if (outputMessage != null)
47              {
48                  ssc.setOutputMessage(outputMessage);
49              }
50          }
51      }
52  
53      @Override
54      protected synchronized void doDispatch(MuleEvent event) throws Exception
55      {
56          OutputStream out = connector.getOutputStream();
57  
58          if (out == null)
59          {
60              throw new DispatchException(StdioMessages.couldNotFindStreamWithName(event.getEndpoint()), 
61                  event, (OutboundEndpoint) endpoint);
62          }
63  
64          if (connector instanceof PromptStdioConnector)
65          {
66              PromptStdioConnector ssc = (PromptStdioConnector)connector;
67              if (StringUtils.isNotBlank(ssc.getOutputMessage()))
68              {
69                  out.write(ssc.getOutputMessage().getBytes());
70              }
71          }
72  
73          Object data = event.getMessage().getPayload();
74          if (data instanceof byte[])
75          {
76              out.write((byte[])data);
77          }
78          else
79          {
80              out.write(data.toString().getBytes());
81          }
82  
83          out.flush();
84      }
85  
86      @Override
87      protected MuleMessage doSend(MuleEvent event) throws Exception
88      {
89          doDispatch(event);
90          return event.getMessage();
91      }
92  
93      @Override
94      protected void doDispose()
95      {
96          // template method
97      }
98  
99      @Override
100     protected void doConnect() throws Exception
101     {
102         // template method
103     }
104 
105     @Override
106     protected void doDisconnect() throws Exception
107     {
108         // template method
109     }
110 }