blob: ff7140d2d15cab531a353f4f8aff783795b7b7f1 [file] [log] [blame]
/* ==========================================================================
* Copyright 2007 Mevenide Team
*
* Licensed 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.
* =========================================================================
*/
package org.netbeans.nbm;
import java.io.File;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
/**
* Package branding resources for NetBeans platform/IDE based application.
* The format of branding resources is the same as in
* NetBeans Ant-based projects.
*
* The <code>src/main/nbm-branding</code> folder of the project is assumed to
* contain the branding content. Within the directory, the following folder structure is assumed:
* <ul>
* <li>
* 1. pick the IDE/platform module which contents you want to brand. eg. org-openide-windows.jar
* </li><li>
* 2. locate the jar within the IDE/platform installation and it's cluster, eg. modules/org-openide-windows.jar
* </li><li>
* 3. create the same folder structure in src/main/nbm-branding, make folder with the module's jar name as well.
* eg. create folder by name modules/org-openide-windows.jar
* </li><li>
* 4. within that folder place your branding modifications at the same location, as if they were withn the jar,
* eg. org/openide/windows/ui/Bundle.properties and place the changed bundle keys there.
* </li></ul>
* @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
*
*
*/
@Mojo(name="branding",
requiresProject=true,
threadSafe = true,
defaultPhase= LifecyclePhase.PACKAGE)
public class BrandingMojo
extends AbstractNbmMojo
{
/**
* directory where the the binary content is created.
*/
@Parameter(required=true, defaultValue="${project.build.directory}/nbm")
protected File nbmBuildDir;
/**
* output directory.
*/
@Parameter(defaultValue="${project.build.directory}", required=true)
protected File outputDirectory;
/**
* Location of the branded resources.
*/
@Parameter(required=true, defaultValue="${basedir}/src/main/nbm-branding")
private File brandingSources;
/**
* The branding token used by the application.
* Required unless {@code nbmBuildDir} does not exist and the mojo is thus skipped.
*/
@Parameter(property="netbeans.branding.token")
private String brandingToken;
/**
* cluster of the branding.
*/
@Parameter(required=true, defaultValue="extra")
protected String cluster;
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
@Parameter(required=true, readonly=true, property="project")
private MavenProject project;
public void execute()
throws MojoExecutionException
{
if ( !"nbm".equals( project.getPackaging() ) )
{
getLog().error( "The nbm:branding goal shall be used within a NetBeans module project only (packaging 'nbm')" );
}
if ( !brandingSources.isDirectory() )
{
getLog().info( "No branding to process." );
return;
}
if ( brandingToken == null )
{
throw new MojoExecutionException( "brandingToken must be defined for mojo:branding" );
}
try
{
DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes( new String[]
{
"**/*.*"
} );
scanner.addDefaultExcludes();
scanner.setBasedir( brandingSources );
scanner.scan();
final String clusterPathPart = "netbeans" + File.separator + cluster;
File outputDir = new File(outputDirectory, "branding_and_locales");
outputDir.mkdirs();
File clusterDir = new File( nbmBuildDir, clusterPathPart );
clusterDir.mkdirs();
// copy all files and see to it that they get the correct names
for ( String brandingFilePath : scanner.getIncludedFiles() )
{
File brandingFile = new File( brandingSources, brandingFilePath );
String[] locale = getLocale( brandingFile.getName());
String token = locale[1] == null ? brandingToken : brandingToken + "_" + locale[1];
File root = new File(outputDir, token);
root.mkdirs();
String destinationName = locale[0] + "_" + token + locale[2];
File brandingDestination = new File( root, brandingFilePath.replace( brandingFile.getName(), destinationName) );
if ( !brandingDestination.getParentFile().exists() )
{
brandingDestination.getParentFile().mkdirs();
}
FileUtils.copyFile( brandingFile, brandingDestination );
}
for (File rootDir : outputDir.listFiles()) {
if (!rootDir.isDirectory()) {
continue;
}
String effectiveBranding = rootDir.getName();
// create jar-files from each toplevel .jar directory
scanner.setIncludes( new String[]
{
"**/*.jar"
} );
scanner.setBasedir( rootDir );
scanner.scan();
for ( String jarDirectoryPath : scanner.getIncludedDirectories() )
{
// move nnn.jar directory to nnn.jar.tmp
File jarDirectory = new File( rootDir, jarDirectoryPath );
File destinationLocation = new File(clusterDir, jarDirectoryPath).getParentFile();
destinationLocation.mkdirs();
// jars should be placed in locales/ under the same directory the jar-directories are
File destinationJar =
new File( destinationLocation + File.separator + "locale"
+ File.separator + destinationFileName( jarDirectory.getName(), effectiveBranding ) );
// create nnn.jar archive of contents
JarArchiver archiver = new JarArchiver();
archiver.setDestFile( destinationJar );
archiver.addDirectory( jarDirectory );
archiver.createArchive();
}
}
}
catch ( Exception ex )
{
throw new MojoExecutionException( "Error creating branding", ex );
}
}
static String destinationFileName( String brandingFilePath, String branding )
{
// use first underscore in filename
int lastSeparator = brandingFilePath.lastIndexOf( File.separator );
String infix = "_" + branding;
// no underscores, use dot
int lastDot = brandingFilePath.lastIndexOf( "." );
if (lastDot == -1 || lastDot < lastSeparator) {
return brandingFilePath + infix;
}
return brandingFilePath.substring( 0, lastDot ) + infix + brandingFilePath.substring( lastDot );
}
//[0] prefix
//[1] locale
//[2] suffix
static String[] getLocale(String name) {
String suffix = "";
int dot = name.indexOf( ".");
if (dot > -1) { //remove file extension
suffix = name.substring( dot );
name = name.substring( 0, dot);
}
String locale = null;
int count = 1;
//iterate from back of the string, max 3 times and see if the pattern patches local pattern
while (count <= 3) {
int underscore = name.lastIndexOf( '_');
if (underscore > -1) {
String loc1 = name.substring( underscore + 1);
if (loc1.length() != 2) {
break;
}
locale = loc1 + (locale == null ? "" : "_" + locale);
name = name.substring( 0, underscore);
} else {
break;
}
count = count + 1;
}
return new String[] {name, locale, suffix};
}
}