public static DataTypeLists<String> getPropertiesByDataType(ResourceSet resourceSet) {

    if (resourceSet.isEmpty()) {
      return new DataTypeLists<String>();
    }

    // no aggregation
    DataTypeLists<String> result = new DataTypeLists<String>();
    Resource resource = resourceSet.getFirstElement();

    if (resource == null) {
      return result;
    }

    for (Entry<String, Serializable> entry : resource.getProperties().entrySet()) {

      Serializable value = entry.getValue();
      String propertyName = entry.getKey();

      if (value instanceof String) {
        result.get(DataType.TEXT).add(propertyName);
      }
      if (value instanceof Double) {
        result.get(DataType.NUMBER).add(propertyName);
      }
      if (value instanceof Resource) {
        Resource r = (Resource) value;

        if (r.getValue(LATITUDE) != null && r.getValue(LONGITUDE) != null) {

          result.get(DataType.LOCATION).add(propertyName);
        }
      }
      if (value instanceof Date) {
        result.get(DataType.DATE).add(propertyName);
      }
    }

    return result;
  }
  // XXX why isn't this using the same code as getPropertiesByDataType?
  public static List<String> getPropertyNamesForDataType(
      ResourceSet resourceSet, DataType dataType) {

    if (resourceSet.isEmpty()) {
      return Collections.emptyList();
    }

    // no aggregation
    Resource resource = resourceSet.getFirstElement();
    List<String> properties = new ArrayList<String>();

    for (Entry<String, Serializable> entry : resource.getProperties().entrySet()) {

      switch (dataType) {
        case TEXT:
          {
            if (entry.getValue() instanceof String) {
              properties.add(entry.getKey());
            }
          }
          break;
        case NUMBER:
          {
            if (entry.getValue() instanceof Double) {
              properties.add(entry.getKey());
            }
          }
          break;
        case LOCATION:
          {
            if (entry.getValue() instanceof Resource) {
              Resource r = (Resource) entry.getValue();

              if (r.getValue(LATITUDE) != null && r.getValue(LONGITUDE) != null) {

                properties.add(entry.getKey());
              }
            }
          }
          break;
        case DATE:
          {
            if (entry.getValue() instanceof Date) {
              properties.add(entry.getKey());
            }
          }
          break;
        case COLOR:
          {
            if (entry.getValue() instanceof Color) {
              properties.add(entry.getKey());
            }
          }

        case SHAPE:
          {
            if (entry.getValue() instanceof String && isShape(entry.getValue())) {
              properties.add(entry.getKey());
            }
          }
      }
    }
    return properties;
  }