Home | History | Annotate | Download | only in dtrace
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  *
     26  * ident	"%Z%%M%	%I%	%E% SMI"
     27  */
     28 package org.opensolaris.os.dtrace;
     29 
     30 import java.io.Serializable;
     31 import java.beans.*;
     32 
     33 /**
     34  * A record indicating that the DTrace {@code exit()} action is about to
     35  * stop the source {@link Consumer}.  The exit status is whatever value
     36  * was passed to the {@code exit()} action in the D program.
     37  * <p>
     38  * Immutable.  Supports persistence using {@link java.beans.XMLEncoder}.
     39  *
     40  * @author Tom Erickson
     41  */
     42 public final class ExitRecord implements Record, Serializable {
     43     static final long serialVersionUID = -2062716683135961493L;
     44 
     45     static {
     46 	try {
     47 	    BeanInfo info = Introspector.getBeanInfo(ExitRecord.class);
     48 	    PersistenceDelegate persistenceDelegate =
     49 		    new DefaultPersistenceDelegate(
     50 		    new String[] {"status"})
     51 	    {
     52 		/*
     53 		 * Need to prevent DefaultPersistenceDelegate from using
     54 		 * overridden equals() method, resulting in a
     55 		 * StackOverFlowError.  Revert to PersistenceDelegate
     56 		 * implementation.  See
     57 		 * http://forum.java.sun.com/thread.jspa?threadID=
     58 		 * 477019&tstart=135
     59 		 */
     60 		protected boolean
     61 		mutatesTo(Object oldInstance, Object newInstance)
     62 		{
     63 		    return (newInstance != null && oldInstance != null &&
     64 			    oldInstance.getClass() == newInstance.getClass());
     65 		}
     66 	    };
     67 	    BeanDescriptor d = info.getBeanDescriptor();
     68 	    d.setValue("persistenceDelegate", persistenceDelegate);
     69 	} catch (IntrospectionException e) {
     70 	    System.out.println(e);
     71 	}
     72     }
     73 
     74     /** @serial */
     75     private final int status;
     76 
     77     /**
     78      * Creates an exit record with the given status.
     79      *
     80      * @param exitStatus value passed to the D {@code exit()} action
     81      */
     82     public
     83     ExitRecord(int exitStatus)
     84     {
     85 	status = exitStatus;
     86     }
     87 
     88     /**
     89      * Gets the exit status of a DTrace {@link Consumer}.
     90      *
     91      * @return the value passed to the D {@code exit()} action
     92      */
     93     public int
     94     getStatus()
     95     {
     96 	return status;
     97     }
     98 
     99     /**
    100      * Compares the specified object with this {@code ExitRecord} for
    101      * equality. Returns {@code true} if and only if the specified
    102      * object is also an {@code ExitRecord} and both records have the
    103      * same status.
    104      *
    105      * @return {@code true} if and only if the specified object is also
    106      * an {@code ExitRecord} and both records have the same status
    107      */
    108     @Override
    109     public boolean
    110     equals(Object o)
    111     {
    112 	if (o instanceof ExitRecord) {
    113 	    ExitRecord r = (ExitRecord)o;
    114 	    return (status == r.status);
    115 	}
    116 	return false;
    117     }
    118 
    119     /**
    120      * Overridden to ensure that equal instances have equal hash codes.
    121      */
    122     @Override
    123     public int
    124     hashCode()
    125     {
    126 	return status;
    127     }
    128 
    129     /**
    130      * Gets a string representation of the exit status.
    131      *
    132      * @return the string form of {@link #getStatus()} returned by
    133      * {@link Integer#toString(int i)}
    134      */
    135     public String
    136     toString()
    137     {
    138 	return Integer.toString(status);
    139     }
    140 }
    141