Skip to content

JP2K with OpenJpegProcessor and AutomaticSelectionStrategy #870

@vljukap98

Description

@vljukap98

It seems as if my OpenJpeg processor works only when processor.selection_strategy=ManualSelectionStrategy and processor.ManualSelectionStrategy.jp2=OpenJpegProcessor.

When my cantaloupe.properties defines processor.selection_strategy=AutomaticSelectionStrategy and I try to request a jp2 image with OpenJPEG installed on my system (or via docker). The cantaloupe processing fails, actual server log doesn't show anything interesting, but the stack trace is actually included in the failed response:

500 Internal Server Error



java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
	at edu.illinois.library.cantaloupe.processor.ProcessorFactory.newProcessor(ProcessorFactory.java:100)
	at edu.illinois.library.cantaloupe.resource.ImageRequestHandler.handle(ImageRequestHandler.java:385)
	at edu.illinois.library.cantaloupe.resource.iiif.v2.ImageResource.doGET(ImageResource.java:141)
	at edu.illinois.library.cantaloupe.resource.HandlerServlet.handle(HandlerServlet.java:97)
	at edu.illinois.library.cantaloupe.resource.HandlerServlet.doGet(HandlerServlet.java:35)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:500)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.Server.handle(Server.java:563)
	at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
	at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2285)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:822)
	at java.base/java.lang.System.loadLibrary(System.java:1685)
	at kdu_jni.Kdu_message.<clinit>(Kdu_message.java:5)
	at edu.illinois.library.cantaloupe.processor.codec.jpeg2000.JPEG2000KakaduImageReader.<clinit>(JPEG2000KakaduImageReader.java:197)
	at edu.illinois.library.cantaloupe.processor.KakaduNativeProcessor.<init>(KakaduNativeProcessor.java:77)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	... 31 more

The line it fails on is

Processor candidate = class_.getDeclaredConstructor().newInstance();

The thing I narrowed it down to is that because the KakaduNativeProcessor is defined FIRST in JP2_CANDIDATES (here:

private static final List<Class<? extends Processor>> JP2_CANDIDATES = List.of(
KakaduNativeProcessor.class,
OpenJpegProcessor.class,
GrokProcessor.class);
) the instantiating fails, and the whole request fails.

I tried manually replacing the order by putting OpenJpegProcessor as the first element in JP2_CANDIDATES and the request succeeds.

Am I missing an additional configuration that should try to find anything (instead of failing on the first one) available for image processors, or defining the processor order (instead of editing the source code)?

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions