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); }
/** * 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); } }
/** * 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
/** * 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