/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sun.jini.mahalo; import java.io.IOException; import java.rmi.*; /** * This class holds a <code>MarshalledObject</code> that can be stored * persistently. When you invoke <code>get</code>, the object is * deserialized, its value cached in this object, and then returned. * Subsequent calls to <code>get</code> return that value. This lets * you store the object and hold it around, waiting until it is * actually deserializable, since it may not be at any given time due * to various factors, such as the codebase being unavailable. * * @author Sun Microsystems, Inc. * */ public class StorableObject implements java.io.Serializable { /** * @serial */ private MarshalledObject bytes; // the serialized bytes private transient Object obj; // the cached object reference private static final boolean DEBUG = false; private static final long serialVersionUID = -3793675220968988873L; /** * Create a <code>StorableObject</code> that will hold <code>obj</code> * in a <code>MarshalledObject</code>. */ public StorableObject(Object obj) throws RemoteException { try { bytes = new MarshalledObject(obj); this.obj = obj; } catch (RemoteException e) { throw e; } catch (IOException e) { fatalError("can't encode object", e); } } /** * Return the <code>hashCode</code> of the <code>MarshalledObject</code>. */ public int hashCode() { return bytes.hashCode(); // value of obj.hashCode() } public boolean equals(Object that) { try { if (that instanceof StorableObject) return get().equals(((StorableObject) that).get()); else return get().equals(that); } catch (RemoteException e) { return false; //!! or should I just die? } } /** * Return the Remote reference. Deserialize the object if we don't * already have an actual reference in hand. * * @exception java.rmi.RemoteException * Problems re-establishing connection with remote object */ public Object get() throws RemoteException { try { if (obj == null) obj = bytes.get(); return obj; } catch (RemoteException e) { if (DEBUG) System.out.println("*****StorableObject:get:" + e.getMessage()); throw e; } catch (IOException e) { fatalError("can't decode object", e); } catch (ClassNotFoundException e) { fatalError("can't decode object", e); } fatalError("how did we get here?", null); return null; // not reached, but compiler doesn't know } /** * Unrecoverable error happened -- show it and give up the ghost. */ private static void fatalError(String msg, Throwable e) throws RemoteException { System.err.println(msg); if (e != null) e.printStackTrace(System.err); throw new RemoteException(msg, e); } }