I want to load a drl file at runtime. The posts I've found including this one work for version 5.0 but I can't figure out how to do it for drools version 6.0.
In Drools 6, your rules packages are deployed to Maven. A KieScanner is provided, which you can attach to your KieContainer. This polls your repository at a defined interval to see whether a package has been updated and downloads the latest if that's the case.
A full explanation of how to define a KieScanner (including code samples) is provided in the Drools documentation here:
https://docs.jboss.org/drools/release/latest/drools-docs/html/ch04.html
I used info taken from those two docs:
https://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/#d0e109
https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test/java/org/drools/compiler/CommonTestMethodBase.java
I've came out with this snippet that loads rules defined in the /drl/file/path file into the stateful session you obtain at the last line.
File path = new File("/drl/file/path");
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource(path), ResourceType.DRL);
if (kbuilder.hasErrors()) {
throw new RuntimeException("Errors: " + kbuilder.getErrors());
}
kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Some methods are deprecated, so, don't expect this solution to be valid in the following releases.
Please, double check the imports, they are all from org.kie, not from drools packages. I admit those imports are too much, but I'm pasting the code from an example I'm trying to develop, so I have more things on my code, sorry for that.
import java.io.File;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieScanner;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
Hope it helps.
Related
I am attempting to use the #Plugin annotation. Am following the example of FileAppender here.
However, java does not recognize it and instead I get
error: package org.apache.logging.log4j.plugins does not exist
Is there some jar I need to include? I already have the log4j jars log4j-api-2.14.0.jar and log4j-core-2.14.0.jar (as well as log4j-slf4j18-impl-2.14.0.jar).
How do I get the import working in order to use #Plugin?
It turned out the import line was different than it was for all the example code I was referencing.
I searched within the jar to check whether any Plugin classes were there, and noticed they had a different path than the import line in the examples.
> jar -tf .\log4j-core-2.14.0.jar | rg Plugin
org/apache/logging/log4j/core/config/plugins/util/PluginRegistry$PluginTest.class
org/apache/logging/log4j/core/config/plugins/util/PluginManager.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.class
org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor$PluginAliasesElementVisitor.class
org/apache/logging/log4j/core/config/plugins/processor/PluginCache.class
org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.class
org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.class
org/apache/logging/log4j/core/config/PropertiesPlugin.class
org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor$1.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginConfigurationVisitor.class
org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.class
org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.class
org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor$PluginElementVisitor.class
org/apache/logging/log4j/core/config/plugins/PluginNode.class
META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.class
org/apache/logging/log4j/core/config/plugins/PluginAttribute.class
org/apache/logging/log4j/core/config/plugins/PluginValue.class
org/apache/logging/log4j/core/appender/FailoversPlugin.class
org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.class
org/apache/logging/log4j/core/config/plugins/util/PluginType.class
org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.class
org/apache/logging/log4j/core/config/plugins/Plugin.class
org/apache/logging/log4j/core/config/plugins/PluginAliases.class
org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.class
org/apache/logging/log4j/core/config/AppendersPlugin.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.class
org/apache/logging/log4j/core/config/LoggersPlugin.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.class
org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.class
org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.class
org/apache/logging/log4j/core/config/plugins/PluginConfiguration.class
org/apache/logging/log4j/core/config/plugins/PluginFactory.class
org/apache/logging/log4j/core/config/plugins/PluginElement.class
org/apache/logging/log4j/core/config/ScriptsPlugin.class
I changed the import line from
import org.apache.logging.log4j.plugins.Plugin;
to
import org.apache.logging.log4j.core.config.plugins.Plugin;
and then the annotations were recognized.
I am trying to filter an excel sheet using POI class and to set the filter when i used this :
CTAutoFilter sheetFilter = my_sheet.getCTWorksheet().getAutoFilter();
CTFilterColumn myFilterColumn = sheetFilter.insertNewFilterColumn(0);
got below mentioned error on "CTFilterColumn".
Multiple markers at this line
- The method insertNewFilterColumn(int) from the type CTAutoFilter refers to the
missing type CTFilterColumn
- The type org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFilterColumn
cannot be resolved. It is indirectly referenced from required .class files
- CTFilterColumn cannot be resolved to a type
Entire code :
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;
import org.apache.poi.ss.usermodel.ComparisonOperator;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilter;
public class Test1 {
public static void main(String[] args) {
try {
//To read values and enable auto filter
FileInputStream fileIn = new FileInputStream("./XMLs/Test001.xlsx");
XSSFWorkbook my_workbook = new XSSFWorkbook(fileIn);
XSSFSheet my_sheet = my_workbook.getSheet("Sheet1");
CTAutoFilter sheetFilter = my_sheet.getCTWorksheet().getAutoFilter();
CTFilterColumn myFilterColumn = sheetFilter.insertNewFilterColumn(0);
Instead of this "import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilter;" i tried import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
But CTFilterColumn is not even listed in suggestions. Please help.
Is it because of some missing jar files, please help.
Promoting a comment to an answer
This is covered in this Apache POI FAQ Entry - I'm using the poi-ooxml-schemas jar, but my code is failing with "java.lang.NoClassDefFoundError: org/openxmlformats/schemas/something". The key section is:
There are two jar files available, as described in the components overview section. The full jar of all of the schemas is ooxml-schemas-1.3.jar, and it is currently around 15mb. The smaller poi-ooxml-schemas jar is only about 4mb. This latter jar file only contains the typically used parts though.
Many users choose to use the smaller poi-ooxml-schemas jar to save space. However, the poi-ooxml-schemas jar only contains the XSDs and classes that are typically used, as identified by the unit tests. Every so often, you may try to use part of the file format which isn't included in the minimal poi-ooxml-schemas jar. In this case, you should switch to the full ooxml-schemas-1.3.jar. Longer term, you may also wish to submit a new unit test which uses the extra parts of the XSDs, so that a future poi-ooxml-schemas jar will include them.
So, short term you need to swap out your small poi-ooxml-schemas jar for the full ooxml-schemas-1.3 jar. Longer term, if you submit a unit test to Apache POI which uses these extra classes, it'll be included in a future small schema jar.
Maven artifact details for the full schema are covered here on the Apache POI site
the following code is used to send rdf data to a sparql endpoint.
It has worked fine until i've tried to add a reasoner to the OntoModel.
Now the compiler says:
"cannot convert from com.hp.hpl.jena.ontology.OntModelspec to org.apache.jena.ontology.OntModelSpec".
So my question is, what i have to edit to let it works?
(I know that the problem is obviusly in "PelletReasonerFactory.THE_SPEC" which is not from com.hp.hpl..., so is there something similar to this one, which also come from org.apache.jena... ?)
package services;
import org.apache.jena.query.DatasetAccessor;
import org.apache.jena.query.DatasetAccessorFactory;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.ontology.OntModel;
import org.mindswap.pellet.jena.PelletReasonerFactory;
import org.apache.jena.ontology.OntModelSpec;
class FusekiExample {
public void addRDF(File rdf, String serviceURI){
throws IOException {
// the next commented line is the old working version...
//Model m = ModelFactory.createDefaultModel();
//these lines are the modified version which doesn't work.
OntModelSpec oms = PelletReasonerFactory.THE_SPEC;
OntModel m = ModelFactory.createOntologyModel(oms);
...
}
It looks like your PelletReasoner is very old and still uses the old jena libraries and not the newest one.
You need to find a newer version of your reasoner to work with the current jena or you need to work with an older jena version.
My error:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.UnsatisfiedLinkError: org.jbox2d.common.Timer.now()D
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:130)
Caused by: java.lang.UnsatisfiedLinkError: org.jbox2d.common.Timer.now()D
at org.jbox2d.common.Timer.now(Native Method)
at org.jbox2d.common.Timer.reset(Timer.java:35)
at org.jbox2d.common.Timer.<init>(Timer.java:31)
at org.jbox2d.dynamics.World.<init>(World.java:587)
at org.jbox2d.dynamics.World.<init>(World.java:158)
at org.jbox2d.dynamics.World.<init>(World.java:154)
at org.jbox2d.dynamics.World.<init>(World.java:145)
at com.badlogic.gdx.physics.box2d.World.<init>(World.java:61)
at com.example.blockbunny.states.Play.<init>(Play.java:22)
at com.example.blockbunny.handlers.GameStateManager.getState(GameStateManager.java:36)
at com.example.blockbunny.handlers.GameStateManager.pushState(GameStateManager.java:46)
at com.example.blockbunny.handlers.GameStateManager.<init>(GameStateManager.java:20)
at com.example.blockbunny.main.Game.create(Game.java:33)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:146)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:123)
And this occurs when I do this:
world = new World(new Vector2(0, -9.81f), true);
I have looked online, and some solutions included using this:
import com.badlogic.gdx.utils.GdxNativesLoader;
GdxNativesLoader.load();
However, I don't know where to put this function, and if it even works (I tried putting it in several different places)
How can I fix this issue?
Help will be appreciated, thanks!
As requested, here are my imports:
import static com.example.blockbunny.handlers.B2DVars.PPM;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.example.blockbunny.handlers.GameStateManager;
import com.example.blockbunny.main.Game;
I used Box2d several time with libgdx and i never encountered such a problem :
here what i propose t you :
GdxNativesLoader.load();
should be put on the create() method, but that doesn't seem to work with you
also try call it in a static way like this :
static {
GdxNativesLoader.load();
}
but i thin your problem is the extension of the library that you are using
verify that you are using gdx-box2d and not gdx-box2d-gwt which is used only for Html project
Verify that you are using the right (jar file) /(extension library) : gdx-box2d.jar and gdx-box2d-natives.jar (also verify the build path)
also try :
upgrade the box2d version that you're using
those were all the arrows i had ! hope one of it will work
Good luck !!
I came across the same issue, was using the gwt libraries. Updated the Maven dependency artifact from
gdx-box2d-gwt
to
gdx-box2d
and it fixed the error.
For example, I have class A with such imports:
import some.package.Class1
import some.package.Class2
When I put reference to some.package.Class3 in my class IDEA turns all inputs into such line of code:
import some.package.*
How can I make IDEA create new import for each class and do not replace them with '.*'?
Regards, Evgeniy
IDE settings -> Code Style -> Java -> select "import" tab.
Change the value of "Class count to import with '*'".
(Note: this is for 12.x, but it should not differ too much for older versions)