It seems to be related to numpy. Could you try creating a new environment specifically for this? So to avoid any corruption with package versions.
Unfortunately, I am not able to provide you one at the moment, maybe someone else has one at hand? Otherwise tomorrow I can send you one for sure! Best regards, Aurélien On Wed, 26 Mar 2025 at 13:28, Christoffer Emil Kristensen <c...@itu.dk.invalid> wrote: > Hello, > > No i did not use the python -m build command. I just tried doing that, so > inside the python folder i ran: > > Python -m build > > pip install --upgrade build > > Python3 -m pip install dist/pywy-1.0.0.0.tar.gz but this failed. I noticed > that it crated the pywy-0.7.1.tar.gz file, and i ran the command instead of > the pywy-1.(etc) and that worked. So i might be an idea to also update this > in the documentation 🙂 > > > > > But after running that the pip install dist/ command failed with the error: > > (base) christofferkristensen@Christoffers-MacBook-Air python % python3 -m > pip install dist/pywy-0.7.1.tar.gz > Processing ./dist/pywy-0.7.1.tar.gz > Installing build dependencies ... done > Getting requirements to build wheel ... done > Preparing metadata (pyproject.toml) ... done > Collecting cloudpickle==3.0.0 (from pywy==0.7.1) > Downloading cloudpickle-3.0.0-py3-none-any.whl.metadata (7.0 kB) > Collecting requests==2.31.0 (from pywy==0.7.1) > Downloading requests-2.31.0-py3-none-any.whl.metadata (4.6 kB) > Collecting numpy==1.19.5 (from pywy==0.7.1) > Downloading numpy-1.19.5.zip (7.3 MB) > ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.3/7.3 MB 13.0 MB/s eta > 0:00:00 > Installing build dependencies ... done > Getting requirements to build wheel ... done > ERROR: Exception: > Traceback (most recent call last): > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", > line 180, in exc_logging_wrapper > status = run_func(*args) > ^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", > line 245, in wrapper > return func(self, options, args) > ^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/commands/install.py", > line 377, in run > requirement_set = resolver.resolve( > ^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py", > line 95, in resolve > result = self._result = resolver.resolve( > ^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py", > line 546, in resolve > state = resolution.resolve(requirements, max_rounds=max_rounds) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py", > line 427, in resolve > failure_causes = self._attempt_to_pin_criterion(name) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py", > line 239, in _attempt_to_pin_criterion > criteria = self._get_updated_criteria(candidate) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py", > line 230, in _get_updated_criteria > self._add_to_criteria(criteria, requirement, parent=candidate) > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py", > line 173, in _add_to_criteria > if not criterion.candidates: > ^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py", > line 156, in __bool__ > return bool(self._sequence) > ^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", > line 155, in __bool__ > return any(self) > ^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", > line 143, in <genexpr> > return (c for c in iterator if id(c) not in self._incompatible_ids) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", > line 47, in _iter_built > candidate = func() > ^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py", > line 182, in _make_candidate_from_link > base: Optional[BaseCandidate] = self._make_base_candidate_from_link( > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py", > line 228, in _make_base_candidate_from_link > self._link_candidate_cache[link] = LinkCandidate( > ^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 290, in __init__ > super().__init__( > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 156, in __init__ > self.dist = self._prepare() > ^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 222, in _prepare > dist = self._prepare_distribution() > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 301, in _prepare_distribution > return preparer.prepare_linked_requirement(self._ireq, > parallel_builds=True) > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/operations/prepare.py", > line 525, in prepare_linked_requirement > return self._prepare_linked_requirement(req, parallel_builds) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/operations/prepare.py", > line 640, in _prepare_linked_requirement > dist = _get_prepared_distribution( > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/operations/prepare.py", > line 71, in _get_prepared_distribution > abstract_dist.prepare_distribution_metadata( > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py", > line 54, in prepare_distribution_metadata > self._install_build_reqs(finder) > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py", > line 124, in _install_build_reqs > build_reqs = self._get_build_requires_wheel() > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py", > line 101, in _get_build_requires_wheel > return backend.get_requires_for_build_wheel() > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_internal/utils/misc.py", > line 745, in get_requires_for_build_wheel > return super().get_requires_for_build_wheel(config_settings=cs) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py", > line 166, in get_requires_for_build_wheel > return self._call_hook('get_requires_for_build_wheel', { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py", > line 321, in _call_hook > raise BackendUnavailable(data.get('traceback', '')) > pip._vendor.pyproject_hooks._impl.BackendUnavailable: Traceback (most > recent call last): > File > "/opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", > line 77, in _build_backend > obj = import_module(mod_path) > ^^^^^^^^^^^^^^^^^^^^^^^ > File "/opt/anaconda3/lib/python3.12/importlib/__init__.py", line 90, in > import_module > return _bootstrap._gcd_import(name[level:], package, level) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File "<frozen importlib._bootstrap>", line 1387, in _gcd_import > File "<frozen importlib._bootstrap>", line 1360, in _find_and_load > File "<frozen importlib._bootstrap>", line 1310, in > _find_and_load_unlocked > File "<frozen importlib._bootstrap>", line 488, in > _call_with_frames_removed > File "<frozen importlib._bootstrap>", line 1387, in _gcd_import > File "<frozen importlib._bootstrap>", line 1360, in _find_and_load > File "<frozen importlib._bootstrap>", line 1331, in > _find_and_load_unlocked > File "<frozen importlib._bootstrap>", line 935, in _load_unlocked > File "<frozen importlib._bootstrap_external>", line 995, in exec_module > File "<frozen importlib._bootstrap>", line 488, in > _call_with_frames_removed > File > "/private/var/folders/kq/74s0vpws7rb13lp23gc3ytd00000gn/T/pip-build-env-py7newgq/overlay/lib/python3.12/site-packages/setuptools/__init__.py", > line 18, in <module> > from setuptools.extern.six import PY3, string_types > ModuleNotFoundError: No module named 'setuptools.extern.six' > > > Do you have any idea with this is related to? > > If it is possible do you have a chance to send me an example of a correct > serialized wayang plan which i can test the api for? 🙂 > > ------------------------------ > *From:* Aurélien Bertrand <aurelien9.bertr...@gmail.com> > *Sent:* Wednesday, March 26, 2025 1:19 PM > *To:* dev@wayang.apache.org <dev@wayang.apache.org> > *Subject:* Re: Wayang REST api > > [You don't often get email from aurelien9.bertr...@gmail.com. Learn why > this is important at https://aka.ms/LearnAboutSenderIdentification ] > > Does it complain about not finding the dist folder? If so, you first need > to build the package with python -m build and then pip install (that step > is missing from the documentation). > > Let me know if you get other issues. > > > On Wed, 26 Mar 2025 at 13:05, Christoffer Emil Kristensen > <c...@itu.dk.invalid> wrote: > > > Hello, > > > > I am trying to do this, but it can not find the python packages we are > > importing. > > > > I tried to start setup python api per this guide: > > > https://github.com/apache/incubator-wayang/tree/9882b860ce1cda66382e9c1fa91e4e657397a233/python > > > > But i encountered an error when trying to run > > > > python3 -m pip install dist/pywy-1.0.0.tar.gz > > > > Do you think this could be related to not being able to find the modules > > that i try to import in python? > > ________________________________ > > From: Aurélien Bertrand <aurelien9.bertr...@gmail.com> > > Sent: Wednesday, March 26, 2025 1:00 PM > > To: dev@wayang.apache.org <dev@wayang.apache.org> > > Subject: Re: Wayang REST api > > > > [You don't often get email from aurelien9.bertr...@gmail.com. Learn why > > this is important at https://aka.ms/LearnAboutSenderIdentification ] > > > > Hi Christoffer, > > > > You can try to run the following once you have the Python package set up > (I > > recommend creating a conda env specifically for this, and running the > file > > outside the Wayang project): > > > > from pywy.dataquanta import WayangContextfrom pywy.platforms.java > > import JavaPlugin > > def word_count(): > > ctx = WayangContext() \ > > .register({JavaPlugin}) \ > > .textfile("file://path_to_some_input_text_file.txt") \ > > .store_textfile("file://path_to_where_you_want_to_store.txt") > > if __name__ == "__main__": > > word_count > > > > > > Then you should see in your terminal the JSON plan printed. Of course, > you > > can make it more complex by using other operators 😉 > > > > Best regards, > > Aurélien > > > > On Wed, 26 Mar 2025 at 12:36, Christoffer Emil Kristensen > > <c...@itu.dk.invalid> wrote: > > > > > Hello Juri, > > > > > > We are trying to setup python by the following guide: > > > > > > https://github.com/apache/incubator-wayang/tree/9882b860ce1cda66382e9c1fa91e4e657397a233/python > > > > > > But both me and @Jeppe Nordvi Halvorsen <h...@itu.dk> get this error > > when > > > running: > > > > > > python3 -m pip install dist/pywy-1.0.0.tar.gz > > > > > > > > > Do you know if there are any prerequisites to start using the python > api? > > > > > > Also, if you or anyone else have an example of a working wayang plan in > > > json format that you would be willing to send it would be appreciated. > > > > > > > > > ------------------------------ > > > *From:* Christoffer Emil Kristensen <c...@itu.dk.INVALID> > > > *Sent:* Wednesday, March 26, 2025 12:14 PM > > > *To:* dev@wayang.apache.org <dev@wayang.apache.org> > > > *Subject:* Re: Wayang REST api > > > > > > [You don't often get email from c...@itu.dk.invalid. Learn why this is > > > important at https://aka.ms/LearnAboutSenderIdentification ] > > > > > > Hello Juri, > > > > > > Yes i am aware that the filepath is set to mike//something, but i would > > > assume that it would fail with something similar to "file not found" > and > > > not a serialization or null pointer error. So, it was just to test that > > if > > > it would actually work with the wayang plan and hit the REST endpoint > and > > > start executing a wayang plan. > > > > > > I will look into the python api and see if I can get it running. > > > > > > Thank you for your reply! > > > > > > Best regards, > > > > > > Christoffer Kristensen > > > ________________________________ > > > From: Juri Petersen <j...@itu.dk.INVALID> > > > Sent: Tuesday, March 25, 2025 9:06 AM > > > To: dev@wayang.apache.org <dev@wayang.apache.org> > > > Subject: Re: Wayang REST api > > > > > > [You don't often get email from j...@itu.dk.invalid. Learn why this is > > > important at https://aka.ms/LearnAboutSenderIdentification ] > > > > > > Hi Christoffer, > > > What you are observing is not really a bug, but an old example of a > > > test-plan that we should remove. > > > If you look at the plans contents, you can see that some data is > > hardcoded > > > to be on a system with a mike user, and I am pretty sure this will > never > > be > > > true for your setup ?? > > > > > > I am not sure if any of the example plans in the resources folder there > > > are up-to-date and work. > > > It is probably easiest to run one of our python-api examples and just > put > > > a print statement for the json-payload on the python side of things. > > > Looking at this code, if you execute any of the python examples, a > > > json-body should be printed: > > > > > > > > > > > > https://github.com/apache/incubator-wayang/blob/9882b860ce1cda66382e9c1fa91e4e657397a233/python/src/pywy/core/core.py#L139 > > > > > > I hope this helps, if not let me know. > > > > > > Best, > > > Juri > > > ________________________________ > > > From: Alexander Alten <a...@scalytics.io> > > > Sent: 24 March 2025 17:26 > > > To: dev@wayang.apache.org <dev@wayang.apache.org> > > > Subject: Re: Wayang REST api > > > > > > Hi Christopher, > > > > > > That looks like a bug, would you please open a report for it? > > > > > > Thank you, > > > —Alex > > > > > > > On Mar 23, 2025, at 21:52, Christoffer Emil Kristensen > > > <c...@itu.dk.invalid> wrote: > > > > > > > > Hello everyone, > > > > > > > > We are two students from the IT-University at Copenhagen working on > > > creating a web interface for Apache Wayang as part of our master > thesis. > > > > > > > > We are currently working with the REST api to execute a wayang plan. > I > > > have a few questions though. > > > > > > > > When i try to run the plan which is an example in the repo: > > > > > > https://github.com/apache/incubator-wayang/blob/main/wayang-api/wayang-api-json/src/test/resources/test-plan-a.json > > > < > > > > > > https://www.google.com/url?q=https://github.com/apache/incubator-wayang/blob/main/wayang-api/wayang-api-json/src/test/resources/test-plan-a.json&source=gmail-imap&ust=1743367966000000&usg=AOvVaw1SR8clzuiWewqIRRClZGwr > > > > > > > > > > > > I get the following error: > > > > > > > > > > > > > > > > > > > > I submit the pla through postman at the following url: > > > http://localhost:8080/wayang-api-json/submit-plan/json < > > > > > > https://www.google.com/url?q=http://localhost:8080/wayang-api-json/submit-plan/json&source=gmail-imap&ust=1743367966000000&usg=AOvVaw0cpYF3QFzZlBJcWdHIwXsK > > > > > > > > > > > > With the JSON test-plan-a. And my header only contain Content-Type > > > application/json > > > > > > > > If i for example, try to run another example without the context > > > specified in the wayang plan i get a deserialization error. Does anyone > > > have any documentation on how to use the API and if i am missing > > something. > > > > > > > > Btw i would assume that running the plan gave me an error as i might > > not > > > have access to the specified filepath, but i would assume that if this > > was > > > the problem i would receive another error. > > > > > > > > This is the entire error: > > > > java.lang.NullPointerException > > > > at > > > > > > org.apache.wayang.api.json.builder.JsonPlanBuilder.setConfiguration(JsonPlanBuilder.scala:107) > > > > at > > > > > > org.apache.wayang.api.json.builder.JsonPlanBuilder.fromPlan(JsonPlanBuilder.scala:82) > > > > at > > > org.apache.wayang.api.json.Main$.$anonfun$jsonRoute$7(Main.scala:57) > > > > at > > > > > > zio.ZIOCompanionVersionSpecific.$anonfun$attempt$1(ZIOCompanionVersionSpecific.scala:100) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:904) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:1024) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:1024) > > > > at > > > zio.internal.FiberRuntime.evaluateEffect(FiberRuntime.scala:381) > > > > at zio.internal.FiberRuntime.start(FiberRuntime.scala:1339) > > > > at zio.Runtime$UnsafeAPIV1.runOrFork(Runtime.scala:160) > > > > at zio.http.netty.NettyRuntime.run(NettyRuntime.scala:52) > > > > at zio.http.netty.NettyRuntime.run$(NettyRuntime.scala:29) > > > > at > > > zio.http.netty.NettyRuntime$$anon$1.run(NettyRuntime.scala:105) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.writeResponse(ServerInboundHandler.scala:300) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.channelRead0(ServerInboundHandler.scala:96) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.channelRead0(ServerInboundHandler.scala:42) > > > > at > > > > > > io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.flush.FlushConsolidationHandler.channelRead(FlushConsolidationHandler.java:152) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93) > > > > at > > > > > > io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) > > > > at > > > > > > io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) > > > > at > > > > > > io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) > > > > at > io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) > > > > at > > > > > > io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) > > > > at > > > > io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) > > > > at > > > > > > io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) > > > > at java.base/java.lang.Thread.run(Thread.java:829) > > > > > > > > > > > > And when running without the context, as per the following example: > > > > > > https://github.com/apache/incubator-wayang/blob/main/wayang-api/wayang-api-json/src/test/resources/test-plan-a.json > > > < > > > > > > https://www.google.com/url?q=https://github.com/apache/incubator-wayang/blob/main/wayang-api/wayang-api-json/src/test/resources/test-plan-a.json&source=gmail-imap&ust=1743367966000000&usg=AOvVaw1SR8clzuiWewqIRRClZGwr > > > > > > > > > > > > I get the error: > > > > > > > > com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot > > > deserialize value of type > > > `org.apache.wayang.api.json.operatorfromjson.PlanFromJson` from Array > > value > > > (token `JsonToken.START_ARRAY`) > > > > at [Source: (String)"[ > > > > { > > > > "id": 1, > > > > "cat": "input", > > > > "input": [], > > > > "output": [2], > > > > "operatorName": "textFileInput", > > > > "data": { > > > > "filename": "file:///home/mike/json-api-examples/in1.txt" > > > > } > > > > }, > > > > { > > > > "id": 2, > > > > "cat": "unary", > > > > "input": [1], > > > > "output": [3], > > > > "operatorName": "map", > > > > "data": { > > > > "udf": "(s: String) => s.toInt" > > > > } > > > > }, > > > > { > > > > "cat": "composed", > > > > "operatorName": "composed", > > > > "operators": [ > > > > { > > > > "id": 3, > > > > "cat": "unary", > > > > "[truncated 716 chars]; line: 1, column: 1] > > > > at > > > > > > com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) > > > > at > > > > > > com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752) > > > > at > > > > > > com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526) > > > > at > > > > > > com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1473) > > > > at > > > > > > com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:656) > > > > at > > > > > > com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:211) > > > > at > > > > > > com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187) > > > > at > > > > > > com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) > > > > at > > > > > > com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825) > > > > at > > > > > > com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3772) > > > > at > > > > > > com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3755) > > > > at > > > > > > org.apache.wayang.api.json.parserutil.ParsePlanFromJson$.parsePlanFromString(ParsePlanFromJson.scala:38) > > > > at > > > org.apache.wayang.api.json.Main$.$anonfun$jsonRoute$5(Main.scala:56) > > > > at scala.util.Try$.apply(Try.scala:213) > > > > at > > > org.apache.wayang.api.json.Main$.$anonfun$jsonRoute$4(Main.scala:56) > > > > at > > > > > > zio.ZIOCompanionVersionSpecific.$anonfun$attempt$1(ZIOCompanionVersionSpecific.scala:100) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:904) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:890) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:1024) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:967) > > > > at zio.internal.FiberRuntime.runLoop(FiberRuntime.scala:1024) > > > > at > > > zio.internal.FiberRuntime.evaluateEffect(FiberRuntime.scala:381) > > > > at zio.internal.FiberRuntime.start(FiberRuntime.scala:1339) > > > > at zio.Runtime$UnsafeAPIV1.runOrFork(Runtime.scala:160) > > > > at zio.http.netty.NettyRuntime.run(NettyRuntime.scala:52) > > > > at zio.http.netty.NettyRuntime.run$(NettyRuntime.scala:29) > > > > at > > > zio.http.netty.NettyRuntime$$anon$1.run(NettyRuntime.scala:105) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.writeResponse(ServerInboundHandler.scala:300) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.channelRead0(ServerInboundHandler.scala:96) > > > > at > > > > > > zio.http.netty.server.ServerInboundHandler.channelRead0(ServerInboundHandler.scala:42) > > > > at > > > > > > io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.flush.FlushConsolidationHandler.channelRead(FlushConsolidationHandler.java:152) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93) > > > > at > > > > > > io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) > > > > at > > > > > > io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) > > > > at > > > > > > io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) > > > > at > > > > > > io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) > > > > at > > > > > > io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) > > > > at > > > > > > io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) > > > > at > > > > > > io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) > > > > at > io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) > > > > at > > > > > > io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) > > > > at > > > > io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) > > > > at > > > > > > io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) > > > > at java.base/java.lang.Thread.run(Thread.java:829) > > > > org.apache.wayang.api.json.exception.WayangApiJsonException: Can't > > parse > > > json plan. > > > > > > > > > > > > > > > > Best regards, > > > > > > > > Christoffer Kristensen > > > > > > > > > -- > > > *Scalytics Connect* > > > The foundation for secure, scalable, and transparent > > > AI. > > > > > > > > > > > > -- > > > 3401 N. MIAMI AVE. STE 230 > > > 33127 Miami, Florida > > > United States > > > www.scalytics.io<http://www.scalytics.io> <http://www.scalytics.io> > > > > > > -- Please consider the > > > environment before printing this email -- > > > > > > Disclaimer: > > > The content of this > > > message is confidential. If you have received it by mistake, please > > inform > > > us by an email reply and then delete the message. It is forbidden to > > copy, > > > forward, or in any way reveal the contents of this message to anyone. > The > > > integrity and security of this email cannot be guaranteed over the > > > Internet. Therefore, the sender will not be held liable for any damage > > > caused by the message. > > > > > >