private void buildEnumCollection() { this.enums = new HashSet<JavaType>(); BeanProperty[] properties = javaClass.getBeanProperties(true); for (int i = 0; i < properties.length; i++) { if (isValidProperty(properties[i]) && properties[i].getType().getJavaClass().isEnum()) { this.enums.add(new QDoxTypeAdapter(properties[i].getType())); } } com.thoughtworks.qdox.model.JavaMethod[] methods = javaClass.getMethods(true); for (int i = 0; i < methods.length; i++) { com.thoughtworks.qdox.model.JavaParameter[] parameters = methods[i].getParameters(); for (int j = 0; j < parameters.length; j++) { if (parameters[j].getType().getJavaClass().isEnum()) { this.enums.add(new QDoxTypeAdapter(parameters[j].getType())); } else if (parameters[j].getType().isA(LIST_TYPE) && parameters[j].getType().getActualTypeArguments() != null && parameters[j].getType().getActualTypeArguments()[0].getJavaClass().isEnum()) { this.enums.add(new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0])); } else if (parameters[j].getType().isA(MAP_TYPE) && parameters[j].getType().getActualTypeArguments() != null && parameters[j].getType().getActualTypeArguments()[0].getJavaClass().isEnum()) { this.enums.add(new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0])); } else if (parameters[j].getType().isA(MAP_TYPE) && parameters[j].getType().getActualTypeArguments() != null && parameters[j].getType().getActualTypeArguments()[1].getJavaClass().isEnum()) { this.enums.add(new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[1])); } } } }
private Document _getJavadocDocument(JavaClass javaClass) throws Exception { Element rootElement = _saxReaderUtil.createElement("javadoc"); Document document = _saxReaderUtil.createDocument(rootElement); DocUtil.add(rootElement, "name", javaClass.getName()); DocUtil.add(rootElement, "type", javaClass.getFullyQualifiedName()); _addClassCommentElement(rootElement, javaClass); _addDocletElements(rootElement, javaClass, "author"); _addDocletElements(rootElement, javaClass, "version"); _addDocletElements(rootElement, javaClass, "see"); _addDocletElements(rootElement, javaClass, "since"); _addDocletElements(rootElement, javaClass, "serial"); _addDocletElements(rootElement, javaClass, "deprecated"); JavaMethod[] javaMethods = javaClass.getMethods(); for (JavaMethod javaMethod : javaMethods) { _addMethodElement(rootElement, javaMethod); } JavaField[] javaFields = javaClass.getFields(); for (JavaField javaField : javaFields) { _addFieldElement(rootElement, javaField); } return document; }
// Checks whether a class's methods are REST methods and then places all the // methods under a specific path into the paths node private void processAllMethods( JavaClass javaClass, String resourcePath, ObjectNode paths, ArrayNode tagArray) { // map of the path to its methods represented by an ObjectNode Map<String, ObjectNode> pathMap = new HashMap<>(); javaClass .getMethods() .forEach( javaMethod -> { javaMethod .getAnnotations() .forEach( annotation -> { String name = annotation.getType().getName(); if (name.equals(POST) || name.equals(GET) || name.equals(DELETE) || name.equals(PUT)) { // substring(12) removes "javax.ws.rs." String method = annotation.getType().toString().substring(12).toLowerCase(); processRestMethod(javaMethod, method, pathMap, resourcePath, tagArray); } }); }); // for each path add its methods to the path node for (Map.Entry<String, ObjectNode> entry : pathMap.entrySet()) { paths.set(entry.getKey(), entry.getValue()); } }
private void buildXmlTypeCollection() { this.xmlTypes = new HashSet<JavaType>(); com.thoughtworks.qdox.model.JavaMethod[] methods = javaClass.getMethods(true); for (int i = 0; i < methods.length; i++) { com.thoughtworks.qdox.model.JavaParameter[] parameters = methods[i].getParameters(); for (int j = 0; j < parameters.length; j++) { if (new QDoxTypeAdapter(parameters[j].getType()).getJavaClass().isXmlType()) { this.xmlTypes.add(new QDoxTypeAdapter(parameters[j].getType())); } else if (parameters[j].getType().isA(LIST_TYPE) && parameters[j].getType().getActualTypeArguments() != null && new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0]) .getJavaClass() .isXmlType()) { this.xmlTypes.add( new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0])); } else if (parameters[j].getType().isA(MAP_TYPE) && parameters[j].getType().getActualTypeArguments() != null && new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0]) .getJavaClass() .isXmlType()) { this.xmlTypes.add( new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0])); } else if (parameters[j].getType().isA(MAP_TYPE) && parameters[j].getType().getActualTypeArguments() != null && new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[0]) .getJavaClass() .isXmlType()) { this.xmlTypes.add( new QDoxTypeAdapter(parameters[j].getType().getActualTypeArguments()[1])); } } } }
/** * Get ITestNGMethod author(s) string, or class author(s) if no method author is present. Default * return value is "unknown". * * @param className * @param method * @return * @author hzjingcheng */ private String getAuthors(String className, ITestNGMethod method) { JavaClass cls = builder.getClassByName(className); DocletTag[] authors = cls.getTagsByName("author"); // get class authors as default author name String allAuthors = ""; if (authors.length == 0) { allAuthors = "unknown"; } else { for (DocletTag author : authors) { allAuthors += author.getValue() + " "; } } // get method author name JavaMethod[] mtds = cls.getMethods(); for (JavaMethod mtd : mtds) { if (mtd.getName().equals(method.getMethodName())) { authors = mtd.getTagsByName("author"); if (authors.length != 0) { allAuthors = ""; for (DocletTag author : authors) { allAuthors += author.getValue() + " "; } } break; } } return allAuthors.trim(); }
private void buildMethodCollection() { this.methods = new ArrayList<JavaMethod>(); com.thoughtworks.qdox.model.JavaMethod[] methods = javaClass.getMethods(true); for (int i = 0; i < methods.length; i++) { this.methods.add(new QDoxMethodAdapter(methods[i], this)); } }
private String _removeJavadocFromJava(JavaClass javaClass, String content) { Set<Integer> lineNumbers = new HashSet<Integer>(); lineNumbers.add(_getJavaClassLineNumber(javaClass)); JavaMethod[] javaMethods = javaClass.getMethods(); for (JavaMethod javaMethod : javaMethods) { lineNumbers.add(javaMethod.getLineNumber()); } JavaField[] javaFields = javaClass.getFields(); for (JavaField javaField : javaFields) { lineNumbers.add(javaField.getLineNumber()); } String[] lines = StringUtil.splitLines(content); for (int lineNumber : lineNumbers) { if (lineNumber == 0) { continue; } int pos = lineNumber - 2; String line = lines[pos]; if (line == null) { continue; } line = line.trim(); if (line.endsWith("*/")) { while (true) { lines[pos] = null; if (line.startsWith("/**") || line.startsWith("/*")) { break; } line = lines[--pos].trim(); } } } StringBundler sb = new StringBundler(content.length()); for (String line : lines) { if (line != null) { sb.append(line); sb.append("\n"); } } return sb.toString().trim(); }
/** * Parses a specific class A returns an array with the methods. * * @return an array with the methods */ public JavaMethod[] getJavaMethods() { if (m_class == null && m_className == null) throw new DefinitionException("no class has been parsed, call parse(..) first"); if (m_class == null) throw new DefinitionException( "could not find source file for " + m_className + " (have you specified the correct srcDir)"); return m_class.getMethods(); }
private void _copyInterface(String parentDir, String srcFile) throws IOException { JavaClass javaClass = _getJavaClass(parentDir, srcFile); JavaMethod[] methods = javaClass.getMethods(); Arrays.sort(methods, new JavaMethodComparator()); StringMaker sm = new StringMaker(); // Package sm.append("package " + javaClass.getPackage() + ";"); // Imports sm.append("[$IMPORTS$]"); // Class declaration sm.append( "public class Copy" + javaClass.getName() + " implements " + javaClass.getName() + " {"); String varName = "_" + TextFormatter.format(javaClass.getName(), TextFormatter.I); // Methods Set imports = new TreeSet(); for (int i = 0; i < methods.length; i++) { JavaMethod javaMethod = methods[i]; String methodName = javaMethod.getName(); if (javaMethod.isPublic()) { String returnValueName = javaMethod.getReturns().getValue(); imports.add(returnValueName); sm.append( "public " + javaMethod.getReturns().getJavaClass().getName() + _getDimensions(javaMethod.getReturns()) + " " + methodName + "("); JavaParameter[] parameters = javaMethod.getParameters(); for (int j = 0; j < parameters.length; j++) { JavaParameter javaParameter = parameters[j]; sm.append( javaParameter.getType().getJavaClass().getName() + _getDimensions(javaParameter.getType()) + " " + javaParameter.getName()); imports.add(javaParameter.getType().getValue()); if ((j + 1) != parameters.length) { sm.append(", "); } } sm.append(")"); Type[] thrownExceptions = javaMethod.getExceptions(); Set newExceptions = new LinkedHashSet(); for (int j = 0; j < thrownExceptions.length; j++) { Type thrownException = thrownExceptions[j]; newExceptions.add(thrownException.getJavaClass().getName()); imports.add(thrownException.getValue()); } if (newExceptions.size() > 0) { sm.append(" throws "); Iterator itr = newExceptions.iterator(); while (itr.hasNext()) { sm.append(itr.next()); if (itr.hasNext()) { sm.append(", "); } } } sm.append("{"); if (!returnValueName.equals("void")) { sm.append("return "); } sm.append(varName + "." + methodName + "("); for (int j = 0; j < parameters.length; j++) { JavaParameter javaParameter = parameters[j]; sm.append(javaParameter.getName()); if ((j + 1) != parameters.length) { sm.append(", "); } } sm.append(");"); sm.append("}"); } } // Fields sm.append("private " + javaClass.getName() + " " + varName + ";"); // Class close brace sm.append("}"); // Imports String content = sm.toString(); sm = new StringMaker(); Iterator itr = imports.iterator(); while (itr.hasNext()) { String importClass = (String) itr.next(); if (!importClass.equals("boolean") && !importClass.equals("double") && !importClass.equals("int") && !importClass.equals("long") && !importClass.equals("short") && !importClass.equals("void")) { sm.append("import " + importClass + ";"); } } content = StringUtil.replace(content, "[$IMPORTS$]", sm.toString()); // Write file File file = new File( parentDir + "/" + StringUtil.replace(javaClass.getPackage(), ".", "/") + "/Copy" + javaClass.getName() + ".java"); ServiceBuilder.writeFile(file, content); }
private void _updateJavaFromDocument( String fileName, String originalContent, String javadocLessContent, Document document) throws Exception { String[] lines = StringUtil.splitLines(javadocLessContent); JavaClass javaClass = _getJavaClass(fileName, new UnsyncStringReader(javadocLessContent)); _updateLanguageProperties(document, javaClass.getName()); List<Tuple> ancestorJavaClassTuples = new ArrayList<Tuple>(); ancestorJavaClassTuples = _addAncestorJavaClassTuples(javaClass, ancestorJavaClassTuples); Element rootElement = document.getRootElement(); Map<Integer, String> commentsMap = new TreeMap<Integer, String>(); commentsMap.put( _getJavaClassLineNumber(javaClass), _getJavaClassComment(rootElement, javaClass)); Map<String, Element> methodElementsMap = new HashMap<String, Element>(); List<Element> methodElements = rootElement.elements("method"); for (Element methodElement : methodElements) { String methodKey = _getMethodKey(methodElement); methodElementsMap.put(methodKey, methodElement); } JavaMethod[] javaMethods = javaClass.getMethods(); for (JavaMethod javaMethod : javaMethods) { if (commentsMap.containsKey(javaMethod.getLineNumber())) { continue; } String javaMethodComment = _getJavaMethodComment(lines, methodElementsMap, javaMethod); // Handle override tag insertion if (!_hasAnnotation(javaMethod, "Override")) { if (_isOverrideMethod(javaClass, javaMethod, ancestorJavaClassTuples)) { String overrideLine = _getIndent(lines, javaMethod) + "@Override\n"; if (Validator.isNotNull(javaMethodComment)) { javaMethodComment = javaMethodComment + overrideLine; } else { javaMethodComment = overrideLine; } } } commentsMap.put(javaMethod.getLineNumber(), javaMethodComment); } Map<String, Element> fieldElementsMap = new HashMap<String, Element>(); List<Element> fieldElements = rootElement.elements("field"); for (Element fieldElement : fieldElements) { String fieldKey = _getFieldKey(fieldElement); fieldElementsMap.put(fieldKey, fieldElement); } JavaField[] javaFields = javaClass.getFields(); for (JavaField javaField : javaFields) { if (commentsMap.containsKey(javaField.getLineNumber())) { continue; } commentsMap.put( javaField.getLineNumber(), _getJavaFieldComment(lines, fieldElementsMap, javaField)); } StringBundler sb = new StringBundler(javadocLessContent.length()); for (int lineNumber = 1; lineNumber <= lines.length; lineNumber++) { String line = lines[lineNumber - 1]; String comments = commentsMap.get(lineNumber); if (comments != null) { sb.append(comments); } sb.append(line); sb.append("\n"); } String formattedContent = sb.toString().trim(); if (!originalContent.equals(formattedContent)) { File file = new File(_inputDir + fileName); _fileUtil.write(file, formattedContent.getBytes(StringPool.UTF8)); System.out.println("Writing " + file); } }
private void _updateJavaFromJavadoc(String fileName, String oldContent) throws Exception { File javadocFile = new File(_basedir + fileName + "doc"); if (!javadocFile.exists()) { return; } File file = new File(_basedir + fileName); if (oldContent == null) { oldContent = _fileUtil.read(file); } String[] lines = StringUtil.splitLines(oldContent); JavaClass javaClass = _getJavaClass(fileName, new UnsyncStringReader(oldContent)); Document document = _saxReaderUtil.read(javadocFile); Element rootElement = document.getRootElement(); Map<Integer, String> commentsMap = new TreeMap<Integer, String>(); commentsMap.put(javaClass.getLineNumber(), _getJavaClassComment(rootElement, javaClass)); Map<String, Element> methodElementsMap = new HashMap<String, Element>(); List<Element> methodElements = rootElement.elements("method"); for (Element methodElement : methodElements) { String methodKey = _getMethodKey(methodElement); methodElementsMap.put(methodKey, methodElement); } JavaMethod[] javaMethods = javaClass.getMethods(); for (JavaMethod javaMethod : javaMethods) { if (commentsMap.containsKey(javaMethod.getLineNumber())) { continue; } commentsMap.put( javaMethod.getLineNumber(), _getJavaMethodComment(lines, methodElementsMap, javaMethod)); } Map<String, Element> fieldElementsMap = new HashMap<String, Element>(); List<Element> fieldElements = rootElement.elements("field"); for (Element fieldElement : fieldElements) { String fieldKey = _getFieldKey(fieldElement); fieldElementsMap.put(fieldKey, fieldElement); } JavaField[] javaFields = javaClass.getFields(); for (JavaField javaField : javaFields) { if (commentsMap.containsKey(javaField.getLineNumber())) { continue; } commentsMap.put( javaField.getLineNumber(), _getJavaFieldComment(lines, fieldElementsMap, javaField)); } StringBuilder sb = new StringBuilder(oldContent.length()); for (int lineNumber = 1; lineNumber <= lines.length; lineNumber++) { String line = lines[lineNumber - 1]; String comments = commentsMap.get(lineNumber); if (comments != null) { sb.append(comments); } sb.append(line); sb.append("\n"); } String newContent = sb.toString().trim(); if ((oldContent == null) || !oldContent.equals(newContent)) { _fileUtil.write(file, newContent); System.out.println("Writing " + file); } }
private String _removeJavadocFromJava(String fileName, boolean log) throws Exception { File file = new File(_basedir + fileName); String oldContent = _fileUtil.read(file); String[] lines = StringUtil.splitLines(oldContent); JavaClass javaClass = _getJavaClass(fileName, new UnsyncStringReader(oldContent)); Set<Integer> lineNumbers = new HashSet<Integer>(); lineNumbers.add(javaClass.getLineNumber()); JavaMethod[] javaMethods = javaClass.getMethods(); for (JavaMethod javaMethod : javaMethods) { lineNumbers.add(javaMethod.getLineNumber()); } JavaField[] javaFields = javaClass.getFields(); for (JavaField javaField : javaFields) { lineNumbers.add(javaField.getLineNumber()); } for (int lineNumber : lineNumbers) { int pos = lineNumber - 2; String line = lines[pos].trim(); if (line.endsWith("*/")) { while (true) { lines[pos] = null; if (line.startsWith("/**")) { break; } line = lines[--pos].trim(); } } } StringBuilder sb = new StringBuilder(oldContent.length()); for (String line : lines) { if (line != null) { sb.append(line); sb.append("\n"); } } String newContent = sb.toString().trim(); if ((oldContent == null) || !oldContent.equals(newContent)) { _fileUtil.write(file, newContent); if (log) { System.out.println("Writing " + file); } } return newContent; }