public static List<ImageAttribute> attributesForImageAndMode(
     Project project, DatabaseImage image, Boolean dataMode) {
   if (dataMode == null) {
     List<ImageAttribute> attributes =
         ImageAttribute.find("byProjectAndImage", project, image).fetch();
     return attributes;
   } else {
     List<ImageAttribute> attributes =
         ImageAttribute.find("byProjectAndImageAndData", project, image, dataMode).fetch();
     return attributes;
   }
 }
  public static List<ImageAttribute> compileAttributesForImage(
      Project project,
      DatabaseImage image,
      Template template,
      boolean dataMode,
      boolean includeEmptyTemplateAttributes) {
    List<TemplateAttribute> templateAttributes = template == null ? null : template.attributes;

    List<ImageAttribute> attributes = image.attributes;

    // Add attributes from the template
    List<ImageAttribute> returnAttributes = new LinkedList<ImageAttribute>();
    if (templateAttributes != null) {
      for (TemplateAttribute templateAttribute : templateAttributes) {
        boolean found = false;
        for (ImageAttribute attribute : attributes) {
          if ((attribute.data || !dataMode) && attribute.attribute.equals(templateAttribute.name)) {
            found = true;

            attribute.templated = true;
            attribute.hidden = templateAttribute.hidden;
            returnAttributes.add(attribute);
          }
        }
        if (!found && includeEmptyTemplateAttributes) {
          returnAttributes.add(
              new ImageAttribute(
                  project,
                  image,
                  templateAttribute.name,
                  null,
                  dataMode,
                  0,
                  true,
                  templateAttribute.hidden));
        }
      }
    }

    for (ImageAttribute attribute : attributes) {
      if (!attribute.templated) returnAttributes.add(attribute);
    }

    Iterator<ImageAttribute> it = returnAttributes.iterator();
    while (it.hasNext()) {
      ImageAttribute attr = it.next();

      // only show data mode attributes in datamode
      if (dataMode && !attr.data) it.remove();
    }
    return returnAttributes;
  }