Skip to content

Commit

Permalink
add ordering to code generation. Distribited objects and their opeart…
Browse files Browse the repository at this point in the history
…ions will always be generated in same order
  • Loading branch information
sancar committed Aug 27, 2015
1 parent f4f2f1d commit 12ce754
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ public static String getPackageNameFromQualifiedName(String qualifiedClassName)
}

public static String mergeIds(short classId, short methodId) {
final String s = Integer.toHexString((classId << BYTE_BIT_COUNT) + methodId);
return Integer.toHexString((classId << BYTE_BIT_COUNT) + methodId);
}

public static String addHexPrefix(String s) {
return s.length() == 3 ? "0x0" + s : "0x" + s;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,26 +50,29 @@
import javax.tools.JavaFileObject;
import javax.tools.StandardLocation;
import java.io.IOException;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

@SupportedAnnotationTypes({"com.hazelcast.annotation.GenerateCodec","com.hazelcast.annotation.Codec"})
@SupportedAnnotationTypes({"com.hazelcast.annotation.GenerateCodec", "com.hazelcast.annotation.Codec"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class CodecCodeGenerator
extends AbstractProcessor {

private Filer filer;
private Elements elementUtils;
private Messager messager;
private Map<Lang, Template> codecTemplateMap = new HashMap<Lang, Template>();
private Map<Lang, Template> messageTypeTemplateMap = new HashMap<Lang, Template>();
private Map<TypeElement, Map<String, ExecutableElement>> requestMap = new HashMap<TypeElement, Map<String, ExecutableElement>>();
private Map<Integer, ExecutableElement> responseMap = new HashMap<Integer, ExecutableElement>();
private Map<Integer, ExecutableElement> eventResponseMap = new HashMap<Integer, ExecutableElement>();
private final Map<Lang, Template> codecTemplateMap = new HashMap<Lang, Template>();
private final Map<Lang, Template> messageTypeTemplateMap = new HashMap<Lang, Template>();
private final Map<TypeElement, Map<Integer, ExecutableElement>> requestMap = new HashMap<TypeElement, Map<Integer, ExecutableElement>>();
private final Map<Integer, ExecutableElement> responseMap = new HashMap<Integer, ExecutableElement>();
private final Map<Integer, ExecutableElement> eventResponseMap = new HashMap<Integer, ExecutableElement>();

@Override
public void init(ProcessingEnvironment env) {
Expand Down Expand Up @@ -141,9 +144,9 @@ public boolean process(Set<? extends TypeElement> elements, RoundEnvironment env
return true;
}

public void generateContent(Lang lang) {
void generateContent(Lang lang) {
//GENERATE CONTENT
Map<TypeElement, Map<String, CodecModel>> allCodecModel = createAllCodecModel(lang);
Map<TypeElement, Map<Integer, CodecModel>> allCodecModel = createAllCodecModel(lang);

Template messageTypeTemplate = messageTypeTemplateMap.get(lang);
if (messageTypeTemplate != null) {
Expand All @@ -154,19 +157,19 @@ public void generateContent(Lang lang) {

Template codecTemplate = codecTemplateMap.get(lang);

if(lang == Lang.MD) {
if (lang == Lang.MD) {
generateDoc(allCodecModel, codecTemplate);
} else {
for (Map<String, CodecModel> map : allCodecModel.values()) {
for (Map<Integer, CodecModel> map : allCodecModel.values()) {
for (CodecModel model : map.values()) {
generateCodec(model, codecTemplate);
}
}
}
}

public void register(TypeElement classElement) {
HashMap<String, ExecutableElement> map = new HashMap<String, ExecutableElement>();
void register(TypeElement classElement) {
HashMap<Integer, ExecutableElement> map = new HashMap<Integer, ExecutableElement>();
requestMap.put(classElement, map);
for (Element enclosedElement : classElement.getEnclosedElements()) {
if (!enclosedElement.getKind().equals(ElementKind.METHOD)) {
Expand All @@ -178,7 +181,7 @@ public void register(TypeElement classElement) {

final Request request = methodElement.getAnnotation(Request.class);
if (request != null) {
String id = CodeGenerationUtils.mergeIds(masterId, request.id());
Integer id = Integer.parseInt(CodeGenerationUtils.mergeIds(masterId, request.id()), 16);
map.put(id, methodElement);
continue;
}
Expand All @@ -196,16 +199,17 @@ public void register(TypeElement classElement) {
}
}

private Map<TypeElement, Map<String, CodecModel>> createAllCodecModel(Lang lang) {
Map<TypeElement, Map<String, CodecModel>> model = new HashMap<TypeElement, Map<String, CodecModel>>();
private Map<TypeElement, Map<Integer, CodecModel>> createAllCodecModel(Lang lang) {
Map model = new TreeMap<TypeElement, Map<Integer, CodecModel>>(new DistributedObjectComparator());

for (Map.Entry<TypeElement, Map<String, ExecutableElement>> entry : requestMap.entrySet()) {
HashMap<String, CodecModel> map = new HashMap<String, CodecModel>();
for (Map.Entry<TypeElement, Map<Integer, ExecutableElement>> entry : requestMap.entrySet()) {
Map<Integer, CodecModel> map = new TreeMap<Integer, CodecModel>();
TypeElement parent = entry.getKey();
model.put(parent, map);


for (Map.Entry<String, ExecutableElement> entrySub : entry.getValue().entrySet()) {
Map<Integer, ExecutableElement> operationMap = entry.getValue();
for (Map.Entry<Integer, ExecutableElement> entrySub : operationMap.entrySet()) {
ExecutableElement methodElement = entrySub.getValue();
CodecModel codecModel = createCodecModel(methodElement, lang);
String docComment = elementUtils.getDocComment(methodElement);
Expand Down Expand Up @@ -258,9 +262,9 @@ public void generateCodec(CodecModel codecModel, Template codecTemplate) {
}
}

public void generateDoc(Object model, Template codecTemplate) {
void generateDoc(Map<TypeElement, Map<Integer, CodecModel>> model, Template codecTemplate) {
final String content = generateFromTemplate(codecTemplate, model);
saveFile("protocol.md" , "document", content);
saveFile("protocol.md", "document", content);
}

private void generateMessageTypeEnum(TypeElement classElement, Lang lang, Template messageTypeTemplate) {
Expand All @@ -269,7 +273,7 @@ private void generateMessageTypeEnum(TypeElement classElement, Lang lang, Templa
return;
}
final String content = generateFromTemplate(messageTypeTemplate, model);
saveContent(model,content);
saveContent(model, content);
}

private String generateFromTemplate(Template template, Object model) {
Expand Down Expand Up @@ -329,4 +333,20 @@ public static void setUtilModel(Map modelMap)
TemplateHashModel statics = (TemplateHashModel) staticModels.get(CodeGenerationUtils.class.getName());
modelMap.put("util", statics);
}

private static class DistributedObjectComparator
implements Comparator<TypeElement>, Serializable {

@Override
public int compare(TypeElement o1, TypeElement o2) {
GenerateCodec annotationForKey1 = o1.getAnnotation(GenerateCodec.class);
GenerateCodec annotationForKey2 = o2.getAnnotation(GenerateCodec.class);
if (annotationForKey1.id() == annotationForKey2.id()) {
return annotationForKey1.name().compareTo(annotationForKey2.name());
} else {
return annotationForKey1.id() - annotationForKey2.id();
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class CodecModel implements Model{
static final Map<String, TypeElement> CUSTOM_CODEC_MAP = new HashMap<String, TypeElement>();

private final Lang lang;
private short requestId;
private String id;
private String name;
private String className;
Expand Down Expand Up @@ -153,9 +154,9 @@ public CodecModel(TypeElement parent, ExecutableElement methodElement, Executabl
this.lang = lang;

name = methodElement.getSimpleName().toString();
short requestId = methodElement.getAnnotation(Request.class).id();
requestId = methodElement.getAnnotation(Request.class).id();
short masterId = parent.getAnnotation(GenerateCodec.class).id();
id = CodeGenerationUtils.mergeIds(masterId, requestId);
id = CodeGenerationUtils.addHexPrefix(CodeGenerationUtils.mergeIds(masterId, requestId));
parentName = parent.getAnnotation(GenerateCodec.class).name();
className =
CodeGenerationUtils.capitalizeFirstLetter(parentName) + CodeGenerationUtils.capitalizeFirstLetter(name) + "Codec";
Expand Down Expand Up @@ -230,6 +231,10 @@ public Lang getLang() {
return lang;
}

public short getRequestId() {
return requestId;
}

public String getId() {
return id;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public MessageTypeEnumModel(TypeElement classElement, Lang lang) {
ParameterModel pm = new ParameterModel();
pm.name = methodElement.getSimpleName().toString();
if (annotation1 != null) {
pm.id = CodeGenerationUtils.mergeIds(masterId, annotation1.id());
pm.id = CodeGenerationUtils.addHexPrefix(CodeGenerationUtils.mergeIds(masterId, annotation1.id()));
params.add(pm);
}
}
Expand Down Expand Up @@ -108,5 +108,23 @@ public String getId() {
return id;
}

@Override
public String toString() {
return "ParameterModel{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
"}\n";
}
}

@Override
public String toString() {
return "MessageTypeEnumModel{" +
"lang=" + lang +
", name='" + name + '\'' +
", className='" + className + '\'' +
", packageName='" + packageName + '\'' +
", params=" + params +
'}';
}
}

0 comments on commit 12ce754

Please sign in to comment.