public void updateSink( final ObjectSink sink, final PropagationContext context, final InternalWorkingMemory workingMemory) { // @todo // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so // iterate and reset all caches. final ObjectTypeNode node = (ObjectTypeNode) sink; final ObjectType newObjectType = node.getObjectType(); InternalWorkingMemoryEntryPoint wmEntryPoint = (InternalWorkingMemoryEntryPoint) workingMemory.getWorkingMemoryEntryPoint(this.entryPoint.getEntryPointId()); for (ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values()) { if (newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType())) { objectTypeConf.resetCache(); ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode(); Iterator it = ((ObjectTypeNodeMemory) workingMemory.getNodeMemory(sourceNode)).memory.iterator(); for (ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next()) { sink.assertObject((InternalFactHandle) entry.getValue(), context, workingMemory); } } } }
private ObjectTypeNode[] getMatchingObjectTypes(final Class<?> clazz) { final List<ObjectTypeNode> cache = new ArrayList<ObjectTypeNode>(); for (ObjectTypeNode node : kBase.getRete().getObjectTypeNodes(this.entryPoint).values()) { if (clazz == DroolsQuery.class) { // for query objects only add direct matches if (((ClassObjectType) node.getObjectType()).getClassType() == clazz) { cache.add(node); } } else if (node.isAssignableFrom(new ClassObjectType(clazz))) { cache.add(node); } } Collections.sort(cache, OBJECT_TYPE_NODE_COMPARATOR); return cache.toArray(new ObjectTypeNode[cache.size()]); }
/** * Adds the <code>ObjectSink</code> so that it may receive <code>Objects</code> propagated from * this <code>ObjectSource</code>. * * @param objectSink The <code>ObjectSink</code> to receive propagated <code>Objects</code>. Rete * only accepts <code>ObjectTypeNode</code>s as parameters to this method, though. */ public void addObjectSink(final ObjectSink objectSink) { final ObjectTypeNode node = (ObjectTypeNode) objectSink; this.objectTypeNodes.put(node.getObjectType(), node); }
protected void removeObjectSink(final ObjectSink objectSink) { final ObjectTypeNode node = (ObjectTypeNode) objectSink; this.objectTypeNodes.remove(node.getObjectType()); }
public ObjectType getObjectType() { ObjectTypeNode objectTypeNode = getObjectTypeNode(); return objectTypeNode != null ? objectTypeNode.getObjectType() : null; }