Java源码示例:org.influxdb.annotation.Column
示例1
void cacheMeasurementClass(final Class<?>... classVarAgrs) {
for (Class<?> clazz : classVarAgrs) {
if (CLASS_FIELD_CACHE.containsKey(clazz.getName())) {
continue;
}
ConcurrentMap<String, Field> initialMap = new ConcurrentHashMap<>();
ConcurrentMap<String, Field> influxColumnAndFieldMap = CLASS_FIELD_CACHE.putIfAbsent(clazz.getName(), initialMap);
if (influxColumnAndFieldMap == null) {
influxColumnAndFieldMap = initialMap;
}
Class<?> c = clazz;
while (c != null) {
for (Field field : c.getDeclaredFields()) {
Column colAnnotation = field.getAnnotation(Column.class);
if (colAnnotation != null) {
influxColumnAndFieldMap.put(colAnnotation.name(), field);
}
}
c = c.getSuperclass();
}
}
}
示例2
/**
* Adds field map from object by reflection using {@link org.influxdb.annotation.Column}
* annotation.
*
* @param pojo POJO Object with annotation {@link org.influxdb.annotation.Column} on fields
* @return the Builder instance
*/
public Builder addFieldsFromPOJO(final Object pojo) {
Class<? extends Object> clazz = pojo.getClass();
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
Column column = field.getAnnotation(Column.class);
if (column == null) {
continue;
}
field.setAccessible(true);
String fieldName = column.name();
addFieldByAttribute(pojo, field, column, fieldName);
}
clazz = clazz.getSuperclass();
}
if (this.fields.isEmpty()) {
throw new BuilderException("Class " + pojo.getClass().getName()
+ " has no @" + Column.class.getSimpleName() + " annotation");
}
return this;
}
示例3
private void addFieldByAttribute(final Object pojo, final Field field, final Column column,
final String fieldName) {
try {
Object fieldValue = field.get(pojo);
TimeColumn tc = field.getAnnotation(TimeColumn.class);
if (tc != null && Instant.class.isAssignableFrom(field.getType())) {
Optional.ofNullable((Instant) fieldValue).ifPresent(instant -> {
TimeUnit timeUnit = tc.timeUnit();
if (timeUnit == TimeUnit.NANOSECONDS || timeUnit == TimeUnit.MICROSECONDS) {
this.time = BigInteger.valueOf(instant.getEpochSecond())
.multiply(NANOSECONDS_PER_SECOND)
.add(BigInteger.valueOf(instant.getNano()))
.divide(BigInteger.valueOf(TimeUnit.NANOSECONDS.convert(1, timeUnit)));
} else {
this.time = TimeUnit.MILLISECONDS.convert(instant.toEpochMilli(), timeUnit);
this.precision = timeUnit;
}
this.precision = timeUnit;
});
return;
}
if (column.tag()) {
if (fieldValue != null) {
this.tags.put(fieldName, (String) fieldValue);
}
} else {
if (fieldValue != null) {
this.fields.put(fieldName, fieldValue);
}
}
} catch (IllegalArgumentException | IllegalAccessException e) {
// Can not happen since we use metadata got from the object
throw new BuilderException(
"Field " + fieldName + " could not found on class " + pojo.getClass().getSimpleName());
}
}
示例4
public <T> void save(final T model) {
throwExceptionIfMissingAnnotation(model.getClass());
cacheMeasurementClass(model.getClass());
ConcurrentMap<String, Field> colNameAndFieldMap = getColNameAndFieldMap(model.getClass());
try {
Class<?> modelType = model.getClass();
String measurement = getMeasurementName(modelType);
String database = getDatabaseName(modelType);
String retentionPolicy = getRetentionPolicy(modelType);
TimeUnit timeUnit = getTimeUnit(modelType);
long time = timeUnit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
Point.Builder pointBuilder = Point.measurement(measurement).time(time, timeUnit);
for (String key : colNameAndFieldMap.keySet()) {
Field field = colNameAndFieldMap.get(key);
Column column = field.getAnnotation(Column.class);
String columnName = column.name();
Class<?> fieldType = field.getType();
if (!field.isAccessible()) {
field.setAccessible(true);
}
Object value = field.get(model);
if (column.tag()) {
/** Tags are strings either way. */
pointBuilder.tag(columnName, value.toString());
} else if ("time".equals(columnName)) {
if (value != null) {
setTime(pointBuilder, fieldType, timeUnit, value);
}
} else {
setField(pointBuilder, fieldType, columnName, value);
}
}
Point point = pointBuilder.build();
if ("[unassigned]".equals(database)) {
influxDB.write(point);
} else {
influxDB.write(database, retentionPolicy, point);
}
} catch (IllegalAccessException e) {
throw new InfluxDBMapperException(e);
}
}