public static void readAgenda(
      MarshallerReaderContext context, RuleData _ruleData, DefaultAgenda agenda) {
    ProtobufMessages.Agenda _agenda = _ruleData.getAgenda();

    for (org.drools.core.marshalling.impl.ProtobufMessages.Agenda.AgendaGroup _agendaGroup :
        _agenda.getAgendaGroupList()) {
      InternalAgendaGroup group =
          (InternalAgendaGroup) agenda.getAgendaGroup(_agendaGroup.getName(), context.ruleBase);
      group.setActive(_agendaGroup.getIsActive());
      agenda.getAgendaGroupsMap().put(group.getName(), group);
    }

    for (String _groupName : _agenda.getFocusStack().getGroupNameList()) {
      agenda.addAgendaGroupOnStack(agenda.getAgendaGroup(_groupName));
    }

    for (ProtobufMessages.Agenda.RuleFlowGroup _ruleFlowGroup : _agenda.getRuleFlowGroupList()) {
      RuleFlowGroupImpl rfgi =
          new RuleFlowGroupImpl(
              _ruleFlowGroup.getName(),
              _ruleFlowGroup.getIsActive(),
              _ruleFlowGroup.getIsAutoDeactivate());
      agenda.getRuleFlowGroupsMap().put(_ruleFlowGroup.getName(), rfgi);

      //            readActivations( context,
      //                             _ruleFlowGroup.getActivationList() );

      for (NodeInstance _nodeInstance : _ruleFlowGroup.getNodeInstanceList()) {
        rfgi.addNodeInstance(
            _nodeInstance.getProcessInstanceId(), _nodeInstance.getNodeInstanceId());
      }
    }

    readActivations(context, _agenda.getActivationList(), _agenda.getRneaList());
    agenda.setActivationsFilter(context.filter);
  }
  private static void writeAgenda(
      MarshallerWriteContext context, ProtobufMessages.RuleData.Builder _ksb) throws IOException {
    InternalWorkingMemory wm = context.wm;
    DefaultAgenda agenda = (DefaultAgenda) wm.getAgenda();

    org.drools.marshalling.impl.ProtobufMessages.Agenda.Builder _ab =
        ProtobufMessages.Agenda.newBuilder();

    AgendaGroup[] agendaGroups =
        (AgendaGroup[])
            agenda
                .getAgendaGroupsMap()
                .values()
                .toArray(new AgendaGroup[agenda.getAgendaGroupsMap().size()]);
    Arrays.sort(agendaGroups, AgendaGroupSorter.instance);
    for (AgendaGroup group : agendaGroups) {
      org.drools.marshalling.impl.ProtobufMessages.Agenda.AgendaGroup.Builder _agb =
          ProtobufMessages.Agenda.AgendaGroup.newBuilder();
      _agb.setName(group.getName());
      _agb.setIsActive(group.isActive());
      _ab.addAgendaGroup(_agb.build());
    }

    org.drools.marshalling.impl.ProtobufMessages.Agenda.FocusStack.Builder _fsb =
        ProtobufMessages.Agenda.FocusStack.newBuilder();
    LinkedList<AgendaGroup> focusStack = agenda.getStackList();
    for (Iterator<AgendaGroup> it = focusStack.iterator(); it.hasNext(); ) {
      AgendaGroup group = it.next();
      _fsb.addGroupName(group.getName());
    }
    _ab.setFocusStack(_fsb.build());

    RuleFlowGroupImpl[] ruleFlowGroups =
        (RuleFlowGroupImpl[])
            agenda
                .getRuleFlowGroupsMap()
                .values()
                .toArray(new RuleFlowGroupImpl[agenda.getRuleFlowGroupsMap().size()]);
    Arrays.sort(ruleFlowGroups, RuleFlowGroupSorter.instance);
    for (RuleFlowGroupImpl group : ruleFlowGroups) {
      org.drools.marshalling.impl.ProtobufMessages.Agenda.RuleFlowGroup.Builder _rfgb =
          ProtobufMessages.Agenda.RuleFlowGroup.newBuilder();
      _rfgb.setName(group.getName());
      _rfgb.setIsActive(group.isActive());
      _rfgb.setIsAutoDeactivate(group.isAutoDeactivate());

      Map<Long, String> nodeInstances = group.getNodeInstances();
      for (Map.Entry<Long, String> entry : nodeInstances.entrySet()) {
        org.drools.marshalling.impl.ProtobufMessages.Agenda.RuleFlowGroup.NodeInstance.Builder
            _nib = ProtobufMessages.Agenda.RuleFlowGroup.NodeInstance.newBuilder();
        _nib.setProcessInstanceId(entry.getKey());
        _nib.setNodeInstanceId(entry.getValue());
        _rfgb.addNodeInstance(_nib.build());
      }
      _ab.addRuleFlowGroup(_rfgb.build());
    }

    // serialize all dormant activations
    ActivationIterator it = ActivationIterator.iterator(wm);
    List<org.drools.spi.Activation> dormant = new ArrayList<org.drools.spi.Activation>();
    for (org.drools.spi.Activation item = (org.drools.spi.Activation) it.next();
        item != null;
        item = (org.drools.spi.Activation) it.next()) {
      if (!item.isActive()) {
        dormant.add(item);
      }
    }
    Collections.sort(dormant, ActivationsSorter.INSTANCE);
    for (org.drools.spi.Activation activation : dormant) {
      _ab.addActivation(writeActivation(context, (AgendaItem) activation));
    }

    _ksb.setAgenda(_ab.build());
  }