use of org.drools.core.base.ClassFieldAccessorCache in project drools by kiegroup.
the class KnowledgeBuilderImpl method createPackageRegistry.
private PackageRegistry createPackageRegistry(PackageDescr packageDescr) {
initPackage(packageDescr);
InternalKnowledgePackage pkg;
if (this.kBase == null || (pkg = this.kBase.getPackage(packageDescr.getName())) == null) {
// there is no rulebase or it does not define this package so define it
pkg = new KnowledgePackageImpl(packageDescr.getName());
pkg.setClassFieldAccessorCache(new ClassFieldAccessorCache(this.rootClassLoader));
// if there is a rulebase then add the package.
if (this.kBase != null) {
try {
pkg = (InternalKnowledgePackage) this.kBase.addPackage(pkg).get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
} else {
// the RuleBase will also initialise the
pkg.getDialectRuntimeRegistry().onAdd(this.rootClassLoader);
}
}
PackageRegistry pkgRegistry = new PackageRegistry(rootClassLoader, configuration, pkg);
// add default import for this namespace
pkgRegistry.addImport(new ImportDescr(packageDescr.getNamespace() + ".*"));
for (ImportDescr importDescr : packageDescr.getImports()) {
pkgRegistry.registerImport(importDescr.getTarget());
}
return pkgRegistry;
}
use of org.drools.core.base.ClassFieldAccessorCache in project drools by kiegroup.
the class KnowledgeBaseImpl method readExternal.
// ------------------------------------------------------------
// Instance methods
// ------------------------------------------------------------
/**
* Handles the read serialization of the Package. Patterns in Rules may reference generated data which cannot be serialized by default methods.
* The Package uses PackageCompilationData to hold a reference to the generated bytecode; which must be restored before any Rules.
* A custom ObjectInputStream, able to resolve classes against the bytecode in the PackageCompilationData, is used to restore the Rules.
*/
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
// PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
DroolsObjectInput droolsStream;
boolean isDrools = in instanceof DroolsObjectInputStream;
boolean wasDrools = in.readBoolean();
if (wasDrools && !isDrools) {
throw new IllegalArgumentException("The knowledge base was serialized using a DroolsObjectOutputStream. A DroolsObjectInputStream is required for deserialization.");
}
if (isDrools) {
droolsStream = (DroolsObjectInput) in;
} else {
ByteArrayInputStream bytes = new ByteArrayInputStream((byte[]) in.readObject());
droolsStream = new DroolsObjectInputStream(bytes);
}
boolean classLoaderCacheEnabled = droolsStream.readBoolean();
Map<String, byte[]> store = (Map<String, byte[]>) droolsStream.readObject();
this.rootClassLoader = createProjectClassLoader(droolsStream.getParentClassLoader(), store);
droolsStream.setClassLoader(this.rootClassLoader);
droolsStream.setKnowledgeBase(this);
this.classFieldAccessorCache = new ClassFieldAccessorCache(this.rootClassLoader);
this.config = (RuleBaseConfiguration) droolsStream.readObject();
this.config.setClassLoader(droolsStream.getParentClassLoader());
this.sessionConfiguration = new SessionConfigurationImpl(null, config.getClassLoader(), config.getChainedProperties());
kieComponentFactory = getConfiguration().getComponentFactory();
this.pkgs = (Map<String, InternalKnowledgePackage>) droolsStream.readObject();
for (InternalKnowledgePackage pkg : this.pkgs.values()) {
pkg.getDialectRuntimeRegistry().onAdd(this.rootClassLoader);
}
// PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
this.id = (String) droolsStream.readObject();
this.workingMemoryCounter.set(droolsStream.readInt());
this.processes = (Map<String, Process>) droolsStream.readObject();
Class cls = null;
try {
cls = droolsStream.getParentClassLoader().loadClass(droolsStream.readUTF());
this.factHandleFactory = (FactHandleFactory) cls.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
DroolsObjectInputStream.newInvalidClassException(cls, e);
}
for (InternalKnowledgePackage pkg : this.pkgs.values()) {
pkg.getDialectRuntimeRegistry().onBeforeExecute();
pkg.getClassFieldAccessorStore().setClassFieldAccessorCache(this.classFieldAccessorCache);
pkg.getClassFieldAccessorStore().wire();
}
this.populateTypeDeclarationMaps();
// read globals
Map<String, String> globs = (Map<String, String>) droolsStream.readObject();
populateGlobalsMap(globs);
this.eventSupport = (KieBaseEventSupport) droolsStream.readObject();
this.eventSupport.setKnowledgeBase(this);
this.reteooBuilder = (ReteooBuilder) droolsStream.readObject();
this.reteooBuilder.setRuleBase(this);
this.rete = (Rete) droolsStream.readObject();
this.resolvedReleaseId = (ReleaseId) droolsStream.readObject();
((DroolsObjectInputStream) droolsStream).bindAllExtractors(this);
if (!isDrools) {
droolsStream.close();
}
this.getConfiguration().getComponentFactory().getTraitFactory().setRuleBase(this);
rewireReteAfterDeserialization();
}
use of org.drools.core.base.ClassFieldAccessorCache in project drools by kiegroup.
the class KiePackagesBuilder method createKiePackage.
private KnowledgePackageImpl createKiePackage(String name) {
KnowledgePackageImpl kpkg = new KnowledgePackageImpl(name);
kpkg.setClassFieldAccessorCache(new ClassFieldAccessorCache(configuration.getClassLoader()));
TypeResolver typeResolver = new ClassTypeResolver(new HashSet<>(kpkg.getImports().keySet()), configuration.getClassLoader(), name);
typeResolver.addImport(name + ".*");
kpkg.setTypeResolver(typeResolver);
return kpkg;
}
use of org.drools.core.base.ClassFieldAccessorCache in project drools by kiegroup.
the class RightTupleIndexHashTableIteratorTest method getConstraint.
protected BetaNodeFieldConstraint getConstraint(String identifier, Operator operator, String fieldName, Class clazz) {
ClassFieldAccessorStore store = new ClassFieldAccessorStore();
store.setClassFieldAccessorCache(new ClassFieldAccessorCache(Thread.currentThread().getContextClassLoader()));
store.setEagerWire(true);
InternalReadAccessor extractor = store.getReader(clazz, fieldName);
Declaration declaration = new Declaration(identifier, extractor, new Pattern(0, new ClassObjectType(clazz)));
String expression = fieldName + " " + operator.getOperatorString() + " " + declaration.getIdentifier();
return new MvelConstraintTestUtil(expression, declaration, extractor);
}
use of org.drools.core.base.ClassFieldAccessorCache in project drools by kiegroup.
the class LeftLeftTupleIndexHashTableIteratorTest method getConstraint.
protected BetaNodeFieldConstraint getConstraint(String identifier, Operator operator, String fieldName, Class clazz) {
ClassFieldAccessorStore store = new ClassFieldAccessorStore();
store.setClassFieldAccessorCache(new ClassFieldAccessorCache(Thread.currentThread().getContextClassLoader()));
store.setEagerWire(true);
InternalReadAccessor extractor = store.getReader(clazz, fieldName);
Declaration declaration = new Declaration(identifier, extractor, new Pattern(0, new ClassObjectType(clazz)));
String expression = fieldName + " " + operator.getOperatorString() + " " + declaration.getIdentifier();
return new MvelConstraintTestUtil(expression, declaration, extractor);
}
Aggregations