File: InvocationMarshaller.java

package info (click to toggle)
jbossas4 4.2.3.GA-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 105,608 kB
  • ctags: 102,806
  • sloc: java: 648,234; xml: 198,129; jsp: 4,297; sh: 3,121; sql: 124; perl: 114; makefile: 25
file content (132 lines) | stat: -rw-r--r-- 5,168 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2006, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.invocation.unified.marshall;

import org.jboss.invocation.Invocation;
import org.jboss.invocation.MarshalledInvocation;
import org.jboss.logging.Logger;
import org.jboss.remoting.InvocationRequest;
import org.jboss.remoting.marshal.serializable.SerializableMarshaller;
import org.jboss.remoting.marshal.Marshaller;
import org.jboss.remoting.marshal.MarshallerDecorator;
import org.jboss.tm.TransactionPropagationContextFactory;
import org.jboss.tm.TransactionPropagationContextUtil;

import javax.transaction.SystemException;
import java.io.IOException;
import java.io.OutputStream;

/**
 * This marshaller is to be used in conjunction with the UnifiedInvoker and will
 * look for an InvocationRequest to be passed to it, which is specific to EJB
 * invocations.
 *
 * @author <a href="mailto:tom@jboss.org">Tom Elrod</a>
 */
public class InvocationMarshaller extends SerializableMarshaller implements MarshallerDecorator
{
   /** @since 4.2.0 */
   static final long serialVersionUID =  -2109634245396128775L;
   
   public final static String DATATYPE = "invocation";

   private static final Logger log = Logger.getLogger(InvocationMarshaller.class);

   /**
    * Marshaller will need to take the dataObject and convert
    * into primitive java data types and write to the
    * given output.  Will check to see if dataObject being passed is
    * an InvocationRequest, and if is, process it (including handling propagation of
    * transaction).  If is not an instance of InvocationRequest, will default back to
    * SerializableMarshaller for processing.
    *
    * @param dataObject Object to be writen to output
    * @param output     The data output to write the object
    *                   data to.
    */
   public void write(Object dataObject, OutputStream output) throws IOException
   {

       super.write(addDecoration(dataObject), output);
   }
   
   public void write(Object dataObject, OutputStream output, int version) throws IOException
   {

       super.write(addDecoration(dataObject), output);
   }

    public Object addDecoration(Object dataObject) throws IOException {
        if(dataObject instanceof InvocationRequest)
        {
           InvocationRequest remoteInv = (InvocationRequest) dataObject;

           if(remoteInv.getParameter() instanceof Invocation)
           {
              Invocation inv = (Invocation) remoteInv.getParameter();

              MarshalledInvocation marshInv = new MarshalledInvocation(inv);

              if(inv != null)
              {
                 // now that have invocation object related to ejb invocations,
                 // need to get the possible known payload objects and make sure
                 // they get serialized.

                 try
                 {
                    marshInv.setTransactionPropagationContext(getTransactionPropagationContext());
                 }
                 catch(SystemException e)
                 {
                    log.error("Error setting transaction propagation context.", e);
                    throw new IOException("Error setting transaction context.  Message: " + e.getMessage());
                 }

                 // reset the invocation parameter within remote invocation
                 remoteInv.setParameter(marshInv);
              }
              else
              {
                 //Should never get here, but will check anyways
                 log.error("Attempting to marshall Invocation but is null.  Can not proceed.");
                 throw new IOException("Can not process data object due to the InvocationRequest's parameter being null.");
              }

           }
        }
        return dataObject;
    }

    public Object getTransactionPropagationContext()
          throws SystemException
    {
       TransactionPropagationContextFactory tpcFactory = TransactionPropagationContextUtil.getTPCFactoryClientSide();
       return (tpcFactory == null) ? null : tpcFactory.getTransactionPropagationContext();
    }

   public Marshaller cloneMarshaller() throws CloneNotSupportedException
   {
      return new InvocationMarshaller();
   }

}