
com.hazelcast.shaded.io.github.classgraph.AnnotationParameterValue Maven / Gradle / Ivy
The newest version!
/*
* This file is part of ClassGraph.
*
* Author: Luke Hutchison
*
* Hosted at: https://github.com/classgraph/classgraph
*
* --
*
* The MIT License (MIT)
*
* Copyright (c) 2019 Luke Hutchison
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
* EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.hazelcast.shaded.io.github.classgraph;
import java.lang.reflect.Array;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import com.hazelcast.shaded.nonapi.io.github.classgraph.utils.LogNode;
/** A wrapper used to pair annotation parameter names with annotation parameter values. */
public class AnnotationParameterValue extends ScanResultObject
implements HasName, Comparable {
/** The the parameter name. */
private String name;
/** The parameter value. */
private ObjectTypedValueWrapper value;
/** Default constructor for deserialization. */
AnnotationParameterValue() {
super();
}
/**
* Constructor.
*
* @param name
* The annotation paramater name.
* @param value
* The annotation parameter value.
*/
AnnotationParameterValue(final String name, final Object value) {
super();
this.name = name;
this.value = new ObjectTypedValueWrapper(value);
}
/**
* Get the annotation parameter name.
*
* @return The annotation parameter name.
*/
@Override
public String getName() {
return name;
}
/**
* Get the annotation parameter value.
*
* @return The annotation parameter value. May be one of the following types:
*
* - String for string constants
*
- String[] for arrays of strings
*
- A boxed type, e.g. Integer or Character, for primitive-typed constants
*
- A 1-dimensional primitive-typed array (i.e. int[], long[], short[], char[], byte[], boolean[],
* float[], or double[]), for arrays of primitives
*
- A 1-dimensional {@link Object}[] array for array types (and then the array element type may be
* one of the types in this list)
*
- {@link AnnotationEnumValue}, for enum constants (this wraps the enum class and the string name of
* the constant)
*
- {@link AnnotationClassRef}, for Class references within annotations (this wraps the name of the
* referenced class)
*
- {@link AnnotationInfo}, for nested annotations
*
*/
public Object getValue() {
return value == null ? null : value.get();
}
/**
* Set (update) the value of the annotation parameter. Used to replace Object[] arrays containing boxed types
* into primitive arrays.
*
* @param newValue
* the new value
*/
void setValue(final Object newValue) {
this.value = new ObjectTypedValueWrapper(newValue);
}
// -------------------------------------------------------------------------------------------------------------
/* (non-Javadoc)
* @see io.github.classgraph.ScanResultObject#getClassName()
*/
@Override
protected String getClassName() {
// getClassInfo() is not valid for this type, so getClassName() does not need to be implemented
throw new IllegalArgumentException("getClassName() cannot be called here");
}
/* (non-Javadoc)
* @see io.github.classgraph.ScanResultObject#getClassInfo()
*/
@Override
protected ClassInfo getClassInfo() {
throw new IllegalArgumentException("getClassInfo() cannot be called here");
}
/* (non-Javadoc)
* @see io.github.classgraph.ScanResultObject#setScanResult(com.hazelcast.shaded.io.github.classgraph.ScanResult)
*/
@Override
void setScanResult(final ScanResult scanResult) {
super.setScanResult(scanResult);
if (value != null) {
value.setScanResult(scanResult);
}
}
/**
* Get {@link ClassInfo} objects for any classes referenced in the annotation parameters.
*
* @param classNameToClassInfo
* the map from class name to {@link ClassInfo}.
* @param refdClassInfo
* the referenced class info
*/
@Override
protected void findReferencedClassInfo(final Map classNameToClassInfo,
final Set refdClassInfo, final LogNode log) {
if (value != null) {
value.findReferencedClassInfo(classNameToClassInfo, refdClassInfo, log);
}
}
// -------------------------------------------------------------------------------------------------------------
/**
* For primitive array type params, replace Object[] arrays containing boxed types with primitive arrays (need
* to check the type of each method of the annotation class to determine if it is a primitive array type).
*
* @param annotationClassInfo
* the annotation class info
*/
void convertWrapperArraysToPrimitiveArrays(final ClassInfo annotationClassInfo) {
if (value != null) {
value.convertWrapperArraysToPrimitiveArrays(annotationClassInfo, name);
}
}
/**
* Instantiate an annotation parameter value.
*
* @param annotationClassInfo
* the annotation class info
* @return the instance
*/
Object instantiate(final ClassInfo annotationClassInfo) {
return value.instantiateOrGet(annotationClassInfo, name);
}
// -------------------------------------------------------------------------------------------------------------
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(final AnnotationParameterValue other) {
if (other == this) {
return 0;
}
final int diff = name.compareTo(other.getName());
if (diff != 0) {
return diff;
}
if (value.equals(other.value)) {
return 0;
}
// Use toString() order (which can be slow) as a last-ditch effort -- only happens
// if the annotation has multiple parameters of the same name but different value.
final Object p0 = getValue();
final Object p1 = other.getValue();
return p0 == null || p1 == null ? (p0 == null ? 0 : 1) - (p1 == null ? 0 : 1)
: toStringParamValueOnly().compareTo(other.toStringParamValueOnly());
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
} else if (!(obj instanceof AnnotationParameterValue)) {
return false;
}
final AnnotationParameterValue other = (AnnotationParameterValue) obj;
return this.name.equals(other.name) && (value == null) == (other.value == null)
&& (value == null || value.equals(other.value));
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return Objects.hash(name, value);
}
// -------------------------------------------------------------------------------------------------------------
@Override
protected void toString(final boolean useSimpleNames, final StringBuilder buf) {
buf.append(name);
buf.append("=");
toStringParamValueOnly(useSimpleNames, buf);
}
/**
* Write an annotation parameter value's string representation to the buffer.
*
* @param val
* the value
* @param useSimpleNames
* the use simple names
* @param buf
* the buffer
*/
private static void toString(final Object val, final boolean useSimpleNames, final StringBuilder buf) {
if (val == null) {
buf.append("null");
} else if (val instanceof ScanResultObject) {
((ScanResultObject) val).toString(useSimpleNames, buf);
} else {
buf.append(val);
}
}
/**
* To string, param value only.
*
* @param buf
* the buf
*/
void toStringParamValueOnly(final boolean useSimpleNames, final StringBuilder buf) {
if (value == null) {
buf.append("null");
} else {
final Object paramVal = value.get();
final Class> valClass = paramVal.getClass();
if (valClass.isArray()) {
buf.append('{');
for (int j = 0, n = Array.getLength(paramVal); j < n; j++) {
if (j > 0) {
buf.append(", ");
}
final Object elt = Array.get(paramVal, j);
toString(elt, useSimpleNames, buf);
}
buf.append('}');
} else if (paramVal instanceof String) {
buf.append('"');
buf.append(paramVal.toString().replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r"));
buf.append('"');
} else if (paramVal instanceof Character) {
buf.append('\'');
buf.append(paramVal.toString().replace("'", "\\'").replace("\n", "\\n").replace("\r", "\\r"));
buf.append('\'');
} else {
toString(paramVal, useSimpleNames, buf);
}
}
}
/**
* To string, param value only.
*
* @return the string.
*/
private String toStringParamValueOnly() {
final StringBuilder buf = new StringBuilder();
toStringParamValueOnly(false, buf);
return buf.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy