1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 package org.apache.jute.compiler;
20 
21 /**
22  *
23  */
24 public class JMap extends JCompType {
25 
26     private static int level = 0;
27 
getLevel()28     private static String getLevel() {
29         return Integer.toString(level);
30     }
31 
incrLevel()32     private static void incrLevel() {
33         level++;
34     }
35 
decrLevel()36     private static void decrLevel() {
37         level--;
38     }
39 
getId(String id)40     private static String getId(String id) {
41         return id + getLevel();
42     }
43 
44     private JType mKey;
45     private JType mValue;
46 
47     /**
48      * Creates a new instance of JMap.
49      */
JMap(JType t1, JType t2)50     public JMap(JType t1, JType t2) {
51         super("#error", " ::std::map<" + t1.getCppType() + "," + t2.getCppType() + ">",
52                 "System.Collections.Generic.SortedDictionary<string, string>", "java.util.TreeMap", "Map", "System.Collections.Generic.SortedDictionary<string, string>", "java.util.TreeMap");
53         mKey = t1;
54         mValue = t2;
55     }
56 
getSignature()57     public String getSignature() {
58         return "{" + mKey.getSignature() + mValue.getSignature() + "}";
59     }
60 
genJavaCompareTo(String fname)61     public String genJavaCompareTo(String fname) {
62         return "    throw new UnsupportedOperationException(\"comparing "
63                 + fname + " is unimplemented\");\n";
64     }
65 
genJavaReadWrapper(String fname, String tag, boolean decl)66     public String genJavaReadWrapper(String fname, String tag, boolean decl) {
67         StringBuilder ret = new StringBuilder("");
68         if (decl) {
69             ret.append("    java.util.TreeMap " + fname + ";\n");
70         }
71         ret.append("    {\n");
72         incrLevel();
73         ret.append("      org.apache.jute.Index " + getId("midx") + " = a_.startMap(\"" + tag + "\");\n");
74         ret.append("      " + fname + "=new java.util.TreeMap();\n");
75         ret.append("      for (; !" + getId("midx") + ".done(); " + getId("midx") + ".incr()) {\n");
76         ret.append(mKey.genJavaReadWrapper(getId("k"), getId("k"), true));
77         ret.append(mValue.genJavaReadWrapper(getId("v"), getId("v"), true));
78         ret.append("        " + fname + ".put(" + getId("k") + "," + getId("v") + ");\n");
79         ret.append("      }\n");
80         ret.append("    a_.endMap(\"" + tag + "\");\n");
81         decrLevel();
82         ret.append("    }\n");
83         return ret.toString();
84     }
85 
genJavaReadMethod(String fname, String tag)86     public String genJavaReadMethod(String fname, String tag) {
87         return genJavaReadWrapper(fname, tag, false);
88     }
89 
genJavaWriteWrapper(String fname, String tag)90     public String genJavaWriteWrapper(String fname, String tag) {
91         StringBuilder ret = new StringBuilder("    {\n");
92         incrLevel();
93         ret.append("      a_.startMap(" + fname + ",\"" + tag + "\");\n");
94         ret.append("      java.util.Set " + getId("es") + " = " + fname + ".entrySet();\n");
95         ret.append("      for(java.util.Iterator " + getId("midx") + " = " + getId("es") + ".iterator(); " + getId("midx") + ".hasNext(); ) {\n");
96         ret.append("        java.util.Map.Entry " + getId("me") + " = (java.util.Map.Entry) " + getId("midx") + ".next();\n");
97         ret.append("        " + mKey.getJavaWrapperType() + " " + getId("k") + " = (" + mKey.getJavaWrapperType() + ") " + getId("me") + ".getKey();\n");
98         ret.append("        " + mValue.getJavaWrapperType() + " " + getId("v") + " = (" + mValue.getJavaWrapperType() + ") " + getId("me") + ".getValue();\n");
99         ret.append(mKey.genJavaWriteWrapper(getId("k"), getId("k")));
100         ret.append(mValue.genJavaWriteWrapper(getId("v"), getId("v")));
101         ret.append("      }\n");
102         ret.append("      a_.endMap(" + fname + ",\"" + tag + "\");\n");
103         ret.append("    }\n");
104         decrLevel();
105         return ret.toString();
106     }
107 
genJavaWriteMethod(String fname, String tag)108     public String genJavaWriteMethod(String fname, String tag) {
109         return genJavaWriteWrapper(fname, tag);
110     }
111 
genCsharpWriteWrapper(String fname, int tag)112     public String genCsharpWriteWrapper(String fname, int tag) {
113         StringBuilder ret = new StringBuilder("    {\n");
114         incrLevel();
115         ret.append("      a_.StartMap(" + fname + ",\"" + tag + "\");\n");
116         ret.append("      java.util.Set " + getId("es") + " = " + fname + ".entrySet();\n");
117         ret.append("      for(java.util.Iterator " + getId("midx") + " = " + getId("es") + ".iterator(); " + getId("midx") + ".hasNext(); ) {\n");
118         ret.append("        java.util.Map.Entry " + getId("me") + " = (java.util.Map.Entry) " + getId("midx") + ".next();\n");
119         ret.append("        " + mKey.getCsharpWrapperType() + " " + getId("k") + " = (" + mKey.getCsharpWrapperType() + ") " + getId("me") + ".getKey();\n");
120         ret.append("        " + mValue.getCsharpWrapperType() + " " + getId("v") + " = (" + mValue.getCsharpWrapperType() + ") " + getId("me") + ".getValue();\n");
121         ret.append(mKey.genCsharpWriteWrapper(getId("k"), getId("k")));
122         ret.append(mValue.genCsharpWriteWrapper(getId("v"), getId("v")));
123         ret.append("      }\n");
124         ret.append("      a_.EndMap(" + fname + ",\"" + tag + "\");\n");
125         ret.append("    }\n");
126         decrLevel();
127         return ret.toString();
128     }
129 
genCsharpWriteMethod(String fname, int tag)130     String genCsharpWriteMethod(String fname, int tag) {
131         return genCsharpWriteWrapper(fname, tag);
132     }
133 
genCsharpReadWrapper(String fname, int tag, boolean decl)134     public String genCsharpReadWrapper(String fname, int tag, boolean decl) {
135         StringBuilder ret = new StringBuilder("");
136         if (decl) {
137             ret.append("    System.Collections.SortedDictionary<string,string> " + capitalize(fname) + ";\n");
138         }
139         ret.append("    {\n");
140         incrLevel();
141         ret.append("      Org.Apache.Jute.IIndex " + getId("midx") + " = a_.StartMap(\"" + tag + "\");\n");
142         ret.append("      " + fname + "= new System.Collections.SortedDictionary<string,string>();\n");
143         ret.append("      for (; !" + getId("midx") + ".done(); " + getId("midx") + ".incr()) {\n");
144         ret.append(mKey.genCsharpReadWrapper(getId("k"), getId("k"), true));
145         ret.append(mValue.genCsharpReadWrapper(getId("v"), getId("v"), true));
146         ret.append("        " + fname + ".Add(" + getId("k") + "," + getId("v") + ");\n");
147         ret.append("      }\n");
148         ret.append("    a_.EndMap(\"" + tag + "\");\n");
149         decrLevel();
150         ret.append("    }\n");
151         return ret.toString();
152     }
153 
154 
genCsharpReadMethod(String fname, int tag)155     String genCsharpReadMethod(String fname, int tag) {
156         return genCsharpReadWrapper(fname, tag, false);
157     }
158 }
159