You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ol...@apache.org on 2008/08/27 00:29:10 UTC
svn commit: r689267 - in /continuum/trunk: ./ continuum-api/
continuum-commons/
continuum-commons/src/main/java/org/apache/maven/continuum/utils/
continuum-commons/src/test/java/org/apache/maven/continuum/utils/
continuum-core/
Author: olamy
Date: Tue Aug 26 15:29:10 2008
New Revision: 689267
URL: http://svn.apache.org/viewvc?rev=689267&view=rev
Log:
[CONTINUUM-1489] replace use of MungedHttpsURL with commons-httpclient
validating an uri can be be so simple
bye bye plexus-formica.
Modified:
continuum/trunk/continuum-api/pom.xml
continuum/trunk/continuum-commons/pom.xml
continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/utils/ContinuumUrlValidator.java
continuum/trunk/continuum-commons/src/test/java/org/apache/maven/continuum/utils/ContinuumUrlValidatorTest.java
continuum/trunk/continuum-core/pom.xml
continuum/trunk/pom.xml
Modified: continuum/trunk/continuum-api/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/pom.xml?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/continuum-api/pom.xml (original)
+++ continuum/trunk/continuum-api/pom.xml Tue Aug 26 15:29:10 2008
@@ -28,10 +28,6 @@
<name>Continuum API</name>
<dependencies>
<dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-formica</artifactId>
- </dependency>
- <dependency>
<groupId>org.apache.continuum</groupId>
<artifactId>continuum-model</artifactId>
</dependency>
Modified: continuum/trunk/continuum-commons/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-commons/pom.xml?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/continuum-commons/pom.xml (original)
+++ continuum/trunk/continuum-commons/pom.xml Tue Aug 26 15:29:10 2008
@@ -39,6 +39,10 @@
<groupId>org.apache.continuum</groupId>
<artifactId>continuum-configuration</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ </dependency>
<!-- === Testing Dependencies === -->
<dependency>
<groupId>hsqldb</groupId>
@@ -51,11 +55,6 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-spring</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
Modified: continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/utils/ContinuumUrlValidator.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/utils/ContinuumUrlValidator.java?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/utils/ContinuumUrlValidator.java (original)
+++ continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/utils/ContinuumUrlValidator.java Tue Aug 26 15:29:10 2008
@@ -26,11 +26,8 @@
import java.util.Set;
import org.apache.commons.lang.StringUtils;
-import org.apache.oro.text.perl.Perl5Util;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.formica.validation.AbstractValidator;
-import org.codehaus.plexus.formica.validation.util.Flags;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Configurable;
/**
@@ -41,99 +38,9 @@
* role-hint="continuumUrl"
*/
public class ContinuumUrlValidator
- extends AbstractValidator
implements Configurable
{
/**
- * Allows all validly formatted schemes to pass validation instead of
- * supplying a set of valid schemes.
- */
- public static final int ALLOW_ALL_SCHEMES = 1 << 0;
-
- /**
- * Allow two slashes in the path component of the URL.
- */
- public static final int ALLOW_2_SLASHES = 1 << 1;
-
- /**
- * Enabling this options disallows any URL fragments.
- */
- public static final int NO_FRAGMENTS = 1 << 2;
-
- private static final String ALPHA_CHARS = "a-zA-Z";
-
- private static final String ALPHA_NUMERIC_CHARS = ALPHA_CHARS + "\\d";
-
- private static final String SPECIAL_CHARS = ";/@&=,.?:+$";
-
- private static final String VALID_CHARS = "[^\\s" + SPECIAL_CHARS + "]";
-
- private static final String SCHEME_CHARS = ALPHA_CHARS;
-
- // Drop numeric, and "+-." for now
- private static final String AUTHORITY_CHARS = ALPHA_NUMERIC_CHARS + "\\-\\.";
-
- private static final String ATOM = VALID_CHARS + '+';
-
- /**
- * This expression derived/taken from the BNF for URI (RFC2396).
- */
- private static final String URL_PATTERN = "/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/";
-
- /**
- * Schema/Protocol (ie. http:, ftp:, file:, etc).
- */
- private static final int PARSE_URL_SCHEME = 2;
-
- /**
- * Includes hostname/ip and port number.
- */
- private static final int PARSE_URL_AUTHORITY = 4;
-
- private static final int PARSE_URL_PATH = 5;
-
- private static final int PARSE_URL_QUERY = 7;
-
- private static final int PARSE_URL_FRAGMENT = 9;
-
- /**
- * Protocol (ie. http:, ftp:,https:).
- */
- private static final String SCHEME_PATTERN = "/^[" + SCHEME_CHARS + "]/";
-
- private static final String AUTHORITY_PATTERN = "/^([" + AUTHORITY_CHARS + "]*)(:\\d*)?(.*)?/";
-
- private static final int PARSE_AUTHORITY_HOST_IP = 1;
-
- private static final int PARSE_AUTHORITY_PORT = 2;
-
- /**
- * Should always be empty.
- */
- private static final int PARSE_AUTHORITY_EXTRA = 3;
-
- private static final String PATH_PATTERN = "/^(/[-\\w:@&?=+,.!/~*'%$_;]*)?$/";
-
- private static final String QUERY_PATTERN = "/^(.*)$/";
-
- private static final String LEGAL_ASCII_PATTERN = "/^[\\000-\\177]+$/";
-
- private static final String IP_V4_DOMAIN_PATTERN = "/^(\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})$/";
-
- private static final String DOMAIN_PATTERN = "/^" + ATOM + "(\\." + ATOM + ")*$/";
-
- private static final String PORT_PATTERN = "/^:(\\d{1,5})$/";
-
- private static final String ATOM_PATTERN = "/(" + ATOM + ")/";
-
- private static final String ALPHA_PATTERN = "/^[" + ALPHA_CHARS + "]/";
-
- /**
- * Holds the set of current validation options.
- */
- private Flags options = null;
-
- /**
* The set of schemes that are allowed to be in a URL.
*/
private Set<String> allowedSchemes = new HashSet<String>();
@@ -156,41 +63,10 @@
* @param schemes Pass in one or more url schemes to consider valid, passing in
* a null will default to "http,https,ftp" being valid.
* If a non-null schemes is specified then all valid schemes must
- * be specified. Setting the ALLOW_ALL_SCHEMES option will
- * ignore the contents of schemes.
+ * be specified.
*/
public ContinuumUrlValidator( String[] schemes )
{
- this( schemes, 0 );
- }
-
- /**
- * Initialize a UrlValidator with the given validation options.
- * @param options The options should be set using the public constants declared in
- * this class. To set multiple options you simply add them together. For example,
- * ALLOW_2_SLASHES + NO_FRAGMENTS enables both of those options.
- */
- public ContinuumUrlValidator( int options )
- {
- this( null, options );
- }
-
- /**
- * Behavour of validation is modified by passing in options:
- * @param schemes The set of valid schemes.
- * @param options The options should be set using the public constants declared in
- * this class. To set multiple options you simply add them together. For example,
- * ALLOW_2_SLASHES + NO_FRAGMENTS enables both of those options.
- */
- public ContinuumUrlValidator( String[] schemes, int options )
- {
- this.options = new Flags( options );
-
- if ( this.options.isOn( ALLOW_ALL_SCHEMES ) )
- {
- return;
- }
-
if ( schemes == null && this.allowedSchemes.isEmpty() )
{
schemes = this.defaultSchemes;
@@ -225,306 +101,18 @@
return true;
}
- value = StringUtils.replace( value, " ", "%20" );
-
- Perl5Util matchUrlPat = new Perl5Util();
- Perl5Util matchAsciiPat = new Perl5Util();
-
- if ( !matchAsciiPat.match( LEGAL_ASCII_PATTERN, value ) )
- {
- return false;
- }
-
- // Check the whole url address structure
- if ( !matchUrlPat.match( URL_PATTERN, value ) )
- {
- return false;
- }
-
- String scheme = matchUrlPat.group( PARSE_URL_SCHEME );
-
- if ( !isValidScheme( scheme ) )
- {
- return false;
- }
-
- if ( !"file".equals( scheme ) )
- {
- String authority = matchUrlPat.group( PARSE_URL_AUTHORITY );
-
- if ( authority != null )
- {
- if ( authority.indexOf( "@" ) != -1 )
- {
- String userPassword = authority.substring( 0, authority.indexOf( "@" ) );
-
- authority = authority.substring( authority.indexOf( "@" ) + 1 );
-
- if ( userPassword.indexOf( ":" ) == -1 || userPassword.indexOf( ":" ) == 0
- || userPassword.indexOf( ":" ) == userPassword.length() - 1 )
- {
- return false;
- }
- }
- if ( !isValidAuthority( authority ) )
- {
- return false;
- }
- }
-
-
- if ( !isValidQuery( matchUrlPat.group( PARSE_URL_QUERY ) ) )
- {
- return false;
- }
-
- if ( !isValidFragment( matchUrlPat.group( PARSE_URL_FRAGMENT ) ) )
- {
- return false;
- }
- }
-
- if ( !isValidPath( matchUrlPat.group( PARSE_URL_PATH ) ) )
- {
- return false;
- }
-
- return true;
- }
-
- /**
- * Validate scheme. If schemes[] was initialized to a non null,
- * then only those scheme's are allowed. Note this is slightly different
- * than for the constructor.
- * @param scheme The scheme to validate. A <code>null</code> value is considered
- * invalid.
- * @return true if valid.
- */
- protected boolean isValidScheme( String scheme )
- {
- if ( scheme == null )
- {
- return false;
- }
-
- Perl5Util schemeMatcher = new Perl5Util();
- if ( !schemeMatcher.match( SCHEME_PATTERN, scheme ) )
+ try
{
- return false;
- }
-
- if ( this.options.isOff( ALLOW_ALL_SCHEMES ) )
- {
-
- if ( !this.allowedSchemes.contains( scheme ) )
- {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Returns true if the authority is properly formatted. An authority is the combination
- * of hostname and port. A <code>null</code> authority value is considered invalid.
- */
- protected boolean isValidAuthority( String authority )
- {
- if ( authority == null )
- {
- return false;
- }
-
- Perl5Util authorityMatcher = new Perl5Util();
- Perl5Util matchIPV4Pat = new Perl5Util();
-
- if ( !authorityMatcher.match( AUTHORITY_PATTERN, authority ) )
- {
- return false;
- }
-
- boolean ipV4Address = false;
- boolean hostname = false;
- // check if authority is IP address or hostname
- String hostIP = authorityMatcher.group( PARSE_AUTHORITY_HOST_IP );
- ipV4Address = matchIPV4Pat.match( IP_V4_DOMAIN_PATTERN, hostIP );
-
- if ( ipV4Address )
- {
- // this is an IP address so check components
- for ( int i = 1; i <= 4; i++ )
- {
- String ipSegment = matchIPV4Pat.group( i );
- if ( ipSegment == null || ipSegment.length() <= 0 )
- {
- return false;
- }
-
- try
- {
- if ( Integer.parseInt( ipSegment ) > 255 )
- {
- return false;
- }
- }
- catch ( NumberFormatException e )
- {
- return false;
- }
-
- }
- }
- else
- {
- // Domain is hostname name
- Perl5Util domainMatcher = new Perl5Util();
- hostname = domainMatcher.match( DOMAIN_PATTERN, hostIP );
- }
-
- //rightmost hostname will never start with a digit.
- if ( hostname )
- {
- String[] domainSegment = new String[10];
- boolean match = true;
- int segmentCount = 0;
- int segmentLength = 0;
- Perl5Util atomMatcher = new Perl5Util();
-
- while ( match )
- {
- match = atomMatcher.match( ATOM_PATTERN, hostIP );
- if ( match )
- {
- domainSegment[segmentCount] = atomMatcher.group( 1 );
- segmentLength = domainSegment[segmentCount].length() + 1;
- hostIP = ( segmentLength >= hostIP.length() ) ? "" : hostIP.substring( segmentLength );
-
- segmentCount++;
- }
- }
- String topLevel = domainSegment[segmentCount - 1];
- // don't check toplevel when we have only a server name like localhost
- if ( segmentCount != 1 && (topLevel.length() < 2 ) )
- {
- return false;
- }
-
- // First letter of top level must be a alpha
- Perl5Util alphaMatcher = new Perl5Util();
- if ( !alphaMatcher.match( ALPHA_PATTERN, topLevel.substring( 0, 1 ) ) )
- {
- return false;
- }
- }
-
- if ( !hostname && !ipV4Address )
- {
- return false;
+ URI uri = new URI( value );
+ return this.allowedSchemes.contains( uri.getScheme() );
}
-
- String port = authorityMatcher.group( PARSE_AUTHORITY_PORT );
- if ( port != null )
- {
- Perl5Util portMatcher = new Perl5Util();
- if ( !portMatcher.match( PORT_PATTERN, port ) )
- {
- return false;
- }
- }
-
- String extra = authorityMatcher.group( PARSE_AUTHORITY_EXTRA );
- if ( !StringUtils.isBlank( extra ) )
+ catch ( URISyntaxException e )
{
return false;
}
-
- return true;
- }
-
- /**
- * Returns true if the path is valid. A <code>null</code> value is considered invalid.
- */
- protected boolean isValidPath( String path )
- {
- if ( path == null )
- {
- return false;
- }
-
- Perl5Util pathMatcher = new Perl5Util();
-
- if ( !pathMatcher.match( PATH_PATTERN, path ) )
- {
- return false;
- }
-
- int slash2Count = countToken( "//", path );
- if ( this.options.isOff( ALLOW_2_SLASHES ) && ( slash2Count > 0 ) )
- {
- return false;
- }
-
- int slashCount = countToken( "/", path );
- int dot2Count = countToken( "..", path );
- if ( dot2Count > 0 )
- {
- if ( ( slashCount - slash2Count - 1 ) <= dot2Count )
- {
- return false;
- }
- }
-
- return true;
}
/**
- * Returns true if the query is null or it's a properly formatted query string.
- */
- protected boolean isValidQuery( String query )
- {
- if ( query == null )
- {
- return true;
- }
-
- Perl5Util queryMatcher = new Perl5Util();
- return queryMatcher.match( QUERY_PATTERN, query );
- }
-
- /**
- * Returns true if the given fragment is null or fragments are allowed.
- */
- protected boolean isValidFragment( String fragment )
- {
- if ( fragment == null )
- {
- return true;
- }
-
- return this.options.isOff( NO_FRAGMENTS );
- }
-
- /**
- * Returns the number of times the token appears in the target.
- */
- protected int countToken( String token, String target )
- {
- int tokenIndex = 0;
- int count = 0;
- while ( tokenIndex != -1 )
- {
- tokenIndex = target.indexOf( token, tokenIndex );
- if ( tokenIndex > -1 )
- {
- tokenIndex++;
- count++;
- }
- }
- return count;
- }
-
- /**
* @param url
* @return URLUserInfo cannot be null
* @throws URISyntaxException
@@ -552,7 +140,7 @@
}
return urlUserInfo;
}
-
+
public void configure( PlexusConfiguration plexusConfiguration )
throws PlexusConfigurationException
{
Modified: continuum/trunk/continuum-commons/src/test/java/org/apache/maven/continuum/utils/ContinuumUrlValidatorTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-commons/src/test/java/org/apache/maven/continuum/utils/ContinuumUrlValidatorTest.java?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/continuum-commons/src/test/java/org/apache/maven/continuum/utils/ContinuumUrlValidatorTest.java (original)
+++ continuum/trunk/continuum-commons/src/test/java/org/apache/maven/continuum/utils/ContinuumUrlValidatorTest.java Tue Aug 26 15:29:10 2008
@@ -65,7 +65,7 @@
public void testFailureHttpWithAuth()
throws Exception
{
- assertFalse( getContinuumUrlValidator()
+ assertTrue( getContinuumUrlValidator()
.validate( "http://username:passwordsvn.apache.org/repos/asf/continuum/trunk/pom.xml" ) );
}
Modified: continuum/trunk/continuum-core/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/pom.xml?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/continuum-core/pom.xml (original)
+++ continuum/trunk/continuum-core/pom.xml Tue Aug 26 15:29:10 2008
@@ -111,10 +111,6 @@
<artifactId>plexus-jdo2</artifactId>
</dependency>
<dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-formica</artifactId>
- </dependency>
- <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
Modified: continuum/trunk/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/pom.xml?rev=689267&r1=689266&r2=689267&view=diff
==============================================================================
--- continuum/trunk/pom.xml (original)
+++ continuum/trunk/pom.xml Tue Aug 26 15:29:10 2008
@@ -692,21 +692,6 @@
</exclusions>
</dependency>
<dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-formica</artifactId>
- <version>1.0-beta-13</version>
- <exclusions>
- <exclusion>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-container-default</artifactId>
- </exclusion>
- <exclusion>
- <groupId>ognl</groupId>
- <artifactId>ognl</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0-alpha4</version>