class BgpProcessConfigurationAnswerer extends Answerer {

  public static Multiset<Row> getProperties(
      BgpProcessPropertySpecifier propertySpecifier,
      SpecifierContext ctxt,
      NodeSpecifier nodeSpecifier,
      Map<String, ColumnMetadata> columnMetadata) {

    Multiset<Row> rows = HashMultiset.create();

    nodeSpecifier
        .resolve(ctxt)
        .forEach(
            nodeName -> {
              ctxt.getConfigs()
                  .get(nodeName)
                  .getVrfs()
                  .values()
                  .forEach(
                      vrf -> {
                        BgpProcess bgpProcess = vrf.getBgpProcess();
                        if (bgpProcess == null) {
                          return;
                        }
                        RowBuilder rowBuilder =
                            Row.builder(columnMetadata)
                                .put(COL_NODE, new Node(nodeName))
                                .put(COL_VRF, vrf.getName())
                                .put(COL_ROUTER_ID, bgpProcess.getRouterId());

                        for (String property : propertySpecifier.getMatchingProperties()) {
                          PropertyDescriptor<BgpProcess> propertyDescriptor =
                              BgpProcessPropertySpecifier.getPropertyDescriptor(property);
                          try {
                            PropertySpecifier.fillProperty(
                                propertyDescriptor, bgpProcess, property, rowBuilder);
                          } catch (ClassCastException e) {
                            throw new BatfishException(
                                String.format(
                                    "Type mismatch between property value ('%s') and Schema ('%s') for property '%s' for BGP process '%s->%s-%s': %s",
                                    propertyDescriptor.getGetter().apply(bgpProcess),
                                    propertyDescriptor.getSchema(),
                                    property,
                                    nodeName,
                                    vrf.getName(),
                                    bgpProcess,
                                    e.getMessage()),
                                e);
                          }
                        }

                        rows.add(rowBuilder.build());
                      });
            });

    return rows;
  }

  public  BgpProcessConfigurationAnswerer(Question question, IBatfish batfish);

}