1fb3fb4f3Stomee /*
2fb3fb4f3Stomee  * CDDL HEADER START
3fb3fb4f3Stomee  *
4fb3fb4f3Stomee  * The contents of this file are subject to the terms of the
5fb3fb4f3Stomee  * Common Development and Distribution License (the "License").
6fb3fb4f3Stomee  * You may not use this file except in compliance with the License.
7fb3fb4f3Stomee  *
8fb3fb4f3Stomee  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fb3fb4f3Stomee  * or http://www.opensolaris.org/os/licensing.
10fb3fb4f3Stomee  * See the License for the specific language governing permissions
11fb3fb4f3Stomee  * and limitations under the License.
12fb3fb4f3Stomee  *
13fb3fb4f3Stomee  * When distributing Covered Code, include this CDDL HEADER in each
14fb3fb4f3Stomee  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fb3fb4f3Stomee  * If applicable, add the following below this CDDL HEADER, with the
16fb3fb4f3Stomee  * fields enclosed by brackets "[]" replaced with your own identifying
17fb3fb4f3Stomee  * information: Portions Copyright [yyyy] [name of copyright owner]
18fb3fb4f3Stomee  *
19fb3fb4f3Stomee  * CDDL HEADER END
20fb3fb4f3Stomee  */
21fb3fb4f3Stomee 
22fb3fb4f3Stomee /*
2391cfa10aStomee  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24fb3fb4f3Stomee  * Use is subject to license terms.
25fb3fb4f3Stomee  *
26fb3fb4f3Stomee  * ident	"%Z%%M%	%I%	%E% SMI"
27fb3fb4f3Stomee  */
28fb3fb4f3Stomee package org.opensolaris.os.dtrace;
29fb3fb4f3Stomee 
30fb3fb4f3Stomee import java.io.*;
31fb3fb4f3Stomee import java.beans.*;
32fb3fb4f3Stomee 
33fb3fb4f3Stomee /**
34fb3fb4f3Stomee  * A single stack frame in a {@link StackValueRecord}.
35fb3fb4f3Stomee  * <p>
36fb3fb4f3Stomee  * Immutable.  Supports persistence using {@link java.beans.XMLEncoder}.
37fb3fb4f3Stomee  *
38fb3fb4f3Stomee  * @author Tom Erickson
39fb3fb4f3Stomee  */
40fb3fb4f3Stomee public final class StackFrame implements Serializable {
41fb3fb4f3Stomee     static final long serialVersionUID = 8617210929132692711L;
42fb3fb4f3Stomee 
43fb3fb4f3Stomee     static {
44fb3fb4f3Stomee 	try {
45fb3fb4f3Stomee 	    BeanInfo info = Introspector.getBeanInfo(StackFrame.class);
46fb3fb4f3Stomee 	    PersistenceDelegate persistenceDelegate =
47fb3fb4f3Stomee 		    new DefaultPersistenceDelegate(
48fb3fb4f3Stomee 		    new String[] {"frame"})
49fb3fb4f3Stomee 	    {
50fb3fb4f3Stomee 		/*
51fb3fb4f3Stomee 		 * Need to prevent DefaultPersistenceDelegate from using
52fb3fb4f3Stomee 		 * overridden equals() method, resulting in a
53fb3fb4f3Stomee 		 * StackOverFlowError.  Revert to PersistenceDelegate
54fb3fb4f3Stomee 		 * implementation.  See
55fb3fb4f3Stomee 		 * http://forum.java.sun.com/thread.jspa?threadID=
56fb3fb4f3Stomee 		 * 477019&tstart=135
57fb3fb4f3Stomee 		 */
58fb3fb4f3Stomee 		protected boolean
59fb3fb4f3Stomee 		mutatesTo(Object oldInstance, Object newInstance)
60fb3fb4f3Stomee 		{
61fb3fb4f3Stomee 		    return (newInstance != null && oldInstance != null &&
62fb3fb4f3Stomee 			    oldInstance.getClass() == newInstance.getClass());
63fb3fb4f3Stomee 		}
64fb3fb4f3Stomee 	    };
65fb3fb4f3Stomee 	    BeanDescriptor d = info.getBeanDescriptor();
66fb3fb4f3Stomee 	    d.setValue("persistenceDelegate", persistenceDelegate);
67fb3fb4f3Stomee 	} catch (IntrospectionException e) {
68fb3fb4f3Stomee 	    System.out.println(e);
69fb3fb4f3Stomee 	}
70fb3fb4f3Stomee     }
71fb3fb4f3Stomee 
72fb3fb4f3Stomee     /** @serial */
73fb3fb4f3Stomee     private final String frame;
74fb3fb4f3Stomee 
75fb3fb4f3Stomee     /**
76fb3fb4f3Stomee      * Creates a single stack frame.  Supports XML persistence.
77fb3fb4f3Stomee      *
78fb3fb4f3Stomee      * @param f human-readable string representation of this stack frame
79fb3fb4f3Stomee      * @throws NullPointerException if the given string representation
80fb3fb4f3Stomee      * is {@code null}
81fb3fb4f3Stomee      */
82fb3fb4f3Stomee     public
StackFrame(String f)83fb3fb4f3Stomee     StackFrame(String f)
84fb3fb4f3Stomee     {
85fb3fb4f3Stomee 	frame = f;
86fb3fb4f3Stomee 	validate();
87fb3fb4f3Stomee     }
88fb3fb4f3Stomee 
8991cfa10aStomee     private final void
validate()90fb3fb4f3Stomee     validate()
91fb3fb4f3Stomee     {
92fb3fb4f3Stomee 	if (frame == null) {
93fb3fb4f3Stomee 	    throw new NullPointerException("frame is null");
94fb3fb4f3Stomee 	}
95fb3fb4f3Stomee     }
96fb3fb4f3Stomee 
97fb3fb4f3Stomee     /**
98fb3fb4f3Stomee      * Gets the human-readable string representation of this stack
99fb3fb4f3Stomee      * frame.  Supports XML persistence.
100fb3fb4f3Stomee      *
101fb3fb4f3Stomee      * @return the human-readable string representation of this stack frame.
102fb3fb4f3Stomee      */
103fb3fb4f3Stomee     public String
getFrame()104fb3fb4f3Stomee     getFrame()
105fb3fb4f3Stomee     {
106fb3fb4f3Stomee 	return frame;
107fb3fb4f3Stomee     }
108fb3fb4f3Stomee 
109fb3fb4f3Stomee     /**
110fb3fb4f3Stomee      * Compares the specified object with this {@code StackFrame} for
111fb3fb4f3Stomee      * equality.  Returns {@code true} if and only if the specified
112fb3fb4f3Stomee      * object is also a {@code StackFrame} and both instances have the
113fb3fb4f3Stomee      * same human-readable string representation.
114fb3fb4f3Stomee      *
115fb3fb4f3Stomee      * @return {@code true} if and only if the specified object is also
116fb3fb4f3Stomee      * a {@code StackFrame} and both instances have the same
117fb3fb4f3Stomee      * human-readable string representation
118fb3fb4f3Stomee      */
119fb3fb4f3Stomee     @Override
120fb3fb4f3Stomee     public boolean
equals(Object o)121fb3fb4f3Stomee     equals(Object o)
122fb3fb4f3Stomee     {
123fb3fb4f3Stomee 	if (o instanceof StackFrame) {
124fb3fb4f3Stomee 	    StackFrame s = (StackFrame)o;
125fb3fb4f3Stomee 	    return frame.equals(s.frame);
126fb3fb4f3Stomee 	}
127fb3fb4f3Stomee 	return false;
128fb3fb4f3Stomee     }
129fb3fb4f3Stomee 
130fb3fb4f3Stomee     /**
131fb3fb4f3Stomee      * Overridden to ensure that equal instances have equal hash codes.
132fb3fb4f3Stomee      */
133fb3fb4f3Stomee     @Override
134fb3fb4f3Stomee     public int
hashCode()135fb3fb4f3Stomee     hashCode()
136fb3fb4f3Stomee     {
137fb3fb4f3Stomee 	return frame.hashCode();
138fb3fb4f3Stomee     }
139fb3fb4f3Stomee 
140fb3fb4f3Stomee     private void
readObject(ObjectInputStream s)141fb3fb4f3Stomee     readObject(ObjectInputStream s)
142fb3fb4f3Stomee             throws IOException, ClassNotFoundException
143fb3fb4f3Stomee     {
144fb3fb4f3Stomee 	s.defaultReadObject();
145fb3fb4f3Stomee 	// check class invariants
146fb3fb4f3Stomee 	try {
147fb3fb4f3Stomee 	    validate();
148fb3fb4f3Stomee 	} catch (Exception e) {
149*4ae67516Stomee 	    InvalidObjectException x = new InvalidObjectException(
150*4ae67516Stomee 		    e.getMessage());
151*4ae67516Stomee 	    x.initCause(e);
152*4ae67516Stomee 	    throw x;
153fb3fb4f3Stomee 	}
154fb3fb4f3Stomee     }
155fb3fb4f3Stomee 
156fb3fb4f3Stomee     /**
157fb3fb4f3Stomee      * Gets the string representation of this stack frame, in this case
158fb3fb4f3Stomee      * the same value returned by {@link #getFrame()}.
159fb3fb4f3Stomee      */
160fb3fb4f3Stomee     public String
toString()161fb3fb4f3Stomee     toString()
162fb3fb4f3Stomee     {
163fb3fb4f3Stomee 	return frame;
164fb3fb4f3Stomee     }
165fb3fb4f3Stomee }
166