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