EMMA Coverage Report (generated Sun Aug 17 11:20:34 PDT 2014)
[all classes][net.digitaltsunami.tmeter.level]

COVERAGE SUMMARY FOR SOURCE FILE [CategoryTimerLevel.java]

nameclass, %method, %block, %line, %
CategoryTimerLevel.java100% (1/1)100% (7/7)94%  (117/125)93%  (30.8/33)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CategoryTimerLevel100% (1/1)100% (7/7)94%  (117/125)93%  (30.8/33)
hashCode (): int 100% (1/1)88%  (28/32)96%  (4.8/5)
equals (Object): boolean 100% (1/1)88%  (30/34)83%  (10/12)
CategoryTimerLevel (Enum): void 100% (1/1)100% (10/10)100% (4/4)
getGroup (): Object 100% (1/1)100% (3/3)100% (1/1)
getLevelType (): TimerLevelType 100% (1/1)100% (2/2)100% (1/1)
isEnabled (TimerLevel []): boolean 100% (1/1)100% (24/24)100% (4/4)
isEnabled (TimerLevel): boolean 100% (1/1)100% (20/20)100% (6/6)

1package net.digitaltsunami.tmeter.level;
2 
3import net.digitaltsunami.tmeter.TimeTracker;
4 
5/**
6 * {@link TimerLevel} representing a {@link TimerLevelType#CATEGORY} type backed
7 * by an enumeration. Timer levels of this type are toggles and will be active
8 * only on a match of the backing enumeration entry.
9 * <p>
10 * As an example, use of an enum of type SessionOps with values: LOGIN, LOGOUT,
11 * PROFILE. If a {@link CategoryTimerLevel} is created by using
12 * 
13 * <pre>
14 * <code>
15 *     enum SessionOps {LOGIN,LOGOUT,PROFILE;}
16 *     public static final TimerLevel LOGIN = new CategoryTimerLevel<SessionOps>(SessionOps.LOGIN);
17 *     public static final TimerLevel LOGOUT = new CategoryTimerLevel<SessionOps>(SessionOps.LOGOUT);
18 *     public static final TimerLevel PROFILE = new CategoryTimerLevel<SessionOps>(SessionOps.PROFILE);
19 * </code>
20 * </pre>
21 * 
22 * Usage:
23 * 
24 * <pre>
25 * <code>
26 *  TimeTracker.enableTimerLevel(LOGIN);
27 *  TimeTracker.startRecording(LOGIN, "InitialLogin");
28 * </code>
29 * </pre>
30 * 
31 * Another method is to create an enum that extends {@link TimerLevel} and uses
32 * this CategoryTimerLevel to provide the implementation.
33 * 
34 * <pre>
35 * <code>
36 *  public enum UserOps implements TimerLevel {
37 *      LOGIN(),
38 *      LOGOUT(),
39 *      PROFILE();
40 * 
41 *      CategoryTimerLevel<UserOps> timerLevel;
42 * 
43 *      UserOps() { timerLevel = new CategoryTimerLevel<UserOps>(this); }
44 *      public boolean isEnabled(TimerLevel level) { return timerLevel.isEnabled(level); }
45 *      public boolean isEnabled(TimerLevel... levels) { return timerLevel.isEnabled(levels); }
46 *      public TimerLevelType getLevelType() { return timerLevel.getLevelType(); }
47 *      public Object getGroup() { return timerLevel.getGroup(); }
48 *  }
49 * </code>
50 * </pre>
51 * 
52 * Usage:
53 * 
54 * <pre>
55 * <code>
56 *      TimeTracker.enableTimerLevel(UserOps.LOGIN);
57 *      TimeTracker.startRecording(UserOps.LOGIN, "InitialLogin");
58 * </code>
59 * </pre>
60 * 
61 * @author dhagberg
62 * 
63 */
64public class CategoryTimerLevel<E extends Enum<E>> implements TimerLevel {
65 
66    private final E level;
67    private Class<Enum<E>> enumClass;
68 
69    @SuppressWarnings("unchecked")
70    public CategoryTimerLevel(E level) {
71        this.level = level;
72        this.enumClass = (Class<Enum<E>>) level.getClass();
73    }
74 
75    @SuppressWarnings("unchecked")
76    @Override
77    public boolean isEnabled(TimerLevel oLevel) {
78        if (oLevel instanceof CategoryTimerLevel<?>) {
79            Enum<?> oLevelLevel = ((CategoryTimerLevel<?>) oLevel).level;
80            if (oLevelLevel.getClass() == this.enumClass) {
81                if (this.level == oLevelLevel) {
82                    return true;
83                }
84            }
85        }
86        return false;
87    }
88 
89    @Override
90    public boolean isEnabled(TimerLevel... oLevels) {
91        for (TimerLevel oLevel : oLevels) {
92            if (isEnabled(oLevel)) {
93                return true;
94            }
95        }
96        return false;
97    }
98 
99    @Override
100    public TimerLevelType getLevelType() {
101        return TimerLevelType.CATEGORY;
102    }
103 
104    @Override
105    public Object getGroup() {
106        return enumClass;
107    }
108 
109    /*
110     * (non-Javadoc)
111     * 
112     * @see java.lang.Object#hashCode()
113     */
114    @Override
115    public int hashCode() {
116        final int prime = 31;
117        int result = 1;
118        result = prime * result + ((enumClass == null) ? 0 : enumClass.hashCode());
119        result = prime * result + ((level == null) ? 0 : level.hashCode());
120        return result;
121    }
122 
123    /*
124     * (non-Javadoc)
125     * 
126     * @see java.lang.Object#equals(java.lang.Object)
127     */
128    @Override
129    public boolean equals(Object obj) {
130        if (this == obj) {
131            return true;
132        }
133        if (obj == null) {
134            return false;
135        }
136        if (!(obj instanceof CategoryTimerLevel)) {
137            return false;
138        }
139        @SuppressWarnings("unchecked")
140        CategoryTimerLevel<E> other = (CategoryTimerLevel<E>) obj;
141        if (!enumClass.equals(other.enumClass)) {
142            return false;
143        }
144        if (level != other.level) {
145            return false;
146        }
147        return true;
148    }
149 
150}

[all classes][net.digitaltsunami.tmeter.level]
EMMA 2.1.5320 (stable) (C) Vladimir Roubtsov