public static void readPropagationContext(MarshallerReaderContext context) throws IOException { ObjectInputStream stream = context.stream; InternalRuleBase ruleBase = context.ruleBase; int type = stream.readInt(); Rule rule = null; if (stream.readBoolean()) { String pkgName = stream.readUTF(); String ruleName = stream.readUTF(); Package pkg = ruleBase.getPackage(pkgName); rule = pkg.getRule(ruleName); } LeftTuple leftTuple = null; if (stream.readBoolean()) { int tuplePos = stream.readInt(); leftTuple = context.terminalTupleMap.get(tuplePos); } long propagationNumber = stream.readLong(); int factHandleId = stream.readInt(); InternalFactHandle factHandle = context.handles.get(factHandleId); int activeActivations = stream.readInt(); int dormantActivations = stream.readInt(); String entryPointId = stream.readUTF(); EntryPoint entryPoint = context.entryPoints.get(entryPointId); if (entryPoint == null) { entryPoint = new EntryPoint(entryPointId); context.entryPoints.put(entryPointId, entryPoint); } PropagationContext pc = new PropagationContextImpl( propagationNumber, type, rule, leftTuple, factHandle, activeActivations, dormantActivations, entryPoint); context.propagationContexts.put(propagationNumber, pc); }
public static Activation readActivation(MarshallerReaderContext context) throws IOException { ObjectInputStream stream = context.stream; InternalRuleBase ruleBase = context.ruleBase; InternalWorkingMemory wm = context.wm; long activationNumber = stream.readLong(); int pos = stream.readInt(); LeftTuple leftTuple = context.terminalTupleMap.get(pos); int salience = stream.readInt(); String pkgName = stream.readUTF(); String ruleName = stream.readUTF(); Package pkg = ruleBase.getPackage(pkgName); Rule rule = pkg.getRule(ruleName); RuleTerminalNode ruleTerminalNode = (RuleTerminalNode) leftTuple.getLeftTupleSink(); PropagationContext pc = context.propagationContexts.get(stream.readLong()); AgendaItem activation; boolean scheduled = false; if (rule.getTimer() != null) { activation = new ScheduledAgendaItem( activationNumber, leftTuple, (InternalAgenda) wm.getAgenda(), pc, ruleTerminalNode); scheduled = true; } else { activation = new AgendaItem(activationNumber, leftTuple, salience, pc, ruleTerminalNode); } leftTuple.setObject(activation); if (stream.readBoolean()) { String activationGroupName = stream.readUTF(); ((DefaultAgenda) wm.getAgenda()) .getActivationGroup(activationGroupName) .addActivation(activation); } boolean activated = stream.readBoolean(); activation.setActivated(activated); if (stream.readBoolean()) { InternalFactHandle handle = context.handles.get(stream.readInt()); activation.setFactHandle(handle); handle.setObject(activation); } InternalAgendaGroup agendaGroup; if (rule.getAgendaGroup() == null || rule.getAgendaGroup().equals("") || rule.getAgendaGroup().equals(AgendaGroup.MAIN)) { // Is the Rule AgendaGroup undefined? If it is use MAIN, // which is added to the Agenda by default agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup(AgendaGroup.MAIN); } else { // AgendaGroup is defined, so try and get the AgendaGroup // from the Agenda agendaGroup = (InternalAgendaGroup) ((DefaultAgenda) wm.getAgenda()).getAgendaGroup(rule.getAgendaGroup()); } activation.setAgendaGroup(agendaGroup); if (!scheduled && activated) { if (rule.getRuleFlowGroup() == null) { agendaGroup.add(activation); } else { InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup(rule.getRuleFlowGroup()); rfg.addActivation(activation); } } TruthMaintenanceSystem tms = context.wm.getTruthMaintenanceSystem(); while (stream.readShort() == PersisterEnums.LOGICAL_DEPENDENCY) { int factHandleId = stream.readInt(); InternalFactHandle handle = (InternalFactHandle) context.handles.get(factHandleId); ObjectTypeConf typeConf = context .wm .getObjectTypeConfigurationRegistry() .getObjectTypeConf( ((NamedEntryPoint) handle.getEntryPoint()).getEntryPoint(), handle.getObject()); tms.addLogicalDependency(handle, activation, pc, rule, typeConf); } return activation; }