001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.invocation;
023:
024: import java.io.IOException;
025: import java.io.OutputStream;
026: import java.io.ObjectOutputStream;
027: import java.rmi.Remote;
028: import java.rmi.server.RemoteObject;
029: import java.rmi.server.RemoteStub;
030: import java.security.PrivilegedAction;
031: import java.security.AccessController;
032:
033: /**
034: * An ObjectOutputStream subclass used by the MarshalledValue class to
035: * ensure the classes and proxies are loaded using the thread context
036: * class loader. Currently this does not do anything as neither class or
037: * proxy annotations are used.
038: *
039: * @author Scott.Stark@jboss.org
040: * @version $Revision: 57209 $
041: */
042: public class MarshalledValueOutputStream extends ObjectOutputStream {
043: /** Creates a new instance of MarshalledValueOutputStream
044: If there is a security manager installed, this method requires a
045: SerializablePermission("enableSubstitution") permission to ensure it's
046: ok to enable the stream to do replacement of objects in the stream.
047: */
048: public MarshalledValueOutputStream(OutputStream os)
049: throws IOException {
050: super (os);
051: EnableReplaceObjectAction.enableReplaceObject(this );
052: }
053:
054: /**
055: * @throws IOException Any exception thrown by the underlying OutputStream.
056: */
057: protected void annotateClass(Class cl) throws IOException {
058: super .annotateClass(cl);
059: }
060:
061: /**
062: * @throws IOException Any exception thrown by the underlying OutputStream.
063: */
064: protected void annotateProxyClass(Class cl) throws IOException {
065: super .annotateProxyClass(cl);
066: }
067:
068: /** Override replaceObject to check for Remote objects that are
069: not RemoteStubs.
070: */
071: protected Object replaceObject(Object obj) throws IOException {
072: if ((obj instanceof Remote) && !(obj instanceof RemoteStub)) {
073: Remote remote = (Remote) obj;
074: try {
075: obj = RemoteObject.toStub(remote);
076: } catch (IOException ignore) {
077: // Let the Serialization layer try with the orignal obj
078: }
079: }
080: return obj;
081: }
082:
083: private static class EnableReplaceObjectAction implements
084: PrivilegedAction {
085: MarshalledValueOutputStream os;
086:
087: EnableReplaceObjectAction(MarshalledValueOutputStream os) {
088: this .os = os;
089: }
090:
091: public Object run() {
092: os.enableReplaceObject(true);
093: return null;
094: }
095:
096: static void enableReplaceObject(MarshalledValueOutputStream os) {
097: EnableReplaceObjectAction action = new EnableReplaceObjectAction(
098: os);
099: AccessController.doPrivileged(action);
100: }
101: }
102: }
|