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 > > >
smime.p7s
Description: S/MIME cryptographic signature