Somewhat major change with ConstraintsContainer/AccessConstraintsBuilder & such since .13 (or .12 or earlier?)

A little over a year ago with help from @stukalov (and others) I developed a constraint scheme that used .withInMemory to build what I needed using Predicates. That thread was Access Groups: Why only one per user? - #29 от пользователя peterson.br . (It builds in-memory constraints within a AuthenticationEventListener in the userLoggedIn event for the logged-in user.)

I’ve now come back and updated to .15 and there were issues.

Before, I had:

        ConstraintsContainer newConstraints = AccessConstraintsBuilder.create()
                .join(session.getConstraints())
                .withInMemory(NoteType.class, operationsRUD, isUserAllowedNoteType)
                .withInMemory(PatientNotes.class, operationsRUD, isUserAllowedPatientNote)
                .build();

Where isUserAllowedNoteType and isUserAllowedPatientNote were defined simply as Predicates. This previously compiled and it all worked perfectly.

Now on updating to .15 the withInMemory calls were highlighted in red complaining that the third argument couldn’t be cast to ConstraintPredicate. So apparently that method was changed and now needs a ConstraintPredicate and not simply a Predicate. Ok, so I redefined both of those to be ConstraintPredicates. Red highlighting gone, and it all compiles.

HOWEVER…

The server does start, but when I go to login to the application, it crashes, with a very long cascade of exceptions…

INFO: Server startup in [11,588] milliseconds
08:14:39.666 ERROR com.haulmont.cuba.web.AppUI             - Unable to init ui
java.lang.RuntimeException: Unable to login as anonymous!
	at com.haulmont.cuba.web.DefaultApp.loginOnStart(DefaultApp.java:314) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.AppUI.setupUI(AppUI.java:534) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.AppUI.init(AppUI.java:358) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.vaadin.ui.UI.doInit(UI.java:738) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:209) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:67) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1580) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.9.2-27-cuba.jar:8.9.2-27-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.2.15.jar:7.2.15]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[servlet-api.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.27]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.2.16.RELEASE.jar:5.2.16.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.2.16.RELEASE.jar:5.2.16.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.2.15.jar:7.2.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[catalina.jar:9.0.27]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[catalina.jar:9.0.27]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.27]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) ~[catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[catalina.jar:9.0.27]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[catalina.jar:9.0.27]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) ~[tomcat-coyote.jar:9.0.27]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) ~[tomcat-coyote.jar:9.0.27]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) ~[tomcat-coyote.jar:9.0.27]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) ~[tomcat-coyote.jar:9.0.27]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.27]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.27]
	at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
Caused by: com.haulmont.cuba.security.global.InternalAuthenticationException: Exception is thrown by login provider
	at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:208) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.ConnectionImpl.login(ConnectionImpl.java:91) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.DefaultApp.loginOnStart(DefaultApp.java:312) ~[cuba-web-7.2.15.jar:7.2.15]
	... 38 common frames omitted
Caused by: com.haulmont.cuba.core.sys.serialization.SerializationException: Failed to deserialize object type
	at com.haulmont.cuba.core.sys.serialization.StandardSerialization.deserialize(StandardSerialization.java:73) ~[cuba-global-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.core.sys.serialization.StandardSerialization.deserialize(StandardSerialization.java:90) ~[cuba-global-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.core.sys.serialization.SerializationSupport.deserialize(SerializationSupport.java:71) ~[cuba-global-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:174) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.sun.proxy.$Proxy30.getAnonymousSession(Unknown Source) ~[na:na]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.getAnonymousSessionFromService(WebAnonymousSessionHolder.java:74) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.initializeAnonymousSession(WebAnonymousSessionHolder.java:65) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.checkInitialized(WebAnonymousSessionHolder.java:54) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.getAnonymousSession(WebAnonymousSessionHolder.java:43) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.providers.AnonymousLoginProvider.login(AnonymousLoginProvider.java:51) ~[cuba-web-7.2.15.jar:7.2.15]
	at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:192) ~[cuba-web-7.2.15.jar:7.2.15]
	... 40 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.medflex.medflexj.constraintpredicates.IsUserAllowedPatientNote
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365) ~[catalina.jar:9.0.27]
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) ~[catalina.jar:9.0.27]
	at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
	at java.base/java.lang.Class.forName(Class.java:398) ~[na:na]
	at org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:993) ~[commons-lang3-3.9.jar:3.9]
	at org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:1027) ~[commons-lang3-3.9.jar:3.9]
	at com.haulmont.cuba.core.sys.serialization.StandardSerialization$1.resolveClass(StandardSerialization.java:65) ~[cuba-global-7.2.15.jar:7.2.15]
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1995) ~[na:na]
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1862) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2169) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2464) ~[na:na]
	at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2358) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451) ~[na:na]
	at java.base/java.util.ArrayList.readObject(ArrayList.java:929) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1175) ~[na:na]
	at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2325) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451) ~[na:na]
	at java.base/java.util.HashMap.readObject(HashMap.java:1460) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1175) ~[na:na]
	at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2325) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2464) ~[na:na]
	at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2358) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2464) ~[na:na]
	at java.base/java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:629) ~[na:na]
	at com.haulmont.cuba.security.global.UserSession.readObject(UserSession.java:125) ~[cuba-global-7.2.15.jar:7.2.15]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1175) ~[na:na]
	at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2325) ~[na:na]
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493) ~[na:na]
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451) ~[na:na]
	at com.haulmont.cuba.core.sys.serialization.StandardSerialization.deserialize(StandardSerialization.java:69) ~[cuba-global-7.2.15.jar:7.2.15]
	... 50 common frames omitted

The main issue seems to be the ClassNotFoundException for the predicates, but I have no idea why the classes wouldn’t be found…when they definitely were before…

IsUserAllowedPatientNote is:

package com.medflex.medflexj.constraintpredicates;

import com.haulmont.cuba.security.group.ConstraintPredicate;
import com.medflex.medflexj.entity.PatientNotes;
import com.medflex.medflexj.helper.DebugLog;

public class IsUserAllowedPatientNote implements ConstraintPredicate<PatientNotes> {

    public boolean test(PatientNotes note) {
        IsUserAllowedNoteType isUserAllowedNoteType = new IsUserAllowedNoteType();

        DebugLog.info(this.getClass(), "Testing patient note {} (delegates to if note type is allowed)", note);
        boolean result = isUserAllowedNoteType.test(note.getNoteType());

        if (result) {
            DebugLog.info(this.getClass(),"Note type allowed, so allowed");
            return true;
        } else {
            DebugLog.info(this.getClass(),"Note type NOT allowed, so NOT allowed");
            return false;
        }
    }
}

The other is a lot more complex, but the base issue here seems to be the classes not being found which is…odd.

Any help?

Rolling back via VCS, I’ve found that this all worked in .13 - in .14 and onwards, it does not.

Hi,
These classes must be located in the global module to be de-serialized when transferred from core to web layer.
Are they?

They are in core and have always been in core and as I said, this all worked in .13 and earlier. Is this an undocumented change from .14 and on?

I’ll relocate to global and see what happens.

Moving the predicates to global does indeed fix everything. Odd that it always worked pre-.14.

Change of behavior is most likely related to the fix NPE with in-memory read constraints in a cluster environment · Issue #3075 · cuba-platform/cuba · GitHub

The previous behavior was incorrect - in-memory constraints were not transferred to the web module and could not be applied there, though they should be.

1 Like