Hi
while trying to resolve some MRELEASE issues until I hit the
org.apache.maven.shared.release.phase.AbstractRewritePomsPhase.transformProject(MavenProject,
ReleaseDescriptor, ReleaseEnvironment, List<MavenProject>, boolean,
ReleaseResult), see below.
It kind of scared me. Shouldn't there be a better solution by now, a
better
XML-parser/transformer to solve this? Anyone any suggestion?
Does anyone know if this part of the code is covered enough in order to
give
it a try to replace it?
I'm pretty sure that a solid implementation could solve several issues.
-Robert
private void transformProject( MavenProject project, ReleaseDescriptor
releaseDescriptor,
ReleaseEnvironment releaseEnvironment,
List<MavenProject> reactorProjects,
boolean simulate, ReleaseResult
result )
throws ReleaseExecutionException, ReleaseFailureException
{
Document document;
String intro = null;
String outtro = null;
try
{
String content = ReleaseUtil.readXmlFile(
ReleaseUtil.getStandardPom( project ), ls );
// we need to eliminate any extra whitespace inside
elements, as
JDOM will nuke it
content = content.replaceAll(
"<([^!][^>]*?)\\s{2,}([^>]*?)>",
"<$1 $2>" );
content = content.replaceAll( "(\\s{2,}|[^\\s])/>", "$1 />"
);
SAXBuilder builder = new SAXBuilder();
document = builder.build( new StringReader( content ) );
// Normalize line endings to platform's style (XML processors
like JDOM normalize line endings to "\n" as
// per section 2.11 of the XML spec)
normaliseLineEndings( document );
// rewrite DOM as a string to find differences, since text
outside the root element is not tracked
StringWriter w = new StringWriter();
Format format = Format.getRawFormat();
format.setLineSeparator( ls );
XMLOutputter out = new XMLOutputter( format );
out.output( document.getRootElement(), w );
int index = content.indexOf( w.toString() );
if ( index >= 0 )
{
intro = content.substring( 0, index );
outtro = content.substring( index +
w.toString().length() );
}
else
{
/*
* NOTE: Due to whitespace, attribute reordering or
entity
expansion the above indexOf test can easily
* fail. So let's try harder. Maybe some day, when JDOM
offers a StaxBuilder and this builder employes
* XMLInputFactory2.P_REPORT_PROLOG_WHITESPACE, this
whole
mess can be avoided.
*/
final String SPACE = "\\s++";
final String XML =
"<\\?(?:(?:[^\"'>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+>";
final String INTSUB =
"\\[(?:(?:[^\"'\\]]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+\\]";
final String DOCTYPE =
"<!DOCTYPE(?:(?:[^\"'\\[>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+')|(?:" +
INTSUB +
"))*+>";
final String PI = XML;
final String COMMENT = "<!--(?:[^-]|(?:-[^-]))*+-->";
final String INTRO =
"(?:(?:" + SPACE + ")|(?:" + XML + ")|(?:" + DOCTYPE
+
")|(?:" + COMMENT + ")|(?:" + PI + "))*";
final String OUTRO = "(?:(?:" + SPACE + ")|(?:" +
COMMENT +
")|(?:" + PI + "))*";
final String POM = "(?s)(" + INTRO + ")(.*?)(" + OUTRO +
")";
Matcher matcher = Pattern.compile( POM ).matcher(
content );
if ( matcher.matches() )
{
intro = matcher.group( 1 );
outtro = matcher.group( matcher.groupCount() );
}
}
}
catch ( JDOMException e )
{
throw new ReleaseExecutionException( "Error reading POM: " +
e.getMessage(), e );
}
catch ( IOException e )
{
throw new ReleaseExecutionException( "Error reading POM: " +
e.getMessage(), e );
}
ScmRepository scmRepository;
ScmProvider provider;
try
{
scmRepository =
scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
releaseEnvironment.getSettings() );
provider = scmRepositoryConfigurator.getRepositoryProvider(
scmRepository );
}
catch ( ScmRepositoryException e )
{
throw new ReleaseScmRepositoryException( e.getMessage(),
e.getValidationMessages() );
}
catch ( NoSuchScmProviderException e )
{
throw new ReleaseExecutionException( "Unable to configure SCM
repository: " + e.getMessage(), e );
}
transformDocument( project, document.getRootElement(),
releaseDescriptor, reactorProjects, scmRepository,
result, simulate );
File pomFile = ReleaseUtil.getStandardPom( project );
if ( simulate )
{
File outputFile = new File( pomFile.getParentFile(),
pomFile.getName() + "." + pomSuffix );
writePom( outputFile, document, releaseDescriptor,
project.getModelVersion(), intro, outtro );
}
else
{
writePom( pomFile, document, releaseDescriptor,
project.getModelVersion(), intro, outtro, scmRepository,
provider );
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]