Index: modules/rdf/rdf.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/rdf/rdf.module,v
retrieving revision 1.20
diff -u -p -r1.20 rdf.module
--- modules/rdf/rdf.module	14 Jan 2010 06:31:45 -0000	1.20
+++ modules/rdf/rdf.module	21 Jan 2010 09:31:51 -0000
@@ -452,6 +452,19 @@ function rdf_preprocess_field(&$variable
   if (!empty($mapping) && !empty($mapping[$field_name])) {
     foreach ($element['#items'] as $delta => $item) {
       $variables['item_attributes_array'][$delta] = rdf_rdfa_attributes($mapping[$field_name], $item);
+      // If this field is an image, RDFa will not output correctly when the
+      // image is in a containing 'a' tag. If the field is a file, RDFa will
+      // not output correctly if the filetype icon comes before the link to
+      // the file. We correct this by adding a resource attribute to the div if
+      // this field has a URI.
+      if (isset($item['uri'])) {
+        if (isset($element[$delta]['#image_style'])) {
+          $variables['item_attributes_array'][$delta]['resource'] = image_style_url($element[$delta]['#image_style'], $item['uri']);
+        }
+        else {
+          $variables['item_attributes_array'][$delta]['resource'] = file_create_url($item['uri']);
+        }
+      }
     }
   }
 }
@@ -595,6 +608,14 @@ function rdf_field_attach_view_alter(&$o
 }
 
 /**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_image(&$variables) {
+  dpm($variables);
+  $variables['attributes']['typeof'] = array('foaf:Image');
+}
+
+/**
  * Wraps a template variable in an HTML element with the desired attributes.
  *
  * This is called by rdf_process() shortly before the theme system renders
@@ -694,5 +715,4 @@ function theme_rdf_metadata($variables) 
     $output .= '<span' . drupal_attributes($attributes) . '></span>';
   }
   return $output;
-}
-
+}
\ No newline at end of file
Index: modules/rdf/rdf.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/rdf/rdf.test,v
retrieving revision 1.7
diff -u -p -r1.7 rdf.test
--- modules/rdf/rdf.test	14 Jan 2010 06:31:45 -0000	1.7
+++ modules/rdf/rdf.test	21 Jan 2010 09:31:52 -0000
@@ -116,6 +116,64 @@ class RdfMarkupTestCase extends DrupalWe
     $this->assertEqual($expected_attributes, $attributes);
   }
 
+  /**
+   * Ensure that file fields have the correct resource as the object in RDFa
+   * when displayed as a teaser.
+   */
+  function testAttributesInMarkupFile() {
+    // Create a user to post the image.
+    $admin_user = $this->drupalCreateUser(array('edit own article content', 'revert revisions', 'administer content types'));
+    $this->drupalLogin($admin_user);
+
+    $langcode = LANGUAGE_NONE;
+    $bundle_name = "article";
+
+    // Create file field.
+    $file_field = 'file_test';
+    $edit = array(
+      '_add_new_field[label]' => $file_field,
+      '_add_new_field[field_name]' => $file_field,
+      '_add_new_field[type]' => 'file',
+      '_add_new_field[widget_type]' => 'file_generic',
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $bundle_name . '/fields',  $edit, t('Save'));
+    // Set the RDF mapping for the new field.
+    $rdf_mapping = rdf_mapping_load('node', $bundle_name);
+    $rdf_mapping += array('field_' . $file_field => array('predicates' => array('rdfs:seeAlso'), 'type' => 'rel'));
+    $rdf_mapping_save = array('mapping' => $rdf_mapping, 'type' => 'node', 'bundle' => $bundle_name);
+    rdf_mapping_save($rdf_mapping_save);
+
+    // Get the test file that simpletest provides.
+    $file = current($this->drupalGetTestFiles('text'));
+
+    // Prepare image variables.
+    $image_field = "field_image";
+    // Get the test image that simpletest provides.
+    $image = current($this->drupalGetTestFiles('image'));
+
+    // Create an array for drupalPost with the field names as the keys and
+    // the uris for the test files as the values.
+    $edit = array("files[field_" . $file_field . "_" . $langcode . "_0]" => drupal_realpath($file->uri),
+                  "files[" . $image_field . "_" . $langcode . "_0]" => drupal_realpath($image->uri));
+
+    // Create node and save, then edit node to upload files.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Get filenames and nid for comparison with HTML output.
+    $file_filename = $file->filename;
+    $image_filename = $image->filename;
+    $nid = $node->nid;
+    // Navigate to front page, where node is displayed in teaser form.
+    $this->drupalGet('node');
+
+    // We only check to make sure that the resource attribute contains '.txt'
+    // instead of the full file name because the filename is altered on upload.
+    $file_rel = $this->xpath("//div[contains(@about, 'node/$nid')]//div[contains(@rel, 'rdfs:seeAlso') and contains(@resource, '.txt')]");
+    $this->assertTrue(!empty($file_rel), t('Attribute \'rel\' set on file field. Attribute \'resource\' is also set.'));
+    $image_rel = $this->xpath("//div[contains(@about, 'node/$nid')]//div[contains(@rel, 'rdfs:seeAlso') and contains(@resource, '$image_filename')]//img[contains(@typeof, 'foaf:Image')]");
+    $this->assertTrue(!empty($image_rel), t('Attribute \'rel\' set on image field. Attribute \'resource\' is also set.'));
+  }
 }
 
 class RdfCrudTestCase extends DrupalWebTestCase {
