Search in sources :

Example 1 with EndpointValidationResult

use of org.apache.camel.catalog.EndpointValidationResult in project camel by apache.

the class CamelCatalogLuceneTest method validateProperties.

@Test
public void validateProperties() throws Exception {
    // spell typo error
    EndpointValidationResult result = catalog.validateEndpointProperties("log:mylog?levl=WARN");
    assertFalse(result.isSuccess());
    assertTrue(result.getUnknown().contains("levl"));
    assertEquals("level", result.getUnknownSuggestions().get("levl")[0]);
    assertEquals(1, result.getNumberOfErrors());
}
Also used : EndpointValidationResult(org.apache.camel.catalog.EndpointValidationResult) Test(org.junit.Test)

Example 2 with EndpointValidationResult

use of org.apache.camel.catalog.EndpointValidationResult in project camel by apache.

the class DefaultComponentVerifier method verifyParametersAgainstCatalog.

// *************************************
// Helpers :: Parameters validation
// *************************************
protected void verifyParametersAgainstCatalog(ResultBuilder builder, Map<String, Object> parameters) {
    String scheme = defaultScheme;
    if (parameters.containsKey("scheme")) {
        scheme = parameters.get("scheme").toString();
    }
    // Grab the runtime catalog to check parameters
    RuntimeCamelCatalog catalog = camelContext.getRuntimeCamelCatalog();
    // Convert from Map<String, Object> to  Map<String, String> as required
    // by the Camel Catalog
    EndpointValidationResult result = catalog.validateProperties(scheme, parameters.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> camelContext.getTypeConverter().convertTo(String.class, e.getValue()))));
    if (!result.isSuccess()) {
        stream(result.getUnknown()).map(option -> ResultErrorBuilder.withUnknownOption(option).build()).forEach(builder::error);
        stream(result.getRequired()).map(option -> ResultErrorBuilder.withMissingOption(option).build()).forEach(builder::error);
        stream(result.getInvalidBoolean()).map(entry -> ResultErrorBuilder.withIllegalOption(entry.getKey(), entry.getValue()).build()).forEach(builder::error);
        stream(result.getInvalidInteger()).map(entry -> ResultErrorBuilder.withIllegalOption(entry.getKey(), entry.getValue()).build()).forEach(builder::error);
        stream(result.getInvalidNumber()).map(entry -> ResultErrorBuilder.withIllegalOption(entry.getKey(), entry.getValue()).build()).forEach(builder::error);
        stream(result.getInvalidEnum()).map(entry -> ResultErrorBuilder.withIllegalOption(entry.getKey(), entry.getValue()).attribute("enum.values", result.getEnumChoices(entry.getKey())).build()).forEach(builder::error);
    }
}
Also used : EndpointHelper(org.apache.camel.util.EndpointHelper) CamelContext(org.apache.camel.CamelContext) ComponentVerifier(org.apache.camel.ComponentVerifier) NoSuchOptionException(org.apache.camel.NoSuchOptionException) EndpointValidationResult(org.apache.camel.catalog.EndpointValidationResult) Supplier(java.util.function.Supplier) Collectors(java.util.stream.Collectors) TypeConverter(org.apache.camel.TypeConverter) IntrospectionSupport(org.apache.camel.util.IntrospectionSupport) Map(java.util.Map) CamelContextHelper(org.apache.camel.util.CamelContextHelper) Optional(java.util.Optional) StreamUtils.stream(org.apache.camel.util.StreamUtils.stream) RuntimeCamelCatalog(org.apache.camel.catalog.RuntimeCamelCatalog) EndpointValidationResult(org.apache.camel.catalog.EndpointValidationResult) RuntimeCamelCatalog(org.apache.camel.catalog.RuntimeCamelCatalog)

Example 3 with EndpointValidationResult

use of org.apache.camel.catalog.EndpointValidationResult 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

EndpointValidationResult (org.apache.camel.catalog.EndpointValidationResult)3 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 Map (java.util.Map)1 Optional (java.util.Optional)1 Supplier (java.util.function.Supplier)1 Collectors (java.util.stream.Collectors)1 CamelContext (org.apache.camel.CamelContext)1 ComponentVerifier (org.apache.camel.ComponentVerifier)1 NoSuchOptionException (org.apache.camel.NoSuchOptionException)1 TypeConverter (org.apache.camel.TypeConverter)1 CamelCatalog (org.apache.camel.catalog.CamelCatalog)1 DefaultCamelCatalog (org.apache.camel.catalog.DefaultCamelCatalog)1 RuntimeCamelCatalog (org.apache.camel.catalog.RuntimeCamelCatalog)1 SimpleValidationResult (org.apache.camel.catalog.SimpleValidationResult)1 LuceneSuggestionStrategy (org.apache.camel.catalog.lucene.LuceneSuggestionStrategy)1