| /******************************************************************************* |
| * Copyright (c) 2001, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jem.internal.proxy.remote; |
| /* |
| * $RCSfile: REMThrowableBeanProxy.java,v $ |
| * $Revision: 1.12 $ $Date: 2005/08/24 20:39:06 $ |
| */ |
| |
| |
| import org.eclipse.jem.internal.proxy.core.*; |
| import org.eclipse.jem.internal.proxy.common.remote.*; |
| /** |
| * Exception Proxy for exception on Remote. |
| * NOTE: This one is unusual in that it doesn't inherit from |
| * IDEBeanProxy because it needs to be an exception, and |
| * exceptions are not an interface. |
| */ |
| public class REMThrowableBeanProxy extends ThrowableProxy implements IREMBeanProxy { |
| |
| /** |
| * Comment for <code>serialVersionUID</code> |
| * |
| * @since 1.1.0 |
| */ |
| private static final long serialVersionUID = 2076777336810215206L; |
| private Integer fID; |
| protected final REMProxyFactoryRegistry fFactory; |
| private IBeanTypeProxy fTypeProxy; |
| |
| /** |
| * Set the bean we are proxying. We are a proxy for a bean running on the remote VM. |
| */ |
| protected REMThrowableBeanProxy(REMProxyFactoryRegistry aRegistry, Integer anID, IBeanTypeProxy aType){ |
| fFactory = aRegistry; |
| fID = anID; |
| fTypeProxy = aType; |
| } |
| |
| /** |
| * equals: Equal if: |
| * 1) This proxy == (identity) to the other object |
| * 2) Else if other is an IBeanProxy and not a constant one, then if |
| * equals on the server. |
| * 3) If this is a constant proxy and the other is too or is a constant |
| * value (e.g. IStringBeanProxy.equals(String), then true if values are equals. |
| */ |
| public boolean equals(Object anObject) { |
| if (super.equals(anObject)) |
| return true; // Identity |
| if (anObject instanceof IBeanProxy && !(anObject instanceof IREMConstantBeanProxy) && fFactory.isValid() && ((IBeanProxy) anObject).getProxyFactoryRegistry() == fFactory) |
| try { |
| // The other is a bean proxy and is not a constant one, let the server do the check. |
| return ((IBooleanBeanProxy) REMStandardBeanProxyConstants.getConstants(fFactory).getObjectEquals().invoke(this, (IBeanProxy) anObject)).booleanValue(); |
| } catch (ThrowableProxy e) { |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jem.internal.proxy.core.IBeanProxy#sameAs(org.eclipse.jem.internal.proxy.core.IBeanProxy) |
| */ |
| public boolean sameAs(IBeanProxy aBeanProxy) { |
| return this == aBeanProxy; // We can be assured in Remote Proxy that identity of proxy and identity of object are the same. |
| } |
| |
| |
| /** |
| * Get ID. An internal method to be used only within the ProxyFactory family. |
| */ |
| public Integer getID() { |
| return fID; |
| } |
| |
| /** |
| * isValid - has this bean been released. |
| */ |
| public boolean isValid() { |
| return fID != null; |
| } |
| |
| /** |
| * release - The bean is being released. |
| */ |
| public void release() { |
| fID = null; |
| fTypeProxy = null; |
| } |
| |
| /** |
| * Return the registry this proxy was created with. |
| */ |
| public ProxyFactoryRegistry getProxyFactoryRegistry() { |
| return fFactory; |
| } |
| |
| /** |
| * Return the proxied class of the bean |
| * Creation date: (12/3/99 11:37:01 AM) |
| * @author: Joe Winchester |
| */ |
| public IBeanTypeProxy getTypeProxy() { |
| return fTypeProxy; |
| } |
| |
| /** |
| * Return the toString of the actual bean on the remote side. |
| */ |
| public String toBeanString() { |
| IStringBeanProxy string = (IStringBeanProxy) REMStandardBeanProxyConstants.getConstants(fFactory).getObjectToString().invokeCatchThrowableExceptions(this); |
| return (string != null) ? string.stringValue() : null; |
| } |
| |
| public String getProxyLocalizedMessage() { |
| IStringBeanProxy msg = (IStringBeanProxy) REMStandardBeanProxyConstants.getConstants(fFactory).getThrowableLocalizedMessage().invokeCatchThrowableExceptions(this); |
| return msg != null ? msg.stringValue() : null; |
| } |
| |
| public String getProxyMessage() { |
| IStringBeanProxy msg = (IStringBeanProxy) REMStandardBeanProxyConstants.getConstants(fFactory).getThrowableMessage().invokeCatchThrowableExceptions(this); |
| return msg != null ? msg.stringValue() : null; |
| } |
| |
| /** |
| * Temporary way to get the string value of the stacktrace. |
| */ |
| private String getProxyStackTrace() { |
| IMethodProxy tempGetStackTrace = fFactory.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.StackTraceUtility", "printStackTrace", new String[] {"java.lang.Throwable"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| IStringBeanProxy trace = (IStringBeanProxy) tempGetStackTrace.invokeCatchThrowableExceptions(null, this); |
| return trace != null ? trace.stringValue() : ""; //$NON-NLS-1$ |
| } |
| |
| public void printProxyStackTrace(java.io.PrintWriter writer) { |
| String trace = getProxyStackTrace(); |
| synchronized(writer) { |
| writer.print(trace); |
| } |
| } |
| |
| public void printProxyStackTrace(java.io.PrintStream stream) { |
| String trace = getProxyStackTrace(); |
| synchronized(stream) { |
| stream.print(trace); |
| } |
| |
| } |
| |
| public void printProxyStackTrace() { |
| String trace = getProxyStackTrace(); |
| synchronized(System.err) { |
| System.err.print(trace); |
| } |
| } |
| |
| |
| /** |
| * Below are the actual printStackTrace. They are set up to first call |
| * the proxy trace so that it can show where it occurred on the server, |
| * and then it will do a super to show where it occurred on this side. |
| */ |
| public void printStackTrace() { |
| synchronized (System.err) { |
| System.err.println(ProxyRemoteMessages.REMOTE_VM_TRACE_INFO_); |
| printProxyStackTrace(); |
| System.err.println(ProxyRemoteMessages.REMOTE_VM_LOCAL_TRACE_INFO_); |
| super.printStackTrace(); |
| } |
| } |
| |
| public void printStackTrace(java.io.PrintWriter s) { |
| synchronized (s) { |
| s.println(ProxyRemoteMessages.REMOTE_VM_TRACE_INFO_); |
| printProxyStackTrace(s); |
| s.println(ProxyRemoteMessages.REMOTE_VM_LOCAL_TRACE_INFO_); |
| super.printStackTrace(s); |
| } |
| } |
| |
| public void printStackTrace(java.io.PrintStream s) { |
| synchronized (s) { |
| s.println(ProxyRemoteMessages.REMOTE_VM_TRACE_INFO_); |
| printProxyStackTrace(s); |
| s.println(ProxyRemoteMessages.REMOTE_VM_LOCAL_TRACE_INFO_); |
| super.printStackTrace(s); |
| } |
| } |
| |
| /** |
| * Render the bean into value object. |
| */ |
| public void renderBean(Commands.ValueObject value) { |
| value.setObjectID(getID().intValue()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jem.internal.proxy.core.IProxy#isBeanProxy() |
| */ |
| public final boolean isBeanProxy() { |
| return true; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.jem.internal.proxy.core.IProxy#isExpressionProxy() |
| */ |
| public final boolean isExpressionProxy() { |
| return false; |
| } |
| } |