All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.walkmod.sonar.visitors.SonarVisitor Maven / Gradle / Ivy

package org.walkmod.sonar.visitors;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.walkmod.javalang.ast.CompilationUnit;
import org.walkmod.javalang.compiler.symbols.RequiresSemanticAnalysis;
import org.walkmod.javalang.visitors.VoidVisitorAdapter;
import org.walkmod.walkers.VisitorContext;

import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import com.mashape.unirest.request.HttpRequest;

@RequiresSemanticAnalysis(optional = true)

@SuppressWarnings("rawtypes")
public class SonarVisitor extends VoidVisitorAdapter {

    private String authToken;

    private String qualityProfile = "Sonar way";

    private String sonarHost = "https://sonarqube.com";

    private List ruleSet = null;

    private List visitors = null;

    @SuppressWarnings("unchecked")
    @Override
    public void visit(CompilationUnit n, VisitorContext vc) {

        List visitors = getVisitors(vc);
        for (VoidVisitorAdapter visitor : visitors) {
            visitor.visit(n, vc);

        }
    }

    public List getRuleSet() {
        if (ruleSet == null) {
            String[] urls = new String[] { "api/qualityprofiles/export", "api/profiles/index", "api/profiles" };
            String response = null;
            try {
                for (int i = 0; i < urls.length && response == null; i++) {
                    response = getProfile(urls[i]);
                }
                if (response != null) {
                   
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document xml = dBuilder.parse(new ByteArrayInputStream(response.getBytes()));
                    ruleSet = parseXML(xml);
                }

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return ruleSet;
    }

    public List getVisitors(VisitorContext ctx) {
        if (visitors == null) {
            visitors = new LinkedList();
            List ruleSet = getRuleSet();
            Properties properties = new Properties();
            try {
                properties.load(ctx.getClassLoader().getResourceAsStream("sonar-fixings.properties"));
            } catch (IOException e1) {
                throw new RuntimeException(e1);
            }
            for (String rule : ruleSet) {

                Object o = null;
                try {
                    if (properties.containsKey(rule)) {

                        Class c = Class.forName("org.walkmod.sonar.visitors." + properties.getProperty(rule), true,
                                ctx.getClassLoader());
                        o = c.newInstance();
                        visitors.add((VoidVisitorAdapter) o);
                    }
                } catch (Exception e) {
                }
            }
        }
        return visitors;
    }

    protected List parseXML(Document xml) {
        List rules = new LinkedList();
        NodeList children = xml.getDocumentElement().getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node child = children.item(i);
            if ("rules".equals(child.getNodeName())) {
                NodeList ruleNodes = child.getChildNodes();
                for (int j = 0; j < ruleNodes.getLength(); j++) {
                    Node ruleNode = ruleNodes.item(j);
                    NodeList attrList = ruleNode.getChildNodes();

                    for (int k = 0; k < attrList.getLength(); k++) {
                        Node attrNode = attrList.item(k);
                        if ("key".equals(attrNode.getNodeName())) {
                            rules.add(attrNode.getTextContent());
                        }
                    }

                }
            }
        }
        return rules;
    }

    protected String getProfile(String url) throws UnirestException {
        if (!sonarHost.endsWith("/")) {
            sonarHost += "/";
        }

        HttpRequest request = Unirest.get(sonarHost + url).queryString("language", "java")
                .queryString("name", qualityProfile).basicAuth(authToken, "");
        int code = request.asBinary().getStatus();
        if (code == 200) {
            return request.asString().getBody();
        }
        return null;
    }

    public String getAuthToken() {
        return authToken;
    }

    public void setAuthToken(String authToken) {
        this.authToken = authToken;
    }

    public String getQualityProfile() {
        return qualityProfile;
    }

    public void setQualityProfile(String qualityProfile) {
        this.qualityProfile = qualityProfile;
    }

    public String getSonarHost() {
        return sonarHost;
    }

    public void setSonarHost(String sonarHost) {
        this.sonarHost = sonarHost;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy