/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.commoncrawl.rpc.compiler;
import java.io.IOException;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonWriter;
/**
* Abstract Base class for all types supported by Hadoop Record I/O.
*/
abstract public class JType {
static String toCamelCase(String name) {
char firstChar = name.charAt(0);
if (Character.isLowerCase(firstChar)) {
return ""+Character.toUpperCase(firstChar) + name.substring(1);
}
return name;
}
JavaType javaType;
CppType cppType;
CType cType;
boolean isComparable() {
return false;
}
abstract class JavaType {
private String name;
private String methodSuffix;
private String wrapper;
JavaType(String javaname,
String suffix,
String wrapper) {
this.name = javaname;
this.methodSuffix = suffix;
this.wrapper = wrapper;
}
boolean isVariableBitRateEncoded() { return false; }
boolean isIntrinsicType() { return true; }
void genDecl(CodeBuffer cb, String fname) {
cb.append("private "+name+" "+fname+";\n");
}
void genConstructorParam(CodeBuffer cb, String fname) {
cb.append("final "+name+" "+fname);
}
void genJSON(CodeBuffer cb, String fname) throws IOException {
cb.append("writer.name(\""+fname+"\").value("+fname+");\n");
}
void genGetSet(CodeBuffer cb, String fname,boolean trackDirtyFields) {
cb.append("public "+name+" get"+toCamelCase(fname)+"() {\n");
cb.append("return "+fname+";\n");
cb.append("}\n");
cb.append("public void set"+toCamelCase(fname)+"( "+name+" "+fname+") {\n");
if (trackDirtyFields) {
cb.append("__validFields.set(Field_"+fname.toUpperCase()+");\n");
}
cb.append("this."+fname+"="+fname+";\n");
cb.append("}\n");
}
void genValidFieldCheck(CodeBuffer cb,String fieldName) {
cb.append("if (__validFields.get(Field_"+fieldName.toUpperCase()+"))");
}
/** does this type have an idependent dirty state - ignores validFields bit**/
boolean hasDirtyState() {
return false;
}
void genDirtyCheck(CodeBuffer cb,String fieldName) {
// NOOP IN BASE ...
}
String getType() {
return name;
}
String getWrapperType() {
return wrapper;
}
String getMethodSuffix() {
return methodSuffix;
}
void genClearMethod(CodeBuffer cb, String fname) {
((Integer)1).equals((Integer)2);
}
void genWriteMethod(CodeBuffer cb, String fname, String tag) {
if (!isVariableBitRateEncoded())
cb.append("encoder.write"+methodSuffix+"(output,"+fname+");\n");
else
cb.append("encoder.writeV"+methodSuffix+"(output,"+fname+");\n");
}
void genReadMethod(CodeBuffer cb, String fname, String tag, boolean decl) {
if (decl) {
cb.append(name+" "+fname+";\n");
}
if (!isVariableBitRateEncoded())
cb.append(fname+"=decoder.read"+methodSuffix+"(input);\n");
else
cb.append(fname+"=decoder.readV"+methodSuffix+"(input);\n");
}
void genSkipMethod(CodeBuffer cb) {
if (!isVariableBitRateEncoded())
cb.append("decoder.skip"+methodSuffix+"(input);\n");
else
cb.append("decoder.skipV"+methodSuffix+"(input);\n");
}
void genEquals(CodeBuffer cb, String fname, String peer) {
cb.append("ret = ("+fname+"=="+peer+");\n");
}
String genCompareTo(String fname,String peer,String objectType) {
return "(("+getWrapperType()+")"+fname+").compareTo(("+getWrapperType()+")(("+objectType+")"+peer+")."+fname+")";
}
String genGetKey(String fname) {
return "(("+getWrapperType()+")"+fname+").toString()";
}
void genHashCode(CodeBuffer cb, String fname) {
cb.append("result = MurmurHash.hashInt((int)"+fname+",result);\n");
}
void genConstructorSet(CodeBuffer cb, String fname) {
cb.append("this."+fname+" = "+fname+";\n");
}
void genClone(CodeBuffer cb,String type,String targetField, String sourceField) {
cb.append(targetField+ "= "+sourceField+";\n");
}
void genMerge(CodeBuffer cb,String type,String targetField, String sourceField) {
// default to clone implementation
this.genClone(cb, type, targetField, sourceField);
}
boolean isComparable() {
return JType.this.isComparable();
}
}
class CppType {
private String name;
private boolean variableEncoding =false;
CppType(String cppname) {
//TODO: FIX THIS !!! NEED TO REACT TO VARIABLE ENCODING FLAG
name = cppname;
}
void setVariableEncoding(boolean variableEncoding) {
this.variableEncoding = variableEncoding;
}
void genDecl(CodeBuffer cb, String fname) {
cb.append(name+" "+fname+";\n");
}
void genGetSet(CodeBuffer cb, String fname) {
cb.append("virtual "+name+" get"+toCamelCase(fname)+"() const {\n");
cb.append("return "+fname+";\n");
cb.append("}\n");
cb.append("virtual void set"+toCamelCase(fname)+"("+name+" m_) {\n");
cb.append(fname+"=m_;\n");
cb.append("}\n");
}
String getType() {
return name;
}
}
class CType {
}
abstract String getSignature();
void setJavaType(JavaType jType) {
this.javaType = jType;
}
JavaType getJavaType() {
return javaType;
}
void setCppType(CppType cppType) {
this.cppType = cppType;
}
CppType getCppType() {
return cppType;
}
void setCType(CType cType) {
this.cType = cType;
}
CType getCType() {
return cType;
}
}