package org.codehaus.mojo.gwt;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.mojo.gwt.utils.DefaultGwtModuleReader;
import org.codehaus.mojo.gwt.utils.GwtModuleReaderException;
import org.codehaus.plexus.util.DirectoryScanner;
import java.io.File;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* Collect GWT java source code and module descriptor to be added as resources. Common
* functionality for different implementations GwtResourcesMojo and GwtSourcesJarMojo
*
* @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
* @author <a href="mailto:vlads@pyx4j.com">Vlad Skarzhevskyy</a>
*
*/
abstract class GwtResourcesBaseMojo
extends AbstractGwtModuleMojo
{
protected class ResourceFile
{
File basedir;
String fileRelativeName;
public ResourceFile( File basedir, String fileRelativeName )
{
super();
this.basedir = basedir;
this.fileRelativeName = fileRelativeName;
}
}
/**
* Collect GWT java source code and module descriptor to be added as resources.
*/
protected Collection<ResourceFile> getAllResourceFiles()
throws MojoExecutionException
{
try
{
Set<ResourceFile> sourcesAndResources = new HashSet<ResourceFile>();
Set<String> sourcesAndResourcesPath = new HashSet<String>();
sourcesAndResourcesPath.addAll( getProject().getCompileSourceRoots() );
for ( Resource resource : getProject().getResources() )
{
sourcesAndResourcesPath.add( resource.getDirectory() );
}
for ( String name : getModules() )
{
GwtModule module = readModule( name );
sourcesAndResources.add( getDescriptor( module, sourcesAndResourcesPath ) );
int count = 1;
for ( String source : module.getSources() )
{
getLog().debug( "GWT sources from " + name + '.' + source );
Collection<ResourceFile> files = getAsResources( module, source, sourcesAndResourcesPath,
"**/*.java" );
sourcesAndResources.addAll( files );
count += files.size();
Collection<ResourceFile> uifiles = getAsResources( module, source, sourcesAndResourcesPath,
"**/*.ui.xml" );
sourcesAndResources.addAll( uifiles );
count += uifiles.size();
}
for ( String source : module.getSuperSources() )
{
getLog().debug( "GWT super-sources from " + name + '.' + source );
Collection<ResourceFile> files = getAsResources( module, source, sourcesAndResourcesPath,
"**/*.java" );
sourcesAndResources.addAll( files );
count += files.size();
Collection<ResourceFile> uifiles = getAsResources( module, source, sourcesAndResourcesPath,
"**/*.ui.xml" );
sourcesAndResources.addAll( uifiles );
count += uifiles.size();
}
getLog().info( count + " source files from GWT module " + name );
}
return sourcesAndResources;
}
catch ( GwtModuleReaderException e )
{
throw new MojoExecutionException( e.getMessage(), e );
}
}
/**
* @param source
* @param include TODO
* @param name
*/
private Collection<ResourceFile> getAsResources( GwtModule module, String source, Set<String> paths, String include )
{
String pattern = module.getPackage().replace( '.', '/' );
Set<ResourceFile> sourcesAndResources = new HashSet<ResourceFile>();
for ( String path : paths )
{
File basedir = new File( path );
// the default "src/main/resource" may not phisicaly exist in project
if ( !basedir.exists() )
{
continue;
}
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( basedir );
scanner.setIncludes( new String[] { pattern + '/' + source + '/' + include } );
scanner.scan();
String[] includedFiles = scanner.getIncludedFiles();
for ( String included : includedFiles )
{
sourcesAndResources.add( new ResourceFile( basedir, included ) );
}
}
return sourcesAndResources;
}
private ResourceFile getDescriptor( GwtModule module, Set<String> paths )
throws MojoExecutionException
{
String moduleFilePath = module.getName().replace( '.', '/' ) + DefaultGwtModuleReader.GWT_MODULE_EXTENSION;
for ( String path : paths )
{
File basedir = new File( path );
File descriptor = new File( basedir, moduleFilePath );
if ( descriptor.exists() )
{
return new ResourceFile( basedir, moduleFilePath );
}
}
throw new MojoExecutionException( "Failed to retrieve GWT descriptor in project sources " + moduleFilePath );
}
}