+ public static long computeDefaultSUID(GeneratedTOBuilderImpl to) {
+ try {
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ DataOutputStream dout = new DataOutputStream(bout);
+
+ dout.writeUTF(to.getName());
+ dout.writeInt(to.isAbstract() ? 3 : 7);
+
+ List<Type> impl = to.getImplementsTypes();
+ Collections.sort(impl, new Comparator<Type>() {
+ @Override
+ public int compare(Type o1, Type o2) {
+ return o1.getFullyQualifiedName().compareTo(o2.getFullyQualifiedName());
+ }
+ });
+ for (Type ifc : impl) {
+ dout.writeUTF(ifc.getFullyQualifiedName());
+ }
+
+ Comparator<TypeMemberBuilder<?>> comparator = new Comparator<TypeMemberBuilder<?>>() {
+ @Override
+ public int compare(TypeMemberBuilder<?> o1, TypeMemberBuilder<?> o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ };
+
+ List<GeneratedPropertyBuilder> props = to.getProperties();
+ Collections.sort(props, comparator);
+ for (GeneratedPropertyBuilder gp : props) {
+ dout.writeUTF(gp.getName());
+ }
+
+ List<MethodSignatureBuilder> methods = to.getMethodDefinitions();
+ Collections.sort(methods, comparator);
+ for (MethodSignatureBuilder m : methods) {
+ if (!(m.getAccessModifier().equals(AccessModifier.PRIVATE))) {
+ dout.writeUTF(m.getName());
+ dout.write(m.getAccessModifier().ordinal());
+ }
+ }
+
+ dout.flush();
+
+ MessageDigest md = MessageDigest.getInstance("SHA");
+ byte[] hashBytes = md.digest(bout.toByteArray());
+ long hash = 0;
+ for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) {
+ hash = (hash << 8) | (hashBytes[i] & 0xFF);
+ }
+ return hash;
+ } catch (IOException ex) {
+ throw new InternalError();
+ } catch (NoSuchAlgorithmException ex) {
+ throw new SecurityException(ex.getMessage());
+ }
+ }
+