r1096 - in trunk/eugene/src/main/java/org/nuiton/eugene: . models/object
Author: tchemit Date: 2011-09-22 11:00:33 +0200 (Thu, 22 Sep 2011) New Revision: 1096 Url: http://nuiton.org/repositories/revision/eugene/1096 Log: Evolution #1746: Add a serialVersionUID generator Added: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/SerialVersionUIDBuilder.java Modified: trunk/eugene/src/main/java/org/nuiton/eugene/GeneratorUtil.java Modified: trunk/eugene/src/main/java/org/nuiton/eugene/GeneratorUtil.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/GeneratorUtil.java 2011-09-21 18:02:48 UTC (rev 1095) +++ trunk/eugene/src/main/java/org/nuiton/eugene/GeneratorUtil.java 2011-09-22 09:00:33 UTC (rev 1096) @@ -35,6 +35,7 @@ import org.nuiton.eugene.models.object.ObjectModelElement; import org.nuiton.eugene.models.object.ObjectModelOperation; import org.nuiton.eugene.models.object.ObjectModelParameter; +import org.nuiton.eugene.models.object.SerialVersionUIDBuilder; import org.nuiton.util.StringUtil; import java.io.File; @@ -486,7 +487,7 @@ StringBuffer result = new StringBuffer(); Collection<ObjectModelAttribute> params = clazz.getAttributes(); - for (Iterator<ObjectModelAttribute> j = params.iterator(); j.hasNext();) { + for (Iterator<ObjectModelAttribute> j = params.iterator(); j.hasNext(); ) { ObjectModelAttribute attr = j.next(); result.append(getAttributeType(attr, true)).append(" ").append(attr.getName()); if (j.hasNext()) { @@ -577,7 +578,9 @@ * * @param clazz the class to use * @return the generated serialVersionUID + * @deprecated since 2.4, prefer use the method {@link #generateSerialVersionUID(ObjectModelClassifier)} */ + @Deprecated public static String computeSerialVersionUID(ObjectModelClass clazz) { String query = clazz.getQualifiedName() + "#"; for (ObjectModelAttribute attr : clazz.getAttributes()) { @@ -682,7 +685,6 @@ } /** - * * @param str the string to parse * @return the string without any * @since 2.3.2 @@ -713,7 +715,7 @@ // the i position was on the last closing caracter, can safely // remove until this position + 1 - String prefix = result.substring(0,i+1); + String prefix = result.substring(0, i + 1); String end = result.substring(i + 1); // remove any starting spaces @@ -855,4 +857,15 @@ return value; } + /** + * Generates the serialVersionUID of the given {@code classifier}. + * + * @param classifier the classifier + * @return the value of the serialVersionUID + */ + public static long generateSerialVersionUID(ObjectModelClassifier classifier) { + long result = SerialVersionUIDBuilder.computeDefaultSUID(classifier); + return result; + } + } // GeneratorUtil Added: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/SerialVersionUIDBuilder.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/SerialVersionUIDBuilder.java (rev 0) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/SerialVersionUIDBuilder.java 2011-09-22 09:00:33 UTC (rev 1096) @@ -0,0 +1,110 @@ +package org.nuiton.eugene.models.object; + +import org.nuiton.util.StringUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * To build seriablVersionUID for a givne objectModelClassifier. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.4 + */ +public class SerialVersionUIDBuilder { + + protected ObjectModelClassifier clazz; + + protected List<String> interfaceSignatures; + + protected List<String> fieldSignatures; + + protected List<String> methodSignatures; + + public static long computeDefaultSUID(ObjectModelClassifier psiClass) { + + SerialVersionUIDBuilder builder = new SerialVersionUIDBuilder(psiClass); + long result = builder.buildUID(); + return result; + } + + public SerialVersionUIDBuilder(ObjectModelClassifier clazz) { + this.clazz = clazz; + + interfaceSignatures = new ArrayList<String>(); + for (ObjectModelInterface method : clazz.getInterfaces()) { + interfaceSignatures.add(method.getQualifiedName()); + } + Collections.sort(interfaceSignatures); + if (clazz instanceof ObjectModelClass) { + ObjectModelClass objectModelClass = (ObjectModelClass) clazz; + for (ObjectModelClass modelClass : + objectModelClass.getSuperclasses()) { + interfaceSignatures.add(modelClass.getQualifiedName()); + } + } + + methodSignatures = new ArrayList<String>(); + for (ObjectModelOperation method : + clazz.getAllInterfaceOperations(true)) { + StringBuilder sb = new StringBuilder(); + sb.append(method.getReturnType()).append(method.getName()); + for (ObjectModelParameter parameter : method.getParameters()) { + sb.append(parameter.getType()).append(parameter.getName()); + } + for (String exception : method.getExceptions()) { + sb.append(exception); + } + methodSignatures.add(sb.toString()); + } + Collections.sort(methodSignatures); + + fieldSignatures = new ArrayList<String>(); + for (ObjectModelAttribute field : clazz.getAllInterfaceAttributes()) { + StringBuilder sb = new StringBuilder(); + sb.append(field.getType()).append(field.getName()); + fieldSignatures.add(sb.toString()); + } + Collections.sort(fieldSignatures); + } + + public long buildUID() { + StringBuilder sb = new StringBuilder(); + + String className = clazz.getName(); + sb.append(className); + + for (String interfactSignature : getFieldSignatures()) { + sb.append(interfactSignature); + } + + for (String fieldSignature : getFieldSignatures()) { + sb.append(fieldSignature); + } + + for (String methodSignature : getMethodSignatures()) { + sb.append(methodSignature); + } + + byte[] digestBytes = StringUtil.encodeSHA1(sb.toString()).getBytes(); + long serialVersionUID = 0L; + for (int i = Math.min(digestBytes.length, 8) - 1; i >= 0; i--) { + serialVersionUID = serialVersionUID << 8 | digestBytes[i] & 0xFF; + } + return serialVersionUID; + + } + + public List<String> getInterfaceSignatures() { + return interfaceSignatures; + } + + public List<String> getFieldSignatures() { + return fieldSignatures; + } + + public List<String> getMethodSignatures() { + return methodSignatures; + } +} Property changes on: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/SerialVersionUIDBuilder.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native
participants (1)
-
tchemit@users.nuiton.org