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);
}
}
Aggregations