blob: b52cb30c0a85a1de9da362a31bb81ccd5cdb860f [file] [log] [blame]
/*
* 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.apache.drill.common.scanner.persistence;
import java.lang.reflect.Array;
import java.util.List;
import java.util.Map;
import org.apache.drill.common.exceptions.DrillRuntimeException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* a class fields
*/
public final class FieldDescriptor {
private final String name;
private final String descriptor;
private final List<AnnotationDescriptor> annotations;
private final Map<String, AnnotationDescriptor> annotationMap;
@JsonCreator public FieldDescriptor(
@JsonProperty("name") String name,
@JsonProperty("descriptor") String descriptor,
@JsonProperty("annotations") List<AnnotationDescriptor> annotations) {
this.name = name;
this.descriptor = descriptor;
this.annotations = annotations;
this.annotationMap = AnnotationDescriptor.buildAnnotationsMap(annotations);
// validate the descriptor
getType();
}
public String getName() {
return name;
}
/**
* @return the descriptor of the type of the field as defined in the bytecode
*/
public String getDescriptor() {
return descriptor;
}
public List<AnnotationDescriptor> getAnnotations() {
return annotations;
}
public AnnotationDescriptor getAnnotation(Class<?> clazz) {
return annotationMap.get(clazz.getName());
}
public <T> T getAnnotationProxy(Class<T> clazz) {
final AnnotationDescriptor annotationDescriptor = getAnnotation(clazz);
if (annotationDescriptor == null) {
return null;
}
return annotationDescriptor.getProxy(clazz);
}
@JsonIgnore
public TypeDescriptor getType() {
int arrayDim = 0;
char c;
while ((c = descriptor.charAt(arrayDim)) == '[') {
++arrayDim;
}
if (c == 'L') {
int lastIndex = descriptor.length() - 1;
if (descriptor.charAt(lastIndex) != ';') {
throw new DrillRuntimeException("Illegal descriptor: " + descriptor);
}
String className = descriptor.substring(arrayDim + 1, lastIndex).replace('/', '.');
return TypeDescriptor.forClass(className, arrayDim);
} else {
return TypeDescriptor.forPrimitive(c, arrayDim);
}
}
@JsonIgnore
public Class<?> getFieldClass() {
TypeDescriptor type = getType();
Class<?> elementClass = type.getType();
if (type.isArray()) {
return Array.newInstance(elementClass, new int[type.getArrayDim()]).getClass();
} else {
return elementClass;
}
}
@Override
public String toString() {
return "Field[name=" + name + ", descriptor=" + descriptor + ", annotations=" + annotations + "]";
}
}