Merge pull request #88 from rmpestano/native

Quarkus native mode support
diff --git a/README.md b/README.md
index 9516fc8..9605bf4 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@
 ## Quarkus extension
 
 Since 2.3-next a Quarkus extension is available. A sample project can be found here: https://github.com/apache/myfaces/blob/master/extensions/quarkus/showcase/  
-Native mode is currently not supported as EL makes extensive use of reflection.
+
 
 ### Differences to a normal servlet container
 - You need to put your views under src/main/resources/META-INF/resources as Quarkus doesn't create a WAR and src/main/webapp is ignored!
diff --git a/extensions/quarkus/deployment/src/main/java/org/apache/myfaces/core/extensions/quarkus/deployment/MyFacesProcessor.java b/extensions/quarkus/deployment/src/main/java/org/apache/myfaces/core/extensions/quarkus/deployment/MyFacesProcessor.java
index e1cff19..6cf6775 100644
--- a/extensions/quarkus/deployment/src/main/java/org/apache/myfaces/core/extensions/quarkus/deployment/MyFacesProcessor.java
+++ b/extensions/quarkus/deployment/src/main/java/org/apache/myfaces/core/extensions/quarkus/deployment/MyFacesProcessor.java
@@ -1,607 +1,613 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you 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.

- */

-package org.apache.myfaces.core.extensions.quarkus.deployment;

-

-import com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl;

-import com.sun.org.apache.xpath.internal.functions.FuncLocalPart;

-import com.sun.org.apache.xpath.internal.functions.FuncNot;

-import java.io.IOException;

-import java.util.Optional;

-

-import javax.faces.application.ProjectStage;

-import javax.faces.application.StateManager;

-import javax.faces.application.ViewHandler;

-import javax.faces.component.FacesComponent;

-import javax.faces.component.behavior.FacesBehavior;

-import javax.faces.convert.FacesConverter;

-import javax.faces.flow.FlowScoped;

-import javax.faces.flow.builder.FlowDefinition;

-import javax.faces.model.FacesDataModel;

-import javax.faces.push.PushContext;

-import javax.faces.render.FacesBehaviorRenderer;

-import javax.faces.render.FacesRenderer;

-import javax.faces.validator.FacesValidator;

-import javax.faces.view.ViewScoped;

-import javax.faces.view.facelets.FaceletsResourceResolver;

-import javax.faces.webapp.FacesServlet;

-

-import org.apache.myfaces.cdi.FacesScoped;

-import org.apache.myfaces.cdi.JsfApplicationArtifactHolder;

-import org.apache.myfaces.cdi.JsfArtifactProducer;

-import org.apache.myfaces.cdi.config.FacesConfigBeanHolder;

-import org.apache.myfaces.cdi.model.FacesDataModelManager;

-import org.apache.myfaces.cdi.view.ViewScopeBeanHolder;

-import org.apache.myfaces.cdi.view.ViewTransientScoped;

-import org.apache.myfaces.config.MyfacesConfig;

-import org.apache.myfaces.config.annotation.CdiAnnotationProviderExtension;

-import org.apache.myfaces.config.element.NamedEvent;

-import org.apache.myfaces.flow.cdi.FlowBuilderFactoryBean;

-import org.apache.myfaces.flow.cdi.FlowScopeBeanHolder;

-import org.apache.myfaces.push.cdi.PushContextFactoryBean;

-import org.apache.myfaces.push.cdi.WebsocketApplicationBean;

-import org.apache.myfaces.push.cdi.WebsocketChannelTokenBuilderBean;

-import org.apache.myfaces.push.cdi.WebsocketSessionBean;

-import org.apache.myfaces.push.cdi.WebsocketViewBean;

-import org.apache.myfaces.webapp.StartupServletContextListener;

-import org.eclipse.microprofile.config.Config;

-import org.eclipse.microprofile.config.ConfigProvider;

-import org.jboss.jandex.AnnotationInstance;

-import org.jboss.jandex.AnnotationValue;

-import org.jboss.jandex.DotName;

-

-import io.quarkus.arc.deployment.AdditionalBeanBuildItem;

-import io.quarkus.arc.deployment.BeanDefiningAnnotationBuildItem;

-import io.quarkus.arc.deployment.BeanRegistrarBuildItem;

-import io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem;

-import io.quarkus.arc.deployment.ContextRegistrarBuildItem;

-import io.quarkus.arc.processor.ContextRegistrar;

-import io.quarkus.deployment.annotations.BuildProducer;

-import io.quarkus.deployment.annotations.BuildStep;

-import io.quarkus.deployment.annotations.ExecutionTime;

-import io.quarkus.deployment.annotations.Record;

-import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem;

-import io.quarkus.deployment.builditem.CombinedIndexBuildItem;

-import io.quarkus.deployment.builditem.FeatureBuildItem;

-import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;

-import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;

-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;

-import org.apache.myfaces.core.extensions.quarkus.runtime.MyFacesRecorder;

-import org.apache.myfaces.core.extensions.quarkus.runtime.QuarkusFacesInitilializer;

-import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusFacesScopeContext;

-import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusFlowScopedContext;

-import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusViewScopeContext;

-import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusViewTransientScopeContext;

-import org.apache.myfaces.core.extensions.quarkus.runtime.spi.QuarkusInjectionProvider;

-import io.quarkus.runtime.LaunchMode;

-import io.quarkus.runtime.configuration.ProfileManager;

-import io.quarkus.undertow.deployment.ListenerBuildItem;

-import io.quarkus.undertow.deployment.ServletBuildItem;

-import io.quarkus.undertow.deployment.ServletInitParamBuildItem;

-import java.util.ArrayList;

-import java.util.Arrays;

-import java.util.List;

-import java.util.stream.Collectors;

-import javax.el.ELResolver;

-import javax.faces.FactoryFinder;

-import javax.faces.application.Application;

-import javax.faces.component.UIComponent;

-import javax.faces.component.behavior.Behavior;

-import javax.faces.context.FacesContext;

-import javax.faces.convert.Converter;

-import javax.faces.event.ExceptionQueuedEventContext;

-import javax.faces.event.SystemEvent;

-import javax.faces.render.ClientBehaviorRenderer;

-import javax.faces.render.Renderer;

-import javax.faces.validator.Validator;

-import javax.faces.view.facelets.ComponentHandler;

-import javax.faces.view.facelets.ConverterHandler;

-import javax.faces.view.facelets.MetaRuleset;

-import javax.faces.view.facelets.TagHandler;

-import javax.faces.view.facelets.ValidatorHandler;

-import org.apache.myfaces.application.viewstate.StateUtils;

-import org.apache.myfaces.cdi.util.BeanEntry;

-import org.apache.myfaces.config.FacesConfigurator;

-import org.apache.myfaces.core.extensions.quarkus.runtime.spi.QuarkusFactoryFinderProvider;

-import org.apache.myfaces.el.ELResolverBuilderForFaces;

-import org.apache.myfaces.lifecycle.RestoreViewSupport;

-import org.apache.myfaces.renderkit.ErrorPageWriter;

-import org.apache.myfaces.spi.FactoryFinderProviderFactory;

-import org.apache.myfaces.spi.impl.DefaultWebConfigProviderFactory;

-import org.apache.myfaces.util.ExternalContextUtils;

-import org.apache.myfaces.util.lang.ClassUtils;

-import org.apache.myfaces.view.ViewScopeProxyMap;

-import org.apache.myfaces.view.facelets.compiler.SAXCompiler;

-import org.apache.myfaces.view.facelets.compiler.TagLibraryConfig;

-import org.apache.myfaces.view.facelets.tag.MethodRule;

-import org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport;

-import org.apache.myfaces.webapp.AbstractFacesInitializer;

-import org.apache.myfaces.webapp.FaceletsInitilializer;

-import org.apache.myfaces.webapp.MyFacesContainerInitializer;

-import org.jboss.jandex.ClassInfo;

-

-class MyFacesProcessor

-{

-

-    private static final Class[] BEAN_CLASSES =

-    {

-            JsfApplicationArtifactHolder.class,

-

-            JsfArtifactProducer.class,

-

-            FacesConfigBeanHolder.class,

-

-            FacesDataModelManager.class,

-

-            ViewScopeBeanHolder.class,

-

-            CdiAnnotationProviderExtension.class,

-

-            PushContextFactoryBean.class,

-            WebsocketChannelTokenBuilderBean.class,

-            WebsocketSessionBean.class,

-            WebsocketViewBean.class,

-            WebsocketApplicationBean.class,

-

-            FlowBuilderFactoryBean.class,

-            FlowScopeBeanHolder.class

-    };

-

-    private static final String[] BEAN_DEFINING_ANNOTATION_CLASSES =

-    {

-            FacesComponent.class.getName(),

-            FacesBehavior.class.getName(),

-            FacesConverter.class.getName(),

-            FacesValidator.class.getName(),

-            FacesRenderer.class.getName(),

-            NamedEvent.class.getName(),

-            FacesBehaviorRenderer.class.getName(),

-            FaceletsResourceResolver.class.getName(),

-            FlowDefinition.class.getName()

-    };

-    

-    private static final String[] FACTORIES =

-    {

-        FactoryFinder.APPLICATION_FACTORY,

-        FactoryFinder.EXCEPTION_HANDLER_FACTORY,

-        FactoryFinder.EXTERNAL_CONTEXT_FACTORY,

-        FactoryFinder.FACES_CONTEXT_FACTORY,

-        FactoryFinder.LIFECYCLE_FACTORY,

-        FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,

-        FactoryFinder.RENDER_KIT_FACTORY,

-        FactoryFinder.TAG_HANDLER_DELEGATE_FACTORY,

-        FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY,

-        FactoryFinder.VISIT_CONTEXT_FACTORY,

-        FactoryFinder.FACELET_CACHE_FACTORY,

-        FactoryFinder.FLASH_FACTORY,

-        FactoryFinder.FLOW_HANDLER_FACTORY,

-        FactoryFinder.CLIENT_WINDOW_FACTORY,

-        FactoryFinder.SEARCH_EXPRESSION_CONTEXT_FACTORY

-    };

-

-    @BuildStep

-    void buildFeature(BuildProducer<FeatureBuildItem> feature) throws IOException

-    {

-        feature.produce(new FeatureBuildItem("myfaces"));

-    }

-

-    @BuildStep

-    void buildServlet(BuildProducer<FeatureBuildItem> feature,

-            BuildProducer<ServletBuildItem> servlet,

-            BuildProducer<ListenerBuildItem> listener) throws IOException

-    {

-        servlet.produce(ServletBuildItem.builder("Faces Servlet", FacesServlet.class.getName())

-                .addMapping("*.xhtml")

-                .build());

-

-        // sometimes Quarkus doesn't scan web-fragments?! lets add it manually

-        listener.produce(new ListenerBuildItem(StartupServletContextListener.class.getName()));

-    }

-

-    @BuildStep

-    void buildCdiBeans(BuildProducer<AdditionalBeanBuildItem> additionalBean,

-            BuildProducer<BeanDefiningAnnotationBuildItem> beanDefiningAnnotation) throws IOException

-    {

-        for (Class<?> clazz : BEAN_CLASSES)

-        {

-            additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(clazz));

-        }

-

-        for (String clazz : BEAN_DEFINING_ANNOTATION_CLASSES)

-        {

-            beanDefiningAnnotation.produce(new BeanDefiningAnnotationBuildItem(DotName.createSimple(clazz)));

-        }

-

-    }

-

-    @BuildStep

-    void buildCdiScopes(BuildProducer<ContextRegistrarBuildItem> contextRegistrar) throws IOException

-    {

-        contextRegistrar.produce(new ContextRegistrarBuildItem(new ContextRegistrar()

-        {

-            @Override

-            public void register(ContextRegistrar.RegistrationContext registrationContext)

-            {

-                registrationContext.configure(ViewScoped.class)

-                        .normal()

-                        .contextClass(QuarkusViewScopeContext.class)

-                        .done();

-                registrationContext.configure(FacesScoped.class)

-                        .normal()

-                        .contextClass(QuarkusFacesScopeContext.class)

-                        .done();

-                registrationContext.configure(ViewTransientScoped.class)

-                        .normal()

-                        .contextClass(QuarkusViewTransientScopeContext.class)

-                        .done();

-                registrationContext.configure(FlowScoped.class)

-                        .normal()

-                        .contextClass(QuarkusFlowScopedContext.class)

-                        .done();

-            }

-        }));

-    }

-

-    @BuildStep

-    void buildInitParams(BuildProducer<ServletInitParamBuildItem> initParam) throws IOException

-    {

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.INJECTION_PROVIDER, QuarkusInjectionProvider.class.getName()));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.FACES_INITIALIZER, QuarkusFacesInitilializer.class.getName()));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.SUPPORT_JSP, "false"));

-    }

-

-    @BuildStep

-    void buildRecommendedInitParams(BuildProducer<ServletInitParamBuildItem> initParam) throws IOException

-    {

-        // user config

-        Config config = ConfigProvider.getConfig();

-

-        Optional<String> projectStage = resolveProjectStage(config);

-        initParam.produce(new ServletInitParamBuildItem(ProjectStage.PROJECT_STAGE_PARAM_NAME, projectStage.get()));

-

-        Optional<String> enableWebsocketsEndpoint = config.getOptionalValue(

-                PushContext.ENABLE_WEBSOCKET_ENDPOINT_PARAM_NAME,

-                String.class);

-        if (enableWebsocketsEndpoint.isPresent())

-        {

-            initParam.produce(new ServletInitParamBuildItem(PushContext.ENABLE_WEBSOCKET_ENDPOINT_PARAM_NAME,

-                    enableWebsocketsEndpoint.get()));

-        }

-

-        // common

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.LOG_WEB_CONTEXT_PARAMS, "false"));

-        initParam.produce(new ServletInitParamBuildItem(

-                StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER));

-        initParam.produce(new ServletInitParamBuildItem(

-                StateManager.SERIALIZE_SERVER_STATE_PARAM_NAME, "false"));

-

-        // perf

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.CHECK_ID_PRODUCTION_MODE, "false"));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.EARLY_FLUSH_ENABLED, "true"));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.CACHE_EL_EXPRESSIONS, "alwaysRecompile"));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.COMPRESS_STATE_IN_SESSION, "false"));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.NUMBER_OF_VIEWS_IN_SESSION, "15"));

-        initParam.produce(new ServletInitParamBuildItem(

-                MyfacesConfig.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION, "3"));

-

-        // MyFaces uses default 0, which means always recompile

-        if (ProjectStage.valueOf(projectStage.get()) == ProjectStage.Development)

-        {

-            initParam.produce(new ServletInitParamBuildItem(

-                    ViewHandler.FACELETS_REFRESH_PERIOD_PARAM_NAME, "1"));

-        }

-

-        // primefaces perf

-        initParam.produce(new ServletInitParamBuildItem(

-                "primefaces.SUBMIT", "partial"));

-        initParam.produce(new ServletInitParamBuildItem(

-                "primefaces.MOVE_SCRIPTS_TO_BOTTOM", "true"));

-    }

-

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void buildAnnotationProviderIntegration(MyFacesRecorder recorder, CombinedIndexBuildItem combinedIndex)

-            throws IOException

-    {

-        for (String clazz : BEAN_DEFINING_ANNOTATION_CLASSES)

-        {

-            combinedIndex.getIndex()

-                    .getAnnotations(DotName.createSimple(clazz))

-                    .stream()

-                    .forEach(annotation -> recorder.registerAnnotatedClass(annotation.name().toString(),

-                            annotation.target().asClass().name().toString()));

-        }

-    }

-

-    private Optional<String> resolveProjectStage(Config config)

-    {

-        Optional<String> projectStage = config.getOptionalValue(ProjectStage.PROJECT_STAGE_PARAM_NAME,

-                String.class);

-        if (!projectStage.isPresent())

-        {

-            projectStage = Optional.of(ProjectStage.Production.name());

-            if (LaunchMode.DEVELOPMENT.getDefaultProfile().equals(ProfileManager.getActiveProfile()))

-            {

-                projectStage = Optional.of(ProjectStage.Development.name());

-            }

-            else if (LaunchMode.TEST.getDefaultProfile().equals(ProfileManager.getActiveProfile()))

-            {

-                projectStage = Optional.of(ProjectStage.SystemTest.name());

-            }

-        }

-        return projectStage;

-    }

-

-    @BuildStep

-    void buildMangedPropertyProducers(BeanRegistrationPhaseBuildItem beanRegistrationPhase,

-            BuildProducer<BeanRegistrationPhaseBuildItem.BeanConfiguratorBuildItem> beanConfigurators)

-            throws IOException

-    {

-        ManagedPropertyBuildStep.build(beanRegistrationPhase, beanConfigurators);

-    }

-

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void buildFacesDataModels(MyFacesRecorder recorder,

-            BuildProducer<BeanRegistrarBuildItem> beanConfigurators,

-            CombinedIndexBuildItem combinedIndex) throws IOException

-    {

-        for (AnnotationInstance ai : combinedIndex.getIndex()

-                .getAnnotations(DotName.createSimple(FacesDataModel.class.getName())))

-        {

-            AnnotationValue forClass = ai.value("forClass");

-            if (forClass != null)

-            {

-                recorder.registerFacesDataModel(

-                        ai.target().asClass().name().toString(),

-                        forClass.asClass().name().toString());

-            }

-        }

-    }

-

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void buildFlowScopedMapping(MyFacesRecorder recorder,

-            CombinedIndexBuildItem combinedIndex) throws IOException

-    {

-        for (AnnotationInstance ai : combinedIndex.getIndex()

-                .getAnnotations(DotName.createSimple(FlowScoped.class.getName())))

-        {

-            AnnotationValue flowId = ai.value("value");

-            if (flowId != null && flowId.asString() != null)

-            {

-                AnnotationValue definingDocumentId = ai.value("definingDocumentId");

-                recorder.registerFlowReference(ai.target().asClass().name().toString(),

-                        definingDocumentId == null ? "" : definingDocumentId.asString(),

-                        flowId.asString());

-            }

-        }

-    }

-

-    @BuildStep

-    void produceApplicationArchiveMarker(

-            BuildProducer<AdditionalApplicationArchiveMarkerBuildItem> additionalArchiveMarkers)

-    {

-        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("org/primefaces/component"));

-        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("javax/faces/component"));

-        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("org/apache/myfaces/view"));

-    }

-

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void registerForLimitedReflection(MyFacesRecorder recorder,

-            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,

-            CombinedIndexBuildItem combinedIndex)

-    {

-        List<String> classNames = new ArrayList<>();

-        List<Class<?>> classes = new ArrayList<>();

-       

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, Renderer.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, ClientBehaviorRenderer.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, javax.el.ValueExpression.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, SystemEvent.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, FacesContext.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, Application.class.getName()));

-

-        for (String factory : FACTORIES)

-        {

-            classNames.addAll(collectClassAndSubclasses(combinedIndex, factory));

-        }

-

-        classNames.addAll(Arrays.asList(

-            "org.primefaces.config.PrimeEnvironment",

-            "com.lowagie.text.pdf.MappedRandomAccessFile",

-            "org.apache.myfaces.application._ApplicationUtils",

-            "com.sun.el.util.ReflectionUtil",

-            "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl",

-            "org.primefaces.util.MessageFactory",

-            "javax.faces.component._DeltaStateHelper",

-            "javax.faces.component._DeltaStateHelper$InternalMap"));

-

-        classes.addAll(Arrays.asList(

-                DefaultWebConfigProviderFactory.class,

-                ErrorPageWriter.class,

-                DocumentBuilderFactoryImpl.class,

-                FuncLocalPart.class,

-                FuncNot.class,

-                MyFacesContainerInitializer.class,

-                RestoreViewSupport.class,

-                ExceptionQueuedEventContext.class,

-                FacesConfigurator.class,

-                FaceletsInitilializer.class,

-                TagLibraryConfig.class,

-                String.class,

-                ViewScopeProxyMap.class,

-                SAXCompiler.class,

-                StateUtils.class));

-

-        reflectiveClass.produce(

-                new ReflectiveClassBuildItem(false, false, classNames.toArray(new String[classNames.size()])));

-        reflectiveClass.produce(

-                new ReflectiveClassBuildItem(false, false, classes.toArray(new Class[classes.size()])));

-    }

-    

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void registerForMethodReflection(MyFacesRecorder recorder, BuildProducer<ReflectiveClassBuildItem> reflectiveClass,

-                               CombinedIndexBuildItem combinedIndex)

-    {        

-        List<String> classNames = new ArrayList<>();

-        List<Class<?>> classes = new ArrayList<>();

-        

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, TagHandler.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, ConverterHandler.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, ComponentHandler.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, ValidatorHandler.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, UIComponent.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, Converter.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, Validator.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, Behavior.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, ELResolver.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, MethodRule.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, MetaRuleset.class.getName()));

-        classNames.addAll(collectClassAndSubclasses(combinedIndex, "org.primefaces.component.api.Widget"));

-        classNames.addAll(Arrays.asList(

-                "org.primefaces.util.ComponentUtils",

-                "org.primefaces.expression.SearchExpressionUtils",

-                "org.primefaces.util.SecurityUtils",

-                "org.primefaces.util.LangUtils",

-                "javax.faces._FactoryFinderProviderFactory"));

-

-        classes.addAll(Arrays.asList(

-                ClassUtils.class,

-                FactoryFinderProviderFactory.class,

-                ComponentSupport.class,

-                QuarkusFactoryFinderProvider.class,

-                ELResolverBuilderForFaces.class,

-                AbstractFacesInitializer.class,

-                ExternalContextUtils.class,

-                BeanEntry.class));

-        

-        reflectiveClass.produce(

-                new ReflectiveClassBuildItem(true, false, classNames.toArray(new String[classNames.size()])));

-        reflectiveClass.produce(

-                new ReflectiveClassBuildItem(true, false, classes.toArray(new Class[classes.size()])));

-    }

-

-    

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void registerForFieldReflection(MyFacesRecorder recorder, BuildProducer<ReflectiveClassBuildItem> reflectiveClass,

-                               CombinedIndexBuildItem combinedIndex)

-    {     

-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, 

-                "javax.faces.context._MyFacesExternalContextHelper"));

-    }

-

-    @BuildStep

-    void substrateResourceBuildItems(BuildProducer<NativeImageResourceBuildItem> nativeImageResourceProducer,

-                                     BuildProducer<NativeImageResourceBundleBuildItem> resourceBundleBuildItem)

-    {

-        nativeImageResourceProducer

-                .produce(new NativeImageResourceBuildItem("META-INF/maven/org.primefaces/primefaces/pom.properties"));

-        nativeImageResourceProducer.produce(new NativeImageResourceBuildItem(

-                "META-INF/rsc/myfaces-dev-error.xml",

-                "META-INF/rsc/myfaces-dev-debug.xml", 

-                "org/apache/myfaces/resource/default.dtd",

-                "org/apache/myfaces/resource/datatypes.dtd", 

-                "META-INF/web-fragment.xml",

-                "META-INF/resources/org/apache/myfaces/windowId/windowhandler.html",

-                "org/apache/myfaces/resource/facelet-taglib_1_0.dtd", 

-                "org/apache/myfaces/resource/javaee_5.xsd",

-                "org/apache/myfaces/resource/web-facelettaglibrary_2_0.xsd",

-                "org/apache/myfaces/resource/XMLSchema.dtd", 

-                "org/apache/myfaces/resource/facesconfig_1_0.dtd",

-                "org/apache/myfaces/resource/web-facesconfig_1_1.dtd",

-                "org/apache/myfaces/resource/web-facesconfig_1_2.dtd", 

-                "org/apache/myfaces/resource/web-facesconfig_2_0.dtd",

-                "org/apache/myfaces/resource/web-facesconfig_2_1.dtd",

-                "org/apache/myfaces/resource/web-facesconfig_2_2.dtd", 

-                "org/apache/myfaces/resource/web-facesconfig_2_3.dtd",

-                "org/apache/myfaces/resource/web-facesconfig_3_0.dtd",

-                "org/apache/myfaces/resource/xml.xsd",

-                "META-INF/rsc/myfaces-dev-error-include.xml",

-                "META-INF/services/javax.servlet.ServletContainerInitializer"));

-

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ar"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ca"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_cs"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_de"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_en"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_es"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_fr"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_it"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ja"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_mt"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_nl"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_pl"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_pt_PR"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ru"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_sk"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_CN"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_HK"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_TW"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.el.PrivateMessages"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.servlet.LocalStrings"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.el.LocalStrings"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("org.primefaces.Messages"));

-        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("org.primefaces.Messages_en"));

-    }

-    

-    public List<String> collectClassAndSubclasses(CombinedIndexBuildItem combinedIndex, String className)

-    {

-        List<String> classes = combinedIndex.getIndex()

-                .getAllKnownSubclasses(DotName.createSimple(className))

-                .stream()

-                .map(ClassInfo::toString)

-                .collect(Collectors.toList());

-        classes.add(className);

-        return classes;

-    }

-    

-    @BuildStep

-    @Record(ExecutionTime.STATIC_INIT)

-    void registerWebappClassesForReflection(MyFacesRecorder recorder,

-            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,

-            CombinedIndexBuildItem combinedIndex)

-    {     

-        List<String> classNames = new ArrayList<>();

-        classNames.addAll(Arrays.asList(

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView",

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView_ClientProxy",

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.Car",

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyCarDataModel",

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.CarService",

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazySorter"));

-        reflectiveClass.produce(

-                new ReflectiveClassBuildItem(true, false, classNames.toArray(new String[classNames.size()])));

-

-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true,

-                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView_ClientProxy"));

-    }

-}

+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.myfaces.core.extensions.quarkus.deployment;
+
+import com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl;
+import com.sun.org.apache.xpath.internal.functions.FuncLocalPart;
+import com.sun.org.apache.xpath.internal.functions.FuncNot;
+import java.io.IOException;
+import java.util.Optional;
+
+import javax.faces.application.ProjectStage;
+import javax.faces.application.StateManager;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.FacesComponent;
+import javax.faces.component.behavior.FacesBehavior;
+import javax.faces.convert.FacesConverter;
+import javax.faces.flow.FlowScoped;
+import javax.faces.flow.builder.FlowDefinition;
+import javax.faces.model.FacesDataModel;
+import javax.faces.push.PushContext;
+import javax.faces.render.FacesBehaviorRenderer;
+import javax.faces.render.FacesRenderer;
+import javax.faces.validator.FacesValidator;
+import javax.faces.view.ViewScoped;
+import javax.faces.view.facelets.FaceletsResourceResolver;
+import javax.faces.webapp.FacesServlet;
+
+import org.apache.myfaces.cdi.FacesScoped;
+import org.apache.myfaces.cdi.JsfApplicationArtifactHolder;
+import org.apache.myfaces.cdi.JsfArtifactProducer;
+import org.apache.myfaces.cdi.config.FacesConfigBeanHolder;
+import org.apache.myfaces.cdi.model.FacesDataModelManager;
+import org.apache.myfaces.cdi.view.ViewScopeBeanHolder;
+import org.apache.myfaces.cdi.view.ViewTransientScoped;
+import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.myfaces.config.annotation.CdiAnnotationProviderExtension;
+import org.apache.myfaces.config.element.NamedEvent;
+import org.apache.myfaces.core.extensions.quarkus.runtime.exception.QuarkusExceptionHandlerFactory;
+import org.apache.myfaces.flow.cdi.FlowBuilderFactoryBean;
+import org.apache.myfaces.flow.cdi.FlowScopeBeanHolder;
+import org.apache.myfaces.push.cdi.PushContextFactoryBean;
+import org.apache.myfaces.push.cdi.WebsocketApplicationBean;
+import org.apache.myfaces.push.cdi.WebsocketChannelTokenBuilderBean;
+import org.apache.myfaces.push.cdi.WebsocketSessionBean;
+import org.apache.myfaces.push.cdi.WebsocketViewBean;
+import org.apache.myfaces.webapp.StartupServletContextListener;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.jboss.jandex.AnnotationInstance;
+import org.jboss.jandex.AnnotationValue;
+import org.jboss.jandex.DotName;
+
+import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
+import io.quarkus.arc.deployment.BeanDefiningAnnotationBuildItem;
+import io.quarkus.arc.deployment.BeanRegistrarBuildItem;
+import io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem;
+import io.quarkus.arc.deployment.ContextRegistrarBuildItem;
+import io.quarkus.arc.processor.ContextRegistrar;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.myfaces.core.extensions.quarkus.runtime.MyFacesRecorder;
+import org.apache.myfaces.core.extensions.quarkus.runtime.QuarkusFacesInitilializer;
+import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusFacesScopeContext;
+import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusFlowScopedContext;
+import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusViewScopeContext;
+import org.apache.myfaces.core.extensions.quarkus.runtime.scopes.QuarkusViewTransientScopeContext;
+import org.apache.myfaces.core.extensions.quarkus.runtime.spi.QuarkusInjectionProvider;
+import io.quarkus.runtime.LaunchMode;
+import io.quarkus.runtime.configuration.ProfileManager;
+import io.quarkus.undertow.deployment.ListenerBuildItem;
+import io.quarkus.undertow.deployment.ServletBuildItem;
+import io.quarkus.undertow.deployment.ServletInitParamBuildItem;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.el.ELResolver;
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.component.UIComponent;
+import javax.faces.component.behavior.Behavior;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.event.ExceptionQueuedEventContext;
+import javax.faces.event.SystemEvent;
+import javax.faces.render.ClientBehaviorRenderer;
+import javax.faces.render.Renderer;
+import javax.faces.validator.Validator;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.ConverterHandler;
+import javax.faces.view.facelets.MetaRuleset;
+import javax.faces.view.facelets.TagHandler;
+import javax.faces.view.facelets.ValidatorHandler;
+import org.apache.myfaces.application.viewstate.StateUtils;
+import org.apache.myfaces.cdi.util.BeanEntry;
+import org.apache.myfaces.config.FacesConfigurator;
+import org.apache.myfaces.core.extensions.quarkus.runtime.spi.QuarkusFactoryFinderProvider;
+import org.apache.myfaces.el.ELResolverBuilderForFaces;
+import org.apache.myfaces.lifecycle.RestoreViewSupport;
+import org.apache.myfaces.renderkit.ErrorPageWriter;
+import org.apache.myfaces.spi.FactoryFinderProviderFactory;
+import org.apache.myfaces.spi.impl.DefaultWebConfigProviderFactory;
+import org.apache.myfaces.util.ExternalContextUtils;
+import org.apache.myfaces.util.lang.ClassUtils;
+import org.apache.myfaces.view.ViewScopeProxyMap;
+import org.apache.myfaces.view.facelets.compiler.SAXCompiler;
+import org.apache.myfaces.view.facelets.compiler.TagLibraryConfig;
+import org.apache.myfaces.view.facelets.tag.MethodRule;
+import org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport;
+import org.apache.myfaces.webapp.AbstractFacesInitializer;
+import org.apache.myfaces.webapp.FaceletsInitilializer;
+import org.apache.myfaces.webapp.MyFacesContainerInitializer;
+import org.jboss.jandex.ClassInfo;
+
+class MyFacesProcessor
+{
+
+    private static final Class[] BEAN_CLASSES =
+    {
+            JsfApplicationArtifactHolder.class,
+            JsfArtifactProducer.class,
+            FacesConfigBeanHolder.class,
+            FacesDataModelManager.class,
+            ViewScopeBeanHolder.class,
+            CdiAnnotationProviderExtension.class,
+            PushContextFactoryBean.class,
+            WebsocketChannelTokenBuilderBean.class,
+            WebsocketSessionBean.class,
+            WebsocketViewBean.class,
+            WebsocketApplicationBean.class,
+            FlowBuilderFactoryBean.class,
+            FlowScopeBeanHolder.class
+    };
+
+    private static final String[] BEAN_DEFINING_ANNOTATION_CLASSES =
+    {
+            FacesComponent.class.getName(),
+            FacesBehavior.class.getName(),
+            FacesConverter.class.getName(),
+            FacesValidator.class.getName(),
+            FacesRenderer.class.getName(),
+            NamedEvent.class.getName(),
+            FacesBehaviorRenderer.class.getName(),
+            FaceletsResourceResolver.class.getName(),
+            FlowDefinition.class.getName()
+    };
+    
+    private static final String[] FACTORIES =
+    {
+        FactoryFinder.APPLICATION_FACTORY,
+        FactoryFinder.EXCEPTION_HANDLER_FACTORY,
+        FactoryFinder.EXTERNAL_CONTEXT_FACTORY,
+        FactoryFinder.FACES_CONTEXT_FACTORY,
+        FactoryFinder.LIFECYCLE_FACTORY,
+        FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,
+        FactoryFinder.RENDER_KIT_FACTORY,
+        FactoryFinder.TAG_HANDLER_DELEGATE_FACTORY,
+        FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY,
+        FactoryFinder.VISIT_CONTEXT_FACTORY,
+        FactoryFinder.FACELET_CACHE_FACTORY,
+        FactoryFinder.FLASH_FACTORY,
+        FactoryFinder.FLOW_HANDLER_FACTORY,
+        FactoryFinder.CLIENT_WINDOW_FACTORY,
+        FactoryFinder.SEARCH_EXPRESSION_CONTEXT_FACTORY,
+        QuarkusExceptionHandlerFactory.class.getName()
+    };
+
+    @BuildStep
+    void buildFeature(BuildProducer<FeatureBuildItem> feature) throws IOException
+    {
+        feature.produce(new FeatureBuildItem("myfaces"));
+    }
+
+    @BuildStep
+    void buildServlet(BuildProducer<FeatureBuildItem> feature,
+            BuildProducer<ServletBuildItem> servlet,
+            BuildProducer<ListenerBuildItem> listener) throws IOException
+    {
+        servlet.produce(ServletBuildItem.builder("Faces Servlet", FacesServlet.class.getName())
+                .addMapping("*.xhtml")
+                .build());
+
+        // sometimes Quarkus doesn't scan web-fragments?! lets add it manually
+        listener.produce(new ListenerBuildItem(StartupServletContextListener.class.getName()));
+    }
+
+    @BuildStep
+    void buildCdiBeans(BuildProducer<AdditionalBeanBuildItem> additionalBean,
+            BuildProducer<BeanDefiningAnnotationBuildItem> beanDefiningAnnotation) throws IOException
+    {
+        for (Class<?> clazz : BEAN_CLASSES)
+        {
+            additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(clazz));
+        }
+
+        for (String clazz : BEAN_DEFINING_ANNOTATION_CLASSES)
+        {
+            beanDefiningAnnotation.produce(new BeanDefiningAnnotationBuildItem(DotName.createSimple(clazz)));
+        }
+
+    }
+
+    @BuildStep
+    void buildCdiScopes(BuildProducer<ContextRegistrarBuildItem> contextRegistrar) throws IOException
+    {
+        contextRegistrar.produce(new ContextRegistrarBuildItem(new ContextRegistrar()
+        {
+            @Override
+            public void register(ContextRegistrar.RegistrationContext registrationContext)
+            {
+                registrationContext.configure(ViewScoped.class)
+                        .normal()
+                        .contextClass(QuarkusViewScopeContext.class)
+                        .done();
+                registrationContext.configure(FacesScoped.class)
+                        .normal()
+                        .contextClass(QuarkusFacesScopeContext.class)
+                        .done();
+                registrationContext.configure(ViewTransientScoped.class)
+                        .normal()
+                        .contextClass(QuarkusViewTransientScopeContext.class)
+                        .done();
+                registrationContext.configure(FlowScoped.class)
+                        .normal()
+                        .contextClass(QuarkusFlowScopedContext.class)
+                        .done();
+            }
+        }));
+    }
+
+    @BuildStep
+    void buildInitParams(BuildProducer<ServletInitParamBuildItem> initParam) throws IOException
+    {
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.INJECTION_PROVIDER, QuarkusInjectionProvider.class.getName()));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.FACES_INITIALIZER, QuarkusFacesInitilializer.class.getName()));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.SUPPORT_JSP, "false"));
+    }
+
+    @BuildStep
+    void buildRecommendedInitParams(BuildProducer<ServletInitParamBuildItem> initParam) throws IOException
+    {
+        // user config
+        Config config = ConfigProvider.getConfig();
+
+        Optional<String> projectStage = resolveProjectStage(config);
+        initParam.produce(new ServletInitParamBuildItem(ProjectStage.PROJECT_STAGE_PARAM_NAME, projectStage.get()));
+
+        Optional<String> enableWebsocketsEndpoint = config.getOptionalValue(
+                PushContext.ENABLE_WEBSOCKET_ENDPOINT_PARAM_NAME,
+                String.class);
+        if (enableWebsocketsEndpoint.isPresent())
+        {
+            initParam.produce(new ServletInitParamBuildItem(PushContext.ENABLE_WEBSOCKET_ENDPOINT_PARAM_NAME,
+                    enableWebsocketsEndpoint.get()));
+        }
+
+        // common
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.LOG_WEB_CONTEXT_PARAMS, "false"));
+        initParam.produce(new ServletInitParamBuildItem(
+                StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER));
+        initParam.produce(new ServletInitParamBuildItem(
+                StateManager.SERIALIZE_SERVER_STATE_PARAM_NAME, "false"));
+
+        // perf
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.CHECK_ID_PRODUCTION_MODE, "false"));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.EARLY_FLUSH_ENABLED, "true"));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.CACHE_EL_EXPRESSIONS, "alwaysRecompile"));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.COMPRESS_STATE_IN_SESSION, "false"));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.NUMBER_OF_VIEWS_IN_SESSION, "15"));
+        initParam.produce(new ServletInitParamBuildItem(
+                MyfacesConfig.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION, "3"));
+
+        // MyFaces uses default 0, which means always recompile
+        if (ProjectStage.valueOf(projectStage.get()) == ProjectStage.Development)
+        {
+            initParam.produce(new ServletInitParamBuildItem(
+                    ViewHandler.FACELETS_REFRESH_PERIOD_PARAM_NAME, "1"));
+        }
+
+        // primefaces perf
+        initParam.produce(new ServletInitParamBuildItem(
+                "primefaces.SUBMIT", "partial"));
+        initParam.produce(new ServletInitParamBuildItem(
+                "primefaces.MOVE_SCRIPTS_TO_BOTTOM", "true"));
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void buildAnnotationProviderIntegration(MyFacesRecorder recorder, CombinedIndexBuildItem combinedIndex)
+            throws IOException
+    {
+        for (String clazz : BEAN_DEFINING_ANNOTATION_CLASSES)
+        {
+            combinedIndex.getIndex()
+                    .getAnnotations(DotName.createSimple(clazz))
+                    .stream()
+                    .forEach(annotation -> recorder.registerAnnotatedClass(annotation.name().toString(),
+                            annotation.target().asClass().name().toString()));
+        }
+    }
+
+    private Optional<String> resolveProjectStage(Config config)
+    {
+        Optional<String> projectStage = config.getOptionalValue(ProjectStage.PROJECT_STAGE_PARAM_NAME,
+                String.class);
+        if (!projectStage.isPresent())
+        {
+            projectStage = Optional.of(ProjectStage.Production.name());
+            if (LaunchMode.DEVELOPMENT.getDefaultProfile().equals(ProfileManager.getActiveProfile()))
+            {
+                projectStage = Optional.of(ProjectStage.Development.name());
+            }
+            else if (LaunchMode.TEST.getDefaultProfile().equals(ProfileManager.getActiveProfile()))
+            {
+                projectStage = Optional.of(ProjectStage.SystemTest.name());
+            }
+        }
+        return projectStage;
+    }
+
+    @BuildStep
+    void buildMangedPropertyProducers(BeanRegistrationPhaseBuildItem beanRegistrationPhase,
+            BuildProducer<BeanRegistrationPhaseBuildItem.BeanConfiguratorBuildItem> beanConfigurators)
+            throws IOException
+    {
+        ManagedPropertyBuildStep.build(beanRegistrationPhase, beanConfigurators);
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void buildFacesDataModels(MyFacesRecorder recorder,
+            BuildProducer<BeanRegistrarBuildItem> beanConfigurators,
+            CombinedIndexBuildItem combinedIndex) throws IOException
+    {
+        for (AnnotationInstance ai : combinedIndex.getIndex()
+                .getAnnotations(DotName.createSimple(FacesDataModel.class.getName())))
+        {
+            AnnotationValue forClass = ai.value("forClass");
+            if (forClass != null)
+            {
+                recorder.registerFacesDataModel(
+                        ai.target().asClass().name().toString(),
+                        forClass.asClass().name().toString());
+            }
+        }
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void buildFlowScopedMapping(MyFacesRecorder recorder,
+            CombinedIndexBuildItem combinedIndex) throws IOException
+    {
+        for (AnnotationInstance ai : combinedIndex.getIndex()
+                .getAnnotations(DotName.createSimple(FlowScoped.class.getName())))
+        {
+            AnnotationValue flowId = ai.value("value");
+            if (flowId != null && flowId.asString() != null)
+            {
+                AnnotationValue definingDocumentId = ai.value("definingDocumentId");
+                recorder.registerFlowReference(ai.target().asClass().name().toString(),
+                        definingDocumentId == null ? "" : definingDocumentId.asString(),
+                        flowId.asString());
+            }
+        }
+    }
+
+    @BuildStep
+    void produceApplicationArchiveMarker(
+            BuildProducer<AdditionalApplicationArchiveMarkerBuildItem> additionalArchiveMarkers)
+    {
+        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("org/primefaces/component"));
+        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("javax/faces/component"));
+        additionalArchiveMarkers.produce(new AdditionalApplicationArchiveMarkerBuildItem("org/apache/myfaces/view"));
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void registerForLimitedReflection(MyFacesRecorder recorder,
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            CombinedIndexBuildItem combinedIndex)
+    {
+        List<String> classNames = new ArrayList<>();
+        List<Class<?>> classes = new ArrayList<>();
+       
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, Renderer.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, ClientBehaviorRenderer.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, javax.el.ValueExpression.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, SystemEvent.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, FacesContext.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, Application.class.getName()));
+
+        for (String factory : FACTORIES)
+        {
+            classNames.addAll(collectClassAndSubclasses(combinedIndex, factory));
+        }
+
+        classNames.addAll(Arrays.asList(
+            "org.primefaces.config.PrimeEnvironment",
+            "com.lowagie.text.pdf.MappedRandomAccessFile",
+            "org.apache.myfaces.application._ApplicationUtils",
+            "org.apache.el.ExpressionFactoryImpl",
+            "org.primefaces.util.MessageFactory",
+            "javax.faces.component._DeltaStateHelper",
+            "javax.faces.component._DeltaStateHelper$InternalMap"));
+
+        classes.addAll(Arrays.asList(
+                DefaultWebConfigProviderFactory.class,
+                ErrorPageWriter.class,
+                DocumentBuilderFactoryImpl.class,
+                FuncLocalPart.class,
+                FuncNot.class,
+                MyFacesContainerInitializer.class,
+                RestoreViewSupport.class,
+                ExceptionQueuedEventContext.class,
+                FacesConfigurator.class,
+                FaceletsInitilializer.class,
+                TagLibraryConfig.class,
+                String.class,
+                ViewScopeProxyMap.class,
+                SAXCompiler.class,
+                StateUtils.class));
+
+        reflectiveClass.produce(
+                new ReflectiveClassBuildItem(false, false, classNames.toArray(new String[classNames.size()])));
+        reflectiveClass.produce(
+                new ReflectiveClassBuildItem(false, false, classes.toArray(new Class[classes.size()])));
+    }
+    
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void registerForMethodReflection(MyFacesRecorder recorder, BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+                               CombinedIndexBuildItem combinedIndex)
+    {        
+        List<String> classNames = new ArrayList<>();
+        List<Class<?>> classes = new ArrayList<>();
+        
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, TagHandler.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, ConverterHandler.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, ComponentHandler.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, ValidatorHandler.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, UIComponent.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, ELResolver.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, MethodRule.class.getName()));
+        classNames.addAll(collectClassAndSubclasses(combinedIndex, MetaRuleset.class.getName()));
+        classNames.addAll(Arrays.asList(
+                "org.primefaces.util.ComponentUtils",
+                "org.primefaces.expression.SearchExpressionUtils",
+                "org.primefaces.util.SecurityUtils",
+                "org.primefaces.util.LangUtils",
+                "javax.faces._FactoryFinderProviderFactory"));
+
+        classNames.addAll(collectImplementors(combinedIndex, Converter.class.getName()));
+        classNames.addAll(collectImplementors(combinedIndex, Validator.class.getName()));
+        classNames.addAll(collectImplementors(combinedIndex, Behavior.class.getName()));
+
+
+        classes.addAll(Arrays.asList(
+                ClassUtils.class,
+                FactoryFinderProviderFactory.class,
+                ComponentSupport.class,
+                QuarkusFactoryFinderProvider.class,
+                ELResolverBuilderForFaces.class,
+                AbstractFacesInitializer.class,
+                ExternalContextUtils.class,
+                BeanEntry.class));
+        
+        reflectiveClass.produce(
+                new ReflectiveClassBuildItem(true, false, classNames.toArray(new String[classNames.size()])));
+        reflectiveClass.produce(
+                new ReflectiveClassBuildItem(true, false, classes.toArray(new Class[classes.size()])));
+    }
+
+    
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void registerForFieldReflection(MyFacesRecorder recorder, BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+                               CombinedIndexBuildItem combinedIndex)
+    {     
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, 
+                "javax.faces.context._MyFacesExternalContextHelper"));
+    }
+
+    @BuildStep
+    void substrateResourceBuildItems(BuildProducer<NativeImageResourceBuildItem> nativeImageResourceProducer,
+                                     BuildProducer<NativeImageResourceBundleBuildItem> resourceBundleBuildItem)
+    {
+        nativeImageResourceProducer
+                .produce(new NativeImageResourceBuildItem("META-INF/maven/org.primefaces/primefaces/pom.properties"));
+        nativeImageResourceProducer.produce(new NativeImageResourceBuildItem(
+                "META-INF/rsc/myfaces-dev-error.xml",
+                "META-INF/rsc/myfaces-dev-debug.xml", 
+                "org/apache/myfaces/resource/default.dtd",
+                "org/apache/myfaces/resource/datatypes.dtd", 
+                "META-INF/web-fragment.xml",
+                "META-INF/resources/org/apache/myfaces/windowId/windowhandler.html",
+                "org/apache/myfaces/resource/facelet-taglib_1_0.dtd", 
+                "org/apache/myfaces/resource/javaee_5.xsd",
+                "org/apache/myfaces/resource/web-facelettaglibrary_2_0.xsd",
+                "org/apache/myfaces/resource/XMLSchema.dtd", 
+                "org/apache/myfaces/resource/facesconfig_1_0.dtd",
+                "org/apache/myfaces/resource/web-facesconfig_1_1.dtd",
+                "org/apache/myfaces/resource/web-facesconfig_1_2.dtd", 
+                "org/apache/myfaces/resource/web-facesconfig_2_0.dtd",
+                "org/apache/myfaces/resource/web-facesconfig_2_1.dtd",
+                "org/apache/myfaces/resource/web-facesconfig_2_2.dtd", 
+                "org/apache/myfaces/resource/web-facesconfig_2_3.dtd",
+                "org/apache/myfaces/resource/web-facesconfig_3_0.dtd",
+                "org/apache/myfaces/resource/xml.xsd",
+                "META-INF/rsc/myfaces-dev-error-include.xml",
+                "META-INF/services/javax.servlet.ServletContainerInitializer"));
+
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ar"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ca"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_cs"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_de"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_en"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_es"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_fr"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_it"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ja"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_mt"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_nl"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_pl"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_pt_PR"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_ru"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_sk"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_CN"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_HK"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.faces.Messages_zh_TW"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.el.PrivateMessages"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.servlet.LocalStrings"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("javax.el.LocalStrings"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("org.primefaces.Messages"));
+        resourceBundleBuildItem.produce(new NativeImageResourceBundleBuildItem("org.primefaces.Messages_en"));
+    }
+    
+    public List<String> collectClassAndSubclasses(CombinedIndexBuildItem combinedIndex, String className)
+    {
+        List<String> classes = combinedIndex.getIndex()
+                .getAllKnownSubclasses(DotName.createSimple(className))
+                .stream()
+                .map(ClassInfo::toString)
+                .collect(Collectors.toList());
+        classes.add(className);
+        return classes;
+    }
+
+    public List<String> collectImplementors(CombinedIndexBuildItem combinedIndex, String className)
+    {
+        List<String> classes = combinedIndex.getIndex()
+                .getAllKnownImplementors(DotName.createSimple(className))
+                .stream()
+                .map(ClassInfo::toString)
+                .collect(Collectors.toList());
+        classes.add(className);
+        return classes;
+    }
+    
+    @BuildStep
+    @Record(ExecutionTime.STATIC_INIT)
+    void registerWebappClassesForReflection(MyFacesRecorder recorder,
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            CombinedIndexBuildItem combinedIndex)
+    {     
+        List<String> classNames = new ArrayList<>();
+        classNames.addAll(Arrays.asList(
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView",
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView_ClientProxy",
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.Car",
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyCarDataModel",
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.CarService",
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazySorter"));
+        reflectiveClass.produce(
+                new ReflectiveClassBuildItem(true, false, classNames.toArray(new String[classNames.size()])));
+
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true,
+                "org.apache.myfaces.core.extensions.quarkus.showcase.view.LazyView_ClientProxy"));
+    }
+}
diff --git a/extensions/quarkus/pom.xml b/extensions/quarkus/pom.xml
index f1dd76c..006fe2c 100644
--- a/extensions/quarkus/pom.xml
+++ b/extensions/quarkus/pom.xml
@@ -37,6 +37,7 @@
     <modules>
         <module>deployment</module>
         <module>runtime</module>
+        <module>showcase</module>
     </modules>
 
     <properties>
diff --git a/extensions/quarkus/runtime/pom.xml b/extensions/quarkus/runtime/pom.xml
index 1bb275d..ffcd6ab 100644
--- a/extensions/quarkus/runtime/pom.xml
+++ b/extensions/quarkus/runtime/pom.xml
@@ -74,6 +74,61 @@
             <artifactId>quarkus-jsonp</artifactId>
             <version>${quarkus.version}</version>
         </dependency>
+        <dependency>
+            <groupId>jakarta.ejb</groupId>
+            <artifactId>jakarta.ejb-api</artifactId>
+            <version>3.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet.jsp.jstl</groupId>
+            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
+            <version>1.2.4</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId> <!-- primefaces fileupload, needed in quarkus native mode -->
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.3</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.xml.bind</groupId> <!-- java 11 support -->
+            <artifactId>jakarta.xml.bind-api</artifactId>
+            <version>2.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId> <!-- primefaces textEditor renderer -->
+            <artifactId>owasp-java-html-sanitizer</artifactId>
+            <version>20181114.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId> <!-- primefaces exporter -->
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>com.rometools</groupId> <!-- primefaces feed -->
+            <artifactId>rome</artifactId>
+            <version>1.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.librepdf</groupId>
+            <artifactId>openpdf</artifactId>
+            <version>1.2.21</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extensions/quarkus/showcase/README.md b/extensions/quarkus/showcase/README.md
new file mode 100644
index 0000000..7587c29
--- /dev/null
+++ b/extensions/quarkus/showcase/README.md
@@ -0,0 +1,35 @@
+# Quarkus MyFaces Showcase
+
+This sample application shows Quarkus Myfaces extension usage
+
+## Running
+
+`mvn clean package -DskipTests && java -jar ./target/quarkus-myfaces-showcase-1.0-SNAPSHOT-runner.jar`
+
+## Dev mode
+
+In [dev mode](https://quarkus.io/guides/maven-tooling#development-mode) you can easily debug and hot deploy your quarkus application:
+
+`mvn quarkus:dev` 
+
+> Hot deployment also works for facelets pages  
+
+## Native mode
+
+For native mode you need at least [graalvm 20](https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-20.0.0), see graalvm instalation [instructions here](https://quarkus.io/guides/building-native-image).
+
+Following is how to `build and run` the native image:
+
+`mvn clean package -Pnative && ./target/quarkus-myfaces-showcase-1.0-SNAPSHOT-runner`
+
+## Testing 
+
+Tests use [HTMLUnit](https://github.com/HtmlUnit/htmlunit) to retrieve web pages and assert their content.
+
+A `mvn clean test` will run JVM mode tests
+
+For `native mode ` tests use:
+
+```
+mvn verify -Pnative
+``` 
\ No newline at end of file
diff --git a/extensions/quarkus/showcase/pom.xml b/extensions/quarkus/showcase/pom.xml
index 57abf1b..90823ad 100644
--- a/extensions/quarkus/showcase/pom.xml
+++ b/extensions/quarkus/showcase/pom.xml
@@ -59,18 +59,34 @@
             <artifactId>myfaces-quarkus-runtime</artifactId>
             <version>${myfaces.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.primefaces</groupId>
             <artifactId>primefaces</artifactId>
             <version>7.0</version>
         </dependency>
-
         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
             <version>2.0.1.Final</version>
         </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <version>${quarkus.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sourceforge.htmlunit</groupId>
+            <artifactId>htmlunit</artifactId>
+            <version>2.35.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>3.6.2</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/InputController.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/InputController.java
index 4afef5e..ca9a3ba 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/InputController.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/InputController.java
@@ -30,7 +30,7 @@
     

     @Inject

     @ManagedProperty(value = "#{carService}")

-    private CarService carService;

+    CarService carService;

     

     private String val;

 

diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazySorter.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazySorter.java
index 36bf76b..69167d0 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazySorter.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazySorter.java
@@ -21,6 +21,8 @@
 import java.util.Comparator;

 import org.primefaces.model.SortOrder;

 

+import static org.apache.commons.lang3.StringUtils.capitalize;

+

 public class LazySorter implements Comparator<Car> {

  

     private String sortField;

@@ -34,15 +36,15 @@
     @Override

     public int compare(Car car1, Car car2) {

         try {

-            Object value1 = Car.class.getField(this.sortField).get(car1);

-            Object value2 = Car.class.getField(this.sortField).get(car2);

+            Object value1 = Car.class.getMethod("get"+capitalize(this.sortField)).invoke(car1);

+            Object value2 = Car.class.getMethod("get"+capitalize(this.sortField)).invoke(car2);

  

             int value = ((Comparable) value1).compareTo(value2);

              

             return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;

         } 

         catch(Exception e) {

-            throw new RuntimeException();

+            throw new RuntimeException(e);

         }

     }

 }

diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazyView.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazyView.java
index 9d8b664..e83e5d9 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazyView.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/LazyView.java
@@ -37,7 +37,7 @@
     private Car selectedCar;

 

     @Inject

-    private CarService service;

+    CarService service;

 

     @PostConstruct

     public void init() {

diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MethodHandleELResolverBean.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MethodHandleELResolverBean.java
index 1c4a5aa..f2e15f4 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MethodHandleELResolverBean.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MethodHandleELResolverBean.java
@@ -33,7 +33,7 @@
 public class MethodHandleELResolverBean implements Serializable, PhaseListener {

 

     @Inject

-    private CarService service;

+    CarService service;

     

     private List<Car> cars;

     

diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyBacking.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyBacking.java
index 67842a8..28e3fd7 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyBacking.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyBacking.java
@@ -27,7 +27,8 @@
 @RequestScoped

 public class MyBacking {

     

-    @Inject private CarService carService;

+    @Inject

+    CarService carService;

     

     private MyCollection<Car> cars;

     

diff --git a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyValidator.java b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyValidator.java
index 5d00659..7ee3370 100644
--- a/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyValidator.java
+++ b/extensions/quarkus/showcase/src/main/java/org/apache/myfaces/core/extensions/quarkus/showcase/view/MyValidator.java
@@ -28,7 +28,8 @@
 @FacesValidator(value = "myVal", managed = true)

 public class MyValidator implements Validator<String>{

     

-    @Inject private CarService carService;

+    @Inject

+    CarService carService;

     

     public MyValidator()

     {

diff --git a/extensions/quarkus/showcase/src/main/resources/application.properties b/extensions/quarkus/showcase/src/main/resources/application.properties
index 8136836..cf94889 100644
--- a/extensions/quarkus/showcase/src/main/resources/application.properties
+++ b/extensions/quarkus/showcase/src/main/resources/application.properties
@@ -13,5 +13,7 @@
 # limitations under the License.
 
 quarkus.log.console.format=%s%n
-javax.faces.PROJECT_STAGE = Production
-javax.faces.ENABLE_WEBSOCKET_ENDPOINT=true
\ No newline at end of file
+javax.faces.PROJECT_STAGE=Development
+javax.faces.ENABLE_WEBSOCKET_ENDPOINT=true
+quarkus.log.console.level=INFO
+quarkus.log.file.path=/tmp/debug.log
\ No newline at end of file
diff --git a/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesNativeIT.java b/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesNativeIT.java
new file mode 100644
index 0000000..5674136
--- /dev/null
+++ b/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesNativeIT.java
@@ -0,0 +1,7 @@
+package org.apache.myfaces.core.extensions.quarkus.showcase;
+
+import io.quarkus.test.junit.NativeImageTest;
+
+@NativeImageTest
+public class QuarkusMyFacesNativeIT extends QuarkusMyFacesShowcaseTest {
+}
diff --git a/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesShowcaseTest.java b/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesShowcaseTest.java
new file mode 100644
index 0000000..d4fe663
--- /dev/null
+++ b/extensions/quarkus/showcase/src/test/java/org/apache/myfaces/core/extensions/quarkus/showcase/QuarkusMyFacesShowcaseTest.java
@@ -0,0 +1,43 @@
+package org.apache.myfaces.core.extensions.quarkus.showcase;
+
+import com.gargoylesoftware.htmlunit.BrowserVersion;
+import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlDivision;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import io.quarkus.test.common.http.TestHTTPResource;
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Test;
+
+import java.net.URL;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
+
+@QuarkusTest
+public class QuarkusMyFacesShowcaseTest {
+
+    @TestHTTPResource
+    URL url;
+
+    @Test
+    public void shouldOpenIndexPage() throws Exception {
+        try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
+            webClient.getOptions().setJavaScriptEnabled(true);
+            webClient.getOptions().setCssEnabled(false);
+            webClient.getOptions().setUseInsecureSSL(true);
+            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
+            webClient.getCookieManager().setCookiesEnabled(true);
+            webClient.setAjaxController(new NicelyResynchronizingAjaxController());
+            webClient.getCookieManager().setCookiesEnabled(true);
+
+            final HtmlPage page = webClient.getPage(url + "/index.xhtml");
+
+            final HtmlDivision datatable = (HtmlDivision) page.getElementById("form:carTable");
+
+            assertThat(datatable).isNotNull();
+            assertThat(datatable.getByXPath("//tr[contains(@role,'row') and contains(@class,'ui-datatable-selectable')]"))
+                    .hasSize(10);
+
+        }
+    }
+}