private boolean filterMatched(EC2Instance vm, EC2Filter filter) throws ParseException {
    String filterName = filter.getName();
    String[] valueSet = filter.getValueSet();

    // TODO: add test of security group the instance is in
    if (filterName.equalsIgnoreCase("availability-zone")) {
      return containsString(vm.getZoneName(), valueSet);
    } else if (filterName.equalsIgnoreCase("hypervisor")) {
      return containsString(vm.getHypervisor(), valueSet);
    } else if (filterName.equalsIgnoreCase("image-id")) {
      return containsString(vm.getTemplateId(), valueSet);
    } else if (filterName.equalsIgnoreCase("instance-id")) {
      return containsString(vm.getId(), valueSet);
    } else if (filterName.equalsIgnoreCase("instance-type")) {
      return containsString(vm.getServiceOffering(), valueSet);
    } else if (filterName.equalsIgnoreCase("instance-state-code")) {
      return containsInteger(EC2SoapServiceImpl.toAmazonCode(vm.getState()), valueSet);
    } else if (filterName.equalsIgnoreCase("instance-state-name")) {
      return containsString(EC2SoapServiceImpl.toAmazonStateName(vm.getState()), valueSet);
    } else if (filterName.equalsIgnoreCase("ip-address")) {
      return containsString(vm.getIpAddress(), valueSet);
    } else if (filterName.equalsIgnoreCase("private-ip-address")) {
      return containsString(vm.getPrivateIpAddress(), valueSet);
    } else if (filterName.equalsIgnoreCase("owner-id")) {
      String owner = new String(vm.getDomainId() + ":" + vm.getAccountName());
      return containsString(owner, valueSet);
    } else if (filterName.equalsIgnoreCase("root-device-name")) {
      return containsDevice(vm.getRootDeviceId(), valueSet);
    } else return false;
  }
  private boolean filterMatched(EC2Snapshot snap, EC2Filter filter) throws ParseException {
    String filterName = filter.getName();
    String[] valueSet = filter.getValueSet();

    if (filterName.equalsIgnoreCase("owner-alias")) {
      return containsString(UserContext.current().getAccessKey(), valueSet);
    } else if (filterName.equalsIgnoreCase("owner-id")) {
      String owner = new String(snap.getDomainId() + ":" + snap.getAccountName());
      return containsString(owner, valueSet);
    } else if (filterName.equalsIgnoreCase("snapshot-id")) {
      return containsString(snap.getId().toString(), valueSet);
    } else if (filterName.equalsIgnoreCase("start-time")) {
      return containsTime(snap.getCreated(), valueSet);
    } else if (filterName.equalsIgnoreCase("status")) {
      if (snap.getState().equalsIgnoreCase("backedup"))
        return containsString("completed", valueSet);
      else if (snap.getState().equalsIgnoreCase("creating")
          || snap.getState().equalsIgnoreCase("backingup"))
        return containsString("pending", valueSet);
      else return containsString("error", valueSet);
    } else if (filterName.equalsIgnoreCase("volume-id")) {
      return containsString(snap.getVolumeId().toString(), valueSet);
    } else if (filterName.equalsIgnoreCase("volume-size")) {
      return containsLong(snap.getVolumeSize(), valueSet);
    } else if (filterName.equalsIgnoreCase("tag-key")) {
      EC2TagKeyValue[] tagSet = snap.getResourceTags();
      for (EC2TagKeyValue tag : tagSet) if (containsString(tag.getKey(), valueSet)) return true;
      return false;
    } else if (filterName.equalsIgnoreCase("tag-value")) {
      EC2TagKeyValue[] tagSet = snap.getResourceTags();
      for (EC2TagKeyValue tag : tagSet) {
        if (tag.getValue() == null) {
          if (containsEmptyValue(valueSet)) return true;
        } else {
          if (containsString(tag.getValue(), valueSet)) return true;
        }
      }
      return false;
    } else return false;
  }
 public void addFilter(EC2Filter param) {
   String filterName = param.getName();
   if (!filterName.startsWith("tag:")) {
     String value = (String) filterTypes.get(filterName);
     if (value == null || value.equalsIgnoreCase("null")) {
       throw new EC2ServiceException(
           ClientError.InvalidFilter, "Filter '" + filterName + "' is invalid");
     }
   }
   // ToDo we could add checks to make sure the type of a filters value is correct (e.g., an
   // integer)
   filterSet.add(param);
 }
  public void addFilter(EC2Filter param) {
    String filterName = param.getName();
    String value = (String) filterTypes.get(filterName);

    if (null == value)
      throw new EC2ServiceException("Unsupported filter [" + filterName + "] - 1", 501);

    if (null != value && value.equalsIgnoreCase("null"))
      throw new EC2ServiceException("Unsupported filter [" + filterName + "] - 2", 501);

    // ToDo we could add checks to make sure the type of a filters value is correct (e.g., an
    // integer)
    filterSet.add(param);
  }