• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  *   - Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  *
11  *   - Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  *   - Neither the name of Oracle nor the names of its
16  *     contributors may be used to endorse or promote products derived
17  *     from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 import java.io.IOException;
33 import java.lang.reflect.Field;
34 
35 /**
36  * The example illustrates how to use the default method for mixin.
37  * @see BuildType
38  * @see Debuggable
39  */
40 public class MixIn {
41 
42     /**
43      * Implement this interface for a class that must be in debug print
44      */
45     public interface Debuggable {
46 
47         /**
48          * Print the class name and all fields to a string. Uses reflection to
49          * obtain and access fields of this object.
50          *
51          * @return the string formatted like the following: <pre>
52          * State of the: &lt;Class Name&gt;
53          * &lt;member name&gt; : &lt;value&gt;
54          * ...
55          * </pre>
56          */
toDebugString()57         default String toDebugString() {
58             StringBuilder sb = new StringBuilder();
59             sb.append("State of the: ").append(
60                     this.getClass().getSimpleName()).append("\n");
61             for (Class cls = this.getClass();
62                     cls != null;
63                     cls = cls.getSuperclass()) {
64                 for (Field f : cls.getDeclaredFields()) {
65                     try {
66                         f.setAccessible(true);
67                         sb.append(f.getName()).append(" : ").
68                                 append(f.get(this)).append("\n");
69                     } catch (IllegalAccessException e) {
70                     }
71                 }
72             }
73             return sb.toString();
74         }
75     }
76 
77     /**
78      * Sample exception class to demonstrate mixin. This enum inherits the
79      * behavior of the {@link Debuggable}
80      */
81     public static enum BuildType implements Debuggable {
82 
83         BUILD(0, "-build"),
84         PLAN(0, "-plan"),
85         EXCLUDE(1, "-exclude"),
86         TOTAL(2, "-total");
87 
88         private final int compareOrder;
89         private final String pathSuffix;
90 
BuildType(int compareOrder, String pathSuffix)91         private BuildType(int compareOrder, String pathSuffix) {
92             this.compareOrder = compareOrder;
93             this.pathSuffix = pathSuffix;
94         }
95 
getCompareOrder()96         public int getCompareOrder() {
97             return compareOrder;
98         }
99 
getPathSuffix()100         public String getPathSuffix() {
101             return pathSuffix;
102         }
103     }
104 
105     /**
106      * Illustrate the behavior of the MixClass
107      *
108      * @param args command-line arguments
109      * @throws java.io.IOException internal demo error
110      */
main(final String[] args)111     public static void main(final String[] args) throws IOException {
112         System.out.println(BuildType.BUILD.toDebugString());
113     }
114 }
115