You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ja...@apache.org on 2008/07/31 00:14:39 UTC

svn commit: r681222 - in /maven/sandbox/trunk/mercury/src: main/java/org/apache/maven/mercury/spi/http/client/deploy/ main/java/org/apache/maven/mercury/spi/http/client/retrieve/ main/java/org/apache/maven/mercury/transport/api/ test/java/org/apache/ma...

Author: janb
Date: Wed Jul 30 15:14:38 2008
New Revision: 681222

URL: http://svn.apache.org/viewvc?rev=681222&view=rev
Log:
Implement deployment and retrieval from local memory.

Modified:
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/transport/api/Binding.java
    maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyDeployerTest.java
    maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java Wed Jul 30 15:14:38 2008
@@ -52,6 +52,7 @@
     protected Set<StreamObserver> _observers = new HashSet<StreamObserver>();
     protected List<Verifier> _verifiers = new ArrayList<Verifier>();
     protected int _index = -1; 
+
     
     public abstract void onComplete();
 
@@ -138,9 +139,11 @@
             _observers.add(o);
         }
       
-        if ( _binding == null || _binding.getLocalFile() == null || !_binding.getLocalFile().exists() )
+        if ( _binding == null || 
+                (_binding.isFile() && (_binding.getLocalFile() == null || !_binding.getLocalFile().exists())) ||
+                (_binding.isInMemory() && _binding.getLocalInputStream() == null))
         {
-            throw new IllegalArgumentException( "No local file to deploy" );
+            throw new IllegalArgumentException( "Nothing to deploy" );
         }
         _targetState = new TargetState();
         _checksumState = new TargetState();
@@ -223,7 +226,10 @@
                 url = new URL( url.toString() + v.getExtension());
             }
       
-            file = File.createTempFile( _binding.getLocalFile().getName() + v.getExtension(), ".tmp" );
+            String localFileName = getFileName(url);
+            
+            file = File.createTempFile( localFileName, ".tmp" );
+            file.deleteOnExit();
             OutputStreamWriter fw = new OutputStreamWriter( new FileOutputStream( file ), "UTF-8" );
             fw.write( v.getSignature() );
             fw.close();
@@ -273,6 +279,22 @@
     {
         return ( _checksumState.isReady() && _targetState.isReady() );
     }
+    
+    public String getFileName (URL url)
+    {
+        if (url==null)
+            return "";
+        String localFileName = url.getFile();
+        int i = localFileName.indexOf('?');
+        if (i > 0)
+            localFileName = localFileName.substring(0, i);
+        if (localFileName.endsWith("/"))
+            localFileName = localFileName.substring(0, localFileName.length()-1);
+        i = localFileName.lastIndexOf('/');
+        if (i >= 0)
+            localFileName = localFileName.substring(i+1);
+        return localFileName;
+    }
 
     public String toString()
     {

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java Wed Jul 30 15:14:38 2008
@@ -79,7 +79,9 @@
         {
             setMethod( HttpMethods.PUT );
             setRequestHeader( "Content-Type", "application/octet-stream" );
-            setRequestHeader( "Content-Length", String.valueOf( _localFile.length() ) );
+            if (_binding.isFile())
+                setRequestHeader( "Content-Length", String.valueOf( _localFile.length() ) );
+            
             setRequestContentSource( getInputStream() );
             setRequestHeader( __BATCH_HEADER, _batchId );            
             super.send();
@@ -145,7 +147,12 @@
     {
         if ( _inputStream == null )
         {
-            ObservableInputStream ois = new ObservableInputStream( new FileInputStream( _localFile ));
+            InputStream is = null;
+            if (_binding.isFile())
+                is = new FileInputStream( _localFile );
+            else if (_binding.isInMemory())
+                is = _binding.getLocalInputStream();
+            ObservableInputStream ois = new ObservableInputStream( is );
             _inputStream = ois;
             ois.addObservers(_observers);
         }    

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java Wed Jul 30 15:14:38 2008
@@ -136,11 +136,16 @@
     {
         if ( _outputStream == null )
         {
-            ObservableOutputStream oos = new ObservableOutputStream( new FileOutputStream( _localFile ));
+            OutputStream os = null;
+            if (_binding.isFile())
+                os = new FileOutputStream( _localFile );
+            else if (_binding.isInMemory())
+                os = _binding.getLocalOutputStream();
+            
+            ObservableOutputStream oos = new ObservableOutputStream( os );
             oos.addObservers(_observers);
             _outputStream = oos;
         }
-         
         return _outputStream;
     }
 }

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java Wed Jul 30 15:14:38 2008
@@ -84,9 +84,12 @@
      */
     public RetrievalTarget( DefaultRetriever retriever, Binding binding, Set<Validator> validators, Set<StreamObserver> observers )
     {
-        if ( binding == null || binding.getRemoteResource() == null || binding.getLocalFile() == null )
+        if ( binding == null || 
+                (binding.getRemoteResource() == null) || 
+                (binding.isFile() && (binding.getLocalFile() == null)) ||
+                (binding.isInMemory() && (binding.getLocalOutputStream() == null)))
         {
-            throw new IllegalArgumentException( "No file to retrieve" );
+            throw new IllegalArgumentException( "Nothing to retrieve" );
         }
         _retriever = retriever;
         _binding = binding;
@@ -101,24 +104,25 @@
                 _observers.add(o);
         }
         
-        _tempFile = new File( _binding.getLocalFile().getParentFile(),
-                              __PREFIX + _binding.getLocalFile().getName() + __TEMP_SUFFIX );        
-        _tempFile.deleteOnExit();
-        
-        // Create the directory if it doesn't exist
-        if ( !_tempFile.getParentFile().exists() )
+        if (_binding.isFile())
         {
-            _tempFile.getParentFile().mkdirs();
-        }
-        
-        if ( _tempFile.exists() )
-        {
-            onError( new HttpClientException( binding, "File exists " + _tempFile.getAbsolutePath() ) );
-        }
-        else if ( !_tempFile.getParentFile().canWrite() )
-        {
-            onError( new HttpClientException( binding,
-                "Unable to write to dir " + _tempFile.getParentFile().getAbsolutePath() ) );
+            _tempFile = new File( _binding.getLocalFile().getParentFile(),
+                                  __PREFIX + _binding.getLocalFile().getName() + __TEMP_SUFFIX );        
+            _tempFile.deleteOnExit();
+            if ( !_tempFile.getParentFile().exists() )
+            {
+                _tempFile.getParentFile().mkdirs();
+            }
+
+            if ( _tempFile.exists() )
+            {
+                onError( new HttpClientException( binding, "File exists " + _tempFile.getAbsolutePath() ) );
+            }
+            else if ( !_tempFile.getParentFile().canWrite() )
+            {
+                onError( new HttpClientException( binding,
+                        "Unable to write to dir " + _tempFile.getParentFile().getAbsolutePath() ) );
+            }
         }
     }
 
@@ -155,7 +159,10 @@
     /** Move the temporary file to its final location */
     public boolean move()
     {
-        return _tempFile.renameTo( _binding.getLocalFile() );
+        if (_binding.isFile())
+            return _tempFile.renameTo( _binding.getLocalFile() );
+        else
+            return true;
     }
 
     /** Cleanup temp files */
@@ -263,7 +270,10 @@
             return true;
         }
 
-        String ext = ( _binding.getLocalFile() == null ? null : _binding.getLocalFile().getName() );
+        String ext =  _binding.getRemoteResource().toString();
+        if (ext.endsWith("/"))
+            ext = ext.substring(0, ext.length()-1);
+        
         int i = ext.lastIndexOf( "." );
         ext = ( i > 0 ? ext.substring( i + 1 ) : "" );
 
@@ -274,9 +284,17 @@
             {
                 try
                 {
-                    if ( !v.validate( _tempFile.getCanonicalPath(), errors ) )
+                    if (_binding.isFile())
+                    {
+                        if ( !v.validate( _tempFile.getCanonicalPath(), errors ) )
+                        {
+                            return false;
+                        }
+                    }
+                    else if (_binding.isInMemory())
                     {
-                        return false;
+                        //TODO ????
+                        //v.validate(_binding.getInboundContent()) 
                     }
                 }
                 catch ( IOException e )

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/transport/api/Binding.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/transport/api/Binding.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/transport/api/Binding.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/transport/api/Binding.java Wed Jul 30 15:14:38 2008
@@ -22,6 +22,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URL;
 
 import org.apache.maven.mercury.repository.api.RepositoryException;
@@ -125,6 +126,16 @@
     return null;
   }
   
+  public OutputStream getLocalOutputStream()
+  {
+      return localOS;
+  }
+  
+  public InputStream getLocalInputStream()
+  {
+      return localIS;
+  }
+  
   public File getLocalFile ()
   {
       return localFile;

Modified: maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyDeployerTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyDeployerTest.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyDeployerTest.java (original)
+++ maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyDeployerTest.java Wed Jul 30 15:14:38 2008
@@ -19,8 +19,13 @@
 
 package org.apache.maven.mercury.spi.http.client;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.LineNumberReader;
 import java.io.OutputStream;
@@ -392,4 +397,49 @@
         Thread.sleep(500);
     }
     
+    public void testMemoryDeployment () throws Exception
+    {
+        factories.add(new SHA1VerifierFactory(false, true)); //!lenient, sufficient
+        remoteServerType.setStreamObserverFactories(factories);
+        HashSet<Binding> bindings = new HashSet<Binding>();
+        DeployRequestImpl request = new DeployRequestImpl();
+
+        String s0 = "memory contents0";
+        InputStream is0 = new ByteArrayInputStream(s0.getBytes());
+        Binding binding0 = new Binding(new URL(_HOST_FRAGMENT+_port+__PATH_FRAGMENT+"file0.txt"), is0);
+        bindings.add(binding0);
+
+        String s5 = "memory contents5";
+        InputStream is5 = new ByteArrayInputStream(s5.getBytes());
+        Binding binding5 = new Binding(new URL(_HOST_FRAGMENT+_port+__PATH_FRAGMENT+"file5.jpg"), is5);
+        bindings.add(binding5);
+
+        request.setBindings(bindings);     
+        request.setFailFast(true);
+        DeployResponse response = _deployer.deploy(request);
+
+        //for (MercuryException t:response.getExceptions())
+        //    t.printStackTrace();
+        
+  
+        assertEquals(0, response.getExceptions().size());
+
+        
+        File f0 = new File(_putServer.getPutDir(), "file0.txt");
+        File f0cs = new File (_putServer.getPutDir(), "file0.txt.sha1");
+        assertTrue (f0.exists());
+        BufferedReader reader = new BufferedReader(new FileReader(f0));
+        String s = reader.readLine();
+        assertEquals(s0, s.trim());
+        assertTrue (f0cs.exists()); 
+        
+        File f5 = new File(_putServer.getPutDir(), "file5.jpg");
+        File f5cs = new File (_putServer.getPutDir(), "file5.jpg.sha1");
+        assertTrue (f5.exists());
+        reader = new BufferedReader(new FileReader(f5));
+        s = reader.readLine();
+        assertEquals(s5, s.trim());
+        assertTrue (f5cs.exists());  
+    }
+    
 }

Modified: maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java?rev=681222&r1=681221&r2=681222&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java (original)
+++ maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java Wed Jul 30 15:14:38 2008
@@ -19,7 +19,9 @@
 
 package org.apache.maven.mercury.spi.http.client;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.InputStream;
 import java.net.URL;
 import java.util.HashSet;
 import java.util.List;
@@ -35,6 +37,7 @@
 import org.apache.maven.mercury.transport.api.Binding;
 import org.apache.maven.mercury.transport.api.Server;
 import org.apache.maven.mercury.transport.api.StreamObserverFactory;
+import org.mortbay.util.IO;
 
 public class JettyRetrieverTest extends TestCase
 {
@@ -47,12 +50,6 @@
     File file3;
     File file4;
     File file5;
-    Binding binding0 = new Binding();
-    Binding binding1 = new Binding();
-    Binding binding2 = new Binding();
-    Binding binding3 = new Binding();
-    Binding binding4 = new Binding();
-    Binding binding5 = new Binding();
     DefaultRetriever retriever;
     SimpleTestServer server;
     Server remoteServerType;
@@ -450,4 +447,46 @@
         assertTrue(!file4.exists());
         assertTrue(!file5.exists());
     }
+    
+
+    public void testMemoryRetrieval () throws Exception
+    {
+        factories.add(new SHA1VerifierFactory(true, true)); //lenient, sufficient
+        remoteServerType.setStreamObserverFactories(factories);
+
+        //make local dir to put stuff in
+        final File dir = mkTempDir();
+        DefaultRetrievalRequest request = new DefaultRetrievalRequest();
+        HashSet<Binding> bindings = new HashSet<Binding>();
+        HashSet<Validator> validators = new HashSet<Validator>();
+        validators.add(new TxtValidator());
+        request.setValidators(validators);
+        
+        Binding binding0 = new Binding(new URL(__HOST_FRAGMENT+_port+__PATH_FRAGMENT+"file0.txt"));
+        bindings.add(binding0);
+
+        Binding binding5 = new Binding(new URL(__HOST_FRAGMENT+_port+__PATH_FRAGMENT+"file5.jpg"));
+        bindings.add(binding5);
+
+        request.setFailFast(false);
+
+        request.setBindings(bindings);
+        RetrievalResponse response = retriever.retrieve(request);
+
+        //for (MercuryException t:response.getExceptions())
+        //    t.printStackTrace();
+
+        assertEquals(0,response.getExceptions().size());
+        
+        
+        InputStream is = this.getClass().getResourceAsStream("/testRepo/file0.txt");
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        IO.copy(is, os);
+        assertEquals(os.toByteArray().length, binding0.getInboundContent().length);
+
+        is = this.getClass().getResourceAsStream("/testRepo/file5.jpg");
+        os.reset();
+        IO.copy(is,os);
+        assertEquals(os.toByteArray().length, binding5.getInboundContent().length);
+    }
 }