coldbox-modules / quick

A ColdBox ORM Engine
https://quick.ortusbooks.com
MIT License
23 stars 19 forks source link

.deleteAll() substitutes foreign key with "true" #124

Open MordantWastrel opened 4 years ago

MordantWastrel commented 4 years ago

We have an invoice entity that hasMany lineItems, and in the preDelete() interceptor we had this code:

this.lineItems().deleteAll()

The resulting query was (from memory now, but the important part is right)

DELETE FROM invoice_lineItems WHERE invoiceID = [true]

this.getLineItems() works fine, as does this.ineItems().toSQL() -- the FK is correctly populated.

As a workaround, this works:

this.getLineItems()
    .each( ( l ) => {
        l.delete();
    } );

Overkill for what's needed but we only ever have 1-3 line items so it's not a big deal. I don't think I've ever used .deleteAll() before now.

Quick 4.1.3, qb 8.0.3

elpete commented 4 years ago

Does this work outside a preDelete lifecycle method?

elpete commented 4 years ago

I want to make sure we fix this as it is definitely a bug. However, I also want to point out that Quick encourages you to use database foreign keys and cascading for this purpose. Having your ORM handle relationship consistency is an extra overhead for your CFML server(s) and can be a source of orphan records. None of those problems exist when using database foreign keys and cascading.

I mention this because above you said this happens in the preDelete lifecycle for the parent entity. deleteAll should work, but it is more applicable when you aren't also deleting the parent entity.

elpete commented 4 years ago

I'm unable to recreate this. Can you please provide your Invoice and InvoiceLineItem entities?

MordantWastrel commented 4 years ago

We ordinarily would cascade, but there is some business logic associated with the deletion that has to happen on the app side: these objects synchronize with Stripe invoice objects and so we can't just delete them without doing other stuff first.

I took the objects out of a test spec and put them in a simple scrap-work handler and reproduced it, but it's only impacting one of two hasMany relationships -- it works correctly on the other one! But both relationships work correctly in their usage otherwise. This tells me that something is different about the "bad" relationship but we've been using that relationship in practice for a while and deleteAll() is the only thing that has a problem with it. In my tests below, I just have an invoice instance and don't even have any of the related objects in the DB -- it's just the SQL that's being generated incorrectly.

Here are the entities with irrelevant properties and functions removed.

qInvoiceInstance.cfc

component extends="model.q.inLeagueBaseEntity" table="invoice_instances" accessors=true {

    /* properties */

    property name="instanceID" type="numeric" sqltype="integer";
    property name="invoiceID" type="string" sqltype="idstamp"; 
    property name="entityID" type="string" sqltype="idstamp";
    property name="entity_type" type="string" sqltype="varchar" default="qChild";

    /* === PRIMARY KEY === */
    variables._key = "instanceID";

      // this one deletes just fine!
        function lineItems() {
        return hasMany( relationName = "qInvoiceLineItem@invoices", foreignKey = "instanceID", localKey = "instanceID" );
    }

       // this one does not
    function subscriptions() {
        return hasMany(
            relationName = "qInvoiceSubscription@invoices",
            foreignKey = "instanceID",
            localKey = "instanceID"
        );
    }

       function preDelete() {
        this.subscriptions()
            .deleteAll();
        this.lineItems()
            .deleteAll();
    }
}

qInvoiceSubscription.cfc

component extends="model.q.inLeagueBaseEntity" table="invoice_subscriptions" accessors=true {

    /* properties */
    property name="localSubscriptionID" type="numeric" sqltype="integer"; // PK
    property name="instanceID" type="numeric" sqltype="integer"; // FK qInvoiceInstance

    /* non-persistent fields / injected values */
    property name="interceptorService" inject="coldbox:interceptorService" persistent=false;

    /* === PRIMARY KEY === */
    variables._key = "localSubscriptionID";

    /* === RELATIONSHIPS === */

    function invoiceInstance() {
        return belongsTo( relationName = "qInvoiceInstance@invoices", foreignKey = "instanceID" );
    }
}

qInvoiceLineItems.cfc

component extends="model.q.inLeagueBaseEntity" table="invoice_lineItems" accessors=true {

    property name="lineItemID"          type="numeric" sqltype="integer";
    property name="instanceID"          type="numeric" sqltype="integer";

    variables._key = "lineItemID";

    /* === RELATIONSHIPS === */

    function invoice() {
        return belongsTo( relationName = "qInvoiceInstance@invoices", foreignKey = 'instanceID' );
    }
}

If I create a brand new qInvoiceInstance called invoice that has zero related entities, I can run the following tests:

invoice.subscriptions().toSQL( showBindings = true ); shows the correct SQL to get subscriptions invoice.lineItems().toSQL( showBindings = true ); shows the correct SQL to get line items

invoice.lineItems().deleteAll() works.

invoiceInstance.subscriptions().deleteAll() produces this query:

DELETE FROM [invoice_subscriptions] WHERE ([invoice_subscriptions].[instanceID] = true AND [invoice_subscriptions].[instanceID] IS NOT NULL) AND [invoice_subscriptions].[instanceID] IS NOT NULL)
--

With this stack trace:

lucee.runtime.exp.DatabaseException: The index 2 is out of range.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:1124)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.$fr$setObject(SQLServerPreparedStatement.java:1514)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java)
    at lucee.runtime.db.SQLCaster.setValue(SQLCaster.java:283)
    at lucee.runtime.type.QueryImpl.setItems(QueryImpl.java:372)
    at lucee.runtime.type.QueryImpl.execute(QueryImpl.java:279)
    at lucee.runtime.type.QueryImpl.<init>(QueryImpl.java:225)
    at lucee.runtime.tag.Query.executeDatasoure(Query.java:1094)
    at lucee.runtime.tag.Query._doEndTag(Query.java:672)
    at lucee.runtime.tag.Query.doEndTag(Query.java:552)
    at lucee.runtime.functions.query.QueryExecute.call(QueryExecute.java:86)
    at models.grammars.basegrammar_cfc$cf.udfCall1(/qb/models/Grammars/BaseGrammar.cfc:104)
    at models.grammars.basegrammar_cfc$cf.udfCall(/qb/models/Grammars/BaseGrammar.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:682)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.call(ComponentImpl.java:1900)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at models.query.querybuilder_cfc$cf.udfCalle(/qb/models/Query/QueryBuilder.cfc:2830)
    at models.query.querybuilder_cfc$cf.udfCall(/qb/models/Query/QueryBuilder.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.type.scope.UndefinedImpl.call(UndefinedImpl.java:779)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at models.query.querybuilder_cfc$cf.udfCallb(/qb/models/Query/QueryBuilder.cfc:2416)
    at models.query.querybuilder_cfc$cf.udfCall(/qb/models/Query/QueryBuilder.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:683)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:578)
    at lucee.runtime.SuperComponent.callWithNamedValues(SuperComponent.java:93)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:864)
    at lucee.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1732)
    at models.quickbuilder_cfc$cf.udfCall1(/quick/models/QuickBuilder.cfc:102)
    at models.quickbuilder_cfc$cf.udfCall(/quick/models/QuickBuilder.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.type.scope.UndefinedImpl.call(UndefinedImpl.java:779)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at models.quickbuilder_cfc$cf.udfCall1(/quick/models/QuickBuilder.cfc:158)
    at models.quickbuilder_cfc$cf.udfCall(/quick/models/QuickBuilder.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:683)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1919)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:898)
    at lucee.runtime.functions.dynamicEvaluation.Invoke.call(Invoke.java:49)
    at models.baseentity_cfc$cf.udfCallg(/quick/models/BaseEntity.cfc:2951)
    at models.baseentity_cfc$cf.udfCall(/quick/models/BaseEntity.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.type.scope.UndefinedImpl.call(UndefinedImpl.java:779)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at models.baseentity_cfc$cf.udfCallf(/quick/models/BaseEntity.cfc:2696)
    at models.baseentity_cfc$cf.udfCall(/quick/models/BaseEntity.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:682)
    at lucee.runtime.ComponentImpl.onMissingMethod(ComponentImpl.java:609)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:572)
    at lucee.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1919)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:898)
    at lucee.runtime.functions.dynamicEvaluation.Invoke.call(Invoke.java:49)
    at models.relationships.baserelationship_cfc$cf.udfCall3(/quick/models/Relationships/BaseRelationship.cfc:332)
    at models.relationships.baserelationship_cfc$cf.udfCall(/quick/models/Relationships/BaseRelationship.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:682)
    at lucee.runtime.ComponentImpl.onMissingMethod(ComponentImpl.java:609)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:572)
    at lucee.runtime.ComponentImpl.call(ComponentImpl.java:1900)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at handlers.play_cfc$cf$a.udfCall1(/handlers/Play.cfc:82)
    at handlers.play_cfc$cf$a.udfCall(/handlers/Play.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:683)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1919)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:898)
    at lucee.runtime.functions.dynamicEvaluation.Invoke.call(Invoke.java:49)
    at system.web.controller_cfc$cf.udfCall3(/coldbox/system/web/Controller.cfc:1136)
    at system.web.controller_cfc$cf.udfCall(/coldbox/system/web/Controller.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.type.scope.UndefinedImpl.callWithNamedValues(UndefinedImpl.java:792)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:864)
    at lucee.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1732)
    at system.web.controller_cfc$cf.udfCall3(/coldbox/system/web/Controller.cfc:932)
    at system.web.controller_cfc$cf.udfCall(/coldbox/system/web/Controller.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.type.scope.UndefinedImpl.callWithNamedValues(UndefinedImpl.java:792)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:864)
    at lucee.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1732)
    at system.web.controller_cfc$cf.udfCall2(/coldbox/system/web/Controller.cfc:642)
    at system.web.controller_cfc$cf.udfCall(/coldbox/system/web/Controller.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:207)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:683)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1919)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:864)
    at lucee.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1732)
    at coldbox.system.bootstrap_cfc$cf.udfCall1(/coldbox/system/Bootstrap.cfc:259)
    at coldbox.system.bootstrap_cfc$cf.udfCall(/coldbox/system/Bootstrap.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.type.scope.UndefinedImpl.call(UndefinedImpl.java:779)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at coldbox.system.bootstrap_cfc$cf.udfCall1(/coldbox/system/Bootstrap.cfc:484)
    at coldbox.system.bootstrap_cfc$cf.udfCall(/coldbox/system/Bootstrap.cfc)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:682)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.call(ComponentImpl.java:1900)
    at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:785)
    at lucee.runtime.PageContextImpl.getFunction(PageContextImpl.java:1713)
    at application_cfc$cf.udfCall(/Application.cfc:227)
    at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
    at lucee.runtime.type.UDFImpl._call(UDFImpl.java:344)
    at lucee.runtime.type.UDFImpl.call(UDFImpl.java:217)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:682)
    at lucee.runtime.ComponentImpl._call(ComponentImpl.java:570)
    at lucee.runtime.ComponentImpl.call(ComponentImpl.java:1900)
    at lucee.runtime.listener.ModernAppListener.call(ModernAppListener.java:436)
    at lucee.runtime.listener.ModernAppListener._onRequest(ModernAppListener.java:132)
    at lucee.runtime.listener.ModernAppListener.onRequest(ModernAppListener.java:104)
    at lucee.runtime.PageContextImpl.execute(PageContextImpl.java:2419)
    at lucee.runtime.PageContextImpl._execute(PageContextImpl.java:2409)
    at lucee.runtime.PageContextImpl.executeCFML(PageContextImpl.java:2384)
    at lucee.runtime.engine.Request.exe(Request.java:43)
    at lucee.runtime.engine.CFMLEngineImpl._service(CFMLEngineImpl.java:1171)
    at lucee.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:1117)
    at lucee.loader.engine.CFMLEngineWrapper.serviceCFML(CFMLEngineWrapper.java:97)
    at lucee.loader.servlet.CFMLServlet.service(CFMLServlet.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
    at org.cfmlprojects.regexpathinfofilter.RegexPathInfoFilter.doFilter(RegexPathInfoFilter.java:47)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:251)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:186)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImpl(RequestDispatcherImpl.java:227)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImplSetup(RequestDispatcherImpl.java:149)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:111)
    at org.cfmlprojects.regexpathinfofilter.RegexPathInfoFilter.doFilter(RegexPathInfoFilter.java:45)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:251)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:186)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImpl(RequestDispatcherImpl.java:227)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forwardImplSetup(RequestDispatcherImpl.java:149)
    at io.undertow.servlet.spec.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:111)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at jdk.internal.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.intergral.fusionreactor.j2ee.filterchain.WrappedFilterChain.doFilter(WrappedFilterChain.java:134)
    at com.intergral.fusionreactor.j2ee.filter.FusionReactorRequestHandler.doNext(FusionReactorRequestHandler.java:772)
    at com.intergral.fusionreactor.j2ee.filter.FusionReactorRequestHandler.doHttpServletRequest(FusionReactorRequestHandler.java:344)
    at com.intergral.fusionreactor.j2ee.filter.FusionReactorRequestHandler.doFusionRequest(FusionReactorRequestHandler.java:207)
    at com.intergral.fusionreactor.j2ee.filter.FusionReactorRequestHandler.handle(FusionReactorRequestHandler.java:809)
    at com.intergral.fusionreactor.j2ee.filter.FusionReactorCoreFilter.doFilter(FusionReactorCoreFilter.java:36)
    at jdk.internal.reflect.GeneratedMethodAccessor37.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.intergral.fusionreactor.j2ee.filterchain.WrappedFilterChain.doFilter(WrappedFilterChain.java:71)
    at jdk.internal.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.intergral.fusionreactor.agent.filter.FusionReactorStaticFilter.doFilter(FusionReactorStaticFilter.java:54)
    at com.intergral.fusionreactor.agent.pointcuts.NewFilterChainPointCut$1.invoke(NewFilterChainPointCut.java:42)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)