Beispiel #1
0
  private void genConstructor(
      Refs r,
      JDefinedClass clazz,
      Collection<Ref> refs,
      Map<Ref, JFieldVar> fieldVarMap,
      JFieldVar holderListener,
      Map<Listener.Type, ListenerType> listenerTypeMap) {
    // private MyLayoutViewModel(View view) {
    JMethod constructor = clazz.constructor(PUBLIC);
    JVar viewVar = constructor.param(r.viewClass, "view");
    JBlock body = constructor.body();

    // super(view);
    body.invoke("super").arg(viewVar);

    // myLinearLayout = (LinearLayout) view.findViewById(R.id.my_linear_layout);
    // myTextView = (TextView) myLinearLayout.findViewById(R.id.my_text_view);
    genInitFields(r, fieldVarMap, viewVar, refs, body);

    // myButton.setOnClickListener((view) -> { if (_holderListener != null)
    // _holderListener.onMyButtonClick(myButton); });
    genListeners(r, fieldVarMap, holderListener, refs, body, listenerTypeMap);

    JDocComment doc = constructor.javadoc();
    doc.append(
        "Constructs a new {@link me.tatarka.holdr.Holdr} for {@link "
            + r.packageName
            + ".R.layout#"
            + r.layoutName
            + "}.");
    doc.addParam(viewVar).append("The root view to search for the holdr's views.");
  }
  private static void processPacket(
      PacketType packet, JPackage dirPackage, JCodeModel codeModel, boolean fromClient)
      throws JClassAlreadyExistsException {
    // get the packet info
    String packetName =
        (packet.getInfo() == null || packet.getInfo().getName() == null)
            ? "Unknown"
            : packet.getInfo().getName();
    String packetNamePrefixed = "P" + String.format("%03d", packet.getHeader()) + "_" + packetName;
    String packetDescription =
        (packet.getInfo() == null
                || packet.getInfo().getDescription() == null
                || packet.getInfo().getDescription().isEmpty())
            ? ""
            : "\n" + WordUtils.wrap(packet.getInfo().getDescription(), /* maximumLength */ 50);

    JDefinedClass packetClass =
        dirPackage._class(JMod.FINAL | JMod.PUBLIC, packetNamePrefixed)._extends(GWMessage.class);

    LOGGER.info("+-Processing packet: {}", packetNamePrefixed);
    LOGGER.debug("|+-Packet description: {}", packetDescription);

    StringBuilder packetJavadoc =
        new StringBuilder("Auto-generated by PacketCodeGen.").append(packetDescription);

    JDocComment jDocComment = packetClass.javadoc();
    jDocComment.add(packetJavadoc.toString());

    AtomicInteger numberOfUnknowns = new AtomicInteger(); // unknown field number

    // get all fields in this packet
    for (FieldType field : packet.getField()) {
      processField(field, packetClass, codeModel, numberOfUnknowns, fromClient);
    }

    // generate the header method
    JMethod headerMeth = packetClass.method(JMod.PUBLIC, short.class, "getHeader");
    headerMeth.annotate(Override.class);
    headerMeth.body()._return(JExpr.lit(packet.getHeader().intValue()));

    // generate getters, setters
    for (JFieldVar fieldVar : packetClass.fields().values()) {
      processAccessors(fieldVar, packetClass, fromClient);
    }

    // generate the toString method
    processToString(packetClass, codeModel);
  }
Beispiel #3
0
 /**
  * Creates a new Class with the given name
  *
  * @param name the name of the Class to create
  * @exception IllegalArgumentException when the given name is not a valid Class name
  */
 public JClass(String name) throws IllegalArgumentException {
   super(name);
   this.packageName = getPackageFromClassName(name);
   imports = new Vector();
   interfaces = new Vector();
   jdc = new JDocComment();
   constructors = new Vector();
   members = new JNamedMap();
   methods = new Vector();
   modifiers = new JModifiers();
   // -- initialize default Java doc
   jdc.addDescriptor(JDocDescriptor.createVersionDesc(version));
 } // -- JClass
  public GeneratedClass createElement(String namespace, String name)
      throws JClassAlreadyExistsException {
    String className = NameConverter.smart.toClassName(name);
    String qualifiedClassName = targetPackage + "." + NameConverter.smart.toClassName(className);
    GeneratedClass generatedClass = generatedClasses.get(qualifiedClassName);
    if (generatedClass != null) {
      return generatedClass;
    }
    JDefinedClass jDefinedClass = codeModel._class(qualifiedClassName);
    generatedClass = new GeneratedClass(codeModel, jDefinedClass);
    jDefinedClass.annotate(Root.class).param("name", name);
    jDefinedClass.annotate(Namespace.class).param("reference", namespace);
    jDefinedClass.constructor(JMod.PUBLIC);

    JDocComment jDocComment = jDefinedClass.javadoc();
    jDocComment.add(className);
    jDocComment.add("<br>\n");
    jDocComment.add("Generated using Android JAXB");
    jDocComment.add("<br>\n");
    jDocComment.add("@link https://github.com/yeshodhan/android-jaxb");

    generatedClasses.put(qualifiedClassName, generatedClass);
    return generatedClass;
  }
  private static void processField(
      FieldType field,
      JDefinedClass packetClass,
      JCodeModel codeModel,
      AtomicInteger numberOfUnknowns,
      boolean fromClient)
      throws JClassAlreadyExistsException {
    boolean isNested =
        (field.getType() == PacketSimpleTypes.OPTIONAL)
            || (field.getType() == PacketSimpleTypes.ARRAY_STATIC)
            || (field.getType() == PacketSimpleTypes.ARRAY_VAR_SMALL)
            || (field.getType() == PacketSimpleTypes.ARRAY_VAR_BIG);

    boolean isArray =
        (field.getType() == PacketSimpleTypes.BUFFER_STATIC)
            || (field.getType() == PacketSimpleTypes.BUFFER_VAR_SMALL)
            || (field.getType() == PacketSimpleTypes.BUFFER_VAR_BIG)
            || (isNested && (field.getType() != PacketSimpleTypes.OPTIONAL));

    boolean isStaticLength =
        (isArray)
            && ((field.getType() == PacketSimpleTypes.ARRAY_STATIC)
                || (field.getType() == PacketSimpleTypes.BUFFER_STATIC));

    // length is either not set for non arrays and static arrays,
    // its 1byte for small stuff and 2bytes for big stuff.
    int prefixLength =
        (!isArray || isStaticLength)
            ? -1
            : (field.getType() == PacketSimpleTypes.ARRAY_VAR_SMALL)
                    || (field.getType() == PacketSimpleTypes.BUFFER_VAR_SMALL)
                ? 1
                : 2;

    String name = "";

    if (field.getInfo() == null || field.getInfo().getName() == null) {
      // check if we got special fields...
      if (field.getType() == PacketSimpleTypes.AGENTID) {
        name = "AgentID";
      } else if (field.getType() == PacketSimpleTypes.OPTIONAL) {
        name = "Optional";
      } else {
        name = "Unknown";
      }

      name += numberOfUnknowns.incrementAndGet();
    } else {
      name = field.getInfo().getName();
    }

    String fieldName = WordUtils.uncapitalize(name);
    String fieldDescription =
        (field.getInfo() == null
                || field.getInfo().getDescription() == null
                || field.getInfo().getDescription().isEmpty())
            ? ""
            : "\n" + WordUtils.wrap(field.getInfo().getDescription(), /* maximumLength */ 50);

    JType fieldType;

    if (isNested) {
      JDefinedClass nestedClass =
          packetClass
              ._class(JMod.FINAL | JMod.STATIC | JMod.PUBLIC, "Nested" + name)
              ._implements(NestedMarker.class);

      AtomicInteger numberOfUnknownsNested = new AtomicInteger();

      for (FieldType nested : field.getField()) {
        processField(nested, nestedClass, codeModel, numberOfUnknownsNested, fromClient);
      }

      // generate getters, setters
      for (JFieldVar fieldVar : nestedClass.fields().values()) {
        processAccessors(fieldVar, nestedClass, fromClient);
      }

      processToString(nestedClass, codeModel);

      // nested classes are either arrays or optional...
      // meaning we will later have to test if they are null before reading/writing
      fieldType = isArray ? nestedClass.array() : nestedClass;
    } else {
      Class<?> fieldClass = convertFieldTypeToClass(field);
      fieldType = codeModel._ref(fieldClass);
    }

    LOGGER.debug("|+-Processing field: {}, of type: {}", fieldName, fieldType);

    // add the field
    JFieldVar packetField = packetClass.field(JMod.PRIVATE, fieldType, fieldName);

    if (fieldDescription != null && !fieldDescription.trim().equals("")) {
      JDocComment jDocComment = packetField.javadoc();
      jDocComment.add(fieldDescription);
    }

    // and dont forget array annotations if necessary
    if (isArray) {
      int size = (int) (field.getElements() == null ? -1 : field.getElements());

      packetField
          .annotate(IsArray.class)
          .param("constant", isStaticLength)
          .param("size", size)
          .param("prefixLength", prefixLength);
    }

    // or any special annotations
    if (field.getType() == PacketSimpleTypes.LONG) {
      packetField.annotate(IsInt64.class);
    }
    if (field.getType() == PacketSimpleTypes.VARINT) {
      packetField.annotate(IsVarInt.class);
    }
    if (field.getType() == PacketSimpleTypes.ASCII) {
      packetField.annotate(IsASCII.class);
    }
  }
Beispiel #6
0
  /**
   * Prints the source code for this JInterface to the given JSourceWriter
   *
   * @param jsw the JSourceWriter to print to. [May not be null]
   */
  public void print(JSourceWriter jsw, boolean classOnly) {

    if (jsw == null) {
      throw new IllegalArgumentException("argument 'jsw' should not be null.");
    }

    StringBuilder buffer = new StringBuilder();

    if (!classOnly) {
      printHeader(jsw);
      printPackageDeclaration(jsw);
      printImportDeclarations(jsw);
    }

    // ------------/
    // - Java Doc -/
    // ------------/

    getJDocComment().print(jsw);

    JAnnotations annotations = getAnnotations();
    if (annotations != null) annotations.print(jsw);

    // -- print class information
    // -- we need to add some JavaDoc API adding comments

    buffer.setLength(0);

    JModifiers modifiers = getModifiers();
    if (modifiers.isPrivate()) {
      buffer.append("private ");
    } else if (modifiers.isPublic()) {
      buffer.append("public ");
    }

    if (modifiers.isAbstract()) {
      buffer.append("abstract ");
    }

    buffer.append("interface ");
    buffer.append(getLocalName());
    jsw.writeln(buffer.toString());
    buffer.setLength(0);
    jsw.indent();

    if (getInterfaceCount() > 0) {
      Enumeration<String> e = getInterfaces();
      buffer.append("extends ");
      while (e.hasMoreElements()) {
        buffer.append(e.nextElement());
        if (e.hasMoreElements()) buffer.append(", ");
      }

      jsw.writeln(buffer.toString());
      buffer.setLength(0);
    }

    jsw.unindent();

    jsw.writeln('{');

    jsw.indent();

    // -- declare static members

    if (fields != null) {
      if (fields.size() > 0) {
        jsw.writeln();
        jsw.writeln("  //--------------------------/");
        jsw.writeln(" //- Class/Member Variables -/");
        jsw.writeln("//--------------------------/");
        jsw.writeln();
      }

      for (int i = 0; i < fields.size(); i++) {

        JField jField = (JField) fields.get(i);

        // -- print Java comment
        JDocComment comment = jField.getComment();
        if (comment != null) comment.print(jsw);

        // -- print member
        jsw.write(jField.getModifiers().toString());
        jsw.write(' ');

        JType type = jField.getType();
        String typeName = type.toString();
        // -- for esthetics use short name in some cases
        if (typeName.equals(toString())) {
          typeName = type.getLocalName();
        }
        jsw.write(typeName);
        jsw.write(' ');
        jsw.write(jField.getName());

        String init = jField.getInitString();
        if (init != null) {
          jsw.write(" = ");
          jsw.write(init);
        }

        jsw.writeln(';');
        jsw.writeln();
      }
    }

    // -- print method signatures

    if (methods.size() > 0) {
      jsw.writeln();
      jsw.writeln("  //-----------/");
      jsw.writeln(" //- Methods -/");
      jsw.writeln("//-----------/");
      jsw.writeln();
    }

    for (int i = 0; i < methods.size(); i++) {
      JMethodSignature signature = (JMethodSignature) methods.elementAt(i);
      signature.print(jsw);
      jsw.writeln(';');
    }

    for (String sourceCodeEntry : sourceCodeEntries) {
      jsw.writeln(sourceCodeEntry);
    }

    jsw.unindent();
    jsw.writeln('}');
    jsw.flush();
    jsw.close();
  } // -- printSource
Beispiel #7
0
  /**
   * Prints the source code for this JClass
   *
   * @param lineSeparator the line separator to use at the end of each line. If null, then the
   *     default line separator for the runtime platform will be used.
   */
  public void print(String lineSeparator) {

    // -- open output file
    String name = getLocalName();
    String filename = name + ".java";

    if ((packageName != null) && (packageName.length() > 0)) {
      String path = packageName.replace('.', File.separatorChar);
      File pathFile = new File(path);
      if (!pathFile.exists()) {
        pathFile.mkdirs();
      }
      filename = path + File.separator + filename;
    }

    File file = new File(filename);
    JSourceWriter jsw = null;
    try {
      jsw = new JSourceWriter(new FileWriter(file));
    } catch (java.io.IOException ioe) {
      System.out.println("unable to create class file: " + filename);
      return;
    }

    if (lineSeparator == null) {
      lineSeparator = System.getProperty("line.separator");
    }
    jsw.setLineSeparator(lineSeparator);

    StringBuffer buffer = new StringBuffer();

    // -- write class header
    if (header != null) header.print(jsw);
    else {
      jsw.writeln("/*");
      jsw.writeln(" * " + DEFAULT_HEADER);
      jsw.writeln("*/");
    }
    jsw.writeln();
    jsw.flush();

    // -- print package name
    if ((packageName != null) && (packageName.length() > 0)) {

      buffer.setLength(0);
      buffer.append("package ");
      buffer.append(packageName);
      buffer.append(';');
      jsw.writeln(buffer.toString());
      jsw.writeln();
    }

    // -- print imports
    jsw.writeln("  //---------------------------------/");
    jsw.writeln(" //- Imported classes and packages -/");
    jsw.writeln("//---------------------------------/");
    jsw.writeln();
    for (int i = 0; i < imports.size(); i++) {
      jsw.write("import ");
      jsw.write(imports.elementAt(i));
      jsw.writeln(';');
    }
    jsw.writeln();

    // ------------/
    // - Java Doc -/
    // ------------/

    jdc.print(jsw);

    // -- print class information
    // -- we need to add some JavaDoc API adding comments

    buffer.setLength(0);

    if (modifiers.isPrivate()) {
      buffer.append("private ");
    } else if (modifiers.isPublic()) {
      buffer.append("public ");
    }

    if (modifiers.isAbstract()) {
      buffer.append("abstract ");
    }

    buffer.append("class ");
    buffer.append(getLocalName());
    buffer.append(' ');
    if (superClass != null) {
      buffer.append("extends ");
      buffer.append(superClass);
      buffer.append(' ');
    }
    if (interfaces.size() > 0) {
      int iSize = interfaces.size();
      boolean endl = false;
      if ((iSize > 1) || (superClass != null)) {
        jsw.writeln(buffer.toString());
        buffer.setLength(0);
        endl = true;
      }
      buffer.append("implements ");
      for (int i = 0; i < iSize; i++) {
        if (i > 0) buffer.append(", ");
        buffer.append(interfaces.elementAt(i));
      }
      if (endl) {
        jsw.writeln(buffer.toString());
        buffer.setLength(0);
      } else buffer.append(' ');
    }

    buffer.append('{');
    jsw.writeln(buffer.toString());
    buffer.setLength(0);
    jsw.writeln();

    jsw.indent();

    // -- declare members

    if (members.size() > 0) {
      jsw.writeln();
      jsw.writeln("  //--------------------/");
      jsw.writeln(" //- Member Variables -/");
      jsw.writeln("//--------------------/");
      jsw.writeln();
    }

    for (int i = 0; i < members.size(); i++) {

      JMember jMember = (JMember) members.get(i);

      // -- print Java comment
      JDocComment comment = jMember.getComment();
      if (comment != null) comment.print(jsw);

      // -- print member
      jsw.write(jMember.getModifiers().toString());
      jsw.write(' ');

      JType type = jMember.getType();
      String typeName = type.toString();
      // -- for esthetics use short name in some cases
      if (typeName.equals(toString())) {
        typeName = type.getLocalName();
      }
      jsw.write(typeName);
      jsw.write(' ');
      jsw.write(jMember.getName());

      String init = jMember.getInitString();
      if (init != null) {
        jsw.write(" = ");
        jsw.write(init);
      }

      jsw.writeln(';');
      jsw.writeln();
    }

    // -- print constructors
    if (constructors.size() > 0) {
      jsw.writeln();
      jsw.writeln("  //----------------/");
      jsw.writeln(" //- Constructors -/");
      jsw.writeln("//----------------/");
      jsw.writeln();
    }
    for (int i = 0; i < constructors.size(); i++) {
      JConstructor jConstructor = (JConstructor) constructors.elementAt(i);
      jConstructor.print(jsw);
      jsw.writeln();
    }

    // -- print methods
    if (methods.size() > 0) {
      jsw.writeln();
      jsw.writeln("  //-----------/");
      jsw.writeln(" //- Methods -/");
      jsw.writeln("//-----------/");
      jsw.writeln();
    }

    for (int i = 0; i < methods.size(); i++) {
      JMethod jMethod = (JMethod) methods.elementAt(i);
      jMethod.print(jsw);
      jsw.writeln();
    }

    jsw.unindent();
    jsw.writeln('}');
    jsw.flush();
    jsw.close();
  } // -- printSource