How to generate binary packages outside the BRMS Web interface?

Solution Verified - Updated -

Environment

  • JBoss Enterprise Business Rules Management System (BRMS)
    • 5.2.0
    • 5.3.0

Issue

For an use case is necessary to compile DRL files and some BRM assets outside the Web interface, generating binary packages in disk.
After some tries, different exceptions was thrown:

java.lang.ClassCastException: [B cannot be cast to org.drools.rule.DialectRuntimeRegistry
      at org.drools.rule.Package.readExternal(Package.java:191)
      at org.drools.definitions.impl.KnowledgePackageImp.readExternal(KnowledgePackageImp.java:115)
      at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1791)
      at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

java.lang.ClassCastException: org.drools.definitions.impl.KnowledgePackageImp cannot be cast to org.drools.rule.Package at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:618) at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:37)
java.io.OptionalDataException
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1339)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
      at org.drools.core.util.DroolsStreamUtils.streamIn(DroolsStreamUtils.java

Resolution

Most problems in the generation of binary packages are related to JBoss Rules assets serialization.
BRMS has some special utility classes to use instead of regular classes from java.io.*.
The usage is:

        1. (...)
        2. kbuilder.add(ResourceFactory.newFileResource(file.getAbsolutePath()), ResourceType.DRL);
        3. (...)
        4. 
        5. Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
        6. for (KnowledgePackage kpkg : kpkgs) {
        7.  FileOutputStream fout = null;
        8.  try {
        9.      File outFilePath = new File(targetPath + pkgName + ".pkg");
        10.     fout = new FileOutputStream(outFilePath);
        11.     DroolsStreamUtils.streamOut(fout,((KnowledgePackageImp) kpkg).pkg);
        12. } finally {
        13.     if (fout != null) {
        14.         fout.close();
        15.     }
        16. }
        17. }

To avoid the exception:

"KnowledgePackageImp cannot be cast to org.drools.rule.Package" 

it is necessary to do an explicit type cast to fix the Package type, as demonstrated at line 11 in the code above.

NOTE: Building BRM assets outside it is not currently officially supported. Some classes and methods, like "DroolsStreamUtils.streamOut" or some Assets format can be changed in the future without notice.

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments