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