package org.codehaus.mojo.pomtools; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.maven.model.Model; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.logging.SystemStreamLog; import org.codehaus.mojo.pomtools.config.FieldConfiguration; import org.codehaus.mojo.pomtools.config.PomToolsConfig; import org.codehaus.mojo.pomtools.wrapper.ListWrapper; import org.codehaus.mojo.pomtools.wrapper.ObjectWrapper; import org.codehaus.mojo.pomtools.wrapper.custom.ProjectWrapper; import org.codehaus.mojo.pomtools.wrapper.reflection.BeanField; import org.codehaus.mojo.pomtools.wrapper.reflection.BeanFields; import org.codehaus.mojo.pomtools.wrapper.reflection.BooleanField; import org.codehaus.mojo.pomtools.wrapper.reflection.ListField; import org.codehaus.mojo.pomtools.wrapper.reflection.StringField; import org.codehaus.plexus.util.StringUtils; /** Dummy utility class which attempts to create a fully populated pom file * for use in testing the editor. * * @author <a href="mailto:dhawkins@codehaus.org">David Hawkins</a> * @version $Id$ */ public class PomGenerator { private static final String PATTERN_PROPERTY_NAME = "pattern."; private Map namePatterns = new HashMap(); private File baseDir; public PomGenerator() { super(); } public File getBaseDir() { if ( baseDir == null ) { baseDir = new File( "" ); } return baseDir; } protected void initializeContext() throws MojoExecutionException { Log log = new SystemStreamLog(); PomToolsConfig config = new PomToolsConfig(); FieldConfiguration fieldConfig = new FieldConfiguration(); fieldConfig.setFieldNamePattern( "^.*\\.distributionManagement\\.status$" ); fieldConfig.setIgnore( true ); config.addFieldConfiguration( fieldConfig ); fieldConfig = new FieldConfiguration(); fieldConfig.setFieldNamePattern( "^.*\\.modules$" ); fieldConfig.setIgnore( true ); config.addFieldConfiguration( fieldConfig ); PomToolsPluginContext modelContext = new PomToolsPluginContext( null, null, null, config, true, log ); PomToolsPluginContext.setInstance( modelContext ); } public void createTestPom() throws IOException, MojoExecutionException { initializeContext(); Model model = new Model(); ObjectWrapper obj = new ObjectWrapper( null, null, model, "project", Model.class ); Properties props = new Properties(); props.load( PomGenerator.class.getClassLoader().getResourceAsStream( "pom-creation.properties" ) ); for ( Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { String propName = (String) iter.next(); if ( propName.startsWith( PATTERN_PROPERTY_NAME ) ) { String patternStr = propName.substring( PATTERN_PROPERTY_NAME.length() ); Pattern p = Pattern.compile( StringUtils.replace( patternStr, "\\\\", "\\" ) ); this.namePatterns.put( p, props.getProperty( propName ) ); } } populateObject( obj, props ); Model resultModel = (Model) obj.getWrappedObject(); String tempDir = System.getProperty( "java.io.tmpdir" ); writeModel( new File( tempDir, "generated-testpom/pom.xml" ), resultModel ); writeModel( new File( tempDir, "generated-testpom/pom-copy.xml" ), resultModel ); } protected void writeModel( File pomFile, Model model ) throws IOException { pomFile.getParentFile().mkdirs(); ProjectWrapper.writeModel( pomFile, model ); System.out.println( "Wrote pom to: " + pomFile.getAbsolutePath() ); } public Object generateValue( BeanField field, ObjectWrapper obj, Properties props ) { String fieldName = field.getFullFieldName( obj ); // First see if we configured a value for this field Object value = getConfiguredValue( fieldName, props ); if ( value != null ) { return value; } // Next see if the value has a default; value = obj.getFieldValue( field ); if ( value != null ) { return value; } // Next, generate a new value if ( field instanceof BooleanField ) { return "true"; } else if ( field instanceof StringField ) { if ( field.getPossibleValues() != null && !field.getPossibleValues().isEmpty() ) { return (String) field.getPossibleValues().get( 0 ); } else { return "stringValue-" + fieldName; } } else { throw new IllegalArgumentException( "Unknown field type to generate value for: " + field.getClass().getName() ); } } protected String getConfiguredValue( String fieldName, Properties props ) { String value = props.getProperty( fieldName ); if ( value == null ) { for ( Iterator iter = namePatterns.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry) iter.next(); Matcher m = ( (Pattern) entry.getKey() ).matcher( fieldName ); if ( m.find() ) { value = (String) entry.getValue(); break; } } } return value; } protected void populateObject( ObjectWrapper obj, Properties props ) { BeanFields fields = obj.getFields(); for ( Iterator iter = fields.iterator(); iter.hasNext(); ) { BeanField field = (BeanField) iter.next(); if ( field.isWrappedValue() ) { if ( field instanceof ListField ) { ListWrapper list = (ListWrapper) obj.getFieldValue( field ); populateObject( (ObjectWrapper) list.createItem( null ), props ); } else { populateObject( (ObjectWrapper) obj.getFieldValue( field ), props ); } } else { obj.setFieldValue( field, generateValue( field, obj, props ) ); } } } public static void main( String[] args ) throws MojoExecutionException, IOException { PomGenerator generator = new PomGenerator(); generator.createTestPom(); System.out.println( "Test poms created" ); } }