@Override
 public List<String> getAvailableMibGroups() {
   List<String> groups = new ArrayList<String>();
   for (final SnmpCollection collection :
       getContainer().getObject().getSnmpCollectionCollection()) {
     if (collection.getGroups() != null) {
       for (final Group group : collection.getGroups().getGroupCollection()) {
         groups.add(group.getName());
       }
     }
   }
   return groups;
 }
  private static void validateResourceTypes(
      final FileReloadContainer<DatacollectionConfig> container,
      final Set<String> allowedResourceTypes) {
    final String configuredString;
    if (allowedResourceTypes.size() == 0) {
      configuredString = "(none)";
    } else {
      configuredString = StringUtils.join(allowedResourceTypes, ", ");
    }

    final String allowableValues =
        "any positive number, 'ifIndex', or any of the configured resourceTypes: "
            + configuredString;
    for (final SnmpCollection collection : container.getObject().getSnmpCollectionCollection()) {
      final Groups groups = collection.getGroups();
      if (groups != null) {
        for (final Group group : groups.getGroupCollection()) {
          for (final MibObj mibObj : group.getMibObjCollection()) {
            final String instance = mibObj.getInstance();
            if (instance == null) continue;
            if (MibObject.INSTANCE_IFINDEX.equals(instance)) continue;
            if (allowedResourceTypes.contains(instance)) continue;
            try {
              // Check to see if the value is a non-negative integer
              if (Integer.parseInt(instance.trim()) >= 0) {
                continue;
              }
            } catch (NumberFormatException e) {
            }

            // XXX this should be a better exception
            throw new IllegalArgumentException(
                "instance '"
                    + instance
                    + "' invalid in mibObj definition for OID '"
                    + mibObj.getOid()
                    + "' in collection '"
                    + collection.getName()
                    + "' for group '"
                    + group.getName()
                    + "'.  Allowable instance values: "
                    + allowableValues);
          }
        }
      }
    }
  }
 /* (non-Javadoc)
  * @see org.opennms.features.vaadin.mibcompiler.api.MibParser#getDataCollection()
  */
 public DatacollectionGroup getDataCollection() {
   if (module == null) {
     return null;
   }
   LogUtils.infof(this, "Generating data collection configuration for %s", module.getId());
   DatacollectionGroup dcGroup = new DatacollectionGroup();
   dcGroup.setName(module.getId());
   NameCutter cutter = new NameCutter();
   try {
     for (SmiVariable v : module.getVariables()) {
       String groupName = getGroupName(v);
       String resourceType = getResourceType(v);
       Group group = getGroup(dcGroup, groupName, resourceType);
       String typeName = getMetricType(v.getType().getPrimitiveType());
       if (typeName != null) {
         String alias =
             cutter.trimByCamelCase(v.getId(), 19); // RRDtool/JRobin DS size restriction.
         MibObj mibObj = new MibObj();
         mibObj.setOid('.' + v.getOidStr());
         mibObj.setInstance(resourceType == null ? "0" : resourceType);
         mibObj.setAlias(alias);
         mibObj.setType(typeName);
         group.addMibObj(mibObj);
         if (typeName.equals("string") && resourceType != null) {
           for (ResourceType rs : dcGroup.getResourceTypeCollection()) {
             if (rs.getName().equals(resourceType) && rs.getResourceLabel().equals("${index}")) {
               rs.setResourceLabel("${" + v.getId() + "} (${index})");
             }
           }
         }
       }
     }
   } catch (Throwable e) {
     String errors = e.getMessage();
     if (errors == null || errors.trim().equals(""))
       errors =
           "An unknown error accured when generating data collection objects from the MIB "
               + module.getId();
     LogUtils.errorf(this, e, "Data Collection parsing error: %s", errors);
     errorHandler.addError(errors);
     return null;
   }
   return dcGroup;
 }
  private static Map<String, Map<String, Group>> getCollectionGroupMap(
      FileReloadContainer<DatacollectionConfig> container) {
    // Build collection map which is a hash map of Collection
    // objects indexed by collection name...also build
    // collection group map which is a hash map indexed
    // by collection name with a hash map as the value
    // containing a map of the collections's group names
    // to the Group object containing all the information
    // for that group. So the associations are:
    //
    // CollectionMap
    // collectionName -> Collection
    //
    // CollectionGroupMap
    // collectionName -> groupMap
    //
    // GroupMap
    // groupMapName -> Group
    //
    // This is parsed and built at initialization for
    // faster processing at run-timne.
    //
    final Map<String, Map<String, Group>> collectionGroupMap =
        new HashMap<String, Map<String, Group>>();

    for (final SnmpCollection collection : container.getObject().getSnmpCollectionCollection()) {
      // Build group map for this collection
      final Map<String, Group> groupMap = new HashMap<String, Group>();

      final Groups groups = collection.getGroups();
      if (groups != null) {
        for (final Group group : groups.getGroupCollection()) {
          groupMap.put(group.getName(), group);
        }
      }
      collectionGroupMap.put(collection.getName(), groupMap);
    }
    return Collections.unmodifiableMap(collectionGroupMap);
  }
 /**
  * Gets the group.
  *
  * @param data the data collection group object
  * @param groupName the group name
  * @param resourceType the resource type
  * @return the group
  */
 protected Group getGroup(DatacollectionGroup data, String groupName, String resourceType) {
   for (Group group : data.getGroupCollection()) {
     if (group.getName().equals(groupName)) return group;
   }
   Group group = new Group();
   group.setName(groupName);
   group.setIfType(resourceType == null ? "ignore" : "all");
   if (resourceType != null) {
     ResourceType type = new ResourceType();
     type.setName(resourceType);
     type.setLabel(resourceType);
     type.setResourceLabel("${index}");
     type.setPersistenceSelectorStrategy(
         new PersistenceSelectorStrategy(
             "org.opennms.netmgt.collectd.PersistAllSelectorStrategy")); // To avoid requires
                                                                         // opennms-services
     type.setStorageStrategy(new StorageStrategy(IndexStorageStrategy.class.getName()));
     data.addResourceType(type);
   }
   data.addGroup(group);
   return group;
 }
  /**
   * Private utility method used by the getMibObjectList() method. This method takes a group name
   * and a list of MibObject objects as arguments and adds all of the MibObjects associated with the
   * group to the object list. If the passed group consists of any additional sub-groups, then this
   * method will be called recursively for each sub-group until the entire
   * log.debug("processGroupName: adding MIB objects from group: " + groupName); group is processed.
   *
   * @param cName Collection name
   * @param groupName Name of the group to process
   * @param ifType Interface type
   * @param mibObjectList List of MibObject objects being built.
   */
  private void processGroupName(
      final String cName,
      final String groupName,
      final int ifType,
      final List<MibObject> mibObjectList) {
    ThreadCategory log = log();

    // Using the collector name retrieve the group map
    final Map<String, Group> groupMap = getCollectionGroupMap(getContainer()).get(cName);

    // Next use the groupName to access the Group object
    final Group group = groupMap.get(groupName);

    // Verify that we have a valid Group object...generate
    // warning message if not...
    if (group == null) {
      log.warn(
          "DataCollectionConfigFactory.processGroupName: unable to retrieve group information for group name '"
              + groupName
              + "': check DataCollection.xml file.");
      return;
    }

    if (log.isDebugEnabled()) {
      log.debug(
          "processGroupName:  processing group: "
              + groupName
              + " groupIfType: "
              + group.getIfType()
              + " ifType: "
              + ifType);
    }

    // Process any sub-groups contained within this group
    for (final String includeGroup : group.getIncludeGroupCollection()) {
      processGroupName(cName, includeGroup, ifType, mibObjectList);
    }

    // Add this group's objects to the object list provided
    // that the group's ifType string does not exclude the
    // provided ifType parm.
    //
    // ifType parm of -1 indicates that only node-level
    // objects are to be added
    //
    // Any other ifType parm value must be compared with
    // the group's ifType value to verify that they match
    // (if group's ifType is "all" then the objects will
    // automatically be added.
    final String ifTypeStr = String.valueOf(ifType);
    String groupIfType = group.getIfType();

    boolean addGroupObjects = false;
    if (ifType == NODE_ATTRIBUTES) {
      if (groupIfType.equals("ignore")) {
        addGroupObjects = true;
      }
    } else {
      if (groupIfType.equals("all")) {
        addGroupObjects = true;
      } else if ("ignore".equals(groupIfType)) {
        // Do nothing
      } else if (ifType == ALL_IF_ATTRIBUTES) {
        addGroupObjects = true;
      } else {
        // First determine if the group's ifType value contains
        // a single type value or a list of values. In the case
        // of a list the ifType values will be delimited by commas.
        boolean isList = false;
        if (groupIfType.indexOf(',') != -1) isList = true;

        // Next compare the provided ifType parameter with the
        // group's ifType value to determine if the group's OIDs
        // should be added to the MIB object list.
        //
        // If the group ifType value is a single value then only
        // a simple comparison is needed to see if there is an
        // exact match.
        //
        // In the case of the group ifType value being a list
        // of ifType values it is more complicated...each comma
        // delimited substring which starts with the provided
        // ifType parm must be extracted and compared until an
        // EXACT match is found..
        if (!isList) {
          if (ifTypeStr.equals(groupIfType)) addGroupObjects = true;
        } else {
          int tmpIndex = groupIfType.indexOf(ifTypeStr);
          while (tmpIndex != -1) {
            groupIfType = groupIfType.substring(tmpIndex);

            // get substring starting at tmpIndex to
            // either the end of the groupIfType string
            // or to the first comma after tmpIndex
            final int nextComma = groupIfType.indexOf(',');

            String parsedType = null;
            if (nextComma == -1) // No comma, this is last type
            // value
            {
              parsedType = groupIfType;
            } else // Found comma
            {
              parsedType = groupIfType.substring(0, nextComma);
            }
            if (ifTypeStr.equals(parsedType)) {
              addGroupObjects = true;
              break;
            }

            // No more commas indicates no more ifType values to
            // compare...we're done
            if (nextComma == -1) break;

            // Get next substring and reset tmpIndex to
            // once again point to the first occurrence of
            // the ifType string parm.
            groupIfType = groupIfType.substring(nextComma + 1);
            tmpIndex = groupIfType.indexOf(ifTypeStr);
          }
        }
      }
    }

    if (addGroupObjects) {
      if (log.isDebugEnabled()) {
        log.debug(
            "processGroupName: OIDs from group '"
                + group.getName()
                + ":"
                + group.getIfType()
                + "' are included for ifType: "
                + ifType);
      }
      processObjectList(groupName, groupIfType, group.getMibObjCollection(), mibObjectList);
    } else {
      if (log.isDebugEnabled())
        log.debug(
            "processGroupName: OIDs from group '"
                + group.getName()
                + ":"
                + group.getIfType()
                + "' are excluded for ifType: "
                + ifType);
    }
  }