Search in sources :

Example 1 with TypeEnvironment

use of org.revapi.java.spi.TypeEnvironment in project revapi by revapi.

the class SerialVersionUidChecker method computeStructuralId.

public static long computeStructuralId(TypeElement type, TypeEnvironment environment) {
    Predicate<Element> serializableFields = e -> {
        Set<Modifier> mods = e.getModifiers();
        return !mods.contains(Modifier.TRANSIENT) && !mods.contains(Modifier.STATIC);
    };
    Comparator<Element> bySimpleName = Comparator.comparing(e -> e.getSimpleName().toString());
    List<TypeMirror> fields = ElementFilter.fieldsIn(type.getEnclosedElements()).stream().filter(serializableFields).sorted(bySimpleName).map(Element::asType).collect(Collectors.toList());
    Types types = environment.getTypeUtils();
    for (TypeMirror st : Util.getAllSuperClasses(types, type.asType())) {
        Element ste = types.asElement(st);
        ElementFilter.fieldsIn(ste.getEnclosedElements()).stream().filter(serializableFields).sorted(bySimpleName).map(e -> types.asMemberOf((DeclaredType) st, e)).forEach(fields::add);
    }
    String data = fields.stream().map(Util::toUniqueString).collect(Collectors.joining());
    try {
        byte[] bytes = data.getBytes("UTF-8");
        MessageDigest md = MessageDigest.getInstance("SHA");
        byte[] hashBytes = md.digest(bytes);
        long hash = 0;
        for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) {
            hash = (hash << 8) | (hashBytes[i] & 0xFF);
        }
        return hash;
    } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
        throw new IllegalStateException("Could not compute structural ID of a type " + type.getQualifiedName().toString(), e);
    }
}
Also used : Arrays(java.util.Arrays) SimpleTypeVisitor7(javax.lang.model.util.SimpleTypeVisitor7) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Modifier(javax.lang.model.element.Modifier) MessageDigest(java.security.MessageDigest) VariableElement(javax.lang.model.element.VariableElement) TypeElement(javax.lang.model.element.TypeElement) CheckBase(org.revapi.java.spi.CheckBase) ArrayList(java.util.ArrayList) JavaFieldElement(org.revapi.java.spi.JavaFieldElement) DataOutputStream(java.io.DataOutputStream) Charset(java.nio.charset.Charset) Util(org.revapi.java.spi.Util) DeclaredType(javax.lang.model.type.DeclaredType) ElementFilter(javax.lang.model.util.ElementFilter) Nonnull(javax.annotation.Nonnull) EnumSet(java.util.EnumSet) Nullable(javax.annotation.Nullable) ArrayType(javax.lang.model.type.ArrayType) Code(org.revapi.java.spi.Code) ElementKind(javax.lang.model.element.ElementKind) ExecutableType(javax.lang.model.type.ExecutableType) AnalysisContext(org.revapi.AnalysisContext) NoType(javax.lang.model.type.NoType) Predicate(java.util.function.Predicate) ExecutableElement(javax.lang.model.element.ExecutableElement) Set(java.util.Set) IOException(java.io.IOException) Element(javax.lang.model.element.Element) Reader(java.io.Reader) Types(javax.lang.model.util.Types) TypeEnvironment(org.revapi.java.spi.TypeEnvironment) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) Difference(org.revapi.Difference) TypeKind(javax.lang.model.type.TypeKind) Objects(java.util.Objects) List(java.util.List) TypeMirror(javax.lang.model.type.TypeMirror) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) PrimitiveType(javax.lang.model.type.PrimitiveType) ModelNode(org.jboss.dmr.ModelNode) Comparator(java.util.Comparator) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Collections(java.util.Collections) Types(javax.lang.model.util.Types) EnumSet(java.util.EnumSet) Set(java.util.Set) VariableElement(javax.lang.model.element.VariableElement) TypeElement(javax.lang.model.element.TypeElement) JavaFieldElement(org.revapi.java.spi.JavaFieldElement) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) TypeMirror(javax.lang.model.type.TypeMirror) MessageDigest(java.security.MessageDigest)

Aggregations

ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 DataOutputStream (java.io.DataOutputStream)1 IOException (java.io.IOException)1 InputStreamReader (java.io.InputStreamReader)1 Reader (java.io.Reader)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 Charset (java.nio.charset.Charset)1 MessageDigest (java.security.MessageDigest)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collections (java.util.Collections)1 Comparator (java.util.Comparator)1 EnumSet (java.util.EnumSet)1 List (java.util.List)1 Objects (java.util.Objects)1 Set (java.util.Set)1 Predicate (java.util.function.Predicate)1 Collectors (java.util.stream.Collectors)1 Nonnull (javax.annotation.Nonnull)1