// Map<String,List<EclipseSourceDir>>
Map byOutputDir = new HashMap();
for ( int j = 0; j < config.getSourceDirs().length; j++ )
{
EclipseSourceDir dir = config.getSourceDirs()[j];
// List<EclipseSourceDir>
List byOutputDirs = (List) byOutputDir.get( dir.getOutput() );
if ( byOutputDirs == null )
{
// ArrayList<EclipseSourceDir>
byOutputDir.put( dir.getOutput() == null ? defaultOutput : dir.getOutput(), byOutputDirs =
new ArrayList() );
}
byOutputDirs.add( dir );
}
for ( int j = 0; j < config.getSourceDirs().length; j++ )
{
EclipseSourceDir dir = config.getSourceDirs()[j];
log.debug( "Processing classpath for: " + dir.toString() + "; default output=" + defaultOutput );
boolean isSpecial = false;
// handle resource with nested output folders
if ( dir.isResource() )
{
// Check if the output is a subdirectory of the default output,
// and if the default output has any sources that copy there.
if ( dir.getOutput() != null // resource output dir is set
&& !dir.getOutput().equals( defaultOutput ) // output dir is not default target/classes
&& dir.getOutput().startsWith( defaultOutput ) // ... but is nested
&& byOutputDir.get( defaultOutput ) != null // ???
&& !( (List) byOutputDir.get( defaultOutput ) ).isEmpty() // ???
)
{
// do not specify as source since the output will be nested. Instead, mark
// it as a todo, and handle it with a custom build.xml file later.
log.debug( "Marking as special to prevent output folder nesting: " + dir.getPath() + " (output="
+ dir.getOutput() + ")" );
isSpecial = true;
specialSources.add( dir );
}
}
writer.startElement( ELT_CLASSPATHENTRY );
writer.addAttribute( ATTR_KIND, "src" ); //$NON-NLS-1$
writer.addAttribute( ATTR_PATH, dir.getPath() );
if ( !isSpecial && dir.getOutput() != null && !defaultOutput.equals( dir.getOutput() ) )
{
writer.addAttribute( ATTR_OUTPUT, dir.getOutput() );
}
String includes = dir.getIncludeAsString();
if ( StringUtils.isNotEmpty( includes ) )
{
writer.addAttribute( ATTR_INCLUDING, includes );
}
String excludes = dir.getExcludeAsString();
if ( StringUtils.isNotEmpty( excludes ) )
{
writer.addAttribute( ATTR_EXCLUDING, excludes );
}
writer.endElement();
}
// handle the special sources.
if ( !specialSources.isEmpty() )
{
log.info( "Creating maven-eclipse.xml Ant file to handle resources" );
try
{
Writer buildXmlWriter =
new OutputStreamWriter( new FileOutputStream( new File( config.getEclipseProjectDirectory(),
"maven-eclipse.xml" ) ), "UTF-8" );
PrettyPrintXMLWriter buildXmlPrinter = new PrettyPrintXMLWriter( buildXmlWriter );
buildXmlPrinter.startElement( "project" );
buildXmlPrinter.addAttribute( "default", "copy-resources" );
buildXmlPrinter.startElement( "target" );
buildXmlPrinter.addAttribute( NAME, "init" );
// initialize filtering tokens here
buildXmlPrinter.endElement();
buildXmlPrinter.startElement( "target" );
buildXmlPrinter.addAttribute( NAME, "copy-resources" );
buildXmlPrinter.addAttribute( "depends", "init" );
for ( Iterator it = specialSources.iterator(); it.hasNext(); )
{
// TODO: merge source dirs on output path+filtering to reduce
// <copy> tags for speed.
EclipseSourceDir dir = (EclipseSourceDir) it.next();
buildXmlPrinter.startElement( "copy" );
buildXmlPrinter.addAttribute( "todir", dir.getOutput() );
buildXmlPrinter.addAttribute( "filtering", "" + dir.isFiltering() );
buildXmlPrinter.startElement( "fileset" );
buildXmlPrinter.addAttribute( "dir", dir.getPath() );
if ( dir.getIncludeAsString() != null )
{
buildXmlPrinter.addAttribute( "includes", dir.getIncludeAsString() );
}
if ( dir.getExcludeAsString() != null )
{
buildXmlPrinter.addAttribute( "excludes", dir.getExcludeAsString() );
}
buildXmlPrinter.endElement();
buildXmlPrinter.endElement();
}