Index: web/src/main/java/org/mule/galaxy/atom/RegistryServiceProvider.java
===================================================================
--- web/src/main/java/org/mule/galaxy/atom/RegistryServiceProvider.java	(revision 270)
+++ web/src/main/java/org/mule/galaxy/atom/RegistryServiceProvider.java	Sat Jan 26 17:54:59 EST 2008
@@ -6,7 +6,6 @@
 import org.apache.abdera.protocol.server.RequestContext.Scope;
 import org.apache.abdera.protocol.server.Target;
 import org.apache.abdera.protocol.server.TargetType;
-import org.apache.abdera.protocol.server.WorkspaceInfo;
 import org.apache.abdera.protocol.server.impl.DefaultTarget;
 import org.apache.abdera.protocol.server.impl.ServiceProvider;
 
@@ -23,6 +22,13 @@
             return new DefaultTarget(TargetType.TYPE_ENTRY, ctx);
         } else {
             if (t.getType().equals(TargetType.TYPE_MEDIA)) {
+                if (ctx.getParameter("version") != null)
+                {
+                    ctx.setAttribute(Scope.REQUEST,
+                                     COLLECTION_PROVIDER_ATTRIBUTE,
+                                     artifactVersionProvider);
+                    return new DefaultTarget(TargetType.TYPE_MEDIA, ctx);
+                }
                 if ("history".equals(ctx.getParameter("view"))) {
                     ctx.setAttribute(Scope.REQUEST, 
                                      COLLECTION_PROVIDER_ATTRIBUTE, 
Index: web/src/test/java/org/mule/galaxy/atom/ArtifactCollectionTest.java
===================================================================
--- web/src/test/java/org/mule/galaxy/atom/ArtifactCollectionTest.java	(revision 270)
+++ web/src/test/java/org/mule/galaxy/atom/ArtifactCollectionTest.java	Sat Jan 26 17:54:59 EST 2008
@@ -1,13 +1,18 @@
 package org.mule.galaxy.atom;
 
 
+import org.mule.galaxy.test.AbstractAtomTest;
+import org.mule.galaxy.util.IOUtils;
+
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.List;
 
 import org.apache.abdera.i18n.iri.IRI;
-import org.apache.abdera.i18n.text.UrlEncoding;
 import org.apache.abdera.i18n.text.CharUtils.Profile;
+import org.apache.abdera.i18n.text.UrlEncoding;
 import org.apache.abdera.model.Collection;
+import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Element;
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.Feed;
@@ -17,7 +22,6 @@
 import org.apache.abdera.protocol.client.ClientResponse;
 import org.apache.abdera.protocol.client.RequestOptions;
 import org.apache.axiom.om.util.Base64;
-import org.mule.galaxy.test.AbstractAtomTest;
 
 public class ArtifactCollectionTest extends AbstractAtomTest {
     
@@ -146,7 +150,67 @@
         res.release();
         
     }
-    
+
+    public void testMultipleVersions() throws Exception
+    {
+        AbderaClient client = new AbderaClient(abdera);
+        RequestOptions defaultOpts = client.getDefaultRequestOptions();
+        defaultOpts.setAuthorization("Basic " + Base64.encode("admin:admin".getBytes()));
+
+        String base = "http://localhost:9002/api/registry";
+
+        // create version 1
+        RequestOptions opts = new RequestOptions();
+        opts.setContentType("text/plain; charset=utf-8");
+        opts.setSlug("test.txt");
+        opts.setHeader("X-Artifact-Version", "1");
+        opts.setHeader("X-Workspace", "Default Workspace");
+        opts.setAuthorization(defaultOpts.getAuthorization());
+
+        String version1 = "This is version 1";
+        String version2 = "This is version 2";
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(version1.getBytes("UTF-8"));
+
+        ClientResponse res = client.post(base, bais, opts);
+        assertEquals(201, res.getStatus());
+        res.release();
+
+        // create version 2, reuse v1 request opts
+        opts.setHeader("X-Artifact-Version", "2");
+        bais = new ByteArrayInputStream(version2.getBytes("UTF-8"));
+
+        res = client.post(base, bais, opts);
+        assertEquals(201, res.getStatus());
+        res.release();
+
+        res = client.get(base + "/Default%20Workspace/test.txt?view=history");
+        assertEquals(200, res.getStatus());
+        Document<Feed> doc = res.getDocument();
+        prettyPrint(doc);
+        Feed root = doc.getRoot();
+        List<Entry> entries = root.getEntries();
+        assertEquals(2, entries.size());
+
+        res.release();
+
+        // check the returned content, v1 should still be active, though there's v2 available
+        res = client.get(base + "/Default%20Workspace/test.txt");
+        assertEquals(200, res.getStatus());
+        assertEquals("Version 1 should have stayed active.",
+                     version1, IOUtils.readStringFromStream(res.getInputStream()));
+        res.release();
+
+        // now request a non-active version
+        res = client.get(base + "/Default%20Workspace/test.txt?version=2");
+
+        Thread.sleep(10000000);
+
+        assertEquals(200, res.getStatus());
+        assertEquals(version2, IOUtils.readStringFromStream(res.getInputStream()));
+        res.release();
+    }
+    
     private InputStream getWsdl() {
         return getClass().getResourceAsStream("/wsdl/hello.wsdl");
     }
Index: web/src/main/java/org/mule/galaxy/atom/ArtifactVersionCollectionProvider.java
===================================================================
--- web/src/main/java/org/mule/galaxy/atom/ArtifactVersionCollectionProvider.java	(revision 270)
+++ web/src/main/java/org/mule/galaxy/atom/ArtifactVersionCollectionProvider.java	Sat Jan 26 17:54:59 EST 2008
@@ -1,6 +1,14 @@
 package org.mule.galaxy.atom;
 
 
+import org.mule.galaxy.Artifact;
+import org.mule.galaxy.ArtifactPolicyException;
+import org.mule.galaxy.ArtifactResult;
+import org.mule.galaxy.ArtifactVersion;
+import org.mule.galaxy.Registry;
+import org.mule.galaxy.RegistryException;
+import org.mule.galaxy.security.User;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Date;
@@ -15,13 +23,6 @@
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.RequestContext.Scope;
 import org.apache.abdera.protocol.server.impl.ResponseContextException;
-import org.mule.galaxy.Artifact;
-import org.mule.galaxy.ArtifactPolicyException;
-import org.mule.galaxy.ArtifactResult;
-import org.mule.galaxy.ArtifactVersion;
-import org.mule.galaxy.Registry;
-import org.mule.galaxy.RegistryException;
-import org.mule.galaxy.security.User;
 
 public class ArtifactVersionCollectionProvider extends AbstractArtifactVersionProvider {
     
@@ -87,12 +88,17 @@
 
     @Override
     public ArtifactVersion getEntry(String name, RequestContext request) throws ResponseContextException {
+        // TODO DD: why use the header value here?
         String versionLabel = request.getHeader("version");
+        if (versionLabel == null)
+        {
+             versionLabel = request.getParameter("version");
+        }
-        
+
         if (versionLabel == null || "".equals(versionLabel)) {
             return getArtifact(request).getActiveVersion();
         }
-        
+
         return getArtifact(request).getVersion(versionLabel);
     }
 
Index: web/src/main/java/org/mule/galaxy/atom/ArtifactCollectionProvider.java
===================================================================
--- web/src/main/java/org/mule/galaxy/atom/ArtifactCollectionProvider.java	(revision 270)
+++ web/src/main/java/org/mule/galaxy/atom/ArtifactCollectionProvider.java	Sat Jan 26 17:01:15 EST 2008
@@ -1,6 +1,15 @@
 package org.mule.galaxy.atom;
 
 
+import org.mule.galaxy.Artifact;
+import org.mule.galaxy.ArtifactPolicyException;
+import org.mule.galaxy.ArtifactResult;
+import org.mule.galaxy.ArtifactVersion;
+import org.mule.galaxy.Registry;
+import org.mule.galaxy.RegistryException;
+import org.mule.galaxy.Workspace;
+import org.mule.galaxy.security.User;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Date;
@@ -10,27 +19,16 @@
 import javax.activation.MimeType;
 import javax.activation.MimeTypeParseException;
 
-import org.apache.abdera.Abdera;
 import org.apache.abdera.i18n.iri.IRI;
-import org.apache.abdera.i18n.text.UrlEncoding;
 import org.apache.abdera.i18n.text.CharUtils.Profile;
+import org.apache.abdera.i18n.text.UrlEncoding;
 import org.apache.abdera.model.Collection;
 import org.apache.abdera.model.Content;
 import org.apache.abdera.model.Entry;
-import org.apache.abdera.model.Feed;
 import org.apache.abdera.model.Person;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.impl.EmptyResponseContext;
 import org.apache.abdera.protocol.server.impl.ResponseContextException;
-import org.mule.galaxy.Artifact;
-import org.mule.galaxy.ArtifactPolicyException;
-import org.mule.galaxy.ArtifactResult;
-import org.mule.galaxy.ArtifactVersion;
-import org.mule.galaxy.NotFoundException;
-import org.mule.galaxy.Registry;
-import org.mule.galaxy.RegistryException;
-import org.mule.galaxy.Workspace;
-import org.mule.galaxy.security.User;
 
 public class ArtifactCollectionProvider extends AbstractArtifactVersionProvider {
     
@@ -128,17 +126,22 @@
     }
 
     protected ArtifactVersion selectVersion(Artifact next, String version) throws ResponseContextException {
+        ArtifactVersion v;
         if (version != null) {
-            ArtifactVersion v = next.getVersion(version);
+            v = next.getVersion(version);
-            
+
             if (v == null || "".equals(version)) {
                 EmptyResponseContext res = new EmptyResponseContext(404);
                 res.setStatusText("Version " + version + " was not found.");
                 throw new ResponseContextException(res);
             }
         }
-        return next.getActiveVersion();
+        else
+        {
+            v = next.getActiveVersion();
-    }
+        }
+        return v;
+    }
 
     @Override
     protected ArtifactResult createMediaEntry(String slug, 
