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 /*
23e77b06d2Stomee  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24fb3fb4f3Stomee  * Use is subject to license terms.
25fb3fb4f3Stomee  */
26fb3fb4f3Stomee package org.opensolaris.os.dtrace;
27fb3fb4f3Stomee 
28fb3fb4f3Stomee import java.util.*;
29fb3fb4f3Stomee 
30fb3fb4f3Stomee /**
31fb3fb4f3Stomee  * Implementation detail used by {@link Consumer#getAggregate()}.
32fb3fb4f3Stomee  * Package level access.
33fb3fb4f3Stomee  */
34fb3fb4f3Stomee class AggregateSpec {
35fb3fb4f3Stomee     private Set <String> includedAggregationNames;
36fb3fb4f3Stomee     private Set <String> clearedAggregationNames;
37fb3fb4f3Stomee 
AggregateSpec()38fb3fb4f3Stomee     AggregateSpec()
39fb3fb4f3Stomee     {
40fb3fb4f3Stomee 	includedAggregationNames = new HashSet <String> ();
41fb3fb4f3Stomee 	clearedAggregationNames = new HashSet <String> ();
42fb3fb4f3Stomee     }
43fb3fb4f3Stomee 
44fb3fb4f3Stomee     public boolean
isIncludeByDefault()45fb3fb4f3Stomee     isIncludeByDefault()
46fb3fb4f3Stomee     {
47fb3fb4f3Stomee 	return (includedAggregationNames == null);
48fb3fb4f3Stomee     }
49fb3fb4f3Stomee 
50fb3fb4f3Stomee     public boolean
isClearByDefault()51fb3fb4f3Stomee     isClearByDefault()
52fb3fb4f3Stomee     {
53fb3fb4f3Stomee 	return (clearedAggregationNames == null);
54fb3fb4f3Stomee     }
55fb3fb4f3Stomee 
56fb3fb4f3Stomee     public void
setIncludeByDefault(boolean include)57fb3fb4f3Stomee     setIncludeByDefault(boolean include)
58fb3fb4f3Stomee     {
59fb3fb4f3Stomee 	if (include) {
60fb3fb4f3Stomee 	    includedAggregationNames = null;
61fb3fb4f3Stomee 	} else if (includedAggregationNames == null) {
62fb3fb4f3Stomee 	    includedAggregationNames = new HashSet <String> ();
63fb3fb4f3Stomee 	}
64fb3fb4f3Stomee     }
65fb3fb4f3Stomee 
66fb3fb4f3Stomee     public void
setClearByDefault(boolean clear)67fb3fb4f3Stomee     setClearByDefault(boolean clear)
68fb3fb4f3Stomee     {
69fb3fb4f3Stomee 	if (clear) {
70fb3fb4f3Stomee 	    clearedAggregationNames = null;
71fb3fb4f3Stomee 	} else if (clearedAggregationNames == null) {
72fb3fb4f3Stomee 	    clearedAggregationNames = new HashSet <String> ();
73fb3fb4f3Stomee 	}
74fb3fb4f3Stomee     }
75fb3fb4f3Stomee 
76fb3fb4f3Stomee     /**
77fb3fb4f3Stomee      * Specifies which aggregations to include in an aggregate snapshot.
78fb3fb4f3Stomee      * If none are specified, all aggregations are included.  A snapshot
79fb3fb4f3Stomee      * is read-consistent across all included aggregations.
80fb3fb4f3Stomee      *
81fb3fb4f3Stomee      * @see Consumer#getAggregate(AggregateSpec spec)
82fb3fb4f3Stomee      */
83fb3fb4f3Stomee     public void
addIncludedAggregationName(String name)84fb3fb4f3Stomee     addIncludedAggregationName(String name)
85fb3fb4f3Stomee     {
86fb3fb4f3Stomee 	if (includedAggregationNames == null) {
87fb3fb4f3Stomee 	    includedAggregationNames = new HashSet <String> ();
88fb3fb4f3Stomee 	}
89*3e359d9cSTom Erickson 	includedAggregationNames.add(
90*3e359d9cSTom Erickson 		Aggregate.filterUnnamedAggregationName(name));
91fb3fb4f3Stomee     }
92fb3fb4f3Stomee 
93fb3fb4f3Stomee     /**
94fb3fb4f3Stomee      * Specifies which aggregations to clear after snapping the
95fb3fb4f3Stomee      * aggregate.  If none are specified, no aggregations are cleared.
96fb3fb4f3Stomee      * <p>
97fb3fb4f3Stomee      * Aggregations are cleared immediately after they are snapped
98fb3fb4f3Stomee      * before any more data can be accumulated in order to prevent loss
99fb3fb4f3Stomee      * of data between snapshots.
100fb3fb4f3Stomee      *
101fb3fb4f3Stomee      * @see Consumer#getAggregate(AggregateSpec spec)
102fb3fb4f3Stomee      */
103fb3fb4f3Stomee     public void
addClearedAggregationName(String name)104fb3fb4f3Stomee     addClearedAggregationName(String name)
105fb3fb4f3Stomee     {
106fb3fb4f3Stomee 	if (clearedAggregationNames == null) {
107fb3fb4f3Stomee 	    clearedAggregationNames = new HashSet <String> ();
108fb3fb4f3Stomee 	}
109*3e359d9cSTom Erickson 	clearedAggregationNames.add(
110*3e359d9cSTom Erickson 		Aggregate.filterUnnamedAggregationName(name));
111fb3fb4f3Stomee     }
112fb3fb4f3Stomee 
113fb3fb4f3Stomee     public Set <String>
getIncludedAggregationNames()114fb3fb4f3Stomee     getIncludedAggregationNames()
115fb3fb4f3Stomee     {
116fb3fb4f3Stomee 	if (includedAggregationNames == null) {
117fb3fb4f3Stomee 	    return Collections. <String> emptySet();
118fb3fb4f3Stomee 	}
119e77b06d2Stomee 	return Collections. <String> unmodifiableSet(includedAggregationNames);
120fb3fb4f3Stomee     }
121fb3fb4f3Stomee 
122fb3fb4f3Stomee     public Set <String>
getClearedAggregationNames()123fb3fb4f3Stomee     getClearedAggregationNames()
124fb3fb4f3Stomee     {
125fb3fb4f3Stomee 	if (clearedAggregationNames == null) {
126fb3fb4f3Stomee 	    return Collections. <String> emptySet();
127fb3fb4f3Stomee 	}
128e77b06d2Stomee 	return Collections. <String> unmodifiableSet(clearedAggregationNames);
129fb3fb4f3Stomee     }
130fb3fb4f3Stomee 
131*3e359d9cSTom Erickson     // Called by native code
132fb3fb4f3Stomee     public boolean
isIncluded(String aggregationName)133fb3fb4f3Stomee     isIncluded(String aggregationName)
134fb3fb4f3Stomee     {
135fb3fb4f3Stomee 	return ((includedAggregationNames == null) ||
136*3e359d9cSTom Erickson 		includedAggregationNames.contains(
137*3e359d9cSTom Erickson 		Aggregate.filterUnnamedAggregationName(aggregationName)));
138fb3fb4f3Stomee     }
139fb3fb4f3Stomee 
140*3e359d9cSTom Erickson     // Called by native code
141fb3fb4f3Stomee     public boolean
isCleared(String aggregationName)142fb3fb4f3Stomee     isCleared(String aggregationName)
143fb3fb4f3Stomee     {
144fb3fb4f3Stomee 	return ((clearedAggregationNames == null) ||
145*3e359d9cSTom Erickson 		clearedAggregationNames.contains(
146*3e359d9cSTom Erickson 		Aggregate.filterUnnamedAggregationName(aggregationName)));
147fb3fb4f3Stomee     }
148fb3fb4f3Stomee 
149fb3fb4f3Stomee     public String
toString()150fb3fb4f3Stomee     toString()
151fb3fb4f3Stomee     {
1524ae67516Stomee 	StringBuilder buf = new StringBuilder();
153fb3fb4f3Stomee 	buf.append(AggregateSpec.class.getName());
154fb3fb4f3Stomee 	buf.append("[includedAggregationNames = ");
155fb3fb4f3Stomee 	buf.append(Arrays.toString(getIncludedAggregationNames().toArray()));
156fb3fb4f3Stomee 	buf.append(", clearedAggregationNames = ");
157fb3fb4f3Stomee 	buf.append(Arrays.toString(getClearedAggregationNames().toArray()));
158fb3fb4f3Stomee 	buf.append(", includeByDefault = ");
159fb3fb4f3Stomee 	buf.append(isIncludeByDefault());
160fb3fb4f3Stomee 	buf.append(", clearByDefault = ");
161fb3fb4f3Stomee 	buf.append(isClearByDefault());
162fb3fb4f3Stomee 	buf.append(']');
163fb3fb4f3Stomee 	return buf.toString();
164fb3fb4f3Stomee     }
165fb3fb4f3Stomee }
166