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();
if (SystemUtils.isMacOS()) {
File f = new File(installLocation, 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
}
}
}
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
}