Author: bentmann
Date: Thu Mar 25 15:03:50 2010
New Revision: 927436
URL: http://svn.apache.org/viewvc?rev=927436&view=rev
Log:
o Cleaned up validation
Modified:
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
maven/maven-3/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
Modified:
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java?rev=927436&r1=927435&r2=927436&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
(original)
+++
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
Thu Mar 25 15:03:50 2010
@@ -83,11 +83,11 @@ public class DefaultModelValidator
validateStringNoExpression( "artifactId", problems,
Severity.WARNING, model.getArtifactId() );
validateStringNoExpression( "version", problems, Severity.WARNING,
model.getVersion() );
- validateDependencies( problems, model.getDependencies(),
"dependencies.dependency", request );
+ validateRawDependencies( problems, model.getDependencies(),
"dependencies.dependency", request );
if ( model.getDependencyManagement() != null )
{
- validateDependencies( problems,
model.getDependencyManagement().getDependencies(),
+ validateRawDependencies( problems,
model.getDependencyManagement().getDependencies(),
"dependencyManagement.dependencies.dependency", request );
}
@@ -101,16 +101,16 @@ public class DefaultModelValidator
{
if ( !profileIds.add( profile.getId() ) )
{
- addViolation( problems, errOn30, "profiles.profile.id must
be unique"
- + " but found duplicate profile with id " +
profile.getId() );
+ addViolation( problems, errOn30, "profiles.profile.id",
null,
+ "must be unique but found duplicate profile
with id " + profile.getId() );
}
- validateDependencies( problems, profile.getDependencies(),
"profiles.profile[" + profile.getId()
+ validateRawDependencies( problems, profile.getDependencies(),
"profiles.profile[" + profile.getId()
+ "].dependencies.dependency", request );
if ( profile.getDependencyManagement() != null )
{
- validateDependencies( problems,
profile.getDependencyManagement().getDependencies(),
+ validateRawDependencies( problems,
profile.getDependencyManagement().getDependencies(),
"profiles.profile[" + profile.getId()
+
"].dependencyManagement.dependencies.dependency", request );
}
@@ -138,7 +138,7 @@ public class DefaultModelValidator
{
if ( !"pom".equals( model.getPackaging() ) )
{
- addViolation( problems, Severity.ERROR, "Packaging '" +
model.getPackaging()
+ addViolation( problems, Severity.ERROR, "packaging", null,
"with value '" + model.getPackaging()
+ "' is invalid. Aggregator projects " + "require 'pom' as
packaging." );
}
@@ -146,8 +146,8 @@ public class DefaultModelValidator
{
if ( StringUtils.isBlank( module ) )
{
- addViolation( problems, Severity.WARNING,
- "Child module has been specified without
path to its project directory." );
+ addViolation( problems, Severity.WARNING,
"modules.module", null,
+ "has been specified without a path to the
project directory." );
}
}
}
@@ -156,100 +156,12 @@ public class DefaultModelValidator
Severity errOn30 = getSeverity( request,
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
- for ( Dependency d : model.getDependencies() )
- {
- validateId( "dependencies.dependency.artifactId", problems,
d.getArtifactId(), d.getManagementKey() );
-
- validateId( "dependencies.dependency.groupId", problems,
d.getGroupId(), d.getManagementKey() );
-
- validateStringNotEmpty( "dependencies.dependency.type", problems,
Severity.ERROR, d.getType(),
- d.getManagementKey() );
-
- validateStringNotEmpty( "dependencies.dependency.version",
problems, Severity.ERROR, d.getVersion(),
- d.getManagementKey() );
-
- if ( "system".equals( d.getScope() ) )
- {
- String systemPath = d.getSystemPath();
-
- if ( StringUtils.isEmpty( systemPath ) )
- {
- addViolation( problems, Severity.ERROR, "For dependency "
+ d.getManagementKey()
- + ": system-scoped dependency must specify
systemPath." );
- }
- else
- {
- if ( !new File( systemPath ).isAbsolute() )
- {
- addViolation( problems, Severity.ERROR, "For
dependency " + d.getManagementKey()
- + ": system-scoped dependency must specify an
absolute systemPath but is " + systemPath );
- }
- }
- }
- else if ( StringUtils.isNotEmpty( d.getSystemPath() ) )
- {
- addViolation( problems, Severity.ERROR, "For dependency " +
d.getManagementKey()
- + ": only dependency with system scope can specify
systemPath." );
- }
-
- if ( request.getValidationLevel() >=
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 )
- {
- validateVersion( "dependencies.dependency.version", problems,
errOn30, d.getVersion(),
- d.getManagementKey() );
-
- validateBoolean( "dependencies.dependency.optional", problems,
errOn30, d.getOptional(),
- d.getManagementKey() );
-
- /*
- * TODO: Extensions like Flex Mojos use custom scopes like
"merged", "internal", "external", etc. In
- * order to don't break backward-compat with those, only warn
but don't error out.
- */
- validateEnum( "dependencies.dependency.scope", problems,
Severity.WARNING, d.getScope(),
- d.getManagementKey(), "provided", "compile",
"runtime", "test", "system" );
- }
- }
+ validateEffectiveDependencies( problems, model.getDependencies(),
false, request );
DependencyManagement mgmt = model.getDependencyManagement();
if ( mgmt != null )
{
- for ( Dependency d : mgmt.getDependencies() )
- {
- validateStringNotEmpty(
"dependencyManagement.dependencies.dependency.artifactId", problems,
- Severity.ERROR, d.getArtifactId(),
d.getManagementKey() );
-
- validateStringNotEmpty(
"dependencyManagement.dependencies.dependency.groupId", problems,
- Severity.ERROR, d.getGroupId(),
d.getManagementKey() );
-
- if ( "system".equals( d.getScope() ) )
- {
- String systemPath = d.getSystemPath();
-
- if ( StringUtils.isEmpty( systemPath ) )
- {
- addViolation( problems, Severity.ERROR, "For managed
dependency " + d.getManagementKey()
- + ": system-scoped dependency must specify
systemPath." );
- }
- else
- {
- if ( !new File( systemPath ).isAbsolute() )
- {
- addViolation( problems, Severity.ERROR, "For
managed dependency " + d.getManagementKey()
- + ": system-scoped dependency must specify an
absolute systemPath but is " + systemPath );
- }
- }
- }
- else if ( StringUtils.isNotEmpty( d.getSystemPath() ) )
- {
- addViolation( problems, Severity.ERROR, "For managed
dependency " + d.getManagementKey()
- + ": only dependency with system scope can specify
systemPath." );
- }
-
- if ( request.getValidationLevel() >=
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 )
- {
- validateBoolean(
"dependencyManagement.dependencies.dependency.optional", problems, errOn30,
- d.getOptional(), d.getManagementKey() );
- }
- }
+ validateEffectiveDependencies( problems, mgmt.getDependencies(),
true, request );
}
if ( request.getValidationLevel() >=
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 )
@@ -259,7 +171,8 @@ public class DefaultModelValidator
{
if ( !modules.add( module ) )
{
- addViolation( problems, Severity.ERROR, "Duplicate child
module: " + module );
+ addViolation( problems, Severity.ERROR, "modules.module",
null, "specifies duplicate child module "
+ + module );
}
}
@@ -330,7 +243,8 @@ public class DefaultModelValidator
{
if ( distMgmt.getStatus() != null )
{
- addViolation( problems, Severity.ERROR,
"'distributionManagement.status' must not be specified" );
+ addViolation( problems, Severity.ERROR,
"distributionManagement.status", null,
+ "must not be specified." );
}
validateRepositoryLayout( problems, distMgmt.getRepository(),
"distributionManagement.repository",
@@ -341,31 +255,7 @@ public class DefaultModelValidator
}
}
- private boolean validateId( String fieldName, ModelProblemCollector
problems, String id )
- {
- return validateId( fieldName, problems, id, null );
- }
-
- private boolean validateId( String fieldName, ModelProblemCollector
problems, String id, String sourceHint )
- {
- if ( !validateStringNotEmpty( fieldName, problems, Severity.ERROR, id,
sourceHint ) )
- {
- return false;
- }
- else
- {
- boolean match = id.matches( ID_REGEX );
- if ( !match )
- {
- addViolation( problems, Severity.ERROR, "'" + fieldName + "'"
- + ( sourceHint != null ? " for " + sourceHint : "" ) + "
with value '" + id
- + "' does not match a valid id pattern." );
- }
- return match;
- }
- }
-
- private void validateDependencies( ModelProblemCollector problems,
List<Dependency> dependencies, String prefix,
+ private void validateRawDependencies( ModelProblemCollector problems,
List<Dependency> dependencies, String prefix,
ModelBuildingRequest request )
{
Severity errOn30 = getSeverity( request,
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
@@ -379,15 +269,16 @@ public class DefaultModelValidator
if ( "pom".equals( dependency.getType() ) && "import".equals(
dependency.getScope() )
&& StringUtils.isNotEmpty( dependency.getClassifier() ) )
{
- addViolation( problems, errOn30, "'" + prefix + ".classifier'
must be empty for imported POM: " + key );
+ addViolation( problems, errOn30, prefix + ".classifier", key,
+ "must be empty, imported POM cannot have a
classifier." );
}
else if ( "system".equals( dependency.getScope() ) )
{
String sysPath = dependency.getSystemPath();
if ( StringUtils.isNotEmpty( sysPath ) && !hasExpression(
sysPath ) )
{
- addViolation( problems, Severity.WARNING, "'" + prefix
- + ".systemPath' should use a variable instead of a
hard-coded path: " + key + " -> " + sysPath );
+ addViolation( problems, Severity.WARNING, prefix +
".systemPath", key,
+ "should use a variable instead of a
hard-coded path " + sysPath );
}
}
@@ -409,8 +300,8 @@ public class DefaultModelValidator
+ StringUtils.defaultString(
dependency.getVersion(), "(?)" );
}
- addViolation( problems, errOn30, "'" + prefix
- + ".(groupId:artifactId:type:classifier)' must be unique:
" + key + " -> " + msg );
+ addViolation( problems, errOn30, prefix +
".(groupId:artifactId:type:classifier)", null,
+ "must be unique: " + key + " -> " + msg );
}
else
{
@@ -419,6 +310,82 @@ public class DefaultModelValidator
}
}
+ private void validateEffectiveDependencies( ModelProblemCollector
problems, List<Dependency> dependencies,
+ boolean managed,
ModelBuildingRequest request )
+ {
+ Severity errOn30 = getSeverity( request,
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
+
+ String prefix = managed ?
"dependencyManagement.dependencies.dependency." : "dependencies.dependency.";
+
+ for ( Dependency d : dependencies )
+ {
+ validateId( prefix + "artifactId", problems, d.getArtifactId(),
d.getManagementKey() );
+
+ validateId( prefix + "groupId", problems, d.getGroupId(),
d.getManagementKey() );
+
+ if ( !managed )
+ {
+ validateStringNotEmpty( prefix + "type", problems,
Severity.ERROR, d.getType(), d.getManagementKey() );
+
+ validateStringNotEmpty( prefix + "version", problems,
Severity.ERROR, d.getVersion(),
+ d.getManagementKey() );
+ }
+
+ if ( "system".equals( d.getScope() ) )
+ {
+ String systemPath = d.getSystemPath();
+
+ if ( StringUtils.isEmpty( systemPath ) )
+ {
+ addViolation( problems, Severity.ERROR, prefix +
"systemPath", d.getManagementKey(), "is missing." );
+ }
+ else
+ {
+ File sysFile = new File( systemPath );
+ if ( !sysFile.isAbsolute() )
+ {
+ addViolation( problems, Severity.ERROR, prefix +
"systemPath", d.getManagementKey(),
+ "must specify an absolute path but is "
+ systemPath );
+ }
+ else if ( !sysFile.isFile() )
+ {
+ String msg = "refers to a non-existing file " +
sysFile.getAbsolutePath();
+ systemPath = systemPath.replace( '/',
File.separatorChar ).replace( '\\', File.separatorChar );
+ String jdkHome =
+ request.getSystemProperties().getProperty(
"java.home", "" ) + File.separator + "..";
+ if ( systemPath.startsWith( jdkHome ) )
+ {
+ msg += ". Please verify that you run Maven using a
JDK and not just a JRE.";
+ }
+ addViolation( problems, Severity.ERROR, prefix +
"systemPath", d.getManagementKey(), msg );
+ }
+ }
+ }
+ else if ( StringUtils.isNotEmpty( d.getSystemPath() ) )
+ {
+ addViolation( problems, Severity.ERROR, prefix + "systemPath",
d.getManagementKey(), "must be omitted."
+ + " This field may only be specified for a dependency with
system scope." );
+ }
+
+ if ( request.getValidationLevel() >=
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 )
+ {
+ validateBoolean( prefix + "optional", problems, errOn30,
d.getOptional(), d.getManagementKey() );
+
+ if ( !managed )
+ {
+ validateVersion( prefix + "version", problems, errOn30,
d.getVersion(), d.getManagementKey() );
+
+ /*
+ * TODO: Extensions like Flex Mojos use custom scopes like
"merged", "internal", "external", etc. In
+ * order to don't break backward-compat with those, only
warn but don't error out.
+ */
+ validateEnum( prefix + "scope", problems,
Severity.WARNING, d.getScope(), d.getManagementKey(),
+ "provided", "compile", "runtime", "test",
"system" );
+ }
+ }
+ }
+ }
+
private void validateRepositories( ModelProblemCollector problems,
List<Repository> repositories, String prefix,
ModelBuildingRequest request )
{
@@ -439,7 +406,7 @@ public class DefaultModelValidator
{
Severity errOn30 = getSeverity( request,
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
- addViolation( problems, errOn30, "'" + prefix + ".id' must be
unique: " + repository.getId() + " -> "
+ addViolation( problems, errOn30, prefix + ".id", null, "must
be unique: " + repository.getId() + " -> "
+ existing.getUrl() + " vs " + repository.getUrl() );
}
else
@@ -454,8 +421,8 @@ public class DefaultModelValidator
{
if ( repository != null && "legacy".equals( repository.getLayout() ) )
{
- addViolation( problems, Severity.WARNING, "'" + prefix + ".layout
= legacy' is deprecated: "
- + repository.getId() );
+ addViolation( problems, Severity.WARNING, prefix + ".layout",
repository.getId(),
+ "uses the deprecated value 'legacy'." );
}
}
@@ -502,6 +469,29 @@ public class DefaultModelValidator
// Field validation
// ----------------------------------------------------------------------
+ private boolean validateId( String fieldName, ModelProblemCollector
problems, String id )
+ {
+ return validateId( fieldName, problems, id, null );
+ }
+
+ private boolean validateId( String fieldName, ModelProblemCollector
problems, String id, String sourceHint )
+ {
+ if ( !validateStringNotEmpty( fieldName, problems, Severity.ERROR, id,
sourceHint ) )
+ {
+ return false;
+ }
+ else
+ {
+ boolean match = id.matches( ID_REGEX );
+ if ( !match )
+ {
+ addViolation( problems, Severity.ERROR, fieldName, sourceHint,
"with value '" + id
+ + "' does not match a valid id pattern." );
+ }
+ return match;
+ }
+ }
+
private boolean validateStringNoExpression( String fieldName,
ModelProblemCollector problems, Severity severity,
String string )
{
@@ -510,7 +500,7 @@ public class DefaultModelValidator
return true;
}
- addViolation( problems, severity, "'" + fieldName + "' contains an
expression but should be a constant." );
+ addViolation( problems, severity, fieldName, null, "contains an
expression but should be a constant." );
return false;
}
@@ -547,14 +537,7 @@ public class DefaultModelValidator
return true;
}
- if ( sourceHint != null )
- {
- addViolation( problems, severity, "'" + fieldName + "' is missing
for " + sourceHint );
- }
- else
- {
- addViolation( problems, severity, "'" + fieldName + "' is
missing." );
- }
+ addViolation( problems, severity, fieldName, sourceHint, "is missing."
);
return false;
}
@@ -574,14 +557,7 @@ public class DefaultModelValidator
return true;
}
- if ( sourceHint != null )
- {
- addViolation( problems, severity, "'" + fieldName + "' is missing
for " + sourceHint );
- }
- else
- {
- addViolation( problems, severity, "'" + fieldName + "' is
missing." );
- }
+ addViolation( problems, severity, fieldName, sourceHint, "is missing."
);
return false;
}
@@ -599,15 +575,7 @@ public class DefaultModelValidator
return true;
}
- if ( sourceHint != null )
- {
- addViolation( problems, severity, "'" + fieldName + "' must be
'true' or 'false' for " + sourceHint
- + " but is '" + string + "'." );
- }
- else
- {
- addViolation( problems, severity, "'" + fieldName + "' must be
'true' or 'false' but is '" + string + "'." );
- }
+ addViolation( problems, severity, fieldName, sourceHint, "must be
'true' or 'false' but is '" + string + "'." );
return false;
}
@@ -627,16 +595,8 @@ public class DefaultModelValidator
return true;
}
- if ( sourceHint != null )
- {
- addViolation( problems, severity, "'" + fieldName + "' must be one
of " + values + " for " + sourceHint
- + " but is '" + string + "'." );
- }
- else
- {
- addViolation( problems, severity, "'" + fieldName + "' must be one
of " + values + " but is '" + string
- + "'." );
- }
+ addViolation( problems, severity, fieldName, sourceHint, "must be one
of " + values + " but is '" + string
+ + "'." );
return false;
}
@@ -654,15 +614,7 @@ public class DefaultModelValidator
return true;
}
- if ( sourceHint != null )
- {
- addViolation( problems, severity, "'" + fieldName + "' must be a
valid version for " + sourceHint
- + " but is '" + string + "'." );
- }
- else
- {
- addViolation( problems, severity, "'" + fieldName + "' must be a
valid version but is '" + string + "'." );
- }
+ addViolation( problems, severity, fieldName, sourceHint, "must be a
valid version but is '" + string + "'." );
return false;
}
@@ -684,17 +636,25 @@ public class DefaultModelValidator
return true;
}
+ addViolation( problems, errOn30, fieldName, sourceHint, "must be a
valid version but is '" + string + "'." );
+
+ return false;
+ }
+
+ private static void addViolation( ModelProblemCollector problems, Severity
severity, String fieldName,
+ String sourceHint, String message )
+ {
+ StringBuilder buffer = new StringBuilder( 256 );
+ buffer.append( '\'' ).append( fieldName ).append( '\'' );
+
if ( sourceHint != null )
{
- addViolation( problems, errOn30, "'" + fieldName + "' must be a
valid version for " + sourceHint
- + " but is '" + string + "'." );
- }
- else
- {
- addViolation( problems, errOn30, "'" + fieldName + "' must be a
valid version but is '" + string + "'." );
+ buffer.append( " for " ).append( sourceHint );
}
- return false;
+ buffer.append(' ').append( message );
+
+ addViolation( problems, severity, buffer.toString() );
}
private static void addViolation( ModelProblemCollector problems, Severity
severity, String message )
Modified:
maven/maven-3/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java?rev=927436&r1=927435&r2=927436&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
(original)
+++
maven/maven-3/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
Thu Mar 25 15:03:50 2010
@@ -199,7 +199,8 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
- assertTrue( result.getErrors().get( 0 ).indexOf(
"'dependencies.dependency.artifactId' is missing" ) > -1 );
+ assertTrue( result.getErrors().get( 0 ).indexOf(
+
"'dependencies.dependency.artifactId' for groupId:null:jar is missing" ) > -1 );
}
public void testMissingDependencyGroupId()
@@ -209,7 +210,8 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
- assertTrue( result.getErrors().get( 0 ).indexOf(
"'dependencies.dependency.groupId' is missing" ) > -1 );
+ assertTrue( result.getErrors().get( 0 ).indexOf(
+
"'dependencies.dependency.groupId' for null:artifactId:jar is missing" ) > -1 );
}
public void testMissingDependencyVersion()
@@ -219,7 +221,8 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
- assertTrue( result.getErrors().get( 0 ).indexOf(
"'dependencies.dependency.version' is missing" ) > -1 );
+ assertTrue( result.getErrors().get( 0 ).indexOf(
+
"'dependencies.dependency.version' for groupId:artifactId:jar is missing" ) >
-1 );
}
public void testMissingDependencyManagementArtifactId()
@@ -230,7 +233,7 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
assertTrue( result.getErrors().get( 0 ).indexOf(
-
"'dependencyManagement.dependencies.dependency.artifactId' is missing" ) > -1 );
+
"'dependencyManagement.dependencies.dependency.artifactId' for groupId:null:jar
is missing" ) > -1 );
}
public void testMissingDependencyManagementGroupId()
@@ -241,7 +244,7 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
assertTrue( result.getErrors().get( 0 ).indexOf(
-
"'dependencyManagement.dependencies.dependency.groupId' is missing" ) > -1 );
+
"'dependencyManagement.dependencies.dependency.groupId' for null:artifactId:jar
is missing" ) > -1 );
}
public void testMissingAll()
@@ -278,7 +281,7 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
- assertEquals( "'build.plugins.plugin.version' is missing for
org.apache.maven.plugins:maven-it-plugin",
+ assertEquals( "'build.plugins.plugin.version' for
org.apache.maven.plugins:maven-it-plugin is missing.",
result.getErrors().get( 0 ) );
result = validateEffective( "missing-plugin-version-pom.xml",
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
@@ -293,8 +296,8 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 1, 0 );
- assertEquals( "'build.plugins.plugin.version' must be a valid version "
- + "for org.apache.maven.plugins:maven-it-plugin but is ''.",
result.getErrors().get( 0 ) );
+ assertEquals( "'build.plugins.plugin.version' for
org.apache.maven.plugins:maven-it-plugin"
+ + " must be a valid version but is ''.", result.getErrors().get( 0
) );
}
public void testMissingRepositoryId()
@@ -433,7 +436,7 @@ public class DefaultModelValidatorTest
assertViolations( result, 0, 0, 1 );
- assertTrue( result.getWarnings().get( 0 ).contains( "Child module has
been specified without path" ) );
+ assertTrue( result.getWarnings().get( 0 ).contains( "'modules.module'
has been specified without a path" ) );
}
}