You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mnemonic.apache.org by ga...@apache.org on 2017/12/12 01:52:38 UTC

mnemonic git commit: MNEMONIC-420: Create a static version of function getNativeFieldInfo() in durable class

Repository: mnemonic
Updated Branches:
  refs/heads/master 35f59c403 -> b8124fa70


MNEMONIC-420: Create a static version of function getNativeFieldInfo() in durable class


Project: http://git-wip-us.apache.org/repos/asf/mnemonic/repo
Commit: http://git-wip-us.apache.org/repos/asf/mnemonic/commit/b8124fa7
Tree: http://git-wip-us.apache.org/repos/asf/mnemonic/tree/b8124fa7
Diff: http://git-wip-us.apache.org/repos/asf/mnemonic/diff/b8124fa7

Branch: refs/heads/master
Commit: b8124fa702fdde33eae4f66b620a5aadbb2cdd31
Parents: 35f59c4
Author: paleyss <pa...@gmail.com>
Authored: Sun Dec 10 22:40:30 2017 -0800
Committer: paleyss <pa...@gmail.com>
Committed: Sun Dec 10 22:40:30 2017 -0800

----------------------------------------------------------------------
 .../mnemonic/AnnotatedDurableEntityClass.java   | 81 ++++++++++++++++++++
 1 file changed, 81 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mnemonic/blob/b8124fa7/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
----------------------------------------------------------------------
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java b/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
index bf49062..72a640e 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
@@ -117,6 +117,7 @@ public class AnnotatedDurableEntityClass {
 
   private Map<String, List<MethodInfo>> m_durablemtdinfo = new HashMap<String, List<MethodInfo>>();
   private Map<String, MethodInfo> m_entitymtdinfo = new HashMap<String, MethodInfo>();
+  private Map<String, MethodInfo> m_extramtdinfo = new HashMap<String, MethodInfo>();
 
   private long computeTypeSize(TypeName tname) throws AnnotationProcessingException {
     long ret = 0L;
@@ -197,6 +198,8 @@ public class AnnotatedDurableEntityClass {
     m_entitymtdinfo.put("initializeDurableEntity", new MethodInfo());
     m_entitymtdinfo.put("createDurableEntity", new MethodInfo());
     m_entitymtdinfo.put("restoreDurableEntity", new MethodInfo());
+    
+    m_extramtdinfo.put("getNativeFieldInfo_static", new MethodInfo());
 
   }
 
@@ -355,9 +358,69 @@ public class AnnotatedDurableEntityClass {
         }
       }
     }
+
+    if (m_extramtdinfo.containsKey("getNativeFieldInfo_static")) {
+      methodinfo = m_extramtdinfo.get("getNativeFieldInfo_static");
+      assert null != methodinfo;
+      assert m_durablemtdinfo.containsKey("getNativeFieldInfo");
+      MethodInfo mi = m_durablemtdinfo.get("getNativeFieldInfo").get(0);
+      assert null != mi;
+      methodinfo.elem = mi.elem;
+      methodinfo.specbuilder = createFrom(mi.elem, "getNativeFieldInfo_static")
+              .addModifiers(Modifier.STATIC);
+    }
+
     genNFieldInfo();
   }
 
+  public static Builder createFrom(ExecutableElement method, String methodName) {
+
+    Set<Modifier> modifiers = method.getModifiers();
+    if (modifiers.contains(Modifier.PRIVATE)
+            || modifiers.contains(Modifier.FINAL)
+            || modifiers.contains(Modifier.STATIC)) {
+      throw new IllegalArgumentException("cannot override method with modifiers: " + modifiers);
+    }
+
+    MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(methodName);
+
+    for (AnnotationMirror mirror : method.getAnnotationMirrors()) {
+      AnnotationSpec annotationSpec = AnnotationSpec.get(mirror);
+      methodBuilder.addAnnotation(annotationSpec);
+    }
+
+    modifiers = new LinkedHashSet<>(modifiers);
+    modifiers.remove(Modifier.ABSTRACT);
+    methodBuilder.addModifiers(modifiers);
+
+    for (TypeParameterElement typeParameterElement : method.getTypeParameters()) {
+      TypeVariable var = (TypeVariable) typeParameterElement.asType();
+      methodBuilder.addTypeVariable(TypeVariableName.get(var));
+    }
+
+    methodBuilder.returns(TypeName.get(method.getReturnType()));
+
+    List<? extends VariableElement> parameters = method.getParameters();
+    for (VariableElement parameter : parameters) {
+      TypeName type = TypeName.get(parameter.asType());
+      String name = parameter.getSimpleName().toString();
+      Set<Modifier> parameterModifiers = parameter.getModifiers();
+      ParameterSpec.Builder parameterBuilder = ParameterSpec.builder(type, name)
+              .addModifiers(parameterModifiers.toArray(new Modifier[parameterModifiers.size()]));
+      for (AnnotationMirror mirror : parameter.getAnnotationMirrors()) {
+        parameterBuilder.addAnnotation(AnnotationSpec.get(mirror));
+      }
+      methodBuilder.addParameter(parameterBuilder.build());
+    }
+    methodBuilder.varargs(method.isVarArgs());
+
+    for (TypeMirror thrownType : method.getThrownTypes()) {
+      methodBuilder.addException(TypeName.get(thrownType));
+    }
+
+    return methodBuilder;
+  }
+
   protected String transTypeToUnsafeMethod(TypeName tname, boolean isget) throws AnnotationProcessingException {
     String ret = null;
     if (isUnboxPrimitive(tname)) {
@@ -885,6 +948,23 @@ public class AnnotatedDurableEntityClass {
     }
   }
 
+  protected void buildExtraMethodSpecs(TypeSpec.Builder typespecbuilder) throws AnnotationProcessingException {
+    MethodInfo methodinfo;
+    CodeBlock.Builder code;
+    for (String name : m_extramtdinfo.keySet()) {
+      methodinfo = m_extramtdinfo.get(name);
+      code = CodeBlock.builder();
+      switch (name) {
+        case "getNativeFieldInfo_static":
+          code.addStatement("return $1N", m_fieldsinfo.get("nfieldinfo").name);
+          break;
+        default:
+          throw new AnnotationProcessingException(null, "Method %s is not supported.", name);
+      }
+      typespecbuilder.addMethod(methodinfo.specbuilder.addCode(code.build()).build());
+    }
+  }
+
   protected void buildFieldSpecs(TypeSpec.Builder typespecbuilder, Map<String, FieldInfo> fieldinfos) {
     FieldInfo fieldinfo;
     for (String name : fieldinfos.keySet()) {
@@ -1045,6 +1125,7 @@ public class AnnotatedDurableEntityClass {
 
     buildDurableMethodSpecs(entitybuilder);
     buildEntityMethodSpecs(entitybuilder);
+    buildExtraMethodSpecs(entitybuilder);
 
     TypeSpec entityspec = entitybuilder.build();