001    /**
002     *
003     * Copyright 2003-2004 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.security.remoting.jmx;
019    
020    import java.io.IOException;
021    import java.io.ObjectInput;
022    import java.io.ObjectOutput;
023    import java.io.Externalizable;
024    import java.lang.reflect.Method;
025    import java.util.Map;
026    import java.util.HashMap;
027    import java.util.Iterator;
028    
029    import org.apache.geronimo.interceptor.Invocation;
030    import org.apache.geronimo.interceptor.InvocationKey;
031    
032    /**
033     * @version $Rev: 417891 $ $Date: 2006-06-28 15:45:07 -0700 (Wed, 28 Jun 2006) $
034     */
035    final public class SerializableInvocation implements Invocation, Externalizable {
036    
037        private Map data;
038        private Method method;
039        private Object args[];
040        private Object proxy;
041    
042        public SerializableInvocation() {
043            super();
044        }
045    
046        public SerializableInvocation(Method method, Object[] args, Object proxy) {
047            super();
048            this.method = method;
049            this.args = args;
050            this.proxy = proxy;
051        }
052    
053        public Object get(InvocationKey key) {
054            if(data==null) {
055                return null;
056            }
057            return data.get(key);
058        }
059    
060        public void put(InvocationKey key, Object value) {
061            if(data==null)
062                data = new HashMap();
063            data.put(key, value);
064        }
065    
066        public void writeExternal(ObjectOutput out) throws IOException {
067            if( data !=null ) {
068                Iterator iterator = data.keySet().iterator();
069                while(iterator.hasNext()) {
070                    InvocationKey key = (InvocationKey) iterator.next();
071                    if( key.isTransient() )
072                        continue; // don't serialize this item.
073                    Object value = data.get(key);
074                    out.writeObject(key);
075                    out.writeObject(value);
076                }
077            }
078            // write end of list terminator.
079            out.writeObject(null);
080            out.writeObject(args);
081            out.writeObject(new MarshalledMethod(method));
082        }
083    
084        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
085    
086            if( data!=null )
087                data.clear();
088    
089            InvocationKey key = (InvocationKey) in.readObject();
090            while( key!=null ) {
091                Object value = in.readObject();
092                put(key,value);
093                key = (InvocationKey) in.readObject();
094            }
095            args = (Object[]) in.readObject();
096            method = ((MarshalledMethod) in.readObject()).getMethod();
097        }
098    
099        public Method getMethod() {
100            return method;
101        }
102    
103        public Object[] getArgs() {
104            return args;
105        }
106    
107    }