I want all classes containing @Table, each private field in it must have @Column.
This is my code
package org.sonar.samples.java.checks;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.semantic.Symbol;
import org.sonar.plugins.java.api.tree.Tree;
import org.sonar.plugins.java.api.tree.VariableTree;
import java.util.Arrays;
import java.util.List;
@Rule(key = "CheckAnnotationColumn")
public class CheckAnnotationColumn extends IssuableSubscriptionVisitor {
@Override
public List<Tree.Kind> nodesToVisit() {
return Arrays.asList(Tree.Kind.METHOD, Tree.Kind.VARIABLE);
}
private static final String TABLE_ANNOTATION = "com.miragesql.miragesql.annotation.Table";
private static final String COLUMN_ANNOTATION = "com.miragesql.miragesql.annotation.Column";
@Override
public void visitNode(Tree tree) {
VariableTree variableTree = (VariableTree) tree;
Symbol.VariableSymbol variableSymbol = (Symbol.VariableSymbol) variableTree.symbol();
if(isEntityClass(variableSymbol)
&& isColumnAnnotation(variableSymbol)
&& variableSymbol.isPrivate()) {
reportIssue(variableTree.simpleName(), "This field lack of @Column: " + variableTree.simpleName());
}
}
private static boolean isEntityClass(Symbol.VariableSymbol variableSymbol) {
return (variableSymbol.owner().metadata().isAnnotatedWith(TABLE_ANNOTATION));
}
private static boolean isColumnAnnotation(Symbol.VariableSymbol variableSymbol){
return (variableSymbol.metadata().isAnnotatedWith(COLUMN_ANNOTATION));
}
}
my class test:
package jp.classmethod.aws.metropolis.duck.model.closinginfo;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.miragesql.miragesql.annotation.Column;
import com.miragesql.miragesql.annotation.Enumerated;
import com.miragesql.miragesql.annotation.PrimaryKey;
import com.miragesql.miragesql.annotation.Table;
import io.swagger.annotations.ApiModelProperty;
import jdk.jfr.ContentType;
import org.sonar.check.Rule;
import jdk.jfr.Percentage;
/**
* ClosingInfo model
*/
@ContentType
@Table(name = "closing_info")
@Entity
public class ClosingInfo {
/**
* Closing Info ID
*/
@Id
@Column(name = "closing_info_id")
@PrimaryKey(generationType = PrimaryKey.GenerationType.APPLICATION)
@JsonIgnore
@Percentage
@RequiredUuidConstraints
@ApiModelProperty(hidden = true)
private String closingInfoId; // Compliant
/**
* Closing Info Code
*/
@Column(name = "closing_info_code")
@JsonProperty("closing_info_code")
@RequiredCodeConstraints2
@ApiModelProperty(value = "ブックロックコード", required = true, example = "CLOSING_INFO_00001", position = 1)
private String closingInfoCode; // Compliant
/**
* Facility code.
*/
@Column(name = "facility_code")
@JsonProperty("facility_code")
@OptionalCodeConstraints2
@NotNull
@ApiModelProperty(value = "施設コード", required = true, example = "FACILITY_00001", position = 2)
private String facilityCode; // Compliant
/**
* Closing Timestamp
*/
@JsonProperty("closing_timestamp")
@UnixMillisecTimestampConstraints
@NotNull
@ApiModelProperty(value = "タイムスタンプロックコード", required = true, example = "1551365999999L", position = 3)
private Long closingTimestamp; // Noncompliant {{This field lack of @Column: closingTimestamp}}
}
When i debug, variableSymbol.owner().metadata() has solution :
Why @Table and @Entity have type symbol are unknownSymbol? Can i fix it?