You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2003/04/30 12:24:13 UTC
cvs commit: avalon-sandbox/merlin/assembly/src/java/org/apache/avalon/assembly/repository/impl FileRepository.java
mcconnell 2003/04/30 03:24:12
Modified: merlin/assembly/src/java/org/apache/avalon/assembly/repository/impl
FileRepository.java
Log:
Updates to handle installation of an application.
Revision Changes Path
1.2 +211 -8 avalon-sandbox/merlin/assembly/src/java/org/apache/avalon/assembly/repository/impl/FileRepository.java
Index: FileRepository.java
===================================================================
RCS file: /home/cvs/avalon-sandbox/merlin/assembly/src/java/org/apache/avalon/assembly/repository/impl/FileRepository.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- FileRepository.java 24 Apr 2003 12:10:44 -0000 1.1
+++ FileRepository.java 30 Apr 2003 10:24:12 -0000 1.2
@@ -50,11 +50,21 @@
package org.apache.avalon.assembly.repository.impl;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.avalon.assembly.repository.Repository;
import org.apache.avalon.assembly.repository.RepositoryException;
+import org.apache.avalon.assembly.repository.TransportException;
+import org.apache.avalon.assembly.util.ExceptionHelper;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
@@ -75,10 +85,42 @@
public static final String BASE_KEY = "urn:avalon:repository.base";
+ public static final String HOSTS_KEY = "urn:avalon:repository.hosts";
+
+ public static final URL DEFAULT_HOST = getDefaultHost();
+
+ private static URL getDefaultHost()
+ {
+ try
+ {
+ return new URL( "http://www.osm.net/repository/" );
+ }
+ catch( Throwable e )
+ {
+ throw new RuntimeException( "default-host" );
+ }
+ }
+
+ /**
+ * Utility method to construct a new repository using the supplied
+ * directory as a local file cache.
+ */
public static Repository newInstance( File base ) throws ContextException
{
+ final URL[] hosts = new URL[]{ DEFAULT_HOST };
+ return newInstance( hosts, base );
+ }
+
+ /**
+ * Utility method to construct a new repository using the supplied
+ * directory as a local file cache and the supplied URL array as a
+ * sequence of remote repository sources.
+ */
+ public static Repository newInstance( URL[] hosts, File base ) throws ContextException
+ {
FileRepository repository = new FileRepository();
DefaultContext context = new DefaultContext();
+ context.put( HOSTS_KEY, hosts );
context.put( BASE_KEY, base );
repository.contextualize( context );
return repository;
@@ -88,8 +130,16 @@
// state
//------------------------------------------------------------------
+ /**
+ * The directory referencing the local repository cache.
+ */
private File m_base;
+ /**
+ * Sequence of remote hosts.
+ */
+ private URL[] m_hosts;
+
//------------------------------------------------------------------
// lifecycle
//------------------------------------------------------------------
@@ -104,11 +154,8 @@
*/
public void contextualize( Context context ) throws ContextException
{
- Object object = context.get( BASE_KEY );
- if( object instanceof File )
- {
- m_base = (File) object;
- }
+ m_base = (File) context.get( BASE_KEY );
+ m_hosts = (URL[]) context.get( HOSTS_KEY );
}
//------------------------------------------------------------------
@@ -152,8 +199,7 @@
if( !application.exists() )
{
final String error =
- "Unknown group: " + group
- + ". File: '" + application + "'.";
+ "Unknown group: " + group;
throw new RepositoryException( error );
}
@@ -178,6 +224,7 @@
+ ". File: '" + resource + "'.";
throw new RepositoryException( error );
}
+
try
{
if( type.equals( "jar" ) )
@@ -218,6 +265,162 @@
private String getResourceName( String artifact, int index )
{
return artifact.substring( index + 1 );
+ }
+
+ public void install( String group ) throws RepositoryException
+ {
+ m_base.mkdirs();
+ final File file = new File( m_base, group + "-package.zip" );
+ download( group, file );
+ expand( group, file );
+ }
+
+ public void download( String group, File file ) throws RepositoryException
+ {
+ final List errors = new ArrayList();
+ if( getRemoteResource( group, file, errors ) )
+ {
+ //return getArtifact( group, name, version, type );
+ System.out.println( "SUCCESS" );
+ return;
+ }
+
+ RepositoryException[] exceptions =
+ (RepositoryException[]) errors.toArray( new RepositoryException[0] );
+
+ final String header =
+ "Unable to resolve repository package for group: " + group;
+ StringBuffer buffer = new StringBuffer( header );
+ for( int i=0; i<exceptions.length; i++ )
+ {
+ buffer.append( "\n" );
+ final String message =
+ ExceptionHelper.packException( "Connection: " + (i+1), exceptions[i] );
+ buffer.append( message );
+ }
+ throw new RepositoryException( buffer.toString() );
+ }
+
+ public void expand( String group, File file )
+ {
+ // todo
+ }
+
+ private boolean getRemoteResource( String group, File file, List errors )
+ {
+ for( int i=0; i<m_hosts.length; i++ )
+ {
+ URL url = m_hosts[i];
+ try
+ {
+ final URL path = new URL( url, url.getPath() + group + "/" + group + "-package.zip" );
+ transfer( path, file );
+ return true;
+ }
+ catch( RepositoryException e )
+ {
+ errors.add( e );
+ }
+ catch( Throwable e )
+ {
+ final String error =
+ "Unexpected error while handling url: " + url;
+ errors.add( new RepositoryException( error, e ) );
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Transfer the content of the supplied URL to a local file.
+ * @param url the source URL
+ * @param file the destination file
+ * @exception TransportException if a transport related error occurs
+ */
+ public static void transfer( final URL url, final File file ) throws TransportException
+ {
+ final URLConnection source = getConnection( url );
+
+ Throwable cause = null;
+ BufferedOutputStream output = null;
+ try
+ {
+ final BufferedInputStream input = new BufferedInputStream( source.getInputStream());
+ output = new BufferedOutputStream( new FileOutputStream( file ) );
+ transfer( input, output );
+ }
+ catch( Throwable e )
+ {
+ cause = e;
+ }
+ finally
+ {
+ //
+ // cleanup
+ //
+
+ if( output != null )
+ {
+ try
+ {
+ output.close();
+ }
+ catch( Throwable e )
+ {
+ // ignore
+ }
+ }
+ }
+
+ //
+ // check for errors
+ //
+
+ if( cause != null )
+ {
+ final String error =
+ "Transfer failure while replicating: " + url
+ + " to: " + file;
+ throw new TransportException( error, cause );
+ }
+ }
+
+ /**
+ * Internal utility to get the connection.
+ * @param url the source url
+ * @exception TransportException if a connection resolution error occurs
+ */
+ private static URLConnection getConnection( final URL url ) throws TransportException
+ {
+ try
+ {
+ return url.openConnection();
+ }
+ catch( Throwable e )
+ {
+ final String error =
+ "Unable to open a connection to the url: " + url;
+ throw new TransportException( error, e );
+ }
+ }
+
+ /**
+ * Transfer the input stream to the output stream.
+ *
+ * @param input the input stream to read from
+ * @param output the output stream to write to
+ * @exception Exception if an error occurs
+ */
+ private static void transfer( InputStream input, OutputStream output )
+ throws Exception
+ {
+ byte[] buffer = new byte[1024];
+ int count = 0;
+ while( count != -1 )
+ {
+ output.write( buffer, 0, count );
+ count = input.read( buffer, 0, buffer.length );
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org