Sorry for the delay, I actually never got your email, looks like something still
filtered it. I was able to find it on the users@daffodil.a.o archives though.
The jar looks good to me, and I confirmed it works on Daffodil 3.9.0.
Looking back at your original email, you have this:
<xs:import namespace="urn:com.owlcyberdefense.dfdl.IPv4Checksum"
schemaLocation="IPv4ChecksumLayer.dfdl.xsd"/>
I would suggest changing that to this:
<xs:import namespace="urn:com.owlcyberdefense.dfdl.IPv4Checksum"
schemaLocation="/com/owlcyberdefense/dfdl/xsd/IPv4ChecksumLayer.dfdl.xsd"/>
That will look for the IPv4ChecksumLayer.dfdl.xsd file on the classpath, and it
should find it in the dfdl-ethernetIP jar. If dfdl-ethernetIP isn't correctly on
the classpath, then you should get an error like:
"Unable to resolve schemaLocation:
/com/owlcyberdefense/dfdl/xsd/IPv4ChecksumLayer.dfdl.xsd"
And you should double check your export DAFFODIL_CLASSPATH line.
If you don't get that error but still get the error like:
The dfdlx:layer '{urn:com.owlcyberdefense.dfdl.IPv4Checksum}IPv4Checksum' was
not found.
Then I'm honestly not sure what else could be wrong. The jar looks built
correctly, and I've confirmed it does contain that layer name + namespace and
works for me using the same schema snippet you posted previously. Doing the
above change will at least rule out a classpath issue.
On 2024-11-04 08:32 AM, Mark Kozak wrote:
I am still stuck on getting layers working with a custom checksum, so just
checking in on this in case it has gotten buried too deep.
Thank you.
-----Original Message-----
From: Mark Kozak <mark.ko...@adeptus-cs.com>
Sent: Tuesday, October 29, 2024 9:09 AM
To: users@daffodil.apache.org
Subject: RE: Where to put custom checksum for use as a layer?
Jar is attached. Zipped for email filters.
-----Original Message-----
From: Steve Lawrence <slawre...@apache.org>
Sent: Tuesday, October 29, 2024 7:43 AM
To: users@daffodil.apache.org
Subject: Re: Where to put custom checksum for use as a layer?
Is it possible to share the jar? I'm not sure what could be wrong, but having
the jar might make it easier to figure out.
On 2024-10-28 11:21 PM, Mark Kozak wrote:
I was missing the
META-INF/services/org.apache.daffodil.runtime1.layers.api.Layer file, but even
after adding that to the build and verifying it is included in the jar file, I
am still getting the same error.
I started with Daffodil 3.8.0 but just tried going to 3.9.0 in the
hopes of getting more debug information, but nothing changed,
-----Original Message-----
From: Steve Lawrence <slawre...@apache.org>
Sent: Monday, October 28, 2024 6:43 PM
To: users@daffodil.apache.org
Subject: Re: Where to put custom checksum for use as a layer?
Another thing to check is the Daffodil version you're using. The layer API was
overhauled in Daffodil 3.8.0, so if you're using a layer written for the new
layer API (which the latest version of IPv4ChecksumLayer is) it won't be found
by older versions of Daffodil. You'll either need a newer version of Daffodil
or an older version of the layer.
On 2024-10-28 06:26 PM, Mike Beckerle wrote:
It seems to be searching for the right thing, but unable to find it
on the classpath.
Are you perhaps just missing the metadata to tell the Java SPI loader
that the class is to be dynamically loaded from your jar?
The jar must have a file:
META-INF/services/org.apache.daffodil.runtime1.layers.api.Layer
The name is the name of the dynamically loaded base class.
That file contains the name of the dynamic class such as:
com.owlcyberdefense.dfdl.IPv4ChecksumLayer
In the EthernetIP project, this META-INF lives under
src/main/resources where it gets packaged into the jar file.
On Mon, Oct 28, 2024 at 1:02 PM Mark Kozak <mark.ko...@adeptus-cs.com
<mailto:mark.ko...@adeptus-cs.com>> wrote:
I feel I am so close to the solution and the tip on the DAFFODIL_CLASSPATH
environment variable was the last missing step. But unfortunately I am
still
getting the following error:
[error] Schema Definition Error: The dfdlx:layer
'{urn:com.owlcyberdefense.dfdl.IPv4Checksum}IPv4Checksum' was not found.
Available choices are:
{urn:org.apache.daffodil.layers.lineFolded}lineFolded_IMF,
{urn:org.apache.daffodil.layers.lineFolded}lineFolded_iCalendar,
{urn:org.apache.daffodil.layers.base64_MIME}base64_MIME,
{urn:org.apache.daffodil.layers.gzip}gzip,
{urn:org.apache.daffodil.layers.fixedLength}fixedLength,
{urn:org.apache.daffodil.layers.byteSwap}twobyteswap,
{urn:org.apache.daffodil.layers.byteSwap}fourbyteswap,
{urn:org.apache.daffodil.layers.boundaryMark}boundaryMark
Here is what've done so far:
1 - packaged the scala code for IPv4Checksum as a jar file named
ipv4checksumlayer_2.12-1.0.jar. Using this code just to see if I can get
daffodil to see the class
2 - Verified the jar file contains the class named
IPv4ChecksumLayer.class in
the path com\owlcyberdefense\dfdl\
3 - set the DAFFODIL_CLASSPATH environment variable to the location of
the jar
file.
4 - pasted the following lines into my schema file:
xmlns:chksum="urn:com.owlcyberdefense.dfdl.IPv4Checksum"
<xs:import namespace="urn:com.owlcyberdefense.dfdl.IPv4Checksum"
schemaLocation="IPv4ChecksumLayer.dfdl.xsd"/>
<sequence >
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/ <http://
www.ogf.org/dfdl/>">
<dfdl:newVariableInstance ref="chksum:IPv4Checksum"/>
</xs:appinfo>
</xs:annotation>
<xs:sequence dfdl:ref="chksum:IPv4ChecksumLayer">
<xs:sequence>
<xs:element name="Checksum"
type="chksum:IPv4Checksum"/>
</xs:sequence>
</xs:sequence>
</sequence>
-----Original Message-----
From: Steve Lawrence <slawre...@apache.org <mailto:slawre...@apache.org>>
Sent: Friday, October 25, 2024 1:30 PM
To: users@daffodil.apache.org <mailto:users@daffodil.apache.org>
Subject: Re: Where to put custom checksum for use as a layer?
You need to build your layer into a .jar file and then put that on
Daffodil's
classpath.
If you're use the Daffodil CLI, you can add jars to the CLI classpath by
setting the DAFFODIL_CLASSPATH environment variable, for example:
export DAFFODIL_CLASSPATH="/path/to/custom/checksum/layer.jar"
daffodil parse -s schema.dfdl.xsd ...
If instead you're running TDML tests using SBT, a common technique is to
publish the layer jar to a local repository, then add it as a dependency
to
the schema project that uses it. For example, you could do this to publish
locally:
cd /layer-project
sbt publishLocal
And add this to your schema project build.sbt file:
libraryDependencies ++= Seq(
"org.example" % "layer-project" % "1.0.0"
)
And then just run "sbt test" from the schema project. SBT will find the
locally published layer and automatically add it to the classpath when
running
tests.
On 2024-10-25 12:51 PM, Mark Kozak wrote:
> Hello folks,
>
> I have a custom checksum calculator I need to run on an entity. I have
been
> studying the ethernetIP example <https://github.com/DFDLSchemas/
ethernetIP <https://github.com/DFDLSchemas/ethernetIP>>
> and
> the layers documentation <https://daffodil.apache.org/layers <https://
daffodil.apache.org/layers>>, but am unable
> to
> figure out where to place my scala implementation for it to be found.
Is
> there
> some documentation I am missing?
>
> Thanks as always for the support,
>
> Mark
>
> Mark Kozak
>
> Director of Engineering
>
> Adeptus Cyber Solutions
>
> Adeptus-CS.com
>