~~ 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.

 ------
 Maven 2 NBM Plugin 
 ------
 Frantisek Mantlik
 <frantisek@mantlik.cz>
 ------
 2012-02-12

HOWTO: Customize installers generated by nbm:build-installers

 Generated installers can be customized by providing user-defined 
 customized templateFile and pass parameters to it with
 userSettings parameter.
 See {{{./build-installers-mojo.html}<<<build-installers>>> goal}} description.

 User defined template can be used to modify generated installer
 behavior, e.g. branding of installation environment etc.

*Example 1: Simple change in installer code

 Simple changes into original Harness installer code can be made by filtering
 corresponding file using Ant in templateFile.

 Following code added into <<<prepare-sources>>> target takes rid of the "Run application
 when installer finished" checkbox at the last page of installer wizard:

+-----+
<replace file="${installer.build.dir}/ext/engine/src/org/mycompany/installer/wizard/components/panels/PostInstallSummaryPanel.java" encoding="utf-8">
    <replacefilter token="runAppNow.doClick();" value="runAppNow.setVisible(false);"/>
</replace>
+-----+

*Example 2: More complex installer code changes

 If the code changes become more complex better solution is to replace entire
 Harness files with modified versions.

 For example, you would like to register file associations for your application.

 First of all, prepare your modified version of the file ConfigurationLogic.java
 according to the instructions at {{{http://wiki.netbeans.org/NBIFileAssosiations}http://wiki.netbeans.org/NBIFileAssosiations}}.
 
 As a next step add a copy task into <<<prepare-sources>>> target in your templateFile:

+-----+
<copy file="${configuration.logic.file}" overwrite="true" tofile="${installer.build.dir}/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java"/>
+-----+

 and finally define <<<configuration.logic.file>>> parameter in the application's pom:

+-----+
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>nbm-maven-plugin</artifactId>
    <configuration>
        <templateFile>${basedir}/installer/template.xml</templateFile>
        <userSettings>
            <configuration.logic.file>${basedir}/installer/ConfigurationLogic.java</configuration.logic.file>
        </userSettings>
    </configuration>
</plugin>
+-----+

*Example 3: Branding of installer images

 If installer left corner image has to be branded,
 following code can be added to templateFile target
 <<<prepare-sources>>>:

+-----+
<condition property="ilc.path" value="${nbi.instleftcorner.file}">
     <and>
         <isset property="nbi.instleftcorner.file"/>
         <available file="${nbi.instleftcorner.file}"/>
     </and>
</condition>
<condition property="ilc.defined">
     <and>
         <isset property="nbi.instleftcorner.file"/>
         <available file="${nbi.instleftcorner.file}"/>
     </and>
</condition> 
<antcall target="-prepare-ilc"/>
+-----+

 In addition, new target <<<-prepare-ilc>>> has to be defined, e.g. at the end of templateFile:

+-----+
<target name="-prepare-ilc" if="ilc.defined">
    <copy file="${ilc.path}" tofile="${installer.build.dir}/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-left.png" overwrite="true"/>
</target>
+-----+

 which effectively replaces the desired image.

 Finally, update application's pom:

+-----+
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>nbm-maven-plugin</artifactId>
    <configuration>
        <templateFile>${basedir}/installer/template.xml</templateFile>
        <userSettings>
            <nbi.instleftcorner.file>${basedir}/installer/ilc.png</nbi.instleftcorner.file>
        </userSettings>
    </configuration>
</plugin>
+-----+

 More information: {{{http://wiki.netbeans.org/NBI}http://wiki.netbeans.org/NBI}}
