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); + } }