| package org.apache.maven.continuum.project.builder; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.MalformedURLException; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.net.URL; |
| import java.net.UnknownHostException; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.apache.http.HttpException; |
| import org.apache.http.HttpResponse; |
| import org.apache.http.HttpVersion; |
| import org.apache.http.auth.AuthScope; |
| import org.apache.http.auth.UsernamePasswordCredentials; |
| import org.apache.http.client.methods.HttpGet; |
| import org.apache.http.conn.ClientConnectionManager; |
| import org.apache.http.conn.params.ConnManagerPNames; |
| import org.apache.http.conn.params.ConnPerRouteBean; |
| import org.apache.http.conn.scheme.PlainSocketFactory; |
| import org.apache.http.conn.scheme.Scheme; |
| import org.apache.http.conn.scheme.SchemeRegistry; |
| import org.apache.http.conn.ssl.SSLSocketFactory; |
| import org.apache.http.impl.client.DefaultHttpClient; |
| import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; |
| import org.apache.http.params.BasicHttpParams; |
| import org.apache.http.params.HttpParams; |
| import org.apache.http.params.HttpProtocolParams; |
| import org.apache.http.util.EntityUtils; |
| import org.codehaus.plexus.logging.AbstractLogEnabled; |
| import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; |
| import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; |
| import org.codehaus.plexus.util.FileUtils; |
| import org.codehaus.plexus.util.IOUtil; |
| import org.codehaus.plexus.util.StringUtils; |
| |
| |
| /** |
| * @author <a href="mailto:trygvis@inamo.no">Trygve Laugstøl</a> |
| * @version $Id$ |
| */ |
| public abstract class AbstractContinuumProjectBuilder |
| extends AbstractLogEnabled |
| implements ContinuumProjectBuilder, Initializable |
| { |
| |
| private static final String TMP_DIR = System.getProperty( "java.io.tmpdir" ); |
| |
| private DefaultHttpClient httpClient; |
| |
| |
| public void initialize() |
| throws InitializationException |
| { |
| SchemeRegistry schemeRegistry = new SchemeRegistry(); |
| // http scheme |
| schemeRegistry.register( new Scheme( "http", PlainSocketFactory.getSocketFactory(), 80 ) ); |
| // https scheme |
| SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); |
| |
| // ignore cert |
| sslSocketFactory.setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER ); |
| schemeRegistry.register( new Scheme( "https", sslSocketFactory, 443 ) ); |
| |
| HttpParams params = new BasicHttpParams(); |
| // TODO put this values to a configuration way ??? |
| params.setParameter( ConnManagerPNames.MAX_TOTAL_CONNECTIONS, new Integer( 30 ) ); |
| params.setParameter( ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean( 30 ) ); |
| HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1 ); |
| |
| ClientConnectionManager cm = new ThreadSafeClientConnManager( params, schemeRegistry ); |
| |
| httpClient = new DefaultHttpClient( cm, params ); |
| |
| |
| } |
| |
| protected File createMetadataFile( URL metadata, String username, String password, ContinuumProjectBuildingResult result ) |
| throws IOException, URISyntaxException, HttpException |
| { |
| getLogger().info( "Downloading " + metadata.toExternalForm() ); |
| |
| InputStream is = null; |
| |
| if ( metadata.getProtocol().startsWith( "http" ) ) |
| { |
| URI uri = metadata.toURI(); |
| HttpGet httpGet = new HttpGet( uri ); |
| |
| // basic auth |
| if ( username != null && password != null ) |
| { |
| httpClient.getCredentialsProvider() |
| .setCredentials( new AuthScope( uri.getHost(), uri.getPort() ), |
| new UsernamePasswordCredentials( username, password ) ); |
| } |
| |
| HttpResponse httpResponse = httpClient.execute( httpGet ); |
| |
| // basic auth |
| |
| int res = httpResponse.getStatusLine().getStatusCode(); |
| switch (res) |
| { |
| case 200 : |
| break; |
| case 401: |
| getLogger().error( "Error adding project: Unauthorized " + metadata, null ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_UNAUTHORIZED ); |
| return null; |
| default : |
| getLogger().warn( "skip non handled http return code " + res ); |
| } |
| is = IOUtils.toInputStream( EntityUtils.toString( httpResponse.getEntity(), EntityUtils |
| .getContentCharSet( httpResponse.getEntity() ) ) ); |
| } |
| else |
| { |
| is = metadata.openStream(); |
| } |
| |
| String path = metadata.getPath(); |
| |
| String baseDirectory; |
| |
| String fileName; |
| |
| int lastIndex = path.lastIndexOf( "/" ); |
| |
| if ( lastIndex >= 0 ) |
| { |
| baseDirectory = path.substring( 0, lastIndex ); |
| |
| // Required for windows |
| int colonIndex = baseDirectory.indexOf( ":" ); |
| |
| if ( colonIndex >= 0 ) |
| { |
| baseDirectory = baseDirectory.substring( colonIndex + 1 ); |
| } |
| |
| fileName = path.substring( lastIndex + 1 ); |
| } |
| else |
| { |
| baseDirectory = ""; |
| |
| fileName = path; |
| } |
| |
| // Little hack for URLs that contains '*' like "http://svn.codehaus.org/*checkout*/trunk/pom.xml?root=plexus" |
| baseDirectory = StringUtils.replace( baseDirectory, "*", "" ); |
| |
| File continuumTmpDir = new File( TMP_DIR, "continuum" ); |
| |
| // FIXME should deleted after has been reading |
| File uploadDirectory = new File( continuumTmpDir, baseDirectory ); |
| |
| uploadDirectory.deleteOnExit(); |
| |
| // resolve any '..' as it will cause issues |
| uploadDirectory = uploadDirectory.getCanonicalFile(); |
| |
| uploadDirectory.mkdirs(); |
| |
| FileUtils.forceDeleteOnExit( continuumTmpDir ); |
| |
| File file = new File( uploadDirectory, fileName ); |
| |
| file.deleteOnExit(); |
| |
| FileWriter writer = new FileWriter( file ); |
| |
| IOUtil.copy( is, writer ); |
| |
| is.close(); |
| |
| writer.close(); |
| |
| return file; |
| } |
| |
| /** |
| * Create metadata file and handle exceptions, adding the errors to the result object. |
| * |
| * @param result holder with result and errors. |
| * @param metadata |
| * @param username |
| * @param password |
| * @return |
| */ |
| protected File createMetadataFile( ContinuumProjectBuildingResult result, URL metadata, String username, |
| String password ) |
| { |
| try |
| { |
| return createMetadataFile( metadata, username, password, result ); |
| } |
| catch ( FileNotFoundException e ) |
| { |
| getLogger().info( "URL not found: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_POM_NOT_FOUND ); |
| } |
| catch ( MalformedURLException e ) |
| { |
| getLogger().info( "Malformed URL: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_MALFORMED_URL ); |
| } |
| catch ( URISyntaxException e ) |
| { |
| getLogger().info( "Malformed URL: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_MALFORMED_URL ); |
| } |
| catch ( UnknownHostException e ) |
| { |
| getLogger().info( "Unknown host: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_UNKNOWN_HOST ); |
| } |
| catch ( IOException e ) |
| { |
| getLogger().warn( "Could not download the URL: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_UNKNOWN ); |
| } |
| catch ( HttpException e ) |
| { |
| getLogger().warn( "Could not download the URL: " + metadata, e ); |
| result.addError( ContinuumProjectBuildingResult.ERROR_UNKNOWN ); |
| } |
| return null; |
| } |
| |
| } |