Browse Source

- add nbi installer project for SDK to be able to build releases on the server

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8767 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
nor..om 13 years ago
parent
commit
d4de64bbf7
62 changed files with 8471 additions and 1 deletions
  1. 25 1
      build.xml
  2. 258 0
      nbi/.common/common.properties
  3. 834 0
      nbi/.common/common.xml
  4. 70 0
      nbi/.common/engine.properties
  5. 324 0
      nbi/.common/engine.xml
  6. 69 0
      nbi/.common/group.properties
  7. 283 0
      nbi/.common/group.xml
  8. 111 0
      nbi/.common/product.properties
  9. 746 0
      nbi/.common/product.xml
  10. BIN
      nbi/antlib/nbi-ant-tasks.jar
  11. BIN
      nbi/antlib/nbi-engine.jar
  12. BIN
      nbi/antlib/nbi-registries-management.jar
  13. 49 0
      nbi/stub/build.properties
  14. 203 0
      nbi/stub/build.xml
  15. 74 0
      nbi/stub/ext/components/products/helloworld/build.xml
  16. 41 0
      nbi/stub/ext/components/products/helloworld/data/Bundle.properties
  17. BIN
      nbi/stub/ext/components/products/helloworld/data/icon.png
  18. BIN
      nbi/stub/ext/components/products/helloworld/data/icon48.png
  19. 1 0
      nbi/stub/ext/components/products/helloworld/manifest.mf
  20. 631 0
      nbi/stub/ext/components/products/helloworld/nbproject/build-impl.xml
  21. 8 0
      nbi/stub/ext/components/products/helloworld/nbproject/genfiles.properties
  22. 4 0
      nbi/stub/ext/components/products/helloworld/nbproject/private/private.xml
  23. 62 0
      nbi/stub/ext/components/products/helloworld/nbproject/project.properties
  24. 26 0
      nbi/stub/ext/components/products/helloworld/nbproject/project.xml
  25. 22 0
      nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties
  26. 451 0
      nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java
  27. 43 0
      nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard.xml
  28. 51 0
      nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard/panels/Bundle.properties
  29. 184 0
      nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard/panels/HelloWorldPanel.java
  30. 41 0
      nbi/stub/ext/engine/build.properties
  31. 73 0
      nbi/stub/ext/engine/build.xml
  32. 2 0
      nbi/stub/ext/engine/manifest.mf
  33. 646 0
      nbi/stub/ext/engine/nbproject/build-impl.xml
  34. 8 0
      nbi/stub/ext/engine/nbproject/genfiles.properties
  35. 4 0
      nbi/stub/ext/engine/nbproject/private/private.xml
  36. 102 0
      nbi/stub/ext/engine/nbproject/project.properties
  37. 64 0
      nbi/stub/ext/engine/nbproject/project.xml
  38. 89 0
      nbi/stub/ext/engine/src/data/engine.properties
  39. 71 0
      nbi/stub/ext/engine/src/native/launcher/unix/i18n/launcher.properties
  40. 74 0
      nbi/stub/ext/engine/src/native/launcher/windows/i18n/launcher.properties
  41. 43 0
      nbi/stub/ext/engine/src/org/mycompany/installer/utils/applications/Bundle.properties
  42. 191 0
      nbi/stub/ext/engine/src/org/mycompany/installer/utils/applications/NetBeansRCPUtils.java
  43. 3 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/actions/Bundle.properties
  44. 112 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/actions/InitializeAction.java
  45. 94 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/Bundle.properties
  46. 457 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/PostInstallSummaryPanel.java
  47. 620 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/PreInstallSummaryPanel.java
  48. 333 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/WelcomePanel.java
  49. BIN
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/resources/welcome-left-bottom.png
  50. BIN
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/resources/welcome-left-top.png
  51. 43 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/sequences/Bundle.properties
  52. 154 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/sequences/MainSequence.java
  53. 52 0
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-components.xml
  54. BIN
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-left.png
  55. BIN
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-right.png
  56. BIN
      nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-icon.png
  57. 77 0
      nbi/stub/ext/infra/build/engine/build.properties
  58. 77 0
      nbi/stub/ext/infra/build/engine/build.xml
  59. 159 0
      nbi/stub/ext/infra/build/products/helloworld/build.properties
  60. 98 0
      nbi/stub/ext/infra/build/products/helloworld/build.xml
  61. 198 0
      nbi/stub/template.xml
  62. 16 0
      nbi/stub/tmpl.properties

+ 25 - 1
build.xml

@@ -22,6 +22,27 @@
         <ant antfile="build.xml" target="update-help-sets" inheritall="false" inheritrefs="false" dir="jme3-core/"/>
         <ant antfile="build.xml" target="update-help-sets" inheritall="false" inheritrefs="false" dir="jme3-core/"/>
     </target>
     </target>
 
 
+    <target name="build-installers">
+        <property file="nbproject/project.properties"/>
+        <ant antfile="template.xml" dir="nbi/stub">
+            <property name="suite.location" value="${basedir}"/>
+            <property name="suite.nbi.product.uid" value="${app.name}"/>
+            <property name="suite.nbi.product.version" value="${plugins.version}.0.0"/>
+            <property name="nbi.stub.location" value="${basedir}/nbi/stub"/>
+            <property name="nbi.stub.common.location" value="${basedir}/nbi/.common"/>
+            <property name="nbi.ant.tasks.jar" value="${basedir}/nbi/antlib/nbi-ant-tasks.jar"/>
+            <property name="nbi.registries.management.jar" value="${basedir}/nbi/antlib/nbi-registries-management.jar"/>
+            <property name="nbi.engine.jar" value="${basedir}/nbi/antlib/nbi-engine.jar"/>
+            <property name="nbi.license.file" value="${basedir}/jme-license.txt"/>
+            <property name="generate.installer.for.platforms" value="windows linux macosx"/>
+            <property name="generator-jdk-location-forward-slashes" value="${java.home}"/>
+            <property name="generated-installers-location-forward-slashes" value="${basedir}/build/installer"/>
+            <property name="pack200.enabled" value="true"/>
+            <property name="nbi.icon.file" value="${basedir}/jmonkeyplatform.png"/>
+            <property name="nbi.dock.icon.file" value="${basedir}/jmonkeyplatform.icns"/>
+        </ant>
+    </target>
+
     <target name="-create-netbeans-config">
     <target name="-create-netbeans-config">
         <!--replaces default values in jmonkeyplatform.conf file with run.args.extra from project.properties-->
         <!--replaces default values in jmonkeyplatform.conf file with run.args.extra from project.properties-->
         <mkdir dir="build/launcher/etc"/>
         <mkdir dir="build/launcher/etc"/>
@@ -106,6 +127,9 @@
     <target name="hudson-stable" depends="suite.clean, -revert-svn-changes, set-impl-version, suite.nbms, unset-spec-version">
     <target name="hudson-stable" depends="suite.clean, -revert-svn-changes, set-impl-version, suite.nbms, unset-spec-version">
     </target>
     </target>
     
     
+    <target name="hudson-release" depends="suite.clean, set-spec-version, build-installers, unset-spec-version">
+    </target>
+    
     <target name="set-spec-version">
     <target name="set-spec-version">
         <property file="nbproject/project.properties"/>
         <property file="nbproject/project.properties"/>
         <foreach target="-do-spec-version" list="${modules}" delimiter=":" param="module_dir" inheritall="true">
         <foreach target="-do-spec-version" list="${modules}" delimiter=":" param="module_dir" inheritall="true">
@@ -318,5 +342,5 @@ for coding and for managing and creating game assets.
             </description>
             </description>
         </deb>
         </deb>
     </target>
     </target>
-
+    
 </project>
 </project>

+ 258 - 0
nbi/.common/common.properties

@@ -0,0 +1,258 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+#####################################################################################
+# Initialization. Properties that are used during build script initialization.
+
+# location of the custom tasks' sources and the destination directory for their 
+# build
+custom.tasks.src=${common.dir}/../.ant-lib/src
+custom.tasks.cls=${basedir}/.ant-lib
+
+#####################################################################################
+# Check-out. Properties that are used during check-out.
+
+# whether to check out sources, or copy them from the location specified in 
+# ${sources.dir}; 'true'/'false'
+checkout.sources=true
+
+# coordinates of the project's sources within the cvs repository
+# * ${cvs.root} - obvious
+# * ${cvs.branch} - the branch from which the sources should be checked out; if
+#   this property is empty, then the sources will be checked out from trunk
+# * ${cvs.timestamp} - the timestamp for which the sources should be checked out; if
+#   this property is empty, then the latest sources will be checked out
+# * ${cvs.module} - the module that should be checked out; at this point the
+#   build framework is not compatible with modules which alias several other
+#   modules
+cvs.root=:pserver:[email protected]:/cvs
+cvs.branch=
+cvs.module=nbi
+cvs.timestamp=
+
+# coordinates of the project's sources' localized files within the cvs 
+# repository
+# * ${translatedfiles.module} - name of the cvs module with the localized files
+# * ${translatedfiles.path} - path to the localized files for the project 
+#   within the cvs module
+translatedfiles.module=translatedfiles
+translatedfiles.path=src/${cvs.module}/${cvs.path}
+
+# sources parameters; a search-and-replace will be run over the sources after 
+# check-out, replacing [token] => [value]; regular expressions are not allowed
+# * ${sources.params.length} - total number of the parameters
+# * indices should start with 1
+# * parameters are not i18n compliant
+sources.params.length=0
+#sources.params.1.token=
+#sources.params.1.value=
+
+# several simple shorthands for various directories
+# * ${cvs.module.dir} - path to the root of the cvs module
+# * ${cvs.dir} - path to the current project's sources root
+# * ${translatedfiles.dir} - path to the localized files for the project
+cvs.module.dir=${work.dir}/${cvs.module}
+cvs.dir=${cvs.module.dir}/${cvs.path}
+translatedfiles.dir=${work.dir}/${translatedfiles.module}/${translatedfiles.path}
+
+#####################################################################################
+# NB Projects. Properties related to cleaning/building netbeans projects.
+
+# path to the netbeans project that should be built; relative to the 
+# ${cvs.dir}
+nbproject.path=.
+
+# names of targets in component's (or engine's) build script that will be 
+# called as part of the build process
+# * ${nb.target.clean} - will be called when cleaning the netbeans project
+# * ${nb.target.build} - will be called when building the netbeans project
+nb.target.clean=clean
+nb.target.build=jar
+
+# additional properties which will be passed to the netbeans project build 
+# script
+# * ${nb.platform.home} - location of the jdk codenamed "JDK 1.5", this jdk
+#   is expected to be used by all netbeans projects
+# * ${nb.ignore.native} - tells the netbeans project's build script to skip
+#   building native components, if it is able to do so - these will be built
+#   as part of the project's global build script
+# * ${nb.no.dependencies} - tells the netbeans project's build script to skip
+#   building its dependencies, the dependencies are expected to be built by the
+#   project's global build script
+# * ${nb.dont.build.custom.tasks} - tells the netbeans project's build script 
+#   to skip building custom tasks for it, as they will already be built by the
+#   global script
+# * ${nb.custom.tasks.cls} - points the netbeans project's build script to the 
+#   location of the built custom tasks
+nb.platform.home=-Dplatforms.JDK_1.5.home=${java.home}/..
+nb.platform.home.macos=-Dplatforms.JDK_1.5.home=${java.home}
+nb.ignore.native=-Dignore.native=true
+nb.no.dependencies=-Dno.dependencies=true
+nb.dont.build.custom.tasks=-Ddont.build.custom.tasks=true
+nb.custom.tasks.cls=-Dcustom.tasks.cls=${custom.tasks.cls}
+
+# default path to the distributives directory of the netbeans project; relative 
+# to ${nbproject.path}
+nb.dist.path=dist
+
+# path to the classes directory of the netbeans project; relative to 
+# ${nbproject.path}
+nb.classes.dir=build/classes
+
+# path to the manifest file of the netbeans project; relative to the 
+# ${nbproject.path}
+nbproject.manifest=manifest.mf
+
+# path to the dist directory that the nbproject should use; since we do not use 
+# the netbeans' packaging mechanism, we have the flexibility to specify any 
+# distributives directory we want
+nbproject.dist.dir=${cvs.dir}/${nbproject.path}/${nb.dist.path}
+
+#####################################################################################
+# Native. Properties related to cleaning/building native components.
+
+# path to the directory with the sources for the native components; relative 
+# to the root of the project's sources
+native.path=${cvs.module}/${cvs.path}/native
+
+# path to the directory with the localized files for the native components; 
+# relative to the root of the project's localized files directory
+translatedfiles.native.path=${translatedfiles.module}/${translatedfiles.path}/native
+
+# list of platforms for which the native components should be built
+# * the list should be space-separated
+native.platforms=windows linux solaris-x86 solaris-sparc macosx
+
+# directory on the remote machine where the build script should operate
+# * this is the default value, the actual value is expected to be passed in 
+#   through the environment properties
+remote.work.dir=~/.nbi-build
+
+# ssh properties: executable name, set of arguments and the command.
+# * ${remote.host}, ${remote.port} and ${remote.user} are environment specific 
+#   and are expected to be passed in through the environment properties
+ssh.executable=ssh
+ssh.arguments=-l ${remote.user} -p ${remote.port} ${remote.host}
+ssh.command.clean=rm -rf ${remote.work.dir};
+ssh.command.build=rm -rf ${remote.work.dir}; \
+                  mkdir ${remote.work.dir}; \
+                  cd ${remote.work.dir}; \
+                  if [ "${cvs.branch}" = "" ]; then \
+                      if [ "${cvs.timestamp}" = "" ]; then \
+                          cvs -d ${cvs.root} co -P ${native.path}; \
+                          cvs -d ${cvs.root} co -P ${translatedfiles.native.path}; \
+                      else\
+                          cvs -D ${cvs.timestamp} -d ${cvs.root} co -P ${native.path}; \
+                          cvs -D ${cvs.timestamp} -d ${cvs.root} co -P ${translatedfiles.native.path}; \
+                      fi;\
+                  else \
+                      if [ "${cvs.timestamp}" = "" ]; then \
+                          cvs -d ${cvs.root} co -r ${cvs.branch} -P ${native.path}; \
+                          cvs -d ${cvs.root} co -r ${cvs.branch} -P ${translatedfiles.native.path}; \
+                      else \
+                          cvs -D ${cvs.timestamp} -d ${cvs.root} co -r ${cvs.branch} -P ${native.path}; \
+                          cvs -D ${cvs.timestamp} -d ${cvs.root} co -r ${cvs.branch} -P ${translatedfiles.native.path}; \
+                      fi;\
+                  fi; \
+                  cp -r ${translatedfiles.native.path} ${native.path}; \
+                  cd ${native.path}/${platform}; \
+                  make
+
+# scp properties: executable name, set of arguments, remote directory, local 
+# directory
+# * ${remote.host}, ${remote.port} and ${remote.user} are platform and 
+#   environment specific and are expected to be passed in through the 
+#   environment properties
+# * name of the file to copy is platform specific and is defined elsewhere, 
+#   most likely in the base build script for a project type (engine, product, 
+#   etc.)
+# * ${platform} will be defined at runtime, as these commands will be executed 
+#   in loop over the list of platforms
+scp.executable=scp
+scp.arguments=-P ${remote.port}
+scp.remote.dir=${remote.user}@${remote.host}:${remote.work.dir}/${native.path}/${platform}/${nb.dist.path}
+scp.local.dir=${work.dir}/${native.path}/${platform}/${nb.dist.path}
+
+# names of the native distributive files for various platforms
+native.dist.file.windows=windows.dll
+native.dist.file.linux=linux.so
+native.dist.file.solaris-x86=solaris-x86.so
+native.dist.file.solaris-sparc=solaris-sparc.so
+native.dist.file.macosx=macosx.dylib
+
+#####################################################################################
+# Release. Properties controlling the 'release' process
+release.to.server=true
+
+#####################################################################################
+# Miscellaneous. Properties that are used elsewhere.
+
+# these properties control the environment for the jarsigner process
+# * ${jarsigner.enabled} - whether to sign jars
+# * ${jarsigner.xmx} - max heap size for the jarsigner process
+# * ${jarsigner.executable} - path to jarsigner executable (optional)
+jarsigner.enabled=true
+jarsigner.xmx=1024m
+
+# these properties control the environment for the pack200 and unpack200 
+# processes
+# * ${pack200.enabled} - whether to repackage jars (can be specified in each product)
+# * ${use.internal.packer} - whether to use the same JVM for packing jars (can be specified in each product)
+#       it is risky because of memory leaks and possible OOMs 
+# * ${use.internal.unpacker} - whether to use the same JVM for unpacking jars (can be specified in each product)
+#       it is risky because of memory leaks and possible OOMs 
+# * ${pack200.xmx} - -Xmx jvm argument value
+# * ${pack200.perm.size} - -XX:PermSize jvm argument value
+# * ${pack200.max.perm.size} - -XX:MaxPermSize jvm argument value
+# * ${pack200.executable}   - path to pack200 executable (optional)
+# * ${unpack200.executable} - path to unpack200 executable (optional)
+# * ${verification.java.executable} - path to java executable that would be used for verification of packaged jars (optional)
+pack200.xmx=768m
+pack200.perm.size=32m
+pack200.max.perm.size=512m
+
+# these properties control the environment for the external processes running during the build
+# * ${process.max.execution.time} - maximum time (in milliseconds) for running the process
+#   if set to zero then processes would run without timeout
+#   default value is 600000=10min (defined in nbi/infra/build/.ant-lib/src/org/netbeans/installer/infra/build/ant/utils/Utils.java)
+
+# these properties control native executable paths
+# * ${tar.executable}    - path to native tar/gtar/gnutar executable
+# * ${ls.executable}     - path to native ls executable
+# * ${unzip.executable}  - path to native unzip executable

+ 834 - 0
nbi/.common/common.xml

@@ -0,0 +1,834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is a target library which is intended to be used by other build scripts.
+  
+  It contains the standard, fucntionality, common across all scripts which 
+  allows to perform some basic initialization, check out sources from a cvs 
+  repository and, finally, clean or build a netbeans project and jni libraries.
+  
+  None ot the targets defined in this script are intended to be called 
+  directly, instead it is expected that targets in build dcripts which import 
+  this one will declare dependecies on this script's targets.
+  
+  @author Kirill Sorokin
+-->
+<project name="common" default="usage" basedir=".">
+    <!-- ============================================================================
+      Aggregates
+    ============================================================================= -->
+    
+    <!--
+      Cleans the project.
+      
+      This is an aggregation target, which does not contain any functionality,
+      but defines a dependency on the 'clean' target.
+      For more details, please consult the documentation for this target.
+    -->
+    <target name="clean-all" depends="clean"/>
+    
+    <!--
+      Cleans and builds the project.
+      
+      This is an aggregation target, which does not contain any functionality,
+      but defines dependencies on the 'clean-all', 'checkout' and 'build' 
+      targets. For more details, please consult the documentation for these 
+      targets.
+    -->
+    <target name="build-all" depends="clean-all,checkout,build"/>
+    
+    <!--
+      Cleans, builds and releases the project.
+      
+      This is an aggregation target, which does not contain any functionality,
+      but defines dependencies on the 'clean', 'checkout', 'build' and 
+      'release' targets. For more details, please consult the documentation 
+      for these targets.
+    -->
+    <target name="release-all" depends="build-all,release"/>
+    
+    <!-- ============================================================================
+      Initialization
+    ============================================================================= -->
+    
+    <!--
+      Initializes the projects's build script.
+      
+      This is an aggregation target, it does not contain any functionality, but 
+      defines dependencies on '-pre-init', '-init' and '-post-init' 
+      targets. The '-pre-init' and '-post-init' targets are empty hooks,
+      which allow derivative scripts to inject custom logic which will be 
+      executed prior to the initialization process or after it. The '-init' 
+      target contains the code which actually initializes the script and should 
+      be overriden in the derivative scripts.
+    -->
+    <target name="init" depends="-pre-init,-init,-post-init"/>
+    
+    <!--
+      Performs the default initialization.
+      
+      This target defines a set of custom ant tasks which are used throughout
+      the script and may be useful for the derivative scripts.
+      
+      It also sets some properties which control the flow of the build process, 
+      such as whether to check-out sources from trunk or branch, or to copy 
+      them from a given location; whether to build the native components or 
+      not, whether to build the netbeans project or not.
+      
+      Finally this target initializes the local working directory and the 
+      distributives directory and sets a special property which will prevent it
+      from repeated execution.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".init" depends=".build-custom-tasks" unless="skip.initialization">
+        <!-- define custom ant tasks -->
+        <taskdef 
+            name="for-each" 
+            classname="org.netbeans.installer.infra.build.ant.ForEach" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="set" 
+            classname="org.netbeans.installer.infra.build.ant.SetProperty" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="if" 
+            classname="org.netbeans.installer.infra.build.ant.If" 
+            classpath="${custom.tasks.cls}"/>
+        
+        <!-- decide whether to checkout sources from trunk --> 
+        <condition property="do.checkout">
+            <and>
+                <equals arg1="${checkout.sources}" arg2="true"/>
+            </and>
+        </condition>
+        
+        <!-- decide whether to copy sources from a given location -->
+        <condition property="do.checkout.copy">
+            <not>
+                <equals arg1="${checkout.sources}" arg2="true"/>
+            </not>
+        </condition>
+        
+        <!-- decide whether to build native libraries/launchers or not -->
+        <condition property="do.build.native">
+            <equals arg1="${build.native}" arg2="true"/>
+        </condition>
+        
+        <!-- decide whether there is need to build a netbeans project -->
+        <condition property="do.build.nbproject">
+            <equals arg1="${build.nbproject}" arg2="true"/>
+        </condition>
+        
+        <!-- deduce the path to the ant executable -->
+        <condition property="ant.executable" value="${ant.home}/bin/ant.bat">
+            <os family="windows"/>
+        </condition>
+        <condition property="ant.executable" value="${ant.home}/bin/ant">
+            <not>
+                <os family="windows"/>
+            </not>
+        </condition>
+        
+        <!-- initialize the local working directory -->
+        <mkdir dir="${work.dir}"/>
+        
+        <!-- initialize the local distributive directory -->
+        <mkdir dir="${dist.dir}"/>
+        
+        <!-- set the marker property which will prevent the script running the 
+             initialization procedure again, if history is lost, e.g. as a 
+             result of an antcall -->
+        <property name="skip.initialization" value="true"/>
+    </target>
+    
+    <!--
+      Builds custom ant tasks.
+      
+      This target deletes the directory which is the target for the custom ant
+      tasks compilation, recreates it and runs javac on the custom tasks' 
+      sources.
+      
+      It also sets a special property which will prevent it from repeated 
+      execution.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-custom-tasks" unless="dont.build.custom.tasks">
+        <!-- quick clean-up and initialization -->
+        <delete dir="${custom.tasks.cls}"/>
+        <mkdir dir="${custom.tasks.cls}"/>
+        
+        <!-- compile -->
+        <javac 
+            srcdir="${custom.tasks.src}" 
+            destdir="${custom.tasks.cls}" 
+            debug="true"/>
+        
+        <property name="dont.build.custom.tasks" value="true"/>
+    </target>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed prior to the script's initialization.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-init"/>
+    
+    <!--
+      An empty hook. 
+      
+      It must be overriden in derivative scripts, in order to implement custom
+      functionality required for the build script initialization.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-init" depends=".init"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed after the script's initialization.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-post-init"/>
+    
+    <!-- ============================================================================
+      Clean-up
+    ============================================================================= -->
+    
+    <!--
+      Cleans the current working directory and the distributives directory.
+      
+      This is an aggregation target, it does not contain any functionality, but 
+      defines dependencies on '-pre-clean', '-clean' and '-post-clean' 
+      targets. The '-pre-clean' and '-post-clean' targets are empty hooks,
+      which allow derivative scripts to inject custom logic which will be 
+      executed prior to the clean process or after it. The '-clean' target 
+      contains the code which actually cleans the project and should be 
+      overriden in the derivative scripts.
+    -->
+    <target name="clean" depends="init,-pre-clean,-clean,-post-clean"/>
+    
+    <!--
+      Performs the standard clean-up procedures.
+      
+      It cleans the native components (iterates over the list of platforms for 
+      which the native components should be built and deletes the distributive 
+      files of these components), tries to run cleanup on the netbeans project 
+      and finally deletes the local working directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean">
+        <!-- for each of the defined platforms set the appropriate property
+             and execute the clean-up procedure -->
+        <for-each list="${native.platforms}" property="platform">
+            <antcall target=".clean-native"/>
+        </for-each>
+        
+        <!-- attempt to run the clean-up procedure on the netbeans project -->
+        <antcall target=".clean-nbproject"/>
+        
+        <!-- delete the local working directory -->
+        <delete dir="${work.dir}" includeemptydirs="true"/>
+    </target>
+    
+    <!--
+      Cleans the native components of the project. 
+      
+      It is meant to be antcall'ed from a loop which would iterate over the 
+      list of supported platforms. This target expects the property 
+      'platform' to point to the current platform for which clean-up should be 
+      performed.
+      
+      By default it falls back to '.clean-jni' target, but it is meant to be 
+      overriden by derivative build scripts, if there is need to do more than 
+      that.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean-native" if="do.build.native">
+        <antcall target=".clean-jni"/>
+    </target>
+    
+    <!--
+      Cleans up the native jni libraries for the project.
+      
+      It removes the distributive file for the jni library for the current 
+      platform.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean-jni" if="do.build.native">
+        <!-- set required properties -->
+        <set property="current.scp.local.dir" 
+             source="scp.local.dir"/>
+        <set property="current.native.dist.file" 
+             source="native.dist.file.${platform}"/>
+        
+        <!-- delete the distributive -->
+        <delete dir="${scp.local.dir}/${current.native.dist.file}"/>
+    </target>
+    
+    <!--
+      Cleans up the netbeans part of the project.
+      
+      It runs the 'clean' target on the netbeans project's build script.
+      
+      This target is only executed if the the ${build.nbproject} property was 
+      set to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean-nbproject" if="do.build.nbproject">
+        <!-- check whether the netbeans project's directory exists -->
+        <condition property="nbproject.exists" value="true">
+            <available file="${cvs.dir}/${nbproject.path}"/>
+        </condition>
+        
+        <!-- is it exists, run the 'clean' target on the netbeans project's 
+             build script -->
+        <if property="nbproject.exists" value="true">
+            <condition property="nb.jdk.home"
+                       value="${nb.platform.home}"
+                       else="${nb.platform.home.macos}">
+                    <not>
+                        <equals arg1="Apple Inc." arg2="${java.vendor}"/>
+                    </not>
+            </condition>
+
+            <exec executable="${ant.executable}" 
+                  dir="${cvs.dir}/${nbproject.path}" 
+                  failonerror="false"
+                  failifexecutionfails="false">
+                <env key="JAVA_HOME" value="${java.home}"/>
+                <arg value="${nb.target.clean}"/>
+                
+                <arg value="${nb.jdk.home}"/>
+                <arg value="${nb.ignore.native}"/>
+                <arg value="${nb.no.dependencies}"/>
+                <arg value="${nb.dont.build.custom.tasks}"/>
+                <arg value="${nb.custom.tasks.cls}"/>
+                <arg value="${nb.custom.parameter}"/>
+            </exec>
+        </if>
+    </target>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed prior to cleaning the projects's local working directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-clean"/>
+    
+    <!--
+      An empty hook. 
+      
+      It must be overriden in derivative scripts, in order to implement custom
+      functionality required for the cleaning the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-clean" depends=".clean"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed after cleaning the project's local working directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-post-clean"/>
+    
+    <!-- ============================================================================
+      Check-out
+    ============================================================================= -->
+    
+    <!--
+      Checks out the the project's sources from the CVS repository.
+      
+      This is an aggregation target, it does not contain any functionality, but 
+      defines dependencies on '-pre-checkout', '-checkout' and '-post-checkout' 
+      targets. The '-pre-checkout' and '-post-checkout' target are empty hooks,
+      which allow derivative scripts to inject custom logic which will be 
+      executed prior to the check-out process or after it. The '-checkout' 
+      target contains the code which actually checks out the sources and should 
+      be overriden in the derivative scripts.
+    -->
+    <target name="checkout" 
+            depends="init,-pre-checkout,-checkout,-post-checkout"/>
+    
+    <!--
+      Checks out sources from a CVS repository with the given coordinates.
+      
+      This target uses the values of ${cvs.root}, ${cvs.module}, ${cvs.path}, 
+      ${cvs.branch}, ${cvs.timestamp} properties to check out the required sources.
+      It falls back to the two targets: '.checkout-repository' and '.checkout-copy', 
+      which correspond to the choosen check-out method. Only one of these 
+      targets will be executed under any conditions.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".checkout" 
+            depends=".checkout-repository,.pre-checkout-copy,.checkout-copy,.post-checkout-copy">
+        <copy todir="${cvs.dir}" failonerror="false">
+            <fileset dir="${translatedfiles.dir}"/>
+        </copy>
+        
+        <!-- substitute the params in the source tree -->
+        <for-each from="1" to="${sources.params.length}" property="i">
+            <set property="current.token" 
+                 source="sources.params.${i}.token"/>
+            <set property="current.value" 
+                 source="sources.params.${i}.value"/>
+            
+            <replace dir="${cvs.dir}" 
+                     token="${current.token}" 
+                     value="${current.value}"/>
+        </for-each>
+    </target>
+    
+    <!--
+      Checks out sources from trunk or from a given branch.
+      
+      This target executes the <cvs> task, which performs the actual check-out.
+      
+      This target is only executed if the the ${checkout.sources} property was 
+      set to 'true' and the ${cvs.branch} property is not empty.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".checkout-repository" if="do.checkout">
+        <cvs cvsroot="${cvs.root}" 
+             command="checkout" 
+             package="${cvs.module}/${cvs.path}" 
+             tag="${cvs.branch}"
+             date="${cvs.timestamp}" 
+             dest="${work.dir}"
+             failonerror="true"/>
+        <cvs cvsroot="${cvs.root}"
+             command="checkout"
+             package="${translatedfiles.module}/${translatedfiles.path}"
+             tag="${cvs.branch}"
+             date="${cvs.timestamp}"
+             dest="${work.dir}"
+             failonerror="false"/>
+    </target>
+    
+    <!--
+      Copies the sources from a given location.
+      
+      This target serves as an alternative to the actual check-out targets and
+      is used in case when the calling script already knows the location of the
+      appropriate source files and there is no need to check them out again.
+      
+      Several filters are applied to the sources files, e.g. no already built
+      files are copied, the private parts of the netbeans projects are omitted,
+      CVS metadata is also omitted.
+      
+      This target is only executed if the the ${checkout.sources} property was 
+      set to 'false'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".checkout-copy" if="do.checkout.copy">
+        <!-- create the destination directory for the sources -->
+        <mkdir dir="${work.dir}/${cvs.module}/${cvs.path}"/>
+        
+        <!-- copy the sources, applying the selected filters -->
+        <copy todir="${work.dir}/${cvs.module}/${cvs.path}" verbose="true">
+            <fileset dir="${sources.dir}/${cvs.module}/${cvs.path}">
+                <include name="**/*.*"/>
+                <exclude name="**/nbproject/private/*.*"/>
+                <exclude name="build/**/*.*"/>
+                <exclude name="dist/**/*.*"/>
+                <exclude name="**/CVS"/>
+                <exclude name="**/.cvsignore"/>
+            </fileset>
+        </copy>
+        <!-- copy the translatedfiles for the sources, applying the selected filters -->
+        <copy todir="${translatedfiles.dir}" verbose="true" failonerror="false">
+            <fileset dir="${sources.dir}/${translatedfiles.module}/${translatedfiles.path}">
+                <include name="**/*.*"/>
+                <exclude name="**/nbproject/private/*.*"/>
+                <exclude name="build/**/*.*"/>
+                <exclude name="dist/**/*.*"/>
+                <exclude name="**/CVS"/>
+                <exclude name="**/.cvsignore"/>
+            </fileset>
+        </copy>
+    </target>
+
+    <!--
+      Empty hooks. 
+      
+      They allow derivative scripts to inject custom logic which will be 
+      executed prior and after copying out the project's sources.
+      
+      These targets are not intended to be called directly.
+    -->
+    <target name=".pre-checkout-copy"/>
+    <target name=".post-checkout-copy"/>
+
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed prior to checking out the project's sources.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-checkout"/>
+    
+    <!--
+      An empty hook. 
+      
+      It must be overriden in derivative scripts, in order to implement custom
+      functionality required for the correctly checking out the project's 
+      sources.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-checkout" depends=".checkout"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed after checking out the project's sources.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-post-checkout"/>
+    
+    <!-- ============================================================================
+      Build
+    ============================================================================= -->
+    
+    <!--
+      Builds the project and (optionally) its native components.
+      
+      It is assumed that the sources of the project are already checked out, 
+      but a dependency on the 'checkout' target is not defined as it may be 
+      desirable to check-out the sources once and then rebuild the engine as 
+      appropriate.
+      
+      The build process consists of two steps: first, the native components 
+      of the project (jni libraries) are built (if it is required), then the 
+      projects's netbeans part is compiled and packaged.
+      
+      This is an aggregation target, it does not contain any functionality, but 
+      defines dependencies on '-pre-build', '-build' and '-post-build' 
+      targets. The '-pre-build' and '-post-build' target are empty hooks,
+      which allow derivative scripts to inject custom logic which will be 
+      executed prior to the build process or after it. The '-build' target 
+      contains the code which actually builds the project and should be 
+      overriden in the derivative scripts.
+    -->
+    <target name="build" depends="init,-pre-build,-build,-post-build"/>
+    
+    <!-- 
+      Performs the standard build procedures.
+      
+      This target builds the native components for the project (iterates over 
+      the list of platforms, calling the '.build-native' target) and executes 
+      the 'build' target on the netbeans part of the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build">
+        <!-- for each of the defined platforms set the appropriate property
+                 and execute the build procedure -->
+        <for-each list="${native.platforms}" property="platform">
+            <antcall target=".build-native"/>
+        </for-each>
+        
+        <!-- run the 'build' target on the netbeans project -->
+        <antcall target=".build-nbproject"/>
+    </target>
+    
+    <!--
+      Builds the native components of the project for a given platform.
+      
+      By default this target falls back to the '.build-jni' target, which 
+      builds the jni libraries for the project.
+      
+      This target is called in a loop from the '.build-native' target, and 
+      expects the ${platform} property to contain the code mane of the platform 
+      for which the native components should be built.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-native" if="do.build.native">
+        <antcall target=".build-jni"/>
+    </target>
+    
+    <!-- 
+      Builds the jni library for the given platform.
+      
+      This target is antcall'ed as part of the call to the '.build-native' 
+      target, and expects the ${platform} property to contain the code name of
+      the platform for which the library should be built.
+      
+      It connects to the registered satellite machine for the current platform
+      using the 'ssh' utility, checks out the library's sources and builds it.
+      The built binary is then copied back to the host machine using 'scp'.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-jni" if="do.build.native">
+        <!-- set required properties -->
+        <set property="remote.host" 
+             source="remote.host.${platform}"/>
+        <set property="remote.port" 
+             source="remote.port.${platform}"/>
+        <set property="remote.user" 
+             source="remote.user.${platform}"/>
+        
+        <set property="current.native.dist.file" 
+             source="native.dist.file.${platform}"/>
+        
+        <!-- now we need to re-evaluate the values of the ssh and scp-related 
+             properties as they contain references to the properties that have 
+             just been set above -->
+        <set property="current.ssh.arguments" 
+             source="ssh.arguments"/>
+        <set property="current.ssh.command.clean" 
+             source="ssh.command.clean"/>
+        <set property="current.ssh.command.build" 
+             source="ssh.command.build"/>
+        
+        <set property="current.scp.arguments" 
+             source="scp.arguments"/>
+        <set property="current.scp.remote.dir" 
+             source="scp.remote.dir"/>
+        <set property="current.scp.local.dir" 
+             source="scp.local.dir"/>
+        
+        <!-- run the ssh command - it is expected that it will build 
+             everything -->
+        <exec executable="${ssh.executable}" failonerror="true">
+            <arg line="${current.ssh.arguments}"/>
+            <arg value="${current.ssh.command.build}"/>
+        </exec>
+        
+        <!-- run the scp command to copy the resulting file back to the 
+             host system -->
+        <mkdir dir="${current.scp.local.dir}"/>
+        <exec executable="${scp.executable}" failonerror="true">
+            <arg line="${current.scp.arguments}"/>
+            <arg value="${current.scp.remote.dir}/${current.native.dist.file}"/>
+            <arg value="${current.scp.local.dir}/${current.native.dist.file}"/>
+        </exec>
+        
+        <!-- run the ssh command - we need to clean after us -->
+        <exec executable="${ssh.executable}" failonerror="true">
+            <arg line="${current.ssh.arguments}"/>
+            <arg value="${current.ssh.command.clean}"/>
+        </exec>
+    </target>
+    
+    <!--
+      Builds the netbeans part of the project.
+      
+      It runs the 'jar' target on the netbeans project's build script.
+      
+      This target is only executed if the the ${build.nbproject} property was 
+      set to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-nbproject" if="do.build.nbproject">
+        <condition property="nb.jdk.home"
+                   value="${nb.platform.home}"
+                   else="${nb.platform.home.macos}">
+                <not>
+                    <equals arg1="Apple Inc." arg2="${java.vendor}"/>
+                </not>
+        </condition>
+
+        <exec executable="${ant.executable}" 
+              dir="${cvs.dir}/${nbproject.path}" 
+              failonerror="true"
+              failifexecutionfails="true"
+              errorproperty="error.property">
+            <env key="JAVA_HOME" value="${java.home}"/>
+            <arg value="clean"/>
+            <arg value="compile"/>
+            
+            <arg value="${nb.jdk.home}"/>
+            <arg value="${nb.ignore.native}"/>
+            <arg value="${nb.no.dependencies}"/>
+            <arg value="${nb.dont.build.custom.tasks}"/>
+            <arg value="${nb.custom.tasks.cls}"/>
+            <arg value="${nb.custom.parameter}"/>
+        </exec>
+        
+        <mkdir dir="${nbproject.dist.dir}"/>
+        
+        <jar manifest="${cvs.dir}/${nbproject.path}/${nbproject.manifest}" 
+             destfile="${nbproject.dist.dir}/${nbproject.dist.file.name}">
+            <fileset dir="${cvs.dir}/${nbproject.path}/build/classes">
+                <include name="**/*.*"/>
+            </fileset>
+        </jar>
+    </target>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed prior to building the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-build"/>
+    
+    <!--
+      An empty hook. 
+      
+      It must be overriden in derivative scripts, in order to implement custom
+      functionality required for the correctly building the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-build" depends=".build"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed after building the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-post-build"/>
+    
+    <!-- ============================================================================
+      Release
+    ============================================================================= -->
+    
+    <!--
+      Releases the project to the registries server.
+      
+      It is assumed that the project has already been built, but a dependency 
+      on the 'build' target is not defined, as it may be desirable to build 
+      once and then release several times to different registries servers.
+      
+      This is an aggregation target, it does not contain any functionality, but 
+      defines dependencies on '-pre-release', '-release' and '-post-release' 
+      targets. The '-pre-release' and '-post-release' target are empty hooks,
+      which allow derivative scripts to inject custom logic which will be 
+      executed prior to the release process or after it. The '-release' target 
+      contains the code which actually releases the project and should be 
+      overriden in the derivative scripts.
+    -->
+    <target name="release" depends="init,-pre-release,-release,-post-release"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed prior to releasing the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-release"/>
+    
+    <!--
+      An empty hook. 
+      
+      It must be overriden in derivative scripts, in order to implement custom
+      functionality required for the correctly releasing the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-release"/>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to inject custom logic which will be 
+      executed after releasing the project.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-post-release"/>
+    
+    <!-- ============================================================================
+      Default
+    ============================================================================= -->
+    
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            This build script is a targets library and must not be used 
+            directly.
+        </echo>
+    </target>
+</project>

+ 70 - 0
nbi/.common/engine.properties

@@ -0,0 +1,70 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+# whether to build native components or not; 'true'/'false'
+# * the engine has a bunch of native code dependencies, thus it is feasible to
+#   rebuild them every time
+build.native=true
+
+# whether to build the netbeans part of the project or not; 'true'/'false'
+# * essentially the engine IS a netbeans project, thus we should always build 
+#   it
+build.nbproject=true
+
+# dummy value for the custom parameter; which will be passed to the netbeans 
+# project build script; more sensible value is present in the base product 
+# build script
+nb.custom.parameter=-Dtrue=true
+
+# name of the distributive file for the netbeans project
+# * ${engine.dist.file.name} is expected to be defined in the derivative 
+#   instance build script
+nbproject.dist.file.name=${engine.dist.file.name}
+
+# path to the engine's distributive file; the file at this path would be 
+# considered the result of the build script and be copied to the distributives 
+# directory
+nbproject.dist.file=${nbproject.dist.dir}/${nbproject.dist.file.name}
+
+# names of the distributive files for the native jni libraries for the engine
+native.dist.file.windows=windows.dll
+native.dist.file.linux=linux.so
+native.dist.file.solaris-x86=solaris-x86.so
+native.dist.file.solaris-sparc=solaris-sparc.so
+native.dist.file.macosx=macosx.dylib

+ 324 - 0
nbi/.common/engine.xml

@@ -0,0 +1,324 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is the base build script for nbi engine. 
+  
+  It is not intended to be used directly, but to be imported into derivative
+  implementaion scripts, which will provide properties' values that are 
+  specific the concrete engine implementation. The derivative scripts may also
+  provide some additional functionality that is required by their respective
+  engine implementations.
+  
+  This script exposes five primary targets: 'init', 'clean', 'checkout', 
+  'build' and 'release'; as well as two aggregate targets: 'build-all', 
+  which tranlates into 'init', 'clean', 'checkout', 'build', and 
+  'release-all' - 'init', 'clean', 'checkout', 'build', 'release'. For the 
+  detailed description of the functionality of these targets, consult the 
+  corresponsing documentation.
+-->
+<project name="engine" default="usage" basedir=".">
+    <!-- a default value for the ${common.dir} property, which allows the user 
+         to see the usage information is he calls this script directly and not
+         via a derivative (which is the proper way to do this) -->
+    <property name="common.dir" value="${basedir}"/>
+    
+    <!-- import the common properties -->
+    <property file="${common.dir}/common.properties"/>
+    
+    <!-- import properties specific to the engine's build script -->
+    <property file="${common.dir}/engine.properties"/>
+    
+    <!-- import the common target library -->
+    <import file="common.xml" optional="false"/>
+    
+    <!-- ============================================================================
+      Initialization
+    ============================================================================= -->
+    
+    <!--
+      Initializes the engine's build script.
+      
+      This target overrides the '-init' target in common.xml, providing the 
+      custom functionality that is required for the engine's build script
+      initialization.
+      
+      In addition to the standard initialization routine, this target defines
+      several custom ant tasks, which are specific to the engine's build 
+      script.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-init" depends=".init">
+        <!-- define custom ant tasks -->
+        <if property="release.to.server" value="true">
+            <taskdef
+                name="release-engine-server"
+                classname="org.netbeans.installer.infra.build.ant.ReleaseEngine"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+        
+        <if property="release.to.server" value="false">
+            <taskdef 
+                name="release-engine-filesystem"
+                classname="org.netbeans.installer.infra.build.ant.registries.UpdateEngine"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+    </target>
+    
+    <!-- ============================================================================
+      Clean-up
+    ============================================================================= -->
+    
+    <!--
+      Cleans the current working directory and the distributives directory.
+      
+      This target overrides the '-clean' target in common.xml, providing the 
+      custom functionality that is required for correctly cleaning the engine.
+      
+      In addition to the standard behavior the engine distributive file is 
+      removed from the distributives directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-clean" depends=".clean">
+        <!-- remove the engine's distributive file from the distributives 
+             directory -->
+        <delete file="${dist.dir}/${engine.dist.file.name}"/>
+    </target>
+    
+    <!--
+      Cleans the native components of the engine.
+      
+      This target overrides the '.clean-native' target defined in common.xml,
+      as the engine's native components slightly differ from the defaults. 
+      Besides cleaning the jni libraries, the engine also needs to clean the 
+      native launcher stubs.
+      
+      This target is antcall'ed in a loop over the list of platforms from the 
+      '.clean' target in common.xml.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean-native" if="do.build.native">
+        <antcall target=".clean-jni"/>
+        <antcall target=".clean-launcher"/>
+    </target>
+    
+    <!--
+      Cleans the native launcher stub for the given platform.
+      
+      This target is antcall'ed as part of the call to the '.clean-native' 
+      target, and expects the ${platform} property to contain the code name of
+      the platform for which the launcher should be built.
+      
+      It simply removes the current launcher stub.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".clean-launcher" if="do.build.native">
+        <!-- does nothing at the moment -->
+    </target>
+    
+    <!-- ============================================================================
+      Check-out
+    ============================================================================= -->
+    
+    <!--
+      The functionality of the checkout procedure for the engine is indentical 
+      to the standard one, thus there is not need to override the '-checkout'
+      target, whosew default implementation is present in common.xml.
+    -->
+    
+    <!-- ============================================================================
+      Build
+    ============================================================================= -->
+    
+    <!--
+      Builds the engine and (optionally) its native components.
+      
+      This target overrides the '-build' target in common.xml, providing the 
+      custom functionality that is required for correctly building the engine.
+      
+      The build process consists of three steps: first, the native components 
+      of the engine (jni libraries and native launcher stubs) are built (if it
+      is required), then the engine's netbeans project is compiled and 
+      packaged, last the engine jar file is digitally signed and copied to the
+      distributives directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-build" depends=".build">
+        <!-- copy the built binary to the distributives directory -->
+        <copy file="${nbproject.dist.file}" todir="${dist.dir}"/>
+        
+        <!-- digitally sign the built binary -->
+	<if property="jarsigner.enabled" value="true">
+                <signjar jar="${dist.dir}/${engine.dist.file.name}" 
+                         keystore="${jarsigner.keystore}"
+                         storepass="${jarsigner.storepass}"
+                         alias="${jarsigner.alias}"
+                         maxmemory="${jarsigner.xmx}"/>
+	</if>
+    </target>
+    
+    <!--
+      Builds the native components of the engine.
+      
+      This target overrides the '.build-native' target defined in common.xml,
+      as the engine's native components slightly differ from the defaults. 
+      Besides building the jni libraries, the engine also needs to build the 
+      native launcher stubs, which will later be used to create redistributable 
+      bundles.
+      
+      This target is antcall'ed in a loop over the list of platforms from the 
+      '.build' target in common.xml.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-native" if="do.build.native">
+        <antcall target=".build-jni"/>
+        <antcall target=".build-launcher"/>
+        <antcall target=".build-cleaner"/>
+    </target>
+    
+    <!--
+      Builds the native launcher stub for the given platform.
+      
+      This target is antcall'ed as part of the call to the '.build-native' 
+      target, and expects the ${platform} property to contain the code name of
+      the platform for which the launcher should be built.
+      
+      It connects to the registered satellite machine for the current platform
+      using the 'ssh' utility, checks out the launcher's sources and builds it.
+      The built binary is then copied back to the host machine using 'scp'.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-launcher" if="do.build.native">
+        <!-- does nothing at the moment -->
+    </target>
+    
+    <!--
+      Builds the native cleaner for locked files for the given platform.
+      
+      This target is antcall'ed as part of the call to the '.build-native' 
+      target, and expects the ${platform} property to contain the code name of
+      the platform for which the launcher should be built.
+      
+      It connects to the registered satellite machine for the current platform
+      using the 'ssh' utility, checks out the launcher's sources and builds it.
+      The built binary is then copied back to the host machine using 'scp'.
+      
+      This target is only executed if the the ${build.native} property was set 
+      to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name=".build-cleaner" if="do.build.native">
+        <!-- does nothing at the moment -->
+    </target>
+    
+    
+    <!-- ============================================================================
+      Release
+    ============================================================================= -->
+    
+    <!--
+      Releases the engine to the registries server.
+      
+      This target overrides the '-release' target in common.xml, providing the 
+      custom functionality that is required for correctly releasing the engine.
+      
+      It is assumed that the engine has already been built, but a dependency 
+      on the 'build' target is not defined, as it may be desirable to build 
+      once and then release several times to different registries servers.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-release">
+        <if property="release.to.server" value="true">
+            <echo message="Release URL is ${release.url}"/>
+            <echo message="Archive is ${dist.dir}/${engine.dist.file.name}"/>
+            
+            <release-engine-server 
+                url="${release.url}"
+                archive="${dist.dir}/${engine.dist.file.name}"/>
+        </if>
+        <if property="release.to.server" value="false">
+            <echo message="Registry root is ${release.registry.dir}"/>
+            <echo message="Archive is ${dist.dir}/${engine.dist.file.name}"/>
+            
+            <release-engine-filesystem
+                root="${release.registry.dir}"
+                archive="${dist.dir}/${engine.dist.file.name}"/>
+        </if>
+    </target>
+    
+    <!-- ============================================================================
+      Default
+    ============================================================================= -->
+    
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            This is the base build script for nbi engine and is not intended to
+            be called directly. In order to create a derivative implementation 
+            script, see 
+            ${basedir}/.templates/engine-template.xml
+        </echo>
+    </target>
+</project>

+ 69 - 0
nbi/.common/group.properties

@@ -0,0 +1,69 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+# groups do not normally have any native components, thus there is no need to 
+# attempt to build anything native
+build.native=false
+
+# groups do not normally have any netbeans projects, thus there is no need to 
+# attempt to build any nbproject
+build.nbproject=false
+
+# various directories and file paths that will be used for packaging the 
+# group
+package.dir=${work.dir}/package
+
+package.descriptor.path=registry.xml
+
+group.path=groups/${group.uid}
+group.icon.path=${group.path}/icon.png
+
+group.dist.file.name=${group.uid}.jar
+
+# path to the group's icon; the contents of this file will be copied to the
+# file identified by ${group.icon.file}
+group.icon=${cvs.dir}/data/icon.png
+
+# path to the group's localizing bundle; the bundle is expected to contain
+# two properties: 'group.display.name' and 'group.description', which will be 
+# used in creating the registry entry for this group
+group.bundle=${cvs.dir}/data/Bundle
+
+# uri of the group's icon, which will appear in the registry
+group.icon.uri=resource:${group.icon.path}

+ 283 - 0
nbi/.common/group.xml

@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is the base build script for an nbi group package.
+  
+  It is not intended to be used directly, but to be imported into derivative
+  implementation scripts, which will provide properties' values that are 
+  specific the concrete group implementation. The derivative scripts may also
+  provide some additional functionality that is required by their respective
+  group implementations.
+  
+  This script exposes five primary targets: 'init', 'clean', 'checkout', 
+  'build' and 'release'; as well as two aggregate targets: 'build-all', 
+  which tranlates into 'init', 'clean', 'checkout', 'build', and 
+  'release-all' - 'init', 'clean', 'checkout', 'build', 'release'. For the 
+  detailed description of the functionality of these targets, consult the 
+  corresponding documentation.
+-->
+<project name="group" default="usage" basedir=".">
+    <!-- a default value for the ${common.dir} property, which allows the user 
+         to see the usage information is he calls this script directly and not
+         via a derivative (which is the proper way to do this) -->
+    <property name="common.dir" value="${basedir}"/>
+    
+    <!-- import the common properties -->
+    <property file="${common.dir}/common.properties"/>
+    
+    <!-- import properties specific to the group package's build script -->
+    <property file="${common.dir}/group.properties"/>
+    
+    <!-- import the common target library -->
+    <import file="common.xml" optional="false"/>
+    
+    <!-- ============================================================================
+      Initialization
+    ============================================================================= -->
+    
+    <!--
+      Initializes the group package's build script.
+      
+      This target overrides the '-init' target in common.xml, providing the 
+      custom functionality that is required for the group package's build 
+      script initialization.
+      
+      In addition to the standard initialization routine, this target defines
+      several custom ant tasks, which are specific to the group package's build 
+      script.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-init" depends=".init">
+        <!-- define custom ant tasks -->
+        <taskdef 
+            name="sizeof" 
+            classname="org.netbeans.installer.infra.build.ant.SizeOf" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="md5" 
+            classname="org.netbeans.installer.infra.build.ant.Md5" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="load-locales" 
+            classname="org.netbeans.installer.infra.build.ant.LoadLocales" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="group-descriptor" 
+            classname="org.netbeans.installer.infra.build.ant.GroupDescriptor" 
+            classpath="${custom.tasks.cls}"/>
+        
+        <if property="release.to.server" value="true">
+            <taskdef
+                name="release-package-server"
+                classname="org.netbeans.installer.infra.build.ant.ReleasePackage"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+        
+        <if property="release.to.server" value="false">
+            <taskdef 
+                name="release-package-filesystem"
+                classname="org.netbeans.installer.infra.build.ant.registries.AddPackage"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+    </target>
+    
+    <!-- ============================================================================
+      Clean-up
+    ============================================================================= -->
+    
+    <!--
+      Cleans the current working directory and the distributives directory.
+      
+      This target overrides the '-clean' target in common.xml, providing the 
+      custom functionality that is required for correctly cleaning the group 
+      package.
+      
+      In addition to the standard behavior the group package distributive file 
+      is removed from the distributives directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-clean" depends=".clean">
+        <!-- remove the group's distributive file from the distributives 
+             directory -->
+        <delete file="${dist.dir}/${group.dist.file.name}"/>
+    </target>
+    
+    <!-- ============================================================================
+      Check-out
+    ============================================================================= -->
+    
+    <!--
+      The functionality of the checkout procedure for the group package is 
+      indentical to the standard one, thus there is not need to override the 
+      '-checkout' target, whosew default implementation is present in 
+      common.xml.
+    -->
+    
+    <!-- ============================================================================
+      Build
+    ============================================================================= -->
+    
+    <!--
+      Builds the group package.
+      
+      This target overrides the '-build' target in common.xml, providing the 
+      custom functionality that is required for correctly building the group 
+      package.
+      
+      The build process for the grup package consists of four steps.
+      1) The group's icon is copied from its location to the group's package 
+         directory structure and some metadata is calculated
+      
+      2) The group's localizing bundle is loaded and the group package 
+         descriptor is generated
+      
+      3) The manifest for the group package is generated
+      
+      4) The package directory structure is jarred, digitally signed and moved 
+         to the distributives directory
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-build" depends=".build">
+        <!-- copy the group's icon to the soon-to-be package directory 
+             structure and calculate some metadata for it -->
+        <copy file="${group.icon}" 
+              tofile="${package.dir}/${group.icon.path}"/>
+        <sizeof file="${package.dir}/${group.icon.path}" 
+                property="group.icon.size"/>
+        <md5 file="${package.dir}/${group.icon.path}" 
+             property="group.icon.md5"/>
+        <set 
+            property="group.icon.correct.uri" 
+            value="${group.icon.uri}"/>
+        
+        <!-- load the group's localizing bundle and store the locales list to 
+             ${group.locales.list} -->
+        <load-locales basename="${group.bundle}" list="group.locales.list"/>
+        
+        <!-- generate the group package descriptor -->
+        <group-descriptor file="${package.dir}/${package.descriptor.path}"/>
+        
+        <!-- create the package jar file and sign it -->
+        <jar basedir="${package.dir}"
+             destfile="${work.dir}/${group.dist.file.name}" 
+             compress="true">
+            <manifest>
+                <attribute 
+                    name="Product-Descriptor" 
+                    value="${package.descriptor.path}"/>
+            </manifest>
+        </jar>
+        
+        <!-- copy the distributive to the distributives directory -->
+        <move file="${work.dir}/${group.dist.file.name}" 
+              todir="${dist.dir}"/>
+        <if property="jarsigner.enabled" value="true">
+            <signjar jar="${dist.dir}/${group.dist.file.name}" 
+                     keystore="${jarsigner.keystore}"
+                     storepass="${jarsigner.storepass}"
+                     alias="${jarsigner.alias}"
+                     maxmemory="${jarsigner.xmx}"/>
+	</if>
+    </target>
+    
+    <!-- ============================================================================
+      Release
+    ============================================================================= -->
+    
+    <!--
+      Releases the group package to the registries server.
+      
+      This target overrides the '-release' target in common.xml, providing the 
+      custom functionality that is required for correctly releasing the group 
+      package.
+      
+      It is assumed that the group package has already been built, but a 
+      dependency on the 'build' target is not defined, as it may be desirable 
+      to build once and then release several times to different registries 
+      servers.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-release">
+        <if property="release.to.server" value="true">
+            <echo message="Release URL is ${release.url}"/>
+            <echo message="Archive is ${dist.dir}/${group.dist.file.name}"/>
+            
+            <release-package-server
+                url="${release.url}"
+                registry="${release.registry}"
+                uid="${release.parent.uid}"
+                version="${release.parent.version}"
+                archive="${dist.dir}/${group.dist.file.name}"/>
+        </if>
+        <if property="release.to.server" value="false">
+            <echo message="Registry root is ${release.registry.dir}"/>
+            <echo message="Archive is ${dist.dir}/${group.dist.file.name}"/>
+            
+            <release-package-filesystem
+                root="${release.registry.dir}"
+                uid="${release.parent.uid}"
+                version="${release.parent.version}"
+                archive="${dist.dir}/${group.dist.file.name}"/>
+        </if>
+    </target>
+    
+    <!-- ============================================================================
+      Default
+    ============================================================================= -->
+    
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            This is the base build script for nbi group package and is not 
+            intended to be called directly. In order to create a derivative 
+            implementation script, see 
+            ${basedir}/.templates/group-template.xml
+        </echo>
+    </target>
+</project>

+ 111 - 0
nbi/.common/product.properties

@@ -0,0 +1,111 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+# whether to build native components or not; 'true'/'false'
+# * normally a product does not have any native components, thus 
+#   ${build.native} should be 'false' in most of the cases
+build.native=false
+
+# whether to build the netbeans part of the project or not; 'true'/'false'
+build.nbproject=true
+
+nbproject.dist.file.name=${product.uid},logic.jar
+
+# whether to build engine or not; 'true'/'false'
+build.engine=true
+
+# whether to repackage the installation data or not; 'true'/'false'/'default'
+# * if set to 'false' the data will be taken as it is (i.e. will be considered 
+#   as already packaged)
+# * if set to 'true' the data will be downloaded and packaged 
+# * if set to 'default' packaged data will be taken if it's available, 
+#   otherwise raw data will be downloaded and packaged
+package.data=default
+
+# whether the packaged data should be released (copied) to the local packaged
+# data repository; 'true'/'false'
+release.packaged.data=true
+
+# various properties controlling the engine's build process
+engine.dir=${common.dir}/../engine
+engine.work.dir=${work.dir}/.engine
+engine.dist.dir=${dist.dir}/.engine
+engine.dist.file.name=engine.jar
+
+# path to the distributive file of the engine; it will be used as the classpath 
+# for building the product's netbeans project
+# * if the ${build.engine} has been set to 'false', make sure that 
+#   ${engine.dist.file} points to a precompiled engine
+engine.dist.file=${engine.dist.dir}/${engine.dist.file.name}
+
+downloads.cache.dir=${packaged.data.dir}/.raw
+
+# various paths and file names that will be used for packaging the 
+# product
+package.dir=${work.dir}/package
+
+package.descriptor.path=registry.xml
+
+product.path=products/${product.uid}/${product.version}/${product.platforms}
+product.logic.path=${product.path}/logic
+product.data.path=${product.path}/data
+product.icon.path=${product.path}/icon.png
+
+product.icon.uri=resource:${product.icon.path}
+
+product.dist.file.name=${product.uid},${product.version},${product.platforms}.jar
+
+# name of the product's configuration logic jar with index ${i}
+product.logic.file.name=logic,${i}.jar
+product.data.file.name=data,${i}.jar
+
+# list of the locally cached pre-packaged data files
+# * the length of the list equals to ${product.data.length}
+# * ${packaged.data.dir} is the path to the local packaged data repository and
+#   is environment specific; it is expected to be passed in via the environment
+#   properties
+product.packaged.data.file=${packaged.data.dir}/${product.uid},${product.version},${product.platforms},${i}.jar
+product.packaged.data.properties.file=${packaged.data.dir}/${product.uid},${product.version},${product.platforms},${i}.jar.properties
+
+# product icon and the localizing bundle, which is expected to contain
+# display names and descriptions for all locales, supported by the product
+# * these are file paths as opposed to uris for configuration logic and
+#   installation data
+product.icon=${cvs.dir}/data/icon.png
+product.bundle=${cvs.dir}/data/Bundle

+ 746 - 0
nbi/.common/product.xml

@@ -0,0 +1,746 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is the base build script for an nbi product package.
+  
+  It is not intended to be used directly, but to be imported into derivative
+  implementation scripts, which will provide properties' values that are 
+  specific the concrete product implementation. The derivative scripts may also
+  provide some additional functionality that is required by their respective
+  product implementations.
+  
+  This script exposes five primary targets: 'init', 'clean', 'checkout', 
+  'build' and 'release'; as well as two aggregate targets: 'build-all', 
+  which tranlates into 'init', 'clean', 'checkout', 'build', and 
+  'release-all' - 'init', 'clean', 'checkout', 'build', 'release'. For the 
+  detailed description of the functionality of these targets, consult the 
+  corresponding documentation.
+-->
+<project name="product" default="usage" basedir=".">
+    <!-- a default value for the ${common.dir} property, which allows the user 
+         to see the usage information is he calls this script directly and not
+         via a derivative (which is the proper way to do this) -->
+    <property name="common.dir" value="${basedir}"/>
+    
+    <!-- import the common properties -->
+    <property file="${common.dir}/common.properties"/>
+    
+    <!-- import properties specific to the product package's build script -->
+    <property file="${common.dir}/product.properties"/>
+    
+    <!-- import the common target library -->
+    <import file="common.xml" optional="false"/>
+    
+    <!-- ============================================================================
+      Initialization
+    ============================================================================= -->
+    
+    <!--
+      Initializes the product package's build script.
+      
+      This target overrides the '-init' target in common.xml, providing the 
+      custom functionality that is required for the product package's build 
+      script initialization.
+      
+      In addition to the standard initialization routine, this target defines
+      several custom ant tasks, which are specific to the product package's build 
+      script.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-init" depends=".init">
+        <!-- define custom ant tasks -->
+        <taskdef 
+            name="sizeof" 
+            classname="org.netbeans.installer.infra.build.ant.SizeOf" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="md5" 
+            classname="org.netbeans.installer.infra.build.ant.Md5" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="sum"
+            classname="org.netbeans.installer.infra.build.ant.Sum"
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="package"
+            classname="org.netbeans.installer.infra.build.ant.Package"
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="load-locales" 
+            classname="org.netbeans.installer.infra.build.ant.LoadLocales" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef 
+            name="product-descriptor" 
+            classname="org.netbeans.installer.infra.build.ant.ProductDescriptor" 
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="absolutize"
+            classname="org.netbeans.installer.infra.build.ant.Absolutize"
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="uri-to-path"
+            classname="org.netbeans.installer.infra.build.ant.UriToPath"
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="n-unzip"
+            classname="org.netbeans.installer.infra.build.ant.NativeUnzip"
+            classpath="${custom.tasks.cls}"/>
+        <taskdef
+            name="n-untar"
+            classname="org.netbeans.installer.infra.build.ant.NativeUntar"
+            classpath="${custom.tasks.cls}"/>
+        
+        <if property="release.to.server" value="true">
+            <taskdef
+                name="release-package-server"
+                classname="org.netbeans.installer.infra.build.ant.ReleasePackage"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+        
+        <if property="release.to.server" value="false">
+            <taskdef 
+                name="release-package-filesystem"
+                classname="org.netbeans.installer.infra.build.ant.registries.AddPackage"
+                classpath="${custom.tasks.cls}"/>
+        </if>
+        
+        <!-- check whether the engine should be built -->
+        <condition property="do.build.engine">
+            <equals arg1="${build.engine}" arg2="true"/>
+        </condition>
+        
+        <!-- make the engine-related paths absolute -->
+        <absolutize property="engine.work.dir"/>
+        <absolutize property="engine.dist.dir"/>
+        
+        <absolutize property="engine.dist.file"/>
+        
+        <!-- define the javac.classpath for the netbeans project -->
+        <property 
+            name="nb.custom.parameter" 
+            value="-Djavac.classpath=${engine.dist.file}"/>
+    </target>
+    
+    <!-- ============================================================================
+      Clean-up
+    ============================================================================= -->
+    
+    <!--
+      Cleans the current working directory and the distributives directory.
+      
+      This target overrides the '-clean' target in common.xml, providing the 
+      custom functionality that is required for correctly cleaning the product 
+      package.
+      
+      In addition to the standard behavior the product package distributive file 
+      is removed from the distributives directory.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-clean" depends="-clean-engine,.clean">
+        <!-- remove the product's distributive file from the distributives 
+             directory -->
+        <delete file="${dist.dir}/${product.dist.file.name}"/>
+    </target>
+    
+    <!--
+      Cleans the engine.
+      
+      It runs the 'clean' target on the engine's build script.
+      
+      This target is only executed if the the ${build.engine} property was 
+      set to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-clean-engine" depends="init" if="do.build.engine">
+        <exec executable="${ant.executable}" 
+              dir="${engine.dir}" 
+              failonerror="false">
+            <env key="JAVA_HOME" value="${java.home}"/>
+            <arg value="clean"/>
+            
+            <arg value="-Dwork.dir=${engine.work.dir}"/>
+            <arg value="-Ddist.dir=${engine.dist.dir}"/>
+            
+            <arg value="-Dbuild.native=false"/>
+            
+            <arg value="-Ddont.build.custom.tasks=true"/>
+            <arg value="-Dcustom.tasks.cls=${custom.tasks.cls}"/>
+            
+            <arg value="-Dengine.dist.file.name=${engine.dist.file.name}"/>
+            
+            <arg value="-Denvironment.properties=${environment.properties}"/>
+        </exec>
+    </target>
+    
+    <!-- ============================================================================
+      Check-out
+    ============================================================================= -->
+    
+    <!--
+      The functionality of the checkout procedure for the product package is 
+      indentical to the standard one, thus there is not need to override the 
+      '-checkout' target, whosew default implementation is present in 
+      common.xml.
+    -->
+    
+    <!-- ============================================================================
+      Build
+    ============================================================================= -->
+    
+    <!--
+      Builds the product package.
+      
+      This target overrides the '-build' target in common.xml, providing the 
+      custom functionality that is required for correctly building the product 
+      package.
+      
+      The build process for the grup package consists of five steps.
+      1) The search-and-replace is run over the product's sources, based on the
+         [token] => [value] pairs defined in ${product.params.N.token} and
+         ${product.params.N.value}
+      
+      2) The product's icon is copied from its location to the product's package 
+         directory structure and some metadata is calculated
+      
+      3) The product's localizing bundle is loaded and the product package 
+         descriptor is generated
+      
+      4) The manifest for the product package is generated
+      
+      5) The package directory structure is jarred, digitally signed and moved 
+         to the distributives directory
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-build" depends="-build-engine,.build">
+        <!-- init the required disk space -->
+        <set property="product.disk.space" 
+             value="${product.disk.space.modificator}"/>
+        
+        <!-- init several shorthands -->
+        <set 
+            property="product.logic.dir" 
+            value="${package.dir}/${product.logic.path}"/>
+        <set 
+            property="product.data.dir" 
+            value="${package.dir}/${product.data.path}"/>
+        
+        <!-- some necessary mkdirs -->
+        <mkdir dir="${packaged.data.dir}"/>
+        <mkdir dir="${downloads.cache.dir}"/>
+        <mkdir dir="${product.logic.dir}"/>
+        <mkdir dir="${product.data.dir}"/>
+        
+        <!-- fetch the configuration logic jars; the first jar is handled 
+             separately, if the the ${build.nbproject} has been set to true - 
+             we don't need to fetch it, as we ca just copy -->
+        <if property="build.nbproject" value="true">
+            <set 
+                property="i" 
+                value="1"/>
+            <set 
+                property="current.file" 
+                value="${product.logic.dir}/${product.logic.file.name}"/>
+            
+            <copy 
+                file="${nbproject.dist.dir}/${nbproject.dist.file.name}"
+                tofile="${current.file}"/>
+            
+            <!-- sign the current jar file -->
+	    <if property="jarsigner.enabled" value="true">
+                <signjar jar="${current.file}" 
+                         keystore="${jarsigner.keystore}"
+                         storepass="${jarsigner.storepass}"
+                         alias="${jarsigner.alias}"
+                         maxmemory="${jarsigner.xmx}"/>
+             </if>
+            
+            <!-- calculate the metadata for the file -->
+            <sizeof file="${current.file}" property="product.logic.${i}.size"/>
+            <md5 file="${current.file}" property="product.logic.${i}.md5"/>
+            <set property="product.logic.${i}.correct.uri"
+                 value="resource:${product.logic.path}/${product.logic.file.name}"/>
+            
+            <property 
+                name="start.index" 
+                value="2"/>
+        </if>
+        <property name="start.index" value="1"/>
+        
+        <for-each from="${start.index}" 
+                  to="${product.logic.length}" 
+                  property="i">
+            <!-- set the properties relevant to the current file -->
+            
+            <set 
+                property="current.file" 
+                value="${product.logic.dir}/${product.logic.file.name}"/>
+
+            <condition property="product.logic.${i}.is.local" value="true" else="false">
+                <isset property="product.logic.${i}.path"/>
+            </condition>
+            
+            <if property="product.logic.${i}.is.local" value="false">
+                <set 
+                    property="current.uri" 
+                    source="product.logic.${i}.uri"/>
+                <get 
+                    src="${current.uri}" 
+                    dest="${current.file}" 
+                    usetimestamp="true"/>
+            </if>
+
+            <if property="product.logic.${i}.is.local" value="true">
+                <set 
+                    property="current.path" 
+                    source="product.logic.${i}.path"/>
+                <copy
+                    file="${current.path}" 
+                    tofile="${current.file}" 
+                    preservelastmodified="true"/>
+            </if>
+            
+            <!-- sign the current jar file -->
+	    <if property="jarsigner.enabled" value="true">
+                <signjar 
+                    jar="${current.file}" 
+                    keystore="${jarsigner.keystore}"
+                    storepass="${jarsigner.storepass}"
+                    alias="${jarsigner.alias}"
+                    maxmemory="${jarsigner.xmx}"/>
+            </if>
+            
+            <!-- calculate the metadata for the file -->
+            <sizeof 
+                file="${current.file}" 
+                property="product.logic.${i}.size"/>
+            <md5 
+                file="${current.file}" 
+                property="product.logic.${i}.md5"/>
+            <set 
+                property="product.logic.${i}.correct.uri"
+                value="resource:${product.logic.path}/${product.logic.file.name}"/>
+        </for-each>
+        
+        <!-- fetch and repackage installation data zips -->
+        <set property="current.product.data.length" 
+             value="${product.data.length}"/>
+
+        <for-each from="1" to="${current.product.data.length}" property="i">
+            <!-- define the path to the current working file and the temporary
+                 directory which should be used for repackaging -->
+            <set 
+                property="current.zip" 
+                value="${product.data.${i}.zip}"/>
+
+            <condition property="product.tar.${i}.is.set" value="true" else="false">
+		<isset property="product.data.${i}.tar"/>
+            </condition>
+
+            <if property="product.tar.${i}.is.set" value="true">
+                <set 
+                    property="current.tar" 
+                    value="${product.data.${i}.tar}"/>
+            </if>
+            <if property="product.tar.${i}.is.set" value="false">
+                <set 
+                    property="current.tar" 
+                    value="false"/>
+            </if>
+
+            <set 
+                property="current.file" 
+                value="${product.data.dir}/${product.data.file.name}"/>
+            <set 
+                property="current.temp.dir" 
+                value="${work.dir}/temp"/>
+            
+            <set 
+                property="current.packaged.data.file" 
+                value="${product.packaged.data.file}"/>
+            <set 
+                property="current.packaged.data.properties.file" 
+                value="${product.packaged.data.properties.file}"/>
+            
+            <condition property="do.package.data.${i}" value="true">
+                <or>
+                    <equals arg1="${package.data}" arg2="true"/>
+                    <and>
+                        <equals 
+                            arg1="${package.data}" 
+                            arg2="default"/>
+                        <not>
+                            <and>
+                                <available 
+                                    file="${current.packaged.data.file}"/>
+                                <available 
+                                    file="${current.packaged.data.properties.file}"/>
+                            </and>
+                        </not>
+                    </and>
+                </or>
+            </condition>
+            <condition property="do.package.data.${i}" value="false">
+                <or>
+                    <equals arg1="${package.data}" arg2="false"/>
+                    <and>
+                        <equals 
+                            arg1="${package.data}" 
+                            arg2="default"/>
+                        <available 
+                            file="${current.packaged.data.file}"/>
+                        <available 
+                            file="${current.packaged.data.properties.file}"/>
+                    </and>
+                </or>
+            </condition>
+            
+            <!-- if the data needs to be packaged -->
+            <if property="do.package.data.${i}" value="true">
+
+                <condition property="product.data.${i}.is.local" value="true" else="false">
+                    <isset property="product.data.${i}.path"/>
+                </condition>
+
+                <if property="product.data.${i}.is.local" value="false">               
+                    <set 
+                        property="current.uri" 
+                        source="product.data.${i}.uri"/>
+                    <uri-to-path 
+                        property="current.downloaded.path" 
+                        uri="${current.uri}"/>
+                    <set 
+                        property="current.download" 
+                        value="${downloads.cache.dir}/${current.downloaded.path}"/>
+               
+                    <dirname 
+                        property="current.download.${i}.dir" 
+                        file="${current.download}"/>
+                    <set 
+                        property="current.download.dir"
+                        source="current.download.${i}.dir"/>
+                    <mkdir 
+                        dir="${current.download.dir}"/>
+                    
+                    <get 
+                        src="${current.uri}" 
+                        dest="${current.download}"
+                        usetimestamp="true"/>
+                </if>
+
+                <if property="product.data.${i}.is.local" value="true">
+                    <set property="current.download"
+                         source="product.data.${i}.path"/>
+                </if>
+                
+                <!-- extract the zip file to a temporary directory, if it's a 
+                     zip file, or simply move it there if it is the data we 
+                     need -->
+                <mkdir 
+                    dir="${current.temp.dir}"/>
+                <if property="current.zip" value="true">
+                    <n-unzip
+                        src="${current.download}" 
+                        dest="${current.temp.dir}"/>
+                </if>
+
+                <if property="current.tar" value="true">
+                    <n-untar
+                        src="${current.download}" 
+                        dest="${current.temp.dir}"/>
+                </if>
+
+                <condition property="do.copy.data.${i}" value="true">
+		    <and>
+			<not>
+				<equals arg1="${current.zip}" arg2="true"/>
+			</not>
+			<not>
+				<equals arg1="${current.tar}" arg2="true"/>
+			</not>
+		    </and>
+                </condition>
+
+                <if property="do.copy.data.${i}" value="true">
+                    <copy file="${current.download}"
+                          todir="${current.temp.dir}"/>
+                </if>
+                
+                <!-- call the pre-package hook, to allow derivative scripts to 
+                     perform any required operations on the data if they 
+                     like -->
+                <antcall target="-pre-package">
+                    <param name="i" value="${i}"/>
+                    <param name="data.directory" value="${current.temp.dir}"/>
+                </antcall>
+                
+                <!-- measure its size and add it to the required disk space -->
+                <sizeof 
+                    file="${current.temp.dir}" 
+                    property="current.disk.space"/>
+                <sum 
+                    arg1="${product.disk.space}" 
+                    arg2="${current.disk.space}" 
+                    property="product.disk.space"/>
+                
+                <!-- repackage (pack200, jar) and build files list -->
+                <package 
+                    directory="${current.temp.dir}" 
+                    file="${current.file}"/>
+                
+                <!-- if we need to release the packaged data - copy the file 
+                     and the original size to the specified directory -->
+                <if property="release.packaged.data" value="true">
+                    <mkdir 
+                        dir="${packaged.data.dir}"/>
+                    
+                    <copy file="${current.file}" 
+                          tofile="${current.packaged.data.file}"/>
+                    <echo 
+                        message="product.data.${i}.size=${current.disk.space}" 
+                        file="${current.packaged.data.properties.file}"/>
+                </if>
+                
+                <!-- remove the temporary directory -->
+                <delete dir="${current.temp.dir}"/>
+            </if>
+            
+            <!-- if the data does not need to be packaged -->
+            <if property="do.package.data.${i}" value="false">
+                <copy 
+                    file="${current.packaged.data.file}" 
+                    tofile="${current.file}"/>                              
+                
+                <!-- fetch the real size data -->
+                <property 
+                    file="${current.packaged.data.properties.file}"/>
+                
+                <set 
+                    property="current.disk.space" 
+                    source="product.data.${i}.size"/>
+                <sum 
+                    arg1="${product.disk.space}" 
+                    arg2="${current.disk.space}" 
+                    property="product.disk.space"/>
+            </if>
+            
+            <!-- sign the resulting jar file -->
+            <if property="jarsigner.enabled" value="true">
+                <signjar 
+                    jar="${current.file}" 
+                    keystore="${jarsigner.keystore}"
+                    storepass="${jarsigner.storepass}"
+                    alias="${jarsigner.alias}"
+                    maxmemory="${jarsigner.xmx}"/>
+	    </if>
+            
+            <!-- calculate the metadata for the file -->
+            <sizeof 
+                file="${current.file}" 
+                property="product.data.${i}.size"/>
+            <md5 
+                file="${current.file}" 
+                property="product.data.${i}.md5"/>
+            <set 
+                property="product.data.${i}.correct.uri"
+                value="resource:${product.data.path}/${product.data.file.name}"/>
+        </for-each>
+        
+        <!-- fetch the icon -->
+        <set 
+            property="product.icon.file" 
+            value="${package.dir}/${product.icon.path}"/>
+        
+        <copy 
+            file="${product.icon}" 
+            tofile="${product.icon.file}"/>
+        <sizeof 
+            file="${product.icon.file}" 
+            property="product.icon.size"/>
+        <md5 
+            file="${product.icon.file}" 
+            property="product.icon.md5"/>
+        <set 
+            property="product.icon.correct.uri" 
+            value="${product.icon.uri}"/>
+        
+        <!-- load product's localizing bundle and generate descriptor -->
+        <load-locales 
+            basename="${product.bundle}" 
+            list="product.locales.list"/>
+        <product-descriptor 
+            file="${package.dir}/${package.descriptor.path}"/>
+        
+        <!-- create the distributive jar file and sign it -->
+        <set 
+            property="product.dist.file" 
+            value="${dist.dir}/${product.dist.file.name}"/>
+        
+        <jar basedir="${package.dir}"
+             destfile="${product.dist.file}" 
+             compress="true">
+            <manifest>
+                <attribute 
+                    name="Product-Descriptor" 
+                    value="${package.descriptor.path}"/>
+            </manifest>
+        </jar>
+        <if property="jarsigner.enabled" value="true">
+            <signjar 
+                jar="${product.dist.file}" 
+                keystore="${jarsigner.keystore}"
+                storepass="${jarsigner.storepass}"
+                alias="${jarsigner.alias}"
+                maxmemory="${jarsigner.xmx}"/>
+	</if>
+    </target>
+    
+    <!--
+      Builds the engine.
+      
+      It runs the 'build-all' target on the engine's build script.
+      
+      This target is only executed if the the ${build.engine} property was 
+      set to 'true'.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-build-engine" depends="init" if="do.build.engine">
+        <exec executable="${ant.executable}" 
+              dir="${engine.dir}" 
+              failonerror="true"
+              failifexecutionfails="true">
+            <arg value="checkout,build"/>
+            
+            <arg value="-Dwork.dir=${engine.work.dir}"/>
+            <arg value="-Ddist.dir=${engine.dist.dir}"/>
+            
+            <arg value="-Dbuild.native=false"/>
+            
+            <arg value="-Ddont.build.custom.tasks=true"/>
+            <arg value="-Dcustom.tasks.cls=${custom.tasks.cls}"/>
+            
+            <arg value="-Dengine.dist.file.name=${engine.dist.file.name}"/>
+            
+            <arg value="-Denvironment.properties=${environment.properties}"/>
+        </exec>
+    </target>
+    
+    <!--
+      An empty hook. 
+      
+      It allows derivative scripts to perform arbitrary manipulations on the 
+      data prior to it getting packaged. E.g. the netbeans ide build script 
+      might want to remove the 'netbeans' directory and move its contents up one
+      level.
+      
+      A special property - 'data.directory' will be set pointing to the 
+      unzipped data.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-pre-package"/>
+    
+    <!-- ============================================================================
+      Release
+    ============================================================================= -->
+    
+    <!--
+      Releases the product package to the registries server.
+      
+      This target overrides the '-release' target in common.xml, providing the 
+      custom functionality that is required for correctly releasing the product 
+      package.
+      
+      It is assumed that the product package has already been built, but a 
+      dependency on the 'build' target is not defined, as it may be desirable 
+      to build once and then release several times to different registries 
+      servers.
+      
+      This target is not intended to be called directly.
+    -->
+    <target name="-release">
+        <if property="release.to.server" value="true">
+            <echo message="Release URL is ${release.url}"/>
+            <echo message="Archive is ${product.dist.file}"/>
+            
+            <release-package-server 
+                url="${release.url}"
+                registry="${release.registry}"
+                uid="${release.parent.uid}"
+                version="${release.parent.version}"
+                platforms="${product.platforms}"
+                archive="${product.dist.file}"/>
+        </if>
+        <if property="release.to.server" value="false">
+            <echo message="Registry root is ${release.registry.dir}"/>
+            <echo message="Archive is ${product.dist.file}"/>
+            
+            <release-package-filesystem
+                root="${release.registry.dir}"
+                uid="${release.parent.uid}"
+                version="${release.parent.version}"
+                platforms="${product.platforms}"
+                archive="${product.dist.file}"/>
+        </if>
+    </target>
+    
+    <!-- ============================================================================
+      Default
+    ============================================================================= -->
+    
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            This is the base build script for nbi product package and is not 
+            intended to be called directly. In order to create a derivative 
+            implementation script, see 
+            ${basedir}/.templates/product-template.xml
+        </echo>
+    </target>
+</project>

BIN
nbi/antlib/nbi-ant-tasks.jar


BIN
nbi/antlib/nbi-engine.jar


BIN
nbi/antlib/nbi-registries-management.jar


+ 49 - 0
nbi/stub/build.properties

@@ -0,0 +1,49 @@
+# 
+# The contents of this file are subject to the terms of the Common Development and
+# Distribution License (the License). You may not use this file except in compliance
+# with the License.
+# 
+# You can obtain a copy of the License at http://www.netbeans.org/cddl.html or
+# http://www.netbeans.org/cddl.txt.
+# 
+# When distributing Covered Code, include this CDDL Header Notice in each file and
+# include the License file at http://www.netbeans.org/cddl.txt. If applicable, add
+# the following below the CDDL Header, with the fields enclosed by brackets []
+# replaced by your own identifying information:
+# 
+#     "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+
+output.dir=${basedir}/build
+jarsigner.enabled=false
+pack200.enabled={pack200.enabled}
+core.module.name=nbi
+ext.module.name=ext
+    
+nbi.all.dir=${basedir}/nbi_all
+nbi.core.dir=${nbi.all.dir}/${core.module.name}
+nbi.ext.dir=${nbi.all.dir}/${ext.module.name}
+    
+temp.file=${nbi.all.dir}/temp.ant.tmp
+environment.properties=${nbi.all.dir}/environment.properties
+
+context.path.token=/nbi/dev
+context.path.replacement=${context.path}
+
+context.dir.token=ROOT = new File\\(".*?"\\);
+context.dir.replacement=ROOT = new File\\("${context.dir}"\);
+
+custom.tasks.cls={nbi.ant.tasks.jar}${path.separator}{nbi.registries.management.jar}${path.separator}{nbi.engine.jar}
+nbi.engine.jar={nbi.engine.jar}
+
+jdk.home={generator-jdk-location-forward-slashes}
+bundles.release.dir={generated-installers-location-forward-slashes}
+bundle.files.prefix={generated-installers-prefix}
+
+target.platforms={product-platforms}
+main.product.uid={product-uid}
+main.product.version={product-version}

+ 203 - 0
nbi/stub/build.xml

@@ -0,0 +1,203 @@
+<project name="build installers" default="build" basedir=".">
+    <property file="${basedir}/build.properties"/>
+    <property file="${basedir}/custom.properties"/>
+    
+    <target name="build" depends="init,-build,-generate-bundles,post-build"/>
+    
+    <target name="init" depends="-clean,-checkout,-init,-init-properties,-post-init-clean"/>
+
+    <target name="-clean-cvs" unless="no.checkout">
+        <delete dir="${nbi.all.dir}"/>
+    </target>
+    
+    <target name="-clean" depends="-clean-cvs" unless="no.clean">
+        <delete dir="${output.dir}"/>
+        <delete dir="${nbi.ext.dir}/products/helloworld/build"/>
+        <delete dir="${nbi.ext.dir}/products/helloworld/dist"/>
+        <delete dir="${nbi.ext.dir}/engine/build"/>
+        <delete dir="${nbi.ext.dir}/engine/dist"/>
+
+        <!--<delete dir="${basedir}/cache"/>-->
+    </target>
+
+    <target name="post-build">
+        <delete dir="${output.dir}/registry-temp"/>
+    </target>
+    
+    <target name="-checkout">
+        
+        <copy todir="${nbi.all.dir}/.common">
+            <fileset dir="${basedir}/.common"/>
+        </copy>
+
+        <copy todir="${nbi.ext.dir}">
+            <fileset dir="${basedir}/ext">
+            </fileset>
+        </copy>
+    </target>
+
+    <target name="-init">
+        <taskdef 
+            name="if" 
+            classpath="${custom.tasks.cls}" 
+            classname="org.netbeans.installer.infra.build.ant.If"/>
+        <taskdef 
+            name="for-each" 
+            classpath="${custom.tasks.cls}" 
+            classname="org.netbeans.installer.infra.build.ant.ForEach"/>
+        <taskdef 
+            name="set" 
+            classpath="${custom.tasks.cls}" 
+            classname="org.netbeans.installer.infra.build.ant.SetProperty"/>
+
+        <taskdef 
+            name="create-bundle" 
+            classpath="${custom.tasks.cls}" 
+            classname="org.netbeans.installer.infra.build.ant.registries.CreateBundle"/>
+        
+        <delete file="${temp.file}"/>
+    </target>
+    
+    <target name="-init-properties">
+        <echo file="${nbi.all.dir}/environment.tmp" encoding="utf-8">
+checkout.sources=false
+sources.dir=${nbi.all.dir}
+cvs.module=ext
+
+release.to.server=false
+release.registry.dir=${output.dir}/registry-temp
+
+dont.build.custom.tasks=true
+custom.tasks.cls=${custom.tasks.cls}
+
+build.engine=false
+
+engine.dist.file.name=nbi-engine.jar
+engine.dist.file=${nbi.core.dir}/infra/build/engine/dist/nbi-engine.jar
+
+packaged.data.dir=${basedir}/cache/packaged
+downloads.cache.dir=${basedir}/cache/raw
+
+jarsigner.enabled=${jarsigner.enabled}
+        </echo>
+        <replace file="${nbi.all.dir}/environment.tmp" token="\" value="/" encoding="utf-8"/>
+        <native2ascii src="${nbi.all.dir}" dest="${nbi.all.dir}" encoding="utf-8" includes="environment.tmp" ext=".properties"/>
+    </target>
+    
+    <target name="-post-init-clean">
+        <delete dir="${basedir}/cache/raw"/>
+    </target>
+    
+    <target name="-build">
+        <delete dir="${output.dir}"/>
+        
+        <mkdir dir="${output.dir}"/>
+        <mkdir dir="${bundles.release.dir}"/>
+        <mkdir dir="${output.dir}/components"/>
+        
+        <property name="engine.dist.file.name" value="nbi-engine.jar"/>
+
+        <echo message="BUILDING HELLOWORLD EXT ENGINE =================================="/>
+        <ant dir="${nbi.ext.dir}/infra/build/engine" target="release-all">
+            <property 
+                name="basedir" 
+                value="${nbi.ext.dir}/infra/build/engine"/>
+            <property 
+                name="environment.properties" 
+                value="${environment.properties}"/>
+            
+            <property 
+                name="core.engine.dist.file" 
+                value="${nbi.engine.jar}"/>
+        </ant>
+
+
+	<echo message="BUILDING HELLOWORLD PRODUCT =================================="/>
+        <ant dir="${nbi.ext.dir}/infra/build/products/helloworld" target="release-all">
+            <property 
+                name="basedir" 
+                value="${nbi.ext.dir}/infra/build/products/helloworld"/>
+            <property 
+                name="environment.properties" 
+                value="${environment.properties}"/>
+            <property
+                name="dist.dir"
+                value="${output.dir}/components"/>
+
+            <property
+                name="release.parent.uid"
+                value=""/>
+            <property
+                name="release.parent.version"
+                value=""/>
+            <property
+                name="release.parent.platforms"
+                value=""/>
+
+            <property 
+                name="engine.dist.file" 
+                value="${output.dir}/registry-temp/engine.jar"/>
+
+
+        </ant>
+    </target>
+
+    <target name="-generate-bundles">
+        <for-each property="platform" list="${target.platforms}" separator=" ">
+
+            <condition property="bundle.extention.${platform}" value="exe">
+                 <contains string="${platform}" substring="windows"/>
+            </condition>
+            <condition property="bundle.extention.${platform}" value="sh">
+                 <or>
+                     <contains string="${platform}" substring="linux"/>
+                     <contains string="${platform}" substring="solaris"/>
+                 </or>
+            </condition>
+            <condition property="bundle.extention.${platform}" value="zip">
+                 <contains string="${platform}" substring="macosx"/>
+            </condition>
+
+            <set property="bundle.extention" source="bundle.extention.${platform}"/>
+
+            <create-bundle root="${output.dir}/registry-temp" 
+                       platform="${platform}" 
+                       target="${bundles.release.dir}/${bundle.files.prefix}-${platform}.${bundle.extention}">
+                <!--normen-->
+                <component uid="${main.product.uid}" version="${main.product.version}"/><!--0.8.0.0.0-->
+            </create-bundle>
+            <if property="bundle.extention" value="zip">
+                <antcall target="zip-to-tgz">
+                    <param name="input.file"  value="${bundles.release.dir}/${bundle.files.prefix}-${platform}.zip"/>
+                    <param name="output.file" value="${bundles.release.dir}/${bundle.files.prefix}-${platform}.tgz"/>
+                </antcall>
+	        <delete file="${bundles.release.dir}/${bundle.files.prefix}-${platform}.zip"/>
+            </if>
+        </for-each>
+        <echo>Installer(s) for [${target.platforms}] are available at ${bundles.release.dir}</echo>
+    </target>
+
+    <target name="zip-to-tgz">
+	<set property="tar.tmpdir"
+             value="${bundles.release.dir}/tempdir"/>
+
+	<mkdir dir="${tar.tmpdir}"/>
+
+	<unzip 
+		src="${input.file}"
+		dest="${tar.tmpdir}"/>
+
+        <tar tarfile="${output.file}" 
+             compression="gzip">
+            <tarfileset dir="${tar.tmpdir}" mode="644">
+                <include name="**/*.*"/>
+		<exclude name="**/executable"/>
+            </tarfileset>
+	    <tarfileset dir="${tar.tmpdir}" mode="755">
+		<include name="**/executable"/>
+            </tarfileset>
+        </tar>
+	<delete dir="${tar.tmpdir}"/>
+    </target>
+
+</project>

+ 74 - 0
nbi/stub/ext/components/products/helloworld/build.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="helloworld" default="default" basedir=".">
+    <description>Builds, tests, and runs the project helloworld.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties
+      -post-init:                called after initialization of project properties
+      -pre-compile:              called before javac compilation
+      -post-compile:             called after javac compilation
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-jar:                  called before JAR building
+      -post-jar:                 called after JAR building
+      -post-clean:               called after cleaning build products
+
+    (Targets beginning with '-' are not intended to be called on their own.)
+
+    Example of inserting an obfuscator after compilation could look like this:
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Another way to customize the build is by overriding existing main targets.
+    The targets of interest are: 
+
+      -init-macrodef-javac:     defines macro for javac compilation
+      -init-macrodef-junit:     defines macro for junit execution
+      -init-macrodef-debug:     defines macro for class debugging
+      -init-macrodef-java:      defines macro for class execution
+      -do-jar-with-manifest:    JAR building (if you are using a manifest)
+      -do-jar-without-manifest: JAR building (if you are not using a manifest)
+      run:                      execution of project 
+      -javadoc-build:           Javadoc generation
+      test-report:              JUnit report generation
+
+    An example of overriding the target for project execution could look like this:
+
+        <target name="run" depends="helloworld-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that the overridden target depends on the jar target and not only on 
+    the compile target as the regular run target does. Again, for a list of available 
+    properties which you can use, check the target you are overriding in the
+    nbproject/build-impl.xml file. 
+
+    -->
+</project>

+ 41 - 0
nbi/stub/ext/components/products/helloworld/data/Bundle.properties

@@ -0,0 +1,41 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+product.display.name={product-name}
+product.description={product-description}

BIN
nbi/stub/ext/components/products/helloworld/data/icon.png


BIN
nbi/stub/ext/components/products/helloworld/data/icon48.png


+ 1 - 0
nbi/stub/ext/components/products/helloworld/manifest.mf

@@ -0,0 +1 @@
+Configuration-Logic-Class: org.mycompany.ConfigurationLogic

+ 631 - 0
nbi/stub/ext/components/products/helloworld/nbproject/build-impl.xml

@@ -0,0 +1,631 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - junit compilation
+  - junit execution
+  - junit debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject2="http://www.netbeans.org/ns/j2se-project/2" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="helloworld-impl">
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="libs.CopyLibs.classpath"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
+            <and>
+                <isset property="jaxws.endorsed.dir"/>
+                <available file="nbproject/jaxws-build.xml"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-javac">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="" name="sourcepath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="," property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <delete>
+                    <files includes="${javac.includes.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-junit">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <sequential>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="dt_socket">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.includes}*.class"/>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="${run.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target depends="init" name="deps-jar" unless="no.deps">
+        <ant antfile="${project.Core_NBI_Engine}/build.xml" inheritall="false" target="jar"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <j2seproject3:depend/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+            <manifest>
+                <attribute name="Main-Class" value="${main.class}"/>
+                <attribute name="Class-Path" value="${jar.classpath}"/>
+            </manifest>
+        </copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+        </javadoc>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                JUNIT COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                JUNIT EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:junit testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:junit excludes="" includes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <!--
+                =======================
+                JUNIT DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+        <delete file="${test.report.file}"/>
+        <mkdir dir="${build.test.results.dir}"/>
+        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+            <customize>
+                <syspropertyset>
+                    <propertyref prefix="test-sys-prop."/>
+                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                </syspropertyset>
+                <arg value="${test.class}"/>
+                <arg value="showoutput=true"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target depends="init" name="deps-clean" unless="no.deps">
+        <ant antfile="${project.Core_NBI_Engine}/build.xml" inheritall="false" target="clean"/>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+</project>

+ 8 - 0
nbi/stub/ext/components/products/helloworld/nbproject/genfiles.properties

@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b5c7f54a
+build.xml.script.CRC32=16bbb630
+build.xml.stylesheet.CRC32=be360661
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b5c7f54a
+nbproject/build-impl.xml.script.CRC32=815f74ea
+nbproject/build-impl.xml.stylesheet.CRC32=f1d9da08

+ 4 - 0
nbi/stub/ext/components/products/helloworld/nbproject/private/private.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+    <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>

+ 62 - 0
nbi/stub/ext/components/products/helloworld/nbproject/project.properties

@@ -0,0 +1,62 @@
+application.title=helloworld
+application.vendor=dlm198383
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/helloworld.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${reference.Core_NBI_Engine.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit.classpath}:\
+    ${libs.junit_4.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+project.Core_NBI_Engine=../../../../nbi/engine
+reference.Core_NBI_Engine.jar=${project.Core_NBI_Engine}/dist/nbi-engine.jar
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test

+ 26 - 0
nbi/stub/ext/components/products/helloworld/nbproject/project.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>helloworld</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+        <references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
+            <reference>
+                <foreign-project>Core_NBI_Engine</foreign-project>
+                <artifact-type>jar</artifact-type>
+                <script>build.xml</script>
+                <target>jar</target>
+                <clean-target>clean</clean-target>
+                <id>jar</id>
+            </reference>
+        </references>
+    </configuration>
+</project>

+ 22 - 0
nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties

@@ -0,0 +1,22 @@
+CL.app.name={product-simple-name}
+CL.desktop.shortcut.name={product-name}
+CL.desktop.shortcut.description=
+CL.desktop.shortcut.path=
+CL.unix.icon.name={product-icon-name}
+CL.unix.icon.resource=org/mycompany/{product-icon-name}
+
+
+CL.start.menu.shortcut.name={product-name}
+CL.start.menu.shortcut.name.macosx={product-name}
+CL.start.menu.shortcut.description=
+CL.start.menu.shortcut.path=
+
+CL.install.desktop=Creating shortcut on desktop
+CL.install.start.menu=Creating shortcut in start menu
+CL.uninstall.start.menu=Removing Start Menu entries
+CL.uninstall.desktop=Removing desktop shortcut
+CL.uninstall.remove.userdir=Removing {product-name} userdir
+
+CL.uninstall.error.start.menu=Cannot remove desktop shortcut
+CL.uninstall.error.desktop=Cannot remove Start Menu entries
+

+ 451 - 0
nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java

@@ -0,0 +1,451 @@
+package org.mycompany;
+
+import java.util.List;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.Map;
+import org.mycompany.wizard.panels.HelloWorldPanel;
+import org.mycompany.installer.utils.applications.NetBeansRCPUtils;
+import org.netbeans.installer.product.components.ProductConfigurationLogic;
+import org.netbeans.installer.product.components.Product;
+import org.netbeans.installer.utils.FileUtils;
+import org.netbeans.installer.utils.helper.RemovalMode;
+import org.netbeans.installer.utils.exceptions.InitializationException;
+import org.netbeans.installer.utils.exceptions.InstallationException;
+import org.netbeans.installer.utils.exceptions.UninstallationException;
+import org.netbeans.installer.utils.progress.Progress;
+import org.netbeans.installer.utils.system.shortcut.FileShortcut;
+import org.netbeans.installer.utils.system.shortcut.LocationType;
+import org.netbeans.installer.utils.system.shortcut.Shortcut;
+import org.netbeans.installer.utils.SystemUtils;
+import org.netbeans.installer.utils.LogManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StreamUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.exceptions.NativeException;
+import org.netbeans.installer.wizard.Wizard;
+import org.netbeans.installer.wizard.components.WizardComponent;
+
+public class ConfigurationLogic extends ProductConfigurationLogic {
+
+    private List<WizardComponent> wizardComponents;
+
+    // constructor //////////////////////////////////////////////////////////////////
+    public ConfigurationLogic() throws InitializationException {
+        wizardComponents = Wizard.loadWizardComponents(
+                WIZARD_COMPONENTS_URI,
+                getClass().getClassLoader());
+    }
+
+    public List<WizardComponent> getWizardComponents() {
+        return wizardComponents;
+    }
+
+    @Override
+    public boolean allowModifyMode() {
+        return false;
+    }
+
+    @Override
+    public void install(Progress progress) throws InstallationException {
+        final Product product = getProduct();
+        final File installLocation = product.getInstallationLocation();
+        //final FilesList filesList = product.getInstalledFiles();
+        String appName=ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name");
+
+        if (SystemUtils.isMacOS()) {
+            //normen: use parent folder of install dir for icon
+            File f = new File(installLocation.getParentFile(), ICON_MACOSX);
+            if(!f.exists()) {
+                try {
+                FileUtils.writeFile(f,
+                        ResourceUtils.getResource(ICON_MACOSX_RESOURCE,
+                        getClass().getClassLoader()));
+                getProduct().getInstalledFiles().add(f);
+                } catch (IOException e) {
+                    LogManager.log(
+                                "... cannot handle icns icon " + f, e); // NOI18N
+                }
+            }
+
+            //normen: rename executable
+            File shortcut=new File(installLocation.getParentFile().getParent()+"/MacOS/executable");
+            if(shortcut.exists()){
+                shortcut.renameTo(new File(installLocation.getParentFile().getParent()+"/MacOS/"+appName));
+            }
+
+            //normen: replace icon + app in Info.plist
+            try {
+                File plist=new File(installLocation.getParentFile().getParentFile(),"Info.plist");
+                FileUtils.modifyFile(plist, "icon.icns", appName+".icns");
+                FileUtils.modifyFile(plist, "executable", appName);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+
+        if (Boolean.parseBoolean(getProperty(HelloWorldPanel.CREATE_DESKTOP_SHORTCUT_PROPERTY))) {
+            LogManager.logIndent(
+                    "creating the desktop shortcut for the application"); // NOI18N
+            if (!SystemUtils.isMacOS()) {
+                try {
+                    progress.setDetail(getString("CL.install.desktop")); // NOI18N
+
+                    if (SystemUtils.isCurrentUserAdmin()) {
+                        LogManager.log(
+                                "... current user is an administrator " + // NOI18N
+                                "-- creating the shortcut for all users"); // NOI18N
+
+                        SystemUtils.createShortcut(
+                                getDesktopShortcut(installLocation),
+                                LocationType.ALL_USERS_DESKTOP);
+
+                        product.setProperty(
+                                DESKTOP_SHORTCUT_LOCATION_PROPERTY,
+                                ALL_USERS_PROPERTY_VALUE);
+                    } else {
+                        LogManager.log(
+                                "... current user is an ordinary user " + // NOI18N
+                                "-- creating the shortcut for the current " + // NOI18N
+                                "user only"); // NOI18N
+
+                        SystemUtils.createShortcut(
+                                getDesktopShortcut(installLocation),
+                                LocationType.CURRENT_USER_DESKTOP);
+
+                        getProduct().setProperty(
+                                DESKTOP_SHORTCUT_LOCATION_PROPERTY,
+                                CURRENT_USER_PROPERTY_VALUE);
+                    }
+                } catch (NativeException e) {
+                    LogManager.unindent();
+
+                    LogManager.log(
+                            getString("CL.install.error.desktop"), // NOI18N
+                            e);
+                }
+            } else {
+                LogManager.log(
+                        "... skipping this step as we're on Mac OS"); // NOI18N
+            }
+        }
+        LogManager.logUnindent(
+                "... done"); // NOI18N
+
+        /////////////////////////////////////////////
+        // create start menu shortcut
+        if (Boolean.parseBoolean(getProperty(HelloWorldPanel.CREATE_START_MENU_SHORTCUT_PROPERTY))) {
+            LogManager.logIndent(
+                    "creating the start menu shortcut for the application"); // NOI18N
+            try {
+                progress.setDetail(getString("CL.install.start.menu")); // NOI18N
+
+                if (SystemUtils.isCurrentUserAdmin()) {
+                    LogManager.log(
+                            "... current user is an administrator " + // NOI18N
+                            "-- creating the shortcut for all users"); // NOI18N
+
+                    SystemUtils.createShortcut(
+                            getStartMenuShortcut(installLocation),
+                            LocationType.ALL_USERS_START_MENU);
+
+                    getProduct().setProperty(
+                            START_MENU_SHORTCUT_LOCATION_PROPERTY,
+                            ALL_USERS_PROPERTY_VALUE);
+                } else {
+                    LogManager.log(
+                            "... current user is an ordinary user " + // NOI18N
+                            "-- creating the shortcut for the current " + // NOI18N
+                            "user only"); // NOI18N
+
+                    SystemUtils.createShortcut(
+                            getStartMenuShortcut(installLocation),
+                            LocationType.CURRENT_USER_START_MENU);
+
+                    getProduct().setProperty(
+                            START_MENU_SHORTCUT_LOCATION_PROPERTY,
+                            CURRENT_USER_PROPERTY_VALUE);
+                }
+            } catch (NativeException e) {
+                LogManager.log(
+                        getString("CL.install.error.start.menu"), // NOI18N
+                        e);
+            }
+            LogManager.logUnindent(
+                    "... done"); // NOI18N
+        }
+
+    }
+
+    @Override
+    public void uninstall(Progress progress) throws UninstallationException {
+        final Product product = getProduct();
+        final File installLocation = product.getInstallationLocation();
+
+        //NetBeansUtils.warnNetbeansRunning(installLocation);
+        /////////////////////////////////////////////////////////////////////////////
+        if (Boolean.parseBoolean(getProperty(HelloWorldPanel.CREATE_START_MENU_SHORTCUT_PROPERTY))) {
+            try {
+                progress.setDetail(getString("CL.uninstall.start.menu")); // NOI18N
+
+                final String shortcutLocation =
+                        getProduct().getProperty(START_MENU_SHORTCUT_LOCATION_PROPERTY);
+
+                if ((shortcutLocation == null)
+                        || shortcutLocation.equals(CURRENT_USER_PROPERTY_VALUE)) {
+                    SystemUtils.removeShortcut(
+                            getStartMenuShortcut(installLocation),
+                            LocationType.CURRENT_USER_START_MENU,
+                            true);
+                } else {
+                    SystemUtils.removeShortcut(
+                            getStartMenuShortcut(installLocation),
+                            LocationType.ALL_USERS_START_MENU,
+                            true);
+                }
+            } catch (NativeException e) {
+                LogManager.log(
+                        getString("CL.uninstall.error.start.menu"), // NOI18N
+                        e);
+            }
+        }
+
+        /////////////////////////////////////////////////////////////////////////////
+        if (Boolean.parseBoolean(getProperty(HelloWorldPanel.CREATE_DESKTOP_SHORTCUT_PROPERTY))) {
+            if (!SystemUtils.isMacOS()) {
+                try {
+                    progress.setDetail(getString("CL.uninstall.desktop")); // NOI18N
+
+                    final String shortcutLocation = getProduct().getProperty(
+                            DESKTOP_SHORTCUT_LOCATION_PROPERTY);
+
+                    if ((shortcutLocation == null)
+                            || shortcutLocation.equals(CURRENT_USER_PROPERTY_VALUE)) {
+                        SystemUtils.removeShortcut(
+                                getDesktopShortcut(installLocation),
+                                LocationType.CURRENT_USER_DESKTOP,
+                                false);
+                    } else {
+                        SystemUtils.removeShortcut(
+                                getDesktopShortcut(installLocation),
+                                LocationType.ALL_USERS_DESKTOP,
+                                false);
+                    }
+                } catch (NativeException e) {
+                    LogManager.log(
+                            getString("CL.uninstall.error.desktop"), // NOI18N
+                            e);
+                }
+            }
+        }
+
+
+        if (Boolean.getBoolean("remove.app.userdir")) {
+            try {
+                progress.setDetail(getString("CL.uninstall.remove.userdir")); // NOI18N
+                LogManager.logIndent("Removing application`s userdir... ");
+                File userDir = NetBeansRCPUtils.getApplicationUserDirFile(installLocation);
+                LogManager.log("... application userdir location : " + userDir);
+                if (FileUtils.exists(userDir) && FileUtils.canWrite(userDir)) {
+                    FileUtils.deleteFile(userDir, true);
+                    FileUtils.deleteEmptyParents(userDir);
+                }
+                LogManager.log("... application userdir totally removed");
+            } catch (IOException e) {
+                LogManager.log("Can`t remove application userdir", e);
+            } finally {
+                LogManager.unindent();
+            }
+        }
+
+        /////////////////////////////////////////////////////////////////////////////
+        //remove cluster/update files
+        /*
+        try {
+        progress.setDetail(getString("CL.uninstall.update.files")); // NOI18N
+        for(String cluster : CLUSTERS) {
+        File updateDir = new File(installLocation, cluster + File.separator + "update");
+        if ( updateDir.exists()) {
+        FileUtils.deleteFile(updateDir, true);
+        }
+        }
+        } catch (IOException e) {
+        LogManager.log(
+        getString("CL.uninstall.error.update.files"), // NOI18N
+        e);
+        }
+         */
+        /////////////////////////////////////////////////////////////////////////////
+        progress.setPercentage(Progress.COMPLETE);
+    }
+
+    @Override
+    public String getExecutable() {
+        if (SystemUtils.isWindows()) {
+            return EXECUTABLE_WINDOWS;
+        } else {
+            return EXECUTABLE_UNIX;
+        }
+    }
+
+    @Override
+    public String getIcon() {
+        if (SystemUtils.isWindows()) {
+            return ICON_WINDOWS;
+        } else if (SystemUtils.isMacOS()) {
+            return ICON_MACOSX;
+        } else {
+            return ICON_UNIX;
+        }
+    }
+
+    public RemovalMode getRemovalMode() {
+        return RemovalMode.LIST;
+    }
+
+    @Override
+    public boolean registerInSystem() {
+        return true;
+    }
+
+    @Override
+    public boolean requireLegalArtifactSaving() {
+        return false;
+    }
+
+    @Override
+    public boolean requireDotAppForMacOs() {
+        return true;
+    }
+
+    @Override
+    public boolean wrapForMacOs() {
+        return true;
+    }
+
+
+
+    private Shortcut getDesktopShortcut(final File directory) {
+        return getShortcut(
+                getStrings("CL.desktop.shortcut.name"), // NOI18N
+                getStrings("CL.desktop.shortcut.description"), // NOI18N
+                getString("CL.desktop.shortcut.path"), // NOI18N
+                directory);
+    }
+
+    private Shortcut getStartMenuShortcut(final File directory) {
+        if (SystemUtils.isMacOS()) {
+            return getShortcut(
+                    getStrings("CL.start.menu.shortcut.name.macosx"), // NOI18N
+                    getStrings("CL.start.menu.shortcut.description"), // NOI18N
+                    getString("CL.start.menu.shortcut.path"), // NOI18N
+                    directory);
+        } else {
+            return getShortcut(
+                    getStrings("CL.start.menu.shortcut.name"), // NOI18N
+                    getStrings("CL.start.menu.shortcut.description"), // NOI18N
+                    getString("CL.start.menu.shortcut.path"), // NOI18N
+                    directory);
+        }
+    }
+
+    private Shortcut getShortcut(
+            final Map<Locale, String> names,
+            final Map<Locale, String> descriptions,
+            final String relativePath,
+            final File location) {
+        final File icon;
+        final File executable;
+
+        if (SystemUtils.isWindows()) {
+            icon = new File(location, ICON_WINDOWS);
+        } else if (SystemUtils.isMacOS()) {
+            icon = new File(location, ICON_MACOSX);
+        } else {
+            icon = new File(location, ICON_UNIX);
+            LogManager.log("... icon file: " + icon);
+            if(!FileUtils.exists(icon)) {
+                LogManager.log("... icon file does not exist: " + icon);
+                InputStream is = null;
+                is = ResourceUtils.getResource(ICON_UNIX_RESOURCE, this.getClass().getClassLoader());
+                if(is!=null) {
+                    FileOutputStream fos =null;
+                    try {
+                        fos = new FileOutputStream(icon);
+                        StreamUtils.transferData(is, fos);
+                        is.close();
+                        fos.close();
+                        getProduct().getInstalledFiles().add(icon);
+                    } catch (IOException e) {
+                        LogManager.log(e);
+                    } finally {
+                        if(fos!=null) {
+                            try {
+                                fos.close();
+                            } catch (IOException e) {
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (SystemUtils.isWindows()) {
+            executable = new File(location, EXECUTABLE_WINDOWS);
+        } else {
+            executable = new File(location, EXECUTABLE_UNIX);
+        }
+        final String name = names.get(new Locale(StringUtils.EMPTY_STRING));
+        final FileShortcut shortcut = new FileShortcut(name, executable);
+        shortcut.setNames(names);
+        shortcut.setDescriptions(descriptions);
+        shortcut.setCategories(SHORTCUT_CATEGORIES);
+        shortcut.setFileName(SHORTCUT_FILENAME);
+        shortcut.setIcon(icon);
+        shortcut.setRelativePath(relativePath);
+        shortcut.setWorkingDirectory(location);
+        shortcut.setModifyPath(true);
+
+        return shortcut;
+    }
+    public static final String SHORTCUT_FILENAME =
+            ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".desktop"; // NOI18N
+    public static final String[] SHORTCUT_CATEGORIES = new String[]{
+        "Application"
+    };
+    public static final String BIN_SUBDIR =
+            "bin/";
+    public static final String EXECUTABLE_WINDOWS =
+            BIN_SUBDIR
+            + ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".exe"; // NOI18N
+    public static final String EXECUTABLE_UNIX =
+            BIN_SUBDIR
+            + ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name"); // NOI18N
+    public static final String ICON_WINDOWS =
+            EXECUTABLE_WINDOWS;
+    public static final String ICON_UNIX =
+            ResourceUtils.getString(ConfigurationLogic.class,
+            "CL.unix.icon.name"); // NOI18N
+    public static final String ICON_UNIX_RESOURCE =
+            ResourceUtils.getString(ConfigurationLogic.class,
+            "CL.unix.icon.resource"); // NOI18N
+    public static final String ICON_MACOSX =
+            ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".icns"; // NOI18N
+    public static final String ICON_MACOSX_RESOURCE =
+            "org/mycompany/" + ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".icns"; // NOI18N
+    public static final String WIZARD_COMPONENTS_URI =
+            "resource:" + // NOI18N
+            "org/mycompany/wizard.xml"; // NOI18N
+    private static final String DESKTOP_SHORTCUT_LOCATION_PROPERTY =
+            "desktop.shortcut.location"; // NOI18N
+    private static final String START_MENU_SHORTCUT_LOCATION_PROPERTY =
+            "start.menu.shortcut.location"; // NOI18N
+    private static final String ALL_USERS_PROPERTY_VALUE =
+            "all.users"; // NOI18N
+    private static final String CURRENT_USER_PROPERTY_VALUE =
+            "current.user"; // NOI18N
+}

+ 43 - 0
nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<wizard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="wizard-components.xsd">
+    <component class="org.mycompany.wizard.panels.HelloWorldPanel"/>    
+</wizard>

+ 51 - 0
nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard/panels/Bundle.properties

@@ -0,0 +1,51 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+################################################################################
+# HelloWorldPanel.java
+P.title={product-name} Installation
+P.description=Choose destination folder.
+P.destination.label.text=&Install {product-name} to:
+P.destination.button.text=B&rowse.....
+
+P.create.desktop.shortcut=Create Desktop icon
+P.create.start.menu.shortcut.windows=Create Start menu entry
+P.create.start.menu.shortcut.unix=Create shortcut in Applications menu
+P.create.start.menu.shortcut.macosx=Create icon in Dock
+

+ 184 - 0
nbi/stub/ext/components/products/helloworld/src/org/mycompany/wizard/panels/HelloWorldPanel.java

@@ -0,0 +1,184 @@
+package org.mycompany.wizard.panels;
+
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.SystemUtils;
+import org.netbeans.installer.utils.helper.swing.NbiCheckBox;
+import org.netbeans.installer.wizard.components.panels.DestinationPanel;
+import org.netbeans.installer.wizard.containers.SwingContainer;
+import org.netbeans.installer.wizard.ui.SwingUi;
+import org.netbeans.installer.wizard.ui.WizardUi;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class HelloWorldPanel extends DestinationPanel {
+
+    public HelloWorldPanel() {
+        setProperty(TITLE_PROPERTY,
+                DEFAULT_TITLE);
+        setProperty(DESCRIPTION_PROPERTY,
+                DEFAULT_DESCRIPTION);
+
+        setProperty(DESTINATION_LABEL_TEXT_PROPERTY,
+                DEFAULT_DESTINATION_LABEL_TEXT);
+        setProperty(DESTINATION_BUTTON_TEXT_PROPERTY,
+                DEFAULT_DESTINATION_BUTTON_TEXT);
+    }
+
+    @Override
+    public WizardUi getWizardUi() {
+        if (wizardUi == null) {
+            wizardUi = new HelloWorldPanelUi(this);
+        }
+
+        return wizardUi;
+    }
+
+    @Override
+    public void initialize() {
+        super.initialize();
+        if(getWizard().getProperty(CREATE_DESKTOP_SHORTCUT_PROPERTY) == null) {
+            getWizard().setProperty(CREATE_DESKTOP_SHORTCUT_PROPERTY, "" + true);
+        }
+        if(getWizard().getProperty(CREATE_START_MENU_SHORTCUT_PROPERTY) == null) {
+            getWizard().setProperty(CREATE_START_MENU_SHORTCUT_PROPERTY, "" + true);
+        }
+    }
+
+
+    public static class HelloWorldPanelUi extends DestinationPanelUi {
+
+        protected HelloWorldPanel panel;
+
+        public HelloWorldPanelUi(HelloWorldPanel panel) {
+            super(panel);
+
+
+            this.panel = panel;
+        }
+
+        public SwingUi getSwingUi(SwingContainer container) {
+            if (swingUi == null) {
+                swingUi = new HelloWorldPanelSwingUi(panel, container);
+            }
+
+            return super.getSwingUi(container);
+        }
+    }
+
+    public static class HelloWorldPanelSwingUi extends DestinationPanelSwingUi {
+
+        protected HelloWorldPanel panel;
+        private NbiCheckBox desktopShortcutComboBox;
+        private NbiCheckBox startMenuShortcutComboBox;
+
+        public HelloWorldPanelSwingUi(
+                final HelloWorldPanel panel,
+                final SwingContainer container) {
+            super(panel, container);
+
+            this.panel = panel;
+
+            initComponents();
+        }
+
+        // protected ////////////////////////////////////////////////////////////////
+        @Override
+        protected void initialize() {
+            desktopShortcutComboBox.setText(CREATE_DESKTOP_SHORTCUT_NAME);            
+            desktopShortcutComboBox.setSelected(false);
+            if(Boolean.parseBoolean(panel.getWizard().getProperty(CREATE_DESKTOP_SHORTCUT_PROPERTY))) {
+                desktopShortcutComboBox.doClick();
+            }
+
+            startMenuShortcutComboBox.setText(
+                    SystemUtils.isWindows() ? CREATE_START_MENU_SHORTCUT_NAME_WINDOWS :
+                        (SystemUtils.isMacOS() ? CREATE_START_MENU_SHORTCUT_NAME_MAC :
+                            CREATE_START_MENU_SHORTCUT_NAME_UNIX));
+            startMenuShortcutComboBox.setSelected(false);
+            if(Boolean.parseBoolean(panel.getWizard().getProperty(CREATE_START_MENU_SHORTCUT_PROPERTY))) {
+                startMenuShortcutComboBox.doClick();
+            }
+
+            super.initialize();
+        }
+
+        @Override
+        protected void saveInput() {
+            super.saveInput();
+            panel.getWizard().setProperty(
+                    CREATE_DESKTOP_SHORTCUT_PROPERTY,
+                    StringUtils.EMPTY_STRING + desktopShortcutComboBox.isSelected());
+            
+            panel.getWizard().setProperty(
+                    CREATE_START_MENU_SHORTCUT_PROPERTY,
+                    StringUtils.EMPTY_STRING + startMenuShortcutComboBox.isSelected());
+        }
+
+        @Override
+        protected String validateInput() {
+            String errorMessage = super.validateInput();
+            return errorMessage;
+        }
+
+        // private //////////////////////////////////////////////////////////////////
+        private void initComponents() {
+            // selectedLocationField ////////////////////////////////////////////////
+            desktopShortcutComboBox = new NbiCheckBox();
+            startMenuShortcutComboBox = new NbiCheckBox();
+
+            // this /////////////////////////////////////////////////////////////////
+            add(desktopShortcutComboBox, new GridBagConstraints(
+                    0, 2, // x, y
+                    2, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(15, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(startMenuShortcutComboBox, new GridBagConstraints(
+                    0, 3, // x, y
+                    2, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(7, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+
+        }
+    }
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    public static final String DEFAULT_TITLE =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.title"); // NOI18N
+    public static final String DEFAULT_DESCRIPTION =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.description"); // NOI18N
+    public static final String DEFAULT_DESTINATION_LABEL_TEXT =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.destination.label.text"); // NOI18N
+    public static final String DEFAULT_DESTINATION_BUTTON_TEXT =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.destination.button.text"); // NOI18N
+    public static final String CREATE_DESKTOP_SHORTCUT_NAME =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.create.desktop.shortcut"); // NOI18N
+    public static final String CREATE_START_MENU_SHORTCUT_NAME_WINDOWS =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.create.start.menu.shortcut.windows"); // NOI18N
+    public static final String CREATE_START_MENU_SHORTCUT_NAME_UNIX =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.create.start.menu.shortcut.unix"); // NOI18N
+    public static final String CREATE_START_MENU_SHORTCUT_NAME_MAC =
+            ResourceUtils.getString(HelloWorldPanel.class,
+            "P.create.start.menu.shortcut.macosx"); // NOI18N
+    public static final String CREATE_DESKTOP_SHORTCUT_PROPERTY =
+            "create.desktop.shortcut";
+    public static final String CREATE_START_MENU_SHORTCUT_PROPERTY =
+            "create.start.menu.shortcut";
+}

+ 41 - 0
nbi/stub/ext/engine/build.properties

@@ -0,0 +1,41 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+jar.contents.list=data/engine.list
+jar.contents.includes=native/** org/** com/apple/** data/clioptions.list data/engine*.properties

+ 73 - 0
nbi/stub/ext/engine/build.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<project name="Hello_World_Installer" default="default" basedir=".">
+    <import file="nbproject/build-impl.xml"/>
+    
+    <property file="build.properties"/>
+    
+        <target name="-post-compile" depends="-unjar-core-engine,create-jar-contents-list"/>
+    <target name="-unjar-core-engine">
+        <!-- Add the contents of the core engine to the engine we're building -->
+        <unjar 
+            src="${reference.NBI_Engine.jar}" 
+            dest="${build.classes.dir}" 
+            overwrite="false"/>
+    </target>
+
+    <target name="create-jar-contents-list">
+        <pathconvert property="build.classes.dir.normalized" dirsep="/">
+           <path location="${build.classes.dir}"/>
+        </pathconvert>
+        <pathconvert pathsep="${line.separator}" property="engine.files" dirsep="/">
+        <fileset dir="${build.classes.dir}" includes="${jar.contents.includes}"/>
+        <mapper>
+          <chainedmapper>
+            <globmapper handledirsep="true" from="${build.classes.dir.normalized}/*" to="*"/>
+          </chainedmapper>
+        </mapper>
+        </pathconvert>
+        <echo file="${build.classes.dir}/${jar.contents.list}">${engine.files}</echo>
+    </target>
+    
+    <target name="-post-jar">
+        <delete dir="${dist.dir}/lib"/>
+    </target>
+</project>

+ 2 - 0
nbi/stub/ext/engine/manifest.mf

@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: org.netbeans.installer.Installer

+ 646 - 0
nbi/stub/ext/engine/nbproject/build-impl.xml

@@ -0,0 +1,646 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - junit compilation
+  - junit execution
+  - junit debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="HelloWorld_Engine-impl">
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="libs.CopyLibs.classpath"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
+            <and>
+                <isset property="jaxws.endorsed.dir"/>
+                <available file="nbproject/jaxws-build.xml"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-javac">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="/does/not/exist" name="sourcepath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="," property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <delete>
+                    <files includes="${javac.includes.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-junit">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <sequential>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="${run.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target depends="init" name="deps-jar" unless="no.deps">
+        <ant antfile="${project.NBI_Engine}/build.xml" inheritall="false" target="jar"/>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <j2seproject3:depend/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+            <manifest>
+                <attribute name="Main-Class" value="${main.class}"/>
+                <attribute name="Class-Path" value="${jar.classpath}"/>
+            </manifest>
+        </copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+        </javadoc>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                JUNIT COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                JUNIT EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:junit testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:junit excludes="" includes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <!--
+                =======================
+                JUNIT DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+        <delete file="${test.report.file}"/>
+        <mkdir dir="${build.test.results.dir}"/>
+        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+            <customize>
+                <syspropertyset>
+                    <propertyref prefix="test-sys-prop."/>
+                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                </syspropertyset>
+                <arg value="${test.class}"/>
+                <arg value="showoutput=true"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target depends="init" name="deps-clean" unless="no.deps">
+        <ant antfile="${project.NBI_Engine}/build.xml" inheritall="false" target="clean"/>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+</project>

+ 8 - 0
nbi/stub/ext/engine/nbproject/genfiles.properties

@@ -0,0 +1,8 @@
+build.xml.data.CRC32=8f661a73
+build.xml.script.CRC32=f2f0e306
+build.xml.stylesheet.CRC32=a12b3d02
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=32036222
+nbproject/build-impl.xml.script.CRC32=ff4c3c7b
+nbproject/build-impl.xml.stylesheet.CRC32=65b8de21

+ 4 - 0
nbi/stub/ext/engine/nbproject/private/private.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+    <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>

+ 102 - 0
nbi/stub/ext/engine/nbproject/project.properties

@@ -0,0 +1,102 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+application.title=NetBeans Installer Engine
+application.vendor=ks152834
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/nbi-engine.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+file.reference.reglib-src=../../reglib/src
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${reference.NBI_Engine.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=org.netbeans.installer.Installer
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+project.NBI_Engine=../../nbi/engine
+reference.NBI_Engine.jar=${project.NBI_Engine}/dist/nbi-engine.jar
+run.classpath=\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=-Dnbi.product.bundled.registry.uri=file:/D:/temp/nbi-build/dist/registry-temp/registry.xml
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test

+ 64 - 0
nbi/stub/ext/engine/nbproject/project.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>HelloWorld Engine</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+        <references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
+            <reference>
+                <foreign-project>NBI_Engine</foreign-project>
+                <artifact-type>jar</artifact-type>
+                <script>build.xml</script>
+                <target>jar</target>
+                <clean-target>clean</clean-target>
+                <id>jar</id>
+            </reference>
+        </references>
+    </configuration>
+</project>

+ 89 - 0
nbi/stub/ext/engine/src/data/engine.properties

@@ -0,0 +1,89 @@
+
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+nbi.wizard.components.instance.uri=resource:org/mycompany/installer/wizard/wizard-components.xml
+nbi.wizard.ui.swing.frame.icon=resource:org/mycompany/installer/wizard/wizard-icon.png
+nbi.wizard.ui.swing.frame.title.prefix= {product-name} Installer
+nbi.wizard.ui.swing.frame.title.pattern={0}
+nbi.macosx.application.directory.name={product-name} Installer
+nbi.product.remove.corrupted.products.silently=true
+
+nbi.wizard.ui.swing.frame.head.right.image=resource:org/mycompany/installer/wizard/wizard-description-background-right.png
+nbi.wizard.ui.swing.frame.head.left.image=resource:org/mycompany/installer/wizard/wizard-description-background-left.png
+
+nbi.wizard.ui.swing.welcome.left.top.image=resource:org/mycompany/installer/wizard/components/panels/resources/welcome-left-top.png
+nbi.wizard.ui.swing.welcome.left.bottom.image=resource:org/mycompany/installer/wizard/components/panels/resources/welcome-left-bottom.png
+
+nbi.local.directory.path=$S{user.home}/.{product-uid}-installer
+
+nbi.wizard.ui.swing.frame.width.default=600
+nbi.wizard.ui.swing.frame.height.default=500
+nbi.wizard.ui.swing.frame.width.win.classic=588
+nbi.wizard.ui.swing.frame.height.win.classic=442
+nbi.wizard.ui.swing.frame.width.win.xp=600
+nbi.wizard.ui.swing.frame.height.win.xp=450
+nbi.wizard.ui.swing.frame.width.motif=624
+nbi.wizard.ui.swing.frame.height.motif=470
+nbi.wizard.ui.swing.frame.width.metal=624
+nbi.wizard.ui.swing.frame.height.metal=470
+nbi.wizard.ui.swing.frame.width.aqua=640
+nbi.wizard.ui.swing.frame.height.aqua=480
+nbi.wizard.ui.swing.frame.width.gtk=704
+nbi.wizard.ui.swing.frame.height.gtk=528
+nbi.wizard.ui.swing.frame.width.nimbus=624
+nbi.wizard.ui.swing.frame.height.nimbus=512
+
+
+nbi.wizard.ui.swing.frame.minimum.width.default=600
+nbi.wizard.ui.swing.frame.minimum.height.default=500
+nbi.wizard.ui.swing.frame.minimum.width.win.classic=588
+nbi.wizard.ui.swing.frame.minimum.height.win.classic=442
+nbi.wizard.ui.swing.frame.minimum.width.win.xp=600
+nbi.wizard.ui.swing.frame.minimum.height.win.xp=450
+nbi.wizard.ui.swing.frame.minimum.width.motif=624
+nbi.wizard.ui.swing.frame.minimum.height.motif=470
+nbi.wizard.ui.swing.frame.minimum.width.metal=624
+nbi.wizard.ui.swing.frame.minimum.height.metal=470
+nbi.wizard.ui.swing.frame.minimum.width.aqua=640
+nbi.wizard.ui.swing.frame.minimum.height.aqua=480
+nbi.wizard.ui.swing.frame.minimum.width.gtk=704
+nbi.wizard.ui.swing.frame.minimum.height.gtk=528
+nbi.wizard.ui.swing.frame.minimum.width.nimbus=624
+nbi.wizard.ui.swing.frame.minimum.height.nimbus=512

+ 71 - 0
nbi/stub/ext/engine/src/native/launcher/unix/i18n/launcher.properties

@@ -0,0 +1,71 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+nlu.jvm.notfoundmessage=Java SE Development Kit (JDK) was not found on this computer\nJDK 6 is required for installing {product-name}. Make sure that the JDK is properly installed and run installer again.\nYou can specify valid JDK location using {0} installer argument.\n\nTo download the JDK, visit http://java.sun.com/javase/downloads
+nlu.jvm.usererror=Java Runtime Environment (JRE) was not found at the specified location {0}
+nlu.jvm.uncompatible=Unsupported JVM version at {0}.\nTry to specify another JVM location using parameter {1}
+nlu.freespace=There is not enough free disk space to extract installation data\n{0} MB of free disk space is required in a temporary folder.\nClean up the disk space and run installer again. You can specify a temporary folder with sufficient disk space using {1} installer argument
+nlu.integrity=\nInstaller file {0} seems to be corrupted
+nlu.missing.external.resource=Can`t run {product-name} Installer.\nAn external file with necessary data is required but missing:\n{0}
+nlu.cannot.create.tmpdir=Cannot create temporary directory {0}
+nlu.cannot.extract.bundled.jvm=Cannot extract bundled JVM
+nlu.cannot.unpack.jvm.file=Cannot unpack file {0}
+nlu.error.verify.bundled.jvm=Cannot verify bundled JVM, try to search JVM on the system
+
+nlu.running=Running the installer wizard...
+nlu.starting=Configuring the installer...
+nlu.extracting=Extracting installation data...
+nlu.prepare.jvm=Preparing bundled JVM ...
+nlu.jvm.search=Searching for JVM on the system...
+
+nlu.msg.usage=\nUsage:
+nlu.arg.javahome=\t{0}\t<dir>\tUsing java from <dir> for running application
+nlu.arg.verbose=\t{0}\t\tUse verbose output
+nlu.arg.output=\t{0}\t<out>\tRedirect all output to file <out>
+nlu.arg.disable.space.check=\t{0}\t\tDisable free space check
+nlu.arg.extract=\t{0}\t[dir]\tExtract all bundled data to <dir>.\n\t\t\t\tIf <dir> is not specified then extract to the current directory
+nlu.arg.tempdir=\t{0}\t<dir>\tUse <dir> for extracting temporary data
+nlu.arg.cpa=\t{0} <cp>\tAppend classpath with <cp>
+nlu.arg.cpp=\t{0} <cp>\tPrepend classpath with <cp>
+nlu.arg.locale=\t{0}\t<locale>\tOverride default locale with specified <locale>
+nlu.arg.silent=\t{0}\t\tRun installer silently
+nlu.arg.help=\t{0}\t\tShow this help
+
+
+nlu.java.application.name.macosx={product-name} Installer

+ 74 - 0
nbi/stub/ext/engine/src/native/launcher/windows/i18n/launcher.properties

@@ -0,0 +1,74 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+nlw.jvm.notfoundmessage=Java SE Development Kit (JDK) was not found on this computer\nJDK 6 is required for installing {product-name}. Make sure that the JDK is properly installed and run installer again. You can specify valid JDK location using {0} installer argument.\n\nTo download the JDK, visit http://java.sun.com/javase/downloads
+nlw.jvm.usererror=Java Runtime Environment (JRE) was not found\nThere is no JRE at the specified location {0}
+nlw.jvm.unsupportedversion=Unsupported Java VM version\nThe Java VM at {0} has the unsupported version
+nlw.freespace=There is not enough free disk space to extract installation data\n{0} MB of free disk space is required in a temporary folder. Clean up the disk space and run installer again. You can specify a temporary folder with sufficient disk space using {1} installer argument
+nlw.tmpdir=Can't create temporary directory\nThe temporary directory for extracting data {0} was not created
+nlw.integrity=Installer file is corrupted\nInstaller file {0} seems to be corrupted
+nlw.output.error=Data extraction error\nCan't create file {0}!\nThe following error occured :\n{1}
+nlw.java.process.error=An error occured while running java process\n{0}
+nlw.missing.external.resource=Can`t run {product-name} Installer.\nAn external file with necessary data is required but missing:\n{0}
+nlw.bundled.jvm.extract.error=Cannot prepare bundled JVM to run the installer.\nMost probably the bundled JVM is not compatible with the current platform.
+nlw.bundled.jvm.verify.error=An error occured while verifying bundled JVM.\nMost probably the bundled JVM is not compatible with the current platform.
+
+nlw.arg.output={0} <output-file>\n\tRedirect output to file <output-file>
+nlw.arg.javahome={0} <javahomedir>\n\tRun jar file using JVM from <javahomedir>
+nlw.arg.verbose={0}\n\tUse verbose output
+nlw.arg.tempdir={0} <temp-dir>\n\tUse <temp-dir> for extracting data
+nlw.arg.extract={0} [directory]\n\tExtract all bundled data to the specific directory.\n\tIf directory is not specified then extract to the current directory
+nlw.arg.classpatha={0} <classpath>\n\tAppend classpath with <classpath>
+nlw.arg.classpathp={0} <classpath>\n\tPrepend classpath with <classpath>
+nlw.arg.disable.space.check={0}\n\tDisable free space check
+nlw.arg.locale={0} <locale>\n\tOverride system default locale with <locale>
+nlw.arg.silent={0} \n\tRun installer silently
+nlw.arg.help={0}\n\tShow help message
+
+
+nlw.msg.create.tmpdir=Creating temporary directory ...
+nlw.msg.extract=Extracting data ...
+nlw.msg.jvmsearch=Finding JVM on your system ...
+nlw.msg.setoptions=Setting command options ...
+nlw.msg.running=Running JVM ...
+nlw.msg.title=Please wait while the launcher prepares data to run the installer ...
+nlw.msg.messagebox.title={product-name} Installer
+nlw.msg.progress.title=Configuring the installer ...
+nlw.msg.button.error=Exit Installer
+nlw.msg.main.title={product-name} Installer

+ 43 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/utils/applications/Bundle.properties

@@ -0,0 +1,43 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+############################################################################
+# NetBeansRCPUtils.java
+
+NU.error.cannot.get.userdir=Can`t get application userdir from {0}

+ 191 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/utils/applications/NetBeansRCPUtils.java

@@ -0,0 +1,191 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ * 
+ * Contributor(s):
+ * 
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ * 
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+
+package org.mycompany.installer.utils.applications;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.netbeans.installer.utils.FileUtils;
+import org.netbeans.installer.utils.LogManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.SystemUtils;
+import org.netbeans.installer.utils.exceptions.NativeException;
+import org.netbeans.installer.utils.system.WindowsNativeUtils;
+import org.netbeans.installer.utils.system.WindowsNativeUtils;
+import org.netbeans.installer.utils.system.windows.WindowsRegistry;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class NetBeansRCPUtils {
+
+    
+    /**
+     * Get resolved application user directory
+     * @param appLocation Application home directory
+     * @throws IOException if can`t get application default userdir
+     */
+    public static File getApplicationUserDirFile(File appLocation) throws IOException {
+        String dir = getApplicationUserDir(appLocation);
+        String userHome = System.getProperty("user.home");
+        if(SystemUtils.isWindows()) {
+            WindowsNativeUtils wnu = (WindowsNativeUtils) SystemUtils.getNativeUtils();
+            WindowsRegistry reg = wnu.getWindowsRegistry();
+            String key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
+            try {
+            if(reg.keyExists(reg.HKCU, key) &&
+                    reg.valueExists(reg.HKCU, key, "AppData")) {
+                userHome = reg.getStringValue(reg.HKCU, key, "AppData", false);
+
+            }
+            } catch (NativeException e) {
+                LogManager.log(e);
+            }
+        }
+        dir = dir.replace(USER_HOME_TOKEN, userHome);
+        dir = dir.replace(APPNAME_TOKEN, getApplicationName(appLocation));
+        return new File(dir);
+    }
+    
+    /**
+     * Get application user directory as it is written in application`s configuration file
+     * @param appLocation Application home directory
+     * @throws IOException if can`t get  default userdir
+     */
+    public static String getApplicationUserDir(File appLocation) throws IOException {
+        File []confFiles = new File(appLocation, "etc").listFiles(new FilenameFilter() {
+
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".conf");
+            }
+        });
+        File conf = null;
+        if(confFiles.length == 1) {
+            conf = confFiles[0];
+        } else if(confFiles.length >2) {
+            for(File f : confFiles) {
+                String prefix = f.getName().substring(0, f.getName().indexOf(".conf"));                
+                if((SystemUtils.isUnix() && new File(appLocation, "bin/" + prefix).exists()) ||
+                   (SystemUtils.isWindows() && new File(appLocation, "bin/" + prefix + ".exe").exists())) {
+                    conf = f;
+                    break;
+                }                
+            }
+        }
+        if(conf == null) {
+            return null;
+        }
+
+        String contents = FileUtils.readFile(conf);
+        Matcher matcher = Pattern.compile(
+                NEW_LINE_PATTERN + SPACES_PATTERN +
+                (SystemUtils.isMacOS() ? DEFAULT_USERDIR_MAC : DEFAULT_USERDIR) +
+                "\"(.*?)\"").matcher(contents);
+        if(matcher.find() && matcher.groupCount() == 1) {
+            return matcher.group(1);
+        } else {
+            throw new IOException(StringUtils.format(
+                    ERROR_CANNOT_GET_USERDIR_STRING,conf));
+        }
+    }
+
+    /**
+     * Get application name - i.e. <name> in bin/<name>.exe and etc/<name>.conf
+     * @param appLocation Application home directory
+     */
+    public static String getApplicationName(File appLocation)  {
+        File []confFiles = new File(appLocation, "etc").listFiles(new FilenameFilter() {
+
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".conf");
+            }
+        });
+
+        if(confFiles.length == 1) {
+            String name = confFiles[0].getName();
+            return name.substring(0, name.indexOf(".conf"));
+        } else if(confFiles.length >2) {
+            for(File f : confFiles) {
+                String name = f.getName();
+                String prefix = name.substring(0, name.indexOf(".conf"));
+                if((SystemUtils.isUnix() && new File(appLocation, "bin/" + prefix).exists()) ||
+                   (SystemUtils.isWindows() && new File(appLocation, "bin/" + prefix + ".exe").exists())) {
+                    return prefix;
+                }
+            }
+        }
+        return null;
+    }
+    
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Instance
+    private NetBeansRCPUtils() {
+        // does nothing
+    }
+    
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    
+    public static final String NEW_LINE_PATTERN =
+            "[\r\n|\n|\r]"; // NOI18N
+    public static final String SPACES_PATTERN =
+            "\\ *"; // NOI18N
+    
+    public static final String DEFAULT_USERDIR =
+            "default_userdir="; // NOI18N
+    public static final String DEFAULT_USERDIR_MAC =
+            "default_mac_userdir="; // NOI18N
+    
+    public static final String USER_HOME_TOKEN =
+            "${HOME}"; // NOI18N
+    public static final String APPNAME_TOKEN =
+            "${APPNAME}"; // NOI18N
+    
+    public static final String ERROR_CANNOT_GET_USERDIR_STRING =
+            ResourceUtils.getString(NetBeansRCPUtils.class,
+            "NU.error.cannot.get.userdir");//NOI18N
+    
+    
+}

+ 3 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/actions/Bundle.properties

@@ -0,0 +1,3 @@
+IA.title=Installer Initialization
+IA.progress.title=Initialization in progress...
+IA.description=Please wait while initialization is completed.

+ 112 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/actions/InitializeAction.java

@@ -0,0 +1,112 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ * 
+ * Contributor(s):
+ * 
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ * 
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+
+package org.mycompany.installer.wizard.components.actions;
+
+import org.netbeans.installer.product.Registry;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.helper.ErrorLevel;
+import org.netbeans.installer.utils.ErrorManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.progress.Progress;
+import org.netbeans.installer.wizard.components.WizardAction;
+import org.netbeans.installer.wizard.components.actions.*;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class InitializeAction extends WizardAction {
+    /////////////////////////////////////////////////////////////////////////////////
+    // Instance
+    public InitializeAction() {
+        setProperty(TITLE_PROPERTY, 
+                DEFAULT_TITLE);
+        setProperty(DESCRIPTION_PROPERTY, 
+                DEFAULT_DESCRIPTION);
+
+        downloadLogic = new DownloadConfigurationLogicAction();
+        initReg = new InitializeRegistryAction();
+    }
+    private DownloadConfigurationLogicAction downloadLogic;
+    private InitializeRegistryAction initReg;
+    
+    public void execute() {
+        final Progress progress = new Progress();
+        
+        //getWizardUi().setProgress(progress);
+        
+
+        progress.setTitle(getProperty(PROGRESS_TITLE_PROPERTY));
+
+        //progress.synchronizeDetails(false);
+
+        if (initReg.canExecuteForward()) {
+            initReg.setWizard(getWizard());
+            initReg.execute();
+        }
+    
+        if (downloadLogic.canExecuteForward()) {
+            downloadLogic.setWizard(getWizard());
+            downloadLogic.execute();
+        }
+    }
+    
+    @Override
+    public boolean isCancelable() {
+        return false;
+    }
+
+    public WizardActionUi getWizardUi() {
+        return null; // this action does not have a ui
+    }
+    
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    public static final String DEFAULT_TITLE = ResourceUtils.getString(
+            InitializeAction.class, 
+            "IA.title"); // NOI18N
+    public static final String PROGRESS_TITLE_PROPERTY = ResourceUtils.getString(
+            InitializeAction.class, 
+            "IA.progress.title"); // NOI18N
+    public static final String DEFAULT_DESCRIPTION = ResourceUtils.getString(
+            InitializeAction.class, 
+            "IA.description"); // NOI18N
+    
+}

+ 94 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/Bundle.properties

@@ -0,0 +1,94 @@
+WP.title={product-name} Introduction
+WP.description={product-name}
+WP.welcome.text=<html>\
+        <h1>Welcome to the {product-name} Installer Wizard</h1><br>\
+        This program will install the {product-name} on your computer.<br><br>\
+        Click Next to continue.
+WP.already.installed.text=<html>\
+<h1>Welcome to the {product-name} Installer Wizard</h1><br>\
+{0} is already installed at {1}.<br>It is not possible to install it again.<br><br>\
+Click Exit to close this wizard.
+WP.already.installed.next.button.text=&Exit
+WP.incompatible.platform.text=<html>\
+<h1>Welcome to the {product-name} Installer Wizard</h1><br>\
+The {0} installer was not designed to run on this operating system so it is not possible to install it. \
+Please run the installer for the appropriate platform.<br><br>\
+Click Exit to close this wizard.
+
+PoISP.title=Setup Complete
+PoISP.description=Click Finish to finish {product-name} setup.
+
+PoISP.message.text.success=\
+            <html><b><font size="+1">Installation Complete</font></b><br><br><br>\
+            {0} has been installed on your computer.</html>
+#NOI18N
+PoISP.message.content.type.success=text/html
+
+PoISP.message.text.warnings=\
+<html><b><font size="+1">Installation Complete</font></b><br><br><br>\
+<span color="red">{0} has been installed on your computer but some not critical warnings were encountered.\
+<br><br>For more details consult the installation log file:<br>{1}</span></html>
+
+PoISP.message.text.finish=<html>Click Finish to close this wizard.</html>
+PoISP.message.text.finish.content.type=text/html
+
+#NOI18N
+PoISP.message.content.type.warnings=text/html
+
+PoISP.message.text.errors=<html><b><font size="+1">Installation Failed</font></b><br><br><br>\
+        <span color="red">{0} has not been installed on your computer.</span><br><br>\
+        Try to run installer again or consult the installation log file for more details:<br>{1}</span></html>
+#NOI18N
+PoISP.message.content.type.errors=text/html
+
+PoISP.message.text.success.uninstall=<html>\
+        <b><font size="+1">Uninstallation Complete</font></b><br><br><br>\
+        {0} has been uninstalled.</html>
+#NOI18N
+PoISP.message.content.type.success.uninstall=text/html
+
+PoISP.message.text.warnings.uninstall=\
+        <html><b><font size="+1">Uninstallation Complete</font></b><br><br><br>\
+        <span color="red">{0} has been uninstalled with warnings.<br><br>\
+        For more details consult the installation log file:<br>{1}</span></html>
+#NOI18N
+PoISP.message.content.type.warnings.uninstall=text/html
+
+PoISP.message.text.errors.uninstall=<html><b><font size="+1">Uninstallation Failed</font></b><br><br>\
+<span color="red">Uninstallation of {0} was not completed.<br><br>\
+Try to run uninstaller again or consult the uninstallation log file for more details:<br>{1}</span>\
+</html>
+#NOI18N
+PoISP.message.content.type.errors.uninstall=text/html
+
+PoISP.message.run.application.now=Launch {0} after the installer closes.
+
+PoISP.next.button.text=&Finish
+
+
+
+################################################################################
+# PreInstallSummaryPanel.java
+PrISP.title=Summary
+PrISP.description=Click Install to start the installation.
+PrISP.description.uninstall=Click Uninstall to start the uninstallation.
+
+PrISP.installation.folder={0} Installation Folder:
+PrISP.uninstall.list.label.text=<html><br>Click Uninstall to remove {0} from the system.
+PrISP.installation.size=Total Installation Size:
+PrISP.download.size=Total Download Size:
+
+PrISP.next.button.text=&Install
+PrISP.next.button.text.uninstall=&Uninstall
+
+PrISP.error.not.enough.space=Insufficient disk space for proper installation. Additional {1} is required in {0}.
+PrISP.error.cannot.check.space=Cannot check the free disk space
+PrISP.error.logic.access=Could not access product's configuration logic
+PrISP.error.fsroots=Cannot get the list of file system roots
+PrISP.error.non.existent.root={0} is set up to be installed to {1} which does not belong to any of the file system roots.
+PrISP.error.cannot.write=The wizard does not have write access to {1}, the installation directory of {0}. Please correct the permissions before proceeding.
+
+PrISP.remove.app.userdir.text=\
+<html>\
+If you wish to remove the application settings directory that stores user configuration data for {0}, check the following option.<br>
+PrISP.remove.app.userdir.checkbox=Remove directory {0}

+ 457 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/PostInstallSummaryPanel.java

@@ -0,0 +1,457 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ * 
+ * Contributor(s):
+ * 
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ * 
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+package org.mycompany.installer.wizard.components.panels;
+
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import org.netbeans.installer.product.Registry;
+import org.netbeans.installer.product.components.Product;
+import org.netbeans.installer.product.components.ProductConfigurationLogic;
+import org.netbeans.installer.utils.LogManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.exceptions.InitializationException;
+import org.netbeans.installer.utils.helper.swing.NbiCheckBox;
+import org.netbeans.installer.utils.helper.swing.NbiTextPane;
+import org.netbeans.installer.wizard.components.WizardPanel;
+import org.netbeans.installer.wizard.containers.SwingContainer;
+import org.netbeans.installer.wizard.containers.SwingFrameContainer;
+import org.netbeans.installer.wizard.ui.SwingUi;
+import org.netbeans.installer.wizard.ui.WizardUi;
+import static org.netbeans.installer.utils.helper.DetailedStatus.INSTALLED_SUCCESSFULLY;
+import static org.netbeans.installer.utils.helper.DetailedStatus.INSTALLED_WITH_WARNINGS;
+import static org.netbeans.installer.utils.helper.DetailedStatus.FAILED_TO_INSTALL;
+import static org.netbeans.installer.utils.helper.DetailedStatus.UNINSTALLED_SUCCESSFULLY;
+import static org.netbeans.installer.utils.helper.DetailedStatus.UNINSTALLED_WITH_WARNINGS;
+import static org.netbeans.installer.utils.helper.DetailedStatus.FAILED_TO_UNINSTALL;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class PostInstallSummaryPanel extends WizardPanel {
+    /////////////////////////////////////////////////////////////////////////////////
+    // Instance
+
+    public PostInstallSummaryPanel() {
+        setProperty(TITLE_PROPERTY,
+                DEFAULT_TITLE);
+        setProperty(DESCRIPTION_PROPERTY,
+                DEFAULT_DESCRIPTION);
+
+        setProperty(MESSAGE_TEXT_SUCCESS_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_SUCCESS);
+        setProperty(MESSAGE_CONTENT_TYPE_SUCCESS_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_SUCCESS);
+        setProperty(MESSAGE_TEXT_WARNINGS_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_WARNINGS);
+        setProperty(MESSAGE_CONTENT_TYPE_WARNINGS_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_WARNINGS);
+        setProperty(MESSAGE_TEXT_ERRORS_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_ERRORS);
+        setProperty(MESSAGE_CONTENT_TYPE_ERRORS_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_ERRORS);
+
+        setProperty(MESSAGE_TEXT_SUCCESS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_SUCCESS_UNINSTALL);
+        setProperty(MESSAGE_CONTENT_TYPE_SUCCESS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_SUCCESS_UNINSTALL);
+        setProperty(MESSAGE_TEXT_WARNINGS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_WARNINGS_UNINSTALL);
+        setProperty(MESSAGE_CONTENT_TYPE_WARNINGS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_WARNINGS_UNINSTALL);
+        setProperty(MESSAGE_TEXT_ERRORS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_TEXT_ERRORS_UNINSTALL);
+        setProperty(MESSAGE_CONTENT_TYPE_ERRORS_UNINSTALL_PROPERTY,
+                DEFAULT_MESSAGE_CONTENT_TYPE_ERRORS_UNINSTALL);
+
+
+        setProperty(NEXT_BUTTON_TEXT_PROPERTY,
+                DEFAULT_NEXT_BUTTON_TEXT);
+    }
+
+    @Override
+    public boolean isPointOfNoReturn() {
+        return true;
+    }
+
+    @Override
+    public WizardUi getWizardUi() {
+        if (wizardUi == null) {
+            wizardUi = new PostInstallSummaryPanelUi(this);
+        }
+
+        return wizardUi;
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Inner Classes
+    public static class PostInstallSummaryPanelUi extends WizardPanelUi {
+
+        protected PostInstallSummaryPanel component;
+
+        public PostInstallSummaryPanelUi(PostInstallSummaryPanel component) {
+            super(component);
+
+            this.component = component;
+        }
+
+        public SwingUi getSwingUi(SwingContainer container) {
+            if (swingUi == null) {
+                swingUi = new PostInstallSummaryPanelSwingUi(component, container);
+            }
+
+            return super.getSwingUi(container);
+        }
+    }
+
+    public static class PostInstallSummaryPanelSwingUi extends WizardPanelSwingUi {
+
+        protected PostInstallSummaryPanel component;
+        private NbiTextPane messagePaneInstall;
+        private NbiTextPane messagePaneUninstall;
+
+
+        private NbiTextPane messagePaneFinish;
+        private NbiCheckBox runAppNow;
+        private Product app;
+
+        public PostInstallSummaryPanelSwingUi(
+                final PostInstallSummaryPanel component,
+                final SwingContainer container) {
+            super(component, container);
+
+            this.component = component;
+
+            initComponents();
+        }
+
+        protected void initializeContainer() {
+            super.initializeContainer();
+
+            // set up the back button
+            container.getBackButton().setVisible(false);
+            container.getBackButton().setEnabled(false);
+
+            // set up the next (or finish) button
+            container.getNextButton().setVisible(true);
+            container.getNextButton().setEnabled(true);
+
+            container.getNextButton().setText(
+                    component.getProperty(NEXT_BUTTON_TEXT_PROPERTY));
+
+            // set up the cancel button
+            container.getCancelButton().setVisible(false);
+            container.getCancelButton().setEnabled(false);
+        }
+
+        @Override
+        public void evaluateNextButtonClick() {
+            container.getNextButton().setEnabled(false);
+            final Product product = app;
+            if (app != null) {
+                ProductConfigurationLogic l = null;
+                try {
+                    l = app.getLogic();
+                } catch (InitializationException e) {
+                }
+                final File executable = l != null ? new File(app.getInstallationLocation(), l.getExecutable()) : null;
+
+                if (executable != null && runAppNow.isSelected()) {
+                    LogManager.log("... running: " + executable.getAbsolutePath());
+                    ProcessBuilder pb = new ProcessBuilder(new String[]{executable.getAbsolutePath()});
+                    try {
+                        pb.start();
+                    } catch (IOException e) {
+                        LogManager.log(e);
+                    }
+
+                }
+            }
+            super.evaluateNextButtonClick();
+        }
+
+        protected void initialize() {
+            final Registry registry = Registry.getInstance();
+            final List<Product> successfulInstall = registry.getProducts(INSTALLED_SUCCESSFULLY);
+            final List<Product> warningInstall = registry.getProducts(INSTALLED_WITH_WARNINGS);
+            final List<Product> errorInstall = registry.getProducts(FAILED_TO_INSTALL);
+
+            final List<Product> successfulUninstall = registry.getProducts(UNINSTALLED_SUCCESSFULLY);
+            final List<Product> warningUninstall = registry.getProducts(UNINSTALLED_WITH_WARNINGS);
+            final List<Product> errorUninstall = registry.getProducts(FAILED_TO_UNINSTALL);
+
+            if (errorInstall.size() > 0) {
+                messagePaneInstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_ERRORS_PROPERTY));
+                messagePaneInstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_ERRORS_PROPERTY),
+                        errorInstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else if (warningInstall.size() > 0) {
+                messagePaneInstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_WARNINGS_PROPERTY));
+                messagePaneInstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_WARNINGS_PROPERTY),
+                        warningInstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else if (successfulInstall.size() > 0) {
+                messagePaneInstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_SUCCESS_PROPERTY));
+                messagePaneInstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_SUCCESS_PROPERTY),
+                        successfulInstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else {
+                messagePaneInstall.setVisible(false);
+            }
+
+            messagePaneFinish.setVisible(true);
+            messagePaneFinish.setContentType(DEFAULT_MESSAGE_FINISH_PROCESS_CONTENT_TYPE);
+            messagePaneFinish.setText(DEFAULT_MESSAGE_FINISH_PROCESS);
+
+            if (errorUninstall.size() > 0) {
+                messagePaneUninstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_ERRORS_UNINSTALL_PROPERTY));
+                messagePaneUninstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_ERRORS_UNINSTALL_PROPERTY),
+                        errorUninstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else if (warningUninstall.size() > 0) {
+                messagePaneUninstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_WARNINGS_UNINSTALL_PROPERTY));
+                messagePaneUninstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_WARNINGS_UNINSTALL_PROPERTY),
+                        warningUninstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else if (successfulUninstall.size() > 0) {
+                messagePaneUninstall.setContentType(component.getProperty(MESSAGE_CONTENT_TYPE_SUCCESS_UNINSTALL_PROPERTY));
+                messagePaneUninstall.setText(StringUtils.format(
+                        component.getProperty(MESSAGE_TEXT_SUCCESS_UNINSTALL_PROPERTY),
+                        successfulUninstall.get(0).getDisplayName(),
+                        LogManager.getLogFile()));
+            } else {
+                messagePaneUninstall.setVisible(false);
+            }
+
+    
+
+            final List<Product> products = new LinkedList<Product>();
+            products.addAll(successfulInstall);
+            products.addAll(warningInstall);
+            runAppNow.setSelected(false);
+            if (!products.isEmpty()) {
+                runAppNow.setText(StringUtils.format(DEFAULT_MESSAGE_LAUNCH_APPLICATION_NOW,
+                        products.get(0).getDisplayName()));
+                runAppNow.doClick();
+                app = products.get(0);
+            } else {                
+                runAppNow.setVisible(false);
+            }
+
+
+        }
+
+        private void initComponents() {
+            // messagePaneInstall ///////////////////////////////////////////////////
+            messagePaneInstall = new NbiTextPane();
+
+            // messagePaneUninstall /////////////////////////////////////////////////
+            messagePaneUninstall = new NbiTextPane();
+
+            // messagePaneRunApplication ///////////////////////////////////////////////////
+            
+
+            messagePaneFinish = new NbiTextPane();
+
+            runAppNow = new NbiCheckBox();
+
+
+            // this /////////////////////////////////////////////////////////////////
+            add(messagePaneInstall, new GridBagConstraints(
+                    0, 0, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(31, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(messagePaneUninstall, new GridBagConstraints(
+                    0, 1, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.BOTH, // fill
+                    new Insets(31, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+
+            add(messagePaneFinish, new GridBagConstraints(
+                    0, 3, // x, y
+                    1, 1, // width, height
+                    1.0, 1.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(11, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            /*
+            add(new NbiPanel(), new GridBagConstraints(
+                    0, 4, // x, y
+                    1, 1, // width, height
+                    1.0, 1.0, // weight-x, weight-y
+                    GridBagConstraints.CENTER, // anchor
+                    GridBagConstraints.BOTH, // fill
+                    new Insets(0, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            */
+            add(runAppNow, new GridBagConstraints(
+                    0, 4, // x, y
+                    1, 1, // width, height
+                    1.0, 1.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(11, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+
+
+
+            if (container instanceof SwingFrameContainer) {
+                final SwingFrameContainer sfc = (SwingFrameContainer) container;
+                sfc.addWindowListener(new WindowAdapter() {
+
+                    @Override
+                    public void windowClosing(WindowEvent event) {
+                        SwingUi currentUi = component.getWizardUi().getSwingUi(container);
+                        if (currentUi != null) {
+                            if (!container.getCancelButton().isEnabled() && // cancel button is disabled
+                                    !container.getCancelButton().isVisible() && // no cancel button at this panel
+                                    !container.getBackButton().isVisible() && // no back button at this panel
+                                    container.getNextButton().isVisible() && // next button is visible
+                                    container.getNextButton().isEnabled()) { // and enabled                                                                
+                                currentUi.evaluateNextButtonClick();
+                                sfc.removeWindowListener(this);
+                            }
+                        }
+                    }
+                });
+            }
+        }
+    }
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    public static final String MESSAGE_TEXT_SUCCESS_PROPERTY =
+            "message.text.success"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_SUCCESS_PROPERTY =
+            "message.content.type.success"; // NOI18N
+    public static final String MESSAGE_TEXT_WARNINGS_PROPERTY =
+            "message.text.warnings"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_WARNINGS_PROPERTY =
+            "message.content.type.warnings"; // NOI18N
+    public static final String MESSAGE_TEXT_ERRORS_PROPERTY =
+            "message.text.errors"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_ERRORS_PROPERTY =
+            "message.content.type.errors"; // NOI18N
+    public static final String MESSAGE_TEXT_SUCCESS_UNINSTALL_PROPERTY =
+            "message.text.success.uninstall"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_SUCCESS_UNINSTALL_PROPERTY =
+            "message.content.type.success.uninstall"; // NOI18N
+    public static final String MESSAGE_TEXT_WARNINGS_UNINSTALL_PROPERTY =
+            "message.text.warnings.uninstall"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_WARNINGS_UNINSTALL_PROPERTY =
+            "message.content.type.warnings.uninstall"; // NOI18N
+    public static final String MESSAGE_TEXT_ERRORS_UNINSTALL_PROPERTY =
+            "message.text.errors.uninstall"; // NOI18N
+    public static final String MESSAGE_CONTENT_TYPE_ERRORS_UNINSTALL_PROPERTY =
+            "message.content.type.errors.uninstall"; // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_SUCCESS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.success"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_SUCCESS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.success"); // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_WARNINGS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.warnings"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_WARNINGS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.warnings"); // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_ERRORS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.errors"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_ERRORS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.errors"); // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_SUCCESS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.success.uninstall"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_SUCCESS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.success.uninstall"); // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_WARNINGS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.warnings.uninstall"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_WARNINGS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.warnings.uninstall"); // NOI18N
+    public static final String DEFAULT_MESSAGE_TEXT_ERRORS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.errors.uninstall"); // NOI18N
+    public static final String DEFAULT_MESSAGE_CONTENT_TYPE_ERRORS_UNINSTALL =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.content.type.errors.uninstall"); // NOI18N
+    
+    public static final String DEFAULT_TITLE = ResourceUtils.getString(
+            PostInstallSummaryPanel.class,
+            "PoISP.title"); // NOI18N
+    public static final String DEFAULT_DESCRIPTION =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.description"); // NOI18N
+    public static final String DEFAULT_NEXT_BUTTON_TEXT =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.next.button.text"); // NOI18N
+    public static final String DEFAULT_MESSAGE_FINISH_PROCESS =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.finish"); // NOI18N
+    public static final String DEFAULT_MESSAGE_FINISH_PROCESS_CONTENT_TYPE =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.text.finish.content.type"); // NOI18N
+    public static final String DEFAULT_MESSAGE_LAUNCH_APPLICATION_NOW =
+            ResourceUtils.getString(PostInstallSummaryPanel.class,
+            "PoISP.message.run.application.now");//NOI18N
+}

+ 620 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/PreInstallSummaryPanel.java

@@ -0,0 +1,620 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+package org.mycompany.installer.wizard.components.panels;
+
+import java.awt.ComponentOrientation;
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.border.EmptyBorder;
+import org.netbeans.installer.Installer;
+import org.netbeans.installer.product.Registry;
+import org.netbeans.installer.product.RegistryNode;
+import org.netbeans.installer.product.RegistryType;
+import org.netbeans.installer.product.components.Product;
+import org.netbeans.installer.utils.ErrorManager;
+import org.netbeans.installer.utils.FileUtils;
+import org.netbeans.installer.utils.LogManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.SystemUtils;
+import org.mycompany.installer.utils.applications.NetBeansRCPUtils;
+import org.netbeans.installer.utils.exceptions.NativeException;
+import org.netbeans.installer.utils.helper.swing.NbiCheckBox;
+import org.netbeans.installer.utils.helper.swing.NbiLabel;
+import org.netbeans.installer.utils.helper.swing.NbiPanel;
+import org.netbeans.installer.utils.helper.swing.NbiTextPane;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelSwingUi;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelUi;
+import org.netbeans.installer.wizard.containers.SwingContainer;
+import org.netbeans.installer.wizard.ui.SwingUi;
+import org.netbeans.installer.wizard.ui.WizardUi;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class PreInstallSummaryPanel extends ErrorMessagePanel {
+    /////////////////////////////////////////////////////////////////////////////////
+    // Instance
+
+    public PreInstallSummaryPanel() {
+        setProperty(TITLE_PROPERTY,
+                DEFAULT_TITLE);
+        setProperty(DESCRIPTION_PROPERTY,
+                DEFAULT_DESCRIPTION);
+
+        setProperty(INSTALLATION_FOLDER_PROPERTY,
+                DEFAULT_INSTALLATION_FOLDER);
+
+        setProperty(UNINSTALL_LABEL_TEXT_PROPERTY,
+                DEFAULT_UNINSTALL_LABEL_TEXT);
+
+        setProperty(INSTALLATION_SIZE_PROPERTY,
+                DEFAULT_INSTALLATION_SIZE);
+        setProperty(DOWNLOAD_SIZE_PROPERTY,
+                DEFAULT_DOWNLOAD_SIZE);
+
+        setProperty(NEXT_BUTTON_TEXT_PROPERTY,
+                DEFAULT_NEXT_BUTTON_TEXT);
+
+        setProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY,
+                DEFAULT_ERROR_NOT_ENOUGH_SPACE);
+        setProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY,
+                DEFAULT_ERROR_CANNOT_CHECK_SPACE);
+        setProperty(ERROR_LOGIC_ACCESS_PROPERTY,
+                DEFAULT_ERROR_LOGIC_ACCESS);
+        setProperty(ERROR_FSROOTS_PROPERTY,
+                DEFAULT_ERROR_FSROOTS);
+        setProperty(ERROR_NON_EXISTENT_ROOT_PROPERTY,
+                DEFAULT_ERROR_NON_EXISTENT_ROOT);
+        setProperty(ERROR_CANNOT_WRITE_PROPERTY,
+                DEFAULT_ERROR_CANNOT_WRITE);
+        setProperty(REMOVE_APP_USERDIR_TEXT_PROPERTY,
+                DEFAULT_REMOVE_APP_USERDIR_TEXT);
+        setProperty(REMOVE_APP_USERDIR_CHECKBOX_PROPERTY,
+                DEFAULT_REMOVE_APP_USERDIR_CHECKBOX);
+        
+    }
+
+    @Override
+    public WizardUi getWizardUi() {
+        if (wizardUi == null) {
+            wizardUi = new PreInstallSummaryPanelUi(this);
+        }
+
+        return wizardUi;
+    }
+
+    @Override
+    public void initialize() {
+        final List<Product> toInstall =
+                Registry.getInstance().getProductsToInstall();
+
+        if (toInstall.size() > 0) {
+            setProperty(NEXT_BUTTON_TEXT_PROPERTY, DEFAULT_NEXT_BUTTON_TEXT);
+            setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION);
+        } else {
+            setProperty(NEXT_BUTTON_TEXT_PROPERTY, DEFAULT_NEXT_BUTTON_TEXT_UNINSTALL);
+            setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION_UNINSTALL);
+        }
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Inner Classes
+    public static class PreInstallSummaryPanelUi extends ErrorMessagePanelUi {
+
+        protected PreInstallSummaryPanel component;
+
+        public PreInstallSummaryPanelUi(PreInstallSummaryPanel component) {
+            super(component);
+
+            this.component = component;
+        }
+
+        @Override
+        public SwingUi getSwingUi(SwingContainer container) {
+            if (swingUi == null) {
+                swingUi = new PreInstallSummaryPanelSwingUi(component, container);
+            }
+
+            return super.getSwingUi(container);
+        }
+    }
+
+    public static class PreInstallSummaryPanelSwingUi extends ErrorMessagePanelSwingUi {
+
+        protected PreInstallSummaryPanel component;
+        private NbiTextPane locationsPane;
+        private NbiLabel uninstallListLabel;
+        private NbiTextPane uninstallListPane;
+        private NbiLabel installationSizeLabel;
+        private NbiLabel installationSizeValue;
+        private NbiLabel downloadSizeLabel;
+        private NbiLabel downloadSizeValue;
+        private NbiCheckBox removeUserdirCheckbox;
+        private NbiTextPane removeUserdirPane;
+        private NbiPanel spacer;
+        private int gridy = 0;
+
+        public PreInstallSummaryPanelSwingUi(
+                final PreInstallSummaryPanel component,
+                final SwingContainer container) {
+            super(component, container);
+
+            this.component = component;
+            initComponents();
+        }
+
+        // protected ////////////////////////////////////////////////////////////////
+        @Override
+        protected void initializeContainer() {
+            super.initializeContainer();
+
+            container.getNextButton().setText(
+                    panel.getProperty(NEXT_BUTTON_TEXT_PROPERTY));
+        }
+
+        @Override
+        protected void initialize() {
+            final Registry registry = Registry.getInstance();
+
+            final StringBuilder text = new StringBuilder();
+            long installationSize = 0;
+            long downloadSize = 0;
+
+            for (Product product : registry.getProductsToInstall()) {
+                installationSize += product.getRequiredDiskSpace();
+                downloadSize += product.getDownloadSize();
+
+
+            }
+
+            // add top-level components like nb-base, glassfish, tomcat, jdk
+            for (Product product : registry.getProductsToInstall()) {
+                text.append(StringUtils.LF);
+                text.append(StringUtils.format(panel.getProperty(INSTALLATION_FOLDER_PROPERTY),
+                        product.getDisplayName()));
+                text.append(StringUtils.LF);
+                text.append("    " + product.getInstallationLocation());
+                text.append(StringUtils.LF);
+            }
+            locationsPane.setText(text);
+
+            List<Product> toUninstall = registry.getProductsToUninstall();
+            String uninstallLabelText = toUninstall.size() > 0 ? StringUtils.format(
+                    panel.getProperty(UNINSTALL_LABEL_TEXT_PROPERTY),
+                    toUninstall.get(0).getDisplayName()) : "";
+
+            uninstallListLabel.setText(uninstallLabelText);
+
+            
+            installationSizeLabel.setText(
+                    panel.getProperty(INSTALLATION_SIZE_PROPERTY));
+            installationSizeValue.setText(StringUtils.formatSize(
+                    installationSize));
+
+            downloadSizeLabel.setText(
+                    panel.getProperty(DOWNLOAD_SIZE_PROPERTY));
+            downloadSizeValue.setText(StringUtils.formatSize(
+                    downloadSize));
+
+            if (registry.getProductsToInstall().size() == 0) {
+                locationsPane.setVisible(false);
+                installationSizeLabel.setVisible(false);
+                installationSizeValue.setVisible(false);
+            } else {
+                locationsPane.setVisible(true);
+                installationSizeLabel.setVisible(true);
+                installationSizeValue.setVisible(true);
+            }
+
+            if (registry.getProductsToUninstall().size() == 0) {
+                uninstallListLabel.setVisible(false);
+                uninstallListPane.setVisible(false);
+            } else {
+                uninstallListLabel.setVisible(true);
+                uninstallListPane.setVisible(true);
+            }
+
+            downloadSizeLabel.setVisible(false);
+            downloadSizeValue.setVisible(false);
+            for (RegistryNode remoteNode : registry.getNodes(RegistryType.REMOTE)) {
+                if (remoteNode.isVisible()) {
+                    downloadSizeLabel.setVisible(true);
+                    downloadSizeValue.setVisible(true);
+                }
+            }
+
+            if (Boolean.getBoolean(REMOVE_APP_USERDIR_PROPERTY)) {
+                removeUserdirCheckbox.doClick();
+            }
+
+            removeUserdirCheckbox.setVisible(false);
+            removeUserdirPane.setVisible(false);
+            
+            for (Product product : Registry.getInstance().getProductsToUninstall()) {
+
+                try {
+                    File installLocation = product.getInstallationLocation();
+                    LogManager.log("... product installation directory: " + installLocation);
+                    File userDir = NetBeansRCPUtils.getApplicationUserDirFile(installLocation);
+                    LogManager.log("... product userdir: " + userDir);
+                    if (FileUtils.exists(userDir) && FileUtils.canWrite(userDir)) {
+                        removeUserdirCheckbox.setText(
+                                StringUtils.format(
+                                panel.getProperty(REMOVE_APP_USERDIR_CHECKBOX_PROPERTY),
+                                userDir.getAbsolutePath()));
+                        removeUserdirCheckbox.setBorder(new EmptyBorder(0, 0, 0, 0));
+                        removeUserdirCheckbox.setVisible(true);
+
+                        removeUserdirPane.setVisible(true);
+                        removeUserdirPane.setContentType("text/html");
+                        
+                        removeUserdirPane.setText(
+                                StringUtils.format(
+                                panel.getProperty(REMOVE_APP_USERDIR_TEXT_PROPERTY),
+                                product.getDisplayName()));
+
+                    }
+                    break;
+                } catch (IOException e) {
+                    LogManager.log(e);
+                }
+
+            }
+
+            //if(productCheckboxList!=null) {
+            //    for(Pair <Product, NbiCheckBox> pair : productCheckboxList) {
+            //        pair.getSecond().doClick();
+            //    }
+            //}            
+            super.initialize();
+        }
+
+        @Override
+        protected String validateInput() {
+            try {
+                if (!Boolean.getBoolean(SystemUtils.NO_SPACE_CHECK_PROPERTY)) {
+                    final List<File> roots =
+                            SystemUtils.getFileSystemRoots();
+                    final List<Product> toInstall =
+                            Registry.getInstance().getProductsToInstall();
+                    final Map<File, Long> spaceMap =
+                            new HashMap<File, Long>();
+
+                    LogManager.log("Available roots : " + StringUtils.asString(roots));
+
+                    File downloadDataDirRoot = FileUtils.getRoot(
+                            Installer.getInstance().getLocalDirectory(), roots);
+                    long downloadSize = 0;
+                    for (Product product : toInstall) {
+                        downloadSize += product.getDownloadSize();
+                    }
+                    // the critical check point - we download all the data
+                    spaceMap.put(downloadDataDirRoot, new Long(downloadSize));
+                    long lastDataSize = 0;
+                    for (Product product : toInstall) {
+                        final File installLocation = product.getInstallationLocation();
+                        final File root = FileUtils.getRoot(installLocation, roots);
+                        final long productSize = product.getRequiredDiskSpace();
+
+                        LogManager.log("    [" + root + "] <- " + installLocation);
+
+                        if (root != null) {
+                            Long ddSize = spaceMap.get(downloadDataDirRoot);
+                            // remove space that was freed after the remove of previos product data
+                            spaceMap.put(downloadDataDirRoot,
+                                    Long.valueOf(ddSize - lastDataSize));
+
+                            // add space required for next product installation
+                            Long size = spaceMap.get(root);
+                            size = Long.valueOf(
+                                    (size != null ? size.longValue() : 0L)
+                                    + productSize);
+                            spaceMap.put(root, size);
+                            lastDataSize = product.getDownloadSize();
+                        } else {
+                            return StringUtils.format(
+                                    panel.getProperty(ERROR_NON_EXISTENT_ROOT_PROPERTY),
+                                    product, installLocation);
+                        }
+                    }
+
+                    for (File root : spaceMap.keySet()) {
+                        try {
+                            final long availableSpace =
+                                    SystemUtils.getFreeSpace(root);
+                            final long requiredSpace =
+                                    spaceMap.get(root) + REQUIRED_SPACE_ADDITION;
+
+                            if (availableSpace < requiredSpace) {
+                                return StringUtils.format(
+                                        panel.getProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY),
+                                        root,
+                                        StringUtils.formatSize(requiredSpace - availableSpace));
+                            }
+                        } catch (NativeException e) {
+                            ErrorManager.notifyError(
+                                    panel.getProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY),
+                                    e);
+                        }
+                    }
+                }
+
+                final List<Product> toUninstall =
+                        Registry.getInstance().getProductsToUninstall();
+                for (Product product : toUninstall) {
+                    if (!FileUtils.canWrite(product.getInstallationLocation())) {
+                        return StringUtils.format(
+                                panel.getProperty(ERROR_CANNOT_WRITE_PROPERTY),
+                                product,
+                                product.getInstallationLocation());
+                    }
+                }
+
+            } catch (IOException e) {
+                ErrorManager.notifyError(
+                        panel.getProperty(ERROR_FSROOTS_PROPERTY), e);
+            }
+
+            return null;
+        }
+
+        // private //////////////////////////////////////////////////////////////////
+        private void initComponents() {
+            gridy = 0;
+
+            // locationsPane ////////////////////////////////////////////////////////
+            locationsPane = new NbiTextPane();
+
+            // uninstallListPane ////////////////////////////////////////////////////
+            uninstallListPane = new NbiTextPane();
+
+            // uninstallListLabel ///////////////////////////////////////////////////
+            uninstallListLabel = new NbiLabel();
+            uninstallListLabel.setLabelFor(uninstallListPane);
+
+            // installationSizeValue ////////////////////////////////////////////////
+            installationSizeValue = new NbiLabel();
+            //installationSizeValue.setFocusable(true);
+
+            // installationSizeLabel ////////////////////////////////////////////////
+            installationSizeLabel = new NbiLabel();
+            installationSizeLabel.setLabelFor(installationSizeValue);
+
+            // downloadSizeValue ////////////////////////////////////////////////////
+            downloadSizeValue = new NbiLabel();
+            //downloadSizeValue.setFocusable(true);
+
+            // downloadSizeLabel ////////////////////////////////////////////////////
+            downloadSizeLabel = new NbiLabel();
+            downloadSizeLabel.setLabelFor(downloadSizeValue);
+
+            // spacer ///////////////////////////////////////////////////////////////
+            spacer = new NbiPanel();
+
+            // this /////////////////////////////////////////////////////////////////
+            add(locationsPane, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(11, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(uninstallListLabel, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(11, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(uninstallListPane, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(0, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???            
+            int gridy0 = gridy;
+            gridy++;
+
+            removeUserdirPane = new NbiTextPane();
+            add(removeUserdirPane, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(11, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+
+            removeUserdirCheckbox = new NbiCheckBox();
+            add(removeUserdirCheckbox, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.PAGE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(4, 20, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+
+            removeUserdirCheckbox.addActionListener(new ActionListener() {
+
+                public void actionPerformed(ActionEvent e) {
+                    System.setProperty(REMOVE_APP_USERDIR_PROPERTY,
+                            "" + removeUserdirCheckbox.isSelected());
+                }
+            });
+
+            add(installationSizeLabel, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(22, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(installationSizeValue, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(4, 22, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(downloadSizeLabel, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(4, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(downloadSizeValue, new GridBagConstraints(
+                    0, gridy++, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(4, 22, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            add(spacer, new GridBagConstraints(
+                    0, gridy + 10, // x, y
+                    1, 1, // width, height
+                    1.0, 1.0, // weight-x, weight-y
+                    GridBagConstraints.CENTER, // anchor
+                    GridBagConstraints.BOTH, // fill
+                    new Insets(0, 11, 0, 11), // padding
+                    0, 0));                           // padx, pady - ???
+        }
+    }
+/////////////////////////////////////////////////////////////////////////////////
+// Constants
+    public static final String INSTALLATION_FOLDER_PROPERTY =
+            "installation.folder"; // NOI18N
+    public static final String UNINSTALL_LABEL_TEXT_PROPERTY =
+            "uninstall.list.label.text"; // NOI18N
+    public static final String INSTALLATION_SIZE_PROPERTY =
+            "installation.size"; // NOI18N
+    public static final String DOWNLOAD_SIZE_PROPERTY =
+            "download.size"; // NOI18N
+    public static final String ERROR_NOT_ENOUGH_SPACE_PROPERTY =
+            "error.not.enough.space"; // NOI18N
+    public static final String ERROR_CANNOT_CHECK_SPACE_PROPERTY =
+            "error.cannot.check.space"; // NOI18N
+    public static final String ERROR_LOGIC_ACCESS_PROPERTY =
+            "error.logic.access"; // NOI18N
+    public static final String ERROR_FSROOTS_PROPERTY =
+            "error.fsroots"; // NOI18N
+    public static final String ERROR_NON_EXISTENT_ROOT_PROPERTY =
+            "error.non.existent.root"; // NOI18N
+    public static final String ERROR_CANNOT_WRITE_PROPERTY =
+            "error.cannot.write"; // NOI18N
+    public static final String REMOVE_APP_USERDIR_PROPERTY =
+            "remove.app.userdir";
+    public static final String REMOVE_APP_USERDIR_TEXT_PROPERTY =
+            "remove.app.userdir.text";
+    public static final String REMOVE_APP_USERDIR_CHECKBOX_PROPERTY =
+            "remove.app.userdir.checkbox";
+    public static final String DEFAULT_TITLE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.title"); // NOI18N
+    public static final String DEFAULT_DESCRIPTION =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.description"); // NOI18N
+    public static final String DEFAULT_DESCRIPTION_UNINSTALL =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.description.uninstall"); // NOI18N
+    public static final String DEFAULT_INSTALLATION_FOLDER =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.installation.folder"); // NOI18N
+    public static final String DEFAULT_UNINSTALL_LABEL_TEXT =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.uninstall.list.label.text"); // NOI18N
+    public static final String DEFAULT_INSTALLATION_SIZE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.installation.size"); // NOI18N
+    public static final String DEFAULT_DOWNLOAD_SIZE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.download.size"); // NOI18N
+    public static final String DEFAULT_NEXT_BUTTON_TEXT =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.next.button.text"); // NOI18N
+    public static final String DEFAULT_NEXT_BUTTON_TEXT_UNINSTALL =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.next.button.text.uninstall"); // NOI18N
+    public static final String DEFAULT_ERROR_NOT_ENOUGH_SPACE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.not.enough.space"); // NOI18N
+    public static final String DEFAULT_ERROR_CANNOT_CHECK_SPACE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.cannot.check.space");// NOI18N
+    public static final String DEFAULT_ERROR_LOGIC_ACCESS =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.logic.access");// NOI18N
+    public static final String DEFAULT_ERROR_FSROOTS =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.fsroots"); // NOI18N
+    public static final String DEFAULT_ERROR_NON_EXISTENT_ROOT =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.non.existent.root"); // NOI18N
+    public static final String DEFAULT_ERROR_CANNOT_WRITE =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.error.cannot.write"); // NOI18N
+    public static final String DEFAULT_REMOVE_APP_USERDIR_TEXT =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.remove.app.userdir.text"); // NOI18N
+    
+    public static final String DEFAULT_REMOVE_APP_USERDIR_CHECKBOX =
+            ResourceUtils.getString(PreInstallSummaryPanel.class,
+            "PrISP.remove.app.userdir.checkbox"); // NOI18N
+    public static final long REQUIRED_SPACE_ADDITION =
+            10L * 1024L * 1024L; // 10MB
+}

+ 333 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/WelcomePanel.java

@@ -0,0 +1,333 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+package org.mycompany.installer.wizard.components.panels;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import java.io.File;
+import java.util.List;
+import org.netbeans.installer.product.Registry;
+import org.netbeans.installer.product.components.Product;
+import org.netbeans.installer.utils.ErrorManager;
+import org.netbeans.installer.utils.LogManager;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.StringUtils;
+import org.netbeans.installer.utils.SystemUtils;
+import org.netbeans.installer.utils.exceptions.InitializationException;
+import org.netbeans.installer.utils.helper.Platform;
+import org.netbeans.installer.utils.helper.swing.NbiPanel;
+import org.netbeans.installer.utils.helper.swing.NbiTextPane;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelSwingUi;
+import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelUi;
+import org.netbeans.installer.wizard.containers.SwingContainer;
+import org.netbeans.installer.wizard.ui.SwingUi;
+import org.netbeans.installer.wizard.ui.WizardUi;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class WelcomePanel extends ErrorMessagePanel {
+    /////////////////////////////////////////////////////////////////////////////////
+    private Registry bundledRegistry;
+    private Registry defaultRegistry;
+
+    public WelcomePanel() {
+        setProperty(TITLE_PROPERTY,
+                DEFAULT_TITLE);
+        setProperty(DESCRIPTION_PROPERTY,
+                DEFAULT_DESCRIPTION);
+
+        setProperty(WELCOME_TEXT_PROPERTY,
+                DEFAULT_WELCOME_TEXT);
+
+        setProperty(WELCOME_ALREADY_INSTALLED_TEXT_PROPERTY,
+                DEFAULT_WELCOME_ALREADY_INSTALLED_TEXT);
+        setProperty(WELCOME_ALREADY_INSTALLED_NEXT_BUTTON_TEXT_PROPERTY,
+                DEFAULT_WELCOME_ALREADY_INSTALLED_NEXT_BUTTON_TEXT);
+
+       try {
+            defaultRegistry = Registry.getInstance();
+            bundledRegistry = new Registry();
+
+            final String bundledRegistryUri = System.getProperty(
+                    Registry.BUNDLED_PRODUCT_REGISTRY_URI_PROPERTY);
+            if (bundledRegistryUri != null) {
+                bundledRegistry.loadProductRegistry(bundledRegistryUri);
+            } else {
+                bundledRegistry.loadProductRegistry(
+                        Registry.DEFAULT_BUNDLED_PRODUCT_REGISTRY_URI);
+            }
+        } catch (InitializationException e) {
+            ErrorManager.notifyError("Cannot load bundled registry", e);
+        }
+
+    }
+
+    Registry getBundledRegistry() {
+        return bundledRegistry;
+    }
+
+    @Override
+    public WizardUi getWizardUi() {
+        if (wizardUi == null) {
+            wizardUi = new WelcomePanelUi(this);
+        }
+
+        return wizardUi;
+    }
+
+    @Override
+    public boolean canExecuteForward() {
+        return canExecute();
+    }
+
+    @Override
+    public boolean canExecuteBackward() {
+        return canExecute();
+    }
+
+        // private //////////////////////////////////////////////////////////////////////
+    private boolean canExecute() {
+        return bundledRegistry.getNodes().size() > 1;
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Inner Classes
+    public static class WelcomePanelUi extends ErrorMessagePanelUi {
+
+        protected WelcomePanel component;
+
+        public WelcomePanelUi(WelcomePanel component) {
+            super(component);
+
+            this.component = component;
+        }
+
+        @Override
+        public SwingUi getSwingUi(SwingContainer container) {
+            if (swingUi == null) {
+                swingUi = new WelcomePanelSwingUi(component, container);
+            }
+
+            return super.getSwingUi(container);
+        }
+    }
+
+    public static class WelcomePanelSwingUi extends ErrorMessagePanelSwingUi {
+
+        protected WelcomePanel panel;
+        private NbiTextPane textPane;
+
+        private NbiPanel leftImagePanel;
+        ValidatingThread validatingThread;
+
+        public WelcomePanelSwingUi(
+                final WelcomePanel component,
+                final SwingContainer container) {
+            super(component, container);
+
+            this.panel = component;
+
+            initComponents();
+        }
+
+        @Override
+        public String getTitle() {
+            return null; // the welcome page does not have a title
+        }
+
+        // protected ////////////////////////////////////////////////////////////////
+        @Override
+        protected void initializeContainer() {
+            super.initializeContainer();
+
+            container.getBackButton().setVisible(false);
+        }
+
+        @Override
+        protected void initialize() {
+
+            textPane.setContentType("text/html");
+            textPane.setText(StringUtils.format(panel.getProperty(WELCOME_TEXT_PROPERTY)));
+            List<Product> toInstall = Registry.getInstance().getProductsToInstall();
+            if(toInstall.isEmpty()) {
+                List <Product> list = panel.getBundledRegistry().getProducts();
+                if(list.size() == 1) {
+                    if(SystemUtils.getCurrentPlatform().isCompatibleWith(list.get(0).getPlatforms())) {
+                        File installationLocation = list.get(0).getInstallationLocation();
+                        textPane.setText(
+                            StringUtils.format(
+                            panel.getProperty(WELCOME_ALREADY_INSTALLED_TEXT_PROPERTY),
+                            list.get(0).getDisplayName(),
+                            installationLocation.getAbsolutePath()));
+                    } else {
+                        textPane.setText(
+                            StringUtils.format(
+                            WELCOME_INCOMPATIBLE_PLATFORM_TEXT,
+                            list.get(0).getDisplayName()));
+                    }
+                    container.getCancelButton().setVisible(false);
+                    container.getNextButton().setText(panel.getProperty(
+                            WELCOME_ALREADY_INSTALLED_NEXT_BUTTON_TEXT_PROPERTY));
+                }
+            }            
+
+            super.initialize();
+        }
+
+        // private //////////////////////////////////////////////////////////////////
+        private void initComponents() {
+            // textPane /////////////////////////////////////////////////////////////
+            textPane = new NbiTextPane();
+
+            leftImagePanel = new NbiPanel();
+            int width = 0;
+            int height = 0;
+            final String topLeftImage = SystemUtils.resolveString(
+                    System.getProperty(
+                    WELCOME_PAGE_LEFT_TOP_IMAGE_PROPERTY));
+            final String bottomLeftImage = SystemUtils.resolveString(
+                    System.getProperty(
+                    WELCOME_PAGE_LEFT_BOTTOM_IMAGE_PROPERTY));
+
+            int bottomAnchor = NbiPanel.ANCHOR_BOTTOM_LEFT;
+
+            if (topLeftImage != null) {
+                leftImagePanel.setBackgroundImage(topLeftImage, ANCHOR_TOP_LEFT);
+                width = leftImagePanel.getBackgroundImage(NbiPanel.ANCHOR_TOP_LEFT).getIconWidth();
+                height += leftImagePanel.getBackgroundImage(NbiPanel.ANCHOR_TOP_LEFT).getIconHeight();
+            }
+            if (bottomLeftImage != null) {
+                leftImagePanel.setBackgroundImage(bottomLeftImage, bottomAnchor);
+                width = leftImagePanel.getBackgroundImage(bottomAnchor).getIconWidth();
+                height += leftImagePanel.getBackgroundImage(bottomAnchor).getIconHeight();
+            }
+
+            leftImagePanel.setPreferredSize(new Dimension(width, height));
+            leftImagePanel.setMaximumSize(new Dimension(width, height));
+            leftImagePanel.setMinimumSize(new Dimension(width, 0));
+            leftImagePanel.setSize(new Dimension(width, height));
+
+            leftImagePanel.setOpaque(false);
+            // this /////////////////////////////////////////////////////////////////
+            int dy = 0;
+            add(leftImagePanel, new GridBagConstraints(
+                    0, 0, // x, y
+                    1, 100, // width, height
+                    0.0, 1.0, // weight-x, weight-y
+                    GridBagConstraints.WEST, // anchor
+                    GridBagConstraints.VERTICAL, // fill
+                    new Insets(0, 0, 0, 0), // padding
+                    0, 0));                           // padx, pady - ???
+            add(textPane, new GridBagConstraints(
+                    1, dy++, // x, y
+                    4, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.LINE_START, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(10, 11, 11, 11), // padding
+                    0, 0));                           // padx, pady - ???
+            
+            NbiTextPane separatorPane = new NbiTextPane();
+
+            separatorPane = new NbiTextPane();
+            add(separatorPane, new GridBagConstraints(
+                    3, dy, // x, y
+                    1, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.CENTER, // anchor
+                    GridBagConstraints.BOTH, // fill
+                    new Insets(0, 0, 0, 0), // padding
+                    0, 0));                           // padx, pady - ???
+
+
+            // move error label after the left welcome image
+            Component errorLabel = getComponent(0);
+            getLayout().removeLayoutComponent(errorLabel);
+            add(errorLabel, new GridBagConstraints(
+                    1, 99, // x, y
+                    99, 1, // width, height
+                    1.0, 0.0, // weight-x, weight-y
+                    GridBagConstraints.CENTER, // anchor
+                    GridBagConstraints.HORIZONTAL, // fill
+                    new Insets(4, 11, 4, 0), // padding
+                    0, 0));                            // ??? (padx, pady)
+
+
+        }
+    }
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    public static final String DEFAULT_TITLE =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.title");
+    public static final String DEFAULT_DESCRIPTION =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.description"); // NOI18N
+    public static final String WELCOME_TEXT_PROPERTY =
+            "welcome.text"; // NOI18N
+    public static final String WELCOME_ALREADY_INSTALLED_TEXT_PROPERTY =
+            "welcome.already.installed.text"; // NOI18N
+    public static final String WELCOME_ALREADY_INSTALLED_NEXT_BUTTON_TEXT_PROPERTY =
+            "welcome.already.installed.next.button.text";//NOI18N
+    public static final String WELCOME_INCOMPATIBLE_PLATFORM_TEXT =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.incompatible.platform.text");//NOI18N
+
+    public static final String DEFAULT_WELCOME_ALREADY_INSTALLED_NEXT_BUTTON_TEXT =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.already.installed.next.button.text");//NOI18N
+    
+    public static final String DEFAULT_WELCOME_TEXT =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.welcome.text"); // NOI18N
+
+    public static final String DEFAULT_WELCOME_ALREADY_INSTALLED_TEXT =
+            ResourceUtils.getString(WelcomePanel.class,
+            "WP.already.installed.text"); // NOI18N
+
+    public static final String WELCOME_PAGE_LEFT_TOP_IMAGE_PROPERTY =
+            "nbi.wizard.ui.swing.welcome.left.top.image";//NOI18N
+    public static final String WELCOME_PAGE_LEFT_BOTTOM_IMAGE_PROPERTY =
+            "nbi.wizard.ui.swing.welcome.left.bottom.image";//NOI18N
+}

BIN
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/resources/welcome-left-bottom.png


BIN
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/panels/resources/welcome-left-top.png


+ 43 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/sequences/Bundle.properties

@@ -0,0 +1,43 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+#####################################################################################
+# MainSequence.java
+MS.IA.title=Installation
+MS.IA.description=Please wait while the installer installs {product-name}.

+ 154 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/components/sequences/MainSequence.java

@@ -0,0 +1,154 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU General
+ * Public License Version 2 only ("GPL") or the Common Development and Distribution
+ * License("CDDL") (collectively, the "License"). You may not use this file except in
+ * compliance with the License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+ * License for the specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header Notice in
+ * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+ * designates this particular file as subject to the "Classpath" exception as
+ * provided by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License Header,
+ * with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyrighted [year] [name of copyright owner]"
+ * 
+ * Contributor(s):
+ * 
+ * The Original Software is NetBeans. The Initial Developer of the Original Software
+ * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+ * Rights Reserved.
+ * 
+ * If you wish your version of this file to be governed by only the CDDL or only the
+ * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+ * this software in this distribution under the [CDDL or GPL Version 2] license." If
+ * you do not indicate a single choice of license, a recipient has the option to
+ * distribute your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above. However, if
+ * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
+ * the option applies only if the new code is made subject to such option by the
+ * copyright holder.
+ */
+package org.mycompany.installer.wizard.components.sequences;
+
+import org.netbeans.installer.wizard.components.sequences.ProductWizardSequence;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.mycompany.installer.wizard.components.panels.PostInstallSummaryPanel;
+import org.mycompany.installer.wizard.components.panels.PreInstallSummaryPanel;
+import org.netbeans.installer.product.components.Product;
+import org.netbeans.installer.product.Registry;
+import org.netbeans.installer.utils.ResourceUtils;
+import org.netbeans.installer.utils.helper.ExecutionMode;
+import org.netbeans.installer.wizard.components.WizardSequence;
+import org.netbeans.installer.wizard.components.actions.DownloadConfigurationLogicAction;
+import org.netbeans.installer.wizard.components.actions.DownloadInstallationDataAction;
+import org.netbeans.installer.wizard.components.actions.InstallAction;
+import org.netbeans.installer.wizard.components.actions.UninstallAction;
+import org.netbeans.installer.wizard.components.panels.LicensesPanel;
+
+/**
+ *
+ * @author Dmitry Lipin
+ */
+public class MainSequence extends WizardSequence {
+    /////////////////////////////////////////////////////////////////////////////////
+    // Instance
+
+    private DownloadConfigurationLogicAction downloadConfigurationLogicAction;
+    private LicensesPanel licensesPanel;
+    private PreInstallSummaryPanel preInstallSummaryPanel;
+    private UninstallAction uninstallAction;
+    private DownloadInstallationDataAction downloadInstallationDataAction;
+    private InstallAction installAction;
+    private PostInstallSummaryPanel postInstallSummaryPanel;
+    private Map<Product, ProductWizardSequence> productSequences;
+
+    public MainSequence() {
+        downloadConfigurationLogicAction = new DownloadConfigurationLogicAction();
+        licensesPanel = new LicensesPanel();
+        preInstallSummaryPanel = new PreInstallSummaryPanel();
+        uninstallAction = new UninstallAction();
+        downloadInstallationDataAction = new DownloadInstallationDataAction();
+        installAction = new InstallAction();
+        postInstallSummaryPanel = new PostInstallSummaryPanel();
+        productSequences = new HashMap<Product, ProductWizardSequence>();
+
+        installAction.setProperty(InstallAction.TITLE_PROPERTY,
+                DEFAULT_IA_TITLE);
+        installAction.setProperty(InstallAction.DESCRIPTION_PROPERTY,
+                DEFAULT_IA_DESCRIPTION);
+    }
+    
+    @Override
+    public void executeForward() {
+        final Registry registry = Registry.getInstance();
+        final List<Product> toInstall = registry.getProductsToInstall();
+        final List<Product> toUninstall = registry.getProductsToUninstall();
+
+        // remove all current children (if there are any), as the components
+        // selection has probably changed and we need to rebuild from scratch
+        getChildren().clear();
+
+        // the set of wizard components differs greatly depending on the execution
+        // mode - if we're installing, we ask for input, run a wizard sequence for
+        // each selected component and then download and install; if we're creating
+        // a bundle, we only need to download and package things
+
+        if (toInstall.size() > 0) {
+            addChild(downloadConfigurationLogicAction);
+            addChild(licensesPanel);
+
+            for (Product product : toInstall) {
+                if (!productSequences.containsKey(product)) {
+                    productSequences.put(
+                            product,
+                            new ProductWizardSequence(product));
+                }
+
+                addChild(productSequences.get(product));
+            }
+        }
+
+        addChild(preInstallSummaryPanel);
+
+        if (toUninstall.size() > 0) {
+            addChild(uninstallAction);
+        }
+
+        if (toInstall.size() > 0) {
+            addChild(downloadInstallationDataAction);
+            addChild(installAction);            
+        }
+
+        addChild(postInstallSummaryPanel);
+        
+        super.executeForward();
+    }
+
+    @Override
+    public boolean canExecuteForward() {
+        return ExecutionMode.NORMAL == ExecutionMode.getCurrentExecutionMode() &&
+                (Registry.getInstance().getProductsToInstall().size() > 0 ||
+                Registry.getInstance().getProductsToUninstall().size() > 0);
+    }
+    /////////////////////////////////////////////////////////////////////////////////
+    // Constants
+    public static final String DEFAULT_IA_TITLE =
+            ResourceUtils.getString(
+            MainSequence.class,
+            "MS.IA.title"); // NOI18N
+    public static final String DEFAULT_IA_DESCRIPTION =
+            ResourceUtils.getString(
+            MainSequence.class,
+            "MS.IA.description"); // NOI18N   
+    
+}

+ 52 - 0
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-components.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<wizard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="wizard-components.xsd">
+    <component 
+        class="org.mycompany.installer.wizard.components.actions.InitializeAction"/>
+    <component 
+        class="org.mycompany.installer.wizard.components.panels.WelcomePanel"/>
+    <component 
+        class="org.mycompany.installer.wizard.components.sequences.MainSequence"/>
+    <component 
+        class="org.netbeans.installer.wizard.components.sequences.CreateBundleSequence"/>
+    <component 
+        class="org.netbeans.installer.wizard.components.actions.FinalizeRegistryAction"/>
+</wizard>

BIN
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-left.png


BIN
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-right.png


BIN
nbi/stub/ext/engine/src/org/mycompany/installer/wizard/wizard-icon.png


+ 77 - 0
nbi/stub/ext/infra/build/engine/build.properties

@@ -0,0 +1,77 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+# path to the directory where the base build scripts library and properties 
+# reside
+common.dir=../../../../.common
+
+# path to the local working directory; this directory which will be the target 
+# for checking out the sources and will be used for the build process
+# * this path can be either absolute or relative in any unix environment, 
+#   however, only relative paths are supported on windows, as the cygwin scp 
+#   command does not properly handle colon in local paths
+work.dir=./build
+
+# path to the local distributive directory; this directory will contain the 
+# distributive file, when (if) the build script finishes successfully
+dist.dir=./dist
+
+# path to the engine sources within the cvs module; it should be a relative 
+# path from the module's root, e.g. for 'nbi/engine', where 'nbi is the module 
+# name, the path should be 'engine'
+cvs.path=engine
+
+# name of the engine's distributive file
+engine.dist.file.name=nbi-engine.jar
+
+# we do not need to build anything native for the netbeans-specific engine, as it 
+# does not contain any native components
+build.native=false
+
+# custom parameter for the netbeans project build script - in case of the netbeans
+# nbi engine - the location of the core engine jar file
+nb.custom.parameter=-Dreference.NBI_Engine.jar=${core.engine.dist.file}
+
+# sources parameters; a search-and-replace will be run over the sources after 
+# check-out, replacing [token] => [value]; regular expressions are not allowed
+# * ${sources.params.length} - total number of the parameters
+# * indices should start with 1
+# * parameters are not i18n compliant
+
+sources.params.length=0

+ 77 - 0
nbi/stub/ext/infra/build/engine/build.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is the build script for the NetBeans IDE nbi engine instance.
+  
+  It inherits most of the functionality from the base script for building nbi 
+  engine instances, while providing this instance-specific values for several
+  core properties. For more details on the values of these properties see
+  the build.properties file.
+-->
+<project name="netbeans-engine" default="usage" basedir=".">
+    <!-- import the properties that are specific to this environment -->
+    <property file="${environment.properties}"/>
+    
+    <!-- import the properties that are specific to this engine instance -->
+    <property file="build.properties"/>
+    
+    <!-- import the base script for building the engine -->
+    <import file="${common.dir}/engine.xml" optional="false"/>
+    
+    <!-- ============================================================================
+      Default
+    ============================================================================= -->
+    
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            In order to 'clean', 'checkout' and 'build' the engine use the 
+            'build-all' target. To 'clean', 'checkout', 'build' and 
+            'release' - use 'release-all'.
+            
+            For more details, please see the source of this build script.
+        </echo>
+    </target>
+</project>

+ 159 - 0
nbi/stub/ext/infra/build/products/helloworld/build.properties

@@ -0,0 +1,159 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+# Other names may be trademarks of their respective owners.
+#
+# The contents of this file are subject to the terms of either the GNU General Public
+# License Version 2 only ("GPL") or the Common Development and Distribution
+# License("CDDL") (collectively, the "License"). You may not use this file except in
+# compliance with the License. You can obtain a copy of the License at
+# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+# License for the specific language governing permissions and limitations under the
+# License.  When distributing the software, include this License Header Notice in
+# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+# designates this particular file as subject to the "Classpath" exception as provided
+# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+# If applicable, add the following below the License Header, with the fields enclosed
+# by brackets [] replaced by your own identifying information:
+# "Portions Copyrighted [year] [name of copyright owner]"
+# 
+# Contributor(s):
+# 
+# The Original Software is NetBeans. The Initial Developer of the Original Software
+# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+# Rights Reserved.
+# 
+# If you wish your version of this file to be governed by only the CDDL or only the
+# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+# this software in this distribution under the [CDDL or GPL Version 2] license." If
+# you do not indicate a single choice of license, a recipient has the option to
+# distribute your version of this file under either the CDDL, the GPL Version 2 or
+# to extend the choice of license to its licensees as provided above. However, if you
+# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+# option applies only if the new code is made subject to such option by the copyright
+# holder.
+# 
+
+# path to the directory where the base build scripts library and properties 
+# reside
+common.dir=../../../../../.common
+
+# path to the local working directory; this directory which will be the target 
+# for checking out the sources and will be used for the build process
+# * this path can be either absolute or relative in any unix environment, 
+#   however, only relative paths are supported on windows, as the cygwin scp 
+#   command does not properly handle colon in local paths
+work.dir=./build
+
+# path to the local distributive directory; this directory will contain the 
+# distributive file, when (if) the build script finishes successfully
+dist.dir=./dist
+
+# path to the products's sources within the cvs module; it should be a relative 
+# path from the module's root, e.g. for 'nbi/engine', where 'nbi is the module 
+# name, the path should be 'engine'
+cvs.path=components/products/helloworld
+
+# core product properties: 
+# * ${product.uid} - product "family" (e.g. nb-ide)
+# * ${product.version} - actual products' version; together with the uid it 
+#   forms the unique identifier for the product)
+# * ${product.platforms} - the list of platforms that are supported by this 
+#   product (note that this property is not related to native libraries)
+product.uid={product-uid}
+product.version={product-version}
+product.platforms=generic
+
+# miscellaneous product properties:
+# * ${product.status} - default status that the product will have in the 
+#   registry. it is meant to be always "not-installed", unless you want 
+#   something really exotic
+# * ${product.offset} - order of the product's node among its parent's 
+#   children, the bigger the offset value, the further the product's node will 
+#   be
+# * ${product.expand} - whether to automatically expand the product's node in 
+#   the components tree or not; 'true'/'false'
+# * ${product.visible} - whether the product's node is visible or not (note 
+#   that this value will be modified at nbi runtime, 'true' may become 'false' 
+#   if the product is filtered out); 'true'/'false'
+# * ${product.features} - list of features that this porduct belongs to; the 
+#   list should be space-separated
+product.status=not-installed
+product.offset=20000
+product.expand=false
+product.visible=true
+product.features=
+
+# list of configuration logic jar files; normally the first one would be the 
+# distributive file of the product's netbeans project
+# * ${product.logic.length} - total number of the files
+# * indices should start with 1
+product.logic.length=1
+product.logic.1.path=${nbproject.dist.dir}/${nbproject.dist.file.name}
+
+# list of product installation data files
+# * ${product.data.length} - total number of the files
+# * ${product.data.N.uri} - uri at which the installation data file is located
+# * ${product.data.N.zip} - whether the data file is a zip archive which needs to 
+#   be extracted or it is a file that should be used directly; 'true'/'false'
+# * indices should start with 1
+product.data.length=1
+product.data.1.zip=true
+product.data.1.path={product-data-path}
+product.data.sub.dir={product-data-sub-dir}
+
+# modificator for the required disk space parameter; the core value will be the
+# sum of unzipped unstallation data files
+# * the measurement unit is one byte
+product.disk.space.modificator=0
+
+# product's requirements (i.e. other products that should be installed
+# in order for this product to succesfully install and function)
+# * ${product.requirements.length} - total number of the requirements
+# * indices should start with 1
+product.requirements.length=0
+#product.requirements.1.uid=
+#product.requirements.1.version-lower=
+#product.requirements.1.version-upper=
+
+# product's conflicts (i.e. other products that prevent this product from 
+# functioning correctly, and thus cannot be installed together with it)
+# * ${product.conflicts.length} - total number of the conflicts
+# * indices should start with 1
+product.conflicts.length=0
+#product.conflicts.1.uid=
+#product.conflicts.1.version-lower=
+#product.conflicts.1.version-upper=
+
+# other products that should be installed prior to this product; these 
+# dependencies do not imply that the dependent product will be installed at 
+# all, but if both the current and the dependent product are selected for 
+# installation, the latter will be installed first
+# * ${product.install-afters.length} - total number of the install-afters
+# * indices should start with 1
+product.install-afters.length=0
+#product.install-afters.1.uid=
+
+# additional product's properties; these will appear in the product's 
+# descriptor and in the registry in the form of 
+# <property name="[name]">value</property> tags.
+# * ${product.properties.length} - total number of the properties
+# * indices should start with 1
+# * properties are not i18n compliant
+product.properties.length=3
+product.properties.1.name=installation.location
+product.properties.1.value=$N{install}/{product-install-directory-name}
+product.properties.2.name=installation.location.windows
+product.properties.2.value=$N{install}/{product-install-directory-name-windows}
+product.properties.3.name=installation.location.macosx
+product.properties.3.value=$N{install}/{product-install-directory-name-macosx}.app
+
+# sources parameters; a search-and-replace will be run over the sources after 
+# check-out, replacing [token] => [value]; regular expressions are not allowed
+# * ${sources.params.length} - total number of the parameters
+# * indices should start with 1
+# * parameters are not i18n compliant
+sources.params.length=0

+ 98 - 0
nbi/stub/ext/infra/build/products/helloworld/build.xml

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+  Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
+
+  Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+  Other names may be trademarks of their respective owners.
+
+  The contents of this file are subject to the terms of either the GNU General Public
+  License Version 2 only ("GPL") or the Common Development and Distribution
+  License("CDDL") (collectively, the "License"). You may not use this file except in
+  compliance with the License. You can obtain a copy of the License at
+  http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
+  License for the specific language governing permissions and limitations under the
+  License.  When distributing the software, include this License Header Notice in
+  each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
+  designates this particular file as subject to the "Classpath" exception as provided
+  by Oracle in the GPL Version 2 section of the License file that accompanied this code.
+  If applicable, add the following below the License Header, with the fields enclosed
+  by brackets [] replaced by your own identifying information:
+  "Portions Copyrighted [year] [name of copyright owner]"
+  
+  Contributor(s):
+  
+  The Original Software is NetBeans. The Initial Developer of the Original Software
+  is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
+  Rights Reserved.
+  
+  If you wish your version of this file to be governed by only the CDDL or only the
+  GPL Version 2, indicate your decision by adding "[Contributor] elects to include
+  this software in this distribution under the [CDDL or GPL Version 2] license." If
+  you do not indicate a single choice of license, a recipient has the option to
+  distribute your version of this file under either the CDDL, the GPL Version 2 or
+  to extend the choice of license to its licensees as provided above. However, if you
+  add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
+  option applies only if the new code is made subject to such option by the copyright
+  holder.
+-->
+
+<!--
+  This is the build script for the helloworld product package.
+    
+  It inherits most of the functionality from the base script for building nbi 
+  product packages, while providing this instance-specific values for several
+  core properties. For more details on the values of these properties see
+  the build.properties file.
+-->
+<project name="helloworld-product" default="usage" basedir=".">
+    <!-- import the properties that are specific to this environment -->
+    <property file="${environment.properties}"/>
+    
+    <!-- import the properties that are specific to this product package -->
+    <property file="build.properties"/>
+    
+    <!-- import the base script for building product packages -->
+    <import file="${common.dir}/product.xml" optional="false"/>
+    
+    <target name="-pre-package">
+        <mkdir dir="${data.directory}/__tmpdir__"/>
+
+        <move todir="${data.directory}/__tmpdir__">
+            <fileset dir="${data.directory}/${product.data.sub.dir}">
+                <include name="**"/>
+            </fileset>
+        </move>
+        
+        <delete dir="${data.directory}/${product.data.sub.dir}" includeemptydirs="true"/>
+
+        <move todir="${data.directory}">
+            <fileset dir="${data.directory}/__tmpdir__">
+                <include name="**"/>
+            </fileset>
+        </move>
+        <delete dir="${data.directory}/__tmpdir__" includeemptydirs="true"/>
+        <!--
+        <exec executable="sh" failonerror="false" dir="${data.directory}">
+            <arg value="-c"/>
+            <arg value="chmod a+x bin/*.sh"/>
+        </exec>
+        -->
+    </target>
+
+    <!--
+      The default target. 
+      
+      Does nothing except printing the usage information.
+    -->
+    <target name="usage">
+        <echo>
+            In order to 'clean', 'checkout' and 'build' the group use the 
+            'build-all' target. To 'clean', 'checkout', 'build' and 
+            'release' - use 'release-all'.
+            
+            For more details, please see the source of this build script.
+        </echo>
+    </target>
+</project>

+ 198 - 0
nbi/stub/template.xml

@@ -0,0 +1,198 @@
+<project name="build installers" default="build" basedir=".">
+    <!--<property file="${basedir}/template.properties"/>-->
+    
+    <target name="build" depends="init,prepare-sources,prepare-zip,-build,post-build,run-build"/>
+
+    <target name="-init-props">
+        <available file="${suite.location}/nbproject/project.properties" property="do.load.ant.props"/>    
+        <available file="${suite.location}/pom.xml" property="do.load.maven.props"/>    
+    </target>
+
+    <target name="-init-ant-props" if="do.load.ant.props" depends="-init-props">
+        <property file="${suite.location}/nbproject/project.properties" prefix="suite.props."/>    
+    </target>
+    <target name="-init-maven-props" if="do.load.maven.props" depends="-init-props">
+        <xmlproperty file="${suite.location}/pom.xml" prefix="pom.props"/>
+        <property name="suite.props.app.name"  value="${pom.props.project.properties.brandingToken}"/>
+        <property name="suite.props.app.title" value="${pom.props.project.artifactId}"/>
+    </target>
+    
+    <target name="init" depends="-clean,-init-ant-props,-init-maven-props">
+        <property name="installer.build.dir" value="${suite.location}/build/installer"/>
+        <property name="suite.dist.directory" value="${suite.location}/dist"/>
+        <property name="suite.dist.zip"       value="${suite.dist.directory}/${suite.props.app.name}.zip"/>
+        <property name="installers.file.prefix" value="${suite.props.app.name}"/>
+        <delete dir="${installer.build.dir}" includeemptydirs="yes" failonerror="false"/>
+
+        <mkdir dir="${installer.build.dir}"/>
+    </target>
+
+    
+    <target name="-clean">
+    </target>
+
+    <target name="post-build">
+    </target>
+    
+    <target name="-build">
+    </target>
+
+    <target name="run-build">
+        <ant dir="${installer.build.dir}" inheritAll="false"/>
+    </target>
+
+    <target name="-init-zip">
+        <condition property="do.build.zip">
+            <available file="${suite.dist.zip}"/>
+        </condition>
+    </target>
+    <target name="-build-zip" depends="-init-zip" unless="do.build.zip">
+        <antcall target="-build-zip-ant"/>
+        <antcall target="-build-zip-maven"/>
+    </target>
+
+    <target name="-build-zip-ant" depends="-init-zip"  if="do.load.ant.props">
+        <subant buildpath="${suite.location}" inheritAll="false" target="build-zip"/>
+    </target>
+
+    <target name="-build-zip-maven" depends="-init-zip" if="do.load.maven.props">
+        <condition property="mvn.executable" value="mvn.bat" else="mvn">
+            <os family="windows"/>
+        </condition>
+
+        <exec executable="${mvn.executable}" dir="${suite.location}">
+           <arg value="install"/>
+           <env key="JAVA_HOME" value="${java.home}"/>
+        </exec>
+    </target>
+
+    <target name="prepare-zip" depends="-init-zip,-build-zip"/>
+
+    <target name="prepare-sources">
+        <copy todir="${installer.build.dir}">
+           <fileset dir="${nbi.stub.location}"/>
+        </copy>
+        <copy todir="${installer.build.dir}/.common">
+           <fileset dir="${nbi.stub.common.location}"/>
+        </copy>
+
+        <property name="product-uid"  value="${suite.nbi.product.uid}"/>
+        <!--normen-->
+        <property name="product-version"  value="${suite.nbi.product.uid}"/>
+
+        <condition property="icon.path" value="${nbi.icon.file}" else="${installer.build.dir}/ext/components/products/helloworld/data/icon48.png">
+             <and>
+                 <isset property="nbi.icon.file"/>
+                 <available file="${nbi.icon.file}"/>
+             </and>
+        </condition>
+
+        <basename property="icon.file.name" file="${icon.path}"/>
+        <condition property="icon.extension" value=".gif">
+             <or>
+                 <matches string="${icon.file.name}" pattern="^.*\.gif$"/>
+                 <matches string="${icon.file.name}" pattern="^.*\.gif$"/>
+             </or>
+        </condition>
+        <condition property="icon.extension" value=".png">
+             <or>
+                 <matches string="${icon.file.name}" pattern="^.*\.png$"/>
+                 <matches string="${icon.file.name}" pattern="^.*\.PNG$"/>
+             </or>
+        </condition>
+
+        <property name="icon.name" value="${suite.props.app.name}${icon.extension}"/>
+
+        <copy file="${icon.path}" tofile="${installer.build.dir}/ext/components/products/helloworld/src/org/mycompany/${icon.name}"/>
+
+
+
+        <replace file="${installer.build.dir}/build.properties" encoding="utf-8">
+            <replacefilter token="{nbi.ant.tasks.jar}"             value="${nbi.ant.tasks.jar}"/>
+            <replacefilter token="{nbi.registries.management.jar}" value="${nbi.registries.management.jar}"/>
+            <replacefilter token="{nbi.engine.jar}"                value="${nbi.engine.jar}"/>
+            <replacefilter token="{product-platforms}"             value="${generate.installer.for.platforms}"/>
+            <replacefilter token="{generator-jdk-location-forward-slashes}"         value="${generator-jdk-location-forward-slashes}"/>
+            <replacefilter token="{generated-installers-location-forward-slashes}"  value="${suite.dist.directory}"/>
+            <replacefilter token="{pack200.enabled}"               value="${pack200.enabled}"/>
+            <replacefilter token="{generated-installers-prefix}"   value="${installers.file.prefix}"/>
+            <replacefilter token="{product-uid}"                   value="${product-uid}"/>
+            <!--normen-->
+            <replacefilter token="{product-version}"                   value="${product-version}"/>
+        </replace>
+
+        <replace dir="${installer.build.dir}/ext" encoding="utf-8">
+            <replacefilter token="{product-name}" value="${suite.props.app.title}"/>
+            <replacefilter token="{product-simple-name}" value="${suite.props.app.name}"/>
+            <replacefilter token="{product-description}" value=""/>
+            <replacefilter token="{product-uid}"         value="${product-uid}"/>
+            <replacefilter token="{product-icon-name}"   value="${icon.name}"/>
+        </replace>
+
+        <replace dir="${installer.build.dir}/ext/infra/build/products" encoding="utf-8">
+            <replacefilter token="{product.platforms}"        value="${generate.installer.for.platforms}"/>
+            <replacefilter token="{product-data-path}"        value="${suite.dist.zip}"/>
+            <replacefilter token="{product-data-sub-dir}"     value="${suite.props.app.name}"/>
+            <replacefilter token="{product-uid}"              value="${product-uid}"/>
+            <!--normen-->
+            <replacefilter token="{product-version}"                   value="${product-version}"/>
+            <replacefilter token="{product-install-directory-name}"         value="${suite.props.app.name}"/>
+            <replacefilter token="{product-install-directory-name-windows}" value="${suite.props.app.name}"/>
+            <replacefilter token="{product-install-directory-name-macosx}"  value="${suite.props.app.name}"/>
+        </replace>       
+        <property name="dir.dir" value="${installer.build.dir}/tmpdirfornac"/>
+        <mkdir dir="${dir.dir}"/>
+
+        <native2ascii encoding="utf-8" src="${installer.build.dir}" dest="${dir.dir}" includes="build.properties ext/**/*.properties"/>
+
+        <copy todir="${installer.build.dir}" overwrite="true" includeEmptyDirs="true">
+             <fileset dir="${dir.dir}"/>
+        </copy> 
+        <condition property="license.defined">
+             <and>
+                 <isset property="nbi.license.file"/>
+                 <available file="${nbi.license.file}"/>
+             </and>
+        </condition> 
+        <antcall target="-prepare-license"/>
+
+        <condition property="icon.defined">
+             <and>
+                 <isset property="nbi.icon.file"/>
+                 <available file="${nbi.icon.file}"/>
+             </and>
+        </condition> 
+        <antcall target="-prepare-icon"/>
+
+        <condition property="dock.icon.defined">
+             <and>
+                 <isset property="nbi.dock.icon.file"/>
+                 <available file="${nbi.dock.icon.file}"/>
+             </and>
+        </condition> 
+        <antcall target="-prepare-dock-icon"/>
+
+        <delete dir="${dir.dir}" includeEmptyDirs="true"/>
+    </target>
+    
+    <target name="-prepare-license" if="license.defined">
+        <copy file="${nbi.license.file}" tofile="${installer.build.dir}/ext/components/products/helloworld/src/org/mycompany/license.txt" overwrite="true"/>
+    </target>
+    <target name="-prepare-icon" if="icon.defined">
+        <copy file="${nbi.icon.file}" tofile="${installer.build.dir}/ext/engine/src/org/mycompany/installer/wizard/wizard-icon.png" overwrite="true"/>
+    </target>
+
+    <target name="-prepare-dock-icon" if="dock.icon.defined">
+        <mkdir dir="${installer.build.dir}/ext/engine/src/org/netbeans/installer/utils/system/launchers/impl"/>
+        <copy file="${nbi.dock.icon.file}" tofile="${installer.build.dir}/ext/engine/src/org/netbeans/installer/utils/system/launchers/impl/dockicon.icns"/>
+        <copy file="${nbi.dock.icon.file}" tofile="${installer.build.dir}/ext/components/products/helloworld/src/org/mycompany/${suite.props.app.name}.icns"/>
+    </target>
+
+    <target name="replace">
+        <property file="${token.file}"/>
+        <replaceregexp file="${file.to.replace}" flags="mg">
+            <regexp pattern="${regexp.token}"/>
+            <substitution expression="${regexp.replacement}"/>
+        </replaceregexp>
+    </target>
+</project>

+ 16 - 0
nbi/stub/tmpl.properties

@@ -0,0 +1,16 @@
+suite.location=C:/Documents and Settings/Lipin/My Documents/NetBeansProjects/MyApp
+
+nbi.cluster.location=D:/space/NB-IDE/proto/nbbuild/netbeans/extra
+
+nbi.stub.location=${nbi.cluster.location}/nbi/stub
+nbi.stub.common.location=${nbi.cluster.location}/nbi/.common
+nbi.ant.tasks.jar=${nbi.cluster.location}/modules/ext/nbi-ant-tasks.jar
+nbi.registries.management.jar=${nbi.cluster.location}/modules/ext/nbi-registries-management.jar
+nbi.engine.jar=${nbi.cluster.location}/modules/ext/nbi-engine.jar
+
+generate.installer.for.platforms=windows linux macosx
+
+generator-jdk-location-forward-slashes=C:/Program Files/Java/jdk1.5.0_16
+pack200.enabled=false
+
+suite.nbi.product.uid=myapp