Some of the pom rewriting tricks I use in v-m-p might help... but ultimately I think the solution lies with something like xevpp.codehaus.org (if I ever get time to finish that :rolleyes: :-) )
On 1 February 2012 21:33, Robert Scholte <[email protected]> wrote: > 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] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
