001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package org.apache.hadoop.record.compiler;
020    
021    import java.util.Map;
022    
023    import org.apache.hadoop.classification.InterfaceAudience;
024    import org.apache.hadoop.classification.InterfaceStability;
025    
026    
027    /**
028     * Abstract Base class for all types supported by Hadoop Record I/O.
029     * 
030     * @deprecated Replaced by <a href="https://hadoop.apache.org/avro/">Avro</a>.
031     */
032    @Deprecated
033    @InterfaceAudience.Public
034    @InterfaceStability.Stable
035    abstract public class JType {
036      
037      static String toCamelCase(String name) {
038        char firstChar = name.charAt(0);
039        if (Character.isLowerCase(firstChar)) {
040          return ""+Character.toUpperCase(firstChar) + name.substring(1);
041        }
042        return name;
043      }
044      
045      JavaType javaType;
046      CppType cppType;
047      CType cType;
048      
049      abstract class JavaType {
050        private String name;
051        private String methodSuffix;
052        private String wrapper;
053        private String typeIDByteString; // points to TypeID.RIOType 
054        
055        JavaType(String javaname,
056            String suffix,
057            String wrapper, 
058            String typeIDByteString) { 
059          this.name = javaname;
060          this.methodSuffix = suffix;
061          this.wrapper = wrapper;
062          this.typeIDByteString = typeIDByteString;
063        }
064    
065        void genDecl(CodeBuffer cb, String fname) {
066          cb.append("private "+name+" "+fname+";\n");
067        }
068        
069        void genStaticTypeInfo(CodeBuffer cb, String fname) {
070          cb.append(Consts.RTI_VAR + ".addField(\"" + fname + "\", " +
071              getTypeIDObjectString() + ");\n");
072        }
073        
074        abstract String getTypeIDObjectString();
075        
076        void genSetRTIFilter(CodeBuffer cb, Map<String, Integer> nestedStructMap) {
077          // do nothing by default
078          return;
079        }
080    
081        /*void genRtiFieldCondition(CodeBuffer cb, String fname, int ct) {
082          cb.append("if ((tInfo.fieldID.equals(\"" + fname + "\")) && (typeVal ==" +
083              " org.apache.hadoop.record.meta." + getTypeIDByteString() + ")) {\n");
084          cb.append("rtiFilterFields[i] = " + ct + ";\n");
085          cb.append("}\n");
086        }
087    
088        void genRtiNestedFieldCondition(CodeBuffer cb, String varName, int ct) {
089          cb.append("if (" + varName + ".getElementTypeID().getTypeVal() == " +
090              "org.apache.hadoop.record.meta." + getTypeIDByteString() + 
091              ") {\n");
092          cb.append("rtiFilterFields[i] = " + ct + ";\n");
093          cb.append("}\n");  
094        }*/
095    
096        void genConstructorParam(CodeBuffer cb, String fname) {
097          cb.append("final "+name+" "+fname);
098        }
099        
100        void genGetSet(CodeBuffer cb, String fname) {
101          cb.append("public "+name+" get"+toCamelCase(fname)+"() {\n");
102          cb.append("return "+fname+";\n");
103          cb.append("}\n");
104          cb.append("public void set"+toCamelCase(fname)+"(final "+name+" "+fname+") {\n");
105          cb.append("this."+fname+"="+fname+";\n");
106          cb.append("}\n");
107        }
108        
109        String getType() {
110          return name;
111        }
112        
113        String getWrapperType() {
114          return wrapper;
115        }
116        
117        String getMethodSuffix() {
118          return methodSuffix;
119        }
120        
121        String getTypeIDByteString() {
122          return typeIDByteString;
123        }
124        
125        void genWriteMethod(CodeBuffer cb, String fname, String tag) {
126          cb.append(Consts.RECORD_OUTPUT + ".write"+methodSuffix + 
127              "("+fname+",\""+tag+"\");\n");
128        }
129        
130        void genReadMethod(CodeBuffer cb, String fname, String tag, boolean decl) {
131          if (decl) {
132            cb.append(name+" "+fname+";\n");
133          }
134          cb.append(fname+"=" + Consts.RECORD_INPUT + ".read" + 
135              methodSuffix+"(\""+tag+"\");\n");
136        }
137        
138        void genCompareTo(CodeBuffer cb, String fname, String other) {
139          cb.append(Consts.RIO_PREFIX + "ret = ("+fname+" == "+other+")? 0 :(("+
140              fname+"<"+other+")?-1:1);\n");
141        }
142        
143        abstract void genCompareBytes(CodeBuffer cb);
144        
145        abstract void genSlurpBytes(CodeBuffer cb, String b, String s, String l);
146        
147        void genEquals(CodeBuffer cb, String fname, String peer) {
148          cb.append(Consts.RIO_PREFIX + "ret = ("+fname+"=="+peer+");\n");
149        }
150        
151        void genHashCode(CodeBuffer cb, String fname) {
152          cb.append(Consts.RIO_PREFIX + "ret = (int)"+fname+";\n");
153        }
154        
155        void genConstructorSet(CodeBuffer cb, String fname) {
156          cb.append("this."+fname+" = "+fname+";\n");
157        }
158        
159        void genClone(CodeBuffer cb, String fname) {
160          cb.append(Consts.RIO_PREFIX + "other."+fname+" = this."+fname+";\n");
161        }
162      }
163      
164      abstract class CppType {
165        private String name;
166        
167        CppType(String cppname) {
168          name = cppname;
169        }
170        
171        void genDecl(CodeBuffer cb, String fname) {
172          cb.append(name+" "+fname+";\n");
173        }
174        
175        void genStaticTypeInfo(CodeBuffer cb, String fname) {
176          cb.append("p->addField(new ::std::string(\"" + 
177              fname + "\"), " + getTypeIDObjectString() + ");\n");
178        }
179        
180        void genGetSet(CodeBuffer cb, String fname) {
181          cb.append("virtual "+name+" get"+toCamelCase(fname)+"() const {\n");
182          cb.append("return "+fname+";\n");
183          cb.append("}\n");
184          cb.append("virtual void set"+toCamelCase(fname)+"("+name+" m_) {\n");
185          cb.append(fname+"=m_;\n");
186          cb.append("}\n");
187        }
188        
189        abstract String getTypeIDObjectString();
190    
191        void genSetRTIFilter(CodeBuffer cb) {
192          // do nothing by default
193          return;
194        }
195    
196        String getType() {
197          return name;
198        }
199      }
200      
201      class CType {
202        
203      }
204      
205      abstract String getSignature();
206      
207      void setJavaType(JavaType jType) {
208        this.javaType = jType;
209      }
210      
211      JavaType getJavaType() {
212        return javaType;
213      }
214      
215      void setCppType(CppType cppType) {
216        this.cppType = cppType;
217      }
218      
219      CppType getCppType() {
220        return cppType;
221      }
222      
223      void setCType(CType cType) {
224        this.cType = cType;
225      }
226      
227      CType getCType() {
228        return cType;
229      }
230    }