Search in sources :

Example 1 with JavaType

use of org.jboss.forge.roaster.model.JavaType in project camel by apache.

the class ValidateMojo method execute.

// CHECKSTYLE:OFF
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
    CamelCatalog catalog = new DefaultCamelCatalog();
    // add activemq as known component
    catalog.addComponent("activemq", "org.apache.activemq.camel.component.ActiveMQComponent");
    // enable did you mean
    catalog.setSuggestionStrategy(new LuceneSuggestionStrategy());
    // enable loading other catalog versions dynamically
    catalog.setVersionManager(new MavenVersionManager());
    // enable caching
    catalog.enableCache();
    if (downloadVersion) {
        String catalogVersion = catalog.getCatalogVersion();
        String version = findCamelVersion(project);
        if (version != null && !version.equals(catalogVersion)) {
            // the project uses a different Camel version so attempt to load it
            getLog().info("Downloading Camel version: " + version);
            boolean loaded = catalog.loadVersion(version);
            if (!loaded) {
                getLog().warn("Error downloading Camel version: " + version);
            }
        }
    }
    // if using the same version as the camel-maven-plugin we must still load it
    if (catalog.getLoadedVersion() == null) {
        catalog.loadVersion(catalog.getCatalogVersion());
    }
    if (catalog.getLoadedVersion() != null) {
        getLog().info("Using Camel version: " + catalog.getLoadedVersion());
    } else {
        // force load version from the camel-maven-plugin
        getLog().info("Using Camel version: " + catalog.getCatalogVersion());
    }
    List<CamelEndpointDetails> endpoints = new ArrayList<>();
    List<CamelSimpleExpressionDetails> simpleExpressions = new ArrayList<>();
    Set<File> javaFiles = new LinkedHashSet<File>();
    Set<File> xmlFiles = new LinkedHashSet<File>();
    // find all java route builder classes
    if (includeJava) {
        List list = project.getCompileSourceRoots();
        for (Object obj : list) {
            String dir = (String) obj;
            findJavaFiles(new File(dir), javaFiles);
        }
        if (includeTest) {
            list = project.getTestCompileSourceRoots();
            for (Object obj : list) {
                String dir = (String) obj;
                findJavaFiles(new File(dir), javaFiles);
            }
        }
    }
    // find all xml routes
    if (includeXml) {
        List list = project.getResources();
        for (Object obj : list) {
            Resource dir = (Resource) obj;
            findXmlFiles(new File(dir.getDirectory()), xmlFiles);
        }
        if (includeTest) {
            list = project.getTestResources();
            for (Object obj : list) {
                Resource dir = (Resource) obj;
                findXmlFiles(new File(dir.getDirectory()), xmlFiles);
            }
        }
    }
    for (File file : javaFiles) {
        if (matchFile(file)) {
            try {
                List<CamelEndpointDetails> fileEndpoints = new ArrayList<>();
                List<CamelSimpleExpressionDetails> fileSimpleExpressions = new ArrayList<>();
                List<String> unparsable = new ArrayList<>();
                // parse the java source code and find Camel RouteBuilder classes
                String fqn = file.getPath();
                String baseDir = ".";
                JavaType out = Roaster.parse(file);
                // we should only parse java classes (not interfaces and enums etc)
                if (out != null && out instanceof JavaClassSource) {
                    JavaClassSource clazz = (JavaClassSource) out;
                    RouteBuilderParser.parseRouteBuilderEndpoints(clazz, baseDir, fqn, fileEndpoints, unparsable, includeTest);
                    RouteBuilderParser.parseRouteBuilderSimpleExpressions(clazz, baseDir, fqn, fileSimpleExpressions);
                    // add what we found in this file to the total list
                    endpoints.addAll(fileEndpoints);
                    simpleExpressions.addAll(fileSimpleExpressions);
                    // was there any unparsable?
                    if (logUnparseable && !unparsable.isEmpty()) {
                        for (String uri : unparsable) {
                            getLog().warn("Cannot parse endpoint uri " + uri + " in java file " + file);
                        }
                    }
                }
            } catch (Exception e) {
                getLog().warn("Error parsing java file " + file + " code due " + e.getMessage(), e);
            }
        }
    }
    for (File file : xmlFiles) {
        if (matchFile(file)) {
            try {
                List<CamelEndpointDetails> fileEndpoints = new ArrayList<>();
                List<CamelSimpleExpressionDetails> fileSimpleExpressions = new ArrayList<>();
                // parse the xml source code and find Camel routes
                String fqn = file.getPath();
                String baseDir = ".";
                InputStream is = new FileInputStream(file);
                XmlRouteParser.parseXmlRouteEndpoints(is, baseDir, fqn, fileEndpoints);
                is.close();
                // need a new stream
                is = new FileInputStream(file);
                XmlRouteParser.parseXmlRouteSimpleExpressions(is, baseDir, fqn, fileSimpleExpressions);
                is.close();
                // add what we found in this file to the total list
                endpoints.addAll(fileEndpoints);
                simpleExpressions.addAll(fileSimpleExpressions);
            } catch (Exception e) {
                getLog().warn("Error parsing xml file " + file + " code due " + e.getMessage(), e);
            }
        }
    }
    int endpointErrors = 0;
    int unknownComponents = 0;
    int incapableErrors = 0;
    for (CamelEndpointDetails detail : endpoints) {
        getLog().debug("Validating endpoint: " + detail.getEndpointUri());
        EndpointValidationResult result = catalog.validateEndpointProperties(detail.getEndpointUri(), ignoreLenientProperties);
        boolean ok = result.isSuccess();
        if (!ok && ignoreUnknownComponent && result.getUnknownComponent() != null) {
            // if we failed due unknown component then be okay if we should ignore that
            unknownComponents++;
            ok = true;
        }
        if (!ok && ignoreIncapable && result.getIncapable() != null) {
            // if we failed due incapable then be okay if we should ignore that
            incapableErrors++;
            ok = true;
        }
        if (!ok) {
            if (result.getUnknownComponent() != null) {
                unknownComponents++;
            } else if (result.getIncapable() != null) {
                incapableErrors++;
            } else {
                endpointErrors++;
            }
            StringBuilder sb = new StringBuilder();
            sb.append("Endpoint validation error at: ");
            if (detail.getClassName() != null && detail.getLineNumber() != null) {
                // this is from java code
                sb.append(detail.getClassName());
                if (detail.getMethodName() != null) {
                    sb.append(".").append(detail.getMethodName());
                }
                sb.append("(").append(asSimpleClassName(detail.getClassName())).append(".java:");
                sb.append(detail.getLineNumber()).append(")");
            } else if (detail.getLineNumber() != null) {
                // this is from xml
                String fqn = stripRootPath(asRelativeFile(detail.getFileName()));
                if (fqn.endsWith(".xml")) {
                    fqn = fqn.substring(0, fqn.length() - 4);
                    fqn = asPackageName(fqn);
                }
                sb.append(fqn);
                sb.append("(").append(asSimpleClassName(fqn)).append(".xml:");
                sb.append(detail.getLineNumber()).append(")");
            } else {
                sb.append(detail.getFileName());
            }
            sb.append("\n\n");
            String out = result.summaryErrorMessage(false);
            sb.append(out);
            sb.append("\n\n");
            getLog().warn(sb.toString());
        } else if (showAll) {
            StringBuilder sb = new StringBuilder();
            sb.append("Endpoint validation passsed at: ");
            if (detail.getClassName() != null && detail.getLineNumber() != null) {
                // this is from java code
                sb.append(detail.getClassName());
                if (detail.getMethodName() != null) {
                    sb.append(".").append(detail.getMethodName());
                }
                sb.append("(").append(asSimpleClassName(detail.getClassName())).append(".java:");
                sb.append(detail.getLineNumber()).append(")");
            } else if (detail.getLineNumber() != null) {
                // this is from xml
                String fqn = stripRootPath(asRelativeFile(detail.getFileName()));
                if (fqn.endsWith(".xml")) {
                    fqn = fqn.substring(0, fqn.length() - 4);
                    fqn = asPackageName(fqn);
                }
                sb.append(fqn);
                sb.append("(").append(asSimpleClassName(fqn)).append(".xml:");
                sb.append(detail.getLineNumber()).append(")");
            } else {
                sb.append(detail.getFileName());
            }
            sb.append("\n");
            sb.append("\n\t").append(result.getUri());
            sb.append("\n\n");
            getLog().info(sb.toString());
        }
    }
    String endpointSummary;
    if (endpointErrors == 0) {
        int ok = endpoints.size() - endpointErrors - incapableErrors - unknownComponents;
        endpointSummary = String.format("Endpoint validation success: (%s = passed, %s = invalid, %s = incapable, %s = unknown components)", ok, endpointErrors, incapableErrors, unknownComponents);
    } else {
        int ok = endpoints.size() - endpointErrors - incapableErrors - unknownComponents;
        endpointSummary = String.format("Endpoint validation error: (%s = passed, %s = invalid, %s = incapable, %s = unknown components)", ok, endpointErrors, incapableErrors, unknownComponents);
    }
    if (endpointErrors > 0) {
        getLog().warn(endpointSummary);
    } else {
        getLog().info(endpointSummary);
    }
    int simpleErrors = 0;
    for (CamelSimpleExpressionDetails detail : simpleExpressions) {
        SimpleValidationResult result;
        boolean predicate = detail.isPredicate();
        if (predicate) {
            getLog().debug("Validating simple predicate: " + detail.getSimple());
            result = catalog.validateSimplePredicate(detail.getSimple());
        } else {
            getLog().debug("Validating simple expression: " + detail.getSimple());
            result = catalog.validateSimpleExpression(detail.getSimple());
        }
        if (!result.isSuccess()) {
            simpleErrors++;
            StringBuilder sb = new StringBuilder();
            sb.append("Simple validation error at: ");
            if (detail.getClassName() != null && detail.getLineNumber() != null) {
                // this is from java code
                sb.append(detail.getClassName());
                if (detail.getMethodName() != null) {
                    sb.append(".").append(detail.getMethodName());
                }
                sb.append("(").append(asSimpleClassName(detail.getClassName())).append(".java:");
                sb.append(detail.getLineNumber()).append(")");
            } else if (detail.getLineNumber() != null) {
                // this is from xml
                String fqn = stripRootPath(asRelativeFile(detail.getFileName()));
                if (fqn.endsWith(".xml")) {
                    fqn = fqn.substring(0, fqn.length() - 4);
                    fqn = asPackageName(fqn);
                }
                sb.append(fqn);
                sb.append("(").append(asSimpleClassName(fqn)).append(".xml:");
                sb.append(detail.getLineNumber()).append(")");
            } else {
                sb.append(detail.getFileName());
            }
            sb.append("\n");
            String[] lines = result.getError().split("\n");
            for (String line : lines) {
                sb.append("\n\t").append(line);
            }
            sb.append("\n");
            getLog().warn(sb.toString());
        } else if (showAll) {
            StringBuilder sb = new StringBuilder();
            sb.append("Simple validation passed at: ");
            if (detail.getClassName() != null && detail.getLineNumber() != null) {
                // this is from java code
                sb.append(detail.getClassName());
                if (detail.getMethodName() != null) {
                    sb.append(".").append(detail.getMethodName());
                }
                sb.append("(").append(asSimpleClassName(detail.getClassName())).append(".java:");
                sb.append(detail.getLineNumber()).append(")");
            } else if (detail.getLineNumber() != null) {
                // this is from xml
                String fqn = stripRootPath(asRelativeFile(detail.getFileName()));
                if (fqn.endsWith(".xml")) {
                    fqn = fqn.substring(0, fqn.length() - 4);
                    fqn = asPackageName(fqn);
                }
                sb.append(fqn);
                sb.append("(").append(asSimpleClassName(fqn)).append(".xml:");
                sb.append(detail.getLineNumber()).append(")");
            } else {
                sb.append(detail.getFileName());
            }
            sb.append("\n");
            sb.append("\n\t").append(result.getSimple());
            sb.append("\n\n");
            getLog().info(sb.toString());
        }
    }
    String simpleSummary;
    if (simpleErrors == 0) {
        int ok = simpleExpressions.size() - simpleErrors;
        simpleSummary = String.format("Simple validation success: (%s = passed, %s = invalid)", ok, simpleErrors);
    } else {
        int ok = simpleExpressions.size() - simpleErrors;
        simpleSummary = String.format("Simple validation error: (%s = passed, %s = invalid)", ok, simpleErrors);
    }
    if (failOnError && (endpointErrors > 0 || simpleErrors > 0)) {
        throw new MojoExecutionException(endpointSummary + "\n" + simpleSummary);
    }
    if (simpleErrors > 0) {
        getLog().warn(simpleSummary);
    } else {
        getLog().info(simpleSummary);
    }
}
Also used : MavenVersionManager(org.apache.camel.catalog.maven.MavenVersionManager) CamelEndpointDetails(org.apache.camel.parser.model.CamelEndpointDetails) LinkedHashSet(java.util.LinkedHashSet) ArrayList(java.util.ArrayList) LuceneSuggestionStrategy(org.apache.camel.catalog.lucene.LuceneSuggestionStrategy) ArrayList(java.util.ArrayList) List(java.util.List) SimpleValidationResult(org.apache.camel.catalog.SimpleValidationResult) DefaultCamelCatalog(org.apache.camel.catalog.DefaultCamelCatalog) CamelCatalog(org.apache.camel.catalog.CamelCatalog) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Resource(org.apache.maven.model.Resource) JavaClassSource(org.jboss.forge.roaster.model.source.JavaClassSource) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) MojoFailureException(org.apache.maven.plugin.MojoFailureException) FileInputStream(java.io.FileInputStream) JavaType(org.jboss.forge.roaster.model.JavaType) EndpointValidationResult(org.apache.camel.catalog.EndpointValidationResult) DefaultCamelCatalog(org.apache.camel.catalog.DefaultCamelCatalog) CamelSimpleExpressionDetails(org.apache.camel.parser.model.CamelSimpleExpressionDetails) File(java.io.File)

Aggregations

File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 LinkedHashSet (java.util.LinkedHashSet)1 List (java.util.List)1 CamelCatalog (org.apache.camel.catalog.CamelCatalog)1 DefaultCamelCatalog (org.apache.camel.catalog.DefaultCamelCatalog)1 EndpointValidationResult (org.apache.camel.catalog.EndpointValidationResult)1 SimpleValidationResult (org.apache.camel.catalog.SimpleValidationResult)1 LuceneSuggestionStrategy (org.apache.camel.catalog.lucene.LuceneSuggestionStrategy)1 MavenVersionManager (org.apache.camel.catalog.maven.MavenVersionManager)1 CamelEndpointDetails (org.apache.camel.parser.model.CamelEndpointDetails)1 CamelSimpleExpressionDetails (org.apache.camel.parser.model.CamelSimpleExpressionDetails)1 Resource (org.apache.maven.model.Resource)1 MojoExecutionException (org.apache.maven.plugin.MojoExecutionException)1 MojoFailureException (org.apache.maven.plugin.MojoFailureException)1 JavaType (org.jboss.forge.roaster.model.JavaType)1 JavaClassSource (org.jboss.forge.roaster.model.source.JavaClassSource)1