Giter Club home page Giter Club logo

camel-quarkus's Introduction

Apache Camel extensions for Quarkus

Maven Central Licensed under Apache License version 2.0 Chat on Zulip

CI Branch Status

main

Main Branch Build

camel-main

Camel Main Branch Build

quarkus-main

Quarkus Main Branch Build

What is this

This project hosts the efforts to port and package the 300+ Camel components as Quarkus extensions.

Apache Camel is the Swiss knife of integrating heterogeneous systems with more than a decade of history and a lively community of users and developers.

Getting started with Camel is user guide to start with Camel in general.

Quarkus is a Java platform offering fast boot times and low memory footprint. It targets both stock JVMs (OpenJDK in the first place) and GraalVM.

Quarkus extensions are units of Quarkus distribution. They configure, boot and integrate a technology (in our case Camel components) into your Quarkus application. You will typically use them as dependencies in your project.

How to build

See the contributor guide in the source tree or on the Apache Camel website.

Licensing

This software is licensed under the terms you may find in the file named LICENSE.txt in this directory.

camel-quarkus's People

Contributors

aldettinger avatar avano avatar cescoffier avatar claudio4j avatar davsclaus avatar dependabot[bot] avatar djcoleman avatar djencks avatar essobedo avatar ffang avatar galderz avatar github-actions[bot] avatar gnodet avatar gsmet avatar jamesnetherton avatar jiriondrusek avatar johnpoth avatar lburgazzoli avatar ldrozdo avatar llowinge avatar mkouba avatar mmuzikar avatar oscerd avatar ppalaga avatar spatnity avatar squakez avatar stuartwdouglas avatar zbendhiba avatar zhfeng avatar zregvart avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

camel-quarkus's Issues

Figure out whether the Reifier substitutions can be added conditionally

@gnodet added these substitutions in his Camel 3.0.0-M3 workign branch. I had to remove them to make the core-cdi itest pass. We should figure out whether they can be added conditionally using com.oracle.svm.core.annotate.TargetClass.onlyWith

@TargetClass(className = "org.apache.camel.reifier.ProcessorReifier")
final class Target_org_apache_camel_reifier_ProcessorReifier {

    @Alias
    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
    private static Map<Class<?>, Function<ProcessorDefinition<?>, ProcessorReifier<? extends ProcessorDefinition<?>>>> PROCESSORS = null;

}

@TargetClass(className = "org.apache.camel.reifier.dataformat.DataFormatReifier")
final class Target_org_apache_camel_reifier_dataformat_DataFormatReifier {

    @Alias
    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
    private static Map<Class<?>, Function<DataFormatDefinition, DataFormatReifier<? extends DataFormatDefinition>>> DATAFORMATS = null;

}

@TargetClass(className = "org.apache.camel.reifier.loadbalancer.LoadBalancerReifier")
final class Target_org_apache_camel_reifier_loadbalancer_LoadBalancerReifier {

    @Alias
    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
    private static Map<Class<?>, Function<LoadBalancerDefinition, LoadBalancerReifier<? extends LoadBalancerDefinition>>> LOAD_BALANCERS = null;

}

@TargetClass(className = "org.apache.camel.reifier.transformer.TransformerReifier")
final class Target_org_apache_camel_reifier_transformer_TransformerReifier {

    @Alias
    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
    private static Map<Class<?>, Function<TransformerDefinition, TransformerReifier<? extends TransformerDefinition>>> TRANSFORMERS = null;

}

@TargetClass(className = "org.apache.camel.reifier.validator.ValidatorReifier")
final class Target_org_apache_camel_reifier_validator_ValidatorReifier {

    @Alias
    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
    private static Map<Class<?>, Function<ValidatorDefinition, ValidatorReifier<? extends ValidatorDefinition>>> VALIDATORS = null;

}

Website

  • include camel-quarkus among camel's projects in the upcoming camel webside
  • create a website

camel application property routesUri is not overridden at runtime

Describe the bug
When using the camel extension, the application property quarkus.camel.routes-uris is not overridden at run time with the native executable. It should be in ConfigPhase.RUN_TIME instead of ConfigPhase.BUILD_AND_RUN_TIME_FIXED.
Original discussion here

Expected behavior
When overriding application property routes-uris with a config/application.properties file or environment variable, it should be taken into at run time by the executable.

Actual behavior
Still takes the value from the development version in resources/application.properties no matter what.

To Reproduce
Steps to reproduce the behavior:

  1. git clone https://github.com/alainpham/quarkus-kafka-camel-servlet.git
  2. cd quarkus-kafka-camel-servlet
  3. Add some configuration change regarding camel in the docker-compose.xml as environment vars file. We can try to change the url patterns or the uris to the routes.xml.
    environment:
      - 'QUARKUS_CAMEL_ROUTES_URIS=file:/camel/routessss.xml'
  1. docker-compose up
  2. The new values are not taken into account

Configuration

# Add your application.properties here, if applicable.

Screenshots
(If applicable, add screenshots to help explain your problem.)

Environment (please complete the following information):

  • Output of uname -a or ver: 3.10.0-957.21.3.el7.x86_64
  • Output of java -version:
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
  • GraalVM version (if different from Java):
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-20190523183340.buildslave.jdk8u-src-tar--b03)
OpenJDK 64-Bit GraalVM CE 19.0.2 (build 25.212-b03-jvmci-19-b04, mixed mode)
  • Quarkus version or git rev: 0.18.0

quarkus-camel - Migrate option prefixes

When using camel-quarkus we should migrate the option prefix from

  • quarkus.camel.disable-xml=true
  • quarkus.camel.disable-jaxb=true

To be using

  • camel.quarkus.xxx=yyy

Error building with caffeine on GraalVM 19.1.1 (quarkus snapshot)

Error: Detected the ForkJoinPool.commonPool() in the image heap. The common pool must be created at run time because the parallelism depends on the number of cores available at run time. Therefore the common pool used during image generation must not be reachable, e.g., via a static field that caches a copy of the common pool. The object was probably created by a class initializer and is reachable from a static field. By default, all class initialization is done during native image building.You can manually delay class initialization to image run time by using the option -H:ClassInitialization=<class-name>. Or you can write your own initialization methods and call them explicitly from your main entry point.
Detailed message:
Trace: 	object com.github.benmanes.caffeine.cache.WILMS
	object org.apache.camel.support.LRUWeakCache
	field org.apache.camel.support.IntrospectionSupport.CACHE

com.oracle.svm.core.util.UserError$UserException: Detected the ForkJoinPool.commonPool() in the image heap. The common pool must be created at run time because the parallelism depends on the number of cores available at run time. Therefore the common pool used during image generation must not be reachable, e.g., via a static field that caches a copy of the common pool. The object was probably created by a class initializer and is reachable from a static field. By default, all class initialization is done during native image building.You can manually delay class initialization to image run time by using the option -H:ClassInitialization=<class-name>. Or you can write your own initialization methods and call them explicitly from your main entry point.
Detailed message:
Trace: 	object com.github.benmanes.caffeine.cache.WILMS
	object org.apache.camel.support.LRUWeakCache
	field org.apache.camel.support.IntrospectionSupport.CACHE

	at com.oracle.svm.core.util.UserError.abort(UserError.java:75)
	at com.oracle.svm.hosted.FallbackFeature.reportAsFallback(FallbackFeature.java:216)
	at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:732)
	at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:522)
	at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:440)
	at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Detected the ForkJoinPool.commonPool() in the image heap. The common pool must be created at run time because the parallelism depends on the number of cores available at run time. Therefore the common pool used during image generation must not be reachable, e.g., via a static field that caches a copy of the common pool. The object was probably created by a class initializer and is reachable from a static field. By default, all class initialization is done during native image building.You can manually delay class initialization to image run time by using the option -H:ClassInitialization=<class-name>. Or you can write your own initialization methods and call them explicitly from your main entry point.
Detailed message:
Trace: 	object com.github.benmanes.caffeine.cache.WILMS
	object org.apache.camel.support.LRUWeakCache
	field org.apache.camel.support.IntrospectionSupport.CACHE

"Multiple consumers for the same endpoint" after renaming packages in extensions/servlet/deployment/src/test/java

Steps to reproduce:

  1. Make sure you have #23 merged in your current branch
  2. Go to extensions/servlet/deployment module and rename the packages in src/test/java from io.quarkus.camel to org.apache.camel.quarkus . See this branch: https://github.com/ppalaga/camel-quarkus/commits/i6.2
  3. mvn clean test from the top directory of the repo fails in the camel-quarkus-servlet-deployment module:
[INFO] Running org.apache.camel.quarkus.component.servlet.test.MinimalConfigTest
2019-07-02 13:33:19,038 INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
2019-07-02 13:33:20,084 INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 1046ms
2019-07-02 13:33:20,287 INFO  [org.apa.cam.imp.con.FastTypeConverterRegistry] (main) Type converters loaded (core: 183, classpath: 20)
2019-07-02 13:33:20,584 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) Apache Camel 3.0.0-M2 (CamelContext: camel-1) is starting
2019-07-02 13:33:20,584 INFO  [org.apa.cam.imp.DefaultManagementStrategy] (main) JMX is disabled
2019-07-02 13:33:20,592 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2019-07-02 13:33:20,602 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) Route: route1 started and consuming from: servlet:/custom?servletName=my-servlet
2019-07-02 13:33:20,603 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) Route: route2 started and consuming from: servlet:/hello?matchOnUriPrefix=true
2019-07-02 13:33:20,603 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) Route: route3 started and consuming from: servlet:/rest-get?httpMethodRestrict=GET
2019-07-02 13:33:20,604 INFO  [org.apa.cam.qua.cor.run.sup.FastCamelContext] (main) Route: route4 started and consuming from: servlet:/rest-post?httpMethodRestrict=POST
org.apache.camel.FailedToStartRouteException: Failed to start route route5 because of Multiple consumers for the same endpoint is not allowed: servlet:/hello?matchOnUriPrefix=true
        at org.apache.camel.impl.AbstractCamelContext.doStartOrResumeRouteConsumers(AbstractCamelContext.java:3879)
        at org.apache.camel.impl.AbstractCamelContext.doStartRouteConsumers(AbstractCamelContext.java:3855)
        at org.apache.camel.impl.AbstractCamelContext.safelyStartRouteServices(AbstractCamelContext.java:3775)
        at org.apache.camel.impl.AbstractCamelContext.doStartOrResumeRoutes(AbstractCamelContext.java:3539)
        at org.apache.camel.impl.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3391)
        at org.apache.camel.impl.AbstractCamelContext.lambda$doStart$2(AbstractCamelContext.java:3188)
        at org.apache.camel.impl.AbstractCamelContext.doWithDefinedClassLoader(AbstractCamelContext.java:3205)
        at org.apache.camel.impl.AbstractCamelContext.doStart(AbstractCamelContext.java:3186)
        at org.apache.camel.support.service.ServiceSupport.start(ServiceSupport.java:86)
        at org.apache.camel.impl.AbstractCamelContext.start(AbstractCamelContext.java:3102)
        at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.doStart(FastCamelRuntime.java:139)
        at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.start(FastCamelRuntime.java:101)
        at org.apache.camel.quarkus.core.runtime.CamelTemplate.start(CamelTemplate.java:67)
        at io.quarkus.deployment.steps.CamelInitProcessor$createRuntimeInitTask12.deploy_0(CamelInitProcessor$createRuntimeInitTask12.zig:92)
        at io.quarkus.deployment.steps.CamelInitProcessor$createRuntimeInitTask12.deploy(CamelInitProcessor$createRuntimeInitTask12.zig:36)
        at io.quarkus.runner.ApplicationImpl1.doStart(ApplicationImpl1.zig:66)
        at io.quarkus.runtime.Application.start(Application.java:84)
        at io.quarkus.runner.RuntimeRunner.run(RuntimeRunner.java:118)
        at io.quarkus.test.QuarkusUnitTest.beforeAll(QuarkusUnitTest.java:235)
        at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeBeforeAllCallbacks$8(ClassTestDescriptor.java:361)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeBeforeAllCallbacks(ClassTestDescriptor.java:361)
        at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:197)
        at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:77)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:132)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
        at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:142)
        at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:117)
        at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417)

Here is the full log on Travis attached to my fork: https://travis-ci.org/ppalaga/camel-quarkus/builds/553249660?utm_source=github_status&utm_medium=notification

There are different errors when the packages in integration tests are renamed. Let me report them here. In separate comments.

FastCamelContext.clearModel() causes NPEs at runtime

FastCamelContext.clearModel() was introducted with the upgrade to Camel 3.0.0-M3. It causes some NPEs at runtime, e.g. in org.apache.camel.reifier.errorhandler.ErrorHandlerReifier.lookupErrorHandlerFactory(RouteContext, String, boolean) or in FastCamelRuntime.dumpRoutes() because RouteContext.getRoute() returns null after FastCamelContext.clearModel() was called

Document the release process

@oscerd could you please create RELEASING.adoc or similar and document the release process there? I'd need to know that not to break the process when working on #112 . I'd especially need to know whether you use the usual release:prepare release perform sequence (with some special profiles and params?), or if you are setting the versions manually/with a shell script?

Avoid 3rd party maven repositories if possible

Noticed during build that something is downloaded from

[INFO]
[INFO] --- formatter-maven-plugin:2.8.1:format (default) @ camel-quarkus-build-parent ---
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.resources/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.expressions/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.runtime/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.osgi/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.equinox.common/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.jobs/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.equinox.registry/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.equinox.preferences/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.contenttype/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.equinox.app/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.filesystem/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.text/maven-metadata.xml
Downloading from jboss-public-repository: https://repository.jboss.org/nexus/content/groups/public/org/eclipse/platform/org.eclipse.core.commands/maven-metadata.xml
[INFO] Using 'UTF-8' encoding to format source files.
[INFO] Number of files to be formatted: 0

We should favour using only maven central as much as possible. Not sure why this maven plugin does that above.

Documentation

  • migrate doc from quarkusio here
  • update quarkusio doc to point tofdoc here

Env variable substitution doesn't work

If you run the Integration test for AWS components, where you need the environment variables, it will fail with the following error

oscerd@ghost:~/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3$ mvn clean install -Dnative -Dnative-image.docker-build=true -Dnative-image.xmx=5g  -Dnative-camel
[INFO] Scanning for projects...
[INFO] 
[INFO] ---< org.apache.camel.quarkus:camel-quarkus-integration-test-aws-s3 >---
[INFO] Building Camel Quarkus :: Integration Tests :: AWS S3 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Deleting /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/target
[INFO] 
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Skipping Rule Enforcement.
[INFO] 
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-maven-version) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Skipping Rule Enforcement.
[INFO] 
[INFO] --- gmavenplus-plugin:1.7.1:execute (test-project-sanity-checks) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Using Groovy 2.5.7 to perform execute.
[INFO] Running Groovy script from file:////home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/../test-project-sanity-checks.groovy.
[INFO] 
[INFO] --- maven-remote-resources-plugin:1.5:process (process-resource-bundles) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 3 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/src/test/resources
[INFO] Copying 3 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:3.1.0:jar (default-jar) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] Building jar: /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/target/camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- quarkus-maven-plugin:0.19.1:build (default) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Beginning quarkus augmentation
[INFO] [org.jboss.threads] JBoss Threads version 3.0.0.Beta4
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1824ms
[INFO] [io.quarkus.creator.phase.runnerjar.RunnerJarPhase] Building jar: /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/target/camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner.jar
[INFO] 
[INFO] --- quarkus-maven-plugin:0.19.1:native-image (native-image) @ camel-quarkus-integration-test-aws-s3 ---
[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] Running Quarkus native-image plugin on Java HotSpot(TM) 64-Bit Server VM
[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] docker run -v /home/oscerd/workspace/apache-camel/camel-quarkus/integration-tests/aws-s3/target:/project:z --rm --user 1000:1000 quay.io/quarkus/ubi-quarkus-native-image:19.0.2 -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:+PrintAnalysisCallTree -J-Xmx5g -H:-AddAllCharsets -H:EnableURLProtocols=http,https --enable-all-security-services -H:-SpawnIsolates -H:+JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace
[camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner:9]    classlist:   9,695.31 ms
[camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner:9]        (cap):   1,044.28 ms
[camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner:9]        setup:   2,482.74 ms
12:29:27,829 INFO  [org.apa.cam.imp.con.FastTypeConverterRegistry] Type converters loaded (core: 183, classpath: 14)
12:29:28,843 INFO  [org.jbo.threads] JBoss Threads version 3.0.0.Beta4
12:29:29,629 INFO  [org.xnio] XNIO version 3.7.2.Final
12:29:29,735 INFO  [org.xni.nio] XNIO NIO Implementation Version 3.7.2.Final
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to sun.misc.Unsafe.objectFieldOffset(Field) was detected in the static initializer of io.quarkus.runtime.CleanableExecutor$Resetter. Detailed failure reason(s): The argument of Unsafe.objectFieldOffset(Field) is not a constant field., Could not determine the field where the value produced by the call to sun.misc.Unsafe.objectFieldOffset(Field) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store. 
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to sun.misc.Unsafe.objectFieldOffset(Field) was detected in the static initializer of io.quarkus.runtime.CleanableExecutor$Resetter. Detailed failure reason(s): The argument of Unsafe.objectFieldOffset(Field) is not a constant field., Could not determine the field where the value produced by the call to sun.misc.Unsafe.objectFieldOffset(Field) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store. 
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to sun.misc.Unsafe.objectFieldOffset(Field) was detected in the static initializer of org.jboss.threads.ThreadLocalResettingRunnable$Resetter. Detailed failure reason(s): The argument of Unsafe.objectFieldOffset(Field) is not a constant field., Could not determine the field where the value produced by the call to sun.misc.Unsafe.objectFieldOffset(Field) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store. 
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to sun.misc.Unsafe.objectFieldOffset(Field) was detected in the static initializer of org.jboss.threads.ThreadLocalResettingRunnable$Resetter. Detailed failure reason(s): The argument of Unsafe.objectFieldOffset(Field) is not a constant field., Could not determine the field where the value produced by the call to sun.misc.Unsafe.objectFieldOffset(Field) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store. 
[camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner:9]     analysis:  14,555.60 ms
Printing call tree to /project/reports/call_tree_camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner_20190722_122942.txt
Printing list of used classes to /project/reports/used_classes_camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner_20190722_122943.txt
Printing list of used packages to /project/reports/used_packages_camel-quarkus-integration-test-aws-s3-0.0.1-SNAPSHOT-runner_20190722_122943.txt
Error: Class initialization failed: io.quarkus.runner.ApplicationImpl1
Detailed message:

com.oracle.svm.core.util.UserError$UserException: Class initialization failed: io.quarkus.runner.ApplicationImpl1
Detailed message:

	at com.oracle.svm.core.util.UserError.abort(UserError.java:75)
	at com.oracle.svm.hosted.FallbackFeature.reportAsFallback(FallbackFeature.java:219)
	at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:733)
	at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:523)
	at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:441)
	at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: Class initialization failed: io.quarkus.runner.ApplicationImpl1
Detailed message:

	at com.oracle.graal.pointsto.constraints.UnsupportedFeatures.report(UnsupportedFeatures.java:130)
	at com.oracle.graal.pointsto.BigBang.finish(BigBang.java:564)
	at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:684)
	... 7 more
Caused by: java.lang.ExceptionInInitializerError
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.ensureClassInitialized(ConfigurableClassInitialization.java:129)
	at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:357)
	at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:92)
	at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.maybeInitializeHosted(ConfigurableClassInitialization.java:120)
	at com.oracle.svm.hosted.SVMHost.registerType(SVMHost.java:179)
	at com.oracle.graal.pointsto.meta.AnalysisUniverse.createType(AnalysisUniverse.java:263)
	at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookupAllowUnresolved(AnalysisUniverse.java:204)
	at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.lookupType(WrappedConstantPool.java:154)
	at org.graalvm.compiler.java.BytecodeParser.lookupType(BytecodeParser.java:4229)
	at org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4472)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5260)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3416)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3223)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:944)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:838)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:49)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:214)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:333)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:346)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:509)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	... 4 more
Caused by: java.lang.RuntimeException: Failed to start quarkus
	at io.quarkus.runner.ApplicationImpl1.<clinit>(ApplicationImpl1.zig:342)
	... 34 more
Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[aws-s3://devvox1] <<< in route: Route(route1)[From[timer:quarkus?repeatCount=1] -> [SetHeade... because of Failed to resolve endpoint: aws-s3://devvox1 due to: Cannot auto create component: aws-s3
	at org.apache.camel.RuntimeCamelException.wrapRuntimeCamelException(RuntimeCamelException.java:52)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.doInit(FastCamelRuntime.java:133)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.init(FastCamelRuntime.java:91)
	at org.apache.camel.quarkus.core.runtime.CamelRecorder.init(CamelRecorder.java:58)
	at io.quarkus.deployment.steps.CamelInitProcessor$createInitTask17.deploy_0(CamelInitProcessor$createInitTask17.zig:73)
	at io.quarkus.deployment.steps.CamelInitProcessor$createInitTask17.deploy(CamelInitProcessor$createInitTask17.zig:92)
	at io.quarkus.runner.ApplicationImpl1.<clinit>(ApplicationImpl1.zig:312)
	... 34 more
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[aws-s3://devvox1] <<< in route: Route(route1)[From[timer:quarkus?repeatCount=1] -> [SetHeade... because of Failed to resolve endpoint: aws-s3://devvox1 due to: Cannot auto create component: aws-s3
	at org.apache.camel.reifier.RouteReifier.addRoutes(RouteReifier.java:361)
	at org.apache.camel.reifier.RouteReifier.addRoutes(RouteReifier.java:106)
	at org.apache.camel.impl.AbstractCamelContext.startRoute(AbstractCamelContext.java:1084)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelContext.reifyRoutes(FastCamelContext.java:110)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.loadRoutes(FastCamelRuntime.java:178)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelRuntime.doInit(FastCamelRuntime.java:131)
	... 39 more
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: aws-s3://devvox1 due to: Cannot auto create component: aws-s3
	at org.apache.camel.impl.AbstractCamelContext.getEndpoint(AbstractCamelContext.java:782)
	at org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:74)
	at org.apache.camel.reifier.RouteReifier.resolveEndpoint(RouteReifier.java:120)
	at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:117)
	at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:123)
	at org.apache.camel.reifier.SendReifier.resolveEndpoint(SendReifier.java:40)
	at org.apache.camel.reifier.SendReifier.createProcessor(SendReifier.java:34)
	at org.apache.camel.reifier.ProcessorReifier.makeProcessorImpl(ProcessorReifier.java:536)
	at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:497)
	at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:241)
	at org.apache.camel.reifier.RouteReifier.addRoutes(RouteReifier.java:358)
	... 44 more
Caused by: org.apache.camel.RuntimeCamelException: Cannot auto create component: aws-s3
	at org.apache.camel.impl.AbstractCamelContext.getComponent(AbstractCamelContext.java:511)
	at org.apache.camel.impl.AbstractCamelContext.getComponent(AbstractCamelContext.java:470)
	at org.apache.camel.impl.AbstractCamelContext.getEndpoint(AbstractCamelContext.java:725)
	... 54 more
Caused by: org.apache.camel.RuntimeCamelException: Cannot auto create component: aws-s3
	at org.apache.camel.impl.AbstractCamelContext.initComponent(AbstractCamelContext.java:566)
	at org.apache.camel.impl.AbstractCamelContext.access$000(AbstractCamelContext.java:190)
	at org.apache.camel.impl.AbstractCamelContext$2.apply(AbstractCamelContext.java:495)
	at org.apache.camel.impl.AbstractCamelContext$2.apply(AbstractCamelContext.java:491)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.apache.camel.impl.AbstractCamelContext.getComponent(AbstractCamelContext.java:491)
	... 56 more
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Property with key [env:S3_REGION] using function [env] returned null value which is not allowed, from input: {{env:S3_REGION}}
	at org.apache.camel.quarkus.core.runtime.support.RuntimeSupport.lambda$bindProperties$3(RuntimeSupport.java:53)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
	at java.util.Iterator.forEachRemaining(Iterator.java:116)
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
	at org.apache.camel.quarkus.core.runtime.support.RuntimeSupport.bindProperties(RuntimeSupport.java:43)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelContext.resolve(FastCamelContext.java:102)
	at org.apache.camel.quarkus.core.runtime.support.FastCamelContext.lambda$createComponentResolver$0(FastCamelContext.java:68)
	at org.apache.camel.impl.AbstractCamelContext.initComponent(AbstractCamelContext.java:560)
	... 61 more
Caused by: java.lang.IllegalArgumentException: Property with key [env:S3_REGION] using function [env] returned null value which is not allowed, from input: {{env:S3_REGION}}
	at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.getPropertyValue(DefaultPropertiesParser.java:227)
	at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.readProperty(DefaultPropertiesParser.java:157)
	at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.doParse(DefaultPropertiesParser.java:116)
	at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.parse(DefaultPropertiesParser.java:100)
	at org.apache.camel.component.properties.DefaultPropertiesParser.parseUri(DefaultPropertiesParser.java:63)
	at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:244)
	at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:170)
	at org.apache.camel.impl.AbstractCamelContext.resolvePropertyPlaceholders(AbstractCamelContext.java:2407)
	at org.apache.camel.quarkus.core.runtime.support.RuntimeSupport.lambda$bindProperties$3(RuntimeSupport.java:49)
	... 77 more
Error: Image build request failed with exit status 1

Rename integration test artifacts

They still start with quarkus-integration-test-camel- but they should start with camel-quarkus-integration-test-. This was forgotten in #3.

Please assign to me.

quarkus-camel - Use MainSupport as base for running Camel

We should look at using MainSupport (parts of Camel Main) some more for bootstrapping camel-quarkus.

Then its similar across standalone Camel, Camel K, and Camel Quarkus. And also Camel Main has parts that are similar to Camel Spring Boot.

Review extensions' dependencies chains

i.e.

  • deployments should depend on camel-quarkus-code-deployment
  • deployments should not depends on arc-deployment and quarkus-deployment as is should be transitively provided by camel-quarkus-code-deployment

Make camel-quarkus-bom usable as a parent for user applications

The background story is that I am trying to write a user guide which is very hard without working examples. We could actually use our existing integration tests as examples but for that purpose, their pom hierarchy is not what the end user would need. So I am hereby proposing (1) to introduce a new POM (let's call it camel-quarkus-application-parent ) that could serve as a parent for end user applications and (2) use that POM as a parent in our integration tests.

With (1) and (2) in place, the user could just copy an integration test out of our source tree to get a standalone example project (that is also granted to work because we run the tests regularly). We could further improve the user experience in the future by having per-itest source ZIPs on Maven Central that the user could just download and unpack instead of cloning the whole git repo. And even further, we could perhaps offer a maven plugin that would list, download and unpack the examples for a given Camel Quarkus version.

WDYT?

Make CamelRuntime smart to decide deferInitPhase

Currently, deferInitPhase true or false needs to be decided by the application developer depending on whether she wants to pass different config values to the app at runtime. However, the CamelRuntime could potentially be made smart enough to decide based on the available config values. E.g. {{env:AWS_ACCESS_KEY}} is a clear indicator of a runtime value.

cc @gnodet

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.