fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The contents of this file are subject to the terms of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Common Development and Distribution License (the "License").
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You may not use this file except in compliance with the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * or http://www.opensolaris.org/os/licensing.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * When distributing Covered Code, include this CDDL HEADER in each
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If applicable, add the following below this CDDL HEADER, with the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fields enclosed by brackets "[]" replaced with your own identifying
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * information: Portions Copyright [yyyy] [name of copyright owner]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER END
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
e77b06d21580f630e0a7c437495ab283d3672828tomee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * ident "%Z%%M% %I% %E% SMI"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeepackage org.opensolaris.os.dtrace;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeimport java.io.*;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeimport java.beans.*;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeimport java.util.*;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * A record generated by the DTrace {@code printa()} action. Lists the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregations passed to {@code printa()} and records the formatted
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * output associated with each {@link Tuple}. If multiple aggregations
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * were passed to the {@code printa()} action that generated this
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * record, then the DTrace library tabulates the output, using a default
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * format if no format string was specified. By default, the output
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * string associated with a given {@code Tuple} includes a value from
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * each aggregation, or zero wherever an aggregation has no value
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * associated with that {@code Tuple}. For example, the D statements
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <pre><code>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * &#64;a[123] = sum(1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * &#64;b[456] = sum(2);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * printa(&#64;a, &#64;b, &#64;c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * </code></pre>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * produce output for the tuples "123" and "456" similar to the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * following:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <pre><code>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * 123 1 0 0
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * 456 0 2 0
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * </code></pre>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The first column after the tuple contains values from {@code @a},
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * the next column contains values from {@code @b}, and the last
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * column contains zeros because {@code @c} has neither a value
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * associated with "123" nor a value associated with "456".
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <p>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If a format string is passed to {@code printa()}, it may limit the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregation data available in this record. For example, if the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * format string specifies a value placeholder for only one of two
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregations passed to {@code printa()}, then the resulting {@code
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * PrintaRecord} will contain only one {@code Aggregation}. If no value
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * placeholder is specified, or if the aggregation tuple is not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * completely specified, the resulting {@code PrintaRecord} will contain
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * no aggregation data. However, the formatted output generated by the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * DTrace library is available in all cases. For details about
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * {@code printa()} format strings, see the <a
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidli3?a=view>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <b>{@code printa()}</b></a> section of the <b>Output
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Formatting</b> chapter of the <i>Solaris Dynamic Tracing Guide</i>.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <p>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Immutable. Supports persistence using {@link java.beans.XMLEncoder}.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @author Tom Erickson
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
e77b06d21580f630e0a7c437495ab283d3672828tomeepublic final class PrintaRecord implements Record, Serializable,
e77b06d21580f630e0a7c437495ab283d3672828tomee Comparable <PrintaRecord> {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee static final long serialVersionUID = -4174277639915895694L;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee static {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee try {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee BeanInfo info = Introspector.getBeanInfo(PrintaRecord.class);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee PersistenceDelegate persistenceDelegate =
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new DefaultPersistenceDelegate(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new String[] {"snaptime", "aggregations",
e77b06d21580f630e0a7c437495ab283d3672828tomee "formattedStrings", "tuples", "output"})
e77b06d21580f630e0a7c437495ab283d3672828tomee {
e77b06d21580f630e0a7c437495ab283d3672828tomee /*
e77b06d21580f630e0a7c437495ab283d3672828tomee * Need to prevent DefaultPersistenceDelegate from using
e77b06d21580f630e0a7c437495ab283d3672828tomee * overridden equals() method, resulting in a
e77b06d21580f630e0a7c437495ab283d3672828tomee * StackOverFlowError. Revert to PersistenceDelegate
e77b06d21580f630e0a7c437495ab283d3672828tomee * implementation. See
e77b06d21580f630e0a7c437495ab283d3672828tomee * http://forum.java.sun.com/thread.jspa?threadID=
e77b06d21580f630e0a7c437495ab283d3672828tomee * 477019&tstart=135
e77b06d21580f630e0a7c437495ab283d3672828tomee */
e77b06d21580f630e0a7c437495ab283d3672828tomee protected boolean
e77b06d21580f630e0a7c437495ab283d3672828tomee mutatesTo(Object oldInstance, Object newInstance)
e77b06d21580f630e0a7c437495ab283d3672828tomee {
e77b06d21580f630e0a7c437495ab283d3672828tomee return (newInstance != null && oldInstance != null &&
e77b06d21580f630e0a7c437495ab283d3672828tomee oldInstance.getClass() == newInstance.getClass());
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee };
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee BeanDescriptor d = info.getBeanDescriptor();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee d.setValue("persistenceDelegate", persistenceDelegate);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } catch (IntrospectionException e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee System.out.println(e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /** @serial */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private final long snaptime;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /** @serial */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private List <Aggregation> aggregations;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /** @serial */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private Map <Tuple, String> formattedStrings;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /** @serial */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private List <Tuple> tuples;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee private transient StringBuilder outputBuffer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private transient String output;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private transient boolean formatted;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Package level access, called by ProbeData.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee PrintaRecord(long snaptimeNanos, boolean isFormatString)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee snaptime = snaptimeNanos;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations = new ArrayList <Aggregation> ();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formattedStrings = new HashMap <Tuple, String> ();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples = new ArrayList <Tuple> ();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee outputBuffer = new StringBuilder();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formatted = isFormatString;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee validate();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Creates a record with the given snaptime, aggregations, and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * formatted output.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param snaptimeNanos nanosecond timestamp of the snapshot used
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to create this {@code printa()} record
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param aggs aggregations passed to the {@code printa()} action
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * that generated this record
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param formattedOutput the formatted output, if any, associated
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * with each {@code Tuple} occurring in the aggregations belonging
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to this record, one formatted string per {@code Tuple}, or an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * empty or {@code null} map if an incomplete {@code printa()}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * format string caused aggregation tuples to be omitted from this
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * record
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param orderedTuples list of aggregation tuples in the same order
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * generated by the native DTrace library (determined by the various
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * "aggsort" options such as {@link Option#aggsortkey})
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param formattedOutputString {@code printa()} formatted string
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * output in the same order generated by the native DTrace library
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * (determined by the various "aggsort" options such as
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * {@link Option#aggsortkey})
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @throws NullPointerException if the given collection of
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregations is {@code null}, or if the given ordered lists of
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * tuples or formatted strings are {@code null}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @throws IllegalArgumentException if the given snaptime is
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * negative
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee PrintaRecord(long snaptimeNanos, Collection <Aggregation> aggs,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee Map <Tuple, String> formattedOutput,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee List <Tuple> orderedTuples,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee String formattedOutputString)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee snaptime = snaptimeNanos;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (aggs != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations = new ArrayList <Aggregation> (aggs.size());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations.addAll(aggs);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedOutput != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formattedStrings = new HashMap <Tuple, String>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (formattedOutput);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (orderedTuples != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples = new ArrayList <Tuple> (orderedTuples.size());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples.addAll(orderedTuples);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee output = formattedOutputString;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee validate();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
91cfa10a8e55050a5103c4b2e83b0bf8d783a7cbtomee private final void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee validate()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (snaptime < 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new IllegalArgumentException("snaptime is negative");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (aggregations == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new NullPointerException("aggregations list is null");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee Aggregation a;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (int i = 0, len = aggregations.size(); i < len; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee a = aggregations.get(i);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (a == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new NullPointerException(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "null aggregation at index " + i);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (tuples == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new NullPointerException("ordered tuple list is null");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (output == null && outputBuffer == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new NullPointerException("formatted output is null");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets the nanosecond timestamp of the aggregate snapshot used to
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * create this {@code printa()} record.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return nanosecond timestamp
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public long
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getSnaptime()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return snaptime;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private Aggregation
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getAggregationImpl(String name)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (name == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return null;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (Aggregation a : aggregations) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (name.equals(a.getName())) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return a;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return null;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets the named aggregation.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return the named aggregation passed to {@code printa()}, or
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * {@code null} if the named aggregation is not passed to {@code
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * printa()}, or if it is omitted due to an incomplete {@code
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * printa()} format string, or if it is empty (a future release of
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * this API may represent an empty DTrace aggregation as a non-null
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * {@code Aggregation} with no records; users of this API should not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * rely on a non-null return value to indicate a non-zero record
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * count)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public Aggregation
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getAggregation(String name)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee name = Aggregate.filterUnnamedAggregationName(name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return getAggregationImpl(name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets a list of the aggregations passed to the {@code printa()}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * action that generated this record. The returned list is a copy,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and modifying it has no effect on this record. Supports XML
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * persistence.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return non-null, possibly empty list of aggregations belonging
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to this record (empty aggregations are excluded)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public List <Aggregation>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getAggregations()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return new ArrayList <Aggregation> (aggregations);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets the formatted string, if any, associated with the given
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregation tuple.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @param key aggregation tuple
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return the formatted string associated with the given
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregation tuple, or {@code null} if the given tuple does not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * exist in the aggregations belonging to this record or if it
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * is omitted from this record due to an incomplete {@code printa()}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * format string
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @see #getFormattedStrings()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @see #getOutput()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public String
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getFormattedString(Tuple key)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedStrings == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return null;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return formattedStrings.get(key);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets the formatted output, if any, associated with each {@code
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Tuple} occurring in the aggregations belonging to this record,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * one formatted string per {@code Tuple}. Gets an empty map if
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregation tuples are omitted from this record due to an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * incomplete {@code printa()} format string. The returned map is a
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * copy and modifying it has no effect on this record. Supports XML
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * persistence.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return a map of aggregation tuples and their associated
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * formatted output strings, empty if aggregation tuples are omitted
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * from this record due to an incomplete {@code printa(}) format
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * string
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @see #getFormattedString(Tuple key)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @see #getOutput()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public Map <Tuple, String>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getFormattedStrings()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedStrings == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return new HashMap <Tuple, String> ();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return new HashMap <Tuple, String> (formattedStrings);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets an ordered list of this record's aggregation tuples. The
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * returned list is a copy, and modifying it has no effect on this
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * record. Supports XML persistence.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return a non-null list of this record's aggregation tuples in
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * the order they were generated by the native DTrace library, as
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * determined by the {@link Option#aggsortkey}, {@link
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Option#aggsortrev}, {@link Option#aggsortpos}, and {@link
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Option#aggsortkeypos} options
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public List <Tuple>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getTuples()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return new ArrayList <Tuple> (tuples);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets this record's formatted output. Supports XML persistence.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @return non-null formatted output in the order generated by the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * native DTrace library, as determined by the {@link
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Option#aggsortkey}, {@link Option#aggsortrev}, {@link
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Option#aggsortpos}, and {@link Option#aggsortkeypos} options
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public String
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee getOutput()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (output == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee output = outputBuffer.toString();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee outputBuffer = null;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((output.length() == 0) && !formatted) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee output = "\n";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return output;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Package level access, called by ProbeData.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @throws NullPointerException if aggregationName is null
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @throws IllegalStateException if this PrintaRecord has an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * aggregation matching the given name and it already has an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * AggregationRecord with the same tuple key as the given record.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addRecord(String aggregationName, long aggid, AggregationRecord record)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedStrings == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // printa() format string does not completely specify tuple
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregationName = Aggregate.filterUnnamedAggregationName(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregationName);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee Aggregation aggregation = getAggregationImpl(aggregationName);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (aggregation == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregation = new Aggregation(aggregationName, aggid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations.add(aggregation);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee try {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregation.addRecord(record);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } catch (IllegalArgumentException e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee Map <Tuple, AggregationRecord> map = aggregation.asMap();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee AggregationRecord r = map.get(record.getTuple());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee //
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // The printa() format string may specify the value of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // aggregating action multiple times. While that changes
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // the resulting formatted string associated with the tuple,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // we ignore the attempt to add the redundant record to the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // aggregation.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee //
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!r.equals(record)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw e;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee //
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // Called from native code when the tuple is not completely
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // specified in the printa() format string.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee //
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee invalidate()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formattedStrings = null;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations.clear();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples.clear();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addFormattedString(Tuple tuple, String formattedString)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (tuple != null && formattedStrings != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedStrings.containsKey(tuple)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throw new IllegalArgumentException("A formatted string " +
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "for tuple " + tuple + " already exists.");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formattedStrings.put(tuple, formattedString);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples.add(tuple);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee outputBuffer.append(formattedString);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee /**
e77b06d21580f630e0a7c437495ab283d3672828tomee * Compares the specified object with this {@code PrintaRecord} for
e77b06d21580f630e0a7c437495ab283d3672828tomee * equality. Returns {@code true} if and only if the specified
e77b06d21580f630e0a7c437495ab283d3672828tomee * object is also a {@code PrintaRecord} and both records have the
e77b06d21580f630e0a7c437495ab283d3672828tomee * same aggregations and the same formatted strings in the same
e77b06d21580f630e0a7c437495ab283d3672828tomee * order (by aggregation tuple).
e77b06d21580f630e0a7c437495ab283d3672828tomee *
e77b06d21580f630e0a7c437495ab283d3672828tomee * @return {@code true} if and only if the specified object is also
e77b06d21580f630e0a7c437495ab283d3672828tomee * a {@code PrintaRecord} and both records have the same
e77b06d21580f630e0a7c437495ab283d3672828tomee * aggregations and the same formatted strings in the same order (by
e77b06d21580f630e0a7c437495ab283d3672828tomee * aggregation tuple)
e77b06d21580f630e0a7c437495ab283d3672828tomee */
e77b06d21580f630e0a7c437495ab283d3672828tomee @Override
e77b06d21580f630e0a7c437495ab283d3672828tomee public boolean
e77b06d21580f630e0a7c437495ab283d3672828tomee equals(Object o)
e77b06d21580f630e0a7c437495ab283d3672828tomee {
e77b06d21580f630e0a7c437495ab283d3672828tomee if (o instanceof PrintaRecord) {
e77b06d21580f630e0a7c437495ab283d3672828tomee PrintaRecord r = (PrintaRecord)o;
e77b06d21580f630e0a7c437495ab283d3672828tomee return (aggregations.equals(r.aggregations) &&
e77b06d21580f630e0a7c437495ab283d3672828tomee ((formattedStrings == null || formattedStrings.isEmpty())
e77b06d21580f630e0a7c437495ab283d3672828tomee ? (r.formattedStrings == null ||
e77b06d21580f630e0a7c437495ab283d3672828tomee r.formattedStrings.isEmpty())
e77b06d21580f630e0a7c437495ab283d3672828tomee : formattedStrings.equals(r.formattedStrings)) &&
e77b06d21580f630e0a7c437495ab283d3672828tomee tuples.equals(r.tuples));
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee return false;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee /**
e77b06d21580f630e0a7c437495ab283d3672828tomee * Overridden to ensure that equal instances have equal hash codes.
e77b06d21580f630e0a7c437495ab283d3672828tomee */
e77b06d21580f630e0a7c437495ab283d3672828tomee @Override
e77b06d21580f630e0a7c437495ab283d3672828tomee public int
e77b06d21580f630e0a7c437495ab283d3672828tomee hashCode()
e77b06d21580f630e0a7c437495ab283d3672828tomee {
e77b06d21580f630e0a7c437495ab283d3672828tomee int hash = 17;
e77b06d21580f630e0a7c437495ab283d3672828tomee hash = (hash * 37) + aggregations.hashCode();
e77b06d21580f630e0a7c437495ab283d3672828tomee hash = (hash * 37) + ((formattedStrings == null ||
e77b06d21580f630e0a7c437495ab283d3672828tomee formattedStrings.isEmpty()) ? 0 :
e77b06d21580f630e0a7c437495ab283d3672828tomee formattedStrings.hashCode());
e77b06d21580f630e0a7c437495ab283d3672828tomee hash = (hash * 37) + tuples.hashCode();
e77b06d21580f630e0a7c437495ab283d3672828tomee return hash;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee /**
e77b06d21580f630e0a7c437495ab283d3672828tomee * Compares the formatted {@link #getOutput() output} of this record
e77b06d21580f630e0a7c437495ab283d3672828tomee * with that of the given record. Note that ordering {@code printa}
e77b06d21580f630e0a7c437495ab283d3672828tomee * records by their output string values is incompatible with {@link
e77b06d21580f630e0a7c437495ab283d3672828tomee * #equals(Object o) equals()}, which also checks the underlying
e77b06d21580f630e0a7c437495ab283d3672828tomee * aggregation data for equality.
e77b06d21580f630e0a7c437495ab283d3672828tomee *
e77b06d21580f630e0a7c437495ab283d3672828tomee * @return a negative number, 0, or a positive number as this
e77b06d21580f630e0a7c437495ab283d3672828tomee * record's formatted output is lexicographically less than, equal
e77b06d21580f630e0a7c437495ab283d3672828tomee * to, or greater than the given record's formatted output
e77b06d21580f630e0a7c437495ab283d3672828tomee */
e77b06d21580f630e0a7c437495ab283d3672828tomee public int
e77b06d21580f630e0a7c437495ab283d3672828tomee compareTo(PrintaRecord r)
e77b06d21580f630e0a7c437495ab283d3672828tomee {
e77b06d21580f630e0a7c437495ab283d3672828tomee return getOutput().compareTo(r.getOutput());
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Serialize this {@code PrintaRecord} instance.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * @serialData Serialized fields are emitted, followed by the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * formatted output string.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee writeObject(ObjectOutputStream s) throws IOException
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s.defaultWriteObject();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (output == null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s.writeObject(outputBuffer.toString());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s.writeObject(output);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee private void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee readObject(ObjectInputStream s)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee throws IOException, ClassNotFoundException
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s.defaultReadObject();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee output = (String)s.readObject();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // make defensive copy
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (aggregations != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee List <Aggregation> copy = new ArrayList <Aggregation>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (aggregations.size());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee copy.addAll(aggregations);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregations = copy;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (formattedStrings != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee formattedStrings = new HashMap <Tuple, String> (formattedStrings);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (tuples != null) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee List <Tuple> copy = new ArrayList <Tuple> (tuples.size());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee copy.addAll(tuples);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee tuples = copy;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee // check constructor invariants only after defensize copy
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee try {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee validate();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } catch (Exception e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee InvalidObjectException x = new InvalidObjectException(
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee e.getMessage());
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee x.initCause(e);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee throw x;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /**
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets a string representation of this instance useful for logging
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and not intended for display. The exact details of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * representation are unspecified and subject to change, but the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * following format may be regarded as typical:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * <pre><code>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * class-name[property1 = value1, property2 = value2]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * </code></pre>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee public String
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee toString()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee StringBuilder buf = new StringBuilder();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(PrintaRecord.class.getName());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append("[snaptime = ");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(snaptime);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(", aggregations = ");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(aggregations);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(", formattedStrings = ");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(formattedStrings);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(", tuples = ");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(tuples);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(", output = ");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(getOutput());
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf.append(']');
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return buf.toString();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}