/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2015 Wisdom Framework * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.wisdom.source.ast.util; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.expr.MemberValuePair; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import static java.util.Collections.singleton; /** * A set of function that helps to extract various entity from the javaparser AST. * * @author barjo */ public class ExtractUtil implements NameConstant { /** * Hide implicit public constructor. */ private ExtractUtil(){ } /** * Extract the String value of the <code>node</code>. * It removes the {@literal "} * * @param node The java node which value to convert into string * @return string version of the node value. */ public static String asString(Node node){ String string = node.toString(); if("\"\"".equals(string)){ return ""; } return string.substring(1,string.length()-1); } /** * <p> * Extract the String value for each child of the <code>node</code> or the node itself if it does not * have children. * </p> * * <p>It removes the {@literal "}.</p> * @param node The java node which children or value to convert into a list of string. * @return list of the node children string value or singleton list with the value of the node if no children. */ public static Set<String> asStringSet(Node node){ if(node.getChildrenNodes() == null || node.getChildrenNodes().isEmpty()){ return singleton(asString(node)); } Set<String> list = new LinkedHashSet<>(node.getChildrenNodes().size()); for(Node child: node.getChildrenNodes()){ list.add(asString(child)); } return list; } /** * Return the body samples as String from a JavaDoc comment block. * * @param jdoc The javadoc block comment. * @return the body samples as String */ public static Set<String> extractBodySample(JavadocComment jdoc){ return extractDocAnnotation(DOC_BODY_SAMPLE,jdoc); } /** * Get a text description from JavaDoc block comment. * * @param jdoc the javadoc block comment. * @return The description as String. */ public static String extractDescription(JavadocComment jdoc){ String content = jdoc.getContent().replaceAll("\n[ \t]+\\* ?","\n"); //remove the * at the beginning of a line int end = content.indexOf("\n@"); //look for the first annotation //The first charater is always a new line if(end>0) { return content.substring(1, end).trim(); } return content.substring(1).trim(); } /** * Get the value of a {@link MemberValuePair} present in a list from its name. * * @param pairs The list of MemberValuePair * @param name The name of the MemberValuePair we want to get the value from. * @return The value of the MemberValuePair of given name, or null if it's not present in the list. */ public static String extractValueByName(List<MemberValuePair> pairs, String name){ for(MemberValuePair pair : pairs){ if(pair.getName().equals(name)){ return pair.getValue().toString(); } } return null; } /** * <p> * Extract the content of a doc annotation. The content is always handle as a string. * The javadoc * and all tabs/space before it are removed as well as the first space after it if present. * </p> * * <p> * The end of the annotation content is either the end of the content block or the start of an other annotation. * (i.e it reach a <code>\n@</code> string. * </p> * * @param anno The annotation we are looking for. (must start with @) * @param jdoc The javadoc block from were the content will be extracted. * @return the content of the annotation, one entry in the list for each annotation encountered. */ public static Set<String> extractDocAnnotation(String anno, JavadocComment jdoc){ String content = jdoc.getContent().replaceAll("\n[ \t]+\\* ?","\n"); //remove the * at the beginning of a line Set<String> result = new LinkedHashSet<>(); while(content.contains(anno)){ int begin = content.indexOf(anno)+ (anno).length(); int end = content.indexOf("\n@",begin); //next annotation if(end > 0){ result.add(content.substring(begin,end).trim()); content = content.substring(end); }else { result.add(content.substring(begin).trim()); content = ""; //no more } } return result; } }