1 /*
2  * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package build.tools.jdwpgen;
27 
28 import java.util.*;
29 import java.io.*;
30 
31 class AltNode extends AbstractGroupNode implements TypeNode {
32 
33     SelectNode select = null;
34 
constrain(Context ctx)35     void constrain(Context ctx) {
36         super.constrain(ctx);
37 
38         if (!(nameNode instanceof NameValueNode)) {
39             error("Alt name must have value: " + nameNode);
40         }
41         if (parent instanceof SelectNode) {
42             select = (SelectNode)parent;
43         } else {
44             error("Alt must be in Select");
45         }
46     }
47 
document(PrintWriter writer)48     void document(PrintWriter writer) {
49         docRowStart(writer);
50         writer.println("<td colspan=" +
51                        (maxStructIndent - structIndent + 1) + ">");
52         writer.println("Case " + nameNode.name + " - if <i>" +
53                        ((SelectNode)parent).typeNode.name +
54                        "</i> is " + nameNode.value() + ":");
55         writer.println("<td>" + comment() + "&nbsp;");
56         ++structIndent;
57         super.document(writer);
58         --structIndent;
59     }
60 
javaClassImplements()61     String javaClassImplements() {
62         return " extends " + select.commonBaseClass();
63     }
64 
genJavaClassSpecifics(PrintWriter writer, int depth)65     void genJavaClassSpecifics(PrintWriter writer, int depth) {
66         indent(writer, depth);
67         writer.print("static final " + select.typeNode.javaType());
68         writer.println(" ALT_ID = " + nameNode.value() + ";");
69         if (context.isWritingCommand()) {
70             genJavaCreateMethod(writer, depth);
71         } else {
72             indent(writer, depth);
73             writer.println(select.typeNode.javaParam() + "() {");
74             indent(writer, depth+1);
75             writer.println("return ALT_ID;");
76             indent(writer, depth);
77             writer.println("}");
78         }
79         super.genJavaClassSpecifics(writer, depth);
80     }
81 
genJavaWriteMethod(PrintWriter writer, int depth)82     void genJavaWriteMethod(PrintWriter writer, int depth) {
83         genJavaWriteMethod(writer, depth, "");
84     }
85 
genJavaReadsSelectCase(PrintWriter writer, int depth, String common)86     void genJavaReadsSelectCase(PrintWriter writer, int depth, String common) {
87         indent(writer, depth);
88         writer.println("case " + nameNode.value() + ":");
89         indent(writer, depth+1);
90         writer.println(common + " = new " + name + "(vm, ps);");
91         indent(writer, depth+1);
92         writer.println("break;");
93     }
94 
genJavaCreateMethod(PrintWriter writer, int depth)95     void genJavaCreateMethod(PrintWriter writer, int depth) {
96         indent(writer, depth);
97         writer.print("static " + select.name() + " create(");
98         writer.print(javaParams());
99         writer.println(") {");
100         indent(writer, depth+1);
101         writer.print("return new " + select.name() + "(");
102         writer.print("ALT_ID, new " + javaClassName() + "(");
103         for (Iterator<Node> it = components.iterator(); it.hasNext();) {
104             TypeNode tn = (TypeNode)it.next();
105             writer.print(tn.name());
106             if (it.hasNext()) {
107                 writer.print(", ");
108             }
109         }
110         writer.println("));");
111         indent(writer, depth);
112         writer.println("}");
113     }
114 
115 }
116