示例#1
0
  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);
        }
      }
    }
  }
示例#2
0
  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()]);
  }
示例#3
0
 /**
  * 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);
 }
示例#4
0
 protected void removeObjectSink(final ObjectSink objectSink) {
   final ObjectTypeNode node = (ObjectTypeNode) objectSink;
   this.objectTypeNodes.remove(node.getObjectType());
 }
示例#5
0
 public ObjectType getObjectType() {
   ObjectTypeNode objectTypeNode = getObjectTypeNode();
   return objectTypeNode != null ? objectTypeNode.getObjectType() : null;
 }