Function bodies 231 total
process method · java · L39-L69 (31 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(Table.class)) {
if (element.getKind() != ElementKind.CLASS) {
messager.printMessage(Diagnostic.Kind.ERROR,
"@Table can only be applied to classes", element);
continue;
}
TypeElement typeElement = (TypeElement) element;
// Validate
ValidatorPass validator = new ValidatorPass(messager, elements, types);
if (!validator.validate(typeElement)) {
continue; // Errors already reported
}
// Build IR
EntityModel model = buildEntityModel(typeElement, validator);
if (model == null) continue;
// Generate mapper
MapperGenerator generator = new MapperGenerator();
try {
generator.generate(model).writbuildEntityModel method · java · L71-L117 (47 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private EntityModel buildEntityModel(TypeElement typeElement, ValidatorPass validator) {
Table tableAnn = typeElement.getAnnotation(Table.class);
// Package and class names
String qualifiedName = typeElement.getQualifiedName().toString();
String packageName = elements.getPackageOf(typeElement).getQualifiedName().toString();
String className = typeElement.getSimpleName().toString();
// Families
Map<String, Integer> familiesAndVersions = new LinkedHashMap<>();
for (ColumnFamily cf : tableAnn.families()) {
familiesAndVersions.put(cf.name(), cf.versions());
}
// Row key codec flags
Map<String, String> rowKeyCodecFlags = new LinkedHashMap<>();
for (CodecFlag flag : tableAnn.rowKeyCodecFlags()) {
rowKeyCodecFlags.put(flag.name(), flag.value());
}
// Collect all fields
List<VariableElement> allFields = validator.collectFields(typeElement);
buildRowKeyModel method · java · L119-L159 (41 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private RowKeyModel buildRowKeyModel(List<VariableElement> allFields, TypeElement typeElement) {
VariableElement simpleRowKey = null;
List<RowKeyModel.Component> components = new ArrayList<>();
for (VariableElement field : allFields) {
RowKey rk = field.getAnnotation(RowKey.class);
RowKeyComponent rkc = field.getAnnotation(RowKeyComponent.class);
if (rk != null) {
simpleRowKey = field;
}
if (rkc != null) {
String fieldName = field.getSimpleName().toString();
components.add(new RowKeyModel.Component(
rkc.order(),
fieldName,
field.asType(),
rkc.delimiter(),
getterName(field),
setterName(field)
));
}
}
if (simpleRowKey != null) {
String fieldName = simpleRbuildColumnFieldModel method · java · L161-L180 (20 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private FieldModel buildColumnFieldModel(VariableElement field, Column col) {
String fieldName = field.getSimpleName().toString();
Map<String, String> flags = new LinkedHashMap<>();
for (CodecFlag f : col.codecFlags()) {
flags.put(f.name(), f.value());
}
return new FieldModel(
fieldName,
col.family(),
col.qualifier(),
field.asType(),
field.asType(), // valueType same as fieldType for single-version
false,
flags,
getterName(field),
setterName(field),
!field.getModifiers().contains(Modifier.PUBLIC)
);
}buildMultiVersionFieldModel method · java · L182-L204 (23 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private FieldModel buildMultiVersionFieldModel(VariableElement field, MultiVersion mv) {
String fieldName = field.getSimpleName().toString();
Map<String, String> flags = new LinkedHashMap<>();
for (CodecFlag f : mv.codecFlags()) {
flags.put(f.name(), f.value());
}
// Extract the value type T from NavigableMap<Long, T>
TypeMirror valueType = extractMultiVersionValueType(field.asType());
return new FieldModel(
fieldName,
mv.family(),
mv.qualifier(),
field.asType(),
valueType,
true,
flags,
getterName(field),
setterName(field),
!field.getModifiers().contains(Modifier.PUBLIC)
);
}extractMultiVersionValueType method · java · L206-L216 (11 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private TypeMirror extractMultiVersionValueType(TypeMirror type) {
if (type.getKind() == TypeKind.DECLARED) {
DeclaredType dt = (DeclaredType) type;
List<? extends TypeMirror> typeArgs = dt.getTypeArguments();
if (typeArgs.size() == 2) {
return typeArgs.get(1); // The T in NavigableMap<Long, T>
}
}
// Fallback
return elements.getTypeElement("java.lang.Object").asType();
}getterName method · java · L218-L237 (20 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private String getterName(VariableElement field) {
String name = field.getSimpleName().toString();
String capitalized = Character.toUpperCase(name.charAt(0)) + name.substring(1);
// Check if it's a boolean for "is" prefix
TypeMirror fieldType = field.asType();
if (fieldType.toString().equals("java.lang.Boolean")) {
// Check if isXxx method exists on the enclosing type
TypeElement enclosing = (TypeElement) field.getEnclosingElement();
for (Element member : elements.getAllMembers(enclosing)) {
if (member.getKind() == ElementKind.METHOD
&& member.getSimpleName().toString().equals("is" + capitalized)
&& ((ExecutableElement) member).getParameters().isEmpty()) {
return "is" + capitalized;
}
}
}
return "get" + capitalized;
}Repobility · code-quality intelligence · https://repobility.com
setterName method · java · L239-L242 (4 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/HBaseOrmProcessor.java
private String setterName(VariableElement field) {
String name = field.getSimpleName().toString();
return "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
}generate method · java · L23-L68 (46 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
public JavaFile generate(EntityModel model) {
TypeName rowKeyType = resolveRowKeyType(model);
TypeName entityType = ClassName.bestGuess(model.qualifiedName());
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(model.mapperClassName())
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addSuperinterface(ParameterizedTypeName.get(
ClassName.get(HBaseMapper.class), rowKeyType, entityType))
.addAnnotation(AnnotationSpec.builder(
ClassName.get("javax.annotation.processing", "Generated"))
.addMember("value", "$S", "io.github.dordor12.hbase.orm.processor.HBaseOrmProcessor")
.build());
// Add codec field
classBuilder.addField(FieldSpec.builder(ClassName.get(Codec.class), "codec",
Modifier.PRIVATE, Modifier.FINAL).build());
// Add static constant fields for family/qualifier bytes
addStaticConstants method · java · L72-L100 (29 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private void addStaticConstants(TypeSpec.Builder classBuilder, EntityModel model) {
// Table name constant
classBuilder.addField(FieldSpec.builder(String.class, "TABLE_NAME",
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$S", model.fullTableName())
.build());
// Family byte constants
Set<String> families = new LinkedHashSet<>();
for (FieldModel field : model.fields()) {
families.add(field.family());
}
for (String family : families) {
classBuilder.addField(FieldSpec.builder(byte[].class,
"FAMILY_" + family.toUpperCase(),
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$T.toBytes($S)", Bytes.class, family)
.build());
}
// Qualifier byte constants for each field
for (FieldModel field : model.fielgenerateWriteAsPut method · java · L104-L146 (43 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateWriteAsPut(EntityModel model, TypeName entityType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("writeAsPut")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(ClassName.get(Put.class))
.addParameter(entityType, "entity");
method.addStatement("byte[] rowKey = composeRowKey(entity)");
method.addStatement("$T put = new $T(rowKey)", Put.class, Put.class);
for (FieldModel field : model.fields()) {
String familyConst = "FAMILY_" + field.family().toUpperCase();
String qualConst = "QUAL_" + field.fieldName().toUpperCase();
String getter = "entity." + field.getterName() + "()";
if (field.multiVersioned()) {
// Multi-version: iterate NavigableMap<Long, T>
method.beginControlFlow("if ($L != null)", getter);
method.beginControlFlow("for ($T.EntgenerateReadFromResult method · java · L150-L206 (57 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateReadFromResult(EntityModel model, TypeName entityType, TypeName rowKeyType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("readFromResult")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(entityType)
.addParameter(ClassName.get(Result.class), "result");
method.addStatement("$T entity = new $T()", entityType, entityType);
// Parse row key
method.addStatement("parseRowKey(result.getRow(), entity)");
// Read each field
for (FieldModel field : model.fields()) {
String familyConst = "FAMILY_" + field.family().toUpperCase();
String qualConst = "QUAL_" + field.fieldName().toUpperCase();
String setter = "entity." + field.setterName();
if (field.multiVersioned()) {
// Multi-version: get all cells for this column
method.addStatement("$T<$T> generateWriteAsResult method · java · L210-L226 (17 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateWriteAsResult(EntityModel model, TypeName entityType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("writeAsResult")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(ClassName.get(Result.class))
.addParameter(entityType, "entity");
method.addStatement("$T put = writeAsPut(entity)", Put.class);
method.addStatement("$T<$T> cells = new $T<>()", List.class, Cell.class, ArrayList.class);
method.beginControlFlow("for ($T<$T> familyCells : put.getFamilyCellMap().values())",
List.class, Cell.class);
method.addStatement("cells.addAll(familyCells)");
method.endControlFlow();
method.addStatement("return $T.create(cells)", Result.class);
return method.build();
}generateReadFromPut method · java · L230-L282 (53 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateReadFromPut(EntityModel model, TypeName entityType, TypeName rowKeyType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("readFromPut")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(entityType)
.addParameter(ClassName.get(Put.class), "put");
method.addStatement("$T entity = new $T()", entityType, entityType);
method.addStatement("parseRowKey(put.getRow(), entity)");
for (FieldModel field : model.fields()) {
String familyConst = "FAMILY_" + field.family().toUpperCase();
String qualConst = "QUAL_" + field.fieldName().toUpperCase();
String setter = "entity." + field.setterName();
method.addStatement("$T<$T> cells_$L = put.get($L, $L)",
List.class, Cell.class, field.fieldName(), familyConst, qualConst);
if (field.multiVersioned()) {
megenerateComposeRowKey method · java · L286-L315 (30 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateComposeRowKey(EntityModel model, TypeName entityType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("composeRowKey")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(byte[].class)
.addParameter(entityType, "entity");
RowKeyModel rkm = model.rowKeyModel();
if (rkm instanceof RowKeyModel.Simple simple) {
// Simple row key: serialize the field directly
method.addStatement("return codec.serialize(entity.$L(), $L)",
simple.getterName(), codecFlagsExprForRowKey(model));
} else if (rkm instanceof RowKeyModel.Composite composite) {
// Composite: join components with delimiters
method.addStatement("$T sb = new $T()", StringBuilder.class, StringBuilder.class);
List<RowKeyModel.Component> components = composite.components();
for (int i = 0; i < compIf a scraper extracted this row, it came from Repobility (https://repobility.com)
generateParseRowKey method · java · L319-L355 (37 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateParseRowKey(EntityModel model, TypeName entityType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("parseRowKey")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(void.class)
.addParameter(byte[].class, "rowKeyBytes")
.addParameter(entityType, "entity");
RowKeyModel rkm = model.rowKeyModel();
if (rkm instanceof RowKeyModel.Simple simple) {
TypeMirror type = simple.fieldType();
method.addStatement("entity.$L(($T) codec.deserialize(rowKeyBytes, $L, $L))",
simple.setterName(),
TypeName.get(type),
typeClassExpr(type),
codecFlagsExprForRowKey(model));
} else if (rkm instanceof RowKeyModel.Composite composite) {
List<RowKeyModel.Component> components = composite.components();
// Find the delimigenerateGetRowKey method · java · L359-L385 (27 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateGetRowKey(EntityModel model, TypeName entityType, TypeName rowKeyType) {
MethodSpec.Builder method = MethodSpec.methodBuilder("getRowKey")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(rowKeyType)
.addParameter(entityType, "entity");
RowKeyModel rkm = model.rowKeyModel();
if (rkm instanceof RowKeyModel.Simple simple) {
method.addStatement("return entity.$L()", simple.getterName());
} else if (rkm instanceof RowKeyModel.Composite composite) {
// Composite keys always return String
List<RowKeyModel.Component> components = composite.components();
method.addStatement("$T sb = new $T()", StringBuilder.class, StringBuilder.class);
for (int i = 0; i < components.size(); i++) {
RowKeyModel.Component comp = components.get(i);
if (i > 0) {
generateGetTableName method · java · L389-L396 (8 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateGetTableName(EntityModel model) {
return MethodSpec.methodBuilder("getTableName")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(String.class)
.addStatement("return TABLE_NAME")
.build();
}generateGetColumnFamiliesAndVersions method · java · L400-L414 (15 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateGetColumnFamiliesAndVersions(EntityModel model) {
MethodSpec.Builder method = MethodSpec.methodBuilder("getColumnFamiliesAndVersions")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(ParameterizedTypeName.get(Map.class, String.class, Integer.class));
method.addStatement("$T<$T, $T> map = new $T<>()",
Map.class, String.class, Integer.class, LinkedHashMap.class);
for (Map.Entry<String, Integer> entry : model.familiesAndVersions().entrySet()) {
method.addStatement("map.put($S, $L)", entry.getKey(), entry.getValue());
}
method.addStatement("return map");
return method.build();
}generateGetColumn method · java · L418-L444 (27 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private MethodSpec generateGetColumn(EntityModel model) {
MethodSpec.Builder method = MethodSpec.methodBuilder("getColumn")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(byte[][].class)
.addParameter(String.class, "fieldName");
boolean first = true;
for (FieldModel field : model.fields()) {
String familyConst = "FAMILY_" + field.family().toUpperCase();
String qualConst = "QUAL_" + field.fieldName().toUpperCase();
if (first) {
method.beginControlFlow("if ($S.equals(fieldName))", field.fieldName());
first = false;
} else {
method.nextControlFlow("else if ($S.equals(fieldName))", field.fieldName());
}
method.addStatement("return new byte[][] { $L, $L }", familyConst, qualConst);
}
if (!first) {
method.endControlFlow();
addCodecFlagHelpers method · java · L448-L494 (47 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private void addCodecFlagHelpers(TypeSpec.Builder classBuilder, EntityModel model) {
// Generate static codec flag maps for fields that have flags
Set<String> generated = new HashSet<>();
for (FieldModel field : model.fields()) {
if (!field.codecFlags().isEmpty()) {
String constName = "FLAGS_" + field.fieldName().toUpperCase();
if (generated.add(constName)) {
CodeBlock.Builder init = CodeBlock.builder()
.add("$T.of(", Map.class);
int i = 0;
for (Map.Entry<String, String> entry : field.codecFlags().entrySet()) {
if (i > 0) init.add(", ");
init.add("$S, $S", entry.getKey(), entry.getValue());
i++;
}
init.add(")");
classBuilder.addField(FieldSpec.builder(
ParameteriresolveRowKeyType method · java · L498-L505 (8 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private TypeName resolveRowKeyType(EntityModel model) {
RowKeyModel rkm = model.rowKeyModel();
if (rkm instanceof RowKeyModel.Simple simple) {
return TypeName.get(simple.fieldType());
}
// Composite keys always use String
return ClassName.get(String.class);
}codecFlagsExpr method · java · L507-L512 (6 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private CodeBlock codecFlagsExpr(FieldModel field) {
if (field.codecFlags().isEmpty()) {
return CodeBlock.of("$T.of()", Map.class);
}
return CodeBlock.of("FLAGS_$L", field.fieldName().toUpperCase());
}Powered by Repobility — scan your code at https://repobility.com
codecFlagsExprForRowKey method · java · L514-L519 (6 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private CodeBlock codecFlagsExprForRowKey(EntityModel model) {
if (model.rowKeyCodecFlags().isEmpty()) {
return CodeBlock.of("$T.of()", Map.class);
}
return CodeBlock.of("ROW_KEY_FLAGS");
}typeClassExpr method · java · L521-L533 (13 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private CodeBlock typeClassExpr(TypeMirror type) {
if (type.getKind() == TypeKind.DECLARED) {
DeclaredType dt = (DeclaredType) type;
String qualifiedName = dt.asElement().toString();
// For generic types, we need the raw type + type info
if (!dt.getTypeArguments().isEmpty()) {
return CodeBlock.of("$T.class", ClassName.bestGuess(qualifiedName));
}
return CodeBlock.of("$T.class", ClassName.bestGuess(qualifiedName));
}
return CodeBlock.of("$T.class", Object.class);
}getMultiVersionValueType method · java · L535-L538 (4 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private TypeMirror getMultiVersionValueType(FieldModel field) {
// For NavigableMap<Long, T>, return T
return field.valueType();
}generateParseExpression method · java · L540-L553 (14 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private String generateParseExpression(TypeMirror type, String expr) {
if (type.getKind() == TypeKind.DECLARED) {
String name = type.toString();
if (name.equals("java.lang.String")) return expr;
if (name.equals("java.lang.Integer")) return "Integer.parseInt(" + expr + ")";
if (name.equals("java.lang.Long")) return "Long.parseLong(" + expr + ")";
if (name.equals("java.lang.Short")) return "Short.parseShort(" + expr + ")";
if (name.equals("java.lang.Float")) return "Float.parseFloat(" + expr + ")";
if (name.equals("java.lang.Double")) return "Double.parseDouble(" + expr + ")";
if (name.equals("java.lang.Boolean")) return "Boolean.parseBoolean(" + expr + ")";
if (name.equals("java.math.BigDecimal")) return "new java.math.BigDecimal(" + expr + ")";
}
return expr;
}escapeRegex method · java · L555-L558 (4 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/MapperGenerator.java
private String escapeRegex(String delimiter) {
// Escape regex special chars
return delimiter.replaceAll("([\\\\^$.|?*+()\\[\\]{}])", "\\\\$1");
}Simple class · java · L14-L19 (6 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/RowKeyModel.java
record Simple(
String fieldName,
TypeMirror fieldType,
String getterName,
String setterName
) implements RowKeyModel {}Composite class · java · L25-L27 (3 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/RowKeyModel.java
record Composite(
List<Component> components
) implements RowKeyModel {}Component class · java · L29-L36 (8 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/RowKeyModel.java
record Component(
int order,
String fieldName,
TypeMirror fieldType,
String delimiter,
String getterName,
String setterName
) {}Repobility — the code-quality scanner for AI-generated software · https://repobility.com
Component function · java · L29-L36 (8 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/RowKeyModel.java
record Component(
int order,
String fieldName,
TypeMirror fieldType,
String delimiter,
String getterName,
String setterName
) {}ValidatorPass class · java · L19-L339 (321 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
public class ValidatorPass {
private final Messager messager;
private final Elements elements;
private final Types types;
public ValidatorPass(Messager messager, Elements elements, Types types) {
this.messager = messager;
this.elements = elements;
this.types = types;
}
/**
* Validate the entity and return true if valid.
*/
public boolean validate(TypeElement typeElement) {
boolean valid = true;
// Must have public no-arg constructor
if (!hasPublicNoArgConstructor(typeElement)) {
error(typeElement, "@Table class '%s' must have a public no-arg constructor",
typeElement.getSimpleName());
valid = false;
}
// Collect @Table annotation
Table tableAnn = typeElement.getAnnotation(Table.class);
if (tableAnn == null) {
error(typeElement, "Class '%s' is missing @Table annotation", typeElement.getSimpleName());
ValidatorPass method · java · L25-L29 (5 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
public ValidatorPass(Messager messager, Elements elements, Types types) {
this.messager = messager;
this.elements = elements;
this.types = types;
}validate method · java · L34-L125 (92 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
public boolean validate(TypeElement typeElement) {
boolean valid = true;
// Must have public no-arg constructor
if (!hasPublicNoArgConstructor(typeElement)) {
error(typeElement, "@Table class '%s' must have a public no-arg constructor",
typeElement.getSimpleName());
valid = false;
}
// Collect @Table annotation
Table tableAnn = typeElement.getAnnotation(Table.class);
if (tableAnn == null) {
error(typeElement, "Class '%s' is missing @Table annotation", typeElement.getSimpleName());
return false;
}
// Validate table name
if (tableAnn.name().isBlank()) {
error(typeElement, "@Table name cannot be empty on '%s'", typeElement.getSimpleName());
valid = false;
}
// Collect family names
Set<String> familyNames = new HashSet<>();
for (ColumnFamily cf : tableAnn.families()) {
validateColumnField method · java · L127-L160 (34 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean validateColumnField(VariableElement field, Column col,
Set<String> familyNames, Set<String> columnKeys) {
boolean valid = true;
// Check primitive type
if (field.asType().getKind().isPrimitive()) {
error(field, "Field '%s' must not be a primitive type. Use wrapper types instead.",
field.getSimpleName());
valid = false;
}
// Check family exists
if (!familyNames.contains(col.family())) {
error(field, "Column family '%s' on field '%s' is not declared in @Table families",
col.family(), field.getSimpleName());
valid = false;
}
// Check duplicate family:qualifier
String key = col.family() + ":" + col.qualifier();
if (!columnKeys.add(key)) {
error(field, "Duplicate column mapping '%s' on field '%s'",
key, field.getSimpleName());
validateMultiVersionField method · java · L162-L195 (34 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean validateMultiVersionField(VariableElement field, MultiVersion mv,
Set<String> familyNames, Set<String> columnKeys) {
boolean valid = true;
// Check family exists
if (!familyNames.contains(mv.family())) {
error(field, "Column family '%s' on field '%s' is not declared in @Table families",
mv.family(), field.getSimpleName());
valid = false;
}
// Check duplicate family:qualifier
String key = mv.family() + ":" + mv.qualifier();
if (!columnKeys.add(key)) {
error(field, "Duplicate column mapping '%s' on field '%s'",
key, field.getSimpleName());
valid = false;
}
// Must be NavigableMap<Long, T>
if (!isNavigableMapLongValue(field.asType())) {
error(field, "@MultiVersion field '%s' must be of type NavigableMap<Long, T>",
field.getvalidateRowKeyComponents method · java · L197-L227 (31 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean validateRowKeyComponents(TypeElement typeElement, List<VariableElement> allFields) {
boolean valid = true;
Map<Integer, VariableElement> orderMap = new TreeMap<>();
for (VariableElement field : allFields) {
RowKeyComponent rkc = field.getAnnotation(RowKeyComponent.class);
if (rkc != null) {
if (orderMap.containsKey(rkc.order())) {
error(field, "Duplicate @RowKeyComponent order %d on '%s'",
rkc.order(), field.getSimpleName());
valid = false;
} else {
orderMap.put(rkc.order(), field);
}
}
}
// Check contiguous ordering starting from 0
int expected = 0;
for (int order : orderMap.keySet()) {
if (order != expected) {
error(typeElement, "@RowKeyComponent orders must be contiguous starting from 0, " +
isNavigableMapLongValue method · java · L229-L249 (21 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean isNavigableMapLongValue(TypeMirror type) {
if (type.getKind() != TypeKind.DECLARED) return false;
DeclaredType dt = (DeclaredType) type;
Element element = dt.asElement();
String name = ((TypeElement) element).getQualifiedName().toString();
if (!name.equals("java.util.NavigableMap") && !name.equals("java.util.TreeMap")) {
// Check if it's a subtype of NavigableMap
TypeMirror navMapType = elements.getTypeElement("java.util.NavigableMap").asType();
if (!types.isAssignable(types.erasure(type), types.erasure(navMapType))) {
return false;
}
}
List<? extends TypeMirror> typeArgs = dt.getTypeArguments();
if (typeArgs.size() != 2) return false;
TypeMirror keyType = typeArgs.get(0);
TypeElement longElement = elements.getTypeElement("java.lang.Long");
return types.isSameType(keyType, longElement.asType());
}Repobility · code-quality intelligence · https://repobility.com
checkAccessors method · java · L251-L289 (39 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean checkAccessors(VariableElement field, TypeElement enclosing) {
String fieldName = field.getSimpleName().toString();
String capitalized = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
String getterName = "get" + capitalized;
String setterName = "set" + capitalized;
// Check for boolean getter variant
String boolGetterName = "is" + capitalized;
boolean hasGetter = false;
boolean hasSetter = false;
for (Element member : elements.getAllMembers(enclosing)) {
if (member.getKind() != ElementKind.METHOD) continue;
ExecutableElement method = (ExecutableElement) member;
String methodName = method.getSimpleName().toString();
if ((methodName.equals(getterName) || methodName.equals(boolGetterName))
&& method.getParameters().isEmpty()) {
hasGetter = true;
}
if (methodName.equahasPublicNoArgConstructor method · java · L291-L302 (12 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private boolean hasPublicNoArgConstructor(TypeElement typeElement) {
for (Element enclosed : typeElement.getEnclosedElements()) {
if (enclosed.getKind() == ElementKind.CONSTRUCTOR) {
ExecutableElement ctor = (ExecutableElement) enclosed;
if (ctor.getParameters().isEmpty()
&& ctor.getModifiers().contains(Modifier.PUBLIC)) {
return true;
}
}
}
return false;
}collectFields method · java · L307-L311 (5 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
List<VariableElement> collectFields(TypeElement typeElement) {
List<VariableElement> fields = new ArrayList<>();
collectFieldsRecursive(typeElement, fields);
return fields;
}collectFieldsRecursive method · java · L313-L334 (22 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private void collectFieldsRecursive(TypeElement typeElement, List<VariableElement> fields) {
// Walk up the hierarchy for @MappedSuperclass
TypeMirror superclass = typeElement.getSuperclass();
if (superclass.getKind() == TypeKind.DECLARED) {
TypeElement superElement = (TypeElement) ((DeclaredType) superclass).asElement();
if (superElement.getAnnotation(MappedSuperclass.class) != null) {
collectFieldsRecursive(superElement, fields);
}
}
// Add fields from this class
for (Element enclosed : typeElement.getEnclosedElements()) {
if (enclosed.getKind() == ElementKind.FIELD) {
VariableElement field = (VariableElement) enclosed;
Set<Modifier> mods = field.getModifiers();
if (mods.contains(Modifier.STATIC) || mods.contains(Modifier.TRANSIENT)) {
continue;
}
fields.add(field);
error method · java · L336-L338 (3 LOC)hbase-orm-processor/src/main/java/io/github/dordor12/hbase/orm/processor/ValidatorPass.java
private void error(Element element, String format, Object... args) {
messager.printMessage(Diagnostic.Kind.ERROR, String.format(format, args), element);
}CodecBenchmark class · java · L21-L165 (145 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public class CodecBenchmark {
private BestSuitCodec codec;
private Map<String, String> noFlags;
private Map<String, String> stringFlags;
// Pre-serialized bytes for deserialization benchmarks
private byte[] stringBytes;
private byte[] intBytes;
private byte[] longBytes;
private byte[] floatBytes;
private byte[] doubleBytes;
private byte[] shortBytes;
private byte[] bigDecimalBytes;
private byte[] booleanBytes;
private byte[] localDateTimeBytes;
private byte[] stringFlagBytes;
@Setup
public void setup() {
codec = new BestSuitCodec();
noFlags = Collections.emptyMap();
stringFlags = Map.of(BestSuitCodec.SERIALIZE_AS_STRING, "true");
stringBytes = codec.serialize("hello world", noFlags);
intBytes = codec.serialize(42, noFlags);
longBytes = codec.serialize(123456789L, noFlags);
floatBytes = codec.serialize(3.14f, noFlags);
doubleBytes = codec.serialize(2.718281setup method · java · L40-L55 (16 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public void setup() {
codec = new BestSuitCodec();
noFlags = Collections.emptyMap();
stringFlags = Map.of(BestSuitCodec.SERIALIZE_AS_STRING, "true");
stringBytes = codec.serialize("hello world", noFlags);
intBytes = codec.serialize(42, noFlags);
longBytes = codec.serialize(123456789L, noFlags);
floatBytes = codec.serialize(3.14f, noFlags);
doubleBytes = codec.serialize(2.718281828, noFlags);
shortBytes = codec.serialize((short) 100, noFlags);
bigDecimalBytes = codec.serialize(new BigDecimal("12345.6789"), noFlags);
booleanBytes = codec.serialize(true, noFlags);
localDateTimeBytes = codec.serialize(LocalDateTime.of(2024, 6, 15, 9, 30), noFlags);
stringFlagBytes = codec.serialize(42, stringFlags);
}serializeString method · java · L60-L62 (3 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public byte[] serializeString() {
return codec.serialize("hello world", noFlags);
}If a scraper extracted this row, it came from Repobility (https://repobility.com)
serializeInteger method · java · L65-L67 (3 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public byte[] serializeInteger() {
return codec.serialize(42, noFlags);
}serializeLong method · java · L70-L72 (3 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public byte[] serializeLong() {
return codec.serialize(123456789L, noFlags);
}serializeFloat method · java · L75-L77 (3 LOC)hbase-orm-test/src/jmh/java/io/github/dordor12/hbase/orm/bench/CodecBenchmark.java
public byte[] serializeFloat() {
return codec.serialize(3.14f, noFlags);
}