docs: protected Object[] idsOf(final List<?> idsOrValues) {
          // convert list to array that we can mutate
          final Object[] ids = idsOrValues.toArray();
  
          // mutate array to contain only non-empty ids
          int length = 0;
          for (int i = 0; i < ids.length;) {
              final Object p = ids[i++];
              if (p instanceof HasId) {
                  // only use values with ids that are non-empty
                  final String id = ((HasId) p).getId();
                  if (!StringUtils.isEmpty(id)) {
                      ids[length++] = id;
                  }
              } else if (p instanceof String) {
                  // only use ids that are non-empty
                  final String id = p.toString();
                  if (!StringUtils.isEmpty(id)) {
                      ids[length++] = id;
                  }
              } else if (p != null) {
                  throw new StoreException("Invalid id or value of type " + p);
              }
          }
  
          // no ids in array
          if (length == 0) {
              return null;
          }
  
          // some ids in array
          if (length != ids.length) {
              final Object[] tmp = new Object[length];
              System.arraycopy(ids, 0, tmp, 0, length);
              return tmp;
          }
  
          // array was full
          return ids;
      }